@atls/code-schematics 0.0.20 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/generated/index.d.ts +1 -0
- package/dist/generated/index.js +1 -0
- package/dist/generated/schematic-factory-export.d.ts +2 -0
- package/dist/generated/schematic-factory-export.js +6 -0
- package/dist/getters/index.d.ts +2 -0
- package/dist/getters/index.js +2 -0
- package/dist/getters/stream-report-callback.getter.d.ts +4 -0
- package/dist/getters/stream-report-callback.getter.js +20 -0
- package/dist/getters/stream-report-options.getter.d.ts +6 -0
- package/dist/getters/stream-report-options.getter.js +7 -0
- package/dist/helpers/events-log.helper.d.ts +2 -0
- package/dist/helpers/events-log.helper.js +20 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/prepare-tmp-dir.helper.d.ts +2 -0
- package/dist/helpers/prepare-tmp-dir.helper.js +8 -0
- package/dist/helpers/run-schematics.helper.d.ts +1 -0
- package/dist/helpers/run-schematics.helper.js +48 -0
- package/dist/helpers/write-tmp-schematic.helper.d.ts +2 -0
- package/dist/helpers/write-tmp-schematic.helper.js +11 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -18
- package/dist/schematic/index.d.ts +1 -0
- package/dist/schematic/index.js +1 -0
- package/dist/schematic/project/index.d.ts +1 -0
- package/dist/schematic/project/index.js +1 -0
- package/dist/schematic/project/project.factory.d.ts +2 -0
- package/dist/schematic/project/project.factory.js +11 -0
- package/dist/schematic/rules/index.d.ts +1 -0
- package/dist/schematic/rules/index.js +1 -0
- package/dist/schematic/rules/update-ts-config.rule.d.ts +2 -0
- package/dist/schematic/rules/update-ts-config.rule.js +7 -0
- package/dist/schematic/sources/generate-common.source.d.ts +2 -0
- package/dist/schematic/sources/generate-common.source.js +13 -0
- package/dist/schematic/sources/generate-project-specific.source.d.ts +2 -0
- package/dist/schematic/sources/generate-project-specific.source.js +19 -0
- package/dist/schematic/sources/index.d.ts +2 -0
- package/dist/schematic/sources/index.js +2 -0
- package/dist/schematic/utils/file.utils.d.ts +3 -0
- package/dist/schematic/utils/file.utils.js +6 -0
- package/dist/schematic/utils/gitignore.utils.d.ts +3 -0
- package/dist/schematic/utils/gitignore.utils.js +12 -0
- package/dist/schematic/utils/index.d.ts +5 -0
- package/dist/schematic/utils/index.js +5 -0
- package/dist/schematic/utils/json.utils.d.ts +6 -0
- package/dist/schematic/utils/json.utils.js +23 -0
- package/dist/schematic/utils/tsconfig.utils.d.ts +1 -0
- package/dist/schematic/utils/tsconfig.utils.js +5 -0
- package/dist/schematic/utils/yaml.utils.d.ts +5 -0
- package/dist/schematic/utils/yaml.utils.js +18 -0
- package/dist/scripts/build-steps/esbuild.build-step.d.ts +1 -0
- package/dist/scripts/build-steps/esbuild.build-step.js +17 -0
- package/dist/scripts/build-steps/index.d.ts +1 -0
- package/dist/scripts/build-steps/index.js +1 -0
- package/dist/scripts/exceptions/index.d.ts +1 -0
- package/dist/scripts/exceptions/index.js +1 -0
- package/dist/scripts/exceptions/undefined-build-result.exception.d.ts +3 -0
- package/dist/scripts/exceptions/undefined-build-result.exception.js +5 -0
- package/dist/scripts/getters/cjs-content.getter.d.ts +2 -0
- package/dist/scripts/getters/cjs-content.getter.js +4 -0
- package/dist/scripts/getters/encoded-content.getter.d.ts +1 -0
- package/dist/scripts/getters/encoded-content.getter.js +4 -0
- package/dist/scripts/getters/esbuild-config.getter.d.ts +2 -0
- package/dist/scripts/getters/esbuild-config.getter.js +32 -0
- package/dist/scripts/getters/generated-file-content.getter.d.ts +1 -0
- package/dist/scripts/getters/generated-file-content.getter.js +16 -0
- package/dist/scripts/getters/index.d.ts +4 -0
- package/dist/scripts/getters/index.js +4 -0
- package/dist/scripts/index.d.ts +1 -0
- package/dist/scripts/index.js +1 -0
- package/dist/scripts/schematic-build.script.d.ts +1 -0
- package/dist/scripts/schematic-build.script.js +72 -0
- package/dist/scripts/schematic-factory-build.script.d.ts +1 -0
- package/dist/scripts/schematic-factory-build.script.js +10 -0
- package/package.json +36 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration-engine.host.d.ts +0 -5
- package/dist/migration-engine.host.d.ts.map +0 -1
- package/dist/migration-engine.host.js +0 -11
- package/dist/migration-engine.host.js.map +0 -1
- package/dist/node-pnp-engine.host.d.ts +0 -17
- package/dist/node-pnp-engine.host.d.ts.map +0 -1
- package/dist/node-pnp-engine.host.js +0 -95
- package/dist/node-pnp-engine.host.js.map +0 -1
- package/dist/schematics.d.ts +0 -10
- package/dist/schematics.d.ts.map +0 -1
- package/dist/schematics.js +0 -95
- package/dist/schematics.js.map +0 -1
- package/dist/utils/collection.utils.d.ts +0 -7
- package/dist/utils/collection.utils.d.ts.map +0 -1
- package/dist/utils/collection.utils.js +0 -47
- package/dist/utils/collection.utils.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -19
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/resolve.utils.d.ts +0 -2
- package/dist/utils/resolve.utils.d.ts.map +0 -1
- package/dist/utils/resolve.utils.js +0 -27
- package/dist/utils/resolve.utils.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const schematicFactoryCjsBase64 = "dmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHsKICByZXR1cm4gbW9kIHx8ICgwLCBjYltfX2dldE93blByb3BOYW1lcyhjYilbMF1dKSgobW9kID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBtb2QpLCBtb2QuZXhwb3J0czsKfTsKdmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7CiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpCiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwp9Owp2YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4gewogIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKQogICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpICYmIGtleSAhPT0gZXhjZXB0KQogICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICB9CiAgcmV0dXJuIHRvOwp9Owp2YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKAogIC8vIElmIHRoZSBpbXBvcnRlciBpcyBpbiBub2RlIGNvbXBhdGliaWxpdHkgbW9kZSBvciB0aGlzIGlzIG5vdCBhbiBFU00KICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuICJfX2VzTW9kdWxlIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXQKICAvLyAiZGVmYXVsdCIgdG8gdGhlIENvbW1vbkpTICJtb2R1bGUuZXhwb3J0cyIgZm9yIG5vZGUgY29tcGF0aWJpbGl0eS4KICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgbW9kCikpOwp2YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3V0aWxzLmpzCnZhciByZXF1aXJlX3V0aWxzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vdXRpbHMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzSnNvbk9iamVjdCA9IGlzSnNvbk9iamVjdDsKICAgIGV4cG9ydHMyLmlzSnNvbkFycmF5ID0gaXNKc29uQXJyYXk7CiAgICBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc0pzb25BcnJheSh2YWx1ZSkgewogICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vc2NoZW1hL3V0aWxpdHkuanMKdmFyIHJlcXVpcmVfdXRpbGl0eSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS91dGlsaXR5LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5nZXRUeXBlc09mU2NoZW1hID0gZ2V0VHlwZXNPZlNjaGVtYTsKICAgIHZhciB1dGlsc18xID0gcmVxdWlyZV91dGlscygpOwogICAgdmFyIGFsbFR5cGVzID0gWyJzdHJpbmciLCAiaW50ZWdlciIsICJudW1iZXIiLCAib2JqZWN0IiwgImFycmF5IiwgImJvb2xlYW4iLCAibnVsbCJdOwogICAgZnVuY3Rpb24gZ2V0VHlwZXNPZlNjaGVtYShzY2hlbWEpIHsKICAgICAgaWYgKCFzY2hlbWEpIHsKICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgfQogICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZXQoYWxsVHlwZXMpOwogICAgICB9CiAgICAgIGxldCBwb3RlbnRpYWxzOwogICAgICBpZiAodHlwZW9mIHNjaGVtYS50eXBlID09PSAic3RyaW5nIikgewogICAgICAgIHBvdGVudGlhbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbc2NoZW1hLnR5cGVdKTsKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKSkgewogICAgICAgIHBvdGVudGlhbHMgPSBuZXcgU2V0KHNjaGVtYS50eXBlKTsKICAgICAgfSBlbHNlIGlmICgoMCwgdXRpbHNfMS5pc0pzb25BcnJheSkoc2NoZW1hLmVudW0pKSB7CiAgICAgICAgcG90ZW50aWFscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgZm9yIChjb25zdCB2IG9mIHNjaGVtYS5lbnVtKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2KSB7CiAgICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICAgIHBvdGVudGlhbHMuYWRkKHR5cGVvZiB2KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkgewogICAgICAgICAgICAgICAgcG90ZW50aWFscy5hZGQoImFycmF5Iik7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwb3RlbnRpYWxzLmFkZCgibnVsbCIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwb3RlbnRpYWxzLmFkZCgib2JqZWN0Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwb3RlbnRpYWxzID0gbmV3IFNldChhbGxUeXBlcyk7CiAgICAgIH0KICAgICAgaWYgKCgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkoc2NoZW1hLm5vdCkpIHsKICAgICAgICBjb25zdCBub3RUeXBlcyA9IGdldFR5cGVzT2ZTY2hlbWEoc2NoZW1hLm5vdCk7CiAgICAgICAgcG90ZW50aWFscyA9IG5ldyBTZXQoWy4uLnBvdGVudGlhbHNdLmZpbHRlcigocCkgPT4gIW5vdFR5cGVzLmhhcyhwKSkpOwogICAgICB9CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHsKICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBzY2hlbWEuYWxsT2YpIHsKICAgICAgICAgIGNvbnN0IHR5cGVzID0gZ2V0VHlwZXNPZlNjaGVtYShzdWIpOwogICAgICAgICAgcG90ZW50aWFscyA9IG5ldyBTZXQoWy4uLnR5cGVzXS5maWx0ZXIoKHQpID0+IHBvdGVudGlhbHMuaGFzKHQpKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHsKICAgICAgICBsZXQgb3B0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgZm9yIChjb25zdCBzdWIgb2Ygc2NoZW1hLm9uZU9mKSB7CiAgICAgICAgICBjb25zdCB0eXBlcyA9IGdldFR5cGVzT2ZTY2hlbWEoc3ViKTsKICAgICAgICAgIG9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbLi4ub3B0aW9ucywgLi4udHlwZXNdKTsKICAgICAgICB9CiAgICAgICAgcG90ZW50aWFscyA9IG5ldyBTZXQoWy4uLm9wdGlvbnNdLmZpbHRlcigobykgPT4gcG90ZW50aWFscy5oYXMobykpKTsKICAgICAgfQogICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuYW55T2YpKSB7CiAgICAgICAgbGV0IG9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHNjaGVtYS5hbnlPZikgewogICAgICAgICAgY29uc3QgdHlwZXMgPSBnZXRUeXBlc09mU2NoZW1hKHN1Yik7CiAgICAgICAgICBvcHRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWy4uLm9wdGlvbnMsIC4uLnR5cGVzXSk7CiAgICAgICAgfQogICAgICAgIHBvdGVudGlhbHMgPSBuZXcgU2V0KFsuLi5vcHRpb25zXS5maWx0ZXIoKG8pID0+IHBvdGVudGlhbHMuaGFzKG8pKSk7CiAgICAgIH0KICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzKSB7CiAgICAgICAgcG90ZW50aWFscy5hZGQoIm9iamVjdCIpOwogICAgICB9IGVsc2UgaWYgKHNjaGVtYS5pdGVtcykgewogICAgICAgIHBvdGVudGlhbHMuYWRkKCJhcnJheSIpOwogICAgICB9CiAgICAgIHJldHVybiBwb3RlbnRpYWxzOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS90cmFuc2Zvcm1zLmpzCnZhciByZXF1aXJlX3RyYW5zZm9ybXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvdHJhbnNmb3Jtcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYWRkVW5kZWZpbmVkRGVmYXVsdHMgPSBhZGRVbmRlZmluZWREZWZhdWx0czsKICAgIHZhciB1dGlsc18xID0gcmVxdWlyZV91dGlscygpOwogICAgdmFyIHV0aWxpdHlfMSA9IHJlcXVpcmVfdXRpbGl0eSgpOwogICAgZnVuY3Rpb24gYWRkVW5kZWZpbmVkRGVmYXVsdHModmFsdWUsIF9wb2ludGVyLCBzY2hlbWEpIHsKICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09ICJib29sZWFuIiB8fCBzY2hlbWEgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICB2YWx1ZSA/Pz0gc2NoZW1hLmRlZmF1bHQ7CiAgICAgIGNvbnN0IHR5cGVzID0gKDAsIHV0aWxpdHlfMS5nZXRUeXBlc09mU2NoZW1hKShzY2hlbWEpOwogICAgICBpZiAodHlwZXMuc2l6ZSA9PT0gMCkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBsZXQgdHlwZTsKICAgICAgaWYgKHR5cGVzLnNpemUgPT09IDEpIHsKICAgICAgICB0eXBlID0gQXJyYXkuZnJvbSh0eXBlcylbMF07CiAgICAgIH0gZWxzZSBpZiAodHlwZXMuc2l6ZSA9PT0gMiAmJiB0eXBlcy5oYXMoImFycmF5IikgJiYgdHlwZXMuaGFzKCJvYmplY3QiKSkgewogICAgICAgIHR5cGUgPSAiYXJyYXkiOwogICAgICB9IGVsc2UgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHR5cGVzLmhhcygib2JqZWN0IikpIHsKICAgICAgICB0eXBlID0gIm9iamVjdCI7CiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hLml0ZW1zICYmIHR5cGVzLmhhcygiYXJyYXkiKSkgewogICAgICAgIHR5cGUgPSAiYXJyYXkiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PT0gImFycmF5IikgewogICAgICAgIHJldHVybiB2YWx1ZSA9PSB2b2lkIDAgPyBbXSA6IHZhbHVlOwogICAgICB9CiAgICAgIGlmICh0eXBlID09PSAib2JqZWN0IikgewogICAgICAgIGxldCBuZXdWYWx1ZTsKICAgICAgICBpZiAodmFsdWUgPT0gdm9pZCAwKSB7CiAgICAgICAgICBuZXdWYWx1ZSA9IHt9OwogICAgICAgIH0gZWxzZSBpZiAoKDAsIHV0aWxzXzEuaXNKc29uT2JqZWN0KSh2YWx1ZSkpIHsKICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoMCwgdXRpbHNfMS5pc0pzb25PYmplY3QpKHNjaGVtYS5wcm9wZXJ0aWVzKSkgewogICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgc2NoZW1hT2JqZWN0XSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEucHJvcGVydGllcykpIHsKICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gIiRzY2hlbWEiIHx8ICEoMCwgdXRpbHNfMS5pc0pzb25PYmplY3QpKHNjaGVtYU9iamVjdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB2YWx1ZTIgPSBuZXdWYWx1ZVtwcm9wTmFtZV07CiAgICAgICAgICBpZiAodmFsdWUyID09PSB2b2lkIDApIHsKICAgICAgICAgICAgbmV3VmFsdWVbcHJvcE5hbWVdID0gc2NoZW1hT2JqZWN0LmRlZmF1bHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKCgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkodmFsdWUyKSkgewogICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYXMgPSBzY2hlbWFPYmplY3Qub25lT2YgfHwgc2NoZW1hT2JqZWN0LmFueU9mOwogICAgICAgICAgICBjb25zdCBhbGxQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModmFsdWUyKTsKICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRTY2hlbWEgPSAoMCwgdXRpbHNfMS5pc0pzb25BcnJheSkocHJvcGVydHlTY2hlbWFzKSAmJiBwcm9wZXJ0eVNjaGVtYXMuZmluZCgocykgPT4gewogICAgICAgICAgICAgIGlmICghKDAsIHV0aWxzXzEuaXNKc29uT2JqZWN0KShzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBzY2hlbWFUeXBlID0gKDAsIHV0aWxpdHlfMS5nZXRUeXBlc09mU2NoZW1hKShzKTsKICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZS5zaXplID09PSAxICYmIHNjaGVtYVR5cGUuaGFzKCJvYmplY3QiKSAmJiAoMCwgdXRpbHNfMS5pc0pzb25PYmplY3QpKHMucHJvcGVydGllcykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzLnByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFsbFByb3BlcnRpZXMuZXZlcnkoKGtleSkgPT4gcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKGFkanVzdGVkU2NoZW1hICYmICgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkoYWRqdXN0ZWRTY2hlbWEpKSB7CiAgICAgICAgICAgICAgbmV3VmFsdWVbcHJvcE5hbWVdID0gYWRkVW5kZWZpbmVkRGVmYXVsdHModmFsdWUyLCBfcG9pbnRlciwgYWRqdXN0ZWRTY2hlbWEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdWYWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vc2NoZW1hL2ludGVyZmFjZS5qcwp2YXIgcmVxdWlyZV9pbnRlcmZhY2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvaW50ZXJmYWNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vc2NoZW1hL3BvaW50ZXIuanMKdmFyIHJlcXVpcmVfcG9pbnRlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9wb2ludGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5idWlsZEpzb25Qb2ludGVyID0gYnVpbGRKc29uUG9pbnRlcjsKICAgIGV4cG9ydHMyLmpvaW5Kc29uUG9pbnRlciA9IGpvaW5Kc29uUG9pbnRlcjsKICAgIGV4cG9ydHMyLnBhcnNlSnNvblBvaW50ZXIgPSBwYXJzZUpzb25Qb2ludGVyOwogICAgZnVuY3Rpb24gYnVpbGRKc29uUG9pbnRlcihmcmFnbWVudHMpIHsKICAgICAgcmV0dXJuICIvIiArIGZyYWdtZW50cy5tYXAoKGYpID0+IHsKICAgICAgICByZXR1cm4gZi5yZXBsYWNlKC9+L2csICJ+MCIpLnJlcGxhY2UoL1wvL2csICJ+MSIpOwogICAgICB9KS5qb2luKCIvIik7CiAgICB9CiAgICBmdW5jdGlvbiBqb2luSnNvblBvaW50ZXIocm9vdCwgLi4ub3RoZXJzKSB7CiAgICAgIGlmIChyb290ID09ICIvIikgewogICAgICAgIHJldHVybiBidWlsZEpzb25Qb2ludGVyKG90aGVycyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJvb3QgKyBidWlsZEpzb25Qb2ludGVyKG90aGVycyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUpzb25Qb2ludGVyKHBvaW50ZXIpIHsKICAgICAgaWYgKHBvaW50ZXIgPT09ICIiKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGlmIChwb2ludGVyLmNoYXJBdCgwKSAhPT0gIi8iKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZWxhdGl2ZSBwb2ludGVyOiAiICsgcG9pbnRlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIHBvaW50ZXIuc3Vic3RyaW5nKDEpLnNwbGl0KC9cLy8pLm1hcCgoc3RyKSA9PiBzdHIucmVwbGFjZSgvfjEvZywgIi8iKS5yZXBsYWNlKC9+MC9nLCAifiIpKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9jb2RlZ2VuL2NvZGUuanMKdmFyIHJlcXVpcmVfY29kZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL2NvZGVnZW4vY29kZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmVnZXhwQ29kZSA9IGV4cG9ydHMyLmdldEVzbUV4cG9ydE5hbWUgPSBleHBvcnRzMi5nZXRQcm9wZXJ0eSA9IGV4cG9ydHMyLnNhZmVTdHJpbmdpZnkgPSBleHBvcnRzMi5zdHJpbmdpZnkgPSBleHBvcnRzMi5zdHJDb25jYXQgPSBleHBvcnRzMi5hZGRDb2RlQXJnID0gZXhwb3J0czIuc3RyID0gZXhwb3J0czIuXyA9IGV4cG9ydHMyLm5pbCA9IGV4cG9ydHMyLl9Db2RlID0gZXhwb3J0czIuTmFtZSA9IGV4cG9ydHMyLklERU5USUZJRVIgPSBleHBvcnRzMi5fQ29kZU9yTmFtZSA9IHZvaWQgMDsKICAgIHZhciBfQ29kZU9yTmFtZSA9IGNsYXNzIHsKICAgIH07CiAgICBleHBvcnRzMi5fQ29kZU9yTmFtZSA9IF9Db2RlT3JOYW1lOwogICAgZXhwb3J0czIuSURFTlRJRklFUiA9IC9eW2EteiRfXVthLXokXzAtOV0qJC9pOwogICAgdmFyIE5hbWUgPSBjbGFzcyBleHRlbmRzIF9Db2RlT3JOYW1lIHsKICAgICAgY29uc3RydWN0b3IocykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgaWYgKCFleHBvcnRzMi5JREVOVElGSUVSLnRlc3QocykpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvZGVHZW46IG5hbWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIiKTsKICAgICAgICB0aGlzLnN0ciA9IHM7CiAgICAgIH0KICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyOwogICAgICB9CiAgICAgIGVtcHR5U3RyKCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBnZXQgbmFtZXMoKSB7CiAgICAgICAgcmV0dXJuIHsgW3RoaXMuc3RyXTogMSB9OwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuTmFtZSA9IE5hbWU7CiAgICB2YXIgX0NvZGUgPSBjbGFzcyBleHRlbmRzIF9Db2RlT3JOYW1lIHsKICAgICAgY29uc3RydWN0b3IoY29kZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5faXRlbXMgPSB0eXBlb2YgY29kZSA9PT0gInN0cmluZyIgPyBbY29kZV0gOiBjb2RlOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0cjsKICAgICAgfQogICAgICBlbXB0eVN0cigpIHsKICAgICAgICBpZiAodGhpcy5faXRlbXMubGVuZ3RoID4gMSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5faXRlbXNbMF07CiAgICAgICAgcmV0dXJuIGl0ZW0gPT09ICIiIHx8IGl0ZW0gPT09ICciIic7CiAgICAgIH0KICAgICAgZ2V0IHN0cigpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuX3N0cikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5fc3RyID0gdGhpcy5faXRlbXMucmVkdWNlKChzLCBjKSA9PiBgJHtzfSR7Y31gLCAiIik7CiAgICAgIH0KICAgICAgZ2V0IG5hbWVzKCkgewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fbmFtZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuX25hbWVzID0gdGhpcy5faXRlbXMucmVkdWNlKChuYW1lcywgYykgPT4gewogICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBOYW1lKQogICAgICAgICAgICBuYW1lc1tjLnN0cl0gPSAobmFtZXNbYy5zdHJdIHx8IDApICsgMTsKICAgICAgICAgIHJldHVybiBuYW1lczsKICAgICAgICB9LCB7fSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5fQ29kZSA9IF9Db2RlOwogICAgZXhwb3J0czIubmlsID0gbmV3IF9Db2RlKCIiKTsKICAgIGZ1bmN0aW9uIF8oc3RycywgLi4uYXJncykgewogICAgICBjb25zdCBjb2RlID0gW3N0cnNbMF1dOwogICAgICBsZXQgaSA9IDA7CiAgICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHsKICAgICAgICBhZGRDb2RlQXJnKGNvZGUsIGFyZ3NbaV0pOwogICAgICAgIGNvZGUucHVzaChzdHJzWysraV0pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX0NvZGUoY29kZSk7CiAgICB9CiAgICBleHBvcnRzMi5fID0gXzsKICAgIHZhciBwbHVzID0gbmV3IF9Db2RlKCIrIik7CiAgICBmdW5jdGlvbiBzdHIoc3RycywgLi4uYXJncykgewogICAgICBjb25zdCBleHByID0gW3NhZmVTdHJpbmdpZnkoc3Ryc1swXSldOwogICAgICBsZXQgaSA9IDA7CiAgICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHsKICAgICAgICBleHByLnB1c2gocGx1cyk7CiAgICAgICAgYWRkQ29kZUFyZyhleHByLCBhcmdzW2ldKTsKICAgICAgICBleHByLnB1c2gocGx1cywgc2FmZVN0cmluZ2lmeShzdHJzWysraV0pKTsKICAgICAgfQogICAgICBvcHRpbWl6ZShleHByKTsKICAgICAgcmV0dXJuIG5ldyBfQ29kZShleHByKTsKICAgIH0KICAgIGV4cG9ydHMyLnN0ciA9IHN0cjsKICAgIGZ1bmN0aW9uIGFkZENvZGVBcmcoY29kZSwgYXJnKSB7CiAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBfQ29kZSkKICAgICAgICBjb2RlLnB1c2goLi4uYXJnLl9pdGVtcyk7CiAgICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIE5hbWUpCiAgICAgICAgY29kZS5wdXNoKGFyZyk7CiAgICAgIGVsc2UKICAgICAgICBjb2RlLnB1c2goaW50ZXJwb2xhdGUoYXJnKSk7CiAgICB9CiAgICBleHBvcnRzMi5hZGRDb2RlQXJnID0gYWRkQ29kZUFyZzsKICAgIGZ1bmN0aW9uIG9wdGltaXplKGV4cHIpIHsKICAgICAgbGV0IGkgPSAxOwogICAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoIC0gMSkgewogICAgICAgIGlmIChleHByW2ldID09PSBwbHVzKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBtZXJnZUV4cHJJdGVtcyhleHByW2kgLSAxXSwgZXhwcltpICsgMV0pOwogICAgICAgICAgaWYgKHJlcyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGV4cHIuc3BsaWNlKGkgLSAxLCAzLCByZXMpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGV4cHJbaSsrXSA9ICIrIjsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtZXJnZUV4cHJJdGVtcyhhLCBiKSB7CiAgICAgIGlmIChiID09PSAnIiInKQogICAgICAgIHJldHVybiBhOwogICAgICBpZiAoYSA9PT0gJyIiJykKICAgICAgICByZXR1cm4gYjsKICAgICAgaWYgKHR5cGVvZiBhID09ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBOYW1lIHx8IGFbYS5sZW5ndGggLSAxXSAhPT0gJyInKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmICh0eXBlb2YgYiAhPSAic3RyaW5nIikKICAgICAgICAgIHJldHVybiBgJHthLnNsaWNlKDAsIC0xKX0ke2J9ImA7CiAgICAgICAgaWYgKGJbMF0gPT09ICciJykKICAgICAgICAgIHJldHVybiBhLnNsaWNlKDAsIC0xKSArIGIuc2xpY2UoMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgYiA9PSAic3RyaW5nIiAmJiBiWzBdID09PSAnIicgJiYgIShhIGluc3RhbmNlb2YgTmFtZSkpCiAgICAgICAgcmV0dXJuIGAiJHthfSR7Yi5zbGljZSgxKX1gOwogICAgICByZXR1cm47CiAgICB9CiAgICBmdW5jdGlvbiBzdHJDb25jYXQoYzEsIGMyKSB7CiAgICAgIHJldHVybiBjMi5lbXB0eVN0cigpID8gYzEgOiBjMS5lbXB0eVN0cigpID8gYzIgOiBzdHJgJHtjMX0ke2MyfWA7CiAgICB9CiAgICBleHBvcnRzMi5zdHJDb25jYXQgPSBzdHJDb25jYXQ7CiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4KSB7CiAgICAgIHJldHVybiB0eXBlb2YgeCA9PSAibnVtYmVyIiB8fCB0eXBlb2YgeCA9PSAiYm9vbGVhbiIgfHwgeCA9PT0gbnVsbCA/IHggOiBzYWZlU3RyaW5naWZ5KEFycmF5LmlzQXJyYXkoeCkgPyB4LmpvaW4oIiwiKSA6IHgpOwogICAgfQogICAgZnVuY3Rpb24gc3RyaW5naWZ5KHgpIHsKICAgICAgcmV0dXJuIG5ldyBfQ29kZShzYWZlU3RyaW5naWZ5KHgpKTsKICAgIH0KICAgIGV4cG9ydHMyLnN0cmluZ2lmeSA9IHN0cmluZ2lmeTsKICAgIGZ1bmN0aW9uIHNhZmVTdHJpbmdpZnkoeCkgewogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeCkucmVwbGFjZSgvXHUyMDI4L2csICJcXHUyMDI4IikucmVwbGFjZSgvXHUyMDI5L2csICJcXHUyMDI5Iik7CiAgICB9CiAgICBleHBvcnRzMi5zYWZlU3RyaW5naWZ5ID0gc2FmZVN0cmluZ2lmeTsKICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5KGtleSkgewogICAgICByZXR1cm4gdHlwZW9mIGtleSA9PSAic3RyaW5nIiAmJiBleHBvcnRzMi5JREVOVElGSUVSLnRlc3Qoa2V5KSA/IG5ldyBfQ29kZShgLiR7a2V5fWApIDogX2BbJHtrZXl9XWA7CiAgICB9CiAgICBleHBvcnRzMi5nZXRQcm9wZXJ0eSA9IGdldFByb3BlcnR5OwogICAgZnVuY3Rpb24gZ2V0RXNtRXhwb3J0TmFtZShrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gInN0cmluZyIgJiYgZXhwb3J0czIuSURFTlRJRklFUi50ZXN0KGtleSkpIHsKICAgICAgICByZXR1cm4gbmV3IF9Db2RlKGAke2tleX1gKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IGludmFsaWQgZXhwb3J0IG5hbWU6ICR7a2V5fSwgdXNlIGV4cGxpY2l0ICRpZCBuYW1lIG1hcHBpbmdgKTsKICAgIH0KICAgIGV4cG9ydHMyLmdldEVzbUV4cG9ydE5hbWUgPSBnZXRFc21FeHBvcnROYW1lOwogICAgZnVuY3Rpb24gcmVnZXhwQ29kZShyeCkgewogICAgICByZXR1cm4gbmV3IF9Db2RlKHJ4LnRvU3RyaW5nKCkpOwogICAgfQogICAgZXhwb3J0czIucmVnZXhwQ29kZSA9IHJlZ2V4cENvZGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvY29kZWdlbi9zY29wZS5qcwp2YXIgcmVxdWlyZV9zY29wZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL2NvZGVnZW4vc2NvcGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlZhbHVlU2NvcGUgPSBleHBvcnRzMi5WYWx1ZVNjb3BlTmFtZSA9IGV4cG9ydHMyLlNjb3BlID0gZXhwb3J0czIudmFyS2luZHMgPSBleHBvcnRzMi5Vc2VkVmFsdWVTdGF0ZSA9IHZvaWQgMDsKICAgIHZhciBjb2RlXzEgPSByZXF1aXJlX2NvZGUoKTsKICAgIHZhciBWYWx1ZUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgICAgICBzdXBlcihgQ29kZUdlbjogImNvZGUiIGZvciAke25hbWV9IG5vdCBkZWZpbmVkYCk7CiAgICAgICAgdGhpcy52YWx1ZSA9IG5hbWUudmFsdWU7CiAgICAgIH0KICAgIH07CiAgICB2YXIgVXNlZFZhbHVlU3RhdGU7CiAgICAoZnVuY3Rpb24oVXNlZFZhbHVlU3RhdGUyKSB7CiAgICAgIFVzZWRWYWx1ZVN0YXRlMltVc2VkVmFsdWVTdGF0ZTJbIlN0YXJ0ZWQiXSA9IDBdID0gIlN0YXJ0ZWQiOwogICAgICBVc2VkVmFsdWVTdGF0ZTJbVXNlZFZhbHVlU3RhdGUyWyJDb21wbGV0ZWQiXSA9IDFdID0gIkNvbXBsZXRlZCI7CiAgICB9KShVc2VkVmFsdWVTdGF0ZSB8fCAoZXhwb3J0czIuVXNlZFZhbHVlU3RhdGUgPSBVc2VkVmFsdWVTdGF0ZSA9IHt9KSk7CiAgICBleHBvcnRzMi52YXJLaW5kcyA9IHsKICAgICAgY29uc3Q6IG5ldyBjb2RlXzEuTmFtZSgiY29uc3QiKSwKICAgICAgbGV0OiBuZXcgY29kZV8xLk5hbWUoImxldCIpLAogICAgICB2YXI6IG5ldyBjb2RlXzEuTmFtZSgidmFyIikKICAgIH07CiAgICB2YXIgU2NvcGUgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHsgcHJlZml4ZXMsIHBhcmVudCB9ID0ge30pIHsKICAgICAgICB0aGlzLl9uYW1lcyA9IHt9OwogICAgICAgIHRoaXMuX3ByZWZpeGVzID0gcHJlZml4ZXM7CiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwogICAgICB9CiAgICAgIHRvTmFtZShuYW1lT3JQcmVmaXgpIHsKICAgICAgICByZXR1cm4gbmFtZU9yUHJlZml4IGluc3RhbmNlb2YgY29kZV8xLk5hbWUgPyBuYW1lT3JQcmVmaXggOiB0aGlzLm5hbWUobmFtZU9yUHJlZml4KTsKICAgICAgfQogICAgICBuYW1lKHByZWZpeCkgewogICAgICAgIHJldHVybiBuZXcgY29kZV8xLk5hbWUodGhpcy5fbmV3TmFtZShwcmVmaXgpKTsKICAgICAgfQogICAgICBfbmV3TmFtZShwcmVmaXgpIHsKICAgICAgICBjb25zdCBuZyA9IHRoaXMuX25hbWVzW3ByZWZpeF0gfHwgdGhpcy5fbmFtZUdyb3VwKHByZWZpeCk7CiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke25nLmluZGV4Kyt9YDsKICAgICAgfQogICAgICBfbmFtZUdyb3VwKHByZWZpeCkgewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgaWYgKCgoX2IgPSAoX2EgPSB0aGlzLl9wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5fcHJlZml4ZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oYXMocHJlZml4KSkgfHwgdGhpcy5fcHJlZml4ZXMgJiYgIXRoaXMuX3ByZWZpeGVzLmhhcyhwcmVmaXgpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IHByZWZpeCAiJHtwcmVmaXh9IiBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHNjb3BlYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9uYW1lc1twcmVmaXhdID0geyBwcmVmaXgsIGluZGV4OiAwIH07CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5TY29wZSA9IFNjb3BlOwogICAgdmFyIFZhbHVlU2NvcGVOYW1lID0gY2xhc3MgZXh0ZW5kcyBjb2RlXzEuTmFtZSB7CiAgICAgIGNvbnN0cnVjdG9yKHByZWZpeCwgbmFtZVN0cikgewogICAgICAgIHN1cGVyKG5hbWVTdHIpOwogICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwogICAgICB9CiAgICAgIHNldFZhbHVlKHZhbHVlLCB7IHByb3BlcnR5LCBpdGVtSW5kZXggfSkgewogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLnNjb3BlUGF0aCA9ICgwLCBjb2RlXzEuXylgLiR7bmV3IGNvZGVfMS5OYW1lKHByb3BlcnR5KX1bJHtpdGVtSW5kZXh9XWA7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5WYWx1ZVNjb3BlTmFtZSA9IFZhbHVlU2NvcGVOYW1lOwogICAgdmFyIGxpbmUgPSAoMCwgY29kZV8xLl8pYFxuYDsKICAgIHZhciBWYWx1ZVNjb3BlID0gY2xhc3MgZXh0ZW5kcyBTY29wZSB7CiAgICAgIGNvbnN0cnVjdG9yKG9wdHMpIHsKICAgICAgICBzdXBlcihvcHRzKTsKICAgICAgICB0aGlzLl92YWx1ZXMgPSB7fTsKICAgICAgICB0aGlzLl9zY29wZSA9IG9wdHMuc2NvcGU7CiAgICAgICAgdGhpcy5vcHRzID0geyAuLi5vcHRzLCBfbjogb3B0cy5saW5lcyA/IGxpbmUgOiBjb2RlXzEubmlsIH07CiAgICAgIH0KICAgICAgZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zY29wZTsKICAgICAgfQogICAgICBuYW1lKHByZWZpeCkgewogICAgICAgIHJldHVybiBuZXcgVmFsdWVTY29wZU5hbWUocHJlZml4LCB0aGlzLl9uZXdOYW1lKHByZWZpeCkpOwogICAgICB9CiAgICAgIHZhbHVlKG5hbWVPclByZWZpeCwgdmFsdWUpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgaWYgKHZhbHVlLnJlZiA9PT0gdm9pZCAwKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiByZWYgbXVzdCBiZSBwYXNzZWQgaW4gdmFsdWUiKTsKICAgICAgICBjb25zdCBuYW1lID0gdGhpcy50b05hbWUobmFtZU9yUHJlZml4KTsKICAgICAgICBjb25zdCB7IHByZWZpeCB9ID0gbmFtZTsKICAgICAgICBjb25zdCB2YWx1ZUtleSA9IChfYSA9IHZhbHVlLmtleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdmFsdWUucmVmOwogICAgICAgIGxldCB2cyA9IHRoaXMuX3ZhbHVlc1twcmVmaXhdOwogICAgICAgIGlmICh2cykgewogICAgICAgICAgY29uc3QgX25hbWUgPSB2cy5nZXQodmFsdWVLZXkpOwogICAgICAgICAgaWYgKF9uYW1lKQogICAgICAgICAgICByZXR1cm4gX25hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZzID0gdGhpcy5fdmFsdWVzW3ByZWZpeF0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICB2cy5zZXQodmFsdWVLZXksIG5hbWUpOwogICAgICAgIGNvbnN0IHMgPSB0aGlzLl9zY29wZVtwcmVmaXhdIHx8ICh0aGlzLl9zY29wZVtwcmVmaXhdID0gW10pOwogICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHMubGVuZ3RoOwogICAgICAgIHNbaXRlbUluZGV4XSA9IHZhbHVlLnJlZjsKICAgICAgICBuYW1lLnNldFZhbHVlKHZhbHVlLCB7IHByb3BlcnR5OiBwcmVmaXgsIGl0ZW1JbmRleCB9KTsKICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgfQogICAgICBnZXRWYWx1ZShwcmVmaXgsIGtleU9yUmVmKSB7CiAgICAgICAgY29uc3QgdnMgPSB0aGlzLl92YWx1ZXNbcHJlZml4XTsKICAgICAgICBpZiAoIXZzKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHJldHVybiB2cy5nZXQoa2V5T3JSZWYpOwogICAgICB9CiAgICAgIHNjb3BlUmVmcyhzY29wZU5hbWUsIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcykgewogICAgICAgIHJldHVybiB0aGlzLl9yZWR1Y2VWYWx1ZXModmFsdWVzLCAobmFtZSkgPT4gewogICAgICAgICAgaWYgKG5hbWUuc2NvcGVQYXRoID09PSB2b2lkIDApCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29kZUdlbjogbmFtZSAiJHtuYW1lfSIgaGFzIG5vIHZhbHVlYCk7CiAgICAgICAgICByZXR1cm4gKDAsIGNvZGVfMS5fKWAke3Njb3BlTmFtZX0ke25hbWUuc2NvcGVQYXRofWA7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgc2NvcGVDb2RlKHZhbHVlcyA9IHRoaXMuX3ZhbHVlcywgdXNlZFZhbHVlcywgZ2V0Q29kZSkgewogICAgICAgIHJldHVybiB0aGlzLl9yZWR1Y2VWYWx1ZXModmFsdWVzLCAobmFtZSkgPT4gewogICAgICAgICAgaWYgKG5hbWUudmFsdWUgPT09IHZvaWQgMCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2RlR2VuOiBuYW1lICIke25hbWV9IiBoYXMgbm8gdmFsdWVgKTsKICAgICAgICAgIHJldHVybiBuYW1lLnZhbHVlLmNvZGU7CiAgICAgICAgfSwgdXNlZFZhbHVlcywgZ2V0Q29kZSk7CiAgICAgIH0KICAgICAgX3JlZHVjZVZhbHVlcyh2YWx1ZXMsIHZhbHVlQ29kZSwgdXNlZFZhbHVlcyA9IHt9LCBnZXRDb2RlKSB7CiAgICAgICAgbGV0IGNvZGUgPSBjb2RlXzEubmlsOwogICAgICAgIGZvciAoY29uc3QgcHJlZml4IGluIHZhbHVlcykgewogICAgICAgICAgY29uc3QgdnMgPSB2YWx1ZXNbcHJlZml4XTsKICAgICAgICAgIGlmICghdnMpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY29uc3QgbmFtZVNldCA9IHVzZWRWYWx1ZXNbcHJlZml4XSA9IHVzZWRWYWx1ZXNbcHJlZml4XSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAgICAgdnMuZm9yRWFjaCgobmFtZSkgPT4gewogICAgICAgICAgICBpZiAobmFtZVNldC5oYXMobmFtZSkpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBuYW1lU2V0LnNldChuYW1lLCBVc2VkVmFsdWVTdGF0ZS5TdGFydGVkKTsKICAgICAgICAgICAgbGV0IGMgPSB2YWx1ZUNvZGUobmFtZSk7CiAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgY29uc3QgZGVmID0gdGhpcy5vcHRzLmVzNSA/IGV4cG9ydHMyLnZhcktpbmRzLnZhciA6IGV4cG9ydHMyLnZhcktpbmRzLmNvbnN0OwogICAgICAgICAgICAgIGNvZGUgPSAoMCwgY29kZV8xLl8pYCR7Y29kZX0ke2RlZn0gJHtuYW1lfSA9ICR7Y307JHt0aGlzLm9wdHMuX259YDsKICAgICAgICAgICAgfSBlbHNlIGlmIChjID0gZ2V0Q29kZSA9PT0gbnVsbCB8fCBnZXRDb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnZXRDb2RlKG5hbWUpKSB7CiAgICAgICAgICAgICAgY29kZSA9ICgwLCBjb2RlXzEuXylgJHtjb2RlfSR7Y30ke3RoaXMub3B0cy5fbn1gOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5hbWVTZXQuc2V0KG5hbWUsIFVzZWRWYWx1ZVN0YXRlLkNvbXBsZXRlZCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5WYWx1ZVNjb3BlID0gVmFsdWVTY29wZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9jb2RlZ2VuL2luZGV4LmpzCnZhciByZXF1aXJlX2NvZGVnZW4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9jb2RlZ2VuL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5vciA9IGV4cG9ydHMyLmFuZCA9IGV4cG9ydHMyLm5vdCA9IGV4cG9ydHMyLkNvZGVHZW4gPSBleHBvcnRzMi5vcGVyYXRvcnMgPSBleHBvcnRzMi52YXJLaW5kcyA9IGV4cG9ydHMyLlZhbHVlU2NvcGVOYW1lID0gZXhwb3J0czIuVmFsdWVTY29wZSA9IGV4cG9ydHMyLlNjb3BlID0gZXhwb3J0czIuTmFtZSA9IGV4cG9ydHMyLnJlZ2V4cENvZGUgPSBleHBvcnRzMi5zdHJpbmdpZnkgPSBleHBvcnRzMi5nZXRQcm9wZXJ0eSA9IGV4cG9ydHMyLm5pbCA9IGV4cG9ydHMyLnN0ckNvbmNhdCA9IGV4cG9ydHMyLnN0ciA9IGV4cG9ydHMyLl8gPSB2b2lkIDA7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlKCk7CiAgICB2YXIgc2NvcGVfMSA9IHJlcXVpcmVfc2NvcGUoKTsKICAgIHZhciBjb2RlXzIgPSByZXF1aXJlX2NvZGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl8iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlXzIuXzsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzdHIiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlXzIuc3RyOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInN0ckNvbmNhdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVfMi5zdHJDb25jYXQ7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAibmlsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZV8yLm5pbDsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJnZXRQcm9wZXJ0eSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVfMi5nZXRQcm9wZXJ0eTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzdHJpbmdpZnkiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlXzIuc3RyaW5naWZ5OwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlZ2V4cENvZGUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlXzIucmVnZXhwQ29kZTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJOYW1lIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZV8yLk5hbWU7CiAgICB9IH0pOwogICAgdmFyIHNjb3BlXzIgPSByZXF1aXJlX3Njb3BlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJTY29wZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNjb3BlXzIuU2NvcGU7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiVmFsdWVTY29wZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNjb3BlXzIuVmFsdWVTY29wZTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJWYWx1ZVNjb3BlTmFtZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNjb3BlXzIuVmFsdWVTY29wZU5hbWU7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidmFyS2luZHMiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzY29wZV8yLnZhcktpbmRzOwogICAgfSB9KTsKICAgIGV4cG9ydHMyLm9wZXJhdG9ycyA9IHsKICAgICAgR1Q6IG5ldyBjb2RlXzEuX0NvZGUoIj4iKSwKICAgICAgR1RFOiBuZXcgY29kZV8xLl9Db2RlKCI+PSIpLAogICAgICBMVDogbmV3IGNvZGVfMS5fQ29kZSgiPCIpLAogICAgICBMVEU6IG5ldyBjb2RlXzEuX0NvZGUoIjw9IiksCiAgICAgIEVROiBuZXcgY29kZV8xLl9Db2RlKCI9PT0iKSwKICAgICAgTkVROiBuZXcgY29kZV8xLl9Db2RlKCIhPT0iKSwKICAgICAgTk9UOiBuZXcgY29kZV8xLl9Db2RlKCIhIiksCiAgICAgIE9SOiBuZXcgY29kZV8xLl9Db2RlKCJ8fCIpLAogICAgICBBTkQ6IG5ldyBjb2RlXzEuX0NvZGUoIiYmIiksCiAgICAgIEFERDogbmV3IGNvZGVfMS5fQ29kZSgiKyIpCiAgICB9OwogICAgdmFyIE5vZGUgPSBjbGFzcyB7CiAgICAgIG9wdGltaXplTm9kZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgb3B0aW1pemVOYW1lcyhfbmFtZXMsIF9jb25zdGFudHMpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgfTsKICAgIHZhciBEZWYgPSBjbGFzcyBleHRlbmRzIE5vZGUgewogICAgICBjb25zdHJ1Y3Rvcih2YXJLaW5kLCBuYW1lLCByaHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMudmFyS2luZCA9IHZhcktpbmQ7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnJocyA9IHJoczsKICAgICAgfQogICAgICByZW5kZXIoeyBlczUsIF9uIH0pIHsKICAgICAgICBjb25zdCB2YXJLaW5kID0gZXM1ID8gc2NvcGVfMS52YXJLaW5kcy52YXIgOiB0aGlzLnZhcktpbmQ7CiAgICAgICAgY29uc3QgcmhzID0gdGhpcy5yaHMgPT09IHZvaWQgMCA/ICIiIDogYCA9ICR7dGhpcy5yaHN9YDsKICAgICAgICByZXR1cm4gYCR7dmFyS2luZH0gJHt0aGlzLm5hbWV9JHtyaHN9O2AgKyBfbjsKICAgICAgfQogICAgICBvcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpIHsKICAgICAgICBpZiAoIW5hbWVzW3RoaXMubmFtZS5zdHJdKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmICh0aGlzLnJocykKICAgICAgICAgIHRoaXMucmhzID0gb3B0aW1pemVFeHByKHRoaXMucmhzLCBuYW1lcywgY29uc3RhbnRzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBnZXQgbmFtZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmhzIGluc3RhbmNlb2YgY29kZV8xLl9Db2RlT3JOYW1lID8gdGhpcy5yaHMubmFtZXMgOiB7fTsKICAgICAgfQogICAgfTsKICAgIHZhciBBc3NpZ24gPSBjbGFzcyBleHRlbmRzIE5vZGUgewogICAgICBjb25zdHJ1Y3RvcihsaHMsIHJocywgc2lkZUVmZmVjdHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubGhzID0gbGhzOwogICAgICAgIHRoaXMucmhzID0gcmhzOwogICAgICAgIHRoaXMuc2lkZUVmZmVjdHMgPSBzaWRlRWZmZWN0czsKICAgICAgfQogICAgICByZW5kZXIoeyBfbiB9KSB7CiAgICAgICAgcmV0dXJuIGAke3RoaXMubGhzfSA9ICR7dGhpcy5yaHN9O2AgKyBfbjsKICAgICAgfQogICAgICBvcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpIHsKICAgICAgICBpZiAodGhpcy5saHMgaW5zdGFuY2VvZiBjb2RlXzEuTmFtZSAmJiAhbmFtZXNbdGhpcy5saHMuc3RyXSAmJiAhdGhpcy5zaWRlRWZmZWN0cykKICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLnJocyA9IG9wdGltaXplRXhwcih0aGlzLnJocywgbmFtZXMsIGNvbnN0YW50cyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgZ2V0IG5hbWVzKCkgewogICAgICAgIGNvbnN0IG5hbWVzID0gdGhpcy5saHMgaW5zdGFuY2VvZiBjb2RlXzEuTmFtZSA/IHt9IDogeyAuLi50aGlzLmxocy5uYW1lcyB9OwogICAgICAgIHJldHVybiBhZGRFeHByTmFtZXMobmFtZXMsIHRoaXMucmhzKTsKICAgICAgfQogICAgfTsKICAgIHZhciBBc3NpZ25PcCA9IGNsYXNzIGV4dGVuZHMgQXNzaWduIHsKICAgICAgY29uc3RydWN0b3IobGhzLCBvcCwgcmhzLCBzaWRlRWZmZWN0cykgewogICAgICAgIHN1cGVyKGxocywgcmhzLCBzaWRlRWZmZWN0cyk7CiAgICAgICAgdGhpcy5vcCA9IG9wOwogICAgICB9CiAgICAgIHJlbmRlcih7IF9uIH0pIHsKICAgICAgICByZXR1cm4gYCR7dGhpcy5saHN9ICR7dGhpcy5vcH09ICR7dGhpcy5yaHN9O2AgKyBfbjsKICAgICAgfQogICAgfTsKICAgIHZhciBMYWJlbCA9IGNsYXNzIGV4dGVuZHMgTm9kZSB7CiAgICAgIGNvbnN0cnVjdG9yKGxhYmVsKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CiAgICAgICAgdGhpcy5uYW1lcyA9IHt9OwogICAgICB9CiAgICAgIHJlbmRlcih7IF9uIH0pIHsKICAgICAgICByZXR1cm4gYCR7dGhpcy5sYWJlbH06YCArIF9uOwogICAgICB9CiAgICB9OwogICAgdmFyIEJyZWFrID0gY2xhc3MgZXh0ZW5kcyBOb2RlIHsKICAgICAgY29uc3RydWN0b3IobGFiZWwpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKICAgICAgICB0aGlzLm5hbWVzID0ge307CiAgICAgIH0KICAgICAgcmVuZGVyKHsgX24gfSkgewogICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5sYWJlbCA/IGAgJHt0aGlzLmxhYmVsfWAgOiAiIjsKICAgICAgICByZXR1cm4gYGJyZWFrJHtsYWJlbH07YCArIF9uOwogICAgICB9CiAgICB9OwogICAgdmFyIFRocm93ID0gY2xhc3MgZXh0ZW5kcyBOb2RlIHsKICAgICAgY29uc3RydWN0b3IoZXJyb3IpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgICAgfQogICAgICByZW5kZXIoeyBfbiB9KSB7CiAgICAgICAgcmV0dXJuIGB0aHJvdyAke3RoaXMuZXJyb3J9O2AgKyBfbjsKICAgICAgfQogICAgICBnZXQgbmFtZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IubmFtZXM7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQW55Q29kZSA9IGNsYXNzIGV4dGVuZHMgTm9kZSB7CiAgICAgIGNvbnN0cnVjdG9yKGNvZGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CiAgICAgIH0KICAgICAgcmVuZGVyKHsgX24gfSkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmNvZGV9O2AgKyBfbjsKICAgICAgfQogICAgICBvcHRpbWl6ZU5vZGVzKCkgewogICAgICAgIHJldHVybiBgJHt0aGlzLmNvZGV9YCA/IHRoaXMgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgb3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKSB7CiAgICAgICAgdGhpcy5jb2RlID0gb3B0aW1pemVFeHByKHRoaXMuY29kZSwgbmFtZXMsIGNvbnN0YW50cyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgZ2V0IG5hbWVzKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvZGUgaW5zdGFuY2VvZiBjb2RlXzEuX0NvZGVPck5hbWUgPyB0aGlzLmNvZGUubmFtZXMgOiB7fTsKICAgICAgfQogICAgfTsKICAgIHZhciBQYXJlbnROb2RlID0gY2xhc3MgZXh0ZW5kcyBOb2RlIHsKICAgICAgY29uc3RydWN0b3Iobm9kZXMgPSBbXSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzOwogICAgICB9CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXMucmVkdWNlKChjb2RlLCBuKSA9PiBjb2RlICsgbi5yZW5kZXIob3B0cyksICIiKTsKICAgICAgfQogICAgICBvcHRpbWl6ZU5vZGVzKCkgewogICAgICAgIGNvbnN0IHsgbm9kZXMgfSA9IHRoaXM7CiAgICAgICAgbGV0IGkgPSBub2Rlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgY29uc3QgbiA9IG5vZGVzW2ldLm9wdGltaXplTm9kZXMoKTsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG4pKQogICAgICAgICAgICBub2Rlcy5zcGxpY2UoaSwgMSwgLi4ubik7CiAgICAgICAgICBlbHNlIGlmIChuKQogICAgICAgICAgICBub2Rlc1tpXSA9IG47CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGVzLmxlbmd0aCA+IDAgPyB0aGlzIDogdm9pZCAwOwogICAgICB9CiAgICAgIG9wdGltaXplTmFtZXMobmFtZXMsIGNvbnN0YW50cykgewogICAgICAgIGNvbnN0IHsgbm9kZXMgfSA9IHRoaXM7CiAgICAgICAgbGV0IGkgPSBub2Rlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgY29uc3QgbiA9IG5vZGVzW2ldOwogICAgICAgICAgaWYgKG4ub3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBzdWJ0cmFjdE5hbWVzKG5hbWVzLCBuLm5hbWVzKTsKICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGVzLmxlbmd0aCA+IDAgPyB0aGlzIDogdm9pZCAwOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKG5hbWVzLCBuKSA9PiBhZGROYW1lcyhuYW1lcywgbi5uYW1lcyksIHt9KTsKICAgICAgfQogICAgfTsKICAgIHZhciBCbG9ja05vZGUgPSBjbGFzcyBleHRlbmRzIFBhcmVudE5vZGUgewogICAgICByZW5kZXIob3B0cykgewogICAgICAgIHJldHVybiAieyIgKyBvcHRzLl9uICsgc3VwZXIucmVuZGVyKG9wdHMpICsgIn0iICsgb3B0cy5fbjsKICAgICAgfQogICAgfTsKICAgIHZhciBSb290ID0gY2xhc3MgZXh0ZW5kcyBQYXJlbnROb2RlIHsKICAgIH07CiAgICB2YXIgRWxzZSA9IGNsYXNzIGV4dGVuZHMgQmxvY2tOb2RlIHsKICAgIH07CiAgICBFbHNlLmtpbmQgPSAiZWxzZSI7CiAgICB2YXIgSWYgPSBjbGFzcyBfSWYgZXh0ZW5kcyBCbG9ja05vZGUgewogICAgICBjb25zdHJ1Y3Rvcihjb25kaXRpb24sIG5vZGVzKSB7CiAgICAgICAgc3VwZXIobm9kZXMpOwogICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOwogICAgICB9CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgbGV0IGNvZGUgPSBgaWYoJHt0aGlzLmNvbmRpdGlvbn0pYCArIHN1cGVyLnJlbmRlcihvcHRzKTsKICAgICAgICBpZiAodGhpcy5lbHNlKQogICAgICAgICAgY29kZSArPSAiZWxzZSAiICsgdGhpcy5lbHNlLnJlbmRlcihvcHRzKTsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQogICAgICBvcHRpbWl6ZU5vZGVzKCkgewogICAgICAgIHN1cGVyLm9wdGltaXplTm9kZXMoKTsKICAgICAgICBjb25zdCBjb25kID0gdGhpcy5jb25kaXRpb247CiAgICAgICAgaWYgKGNvbmQgPT09IHRydWUpCiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlczsKICAgICAgICBsZXQgZSA9IHRoaXMuZWxzZTsKICAgICAgICBpZiAoZSkgewogICAgICAgICAgY29uc3QgbnMgPSBlLm9wdGltaXplTm9kZXMoKTsKICAgICAgICAgIGUgPSB0aGlzLmVsc2UgPSBBcnJheS5pc0FycmF5KG5zKSA/IG5ldyBFbHNlKG5zKSA6IG5zOwogICAgICAgIH0KICAgICAgICBpZiAoZSkgewogICAgICAgICAgaWYgKGNvbmQgPT09IGZhbHNlKQogICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIF9JZiA/IGUgOiBlLm5vZGVzOwogICAgICAgICAgaWYgKHRoaXMubm9kZXMubGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIHJldHVybiBuZXcgX0lmKG5vdChjb25kKSwgZSBpbnN0YW5jZW9mIF9JZiA/IFtlXSA6IGUubm9kZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZCA9PT0gZmFsc2UgfHwgIXRoaXMubm9kZXMubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBvcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgdGhpcy5lbHNlID0gKF9hID0gdGhpcy5lbHNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKTsKICAgICAgICBpZiAoIShzdXBlci5vcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpIHx8IHRoaXMuZWxzZSkpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5jb25kaXRpb24gPSBvcHRpbWl6ZUV4cHIodGhpcy5jb25kaXRpb24sIG5hbWVzLCBjb25zdGFudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICBjb25zdCBuYW1lcyA9IHN1cGVyLm5hbWVzOwogICAgICAgIGFkZEV4cHJOYW1lcyhuYW1lcywgdGhpcy5jb25kaXRpb24pOwogICAgICAgIGlmICh0aGlzLmVsc2UpCiAgICAgICAgICBhZGROYW1lcyhuYW1lcywgdGhpcy5lbHNlLm5hbWVzKTsKICAgICAgICByZXR1cm4gbmFtZXM7CiAgICAgIH0KICAgIH07CiAgICBJZi5raW5kID0gImlmIjsKICAgIHZhciBGb3IgPSBjbGFzcyBleHRlbmRzIEJsb2NrTm9kZSB7CiAgICB9OwogICAgRm9yLmtpbmQgPSAiZm9yIjsKICAgIHZhciBGb3JMb29wID0gY2xhc3MgZXh0ZW5kcyBGb3IgewogICAgICBjb25zdHJ1Y3RvcihpdGVyYXRpb24pIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuaXRlcmF0aW9uID0gaXRlcmF0aW9uOwogICAgICB9CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgcmV0dXJuIGBmb3IoJHt0aGlzLml0ZXJhdGlvbn0pYCArIHN1cGVyLnJlbmRlcihvcHRzKTsKICAgICAgfQogICAgICBvcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpIHsKICAgICAgICBpZiAoIXN1cGVyLm9wdGltaXplTmFtZXMobmFtZXMsIGNvbnN0YW50cykpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5pdGVyYXRpb24gPSBvcHRpbWl6ZUV4cHIodGhpcy5pdGVyYXRpb24sIG5hbWVzLCBjb25zdGFudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICByZXR1cm4gYWRkTmFtZXMoc3VwZXIubmFtZXMsIHRoaXMuaXRlcmF0aW9uLm5hbWVzKTsKICAgICAgfQogICAgfTsKICAgIHZhciBGb3JSYW5nZSA9IGNsYXNzIGV4dGVuZHMgRm9yIHsKICAgICAgY29uc3RydWN0b3IodmFyS2luZCwgbmFtZSwgZnJvbSwgdG8pIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMudmFyS2luZCA9IHZhcktpbmQ7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwogICAgICAgIHRoaXMudG8gPSB0bzsKICAgICAgfQogICAgICByZW5kZXIob3B0cykgewogICAgICAgIGNvbnN0IHZhcktpbmQgPSBvcHRzLmVzNSA/IHNjb3BlXzEudmFyS2luZHMudmFyIDogdGhpcy52YXJLaW5kOwogICAgICAgIGNvbnN0IHsgbmFtZSwgZnJvbSwgdG8gfSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIGBmb3IoJHt2YXJLaW5kfSAke25hbWV9PSR7ZnJvbX07ICR7bmFtZX08JHt0b307ICR7bmFtZX0rKylgICsgc3VwZXIucmVuZGVyKG9wdHMpOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICBjb25zdCBuYW1lcyA9IGFkZEV4cHJOYW1lcyhzdXBlci5uYW1lcywgdGhpcy5mcm9tKTsKICAgICAgICByZXR1cm4gYWRkRXhwck5hbWVzKG5hbWVzLCB0aGlzLnRvKTsKICAgICAgfQogICAgfTsKICAgIHZhciBGb3JJdGVyID0gY2xhc3MgZXh0ZW5kcyBGb3IgewogICAgICBjb25zdHJ1Y3Rvcihsb29wLCB2YXJLaW5kLCBuYW1lLCBpdGVyYWJsZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5sb29wID0gbG9vcDsKICAgICAgICB0aGlzLnZhcktpbmQgPSB2YXJLaW5kOwogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwogICAgICB9CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgcmV0dXJuIGBmb3IoJHt0aGlzLnZhcktpbmR9ICR7dGhpcy5uYW1lfSAke3RoaXMubG9vcH0gJHt0aGlzLml0ZXJhYmxlfSlgICsgc3VwZXIucmVuZGVyKG9wdHMpOwogICAgICB9CiAgICAgIG9wdGltaXplTmFtZXMobmFtZXMsIGNvbnN0YW50cykgewogICAgICAgIGlmICghc3VwZXIub3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLml0ZXJhYmxlID0gb3B0aW1pemVFeHByKHRoaXMuaXRlcmFibGUsIG5hbWVzLCBjb25zdGFudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICByZXR1cm4gYWRkTmFtZXMoc3VwZXIubmFtZXMsIHRoaXMuaXRlcmFibGUubmFtZXMpOwogICAgICB9CiAgICB9OwogICAgdmFyIEZ1bmMgPSBjbGFzcyBleHRlbmRzIEJsb2NrTm9kZSB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUsIGFyZ3MsIGFzeW5jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICAgICAgdGhpcy5hc3luYyA9IGFzeW5jOwogICAgICB9CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgY29uc3QgX2FzeW5jID0gdGhpcy5hc3luYyA/ICJhc3luYyAiIDogIiI7CiAgICAgICAgcmV0dXJuIGAke19hc3luY31mdW5jdGlvbiAke3RoaXMubmFtZX0oJHt0aGlzLmFyZ3N9KWAgKyBzdXBlci5yZW5kZXIob3B0cyk7CiAgICAgIH0KICAgIH07CiAgICBGdW5jLmtpbmQgPSAiZnVuYyI7CiAgICB2YXIgUmV0dXJuID0gY2xhc3MgZXh0ZW5kcyBQYXJlbnROb2RlIHsKICAgICAgcmVuZGVyKG9wdHMpIHsKICAgICAgICByZXR1cm4gInJldHVybiAiICsgc3VwZXIucmVuZGVyKG9wdHMpOwogICAgICB9CiAgICB9OwogICAgUmV0dXJuLmtpbmQgPSAicmV0dXJuIjsKICAgIHZhciBUcnkgPSBjbGFzcyBleHRlbmRzIEJsb2NrTm9kZSB7CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgbGV0IGNvZGUgPSAidHJ5IiArIHN1cGVyLnJlbmRlcihvcHRzKTsKICAgICAgICBpZiAodGhpcy5jYXRjaCkKICAgICAgICAgIGNvZGUgKz0gdGhpcy5jYXRjaC5yZW5kZXIob3B0cyk7CiAgICAgICAgaWYgKHRoaXMuZmluYWxseSkKICAgICAgICAgIGNvZGUgKz0gdGhpcy5maW5hbGx5LnJlbmRlcihvcHRzKTsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQogICAgICBvcHRpbWl6ZU5vZGVzKCkgewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgc3VwZXIub3B0aW1pemVOb2RlcygpOwogICAgICAgIChfYSA9IHRoaXMuY2F0Y2gpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpbWl6ZU5vZGVzKCk7CiAgICAgICAgKF9iID0gdGhpcy5maW5hbGx5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iub3B0aW1pemVOb2RlcygpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIG9wdGltaXplTmFtZXMobmFtZXMsIGNvbnN0YW50cykgewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgc3VwZXIub3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKTsKICAgICAgICAoX2EgPSB0aGlzLmNhdGNoKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW1pemVOYW1lcyhuYW1lcywgY29uc3RhbnRzKTsKICAgICAgICAoX2IgPSB0aGlzLmZpbmFsbHkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5vcHRpbWl6ZU5hbWVzKG5hbWVzLCBjb25zdGFudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGdldCBuYW1lcygpIHsKICAgICAgICBjb25zdCBuYW1lcyA9IHN1cGVyLm5hbWVzOwogICAgICAgIGlmICh0aGlzLmNhdGNoKQogICAgICAgICAgYWRkTmFtZXMobmFtZXMsIHRoaXMuY2F0Y2gubmFtZXMpOwogICAgICAgIGlmICh0aGlzLmZpbmFsbHkpCiAgICAgICAgICBhZGROYW1lcyhuYW1lcywgdGhpcy5maW5hbGx5Lm5hbWVzKTsKICAgICAgICByZXR1cm4gbmFtZXM7CiAgICAgIH0KICAgIH07CiAgICB2YXIgQ2F0Y2ggPSBjbGFzcyBleHRlbmRzIEJsb2NrTm9kZSB7CiAgICAgIGNvbnN0cnVjdG9yKGVycm9yKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgIH0KICAgICAgcmVuZGVyKG9wdHMpIHsKICAgICAgICByZXR1cm4gYGNhdGNoKCR7dGhpcy5lcnJvcn0pYCArIHN1cGVyLnJlbmRlcihvcHRzKTsKICAgICAgfQogICAgfTsKICAgIENhdGNoLmtpbmQgPSAiY2F0Y2giOwogICAgdmFyIEZpbmFsbHkgPSBjbGFzcyBleHRlbmRzIEJsb2NrTm9kZSB7CiAgICAgIHJlbmRlcihvcHRzKSB7CiAgICAgICAgcmV0dXJuICJmaW5hbGx5IiArIHN1cGVyLnJlbmRlcihvcHRzKTsKICAgICAgfQogICAgfTsKICAgIEZpbmFsbHkua2luZCA9ICJmaW5hbGx5IjsKICAgIHZhciBDb2RlR2VuID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihleHRTY29wZSwgb3B0cyA9IHt9KSB7CiAgICAgICAgdGhpcy5fdmFsdWVzID0ge307CiAgICAgICAgdGhpcy5fYmxvY2tTdGFydHMgPSBbXTsKICAgICAgICB0aGlzLl9jb25zdGFudHMgPSB7fTsKICAgICAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIF9uOiBvcHRzLmxpbmVzID8gIlxuIiA6ICIiIH07CiAgICAgICAgdGhpcy5fZXh0U2NvcGUgPSBleHRTY29wZTsKICAgICAgICB0aGlzLl9zY29wZSA9IG5ldyBzY29wZV8xLlNjb3BlKHsgcGFyZW50OiBleHRTY29wZSB9KTsKICAgICAgICB0aGlzLl9ub2RlcyA9IFtuZXcgUm9vdCgpXTsKICAgICAgfQogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC5yZW5kZXIodGhpcy5vcHRzKTsKICAgICAgfQogICAgICAvLyByZXR1cm5zIHVuaXF1ZSBuYW1lIGluIHRoZSBpbnRlcm5hbCBzY29wZQogICAgICBuYW1lKHByZWZpeCkgewogICAgICAgIHJldHVybiB0aGlzLl9zY29wZS5uYW1lKHByZWZpeCk7CiAgICAgIH0KICAgICAgLy8gcmVzZXJ2ZXMgdW5pcXVlIG5hbWUgaW4gdGhlIGV4dGVybmFsIHNjb3BlCiAgICAgIHNjb3BlTmFtZShwcmVmaXgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZXh0U2NvcGUubmFtZShwcmVmaXgpOwogICAgICB9CiAgICAgIC8vIHJlc2VydmVzIHVuaXF1ZSBuYW1lIGluIHRoZSBleHRlcm5hbCBzY29wZSBhbmQgYXNzaWducyB2YWx1ZSB0byBpdAogICAgICBzY29wZVZhbHVlKHByZWZpeE9yTmFtZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fZXh0U2NvcGUudmFsdWUocHJlZml4T3JOYW1lLCB2YWx1ZSk7CiAgICAgICAgY29uc3QgdnMgPSB0aGlzLl92YWx1ZXNbbmFtZS5wcmVmaXhdIHx8ICh0aGlzLl92YWx1ZXNbbmFtZS5wcmVmaXhdID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7CiAgICAgICAgdnMuYWRkKG5hbWUpOwogICAgICAgIHJldHVybiBuYW1lOwogICAgICB9CiAgICAgIGdldFNjb3BlVmFsdWUocHJlZml4LCBrZXlPclJlZikgewogICAgICAgIHJldHVybiB0aGlzLl9leHRTY29wZS5nZXRWYWx1ZShwcmVmaXgsIGtleU9yUmVmKTsKICAgICAgfQogICAgICAvLyByZXR1cm4gY29kZSB0aGF0IGFzc2lnbnMgdmFsdWVzIGluIHRoZSBleHRlcm5hbCBzY29wZSB0byB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCBpbnRlcm5hbGx5CiAgICAgIC8vIChzYW1lIG5hbWVzIHRoYXQgd2VyZSByZXR1cm5lZCBieSBnZW4uc2NvcGVOYW1lIG9yIGdlbi5zY29wZVZhbHVlKQogICAgICBzY29wZVJlZnMoc2NvcGVOYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2V4dFNjb3BlLnNjb3BlUmVmcyhzY29wZU5hbWUsIHRoaXMuX3ZhbHVlcyk7CiAgICAgIH0KICAgICAgc2NvcGVDb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9leHRTY29wZS5zY29wZUNvZGUodGhpcy5fdmFsdWVzKTsKICAgICAgfQogICAgICBfZGVmKHZhcktpbmQsIG5hbWVPclByZWZpeCwgcmhzLCBjb25zdGFudCkgewogICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9zY29wZS50b05hbWUobmFtZU9yUHJlZml4KTsKICAgICAgICBpZiAocmhzICE9PSB2b2lkIDAgJiYgY29uc3RhbnQpCiAgICAgICAgICB0aGlzLl9jb25zdGFudHNbbmFtZS5zdHJdID0gcmhzOwogICAgICAgIHRoaXMuX2xlYWZOb2RlKG5ldyBEZWYodmFyS2luZCwgbmFtZSwgcmhzKSk7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgIH0KICAgICAgLy8gYGNvbnN0YCBkZWNsYXJhdGlvbiAoYHZhcmAgaW4gZXM1IG1vZGUpCiAgICAgIGNvbnN0KG5hbWVPclByZWZpeCwgcmhzLCBfY29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVmKHNjb3BlXzEudmFyS2luZHMuY29uc3QsIG5hbWVPclByZWZpeCwgcmhzLCBfY29uc3RhbnQpOwogICAgICB9CiAgICAgIC8vIGBsZXRgIGRlY2xhcmF0aW9uIHdpdGggb3B0aW9uYWwgYXNzaWdubWVudCAoYHZhcmAgaW4gZXM1IG1vZGUpCiAgICAgIGxldChuYW1lT3JQcmVmaXgsIHJocywgX2NvbnN0YW50KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZihzY29wZV8xLnZhcktpbmRzLmxldCwgbmFtZU9yUHJlZml4LCByaHMsIF9jb25zdGFudCk7CiAgICAgIH0KICAgICAgLy8gYHZhcmAgZGVjbGFyYXRpb24gd2l0aCBvcHRpb25hbCBhc3NpZ25tZW50CiAgICAgIHZhcihuYW1lT3JQcmVmaXgsIHJocywgX2NvbnN0YW50KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZihzY29wZV8xLnZhcktpbmRzLnZhciwgbmFtZU9yUHJlZml4LCByaHMsIF9jb25zdGFudCk7CiAgICAgIH0KICAgICAgLy8gYXNzaWdubWVudCBjb2RlCiAgICAgIGFzc2lnbihsaHMsIHJocywgc2lkZUVmZmVjdHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IEFzc2lnbihsaHMsIHJocywgc2lkZUVmZmVjdHMpKTsKICAgICAgfQogICAgICAvLyBgKz1gIGNvZGUKICAgICAgYWRkKGxocywgcmhzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xlYWZOb2RlKG5ldyBBc3NpZ25PcChsaHMsIGV4cG9ydHMyLm9wZXJhdG9ycy5BREQsIHJocykpOwogICAgICB9CiAgICAgIC8vIGFwcGVuZHMgcGFzc2VkIFNhZmVFeHByIHRvIGNvZGUgb3IgZXhlY3V0ZXMgQmxvY2sKICAgICAgY29kZShjKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjID09ICJmdW5jdGlvbiIpCiAgICAgICAgICBjKCk7CiAgICAgICAgZWxzZSBpZiAoYyAhPT0gY29kZV8xLm5pbCkKICAgICAgICAgIHRoaXMuX2xlYWZOb2RlKG5ldyBBbnlDb2RlKGMpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICAvLyByZXR1cm5zIGNvZGUgZm9yIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgcGFzc2VkIGFyZ3VtZW50IGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzCiAgICAgIG9iamVjdCguLi5rZXlWYWx1ZXMpIHsKICAgICAgICBjb25zdCBjb2RlID0gWyJ7Il07CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5VmFsdWVzKSB7CiAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPiAxKQogICAgICAgICAgICBjb2RlLnB1c2goIiwiKTsKICAgICAgICAgIGNvZGUucHVzaChrZXkpOwogICAgICAgICAgaWYgKGtleSAhPT0gdmFsdWUgfHwgdGhpcy5vcHRzLmVzNSkgewogICAgICAgICAgICBjb2RlLnB1c2goIjoiKTsKICAgICAgICAgICAgKDAsIGNvZGVfMS5hZGRDb2RlQXJnKShjb2RlLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvZGUucHVzaCgifSIpOwogICAgICAgIHJldHVybiBuZXcgY29kZV8xLl9Db2RlKGNvZGUpOwogICAgICB9CiAgICAgIC8vIGBpZmAgY2xhdXNlIChvciBzdGF0ZW1lbnQgaWYgYHRoZW5Cb2R5YCBhbmQsIG9wdGlvbmFsbHksIGBlbHNlQm9keWAgYXJlIHBhc3NlZCkKICAgICAgaWYoY29uZGl0aW9uLCB0aGVuQm9keSwgZWxzZUJvZHkpIHsKICAgICAgICB0aGlzLl9ibG9ja05vZGUobmV3IElmKGNvbmRpdGlvbikpOwogICAgICAgIGlmICh0aGVuQm9keSAmJiBlbHNlQm9keSkgewogICAgICAgICAgdGhpcy5jb2RlKHRoZW5Cb2R5KS5lbHNlKCkuY29kZShlbHNlQm9keSkuZW5kSWYoKTsKICAgICAgICB9IGVsc2UgaWYgKHRoZW5Cb2R5KSB7CiAgICAgICAgICB0aGlzLmNvZGUodGhlbkJvZHkpLmVuZElmKCk7CiAgICAgICAgfSBlbHNlIGlmIChlbHNlQm9keSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAiZWxzZSIgYm9keSB3aXRob3V0ICJ0aGVuIiBib2R5Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8vIGBlbHNlIGlmYCBjbGF1c2UgLSBpbnZhbGlkIHdpdGhvdXQgYGlmYCBvciBhZnRlciBgZWxzZWAgY2xhdXNlcwogICAgICBlbHNlSWYoY29uZGl0aW9uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyBJZihjb25kaXRpb24pKTsKICAgICAgfQogICAgICAvLyBgZWxzZWAgY2xhdXNlIC0gb25seSB2YWxpZCBhZnRlciBgaWZgIG9yIGBlbHNlIGlmYCBjbGF1c2VzCiAgICAgIGVsc2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyBFbHNlKCkpOwogICAgICB9CiAgICAgIC8vIGVuZCBgaWZgIHN0YXRlbWVudCAobmVlZGVkIGlmIGdlbi5pZiB3YXMgdXNlZCBvbmx5IHdpdGggY29uZGl0aW9uKQogICAgICBlbmRJZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKElmLCBFbHNlKTsKICAgICAgfQogICAgICBfZm9yKG5vZGUsIGZvckJvZHkpIHsKICAgICAgICB0aGlzLl9ibG9ja05vZGUobm9kZSk7CiAgICAgICAgaWYgKGZvckJvZHkpCiAgICAgICAgICB0aGlzLmNvZGUoZm9yQm9keSkuZW5kRm9yKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gYSBnZW5lcmljIGBmb3JgIGNsYXVzZSAob3Igc3RhdGVtZW50IGlmIGBmb3JCb2R5YCBpcyBwYXNzZWQpCiAgICAgIGZvcihpdGVyYXRpb24sIGZvckJvZHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZm9yKG5ldyBGb3JMb29wKGl0ZXJhdGlvbiksIGZvckJvZHkpOwogICAgICB9CiAgICAgIC8vIGBmb3JgIHN0YXRlbWVudCBmb3IgYSByYW5nZSBvZiB2YWx1ZXMKICAgICAgZm9yUmFuZ2UobmFtZU9yUHJlZml4LCBmcm9tLCB0bywgZm9yQm9keSwgdmFyS2luZCA9IHRoaXMub3B0cy5lczUgPyBzY29wZV8xLnZhcktpbmRzLnZhciA6IHNjb3BlXzEudmFyS2luZHMubGV0KSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX3Njb3BlLnRvTmFtZShuYW1lT3JQcmVmaXgpOwogICAgICAgIHJldHVybiB0aGlzLl9mb3IobmV3IEZvclJhbmdlKHZhcktpbmQsIG5hbWUsIGZyb20sIHRvKSwgKCkgPT4gZm9yQm9keShuYW1lKSk7CiAgICAgIH0KICAgICAgLy8gYGZvci1vZmAgc3RhdGVtZW50IChpbiBlczUgbW9kZSByZXBsYWNlIHdpdGggYSBub3JtYWwgZm9yIGxvb3ApCiAgICAgIGZvck9mKG5hbWVPclByZWZpeCwgaXRlcmFibGUsIGZvckJvZHksIHZhcktpbmQgPSBzY29wZV8xLnZhcktpbmRzLmNvbnN0KSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX3Njb3BlLnRvTmFtZShuYW1lT3JQcmVmaXgpOwogICAgICAgIGlmICh0aGlzLm9wdHMuZXM1KSB7CiAgICAgICAgICBjb25zdCBhcnIgPSBpdGVyYWJsZSBpbnN0YW5jZW9mIGNvZGVfMS5OYW1lID8gaXRlcmFibGUgOiB0aGlzLnZhcigiX2FyciIsIGl0ZXJhYmxlKTsKICAgICAgICAgIHJldHVybiB0aGlzLmZvclJhbmdlKCJfaSIsIDAsICgwLCBjb2RlXzEuXylgJHthcnJ9Lmxlbmd0aGAsIChpKSA9PiB7CiAgICAgICAgICAgIHRoaXMudmFyKG5hbWUsICgwLCBjb2RlXzEuXylgJHthcnJ9WyR7aX1dYCk7CiAgICAgICAgICAgIGZvckJvZHkobmFtZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcihuZXcgRm9ySXRlcigib2YiLCB2YXJLaW5kLCBuYW1lLCBpdGVyYWJsZSksICgpID0+IGZvckJvZHkobmFtZSkpOwogICAgICB9CiAgICAgIC8vIGBmb3ItaW5gIHN0YXRlbWVudC4KICAgICAgLy8gV2l0aCBvcHRpb24gYG93blByb3BlcnRpZXNgIHJlcGxhY2VkIHdpdGggYSBgZm9yLW9mYCBsb29wIGZvciBvYmplY3Qga2V5cwogICAgICBmb3JJbihuYW1lT3JQcmVmaXgsIG9iaiwgZm9yQm9keSwgdmFyS2luZCA9IHRoaXMub3B0cy5lczUgPyBzY29wZV8xLnZhcktpbmRzLnZhciA6IHNjb3BlXzEudmFyS2luZHMuY29uc3QpIHsKICAgICAgICBpZiAodGhpcy5vcHRzLm93blByb3BlcnRpZXMpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmZvck9mKG5hbWVPclByZWZpeCwgKDAsIGNvZGVfMS5fKWBPYmplY3Qua2V5cygke29ian0pYCwgZm9yQm9keSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9zY29wZS50b05hbWUobmFtZU9yUHJlZml4KTsKICAgICAgICByZXR1cm4gdGhpcy5fZm9yKG5ldyBGb3JJdGVyKCJpbiIsIHZhcktpbmQsIG5hbWUsIG9iaiksICgpID0+IGZvckJvZHkobmFtZSkpOwogICAgICB9CiAgICAgIC8vIGVuZCBgZm9yYCBsb29wCiAgICAgIGVuZEZvcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKEZvcik7CiAgICAgIH0KICAgICAgLy8gYGxhYmVsYCBzdGF0ZW1lbnQKICAgICAgbGFiZWwobGFiZWwpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IExhYmVsKGxhYmVsKSk7CiAgICAgIH0KICAgICAgLy8gYGJyZWFrYCBzdGF0ZW1lbnQKICAgICAgYnJlYWsobGFiZWwpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IEJyZWFrKGxhYmVsKSk7CiAgICAgIH0KICAgICAgLy8gYHJldHVybmAgc3RhdGVtZW50CiAgICAgIHJldHVybih2YWx1ZSkgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgUmV0dXJuKCk7CiAgICAgICAgdGhpcy5fYmxvY2tOb2RlKG5vZGUpOwogICAgICAgIHRoaXMuY29kZSh2YWx1ZSk7CiAgICAgICAgaWYgKG5vZGUubm9kZXMubGVuZ3RoICE9PSAxKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAicmV0dXJuIiBzaG91bGQgaGF2ZSBvbmUgbm9kZScpOwogICAgICAgIHJldHVybiB0aGlzLl9lbmRCbG9ja05vZGUoUmV0dXJuKTsKICAgICAgfQogICAgICAvLyBgdHJ5YCBzdGF0ZW1lbnQKICAgICAgdHJ5KHRyeUJvZHksIGNhdGNoQ29kZSwgZmluYWxseUNvZGUpIHsKICAgICAgICBpZiAoIWNhdGNoQ29kZSAmJiAhZmluYWxseUNvZGUpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVHZW46ICJ0cnkiIHdpdGhvdXQgImNhdGNoIiBhbmQgImZpbmFsbHkiJyk7CiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBUcnkoKTsKICAgICAgICB0aGlzLl9ibG9ja05vZGUobm9kZSk7CiAgICAgICAgdGhpcy5jb2RlKHRyeUJvZHkpOwogICAgICAgIGlmIChjYXRjaENvZGUpIHsKICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uYW1lKCJlIik7CiAgICAgICAgICB0aGlzLl9jdXJyTm9kZSA9IG5vZGUuY2F0Y2ggPSBuZXcgQ2F0Y2goZXJyb3IpOwogICAgICAgICAgY2F0Y2hDb2RlKGVycm9yKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbmFsbHlDb2RlKSB7CiAgICAgICAgICB0aGlzLl9jdXJyTm9kZSA9IG5vZGUuZmluYWxseSA9IG5ldyBGaW5hbGx5KCk7CiAgICAgICAgICB0aGlzLmNvZGUoZmluYWxseUNvZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKENhdGNoLCBGaW5hbGx5KTsKICAgICAgfQogICAgICAvLyBgdGhyb3dgIHN0YXRlbWVudAogICAgICB0aHJvdyhlcnJvcikgewogICAgICAgIHJldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgVGhyb3coZXJyb3IpKTsKICAgICAgfQogICAgICAvLyBzdGFydCBzZWxmLWJhbGFuY2luZyBibG9jawogICAgICBibG9jayhib2R5LCBub2RlQ291bnQpIHsKICAgICAgICB0aGlzLl9ibG9ja1N0YXJ0cy5wdXNoKHRoaXMuX25vZGVzLmxlbmd0aCk7CiAgICAgICAgaWYgKGJvZHkpCiAgICAgICAgICB0aGlzLmNvZGUoYm9keSkuZW5kQmxvY2sobm9kZUNvdW50KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICAvLyBlbmQgdGhlIGN1cnJlbnQgc2VsZi1iYWxhbmNpbmcgYmxvY2sKICAgICAgZW5kQmxvY2sobm9kZUNvdW50KSB7CiAgICAgICAgY29uc3QgbGVuID0gdGhpcy5fYmxvY2tTdGFydHMucG9wKCk7CiAgICAgICAgaWYgKGxlbiA9PT0gdm9pZCAwKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiBub3QgaW4gc2VsZi1iYWxhbmNpbmcgYmxvY2siKTsKICAgICAgICBjb25zdCB0b0Nsb3NlID0gdGhpcy5fbm9kZXMubGVuZ3RoIC0gbGVuOwogICAgICAgIGlmICh0b0Nsb3NlIDwgMCB8fCBub2RlQ291bnQgIT09IHZvaWQgMCAmJiB0b0Nsb3NlICE9PSBub2RlQ291bnQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29kZUdlbjogd3JvbmcgbnVtYmVyIG9mIG5vZGVzOiAke3RvQ2xvc2V9IHZzICR7bm9kZUNvdW50fSBleHBlY3RlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9ub2Rlcy5sZW5ndGggPSBsZW47CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gYGZ1bmN0aW9uYCBoZWFkaW5nIChvciBkZWZpbml0aW9uIGlmIGZ1bmNCb2R5IGlzIHBhc3NlZCkKICAgICAgZnVuYyhuYW1lLCBhcmdzID0gY29kZV8xLm5pbCwgYXN5bmMsIGZ1bmNCb2R5KSB7CiAgICAgICAgdGhpcy5fYmxvY2tOb2RlKG5ldyBGdW5jKG5hbWUsIGFyZ3MsIGFzeW5jKSk7CiAgICAgICAgaWYgKGZ1bmNCb2R5KQogICAgICAgICAgdGhpcy5jb2RlKGZ1bmNCb2R5KS5lbmRGdW5jKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gZW5kIGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgZW5kRnVuYygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKEZ1bmMpOwogICAgICB9CiAgICAgIG9wdGltaXplKG4gPSAxKSB7CiAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKICAgICAgICAgIHRoaXMuX3Jvb3Qub3B0aW1pemVOb2RlcygpOwogICAgICAgICAgdGhpcy5fcm9vdC5vcHRpbWl6ZU5hbWVzKHRoaXMuX3Jvb3QubmFtZXMsIHRoaXMuX2NvbnN0YW50cyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9sZWFmTm9kZShub2RlKSB7CiAgICAgICAgdGhpcy5fY3Vyck5vZGUubm9kZXMucHVzaChub2RlKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBfYmxvY2tOb2RlKG5vZGUpIHsKICAgICAgICB0aGlzLl9jdXJyTm9kZS5ub2Rlcy5wdXNoKG5vZGUpOwogICAgICAgIHRoaXMuX25vZGVzLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgX2VuZEJsb2NrTm9kZShOMSwgTjIpIHsKICAgICAgICBjb25zdCBuID0gdGhpcy5fY3Vyck5vZGU7CiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBOMSB8fCBOMiAmJiBuIGluc3RhbmNlb2YgTjIpIHsKICAgICAgICAgIHRoaXMuX25vZGVzLnBvcCgpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29kZUdlbjogbm90IGluIGJsb2NrICIke04yID8gYCR7TjEua2luZH0vJHtOMi5raW5kfWAgOiBOMS5raW5kfSJgKTsKICAgICAgfQogICAgICBfZWxzZU5vZGUobm9kZSkgewogICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jdXJyTm9kZTsKICAgICAgICBpZiAoIShuIGluc3RhbmNlb2YgSWYpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVHZW46ICJlbHNlIiB3aXRob3V0ICJpZiInKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fY3Vyck5vZGUgPSBuLmVsc2UgPSBub2RlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGdldCBfcm9vdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZXNbMF07CiAgICAgIH0KICAgICAgZ2V0IF9jdXJyTm9kZSgpIHsKICAgICAgICBjb25zdCBucyA9IHRoaXMuX25vZGVzOwogICAgICAgIHJldHVybiBuc1tucy5sZW5ndGggLSAxXTsKICAgICAgfQogICAgICBzZXQgX2N1cnJOb2RlKG5vZGUpIHsKICAgICAgICBjb25zdCBucyA9IHRoaXMuX25vZGVzOwogICAgICAgIG5zW25zLmxlbmd0aCAtIDFdID0gbm9kZTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNvZGVHZW4gPSBDb2RlR2VuOwogICAgZnVuY3Rpb24gYWRkTmFtZXMobmFtZXMsIGZyb20pIHsKICAgICAgZm9yIChjb25zdCBuIGluIGZyb20pCiAgICAgICAgbmFtZXNbbl0gPSAobmFtZXNbbl0gfHwgMCkgKyAoZnJvbVtuXSB8fCAwKTsKICAgICAgcmV0dXJuIG5hbWVzOwogICAgfQogICAgZnVuY3Rpb24gYWRkRXhwck5hbWVzKG5hbWVzLCBmcm9tKSB7CiAgICAgIHJldHVybiBmcm9tIGluc3RhbmNlb2YgY29kZV8xLl9Db2RlT3JOYW1lID8gYWRkTmFtZXMobmFtZXMsIGZyb20ubmFtZXMpIDogbmFtZXM7CiAgICB9CiAgICBmdW5jdGlvbiBvcHRpbWl6ZUV4cHIoZXhwciwgbmFtZXMsIGNvbnN0YW50cykgewogICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGNvZGVfMS5OYW1lKQogICAgICAgIHJldHVybiByZXBsYWNlTmFtZShleHByKTsKICAgICAgaWYgKCFjYW5PcHRpbWl6ZShleHByKSkKICAgICAgICByZXR1cm4gZXhwcjsKICAgICAgcmV0dXJuIG5ldyBjb2RlXzEuX0NvZGUoZXhwci5faXRlbXMucmVkdWNlKChpdGVtcywgYykgPT4gewogICAgICAgIGlmIChjIGluc3RhbmNlb2YgY29kZV8xLk5hbWUpCiAgICAgICAgICBjID0gcmVwbGFjZU5hbWUoYyk7CiAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBjb2RlXzEuX0NvZGUpCiAgICAgICAgICBpdGVtcy5wdXNoKC4uLmMuX2l0ZW1zKTsKICAgICAgICBlbHNlCiAgICAgICAgICBpdGVtcy5wdXNoKGMpOwogICAgICAgIHJldHVybiBpdGVtczsKICAgICAgfSwgW10pKTsKICAgICAgZnVuY3Rpb24gcmVwbGFjZU5hbWUobikgewogICAgICAgIGNvbnN0IGMgPSBjb25zdGFudHNbbi5zdHJdOwogICAgICAgIGlmIChjID09PSB2b2lkIDAgfHwgbmFtZXNbbi5zdHJdICE9PSAxKQogICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgZGVsZXRlIG5hbWVzW24uc3RyXTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfQogICAgICBmdW5jdGlvbiBjYW5PcHRpbWl6ZShlKSB7CiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBjb2RlXzEuX0NvZGUgJiYgZS5faXRlbXMuc29tZSgoYykgPT4gYyBpbnN0YW5jZW9mIGNvZGVfMS5OYW1lICYmIG5hbWVzW2Muc3RyXSA9PT0gMSAmJiBjb25zdGFudHNbYy5zdHJdICE9PSB2b2lkIDApOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzdWJ0cmFjdE5hbWVzKG5hbWVzLCBmcm9tKSB7CiAgICAgIGZvciAoY29uc3QgbiBpbiBmcm9tKQogICAgICAgIG5hbWVzW25dID0gKG5hbWVzW25dIHx8IDApIC0gKGZyb21bbl0gfHwgMCk7CiAgICB9CiAgICBmdW5jdGlvbiBub3QoeCkgewogICAgICByZXR1cm4gdHlwZW9mIHggPT0gImJvb2xlYW4iIHx8IHR5cGVvZiB4ID09ICJudW1iZXIiIHx8IHggPT09IG51bGwgPyAheCA6ICgwLCBjb2RlXzEuXylgISR7cGFyKHgpfWA7CiAgICB9CiAgICBleHBvcnRzMi5ub3QgPSBub3Q7CiAgICB2YXIgYW5kQ29kZSA9IG1hcHBlbmQoZXhwb3J0czIub3BlcmF0b3JzLkFORCk7CiAgICBmdW5jdGlvbiBhbmQoLi4uYXJncykgewogICAgICByZXR1cm4gYXJncy5yZWR1Y2UoYW5kQ29kZSk7CiAgICB9CiAgICBleHBvcnRzMi5hbmQgPSBhbmQ7CiAgICB2YXIgb3JDb2RlID0gbWFwcGVuZChleHBvcnRzMi5vcGVyYXRvcnMuT1IpOwogICAgZnVuY3Rpb24gb3IoLi4uYXJncykgewogICAgICByZXR1cm4gYXJncy5yZWR1Y2Uob3JDb2RlKTsKICAgIH0KICAgIGV4cG9ydHMyLm9yID0gb3I7CiAgICBmdW5jdGlvbiBtYXBwZW5kKG9wKSB7CiAgICAgIHJldHVybiAoeCwgeSkgPT4geCA9PT0gY29kZV8xLm5pbCA/IHkgOiB5ID09PSBjb2RlXzEubmlsID8geCA6ICgwLCBjb2RlXzEuXylgJHtwYXIoeCl9ICR7b3B9ICR7cGFyKHkpfWA7CiAgICB9CiAgICBmdW5jdGlvbiBwYXIoeCkgewogICAgICByZXR1cm4geCBpbnN0YW5jZW9mIGNvZGVfMS5OYW1lID8geCA6ICgwLCBjb2RlXzEuXylgKCR7eH0pYDsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS91dGlsLmpzCnZhciByZXF1aXJlX3V0aWwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS91dGlsLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jaGVja1N0cmljdE1vZGUgPSBleHBvcnRzMi5nZXRFcnJvclBhdGggPSBleHBvcnRzMi5UeXBlID0gZXhwb3J0czIudXNlRnVuYyA9IGV4cG9ydHMyLnNldEV2YWx1YXRlZCA9IGV4cG9ydHMyLmV2YWx1YXRlZFByb3BzVG9OYW1lID0gZXhwb3J0czIubWVyZ2VFdmFsdWF0ZWQgPSBleHBvcnRzMi5lYWNoSXRlbSA9IGV4cG9ydHMyLnVuZXNjYXBlSnNvblBvaW50ZXIgPSBleHBvcnRzMi5lc2NhcGVKc29uUG9pbnRlciA9IGV4cG9ydHMyLmVzY2FwZUZyYWdtZW50ID0gZXhwb3J0czIudW5lc2NhcGVGcmFnbWVudCA9IGV4cG9ydHMyLnNjaGVtYVJlZk9yVmFsID0gZXhwb3J0czIuc2NoZW1hSGFzUnVsZXNCdXRSZWYgPSBleHBvcnRzMi5zY2hlbWFIYXNSdWxlcyA9IGV4cG9ydHMyLmNoZWNrVW5rbm93blJ1bGVzID0gZXhwb3J0czIuYWx3YXlzVmFsaWRTY2hlbWEgPSBleHBvcnRzMi50b0hhc2ggPSB2b2lkIDA7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlKCk7CiAgICBmdW5jdGlvbiB0b0hhc2goYXJyKSB7CiAgICAgIGNvbnN0IGhhc2ggPSB7fTsKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikKICAgICAgICBoYXNoW2l0ZW1dID0gdHJ1ZTsKICAgICAgcmV0dXJuIGhhc2g7CiAgICB9CiAgICBleHBvcnRzMi50b0hhc2ggPSB0b0hhc2g7CiAgICBmdW5jdGlvbiBhbHdheXNWYWxpZFNjaGVtYShpdCwgc2NoZW1hKSB7CiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09ICJib29sZWFuIikKICAgICAgICByZXR1cm4gc2NoZW1hOwogICAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNoZWNrVW5rbm93blJ1bGVzKGl0LCBzY2hlbWEpOwogICAgICByZXR1cm4gIXNjaGVtYUhhc1J1bGVzKHNjaGVtYSwgaXQuc2VsZi5SVUxFUy5hbGwpOwogICAgfQogICAgZXhwb3J0czIuYWx3YXlzVmFsaWRTY2hlbWEgPSBhbHdheXNWYWxpZFNjaGVtYTsKICAgIGZ1bmN0aW9uIGNoZWNrVW5rbm93blJ1bGVzKGl0LCBzY2hlbWEgPSBpdC5zY2hlbWEpIHsKICAgICAgY29uc3QgeyBvcHRzLCBzZWxmOiBzZWxmMiB9ID0gaXQ7CiAgICAgIGlmICghb3B0cy5zdHJpY3RTY2hlbWEpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gImJvb2xlYW4iKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgcnVsZXMgPSBzZWxmMi5SVUxFUy5rZXl3b3JkczsKICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hKSB7CiAgICAgICAgaWYgKCFydWxlc1trZXldKQogICAgICAgICAgY2hlY2tTdHJpY3RNb2RlKGl0LCBgdW5rbm93biBrZXl3b3JkOiAiJHtrZXl9ImApOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5jaGVja1Vua25vd25SdWxlcyA9IGNoZWNrVW5rbm93blJ1bGVzOwogICAgZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXMoc2NoZW1hLCBydWxlcykgewogICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAiYm9vbGVhbiIpCiAgICAgICAgcmV0dXJuICFzY2hlbWE7CiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkKICAgICAgICBpZiAocnVsZXNba2V5XSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBleHBvcnRzMi5zY2hlbWFIYXNSdWxlcyA9IHNjaGVtYUhhc1J1bGVzOwogICAgZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXNCdXRSZWYoc2NoZW1hLCBSVUxFUykgewogICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAiYm9vbGVhbiIpCiAgICAgICAgcmV0dXJuICFzY2hlbWE7CiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkKICAgICAgICBpZiAoa2V5ICE9PSAiJHJlZiIgJiYgUlVMRVMuYWxsW2tleV0pCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZXhwb3J0czIuc2NoZW1hSGFzUnVsZXNCdXRSZWYgPSBzY2hlbWFIYXNSdWxlc0J1dFJlZjsKICAgIGZ1bmN0aW9uIHNjaGVtYVJlZk9yVmFsKHsgdG9wU2NoZW1hUmVmLCBzY2hlbWFQYXRoIH0sIHNjaGVtYSwga2V5d29yZCwgJGRhdGEpIHsKICAgICAgaWYgKCEkZGF0YSkgewogICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09ICJudW1iZXIiIHx8IHR5cGVvZiBzY2hlbWEgPT0gImJvb2xlYW4iKQogICAgICAgICAgcmV0dXJuIHNjaGVtYTsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAic3RyaW5nIikKICAgICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLl8pYCR7c2NoZW1hfWA7CiAgICAgIH0KICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXylgJHt0b3BTY2hlbWFSZWZ9JHtzY2hlbWFQYXRofSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkoa2V5d29yZCl9YDsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVtYVJlZk9yVmFsID0gc2NoZW1hUmVmT3JWYWw7CiAgICBmdW5jdGlvbiB1bmVzY2FwZUZyYWdtZW50KHN0cikgewogICAgICByZXR1cm4gdW5lc2NhcGVKc29uUG9pbnRlcihkZWNvZGVVUklDb21wb25lbnQoc3RyKSk7CiAgICB9CiAgICBleHBvcnRzMi51bmVzY2FwZUZyYWdtZW50ID0gdW5lc2NhcGVGcmFnbWVudDsKICAgIGZ1bmN0aW9uIGVzY2FwZUZyYWdtZW50KHN0cikgewogICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGVzY2FwZUpzb25Qb2ludGVyKHN0cikpOwogICAgfQogICAgZXhwb3J0czIuZXNjYXBlRnJhZ21lbnQgPSBlc2NhcGVGcmFnbWVudDsKICAgIGZ1bmN0aW9uIGVzY2FwZUpzb25Qb2ludGVyKHN0cikgewogICAgICBpZiAodHlwZW9mIHN0ciA9PSAibnVtYmVyIikKICAgICAgICByZXR1cm4gYCR7c3RyfWA7CiAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAifjAiKS5yZXBsYWNlKC9cLy9nLCAifjEiKTsKICAgIH0KICAgIGV4cG9ydHMyLmVzY2FwZUpzb25Qb2ludGVyID0gZXNjYXBlSnNvblBvaW50ZXI7CiAgICBmdW5jdGlvbiB1bmVzY2FwZUpzb25Qb2ludGVyKHN0cikgewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL34xL2csICIvIikucmVwbGFjZSgvfjAvZywgIn4iKTsKICAgIH0KICAgIGV4cG9ydHMyLnVuZXNjYXBlSnNvblBvaW50ZXIgPSB1bmVzY2FwZUpzb25Qb2ludGVyOwogICAgZnVuY3Rpb24gZWFjaEl0ZW0oeHMsIGYpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeHMpKSB7CiAgICAgICAgZm9yIChjb25zdCB4IG9mIHhzKQogICAgICAgICAgZih4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmKHhzKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuZWFjaEl0ZW0gPSBlYWNoSXRlbTsKICAgIGZ1bmN0aW9uIG1ha2VNZXJnZUV2YWx1YXRlZCh7IG1lcmdlTmFtZXMsIG1lcmdlVG9OYW1lLCBtZXJnZVZhbHVlcywgcmVzdWx0VG9OYW1lIH0pIHsKICAgICAgcmV0dXJuIChnZW4sIGZyb20sIHRvLCB0b05hbWUpID0+IHsKICAgICAgICBjb25zdCByZXMgPSB0byA9PT0gdm9pZCAwID8gZnJvbSA6IHRvIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUgPyAoZnJvbSBpbnN0YW5jZW9mIGNvZGVnZW5fMS5OYW1lID8gbWVyZ2VOYW1lcyhnZW4sIGZyb20sIHRvKSA6IG1lcmdlVG9OYW1lKGdlbiwgZnJvbSwgdG8pLCB0bykgOiBmcm9tIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUgPyAobWVyZ2VUb05hbWUoZ2VuLCB0bywgZnJvbSksIGZyb20pIDogbWVyZ2VWYWx1ZXMoZnJvbSwgdG8pOwogICAgICAgIHJldHVybiB0b05hbWUgPT09IGNvZGVnZW5fMS5OYW1lICYmICEocmVzIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUpID8gcmVzdWx0VG9OYW1lKGdlbiwgcmVzKSA6IHJlczsKICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLm1lcmdlRXZhbHVhdGVkID0gewogICAgICBwcm9wczogbWFrZU1lcmdlRXZhbHVhdGVkKHsKICAgICAgICBtZXJnZU5hbWVzOiAoZ2VuLCBmcm9tLCB0bykgPT4gZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHt0b30gIT09IHRydWUgJiYgJHtmcm9tfSAhPT0gdW5kZWZpbmVkYCwgKCkgPT4gewogICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtmcm9tfSA9PT0gdHJ1ZWAsICgpID0+IGdlbi5hc3NpZ24odG8sIHRydWUpLCAoKSA9PiBnZW4uYXNzaWduKHRvLCAoMCwgY29kZWdlbl8xLl8pYCR7dG99IHx8IHt9YCkuY29kZSgoMCwgY29kZWdlbl8xLl8pYE9iamVjdC5hc3NpZ24oJHt0b30sICR7ZnJvbX0pYCkpOwogICAgICAgIH0pLAogICAgICAgIG1lcmdlVG9OYW1lOiAoZ2VuLCBmcm9tLCB0bykgPT4gZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHt0b30gIT09IHRydWVgLCAoKSA9PiB7CiAgICAgICAgICBpZiAoZnJvbSA9PT0gdHJ1ZSkgewogICAgICAgICAgICBnZW4uYXNzaWduKHRvLCB0cnVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdlbi5hc3NpZ24odG8sICgwLCBjb2RlZ2VuXzEuXylgJHt0b30gfHwge31gKTsKICAgICAgICAgICAgc2V0RXZhbHVhdGVkKGdlbiwgdG8sIGZyb20pOwogICAgICAgICAgfQogICAgICAgIH0pLAogICAgICAgIG1lcmdlVmFsdWVzOiAoZnJvbSwgdG8pID0+IGZyb20gPT09IHRydWUgPyB0cnVlIDogeyAuLi5mcm9tLCAuLi50byB9LAogICAgICAgIHJlc3VsdFRvTmFtZTogZXZhbHVhdGVkUHJvcHNUb05hbWUKICAgICAgfSksCiAgICAgIGl0ZW1zOiBtYWtlTWVyZ2VFdmFsdWF0ZWQoewogICAgICAgIG1lcmdlTmFtZXM6IChnZW4sIGZyb20sIHRvKSA9PiBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAke3RvfSAhPT0gdHJ1ZSAmJiAke2Zyb219ICE9PSB1bmRlZmluZWRgLCAoKSA9PiBnZW4uYXNzaWduKHRvLCAoMCwgY29kZWdlbl8xLl8pYCR7ZnJvbX0gPT09IHRydWUgPyB0cnVlIDogJHt0b30gPiAke2Zyb219ID8gJHt0b30gOiAke2Zyb219YCkpLAogICAgICAgIG1lcmdlVG9OYW1lOiAoZ2VuLCBmcm9tLCB0bykgPT4gZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHt0b30gIT09IHRydWVgLCAoKSA9PiBnZW4uYXNzaWduKHRvLCBmcm9tID09PSB0cnVlID8gdHJ1ZSA6ICgwLCBjb2RlZ2VuXzEuXylgJHt0b30gPiAke2Zyb219ID8gJHt0b30gOiAke2Zyb219YCkpLAogICAgICAgIG1lcmdlVmFsdWVzOiAoZnJvbSwgdG8pID0+IGZyb20gPT09IHRydWUgPyB0cnVlIDogTWF0aC5tYXgoZnJvbSwgdG8pLAogICAgICAgIHJlc3VsdFRvTmFtZTogKGdlbiwgaXRlbXMpID0+IGdlbi52YXIoIml0ZW1zIiwgaXRlbXMpCiAgICAgIH0pCiAgICB9OwogICAgZnVuY3Rpb24gZXZhbHVhdGVkUHJvcHNUb05hbWUoZ2VuLCBwcykgewogICAgICBpZiAocHMgPT09IHRydWUpCiAgICAgICAgcmV0dXJuIGdlbi52YXIoInByb3BzIiwgdHJ1ZSk7CiAgICAgIGNvbnN0IHByb3BzID0gZ2VuLnZhcigicHJvcHMiLCAoMCwgY29kZWdlbl8xLl8pYHt9YCk7CiAgICAgIGlmIChwcyAhPT0gdm9pZCAwKQogICAgICAgIHNldEV2YWx1YXRlZChnZW4sIHByb3BzLCBwcyk7CiAgICAgIHJldHVybiBwcm9wczsKICAgIH0KICAgIGV4cG9ydHMyLmV2YWx1YXRlZFByb3BzVG9OYW1lID0gZXZhbHVhdGVkUHJvcHNUb05hbWU7CiAgICBmdW5jdGlvbiBzZXRFdmFsdWF0ZWQoZ2VuLCBwcm9wcywgcHMpIHsKICAgICAgT2JqZWN0LmtleXMocHMpLmZvckVhY2goKHApID0+IGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke3Byb3BzfSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkocCl9YCwgdHJ1ZSkpOwogICAgfQogICAgZXhwb3J0czIuc2V0RXZhbHVhdGVkID0gc2V0RXZhbHVhdGVkOwogICAgdmFyIHNuaXBwZXRzID0ge307CiAgICBmdW5jdGlvbiB1c2VGdW5jKGdlbiwgZikgewogICAgICByZXR1cm4gZ2VuLnNjb3BlVmFsdWUoImZ1bmMiLCB7CiAgICAgICAgcmVmOiBmLAogICAgICAgIGNvZGU6IHNuaXBwZXRzW2YuY29kZV0gfHwgKHNuaXBwZXRzW2YuY29kZV0gPSBuZXcgY29kZV8xLl9Db2RlKGYuY29kZSkpCiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudXNlRnVuYyA9IHVzZUZ1bmM7CiAgICB2YXIgVHlwZTsKICAgIChmdW5jdGlvbihUeXBlMikgewogICAgICBUeXBlMltUeXBlMlsiTnVtIl0gPSAwXSA9ICJOdW0iOwogICAgICBUeXBlMltUeXBlMlsiU3RyIl0gPSAxXSA9ICJTdHIiOwogICAgfSkoVHlwZSB8fCAoZXhwb3J0czIuVHlwZSA9IFR5cGUgPSB7fSkpOwogICAgZnVuY3Rpb24gZ2V0RXJyb3JQYXRoKGRhdGFQcm9wLCBkYXRhUHJvcFR5cGUsIGpzUHJvcGVydHlTeW50YXgpIHsKICAgICAgaWYgKGRhdGFQcm9wIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUpIHsKICAgICAgICBjb25zdCBpc051bWJlciA9IGRhdGFQcm9wVHlwZSA9PT0gVHlwZS5OdW07CiAgICAgICAgcmV0dXJuIGpzUHJvcGVydHlTeW50YXggPyBpc051bWJlciA/ICgwLCBjb2RlZ2VuXzEuXylgIlsiICsgJHtkYXRhUHJvcH0gKyAiXSJgIDogKDAsIGNvZGVnZW5fMS5fKWAiWyciICsgJHtkYXRhUHJvcH0gKyAiJ10iYCA6IGlzTnVtYmVyID8gKDAsIGNvZGVnZW5fMS5fKWAiLyIgKyAke2RhdGFQcm9wfWAgOiAoMCwgY29kZWdlbl8xLl8pYCIvIiArICR7ZGF0YVByb3B9LnJlcGxhY2UoL34vZywgIn4wIikucmVwbGFjZSgvXFwvL2csICJ+MSIpYDsKICAgICAgfQogICAgICByZXR1cm4ganNQcm9wZXJ0eVN5bnRheCA/ICgwLCBjb2RlZ2VuXzEuZ2V0UHJvcGVydHkpKGRhdGFQcm9wKS50b1N0cmluZygpIDogIi8iICsgZXNjYXBlSnNvblBvaW50ZXIoZGF0YVByb3ApOwogICAgfQogICAgZXhwb3J0czIuZ2V0RXJyb3JQYXRoID0gZ2V0RXJyb3JQYXRoOwogICAgZnVuY3Rpb24gY2hlY2tTdHJpY3RNb2RlKGl0LCBtc2csIG1vZGUgPSBpdC5vcHRzLnN0cmljdFNjaGVtYSkgewogICAgICBpZiAoIW1vZGUpCiAgICAgICAgcmV0dXJuOwogICAgICBtc2cgPSBgc3RyaWN0IG1vZGU6ICR7bXNnfWA7CiAgICAgIGlmIChtb2RlID09PSB0cnVlKQogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgICBpdC5zZWxmLmxvZ2dlci53YXJuKG1zZyk7CiAgICB9CiAgICBleHBvcnRzMi5jaGVja1N0cmljdE1vZGUgPSBjaGVja1N0cmljdE1vZGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvbmFtZXMuanMKdmFyIHJlcXVpcmVfbmFtZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9uYW1lcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIG5hbWVzID0gewogICAgICAvLyB2YWxpZGF0aW9uIGZ1bmN0aW9uIGFyZ3VtZW50cwogICAgICBkYXRhOiBuZXcgY29kZWdlbl8xLk5hbWUoImRhdGEiKSwKICAgICAgLy8gZGF0YSBwYXNzZWQgdG8gdmFsaWRhdGlvbiBmdW5jdGlvbgogICAgICAvLyBhcmdzIHBhc3NlZCBmcm9tIHJlZmVyZW5jaW5nIHNjaGVtYQogICAgICB2YWxDeHQ6IG5ldyBjb2RlZ2VuXzEuTmFtZSgidmFsQ3h0IiksCiAgICAgIC8vIHZhbGlkYXRpb24vZGF0YSBjb250ZXh0IC0gc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBpdCBpcyBkZXN0cnVjdHVyZWQgdG8gdGhlIG5hbWVzIGJlbG93CiAgICAgIGluc3RhbmNlUGF0aDogbmV3IGNvZGVnZW5fMS5OYW1lKCJpbnN0YW5jZVBhdGgiKSwKICAgICAgcGFyZW50RGF0YTogbmV3IGNvZGVnZW5fMS5OYW1lKCJwYXJlbnREYXRhIiksCiAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogbmV3IGNvZGVnZW5fMS5OYW1lKCJwYXJlbnREYXRhUHJvcGVydHkiKSwKICAgICAgcm9vdERhdGE6IG5ldyBjb2RlZ2VuXzEuTmFtZSgicm9vdERhdGEiKSwKICAgICAgLy8gcm9vdCBkYXRhIC0gc2FtZSBhcyB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIGZpcnN0L3RvcCB2YWxpZGF0aW9uIGZ1bmN0aW9uCiAgICAgIGR5bmFtaWNBbmNob3JzOiBuZXcgY29kZWdlbl8xLk5hbWUoImR5bmFtaWNBbmNob3JzIiksCiAgICAgIC8vIHVzZWQgdG8gc3VwcG9ydCByZWN1cnNpdmVSZWYgYW5kIGR5bmFtaWNSZWYKICAgICAgLy8gZnVuY3Rpb24gc2NvcGVkIHZhcmlhYmxlcwogICAgICB2RXJyb3JzOiBuZXcgY29kZWdlbl8xLk5hbWUoInZFcnJvcnMiKSwKICAgICAgLy8gbnVsbCBvciBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9ycwogICAgICBlcnJvcnM6IG5ldyBjb2RlZ2VuXzEuTmFtZSgiZXJyb3JzIiksCiAgICAgIC8vIGNvdW50ZXIgb2YgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgdGhpczogbmV3IGNvZGVnZW5fMS5OYW1lKCJ0aGlzIiksCiAgICAgIC8vICJnbG9iYWxzIgogICAgICBzZWxmOiBuZXcgY29kZWdlbl8xLk5hbWUoInNlbGYiKSwKICAgICAgc2NvcGU6IG5ldyBjb2RlZ2VuXzEuTmFtZSgic2NvcGUiKSwKICAgICAgLy8gSlREIHNlcmlhbGl6ZS9wYXJzZSBuYW1lIGZvciBKU09OIHN0cmluZyBhbmQgcG9zaXRpb24KICAgICAganNvbjogbmV3IGNvZGVnZW5fMS5OYW1lKCJqc29uIiksCiAgICAgIGpzb25Qb3M6IG5ldyBjb2RlZ2VuXzEuTmFtZSgianNvblBvcyIpLAogICAgICBqc29uTGVuOiBuZXcgY29kZWdlbl8xLk5hbWUoImpzb25MZW4iKSwKICAgICAganNvblBhcnQ6IG5ldyBjb2RlZ2VuXzEuTmFtZSgianNvblBhcnQiKQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBuYW1lczsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9lcnJvcnMuanMKdmFyIHJlcXVpcmVfZXJyb3JzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvZXJyb3JzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5leHRlbmRFcnJvcnMgPSBleHBvcnRzMi5yZXNldEVycm9yc0NvdW50ID0gZXhwb3J0czIucmVwb3J0RXh0cmFFcnJvciA9IGV4cG9ydHMyLnJlcG9ydEVycm9yID0gZXhwb3J0czIua2V5d29yZCREYXRhRXJyb3IgPSBleHBvcnRzMi5rZXl3b3JkRXJyb3IgPSB2b2lkIDA7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgbmFtZXNfMSA9IHJlcXVpcmVfbmFtZXMoKTsKICAgIGV4cG9ydHMyLmtleXdvcmRFcnJvciA9IHsKICAgICAgbWVzc2FnZTogKHsga2V5d29yZCB9KSA9PiAoMCwgY29kZWdlbl8xLnN0cilgbXVzdCBwYXNzICIke2tleXdvcmR9IiBrZXl3b3JkIHZhbGlkYXRpb25gCiAgICB9OwogICAgZXhwb3J0czIua2V5d29yZCREYXRhRXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IGtleXdvcmQsIHNjaGVtYVR5cGUgfSkgPT4gc2NoZW1hVHlwZSA/ICgwLCBjb2RlZ2VuXzEuc3RyKWAiJHtrZXl3b3JkfSIga2V5d29yZCBtdXN0IGJlICR7c2NoZW1hVHlwZX0gKCRkYXRhKWAgOiAoMCwgY29kZWdlbl8xLnN0cilgIiR7a2V5d29yZH0iIGtleXdvcmQgaXMgaW52YWxpZCAoJGRhdGEpYAogICAgfTsKICAgIGZ1bmN0aW9uIHJlcG9ydEVycm9yKGN4dCwgZXJyb3IgPSBleHBvcnRzMi5rZXl3b3JkRXJyb3IsIGVycm9yUGF0aHMsIG92ZXJyaWRlQWxsRXJyb3JzKSB7CiAgICAgIGNvbnN0IHsgaXQgfSA9IGN4dDsKICAgICAgY29uc3QgeyBnZW4sIGNvbXBvc2l0ZVJ1bGUsIGFsbEVycm9ycyB9ID0gaXQ7CiAgICAgIGNvbnN0IGVyck9iaiA9IGVycm9yT2JqZWN0Q29kZShjeHQsIGVycm9yLCBlcnJvclBhdGhzKTsKICAgICAgaWYgKG92ZXJyaWRlQWxsRXJyb3JzICE9PSBudWxsICYmIG92ZXJyaWRlQWxsRXJyb3JzICE9PSB2b2lkIDAgPyBvdmVycmlkZUFsbEVycm9ycyA6IGNvbXBvc2l0ZVJ1bGUgfHwgYWxsRXJyb3JzKSB7CiAgICAgICAgYWRkRXJyb3IoZ2VuLCBlcnJPYmopOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybkVycm9ycyhpdCwgKDAsIGNvZGVnZW5fMS5fKWBbJHtlcnJPYmp9XWApOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5yZXBvcnRFcnJvciA9IHJlcG9ydEVycm9yOwogICAgZnVuY3Rpb24gcmVwb3J0RXh0cmFFcnJvcihjeHQsIGVycm9yID0gZXhwb3J0czIua2V5d29yZEVycm9yLCBlcnJvclBhdGhzKSB7CiAgICAgIGNvbnN0IHsgaXQgfSA9IGN4dDsKICAgICAgY29uc3QgeyBnZW4sIGNvbXBvc2l0ZVJ1bGUsIGFsbEVycm9ycyB9ID0gaXQ7CiAgICAgIGNvbnN0IGVyck9iaiA9IGVycm9yT2JqZWN0Q29kZShjeHQsIGVycm9yLCBlcnJvclBhdGhzKTsKICAgICAgYWRkRXJyb3IoZ2VuLCBlcnJPYmopOwogICAgICBpZiAoIShjb21wb3NpdGVSdWxlIHx8IGFsbEVycm9ycykpIHsKICAgICAgICByZXR1cm5FcnJvcnMoaXQsIG5hbWVzXzEuZGVmYXVsdC52RXJyb3JzKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIucmVwb3J0RXh0cmFFcnJvciA9IHJlcG9ydEV4dHJhRXJyb3I7CiAgICBmdW5jdGlvbiByZXNldEVycm9yc0NvdW50KGdlbiwgZXJyc0NvdW50KSB7CiAgICAgIGdlbi5hc3NpZ24obmFtZXNfMS5kZWZhdWx0LmVycm9ycywgZXJyc0NvdW50KTsKICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudkVycm9yc30gIT09IG51bGxgLCAoKSA9PiBnZW4uaWYoZXJyc0NvdW50LCAoKSA9PiBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudkVycm9yc30ubGVuZ3RoYCwgZXJyc0NvdW50KSwgKCkgPT4gZ2VuLmFzc2lnbihuYW1lc18xLmRlZmF1bHQudkVycm9ycywgbnVsbCkpKTsKICAgIH0KICAgIGV4cG9ydHMyLnJlc2V0RXJyb3JzQ291bnQgPSByZXNldEVycm9yc0NvdW50OwogICAgZnVuY3Rpb24gZXh0ZW5kRXJyb3JzKHsgZ2VuLCBrZXl3b3JkLCBzY2hlbWFWYWx1ZSwgZGF0YSwgZXJyc0NvdW50LCBpdCB9KSB7CiAgICAgIGlmIChlcnJzQ291bnQgPT09IHZvaWQgMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvciIpOwogICAgICBjb25zdCBlcnIgPSBnZW4ubmFtZSgiZXJyIik7CiAgICAgIGdlbi5mb3JSYW5nZSgiaSIsIGVycnNDb3VudCwgbmFtZXNfMS5kZWZhdWx0LmVycm9ycywgKGkpID0+IHsKICAgICAgICBnZW4uY29uc3QoZXJyLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9WyR7aX1dYCk7CiAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtlcnJ9Lmluc3RhbmNlUGF0aCA9PT0gdW5kZWZpbmVkYCwgKCkgPT4gZ2VuLmFzc2lnbigoMCwgY29kZWdlbl8xLl8pYCR7ZXJyfS5pbnN0YW5jZVBhdGhgLCAoMCwgY29kZWdlbl8xLnN0ckNvbmNhdCkobmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgaXQuZXJyb3JQYXRoKSkpOwogICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke2Vycn0uc2NoZW1hUGF0aGAsICgwLCBjb2RlZ2VuXzEuc3RyKWAke2l0LmVyclNjaGVtYVBhdGh9LyR7a2V5d29yZH1gKTsKICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7CiAgICAgICAgICBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHtlcnJ9LnNjaGVtYWAsIHNjaGVtYVZhbHVlKTsKICAgICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke2Vycn0uZGF0YWAsIGRhdGEpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5leHRlbmRFcnJvcnMgPSBleHRlbmRFcnJvcnM7CiAgICBmdW5jdGlvbiBhZGRFcnJvcihnZW4sIGVyck9iaikgewogICAgICBjb25zdCBlcnIgPSBnZW4uY29uc3QoImVyciIsIGVyck9iaik7CiAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsYCwgKCkgPT4gZ2VuLmFzc2lnbihuYW1lc18xLmRlZmF1bHQudkVycm9ycywgKDAsIGNvZGVnZW5fMS5fKWBbJHtlcnJ9XWApLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9LnB1c2goJHtlcnJ9KWApOwogICAgICBnZW4uY29kZSgoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LmVycm9yc30rK2ApOwogICAgfQogICAgZnVuY3Rpb24gcmV0dXJuRXJyb3JzKGl0LCBlcnJzKSB7CiAgICAgIGNvbnN0IHsgZ2VuLCB2YWxpZGF0ZU5hbWUsIHNjaGVtYUVudiB9ID0gaXQ7CiAgICAgIGlmIChzY2hlbWFFbnYuJGFzeW5jKSB7CiAgICAgICAgZ2VuLnRocm93KCgwLCBjb2RlZ2VuXzEuXylgbmV3ICR7aXQuVmFsaWRhdGlvbkVycm9yfSgke2VycnN9KWApOwogICAgICB9IGVsc2UgewogICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke3ZhbGlkYXRlTmFtZX0uZXJyb3JzYCwgZXJycyk7CiAgICAgICAgZ2VuLnJldHVybihmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBFID0gewogICAgICBrZXl3b3JkOiBuZXcgY29kZWdlbl8xLk5hbWUoImtleXdvcmQiKSwKICAgICAgc2NoZW1hUGF0aDogbmV3IGNvZGVnZW5fMS5OYW1lKCJzY2hlbWFQYXRoIiksCiAgICAgIC8vIGFsc28gdXNlZCBpbiBKVEQgZXJyb3JzCiAgICAgIHBhcmFtczogbmV3IGNvZGVnZW5fMS5OYW1lKCJwYXJhbXMiKSwKICAgICAgcHJvcGVydHlOYW1lOiBuZXcgY29kZWdlbl8xLk5hbWUoInByb3BlcnR5TmFtZSIpLAogICAgICBtZXNzYWdlOiBuZXcgY29kZWdlbl8xLk5hbWUoIm1lc3NhZ2UiKSwKICAgICAgc2NoZW1hOiBuZXcgY29kZWdlbl8xLk5hbWUoInNjaGVtYSIpLAogICAgICBwYXJlbnRTY2hlbWE6IG5ldyBjb2RlZ2VuXzEuTmFtZSgicGFyZW50U2NoZW1hIikKICAgIH07CiAgICBmdW5jdGlvbiBlcnJvck9iamVjdENvZGUoY3h0LCBlcnJvciwgZXJyb3JQYXRocykgewogICAgICBjb25zdCB7IGNyZWF0ZUVycm9ycyB9ID0gY3h0Lml0OwogICAgICBpZiAoY3JlYXRlRXJyb3JzID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWB7fWA7CiAgICAgIHJldHVybiBlcnJvck9iamVjdChjeHQsIGVycm9yLCBlcnJvclBhdGhzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVycm9yT2JqZWN0KGN4dCwgZXJyb3IsIGVycm9yUGF0aHMgPSB7fSkgewogICAgICBjb25zdCB7IGdlbiwgaXQgfSA9IGN4dDsKICAgICAgY29uc3Qga2V5VmFsdWVzID0gWwogICAgICAgIGVycm9ySW5zdGFuY2VQYXRoKGl0LCBlcnJvclBhdGhzKSwKICAgICAgICBlcnJvclNjaGVtYVBhdGgoY3h0LCBlcnJvclBhdGhzKQogICAgICBdOwogICAgICBleHRyYUVycm9yUHJvcHMoY3h0LCBlcnJvciwga2V5VmFsdWVzKTsKICAgICAgcmV0dXJuIGdlbi5vYmplY3QoLi4ua2V5VmFsdWVzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVycm9ySW5zdGFuY2VQYXRoKHsgZXJyb3JQYXRoIH0sIHsgaW5zdGFuY2VQYXRoIH0pIHsKICAgICAgY29uc3QgaW5zdFBhdGggPSBpbnN0YW5jZVBhdGggPyAoMCwgY29kZWdlbl8xLnN0cilgJHtlcnJvclBhdGh9JHsoMCwgdXRpbF8xLmdldEVycm9yUGF0aCkoaW5zdGFuY2VQYXRoLCB1dGlsXzEuVHlwZS5TdHIpfWAgOiBlcnJvclBhdGg7CiAgICAgIHJldHVybiBbbmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgKDAsIGNvZGVnZW5fMS5zdHJDb25jYXQpKG5hbWVzXzEuZGVmYXVsdC5pbnN0YW5jZVBhdGgsIGluc3RQYXRoKV07CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvclNjaGVtYVBhdGgoeyBrZXl3b3JkLCBpdDogeyBlcnJTY2hlbWFQYXRoIH0gfSwgeyBzY2hlbWFQYXRoLCBwYXJlbnRTY2hlbWEgfSkgewogICAgICBsZXQgc2NoUGF0aCA9IHBhcmVudFNjaGVtYSA/IGVyclNjaGVtYVBhdGggOiAoMCwgY29kZWdlbl8xLnN0cilgJHtlcnJTY2hlbWFQYXRofS8ke2tleXdvcmR9YDsKICAgICAgaWYgKHNjaGVtYVBhdGgpIHsKICAgICAgICBzY2hQYXRoID0gKDAsIGNvZGVnZW5fMS5zdHIpYCR7c2NoUGF0aH0keygwLCB1dGlsXzEuZ2V0RXJyb3JQYXRoKShzY2hlbWFQYXRoLCB1dGlsXzEuVHlwZS5TdHIpfWA7CiAgICAgIH0KICAgICAgcmV0dXJuIFtFLnNjaGVtYVBhdGgsIHNjaFBhdGhdOwogICAgfQogICAgZnVuY3Rpb24gZXh0cmFFcnJvclByb3BzKGN4dCwgeyBwYXJhbXMsIG1lc3NhZ2UgfSwga2V5VmFsdWVzKSB7CiAgICAgIGNvbnN0IHsga2V5d29yZCwgZGF0YSwgc2NoZW1hVmFsdWUsIGl0IH0gPSBjeHQ7CiAgICAgIGNvbnN0IHsgb3B0cywgcHJvcGVydHlOYW1lLCB0b3BTY2hlbWFSZWYsIHNjaGVtYVBhdGggfSA9IGl0OwogICAgICBrZXlWYWx1ZXMucHVzaChbRS5rZXl3b3JkLCBrZXl3b3JkXSwgW0UucGFyYW1zLCB0eXBlb2YgcGFyYW1zID09ICJmdW5jdGlvbiIgPyBwYXJhbXMoY3h0KSA6IHBhcmFtcyB8fCAoMCwgY29kZWdlbl8xLl8pYHt9YF0pOwogICAgICBpZiAob3B0cy5tZXNzYWdlcykgewogICAgICAgIGtleVZhbHVlcy5wdXNoKFtFLm1lc3NhZ2UsIHR5cGVvZiBtZXNzYWdlID09ICJmdW5jdGlvbiIgPyBtZXNzYWdlKGN4dCkgOiBtZXNzYWdlXSk7CiAgICAgIH0KICAgICAgaWYgKG9wdHMudmVyYm9zZSkgewogICAgICAgIGtleVZhbHVlcy5wdXNoKFtFLnNjaGVtYSwgc2NoZW1hVmFsdWVdLCBbRS5wYXJlbnRTY2hlbWEsICgwLCBjb2RlZ2VuXzEuXylgJHt0b3BTY2hlbWFSZWZ9JHtzY2hlbWFQYXRofWBdLCBbbmFtZXNfMS5kZWZhdWx0LmRhdGEsIGRhdGFdKTsKICAgICAgfQogICAgICBpZiAocHJvcGVydHlOYW1lKQogICAgICAgIGtleVZhbHVlcy5wdXNoKFtFLnByb3BlcnR5TmFtZSwgcHJvcGVydHlOYW1lXSk7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvYm9vbFNjaGVtYS5qcwp2YXIgcmVxdWlyZV9ib29sU2NoZW1hID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvYm9vbFNjaGVtYS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYm9vbE9yRW1wdHlTY2hlbWEgPSBleHBvcnRzMi50b3BCb29sT3JFbXB0eVNjaGVtYSA9IHZvaWQgMDsKICAgIHZhciBlcnJvcnNfMSA9IHJlcXVpcmVfZXJyb3JzKCk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgbmFtZXNfMSA9IHJlcXVpcmVfbmFtZXMoKTsKICAgIHZhciBib29sRXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICJib29sZWFuIHNjaGVtYSBpcyBmYWxzZSIKICAgIH07CiAgICBmdW5jdGlvbiB0b3BCb29sT3JFbXB0eVNjaGVtYShpdCkgewogICAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCB2YWxpZGF0ZU5hbWUgfSA9IGl0OwogICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkgewogICAgICAgIGZhbHNlU2NoZW1hRXJyb3IoaXQsIGZhbHNlKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiICYmIHNjaGVtYS4kYXN5bmMgPT09IHRydWUpIHsKICAgICAgICBnZW4ucmV0dXJuKG5hbWVzXzEuZGVmYXVsdC5kYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHt2YWxpZGF0ZU5hbWV9LmVycm9yc2AsIG51bGwpOwogICAgICAgIGdlbi5yZXR1cm4odHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMyLnRvcEJvb2xPckVtcHR5U2NoZW1hID0gdG9wQm9vbE9yRW1wdHlTY2hlbWE7CiAgICBmdW5jdGlvbiBib29sT3JFbXB0eVNjaGVtYShpdCwgdmFsaWQpIHsKICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYSB9ID0gaXQ7CiAgICAgIGlmIChzY2hlbWEgPT09IGZhbHNlKSB7CiAgICAgICAgZ2VuLnZhcih2YWxpZCwgZmFsc2UpOwogICAgICAgIGZhbHNlU2NoZW1hRXJyb3IoaXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGdlbi52YXIodmFsaWQsIHRydWUpOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5ib29sT3JFbXB0eVNjaGVtYSA9IGJvb2xPckVtcHR5U2NoZW1hOwogICAgZnVuY3Rpb24gZmFsc2VTY2hlbWFFcnJvcihpdCwgb3ZlcnJpZGVBbGxFcnJvcnMpIHsKICAgICAgY29uc3QgeyBnZW4sIGRhdGEgfSA9IGl0OwogICAgICBjb25zdCBjeHQgPSB7CiAgICAgICAgZ2VuLAogICAgICAgIGtleXdvcmQ6ICJmYWxzZSBzY2hlbWEiLAogICAgICAgIGRhdGEsCiAgICAgICAgc2NoZW1hOiBmYWxzZSwKICAgICAgICBzY2hlbWFDb2RlOiBmYWxzZSwKICAgICAgICBzY2hlbWFWYWx1ZTogZmFsc2UsCiAgICAgICAgcGFyYW1zOiB7fSwKICAgICAgICBpdAogICAgICB9OwogICAgICAoMCwgZXJyb3JzXzEucmVwb3J0RXJyb3IpKGN4dCwgYm9vbEVycm9yLCB2b2lkIDAsIG92ZXJyaWRlQWxsRXJyb3JzKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS9ydWxlcy5qcwp2YXIgcmVxdWlyZV9ydWxlcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL3J1bGVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5nZXRSdWxlcyA9IGV4cG9ydHMyLmlzSlNPTlR5cGUgPSB2b2lkIDA7CiAgICB2YXIgX2pzb25UeXBlcyA9IFsic3RyaW5nIiwgIm51bWJlciIsICJpbnRlZ2VyIiwgImJvb2xlYW4iLCAibnVsbCIsICJvYmplY3QiLCAiYXJyYXkiXTsKICAgIHZhciBqc29uVHlwZXMgPSBuZXcgU2V0KF9qc29uVHlwZXMpOwogICAgZnVuY3Rpb24gaXNKU09OVHlwZSh4KSB7CiAgICAgIHJldHVybiB0eXBlb2YgeCA9PSAic3RyaW5nIiAmJiBqc29uVHlwZXMuaGFzKHgpOwogICAgfQogICAgZXhwb3J0czIuaXNKU09OVHlwZSA9IGlzSlNPTlR5cGU7CiAgICBmdW5jdGlvbiBnZXRSdWxlcygpIHsKICAgICAgY29uc3QgZ3JvdXBzID0gewogICAgICAgIG51bWJlcjogeyB0eXBlOiAibnVtYmVyIiwgcnVsZXM6IFtdIH0sCiAgICAgICAgc3RyaW5nOiB7IHR5cGU6ICJzdHJpbmciLCBydWxlczogW10gfSwKICAgICAgICBhcnJheTogeyB0eXBlOiAiYXJyYXkiLCBydWxlczogW10gfSwKICAgICAgICBvYmplY3Q6IHsgdHlwZTogIm9iamVjdCIsIHJ1bGVzOiBbXSB9CiAgICAgIH07CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZXM6IHsgLi4uZ3JvdXBzLCBpbnRlZ2VyOiB0cnVlLCBib29sZWFuOiB0cnVlLCBudWxsOiB0cnVlIH0sCiAgICAgICAgcnVsZXM6IFt7IHJ1bGVzOiBbXSB9LCBncm91cHMubnVtYmVyLCBncm91cHMuc3RyaW5nLCBncm91cHMuYXJyYXksIGdyb3Vwcy5vYmplY3RdLAogICAgICAgIHBvc3Q6IHsgcnVsZXM6IFtdIH0sCiAgICAgICAgYWxsOiB7fSwKICAgICAgICBrZXl3b3Jkczoge30KICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLmdldFJ1bGVzID0gZ2V0UnVsZXM7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvYXBwbGljYWJpbGl0eS5qcwp2YXIgcmVxdWlyZV9hcHBsaWNhYmlsaXR5ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvYXBwbGljYWJpbGl0eS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2hvdWxkVXNlUnVsZSA9IGV4cG9ydHMyLnNob3VsZFVzZUdyb3VwID0gZXhwb3J0czIuc2NoZW1hSGFzUnVsZXNGb3JUeXBlID0gdm9pZCAwOwogICAgZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXNGb3JUeXBlKHsgc2NoZW1hLCBzZWxmOiBzZWxmMiB9LCB0eXBlKSB7CiAgICAgIGNvbnN0IGdyb3VwID0gc2VsZjIuUlVMRVMudHlwZXNbdHlwZV07CiAgICAgIHJldHVybiBncm91cCAmJiBncm91cCAhPT0gdHJ1ZSAmJiBzaG91bGRVc2VHcm91cChzY2hlbWEsIGdyb3VwKTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVtYUhhc1J1bGVzRm9yVHlwZSA9IHNjaGVtYUhhc1J1bGVzRm9yVHlwZTsKICAgIGZ1bmN0aW9uIHNob3VsZFVzZUdyb3VwKHNjaGVtYSwgZ3JvdXApIHsKICAgICAgcmV0dXJuIGdyb3VwLnJ1bGVzLnNvbWUoKHJ1bGUpID0+IHNob3VsZFVzZVJ1bGUoc2NoZW1hLCBydWxlKSk7CiAgICB9CiAgICBleHBvcnRzMi5zaG91bGRVc2VHcm91cCA9IHNob3VsZFVzZUdyb3VwOwogICAgZnVuY3Rpb24gc2hvdWxkVXNlUnVsZShzY2hlbWEsIHJ1bGUpIHsKICAgICAgdmFyIF9hOwogICAgICByZXR1cm4gc2NoZW1hW3J1bGUua2V5d29yZF0gIT09IHZvaWQgMCB8fCAoKF9hID0gcnVsZS5kZWZpbml0aW9uLmltcGxlbWVudHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zb21lKChrd2QpID0+IHNjaGVtYVtrd2RdICE9PSB2b2lkIDApKTsKICAgIH0KICAgIGV4cG9ydHMyLnNob3VsZFVzZVJ1bGUgPSBzaG91bGRVc2VSdWxlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL3ZhbGlkYXRlL2RhdGFUeXBlLmpzCnZhciByZXF1aXJlX2RhdGFUeXBlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvZGF0YVR5cGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnJlcG9ydFR5cGVFcnJvciA9IGV4cG9ydHMyLmNoZWNrRGF0YVR5cGVzID0gZXhwb3J0czIuY2hlY2tEYXRhVHlwZSA9IGV4cG9ydHMyLmNvZXJjZUFuZENoZWNrRGF0YVR5cGUgPSBleHBvcnRzMi5nZXRKU09OVHlwZXMgPSBleHBvcnRzMi5nZXRTY2hlbWFUeXBlcyA9IGV4cG9ydHMyLkRhdGFUeXBlID0gdm9pZCAwOwogICAgdmFyIHJ1bGVzXzEgPSByZXF1aXJlX3J1bGVzKCk7CiAgICB2YXIgYXBwbGljYWJpbGl0eV8xID0gcmVxdWlyZV9hcHBsaWNhYmlsaXR5KCk7CiAgICB2YXIgZXJyb3JzXzEgPSByZXF1aXJlX2Vycm9ycygpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIERhdGFUeXBlOwogICAgKGZ1bmN0aW9uKERhdGFUeXBlMikgewogICAgICBEYXRhVHlwZTJbRGF0YVR5cGUyWyJDb3JyZWN0Il0gPSAwXSA9ICJDb3JyZWN0IjsKICAgICAgRGF0YVR5cGUyW0RhdGFUeXBlMlsiV3JvbmciXSA9IDFdID0gIldyb25nIjsKICAgIH0pKERhdGFUeXBlIHx8IChleHBvcnRzMi5EYXRhVHlwZSA9IERhdGFUeXBlID0ge30pKTsKICAgIGZ1bmN0aW9uIGdldFNjaGVtYVR5cGVzKHNjaGVtYSkgewogICAgICBjb25zdCB0eXBlcyA9IGdldEpTT05UeXBlcyhzY2hlbWEudHlwZSk7CiAgICAgIGNvbnN0IGhhc051bGwgPSB0eXBlcy5pbmNsdWRlcygibnVsbCIpOwogICAgICBpZiAoaGFzTnVsbCkgewogICAgICAgIGlmIChzY2hlbWEubnVsbGFibGUgPT09IGZhbHNlKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0eXBlOiBudWxsIGNvbnRyYWRpY3RzIG51bGxhYmxlOiBmYWxzZSIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghdHlwZXMubGVuZ3RoICYmIHNjaGVtYS5udWxsYWJsZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyJudWxsYWJsZSIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCAidHlwZSInKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtYS5udWxsYWJsZSA9PT0gdHJ1ZSkKICAgICAgICAgIHR5cGVzLnB1c2goIm51bGwiKTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZXM7CiAgICB9CiAgICBleHBvcnRzMi5nZXRTY2hlbWFUeXBlcyA9IGdldFNjaGVtYVR5cGVzOwogICAgZnVuY3Rpb24gZ2V0SlNPTlR5cGVzKHRzKSB7CiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheSh0cykgPyB0cyA6IHRzID8gW3RzXSA6IFtdOwogICAgICBpZiAodHlwZXMuZXZlcnkocnVsZXNfMS5pc0pTT05UeXBlKSkKICAgICAgICByZXR1cm4gdHlwZXM7CiAgICAgIHRocm93IG5ldyBFcnJvcigidHlwZSBtdXN0IGJlIEpTT05UeXBlIG9yIEpTT05UeXBlW106ICIgKyB0eXBlcy5qb2luKCIsIikpOwogICAgfQogICAgZXhwb3J0czIuZ2V0SlNPTlR5cGVzID0gZ2V0SlNPTlR5cGVzOwogICAgZnVuY3Rpb24gY29lcmNlQW5kQ2hlY2tEYXRhVHlwZShpdCwgdHlwZXMpIHsKICAgICAgY29uc3QgeyBnZW4sIGRhdGEsIG9wdHMgfSA9IGl0OwogICAgICBjb25zdCBjb2VyY2VUbyA9IGNvZXJjZVRvVHlwZXModHlwZXMsIG9wdHMuY29lcmNlVHlwZXMpOwogICAgICBjb25zdCBjaGVja1R5cGVzID0gdHlwZXMubGVuZ3RoID4gMCAmJiAhKGNvZXJjZVRvLmxlbmd0aCA9PT0gMCAmJiB0eXBlcy5sZW5ndGggPT09IDEgJiYgKDAsIGFwcGxpY2FiaWxpdHlfMS5zY2hlbWFIYXNSdWxlc0ZvclR5cGUpKGl0LCB0eXBlc1swXSkpOwogICAgICBpZiAoY2hlY2tUeXBlcykgewogICAgICAgIGNvbnN0IHdyb25nVHlwZSA9IGNoZWNrRGF0YVR5cGVzKHR5cGVzLCBkYXRhLCBvcHRzLnN0cmljdE51bWJlcnMsIERhdGFUeXBlLldyb25nKTsKICAgICAgICBnZW4uaWYod3JvbmdUeXBlLCAoKSA9PiB7CiAgICAgICAgICBpZiAoY29lcmNlVG8ubGVuZ3RoKQogICAgICAgICAgICBjb2VyY2VEYXRhKGl0LCB0eXBlcywgY29lcmNlVG8pOwogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXBvcnRUeXBlRXJyb3IoaXQpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBjaGVja1R5cGVzOwogICAgfQogICAgZXhwb3J0czIuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSA9IGNvZXJjZUFuZENoZWNrRGF0YVR5cGU7CiAgICB2YXIgQ09FUkNJQkxFID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWyJzdHJpbmciLCAibnVtYmVyIiwgImludGVnZXIiLCAiYm9vbGVhbiIsICJudWxsIl0pOwogICAgZnVuY3Rpb24gY29lcmNlVG9UeXBlcyh0eXBlcywgY29lcmNlVHlwZXMpIHsKICAgICAgcmV0dXJuIGNvZXJjZVR5cGVzID8gdHlwZXMuZmlsdGVyKCh0KSA9PiBDT0VSQ0lCTEUuaGFzKHQpIHx8IGNvZXJjZVR5cGVzID09PSAiYXJyYXkiICYmIHQgPT09ICJhcnJheSIpIDogW107CiAgICB9CiAgICBmdW5jdGlvbiBjb2VyY2VEYXRhKGl0LCB0eXBlcywgY29lcmNlVG8pIHsKICAgICAgY29uc3QgeyBnZW4sIGRhdGEsIG9wdHMgfSA9IGl0OwogICAgICBjb25zdCBkYXRhVHlwZSA9IGdlbi5sZXQoImRhdGFUeXBlIiwgKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtkYXRhfWApOwogICAgICBjb25zdCBjb2VyY2VkID0gZ2VuLmxldCgiY29lcmNlZCIsICgwLCBjb2RlZ2VuXzEuXylgdW5kZWZpbmVkYCk7CiAgICAgIGlmIChvcHRzLmNvZXJjZVR5cGVzID09PSAiYXJyYXkiKSB7CiAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhVHlwZX0gPT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheSgke2RhdGF9KSAmJiAke2RhdGF9Lmxlbmd0aCA9PSAxYCwgKCkgPT4gZ2VuLmFzc2lnbihkYXRhLCAoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX1bMF1gKS5hc3NpZ24oZGF0YVR5cGUsICgwLCBjb2RlZ2VuXzEuXylgdHlwZW9mICR7ZGF0YX1gKS5pZihjaGVja0RhdGFUeXBlcyh0eXBlcywgZGF0YSwgb3B0cy5zdHJpY3ROdW1iZXJzKSwgKCkgPT4gZ2VuLmFzc2lnbihjb2VyY2VkLCBkYXRhKSkpOwogICAgICB9CiAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7Y29lcmNlZH0gIT09IHVuZGVmaW5lZGApOwogICAgICBmb3IgKGNvbnN0IHQgb2YgY29lcmNlVG8pIHsKICAgICAgICBpZiAoQ09FUkNJQkxFLmhhcyh0KSB8fCB0ID09PSAiYXJyYXkiICYmIG9wdHMuY29lcmNlVHlwZXMgPT09ICJhcnJheSIpIHsKICAgICAgICAgIGNvZXJjZVNwZWNpZmljVHlwZSh0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2VuLmVsc2UoKTsKICAgICAgcmVwb3J0VHlwZUVycm9yKGl0KTsKICAgICAgZ2VuLmVuZElmKCk7CiAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7Y29lcmNlZH0gIT09IHVuZGVmaW5lZGAsICgpID0+IHsKICAgICAgICBnZW4uYXNzaWduKGRhdGEsIGNvZXJjZWQpOwogICAgICAgIGFzc2lnblBhcmVudERhdGEoaXQsIGNvZXJjZWQpOwogICAgICB9KTsKICAgICAgZnVuY3Rpb24gY29lcmNlU3BlY2lmaWNUeXBlKHQpIHsKICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgIGdlbi5lbHNlSWYoKDAsIGNvZGVnZW5fMS5fKWAke2RhdGFUeXBlfSA9PSAibnVtYmVyIiB8fCAke2RhdGFUeXBlfSA9PSAiYm9vbGVhbiJgKS5hc3NpZ24oY29lcmNlZCwgKDAsIGNvZGVnZW5fMS5fKWAiIiArICR7ZGF0YX1gKS5lbHNlSWYoKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9ID09PSBudWxsYCkuYXNzaWduKGNvZXJjZWQsICgwLCBjb2RlZ2VuXzEuXylgIiJgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgICAgZ2VuLmVsc2VJZigoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YVR5cGV9ID09ICJib29sZWFuIiB8fCAke2RhdGF9ID09PSBudWxsCiAgICAgICAgICAgICAgfHwgKCR7ZGF0YVR5cGV9ID09ICJzdHJpbmciICYmICR7ZGF0YX0gJiYgJHtkYXRhfSA9PSArJHtkYXRhfSlgKS5hc3NpZ24oY29lcmNlZCwgKDAsIGNvZGVnZW5fMS5fKWArJHtkYXRhfWApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlICJpbnRlZ2VyIjoKICAgICAgICAgICAgZ2VuLmVsc2VJZigoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YVR5cGV9ID09PSAiYm9vbGVhbiIgfHwgJHtkYXRhfSA9PT0gbnVsbAogICAgICAgICAgICAgIHx8ICgke2RhdGFUeXBlfSA9PT0gInN0cmluZyIgJiYgJHtkYXRhfSAmJiAke2RhdGF9ID09ICske2RhdGF9ICYmICEoJHtkYXRhfSAlIDEpKWApLmFzc2lnbihjb2VyY2VkLCAoMCwgY29kZWdlbl8xLl8pYCske2RhdGF9YCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICBnZW4uZWxzZUlmKCgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfSA9PT0gImZhbHNlIiB8fCAke2RhdGF9ID09PSAwIHx8ICR7ZGF0YX0gPT09IG51bGxgKS5hc3NpZ24oY29lcmNlZCwgZmFsc2UpLmVsc2VJZigoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0gPT09ICJ0cnVlIiB8fCAke2RhdGF9ID09PSAxYCkuYXNzaWduKGNvZXJjZWQsIHRydWUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlICJudWxsIjoKICAgICAgICAgICAgZ2VuLmVsc2VJZigoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0gPT09ICIiIHx8ICR7ZGF0YX0gPT09IDAgfHwgJHtkYXRhfSA9PT0gZmFsc2VgKTsKICAgICAgICAgICAgZ2VuLmFzc2lnbihjb2VyY2VkLCBudWxsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgICBnZW4uZWxzZUlmKCgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhVHlwZX0gPT09ICJzdHJpbmciIHx8ICR7ZGF0YVR5cGV9ID09PSAibnVtYmVyIgogICAgICAgICAgICAgIHx8ICR7ZGF0YVR5cGV9ID09PSAiYm9vbGVhbiIgfHwgJHtkYXRhfSA9PT0gbnVsbGApLmFzc2lnbihjb2VyY2VkLCAoMCwgY29kZWdlbl8xLl8pYFske2RhdGF9XWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXNzaWduUGFyZW50RGF0YSh7IGdlbiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5IH0sIGV4cHIpIHsKICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtwYXJlbnREYXRhfSAhPT0gdW5kZWZpbmVkYCwgKCkgPT4gZ2VuLmFzc2lnbigoMCwgY29kZWdlbl8xLl8pYCR7cGFyZW50RGF0YX1bJHtwYXJlbnREYXRhUHJvcGVydHl9XWAsIGV4cHIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGUsIGRhdGEsIHN0cmljdE51bXMsIGNvcnJlY3QgPSBEYXRhVHlwZS5Db3JyZWN0KSB7CiAgICAgIGNvbnN0IEVRID0gY29ycmVjdCA9PT0gRGF0YVR5cGUuQ29ycmVjdCA/IGNvZGVnZW5fMS5vcGVyYXRvcnMuRVEgOiBjb2RlZ2VuXzEub3BlcmF0b3JzLk5FUTsKICAgICAgbGV0IGNvbmQ7CiAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKICAgICAgICBjYXNlICJudWxsIjoKICAgICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0gJHtFUX0gbnVsbGA7CiAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgY29uZCA9ICgwLCBjb2RlZ2VuXzEuXylgQXJyYXkuaXNBcnJheSgke2RhdGF9KWA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJvYmplY3QiOgogICAgICAgICAgY29uZCA9ICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfSAmJiB0eXBlb2YgJHtkYXRhfSA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSgke2RhdGF9KWA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJpbnRlZ2VyIjoKICAgICAgICAgIGNvbmQgPSBudW1Db25kKCgwLCBjb2RlZ2VuXzEuXylgISgke2RhdGF9ICUgMSkgJiYgIWlzTmFOKCR7ZGF0YX0pYCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgY29uZCA9IG51bUNvbmQoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtkYXRhfSAke0VRfSAke2RhdGFUeXBlfWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvcnJlY3QgPT09IERhdGFUeXBlLkNvcnJlY3QgPyBjb25kIDogKDAsIGNvZGVnZW5fMS5ub3QpKGNvbmQpOwogICAgICBmdW5jdGlvbiBudW1Db25kKF9jb25kID0gY29kZWdlbl8xLm5pbCkgewogICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLmFuZCkoKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtkYXRhfSA9PSAibnVtYmVyImAsIF9jb25kLCBzdHJpY3ROdW1zID8gKDAsIGNvZGVnZW5fMS5fKWBpc0Zpbml0ZSgke2RhdGF9KWAgOiBjb2RlZ2VuXzEubmlsKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuY2hlY2tEYXRhVHlwZSA9IGNoZWNrRGF0YVR5cGU7CiAgICBmdW5jdGlvbiBjaGVja0RhdGFUeXBlcyhkYXRhVHlwZXMsIGRhdGEsIHN0cmljdE51bXMsIGNvcnJlY3QpIHsKICAgICAgaWYgKGRhdGFUeXBlcy5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gY2hlY2tEYXRhVHlwZShkYXRhVHlwZXNbMF0sIGRhdGEsIHN0cmljdE51bXMsIGNvcnJlY3QpOwogICAgICB9CiAgICAgIGxldCBjb25kOwogICAgICBjb25zdCB0eXBlcyA9ICgwLCB1dGlsXzEudG9IYXNoKShkYXRhVHlwZXMpOwogICAgICBpZiAodHlwZXMuYXJyYXkgJiYgdHlwZXMub2JqZWN0KSB7CiAgICAgICAgY29uc3Qgbm90T2JqID0gKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtkYXRhfSAhPSAib2JqZWN0ImA7CiAgICAgICAgY29uZCA9IHR5cGVzLm51bGwgPyBub3RPYmogOiAoMCwgY29kZWdlbl8xLl8pYCEke2RhdGF9IHx8ICR7bm90T2JqfWA7CiAgICAgICAgZGVsZXRlIHR5cGVzLm51bGw7CiAgICAgICAgZGVsZXRlIHR5cGVzLmFycmF5OwogICAgICAgIGRlbGV0ZSB0eXBlcy5vYmplY3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uZCA9IGNvZGVnZW5fMS5uaWw7CiAgICAgIH0KICAgICAgaWYgKHR5cGVzLm51bWJlcikKICAgICAgICBkZWxldGUgdHlwZXMuaW50ZWdlcjsKICAgICAgZm9yIChjb25zdCB0IGluIHR5cGVzKQogICAgICAgIGNvbmQgPSAoMCwgY29kZWdlbl8xLmFuZCkoY29uZCwgY2hlY2tEYXRhVHlwZSh0LCBkYXRhLCBzdHJpY3ROdW1zLCBjb3JyZWN0KSk7CiAgICAgIHJldHVybiBjb25kOwogICAgfQogICAgZXhwb3J0czIuY2hlY2tEYXRhVHlwZXMgPSBjaGVja0RhdGFUeXBlczsKICAgIHZhciB0eXBlRXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IHNjaGVtYSB9KSA9PiBgbXVzdCBiZSAke3NjaGVtYX1gLAogICAgICBwYXJhbXM6ICh7IHNjaGVtYSwgc2NoZW1hVmFsdWUgfSkgPT4gdHlwZW9mIHNjaGVtYSA9PSAic3RyaW5nIiA/ICgwLCBjb2RlZ2VuXzEuXylge3R5cGU6ICR7c2NoZW1hfX1gIDogKDAsIGNvZGVnZW5fMS5fKWB7dHlwZTogJHtzY2hlbWFWYWx1ZX19YAogICAgfTsKICAgIGZ1bmN0aW9uIHJlcG9ydFR5cGVFcnJvcihpdCkgewogICAgICBjb25zdCBjeHQgPSBnZXRUeXBlRXJyb3JDb250ZXh0KGl0KTsKICAgICAgKDAsIGVycm9yc18xLnJlcG9ydEVycm9yKShjeHQsIHR5cGVFcnJvcik7CiAgICB9CiAgICBleHBvcnRzMi5yZXBvcnRUeXBlRXJyb3IgPSByZXBvcnRUeXBlRXJyb3I7CiAgICBmdW5jdGlvbiBnZXRUeXBlRXJyb3JDb250ZXh0KGl0KSB7CiAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCBzY2hlbWEgfSA9IGl0OwogICAgICBjb25zdCBzY2hlbWFDb2RlID0gKDAsIHV0aWxfMS5zY2hlbWFSZWZPclZhbCkoaXQsIHNjaGVtYSwgInR5cGUiKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBnZW4sCiAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgIGRhdGEsCiAgICAgICAgc2NoZW1hOiBzY2hlbWEudHlwZSwKICAgICAgICBzY2hlbWFDb2RlLAogICAgICAgIHNjaGVtYVZhbHVlOiBzY2hlbWFDb2RlLAogICAgICAgIHBhcmVudFNjaGVtYTogc2NoZW1hLAogICAgICAgIHBhcmFtczoge30sCiAgICAgICAgaXQKICAgICAgfTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS92YWxpZGF0ZS9kZWZhdWx0cy5qcwp2YXIgcmVxdWlyZV9kZWZhdWx0cyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL3ZhbGlkYXRlL2RlZmF1bHRzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hc3NpZ25EZWZhdWx0cyA9IHZvaWQgMDsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIGZ1bmN0aW9uIGFzc2lnbkRlZmF1bHRzKGl0LCB0eSkgewogICAgICBjb25zdCB7IHByb3BlcnRpZXMsIGl0ZW1zIH0gPSBpdC5zY2hlbWE7CiAgICAgIGlmICh0eSA9PT0gIm9iamVjdCIgJiYgcHJvcGVydGllcykgewogICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BlcnRpZXMpIHsKICAgICAgICAgIGFzc2lnbkRlZmF1bHQoaXQsIGtleSwgcHJvcGVydGllc1trZXldLmRlZmF1bHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eSA9PT0gImFycmF5IiAmJiBBcnJheS5pc0FycmF5KGl0ZW1zKSkgewogICAgICAgIGl0ZW1zLmZvckVhY2goKHNjaCwgaSkgPT4gYXNzaWduRGVmYXVsdChpdCwgaSwgc2NoLmRlZmF1bHQpKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuYXNzaWduRGVmYXVsdHMgPSBhc3NpZ25EZWZhdWx0czsKICAgIGZ1bmN0aW9uIGFzc2lnbkRlZmF1bHQoaXQsIHByb3AsIGRlZmF1bHRWYWx1ZSkgewogICAgICBjb25zdCB7IGdlbiwgY29tcG9zaXRlUnVsZSwgZGF0YSwgb3B0cyB9ID0gaXQ7CiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZvaWQgMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNoaWxkRGF0YSA9ICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkocHJvcCl9YDsKICAgICAgaWYgKGNvbXBvc2l0ZVJ1bGUpIHsKICAgICAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIGBkZWZhdWx0IGlzIGlnbm9yZWQgZm9yOiAke2NoaWxkRGF0YX1gKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGNvbmRpdGlvbiA9ICgwLCBjb2RlZ2VuXzEuXylgJHtjaGlsZERhdGF9ID09PSB1bmRlZmluZWRgOwogICAgICBpZiAob3B0cy51c2VEZWZhdWx0cyA9PT0gImVtcHR5IikgewogICAgICAgIGNvbmRpdGlvbiA9ICgwLCBjb2RlZ2VuXzEuXylgJHtjb25kaXRpb259IHx8ICR7Y2hpbGREYXRhfSA9PT0gbnVsbCB8fCAke2NoaWxkRGF0YX0gPT09ICIiYDsKICAgICAgfQogICAgICBnZW4uaWYoY29uZGl0aW9uLCAoMCwgY29kZWdlbl8xLl8pYCR7Y2hpbGREYXRhfSA9ICR7KDAsIGNvZGVnZW5fMS5zdHJpbmdpZnkpKGRlZmF1bHRWYWx1ZSl9YCk7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9jb2RlLmpzCnZhciByZXF1aXJlX2NvZGUyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9jb2RlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi52YWxpZGF0ZVVuaW9uID0gZXhwb3J0czIudmFsaWRhdGVBcnJheSA9IGV4cG9ydHMyLnVzZVBhdHRlcm4gPSBleHBvcnRzMi5jYWxsVmFsaWRhdGVDb2RlID0gZXhwb3J0czIuc2NoZW1hUHJvcGVydGllcyA9IGV4cG9ydHMyLmFsbFNjaGVtYVByb3BlcnRpZXMgPSBleHBvcnRzMi5ub1Byb3BlcnR5SW5EYXRhID0gZXhwb3J0czIucHJvcGVydHlJbkRhdGEgPSBleHBvcnRzMi5pc093blByb3BlcnR5ID0gZXhwb3J0czIuaGFzUHJvcEZ1bmMgPSBleHBvcnRzMi5yZXBvcnRNaXNzaW5nUHJvcCA9IGV4cG9ydHMyLmNoZWNrTWlzc2luZ1Byb3AgPSBleHBvcnRzMi5jaGVja1JlcG9ydE1pc3NpbmdQcm9wID0gdm9pZCAwOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIG5hbWVzXzEgPSByZXF1aXJlX25hbWVzKCk7CiAgICB2YXIgdXRpbF8yID0gcmVxdWlyZV91dGlsKCk7CiAgICBmdW5jdGlvbiBjaGVja1JlcG9ydE1pc3NpbmdQcm9wKGN4dCwgcHJvcCkgewogICAgICBjb25zdCB7IGdlbiwgZGF0YSwgaXQgfSA9IGN4dDsKICAgICAgZ2VuLmlmKG5vUHJvcGVydHlJbkRhdGEoZ2VuLCBkYXRhLCBwcm9wLCBpdC5vcHRzLm93blByb3BlcnRpZXMpLCAoKSA9PiB7CiAgICAgICAgY3h0LnNldFBhcmFtcyh7IG1pc3NpbmdQcm9wZXJ0eTogKDAsIGNvZGVnZW5fMS5fKWAke3Byb3B9YCB9LCB0cnVlKTsKICAgICAgICBjeHQuZXJyb3IoKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5jaGVja1JlcG9ydE1pc3NpbmdQcm9wID0gY2hlY2tSZXBvcnRNaXNzaW5nUHJvcDsKICAgIGZ1bmN0aW9uIGNoZWNrTWlzc2luZ1Byb3AoeyBnZW4sIGRhdGEsIGl0OiB7IG9wdHMgfSB9LCBwcm9wZXJ0aWVzLCBtaXNzaW5nKSB7CiAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLm9yKSguLi5wcm9wZXJ0aWVzLm1hcCgocHJvcCkgPT4gKDAsIGNvZGVnZW5fMS5hbmQpKG5vUHJvcGVydHlJbkRhdGEoZ2VuLCBkYXRhLCBwcm9wLCBvcHRzLm93blByb3BlcnRpZXMpLCAoMCwgY29kZWdlbl8xLl8pYCR7bWlzc2luZ30gPSAke3Byb3B9YCkpKTsKICAgIH0KICAgIGV4cG9ydHMyLmNoZWNrTWlzc2luZ1Byb3AgPSBjaGVja01pc3NpbmdQcm9wOwogICAgZnVuY3Rpb24gcmVwb3J0TWlzc2luZ1Byb3AoY3h0LCBtaXNzaW5nKSB7CiAgICAgIGN4dC5zZXRQYXJhbXMoeyBtaXNzaW5nUHJvcGVydHk6IG1pc3NpbmcgfSwgdHJ1ZSk7CiAgICAgIGN4dC5lcnJvcigpOwogICAgfQogICAgZXhwb3J0czIucmVwb3J0TWlzc2luZ1Byb3AgPSByZXBvcnRNaXNzaW5nUHJvcDsKICAgIGZ1bmN0aW9uIGhhc1Byb3BGdW5jKGdlbikgewogICAgICByZXR1cm4gZ2VuLnNjb3BlVmFsdWUoImZ1bmMiLCB7CiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZAogICAgICAgIHJlZjogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKICAgICAgICBjb2RlOiAoMCwgY29kZWdlbl8xLl8pYE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlgCiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuaGFzUHJvcEZ1bmMgPSBoYXNQcm9wRnVuYzsKICAgIGZ1bmN0aW9uIGlzT3duUHJvcGVydHkoZ2VuLCBkYXRhLCBwcm9wZXJ0eSkgewogICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWAke2hhc1Byb3BGdW5jKGdlbil9LmNhbGwoJHtkYXRhfSwgJHtwcm9wZXJ0eX0pYDsKICAgIH0KICAgIGV4cG9ydHMyLmlzT3duUHJvcGVydHkgPSBpc093blByb3BlcnR5OwogICAgZnVuY3Rpb24gcHJvcGVydHlJbkRhdGEoZ2VuLCBkYXRhLCBwcm9wZXJ0eSwgb3duUHJvcGVydGllcykgewogICAgICBjb25zdCBjb25kID0gKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9JHsoMCwgY29kZWdlbl8xLmdldFByb3BlcnR5KShwcm9wZXJ0eSl9ICE9PSB1bmRlZmluZWRgOwogICAgICByZXR1cm4gb3duUHJvcGVydGllcyA/ICgwLCBjb2RlZ2VuXzEuXylgJHtjb25kfSAmJiAke2lzT3duUHJvcGVydHkoZ2VuLCBkYXRhLCBwcm9wZXJ0eSl9YCA6IGNvbmQ7CiAgICB9CiAgICBleHBvcnRzMi5wcm9wZXJ0eUluRGF0YSA9IHByb3BlcnR5SW5EYXRhOwogICAgZnVuY3Rpb24gbm9Qcm9wZXJ0eUluRGF0YShnZW4sIGRhdGEsIHByb3BlcnR5LCBvd25Qcm9wZXJ0aWVzKSB7CiAgICAgIGNvbnN0IGNvbmQgPSAoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0keygwLCBjb2RlZ2VuXzEuZ2V0UHJvcGVydHkpKHByb3BlcnR5KX0gPT09IHVuZGVmaW5lZGA7CiAgICAgIHJldHVybiBvd25Qcm9wZXJ0aWVzID8gKDAsIGNvZGVnZW5fMS5vcikoY29uZCwgKDAsIGNvZGVnZW5fMS5ub3QpKGlzT3duUHJvcGVydHkoZ2VuLCBkYXRhLCBwcm9wZXJ0eSkpKSA6IGNvbmQ7CiAgICB9CiAgICBleHBvcnRzMi5ub1Byb3BlcnR5SW5EYXRhID0gbm9Qcm9wZXJ0eUluRGF0YTsKICAgIGZ1bmN0aW9uIGFsbFNjaGVtYVByb3BlcnRpZXMoc2NoZW1hTWFwKSB7CiAgICAgIHJldHVybiBzY2hlbWFNYXAgPyBPYmplY3Qua2V5cyhzY2hlbWFNYXApLmZpbHRlcigocCkgPT4gcCAhPT0gIl9fcHJvdG9fXyIpIDogW107CiAgICB9CiAgICBleHBvcnRzMi5hbGxTY2hlbWFQcm9wZXJ0aWVzID0gYWxsU2NoZW1hUHJvcGVydGllczsKICAgIGZ1bmN0aW9uIHNjaGVtYVByb3BlcnRpZXMoaXQsIHNjaGVtYU1hcCkgewogICAgICByZXR1cm4gYWxsU2NoZW1hUHJvcGVydGllcyhzY2hlbWFNYXApLmZpbHRlcigocCkgPT4gISgwLCB1dGlsXzEuYWx3YXlzVmFsaWRTY2hlbWEpKGl0LCBzY2hlbWFNYXBbcF0pKTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVtYVByb3BlcnRpZXMgPSBzY2hlbWFQcm9wZXJ0aWVzOwogICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRlQ29kZSh7IHNjaGVtYUNvZGUsIGRhdGEsIGl0OiB7IGdlbiwgdG9wU2NoZW1hUmVmLCBzY2hlbWFQYXRoLCBlcnJvclBhdGggfSwgaXQgfSwgZnVuYywgY29udGV4dCwgcGFzc1NjaGVtYSkgewogICAgICBjb25zdCBkYXRhQW5kU2NoZW1hID0gcGFzc1NjaGVtYSA/ICgwLCBjb2RlZ2VuXzEuXylgJHtzY2hlbWFDb2RlfSwgJHtkYXRhfSwgJHt0b3BTY2hlbWFSZWZ9JHtzY2hlbWFQYXRofWAgOiBkYXRhOwogICAgICBjb25zdCB2YWxDeHQgPSBbCiAgICAgICAgW25hbWVzXzEuZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCBjb2RlZ2VuXzEuc3RyQ29uY2F0KShuYW1lc18xLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCBlcnJvclBhdGgpXSwKICAgICAgICBbbmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGEsIGl0LnBhcmVudERhdGFdLAogICAgICAgIFtuYW1lc18xLmRlZmF1bHQucGFyZW50RGF0YVByb3BlcnR5LCBpdC5wYXJlbnREYXRhUHJvcGVydHldLAogICAgICAgIFtuYW1lc18xLmRlZmF1bHQucm9vdERhdGEsIG5hbWVzXzEuZGVmYXVsdC5yb290RGF0YV0KICAgICAgXTsKICAgICAgaWYgKGl0Lm9wdHMuZHluYW1pY1JlZikKICAgICAgICB2YWxDeHQucHVzaChbbmFtZXNfMS5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCBuYW1lc18xLmRlZmF1bHQuZHluYW1pY0FuY2hvcnNdKTsKICAgICAgY29uc3QgYXJncyA9ICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhQW5kU2NoZW1hfSwgJHtnZW4ub2JqZWN0KC4uLnZhbEN4dCl9YDsKICAgICAgcmV0dXJuIGNvbnRleHQgIT09IGNvZGVnZW5fMS5uaWwgPyAoMCwgY29kZWdlbl8xLl8pYCR7ZnVuY30uY2FsbCgke2NvbnRleHR9LCAke2FyZ3N9KWAgOiAoMCwgY29kZWdlbl8xLl8pYCR7ZnVuY30oJHthcmdzfSlgOwogICAgfQogICAgZXhwb3J0czIuY2FsbFZhbGlkYXRlQ29kZSA9IGNhbGxWYWxpZGF0ZUNvZGU7CiAgICB2YXIgbmV3UmVnRXhwID0gKDAsIGNvZGVnZW5fMS5fKWBuZXcgUmVnRXhwYDsKICAgIGZ1bmN0aW9uIHVzZVBhdHRlcm4oeyBnZW4sIGl0OiB7IG9wdHMgfSB9LCBwYXR0ZXJuKSB7CiAgICAgIGNvbnN0IHUgPSBvcHRzLnVuaWNvZGVSZWdFeHAgPyAidSIgOiAiIjsKICAgICAgY29uc3QgeyByZWdFeHAgfSA9IG9wdHMuY29kZTsKICAgICAgY29uc3QgcnggPSByZWdFeHAocGF0dGVybiwgdSk7CiAgICAgIHJldHVybiBnZW4uc2NvcGVWYWx1ZSgicGF0dGVybiIsIHsKICAgICAgICBrZXk6IHJ4LnRvU3RyaW5nKCksCiAgICAgICAgcmVmOiByeCwKICAgICAgICBjb2RlOiAoMCwgY29kZWdlbl8xLl8pYCR7cmVnRXhwLmNvZGUgPT09ICJuZXcgUmVnRXhwIiA/IG5ld1JlZ0V4cCA6ICgwLCB1dGlsXzIudXNlRnVuYykoZ2VuLCByZWdFeHApfSgke3BhdHRlcm59LCAke3V9KWAKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi51c2VQYXR0ZXJuID0gdXNlUGF0dGVybjsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkoY3h0KSB7CiAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCBrZXl3b3JkLCBpdCB9ID0gY3h0OwogICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICBpZiAoaXQuYWxsRXJyb3JzKSB7CiAgICAgICAgY29uc3QgdmFsaWRBcnIgPSBnZW4ubGV0KCJ2YWxpZCIsIHRydWUpOwogICAgICAgIHZhbGlkYXRlSXRlbXMoKCkgPT4gZ2VuLmFzc2lnbih2YWxpZEFyciwgZmFsc2UpKTsKICAgICAgICByZXR1cm4gdmFsaWRBcnI7CiAgICAgIH0KICAgICAgZ2VuLnZhcih2YWxpZCwgdHJ1ZSk7CiAgICAgIHZhbGlkYXRlSXRlbXMoKCkgPT4gZ2VuLmJyZWFrKCkpOwogICAgICByZXR1cm4gdmFsaWQ7CiAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlSXRlbXMobm90VmFsaWQpIHsKICAgICAgICBjb25zdCBsZW4gPSBnZW4uY29uc3QoImxlbiIsICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfS5sZW5ndGhgKTsKICAgICAgICBnZW4uZm9yUmFuZ2UoImkiLCAwLCBsZW4sIChpKSA9PiB7CiAgICAgICAgICBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAga2V5d29yZCwKICAgICAgICAgICAgZGF0YVByb3A6IGksCiAgICAgICAgICAgIGRhdGFQcm9wVHlwZTogdXRpbF8xLlR5cGUuTnVtCiAgICAgICAgICB9LCB2YWxpZCk7CiAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5ub3QpKHZhbGlkKSwgbm90VmFsaWQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi52YWxpZGF0ZUFycmF5ID0gdmFsaWRhdGVBcnJheTsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlVW5pb24oY3h0KSB7CiAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIGtleXdvcmQsIGl0IH0gPSBjeHQ7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEpKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgIGNvbnN0IGFsd2F5c1ZhbGlkID0gc2NoZW1hLnNvbWUoKHNjaCkgPT4gKDAsIHV0aWxfMS5hbHdheXNWYWxpZFNjaGVtYSkoaXQsIHNjaCkpOwogICAgICBpZiAoYWx3YXlzVmFsaWQgJiYgIWl0Lm9wdHMudW5ldmFsdWF0ZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB2YWxpZCA9IGdlbi5sZXQoInZhbGlkIiwgZmFsc2UpOwogICAgICBjb25zdCBzY2hWYWxpZCA9IGdlbi5uYW1lKCJfdmFsaWQiKTsKICAgICAgZ2VuLmJsb2NrKCgpID0+IHNjaGVtYS5mb3JFYWNoKChfc2NoLCBpKSA9PiB7CiAgICAgICAgY29uc3Qgc2NoQ3h0ID0gY3h0LnN1YnNjaGVtYSh7CiAgICAgICAgICBrZXl3b3JkLAogICAgICAgICAgc2NoZW1hUHJvcDogaSwKICAgICAgICAgIGNvbXBvc2l0ZVJ1bGU6IHRydWUKICAgICAgICB9LCBzY2hWYWxpZCk7CiAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgKDAsIGNvZGVnZW5fMS5fKWAke3ZhbGlkfSB8fCAke3NjaFZhbGlkfWApOwogICAgICAgIGNvbnN0IG1lcmdlZCA9IGN4dC5tZXJnZVZhbGlkRXZhbHVhdGVkKHNjaEN4dCwgc2NoVmFsaWQpOwogICAgICAgIGlmICghbWVyZ2VkKQogICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEubm90KSh2YWxpZCkpOwogICAgICB9KSk7CiAgICAgIGN4dC5yZXN1bHQodmFsaWQsICgpID0+IGN4dC5yZXNldCgpLCAoKSA9PiBjeHQuZXJyb3IodHJ1ZSkpOwogICAgfQogICAgZXhwb3J0czIudmFsaWRhdGVVbmlvbiA9IHZhbGlkYXRlVW5pb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUva2V5d29yZC5qcwp2YXIgcmVxdWlyZV9rZXl3b3JkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUva2V5d29yZC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudmFsaWRhdGVLZXl3b3JkVXNhZ2UgPSBleHBvcnRzMi52YWxpZFNjaGVtYVR5cGUgPSBleHBvcnRzMi5mdW5jS2V5d29yZENvZGUgPSBleHBvcnRzMi5tYWNyb0tleXdvcmRDb2RlID0gdm9pZCAwOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIG5hbWVzXzEgPSByZXF1aXJlX25hbWVzKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGVycm9yc18xID0gcmVxdWlyZV9lcnJvcnMoKTsKICAgIGZ1bmN0aW9uIG1hY3JvS2V5d29yZENvZGUoY3h0LCBkZWYpIHsKICAgICAgY29uc3QgeyBnZW4sIGtleXdvcmQsIHNjaGVtYSwgcGFyZW50U2NoZW1hLCBpdCB9ID0gY3h0OwogICAgICBjb25zdCBtYWNyb1NjaGVtYSA9IGRlZi5tYWNyby5jYWxsKGl0LnNlbGYsIHNjaGVtYSwgcGFyZW50U2NoZW1hLCBpdCk7CiAgICAgIGNvbnN0IHNjaGVtYVJlZiA9IHVzZUtleXdvcmQoZ2VuLCBrZXl3b3JkLCBtYWNyb1NjaGVtYSk7CiAgICAgIGlmIChpdC5vcHRzLnZhbGlkYXRlU2NoZW1hICE9PSBmYWxzZSkKICAgICAgICBpdC5zZWxmLnZhbGlkYXRlU2NoZW1hKG1hY3JvU2NoZW1hLCB0cnVlKTsKICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubmFtZSgidmFsaWQiKTsKICAgICAgY3h0LnN1YnNjaGVtYSh7CiAgICAgICAgc2NoZW1hOiBtYWNyb1NjaGVtYSwKICAgICAgICBzY2hlbWFQYXRoOiBjb2RlZ2VuXzEubmlsLAogICAgICAgIGVyclNjaGVtYVBhdGg6IGAke2l0LmVyclNjaGVtYVBhdGh9LyR7a2V5d29yZH1gLAogICAgICAgIHRvcFNjaGVtYVJlZjogc2NoZW1hUmVmLAogICAgICAgIGNvbXBvc2l0ZVJ1bGU6IHRydWUKICAgICAgfSwgdmFsaWQpOwogICAgICBjeHQucGFzcyh2YWxpZCwgKCkgPT4gY3h0LmVycm9yKHRydWUpKTsKICAgIH0KICAgIGV4cG9ydHMyLm1hY3JvS2V5d29yZENvZGUgPSBtYWNyb0tleXdvcmRDb2RlOwogICAgZnVuY3Rpb24gZnVuY0tleXdvcmRDb2RlKGN4dCwgZGVmKSB7CiAgICAgIHZhciBfYTsKICAgICAgY29uc3QgeyBnZW4sIGtleXdvcmQsIHNjaGVtYSwgcGFyZW50U2NoZW1hLCAkZGF0YSwgaXQgfSA9IGN4dDsKICAgICAgY2hlY2tBc3luY0tleXdvcmQoaXQsIGRlZik7CiAgICAgIGNvbnN0IHZhbGlkYXRlID0gISRkYXRhICYmIGRlZi5jb21waWxlID8gZGVmLmNvbXBpbGUuY2FsbChpdC5zZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpIDogZGVmLnZhbGlkYXRlOwogICAgICBjb25zdCB2YWxpZGF0ZVJlZiA9IHVzZUtleXdvcmQoZ2VuLCBrZXl3b3JkLCB2YWxpZGF0ZSk7CiAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLmxldCgidmFsaWQiKTsKICAgICAgY3h0LmJsb2NrJGRhdGEodmFsaWQsIHZhbGlkYXRlS2V5d29yZCk7CiAgICAgIGN4dC5vaygoX2EgPSBkZWYudmFsaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHZhbGlkKTsKICAgICAgZnVuY3Rpb24gdmFsaWRhdGVLZXl3b3JkKCkgewogICAgICAgIGlmIChkZWYuZXJyb3JzID09PSBmYWxzZSkgewogICAgICAgICAgYXNzaWduVmFsaWQoKTsKICAgICAgICAgIGlmIChkZWYubW9kaWZ5aW5nKQogICAgICAgICAgICBtb2RpZnlEYXRhKGN4dCk7CiAgICAgICAgICByZXBvcnRFcnJzKCgpID0+IGN4dC5lcnJvcigpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgcnVsZUVycnMgPSBkZWYuYXN5bmMgPyB2YWxpZGF0ZUFzeW5jKCkgOiB2YWxpZGF0ZVN5bmMoKTsKICAgICAgICAgIGlmIChkZWYubW9kaWZ5aW5nKQogICAgICAgICAgICBtb2RpZnlEYXRhKGN4dCk7CiAgICAgICAgICByZXBvcnRFcnJzKCgpID0+IGFkZEVycnMoY3h0LCBydWxlRXJycykpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiB2YWxpZGF0ZUFzeW5jKCkgewogICAgICAgIGNvbnN0IHJ1bGVFcnJzID0gZ2VuLmxldCgicnVsZUVycnMiLCBudWxsKTsKICAgICAgICBnZW4udHJ5KCgpID0+IGFzc2lnblZhbGlkKCgwLCBjb2RlZ2VuXzEuXylgYXdhaXQgYCksIChlKSA9PiBnZW4uYXNzaWduKHZhbGlkLCBmYWxzZSkuaWYoKDAsIGNvZGVnZW5fMS5fKWAke2V9IGluc3RhbmNlb2YgJHtpdC5WYWxpZGF0aW9uRXJyb3J9YCwgKCkgPT4gZ2VuLmFzc2lnbihydWxlRXJycywgKDAsIGNvZGVnZW5fMS5fKWAke2V9LmVycm9yc2ApLCAoKSA9PiBnZW4udGhyb3coZSkpKTsKICAgICAgICByZXR1cm4gcnVsZUVycnM7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmFsaWRhdGVTeW5jKCkgewogICAgICAgIGNvbnN0IHZhbGlkYXRlRXJycyA9ICgwLCBjb2RlZ2VuXzEuXylgJHt2YWxpZGF0ZVJlZn0uZXJyb3JzYDsKICAgICAgICBnZW4uYXNzaWduKHZhbGlkYXRlRXJycywgbnVsbCk7CiAgICAgICAgYXNzaWduVmFsaWQoY29kZWdlbl8xLm5pbCk7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRXJyczsKICAgICAgfQogICAgICBmdW5jdGlvbiBhc3NpZ25WYWxpZChfYXdhaXQgPSBkZWYuYXN5bmMgPyAoMCwgY29kZWdlbl8xLl8pYGF3YWl0IGAgOiBjb2RlZ2VuXzEubmlsKSB7CiAgICAgICAgY29uc3QgcGFzc0N4dCA9IGl0Lm9wdHMucGFzc0NvbnRleHQgPyBuYW1lc18xLmRlZmF1bHQudGhpcyA6IG5hbWVzXzEuZGVmYXVsdC5zZWxmOwogICAgICAgIGNvbnN0IHBhc3NTY2hlbWEgPSAhKCJjb21waWxlIiBpbiBkZWYgJiYgISRkYXRhIHx8IGRlZi5zY2hlbWEgPT09IGZhbHNlKTsKICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCAoMCwgY29kZWdlbl8xLl8pYCR7X2F3YWl0fSR7KDAsIGNvZGVfMS5jYWxsVmFsaWRhdGVDb2RlKShjeHQsIHZhbGlkYXRlUmVmLCBwYXNzQ3h0LCBwYXNzU2NoZW1hKX1gLCBkZWYubW9kaWZ5aW5nKTsKICAgICAgfQogICAgICBmdW5jdGlvbiByZXBvcnRFcnJzKGVycm9ycykgewogICAgICAgIHZhciBfYTI7CiAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEubm90KSgoX2EyID0gZGVmLnZhbGlkKSAhPT0gbnVsbCAmJiBfYTIgIT09IHZvaWQgMCA/IF9hMiA6IHZhbGlkKSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuZnVuY0tleXdvcmRDb2RlID0gZnVuY0tleXdvcmRDb2RlOwogICAgZnVuY3Rpb24gbW9kaWZ5RGF0YShjeHQpIHsKICAgICAgY29uc3QgeyBnZW4sIGRhdGEsIGl0IH0gPSBjeHQ7CiAgICAgIGdlbi5pZihpdC5wYXJlbnREYXRhLCAoKSA9PiBnZW4uYXNzaWduKGRhdGEsICgwLCBjb2RlZ2VuXzEuXylgJHtpdC5wYXJlbnREYXRhfVske2l0LnBhcmVudERhdGFQcm9wZXJ0eX1dYCkpOwogICAgfQogICAgZnVuY3Rpb24gYWRkRXJycyhjeHQsIGVycnMpIHsKICAgICAgY29uc3QgeyBnZW4gfSA9IGN4dDsKICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgQXJyYXkuaXNBcnJheSgke2VycnN9KWAsICgpID0+IHsKICAgICAgICBnZW4uYXNzaWduKG5hbWVzXzEuZGVmYXVsdC52RXJyb3JzLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHtlcnJzfSA6ICR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9LmNvbmNhdCgke2VycnN9KWApLmFzc2lnbihuYW1lc18xLmRlZmF1bHQuZXJyb3JzLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9Lmxlbmd0aGApOwogICAgICAgICgwLCBlcnJvcnNfMS5leHRlbmRFcnJvcnMpKGN4dCk7CiAgICAgIH0sICgpID0+IGN4dC5lcnJvcigpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoZWNrQXN5bmNLZXl3b3JkKHsgc2NoZW1hRW52IH0sIGRlZikgewogICAgICBpZiAoZGVmLmFzeW5jICYmICFzY2hlbWFFbnYuJGFzeW5jKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiYXN5bmMga2V5d29yZCBpbiBzeW5jIHNjaGVtYSIpOwogICAgfQogICAgZnVuY3Rpb24gdXNlS2V5d29yZChnZW4sIGtleXdvcmQsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBrZXl3b3JkICIke2tleXdvcmR9IiBmYWlsZWQgdG8gY29tcGlsZWApOwogICAgICByZXR1cm4gZ2VuLnNjb3BlVmFsdWUoImtleXdvcmQiLCB0eXBlb2YgcmVzdWx0ID09ICJmdW5jdGlvbiIgPyB7IHJlZjogcmVzdWx0IH0gOiB7IHJlZjogcmVzdWx0LCBjb2RlOiAoMCwgY29kZWdlbl8xLnN0cmluZ2lmeSkocmVzdWx0KSB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkU2NoZW1hVHlwZShzY2hlbWEsIHNjaGVtYVR5cGUsIGFsbG93VW5kZWZpbmVkID0gZmFsc2UpIHsKICAgICAgcmV0dXJuICFzY2hlbWFUeXBlLmxlbmd0aCB8fCBzY2hlbWFUeXBlLnNvbWUoKHN0KSA9PiBzdCA9PT0gImFycmF5IiA/IEFycmF5LmlzQXJyYXkoc2NoZW1hKSA6IHN0ID09PSAib2JqZWN0IiA/IHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KHNjaGVtYSkgOiB0eXBlb2Ygc2NoZW1hID09IHN0IHx8IGFsbG93VW5kZWZpbmVkICYmIHR5cGVvZiBzY2hlbWEgPT0gInVuZGVmaW5lZCIpOwogICAgfQogICAgZXhwb3J0czIudmFsaWRTY2hlbWFUeXBlID0gdmFsaWRTY2hlbWFUeXBlOwogICAgZnVuY3Rpb24gdmFsaWRhdGVLZXl3b3JkVXNhZ2UoeyBzY2hlbWEsIG9wdHMsIHNlbGY6IHNlbGYyLCBlcnJTY2hlbWFQYXRoIH0sIGRlZiwga2V5d29yZCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYua2V5d29yZCkgPyAhZGVmLmtleXdvcmQuaW5jbHVkZXMoa2V5d29yZCkgOiBkZWYua2V5d29yZCAhPT0ga2V5d29yZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgIH0KICAgICAgY29uc3QgZGVwcyA9IGRlZi5kZXBlbmRlbmNpZXM7CiAgICAgIGlmIChkZXBzID09PSBudWxsIHx8IGRlcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcHMuc29tZSgoa3dkKSA9PiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYSwga3dkKSkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcmVudCBzY2hlbWEgbXVzdCBoYXZlIGRlcGVuZGVuY2llcyBvZiAke2tleXdvcmR9OiAke2RlcHMuam9pbigiLCIpfWApOwogICAgICB9CiAgICAgIGlmIChkZWYudmFsaWRhdGVTY2hlbWEpIHsKICAgICAgICBjb25zdCB2YWxpZCA9IGRlZi52YWxpZGF0ZVNjaGVtYShzY2hlbWFba2V5d29yZF0pOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgIGNvbnN0IG1zZyA9IGBrZXl3b3JkICIke2tleXdvcmR9IiB2YWx1ZSBpcyBpbnZhbGlkIGF0IHBhdGggIiR7ZXJyU2NoZW1hUGF0aH0iOiBgICsgc2VsZjIuZXJyb3JzVGV4dChkZWYudmFsaWRhdGVTY2hlbWEuZXJyb3JzKTsKICAgICAgICAgIGlmIChvcHRzLnZhbGlkYXRlU2NoZW1hID09PSAibG9nIikKICAgICAgICAgICAgc2VsZjIubG9nZ2VyLmVycm9yKG1zZyk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXhwb3J0czIudmFsaWRhdGVLZXl3b3JkVXNhZ2UgPSB2YWxpZGF0ZUtleXdvcmRVc2FnZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS92YWxpZGF0ZS9zdWJzY2hlbWEuanMKdmFyIHJlcXVpcmVfc3Vic2NoZW1hID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvc3Vic2NoZW1hLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5leHRlbmRTdWJzY2hlbWFNb2RlID0gZXhwb3J0czIuZXh0ZW5kU3Vic2NoZW1hRGF0YSA9IGV4cG9ydHMyLmdldFN1YnNjaGVtYSA9IHZvaWQgMDsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIGZ1bmN0aW9uIGdldFN1YnNjaGVtYShpdCwgeyBrZXl3b3JkLCBzY2hlbWFQcm9wLCBzY2hlbWEsIHNjaGVtYVBhdGgsIGVyclNjaGVtYVBhdGgsIHRvcFNjaGVtYVJlZiB9KSB7CiAgICAgIGlmIChrZXl3b3JkICE9PSB2b2lkIDAgJiYgc2NoZW1hICE9PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JvdGggImtleXdvcmQiIGFuZCAic2NoZW1hIiBwYXNzZWQsIG9ubHkgb25lIGFsbG93ZWQnKTsKICAgICAgfQogICAgICBpZiAoa2V5d29yZCAhPT0gdm9pZCAwKSB7CiAgICAgICAgY29uc3Qgc2NoID0gaXQuc2NoZW1hW2tleXdvcmRdOwogICAgICAgIHJldHVybiBzY2hlbWFQcm9wID09PSB2b2lkIDAgPyB7CiAgICAgICAgICBzY2hlbWE6IHNjaCwKICAgICAgICAgIHNjaGVtYVBhdGg6ICgwLCBjb2RlZ2VuXzEuXylgJHtpdC5zY2hlbWFQYXRofSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkoa2V5d29yZCl9YCwKICAgICAgICAgIGVyclNjaGVtYVBhdGg6IGAke2l0LmVyclNjaGVtYVBhdGh9LyR7a2V5d29yZH1gCiAgICAgICAgfSA6IHsKICAgICAgICAgIHNjaGVtYTogc2NoW3NjaGVtYVByb3BdLAogICAgICAgICAgc2NoZW1hUGF0aDogKDAsIGNvZGVnZW5fMS5fKWAke2l0LnNjaGVtYVBhdGh9JHsoMCwgY29kZWdlbl8xLmdldFByb3BlcnR5KShrZXl3b3JkKX0keygwLCBjb2RlZ2VuXzEuZ2V0UHJvcGVydHkpKHNjaGVtYVByb3ApfWAsCiAgICAgICAgICBlcnJTY2hlbWFQYXRoOiBgJHtpdC5lcnJTY2hlbWFQYXRofS8ke2tleXdvcmR9LyR7KDAsIHV0aWxfMS5lc2NhcGVGcmFnbWVudCkoc2NoZW1hUHJvcCl9YAogICAgICAgIH07CiAgICAgIH0KICAgICAgaWYgKHNjaGVtYSAhPT0gdm9pZCAwKSB7CiAgICAgICAgaWYgKHNjaGVtYVBhdGggPT09IHZvaWQgMCB8fCBlcnJTY2hlbWFQYXRoID09PSB2b2lkIDAgfHwgdG9wU2NoZW1hUmVmID09PSB2b2lkIDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignInNjaGVtYVBhdGgiLCAiZXJyU2NoZW1hUGF0aCIgYW5kICJ0b3BTY2hlbWFSZWYiIGFyZSByZXF1aXJlZCB3aXRoICJzY2hlbWEiJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzY2hlbWEsCiAgICAgICAgICBzY2hlbWFQYXRoLAogICAgICAgICAgdG9wU2NoZW1hUmVmLAogICAgICAgICAgZXJyU2NoZW1hUGF0aAogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKCdlaXRoZXIgImtleXdvcmQiIG9yICJzY2hlbWEiIG11c3QgYmUgcGFzc2VkJyk7CiAgICB9CiAgICBleHBvcnRzMi5nZXRTdWJzY2hlbWEgPSBnZXRTdWJzY2hlbWE7CiAgICBmdW5jdGlvbiBleHRlbmRTdWJzY2hlbWFEYXRhKHN1YnNjaGVtYSwgaXQsIHsgZGF0YVByb3AsIGRhdGFQcm9wVHlwZTogZHBUeXBlLCBkYXRhLCBkYXRhVHlwZXMsIHByb3BlcnR5TmFtZSB9KSB7CiAgICAgIGlmIChkYXRhICE9PSB2b2lkIDAgJiYgZGF0YVByb3AgIT09IHZvaWQgMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignYm90aCAiZGF0YSIgYW5kICJkYXRhUHJvcCIgcGFzc2VkLCBvbmx5IG9uZSBhbGxvd2VkJyk7CiAgICAgIH0KICAgICAgY29uc3QgeyBnZW4gfSA9IGl0OwogICAgICBpZiAoZGF0YVByb3AgIT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IHsgZXJyb3JQYXRoLCBkYXRhUGF0aEFyciwgb3B0cyB9ID0gaXQ7CiAgICAgICAgY29uc3QgbmV4dERhdGEgPSBnZW4ubGV0KCJkYXRhIiwgKDAsIGNvZGVnZW5fMS5fKWAke2l0LmRhdGF9JHsoMCwgY29kZWdlbl8xLmdldFByb3BlcnR5KShkYXRhUHJvcCl9YCwgdHJ1ZSk7CiAgICAgICAgZGF0YUNvbnRleHRQcm9wcyhuZXh0RGF0YSk7CiAgICAgICAgc3Vic2NoZW1hLmVycm9yUGF0aCA9ICgwLCBjb2RlZ2VuXzEuc3RyKWAke2Vycm9yUGF0aH0keygwLCB1dGlsXzEuZ2V0RXJyb3JQYXRoKShkYXRhUHJvcCwgZHBUeXBlLCBvcHRzLmpzUHJvcGVydHlTeW50YXgpfWA7CiAgICAgICAgc3Vic2NoZW1hLnBhcmVudERhdGFQcm9wZXJ0eSA9ICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhUHJvcH1gOwogICAgICAgIHN1YnNjaGVtYS5kYXRhUGF0aEFyciA9IFsuLi5kYXRhUGF0aEFyciwgc3Vic2NoZW1hLnBhcmVudERhdGFQcm9wZXJ0eV07CiAgICAgIH0KICAgICAgaWYgKGRhdGEgIT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IG5leHREYXRhID0gZGF0YSBpbnN0YW5jZW9mIGNvZGVnZW5fMS5OYW1lID8gZGF0YSA6IGdlbi5sZXQoImRhdGEiLCBkYXRhLCB0cnVlKTsKICAgICAgICBkYXRhQ29udGV4dFByb3BzKG5leHREYXRhKTsKICAgICAgICBpZiAocHJvcGVydHlOYW1lICE9PSB2b2lkIDApCiAgICAgICAgICBzdWJzY2hlbWEucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwogICAgICB9CiAgICAgIGlmIChkYXRhVHlwZXMpCiAgICAgICAgc3Vic2NoZW1hLmRhdGFUeXBlcyA9IGRhdGFUeXBlczsKICAgICAgZnVuY3Rpb24gZGF0YUNvbnRleHRQcm9wcyhfbmV4dERhdGEpIHsKICAgICAgICBzdWJzY2hlbWEuZGF0YSA9IF9uZXh0RGF0YTsKICAgICAgICBzdWJzY2hlbWEuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMTsKICAgICAgICBzdWJzY2hlbWEuZGF0YVR5cGVzID0gW107CiAgICAgICAgaXQuZGVmaW5lZFByb3BlcnRpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIHN1YnNjaGVtYS5wYXJlbnREYXRhID0gaXQuZGF0YTsKICAgICAgICBzdWJzY2hlbWEuZGF0YU5hbWVzID0gWy4uLml0LmRhdGFOYW1lcywgX25leHREYXRhXTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuZXh0ZW5kU3Vic2NoZW1hRGF0YSA9IGV4dGVuZFN1YnNjaGVtYURhdGE7CiAgICBmdW5jdGlvbiBleHRlbmRTdWJzY2hlbWFNb2RlKHN1YnNjaGVtYSwgeyBqdGREaXNjcmltaW5hdG9yLCBqdGRNZXRhZGF0YSwgY29tcG9zaXRlUnVsZSwgY3JlYXRlRXJyb3JzLCBhbGxFcnJvcnMgfSkgewogICAgICBpZiAoY29tcG9zaXRlUnVsZSAhPT0gdm9pZCAwKQogICAgICAgIHN1YnNjaGVtYS5jb21wb3NpdGVSdWxlID0gY29tcG9zaXRlUnVsZTsKICAgICAgaWYgKGNyZWF0ZUVycm9ycyAhPT0gdm9pZCAwKQogICAgICAgIHN1YnNjaGVtYS5jcmVhdGVFcnJvcnMgPSBjcmVhdGVFcnJvcnM7CiAgICAgIGlmIChhbGxFcnJvcnMgIT09IHZvaWQgMCkKICAgICAgICBzdWJzY2hlbWEuYWxsRXJyb3JzID0gYWxsRXJyb3JzOwogICAgICBzdWJzY2hlbWEuanRkRGlzY3JpbWluYXRvciA9IGp0ZERpc2NyaW1pbmF0b3I7CiAgICAgIHN1YnNjaGVtYS5qdGRNZXRhZGF0YSA9IGp0ZE1ldGFkYXRhOwogICAgfQogICAgZXhwb3J0czIuZXh0ZW5kU3Vic2NoZW1hTW9kZSA9IGV4dGVuZFN1YnNjaGVtYU1vZGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Zhc3QtZGVlcC1lcXVhbC1ucG0tMy4xLjMtNzkwZWRjZmNmNS1lMjFhOWQ4ZDg0LnppcC9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2luZGV4LmpzCnZhciByZXF1aXJlX2Zhc3RfZGVlcF9lcXVhbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9mYXN0LWRlZXAtZXF1YWwtbnBtLTMuMS4zLTc5MGVkY2ZjZjUtZTIxYTlkOGQ4NC56aXAvbm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIG1vZHVsZTIuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHsKICAgICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlOwogICAgICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICJvYmplY3QiICYmIHR5cGVvZiBiID09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDsKICAgICAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOyApCiAgICAgICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7CiAgICAgICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpOwogICAgICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7CiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoOwogICAgICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOyApCiAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOyApIHsKICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjsKICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2pzb24tc2NoZW1hLXRyYXZlcnNlLW5wbS0xLjAuMC1mYjM2ODRmNGYwLTAyZjJmNDY2Y2QuemlwL25vZGVfbW9kdWxlcy9qc29uLXNjaGVtYS10cmF2ZXJzZS9pbmRleC5qcwp2YXIgcmVxdWlyZV9qc29uX3NjaGVtYV90cmF2ZXJzZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9qc29uLXNjaGVtYS10cmF2ZXJzZS1ucG0tMS4wLjAtZmIzNjg0ZjRmMC0wMmYyZjQ2NmNkLnppcC9ub2RlX21vZHVsZXMvanNvbi1zY2hlbWEtdHJhdmVyc2UvaW5kZXguanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgdHJhdmVyc2UgPSBtb2R1bGUyLmV4cG9ydHMgPSBmdW5jdGlvbihzY2hlbWEsIG9wdHMsIGNiKSB7CiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY2IgPSBvcHRzOwogICAgICAgIG9wdHMgPSB7fTsKICAgICAgfQogICAgICBjYiA9IG9wdHMuY2IgfHwgY2I7CiAgICAgIHZhciBwcmUgPSB0eXBlb2YgY2IgPT0gImZ1bmN0aW9uIiA/IGNiIDogY2IucHJlIHx8IGZ1bmN0aW9uKCkgewogICAgICB9OwogICAgICB2YXIgcG9zdCA9IGNiLnBvc3QgfHwgZnVuY3Rpb24oKSB7CiAgICAgIH07CiAgICAgIF90cmF2ZXJzZShvcHRzLCBwcmUsIHBvc3QsIHNjaGVtYSwgIiIsIHNjaGVtYSk7CiAgICB9OwogICAgdHJhdmVyc2Uua2V5d29yZHMgPSB7CiAgICAgIGFkZGl0aW9uYWxJdGVtczogdHJ1ZSwKICAgICAgaXRlbXM6IHRydWUsCiAgICAgIGNvbnRhaW5zOiB0cnVlLAogICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSwKICAgICAgcHJvcGVydHlOYW1lczogdHJ1ZSwKICAgICAgbm90OiB0cnVlLAogICAgICBpZjogdHJ1ZSwKICAgICAgdGhlbjogdHJ1ZSwKICAgICAgZWxzZTogdHJ1ZQogICAgfTsKICAgIHRyYXZlcnNlLmFycmF5S2V5d29yZHMgPSB7CiAgICAgIGl0ZW1zOiB0cnVlLAogICAgICBhbGxPZjogdHJ1ZSwKICAgICAgYW55T2Y6IHRydWUsCiAgICAgIG9uZU9mOiB0cnVlCiAgICB9OwogICAgdHJhdmVyc2UucHJvcHNLZXl3b3JkcyA9IHsKICAgICAgJGRlZnM6IHRydWUsCiAgICAgIGRlZmluaXRpb25zOiB0cnVlLAogICAgICBwcm9wZXJ0aWVzOiB0cnVlLAogICAgICBwYXR0ZXJuUHJvcGVydGllczogdHJ1ZSwKICAgICAgZGVwZW5kZW5jaWVzOiB0cnVlCiAgICB9OwogICAgdHJhdmVyc2Uuc2tpcEtleXdvcmRzID0gewogICAgICBkZWZhdWx0OiB0cnVlLAogICAgICBlbnVtOiB0cnVlLAogICAgICBjb25zdDogdHJ1ZSwKICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgIG1heGltdW06IHRydWUsCiAgICAgIG1pbmltdW06IHRydWUsCiAgICAgIGV4Y2x1c2l2ZU1heGltdW06IHRydWUsCiAgICAgIGV4Y2x1c2l2ZU1pbmltdW06IHRydWUsCiAgICAgIG11bHRpcGxlT2Y6IHRydWUsCiAgICAgIG1heExlbmd0aDogdHJ1ZSwKICAgICAgbWluTGVuZ3RoOiB0cnVlLAogICAgICBwYXR0ZXJuOiB0cnVlLAogICAgICBmb3JtYXQ6IHRydWUsCiAgICAgIG1heEl0ZW1zOiB0cnVlLAogICAgICBtaW5JdGVtczogdHJ1ZSwKICAgICAgdW5pcXVlSXRlbXM6IHRydWUsCiAgICAgIG1heFByb3BlcnRpZXM6IHRydWUsCiAgICAgIG1pblByb3BlcnRpZXM6IHRydWUKICAgIH07CiAgICBmdW5jdGlvbiBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hlbWEsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHsKICAgICAgaWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHsKICAgICAgICBwcmUoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7CiAgICAgICAgICB2YXIgc2NoID0gc2NoZW1hW2tleV07CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2gpKSB7CiAgICAgICAgICAgIGlmIChrZXkgaW4gdHJhdmVyc2UuYXJyYXlLZXl3b3JkcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NoLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoW2ldLCBqc29uUHRyICsgIi8iICsga2V5ICsgIi8iICsgaSwgcm9vdFNjaGVtYSwganNvblB0ciwga2V5LCBzY2hlbWEsIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiB0cmF2ZXJzZS5wcm9wc0tleXdvcmRzKSB7CiAgICAgICAgICAgIGlmIChzY2ggJiYgdHlwZW9mIHNjaCA9PSAib2JqZWN0IikgewogICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gc2NoKQogICAgICAgICAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoW3Byb3BdLCBqc29uUHRyICsgIi8iICsga2V5ICsgIi8iICsgZXNjYXBlSnNvblB0cihwcm9wKSwgcm9vdFNjaGVtYSwganNvblB0ciwga2V5LCBzY2hlbWEsIHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiB0cmF2ZXJzZS5rZXl3b3JkcyB8fCBvcHRzLmFsbEtleXMgJiYgIShrZXkgaW4gdHJhdmVyc2Uuc2tpcEtleXdvcmRzKSkgewogICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2gsIGpzb25QdHIgKyAiLyIgKyBrZXksIHJvb3RTY2hlbWEsIGpzb25QdHIsIGtleSwgc2NoZW1hKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zdChzY2hlbWEsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlc2NhcGVKc29uUHRyKHN0cikgewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL34vZywgIn4wIikucmVwbGFjZSgvXC8vZywgIn4xIik7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvcmVzb2x2ZS5qcwp2YXIgcmVxdWlyZV9yZXNvbHZlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvcmVzb2x2ZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZ2V0U2NoZW1hUmVmcyA9IGV4cG9ydHMyLnJlc29sdmVVcmwgPSBleHBvcnRzMi5ub3JtYWxpemVJZCA9IGV4cG9ydHMyLl9nZXRGdWxsUGF0aCA9IGV4cG9ydHMyLmdldEZ1bGxQYXRoID0gZXhwb3J0czIuaW5saW5lUmVmID0gdm9pZCAwOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVxdWFsID0gcmVxdWlyZV9mYXN0X2RlZXBfZXF1YWwoKTsKICAgIHZhciB0cmF2ZXJzZSA9IHJlcXVpcmVfanNvbl9zY2hlbWFfdHJhdmVyc2UoKTsKICAgIHZhciBTSU1QTEVfSU5MSU5FRCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsKICAgICAgInR5cGUiLAogICAgICAiZm9ybWF0IiwKICAgICAgInBhdHRlcm4iLAogICAgICAibWF4TGVuZ3RoIiwKICAgICAgIm1pbkxlbmd0aCIsCiAgICAgICJtYXhQcm9wZXJ0aWVzIiwKICAgICAgIm1pblByb3BlcnRpZXMiLAogICAgICAibWF4SXRlbXMiLAogICAgICAibWluSXRlbXMiLAogICAgICAibWF4aW11bSIsCiAgICAgICJtaW5pbXVtIiwKICAgICAgInVuaXF1ZUl0ZW1zIiwKICAgICAgIm11bHRpcGxlT2YiLAogICAgICAicmVxdWlyZWQiLAogICAgICAiZW51bSIsCiAgICAgICJjb25zdCIKICAgIF0pOwogICAgZnVuY3Rpb24gaW5saW5lUmVmKHNjaGVtYSwgbGltaXQgPSB0cnVlKSB7CiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09ICJib29sZWFuIikKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxpbWl0ID09PSB0cnVlKQogICAgICAgIHJldHVybiAhaGFzUmVmKHNjaGVtYSk7CiAgICAgIGlmICghbGltaXQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gY291bnRLZXlzKHNjaGVtYSkgPD0gbGltaXQ7CiAgICB9CiAgICBleHBvcnRzMi5pbmxpbmVSZWYgPSBpbmxpbmVSZWY7CiAgICB2YXIgUkVGX0tFWVdPUkRTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWwogICAgICAiJHJlZiIsCiAgICAgICIkcmVjdXJzaXZlUmVmIiwKICAgICAgIiRyZWN1cnNpdmVBbmNob3IiLAogICAgICAiJGR5bmFtaWNSZWYiLAogICAgICAiJGR5bmFtaWNBbmNob3IiCiAgICBdKTsKICAgIGZ1bmN0aW9uIGhhc1JlZihzY2hlbWEpIHsKICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hKSB7CiAgICAgICAgaWYgKFJFRl9LRVlXT1JEUy5oYXMoa2V5KSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGNvbnN0IHNjaCA9IHNjaGVtYVtrZXldOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaCkgJiYgc2NoLnNvbWUoaGFzUmVmKSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGlmICh0eXBlb2Ygc2NoID09ICJvYmplY3QiICYmIGhhc1JlZihzY2gpKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY291bnRLZXlzKHNjaGVtYSkgewogICAgICBsZXQgY291bnQgPSAwOwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHsKICAgICAgICBpZiAoa2V5ID09PSAiJHJlZiIpCiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgY291bnQrKzsKICAgICAgICBpZiAoU0lNUExFX0lOTElORUQuaGFzKGtleSkpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVtrZXldID09ICJvYmplY3QiKSB7CiAgICAgICAgICAoMCwgdXRpbF8xLmVhY2hJdGVtKShzY2hlbWFba2V5XSwgKHNjaCkgPT4gY291bnQgKz0gY291bnRLZXlzKHNjaCkpOwogICAgICAgIH0KICAgICAgICBpZiAoY291bnQgPT09IEluZmluaXR5KQogICAgICAgICAgcmV0dXJuIEluZmluaXR5OwogICAgICB9CiAgICAgIHJldHVybiBjb3VudDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKHJlc29sdmVyLCBpZCA9ICIiLCBub3JtYWxpemUpIHsKICAgICAgaWYgKG5vcm1hbGl6ZSAhPT0gZmFsc2UpCiAgICAgICAgaWQgPSBub3JtYWxpemVJZChpZCk7CiAgICAgIGNvbnN0IHAgPSByZXNvbHZlci5wYXJzZShpZCk7CiAgICAgIHJldHVybiBfZ2V0RnVsbFBhdGgocmVzb2x2ZXIsIHApOwogICAgfQogICAgZXhwb3J0czIuZ2V0RnVsbFBhdGggPSBnZXRGdWxsUGF0aDsKICAgIGZ1bmN0aW9uIF9nZXRGdWxsUGF0aChyZXNvbHZlciwgcCkgewogICAgICBjb25zdCBzZXJpYWxpemVkID0gcmVzb2x2ZXIuc2VyaWFsaXplKHApOwogICAgICByZXR1cm4gc2VyaWFsaXplZC5zcGxpdCgiIyIpWzBdICsgIiMiOwogICAgfQogICAgZXhwb3J0czIuX2dldEZ1bGxQYXRoID0gX2dldEZ1bGxQYXRoOwogICAgdmFyIFRSQUlMSU5HX1NMQVNIX0hBU0ggPSAvI1wvPyQvOwogICAgZnVuY3Rpb24gbm9ybWFsaXplSWQoaWQpIHsKICAgICAgcmV0dXJuIGlkID8gaWQucmVwbGFjZShUUkFJTElOR19TTEFTSF9IQVNILCAiIikgOiAiIjsKICAgIH0KICAgIGV4cG9ydHMyLm5vcm1hbGl6ZUlkID0gbm9ybWFsaXplSWQ7CiAgICBmdW5jdGlvbiByZXNvbHZlVXJsKHJlc29sdmVyLCBiYXNlSWQsIGlkKSB7CiAgICAgIGlkID0gbm9ybWFsaXplSWQoaWQpOwogICAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZShiYXNlSWQsIGlkKTsKICAgIH0KICAgIGV4cG9ydHMyLnJlc29sdmVVcmwgPSByZXNvbHZlVXJsOwogICAgdmFyIEFOQ0hPUiA9IC9eW2Etel9dWy1hLXowLTkuX10qJC9pOwogICAgZnVuY3Rpb24gZ2V0U2NoZW1hUmVmcyhzY2hlbWEsIGJhc2VJZCkgewogICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAiYm9vbGVhbiIpCiAgICAgICAgcmV0dXJuIHt9OwogICAgICBjb25zdCB7IHNjaGVtYUlkLCB1cmlSZXNvbHZlciB9ID0gdGhpcy5vcHRzOwogICAgICBjb25zdCBzY2hJZCA9IG5vcm1hbGl6ZUlkKHNjaGVtYVtzY2hlbWFJZF0gfHwgYmFzZUlkKTsKICAgICAgY29uc3QgYmFzZUlkcyA9IHsgIiI6IHNjaElkIH07CiAgICAgIGNvbnN0IHBhdGhQcmVmaXggPSBnZXRGdWxsUGF0aCh1cmlSZXNvbHZlciwgc2NoSWQsIGZhbHNlKTsKICAgICAgY29uc3QgbG9jYWxSZWZzID0ge307CiAgICAgIGNvbnN0IHNjaGVtYVJlZnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICB0cmF2ZXJzZShzY2hlbWEsIHsgYWxsS2V5czogdHJ1ZSB9LCAoc2NoLCBqc29uUHRyLCBfLCBwYXJlbnRKc29uUHRyKSA9PiB7CiAgICAgICAgaWYgKHBhcmVudEpzb25QdHIgPT09IHZvaWQgMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhQcmVmaXggKyBqc29uUHRyOwogICAgICAgIGxldCBpbm5lckJhc2VJZCA9IGJhc2VJZHNbcGFyZW50SnNvblB0cl07CiAgICAgICAgaWYgKHR5cGVvZiBzY2hbc2NoZW1hSWRdID09ICJzdHJpbmciKQogICAgICAgICAgaW5uZXJCYXNlSWQgPSBhZGRSZWYuY2FsbCh0aGlzLCBzY2hbc2NoZW1hSWRdKTsKICAgICAgICBhZGRBbmNob3IuY2FsbCh0aGlzLCBzY2guJGFuY2hvcik7CiAgICAgICAgYWRkQW5jaG9yLmNhbGwodGhpcywgc2NoLiRkeW5hbWljQW5jaG9yKTsKICAgICAgICBiYXNlSWRzW2pzb25QdHJdID0gaW5uZXJCYXNlSWQ7CiAgICAgICAgZnVuY3Rpb24gYWRkUmVmKHJlZikgewogICAgICAgICAgY29uc3QgX3Jlc29sdmUgPSB0aGlzLm9wdHMudXJpUmVzb2x2ZXIucmVzb2x2ZTsKICAgICAgICAgIHJlZiA9IG5vcm1hbGl6ZUlkKGlubmVyQmFzZUlkID8gX3Jlc29sdmUoaW5uZXJCYXNlSWQsIHJlZikgOiByZWYpOwogICAgICAgICAgaWYgKHNjaGVtYVJlZnMuaGFzKHJlZikpCiAgICAgICAgICAgIHRocm93IGFtYmlndW9zKHJlZik7CiAgICAgICAgICBzY2hlbWFSZWZzLmFkZChyZWYpOwogICAgICAgICAgbGV0IHNjaE9yUmVmID0gdGhpcy5yZWZzW3JlZl07CiAgICAgICAgICBpZiAodHlwZW9mIHNjaE9yUmVmID09ICJzdHJpbmciKQogICAgICAgICAgICBzY2hPclJlZiA9IHRoaXMucmVmc1tzY2hPclJlZl07CiAgICAgICAgICBpZiAodHlwZW9mIHNjaE9yUmVmID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGNoZWNrQW1iaWd1b3NSZWYoc2NoLCBzY2hPclJlZi5zY2hlbWEsIHJlZik7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlZiAhPT0gbm9ybWFsaXplSWQoZnVsbFBhdGgpKSB7CiAgICAgICAgICAgIGlmIChyZWZbMF0gPT09ICIjIikgewogICAgICAgICAgICAgIGNoZWNrQW1iaWd1b3NSZWYoc2NoLCBsb2NhbFJlZnNbcmVmXSwgcmVmKTsKICAgICAgICAgICAgICBsb2NhbFJlZnNbcmVmXSA9IHNjaDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnJlZnNbcmVmXSA9IGZ1bGxQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVmOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhZGRBbmNob3IoYW5jaG9yKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGFuY2hvciA9PSAic3RyaW5nIikgewogICAgICAgICAgICBpZiAoIUFOQ0hPUi50ZXN0KGFuY2hvcikpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFuY2hvciAiJHthbmNob3J9ImApOwogICAgICAgICAgICBhZGRSZWYuY2FsbCh0aGlzLCBgIyR7YW5jaG9yfWApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBsb2NhbFJlZnM7CiAgICAgIGZ1bmN0aW9uIGNoZWNrQW1iaWd1b3NSZWYoc2NoMSwgc2NoMiwgcmVmKSB7CiAgICAgICAgaWYgKHNjaDIgIT09IHZvaWQgMCAmJiAhZXF1YWwoc2NoMSwgc2NoMikpCiAgICAgICAgICB0aHJvdyBhbWJpZ3VvcyhyZWYpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFtYmlndW9zKHJlZikgewogICAgICAgIHJldHVybiBuZXcgRXJyb3IoYHJlZmVyZW5jZSAiJHtyZWZ9IiByZXNvbHZlcyB0byBtb3JlIHRoYW4gb25lIHNjaGVtYWApOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5nZXRTY2hlbWFSZWZzID0gZ2V0U2NoZW1hUmVmczsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29tcGlsZS92YWxpZGF0ZS9pbmRleC5qcwp2YXIgcmVxdWlyZV92YWxpZGF0ZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL3ZhbGlkYXRlL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5nZXREYXRhID0gZXhwb3J0czIuS2V5d29yZEN4dCA9IGV4cG9ydHMyLnZhbGlkYXRlRnVuY3Rpb25Db2RlID0gdm9pZCAwOwogICAgdmFyIGJvb2xTY2hlbWFfMSA9IHJlcXVpcmVfYm9vbFNjaGVtYSgpOwogICAgdmFyIGRhdGFUeXBlXzEgPSByZXF1aXJlX2RhdGFUeXBlKCk7CiAgICB2YXIgYXBwbGljYWJpbGl0eV8xID0gcmVxdWlyZV9hcHBsaWNhYmlsaXR5KCk7CiAgICB2YXIgZGF0YVR5cGVfMiA9IHJlcXVpcmVfZGF0YVR5cGUoKTsKICAgIHZhciBkZWZhdWx0c18xID0gcmVxdWlyZV9kZWZhdWx0cygpOwogICAgdmFyIGtleXdvcmRfMSA9IHJlcXVpcmVfa2V5d29yZCgpOwogICAgdmFyIHN1YnNjaGVtYV8xID0gcmVxdWlyZV9zdWJzY2hlbWEoKTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciBuYW1lc18xID0gcmVxdWlyZV9uYW1lcygpOwogICAgdmFyIHJlc29sdmVfMSA9IHJlcXVpcmVfcmVzb2x2ZSgpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVycm9yc18xID0gcmVxdWlyZV9lcnJvcnMoKTsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db2RlKGl0KSB7CiAgICAgIGlmIChpc1NjaGVtYU9iaihpdCkpIHsKICAgICAgICBjaGVja0tleXdvcmRzKGl0KTsKICAgICAgICBpZiAoc2NoZW1hQ3h0SGFzUnVsZXMoaXQpKSB7CiAgICAgICAgICB0b3BTY2hlbWFPYmpDb2RlKGl0KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGVGdW5jdGlvbihpdCwgKCkgPT4gKDAsIGJvb2xTY2hlbWFfMS50b3BCb29sT3JFbXB0eVNjaGVtYSkoaXQpKTsKICAgIH0KICAgIGV4cG9ydHMyLnZhbGlkYXRlRnVuY3Rpb25Db2RlID0gdmFsaWRhdGVGdW5jdGlvbkNvZGU7CiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uKHsgZ2VuLCB2YWxpZGF0ZU5hbWUsIHNjaGVtYSwgc2NoZW1hRW52LCBvcHRzIH0sIGJvZHkpIHsKICAgICAgaWYgKG9wdHMuY29kZS5lczUpIHsKICAgICAgICBnZW4uZnVuYyh2YWxpZGF0ZU5hbWUsICgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQuZGF0YX0sICR7bmFtZXNfMS5kZWZhdWx0LnZhbEN4dH1gLCBzY2hlbWFFbnYuJGFzeW5jLCAoKSA9PiB7CiAgICAgICAgICBnZW4uY29kZSgoMCwgY29kZWdlbl8xLl8pYCJ1c2Ugc3RyaWN0IjsgJHtmdW5jU291cmNlVXJsKHNjaGVtYSwgb3B0cyl9YCk7CiAgICAgICAgICBkZXN0cnVjdHVyZVZhbEN4dEVTNShnZW4sIG9wdHMpOwogICAgICAgICAgZ2VuLmNvZGUoYm9keSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2VuLmZ1bmModmFsaWRhdGVOYW1lLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LmRhdGF9LCAke2Rlc3RydWN0dXJlVmFsQ3h0KG9wdHMpfWAsIHNjaGVtYUVudi4kYXN5bmMsICgpID0+IGdlbi5jb2RlKGZ1bmNTb3VyY2VVcmwoc2NoZW1hLCBvcHRzKSkuY29kZShib2R5KSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRlc3RydWN0dXJlVmFsQ3h0KG9wdHMpIHsKICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXylgeyR7bmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aH09IiIsICR7bmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGF9LCAke25hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9LCAke25hbWVzXzEuZGVmYXVsdC5yb290RGF0YX09JHtuYW1lc18xLmRlZmF1bHQuZGF0YX0ke29wdHMuZHluYW1pY1JlZiA/ICgwLCBjb2RlZ2VuXzEuXylgLCAke25hbWVzXzEuZGVmYXVsdC5keW5hbWljQW5jaG9yc309e31gIDogY29kZWdlbl8xLm5pbH19PXt9YDsKICAgIH0KICAgIGZ1bmN0aW9uIGRlc3RydWN0dXJlVmFsQ3h0RVM1KGdlbiwgb3B0cykgewogICAgICBnZW4uaWYobmFtZXNfMS5kZWZhdWx0LnZhbEN4dCwgKCkgPT4gewogICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgKDAsIGNvZGVnZW5fMS5fKWAke25hbWVzXzEuZGVmYXVsdC52YWxDeHR9LiR7bmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aH1gKTsKICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhLCAoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LnZhbEN4dH0uJHtuYW1lc18xLmRlZmF1bHQucGFyZW50RGF0YX1gKTsKICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksICgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudmFsQ3h0fS4ke25hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9YCk7CiAgICAgICAgZ2VuLnZhcihuYW1lc18xLmRlZmF1bHQucm9vdERhdGEsICgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudmFsQ3h0fS4ke25hbWVzXzEuZGVmYXVsdC5yb290RGF0YX1gKTsKICAgICAgICBpZiAob3B0cy5keW5hbWljUmVmKQogICAgICAgICAgZ2VuLnZhcihuYW1lc18xLmRlZmF1bHQuZHluYW1pY0FuY2hvcnMsICgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudmFsQ3h0fS4ke25hbWVzXzEuZGVmYXVsdC5keW5hbWljQW5jaG9yc31gKTsKICAgICAgfSwgKCkgPT4gewogICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0Lmluc3RhbmNlUGF0aCwgKDAsIGNvZGVnZW5fMS5fKWAiImApOwogICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGEsICgwLCBjb2RlZ2VuXzEuXylgdW5kZWZpbmVkYCk7CiAgICAgICAgZ2VuLnZhcihuYW1lc18xLmRlZmF1bHQucGFyZW50RGF0YVByb3BlcnR5LCAoMCwgY29kZWdlbl8xLl8pYHVuZGVmaW5lZGApOwogICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnJvb3REYXRhLCBuYW1lc18xLmRlZmF1bHQuZGF0YSk7CiAgICAgICAgaWYgKG9wdHMuZHluYW1pY1JlZikKICAgICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCAoMCwgY29kZWdlbl8xLl8pYHt9YCk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gdG9wU2NoZW1hT2JqQ29kZShpdCkgewogICAgICBjb25zdCB7IHNjaGVtYSwgb3B0cywgZ2VuIH0gPSBpdDsKICAgICAgdmFsaWRhdGVGdW5jdGlvbihpdCwgKCkgPT4gewogICAgICAgIGlmIChvcHRzLiRjb21tZW50ICYmIHNjaGVtYS4kY29tbWVudCkKICAgICAgICAgIGNvbW1lbnRLZXl3b3JkKGl0KTsKICAgICAgICBjaGVja05vRGVmYXVsdChpdCk7CiAgICAgICAgZ2VuLmxldChuYW1lc18xLmRlZmF1bHQudkVycm9ycywgbnVsbCk7CiAgICAgICAgZ2VuLmxldChuYW1lc18xLmRlZmF1bHQuZXJyb3JzLCAwKTsKICAgICAgICBpZiAob3B0cy51bmV2YWx1YXRlZCkKICAgICAgICAgIHJlc2V0RXZhbHVhdGVkKGl0KTsKICAgICAgICB0eXBlQW5kS2V5d29yZHMoaXQpOwogICAgICAgIHJldHVyblJlc3VsdHMoaXQpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRFdmFsdWF0ZWQoaXQpIHsKICAgICAgY29uc3QgeyBnZW4sIHZhbGlkYXRlTmFtZSB9ID0gaXQ7CiAgICAgIGl0LmV2YWx1YXRlZCA9IGdlbi5jb25zdCgiZXZhbHVhdGVkIiwgKDAsIGNvZGVnZW5fMS5fKWAke3ZhbGlkYXRlTmFtZX0uZXZhbHVhdGVkYCk7CiAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7aXQuZXZhbHVhdGVkfS5keW5hbWljUHJvcHNgLCAoKSA9PiBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHtpdC5ldmFsdWF0ZWR9LnByb3BzYCwgKDAsIGNvZGVnZW5fMS5fKWB1bmRlZmluZWRgKSk7CiAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7aXQuZXZhbHVhdGVkfS5keW5hbWljSXRlbXNgLCAoKSA9PiBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHtpdC5ldmFsdWF0ZWR9Lml0ZW1zYCwgKDAsIGNvZGVnZW5fMS5fKWB1bmRlZmluZWRgKSk7CiAgICB9CiAgICBmdW5jdGlvbiBmdW5jU291cmNlVXJsKHNjaGVtYSwgb3B0cykgewogICAgICBjb25zdCBzY2hJZCA9IHR5cGVvZiBzY2hlbWEgPT0gIm9iamVjdCIgJiYgc2NoZW1hW29wdHMuc2NoZW1hSWRdOwogICAgICByZXR1cm4gc2NoSWQgJiYgKG9wdHMuY29kZS5zb3VyY2UgfHwgb3B0cy5jb2RlLnByb2Nlc3MpID8gKDAsIGNvZGVnZW5fMS5fKWAvKiMgc291cmNlVVJMPSR7c2NoSWR9ICovYCA6IGNvZGVnZW5fMS5uaWw7CiAgICB9CiAgICBmdW5jdGlvbiBzdWJzY2hlbWFDb2RlKGl0LCB2YWxpZCkgewogICAgICBpZiAoaXNTY2hlbWFPYmooaXQpKSB7CiAgICAgICAgY2hlY2tLZXl3b3JkcyhpdCk7CiAgICAgICAgaWYgKHNjaGVtYUN4dEhhc1J1bGVzKGl0KSkgewogICAgICAgICAgc3ViU2NoZW1hT2JqQ29kZShpdCwgdmFsaWQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICAoMCwgYm9vbFNjaGVtYV8xLmJvb2xPckVtcHR5U2NoZW1hKShpdCwgdmFsaWQpOwogICAgfQogICAgZnVuY3Rpb24gc2NoZW1hQ3h0SGFzUnVsZXMoeyBzY2hlbWEsIHNlbGY6IHNlbGYyIH0pIHsKICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT0gImJvb2xlYW4iKQogICAgICAgIHJldHVybiAhc2NoZW1hOwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpCiAgICAgICAgaWYgKHNlbGYyLlJVTEVTLmFsbFtrZXldKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzU2NoZW1hT2JqKGl0KSB7CiAgICAgIHJldHVybiB0eXBlb2YgaXQuc2NoZW1hICE9ICJib29sZWFuIjsKICAgIH0KICAgIGZ1bmN0aW9uIHN1YlNjaGVtYU9iakNvZGUoaXQsIHZhbGlkKSB7CiAgICAgIGNvbnN0IHsgc2NoZW1hLCBnZW4sIG9wdHMgfSA9IGl0OwogICAgICBpZiAob3B0cy4kY29tbWVudCAmJiBzY2hlbWEuJGNvbW1lbnQpCiAgICAgICAgY29tbWVudEtleXdvcmQoaXQpOwogICAgICB1cGRhdGVDb250ZXh0KGl0KTsKICAgICAgY2hlY2tBc3luY1NjaGVtYShpdCk7CiAgICAgIGNvbnN0IGVycnNDb3VudCA9IGdlbi5jb25zdCgiX2VycnMiLCBuYW1lc18xLmRlZmF1bHQuZXJyb3JzKTsKICAgICAgdHlwZUFuZEtleXdvcmRzKGl0LCBlcnJzQ291bnQpOwogICAgICBnZW4udmFyKHZhbGlkLCAoMCwgY29kZWdlbl8xLl8pYCR7ZXJyc0NvdW50fSA9PT0gJHtuYW1lc18xLmRlZmF1bHQuZXJyb3JzfWApOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tLZXl3b3JkcyhpdCkgewogICAgICAoMCwgdXRpbF8xLmNoZWNrVW5rbm93blJ1bGVzKShpdCk7CiAgICAgIGNoZWNrUmVmc0FuZEtleXdvcmRzKGl0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHR5cGVBbmRLZXl3b3JkcyhpdCwgZXJyc0NvdW50KSB7CiAgICAgIGlmIChpdC5vcHRzLmp0ZCkKICAgICAgICByZXR1cm4gc2NoZW1hS2V5d29yZHMoaXQsIFtdLCBmYWxzZSwgZXJyc0NvdW50KTsKICAgICAgY29uc3QgdHlwZXMgPSAoMCwgZGF0YVR5cGVfMS5nZXRTY2hlbWFUeXBlcykoaXQuc2NoZW1hKTsKICAgICAgY29uc3QgY2hlY2tlZFR5cGVzID0gKDAsIGRhdGFUeXBlXzEuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSkoaXQsIHR5cGVzKTsKICAgICAgc2NoZW1hS2V5d29yZHMoaXQsIHR5cGVzLCAhY2hlY2tlZFR5cGVzLCBlcnJzQ291bnQpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tSZWZzQW5kS2V5d29yZHMoaXQpIHsKICAgICAgY29uc3QgeyBzY2hlbWEsIGVyclNjaGVtYVBhdGgsIG9wdHMsIHNlbGY6IHNlbGYyIH0gPSBpdDsKICAgICAgaWYgKHNjaGVtYS4kcmVmICYmIG9wdHMuaWdub3JlS2V5d29yZHNXaXRoUmVmICYmICgwLCB1dGlsXzEuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKHNjaGVtYSwgc2VsZjIuUlVMRVMpKSB7CiAgICAgICAgc2VsZjIubG9nZ2VyLndhcm4oYCRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggIiR7ZXJyU2NoZW1hUGF0aH0iYCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNoZWNrTm9EZWZhdWx0KGl0KSB7CiAgICAgIGNvbnN0IHsgc2NoZW1hLCBvcHRzIH0gPSBpdDsKICAgICAgaWYgKHNjaGVtYS5kZWZhdWx0ICE9PSB2b2lkIDAgJiYgb3B0cy51c2VEZWZhdWx0cyAmJiBvcHRzLnN0cmljdFNjaGVtYSkgewogICAgICAgICgwLCB1dGlsXzEuY2hlY2tTdHJpY3RNb2RlKShpdCwgImRlZmF1bHQgaXMgaWdub3JlZCBpbiB0aGUgc2NoZW1hIHJvb3QiKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dChpdCkgewogICAgICBjb25zdCBzY2hJZCA9IGl0LnNjaGVtYVtpdC5vcHRzLnNjaGVtYUlkXTsKICAgICAgaWYgKHNjaElkKQogICAgICAgIGl0LmJhc2VJZCA9ICgwLCByZXNvbHZlXzEucmVzb2x2ZVVybCkoaXQub3B0cy51cmlSZXNvbHZlciwgaXQuYmFzZUlkLCBzY2hJZCk7CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja0FzeW5jU2NoZW1hKGl0KSB7CiAgICAgIGlmIChpdC5zY2hlbWEuJGFzeW5jICYmICFpdC5zY2hlbWFFbnYuJGFzeW5jKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiYXN5bmMgc2NoZW1hIGluIHN5bmMgc2NoZW1hIik7CiAgICB9CiAgICBmdW5jdGlvbiBjb21tZW50S2V5d29yZCh7IGdlbiwgc2NoZW1hRW52LCBzY2hlbWEsIGVyclNjaGVtYVBhdGgsIG9wdHMgfSkgewogICAgICBjb25zdCBtc2cgPSBzY2hlbWEuJGNvbW1lbnQ7CiAgICAgIGlmIChvcHRzLiRjb21tZW50ID09PSB0cnVlKSB7CiAgICAgICAgZ2VuLmNvZGUoKDAsIGNvZGVnZW5fMS5fKWAke25hbWVzXzEuZGVmYXVsdC5zZWxmfS5sb2dnZXIubG9nKCR7bXNnfSlgKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy4kY29tbWVudCA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9ICgwLCBjb2RlZ2VuXzEuc3RyKWAke2VyclNjaGVtYVBhdGh9LyRjb21tZW50YDsKICAgICAgICBjb25zdCByb290TmFtZSA9IGdlbi5zY29wZVZhbHVlKCJyb290IiwgeyByZWY6IHNjaGVtYUVudi5yb290IH0pOwogICAgICAgIGdlbi5jb2RlKCgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQuc2VsZn0ub3B0cy4kY29tbWVudCgke21zZ30sICR7c2NoZW1hUGF0aH0sICR7cm9vdE5hbWV9LnNjaGVtYSlgKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcmV0dXJuUmVzdWx0cyhpdCkgewogICAgICBjb25zdCB7IGdlbiwgc2NoZW1hRW52LCB2YWxpZGF0ZU5hbWUsIFZhbGlkYXRpb25FcnJvciwgb3B0cyB9ID0gaXQ7CiAgICAgIGlmIChzY2hlbWFFbnYuJGFzeW5jKSB7CiAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQuZXJyb3JzfSA9PT0gMGAsICgpID0+IGdlbi5yZXR1cm4obmFtZXNfMS5kZWZhdWx0LmRhdGEpLCAoKSA9PiBnZW4udGhyb3coKDAsIGNvZGVnZW5fMS5fKWBuZXcgJHtWYWxpZGF0aW9uRXJyb3J9KCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9KWApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXylgJHt2YWxpZGF0ZU5hbWV9LmVycm9yc2AsIG5hbWVzXzEuZGVmYXVsdC52RXJyb3JzKTsKICAgICAgICBpZiAob3B0cy51bmV2YWx1YXRlZCkKICAgICAgICAgIGFzc2lnbkV2YWx1YXRlZChpdCk7CiAgICAgICAgZ2VuLnJldHVybigoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LmVycm9yc30gPT09IDBgKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXNzaWduRXZhbHVhdGVkKHsgZ2VuLCBldmFsdWF0ZWQsIHByb3BzLCBpdGVtcyB9KSB7CiAgICAgIGlmIChwcm9wcyBpbnN0YW5jZW9mIGNvZGVnZW5fMS5OYW1lKQogICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke2V2YWx1YXRlZH0ucHJvcHNgLCBwcm9wcyk7CiAgICAgIGlmIChpdGVtcyBpbnN0YW5jZW9mIGNvZGVnZW5fMS5OYW1lKQogICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke2V2YWx1YXRlZH0uaXRlbXNgLCBpdGVtcyk7CiAgICB9CiAgICBmdW5jdGlvbiBzY2hlbWFLZXl3b3JkcyhpdCwgdHlwZXMsIHR5cGVFcnJvcnMsIGVycnNDb3VudCkgewogICAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCBkYXRhLCBhbGxFcnJvcnMsIG9wdHMsIHNlbGY6IHNlbGYyIH0gPSBpdDsKICAgICAgY29uc3QgeyBSVUxFUyB9ID0gc2VsZjI7CiAgICAgIGlmIChzY2hlbWEuJHJlZiAmJiAob3B0cy5pZ25vcmVLZXl3b3Jkc1dpdGhSZWYgfHwgISgwLCB1dGlsXzEuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKHNjaGVtYSwgUlVMRVMpKSkgewogICAgICAgIGdlbi5ibG9jaygoKSA9PiBrZXl3b3JkQ29kZShpdCwgIiRyZWYiLCBSVUxFUy5hbGwuJHJlZi5kZWZpbml0aW9uKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghb3B0cy5qdGQpCiAgICAgICAgY2hlY2tTdHJpY3RUeXBlcyhpdCwgdHlwZXMpOwogICAgICBnZW4uYmxvY2soKCkgPT4gewogICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgUlVMRVMucnVsZXMpCiAgICAgICAgICBncm91cEtleXdvcmRzKGdyb3VwKTsKICAgICAgICBncm91cEtleXdvcmRzKFJVTEVTLnBvc3QpOwogICAgICB9KTsKICAgICAgZnVuY3Rpb24gZ3JvdXBLZXl3b3Jkcyhncm91cCkgewogICAgICAgIGlmICghKDAsIGFwcGxpY2FiaWxpdHlfMS5zaG91bGRVc2VHcm91cCkoc2NoZW1hLCBncm91cCkpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGdyb3VwLnR5cGUpIHsKICAgICAgICAgIGdlbi5pZigoMCwgZGF0YVR5cGVfMi5jaGVja0RhdGFUeXBlKShncm91cC50eXBlLCBkYXRhLCBvcHRzLnN0cmljdE51bWJlcnMpKTsKICAgICAgICAgIGl0ZXJhdGVLZXl3b3JkcyhpdCwgZ3JvdXApOwogICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMSAmJiB0eXBlc1swXSA9PT0gZ3JvdXAudHlwZSAmJiB0eXBlRXJyb3JzKSB7CiAgICAgICAgICAgIGdlbi5lbHNlKCk7CiAgICAgICAgICAgICgwLCBkYXRhVHlwZV8yLnJlcG9ydFR5cGVFcnJvcikoaXQpOwogICAgICAgICAgfQogICAgICAgICAgZ2VuLmVuZElmKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGl0ZXJhdGVLZXl3b3JkcyhpdCwgZ3JvdXApOwogICAgICAgIH0KICAgICAgICBpZiAoIWFsbEVycm9ycykKICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7bmFtZXNfMS5kZWZhdWx0LmVycm9yc30gPT09ICR7ZXJyc0NvdW50IHx8IDB9YCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGl0ZXJhdGVLZXl3b3JkcyhpdCwgZ3JvdXApIHsKICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYSwgb3B0czogeyB1c2VEZWZhdWx0cyB9IH0gPSBpdDsKICAgICAgaWYgKHVzZURlZmF1bHRzKQogICAgICAgICgwLCBkZWZhdWx0c18xLmFzc2lnbkRlZmF1bHRzKShpdCwgZ3JvdXAudHlwZSk7CiAgICAgIGdlbi5ibG9jaygoKSA9PiB7CiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGdyb3VwLnJ1bGVzKSB7CiAgICAgICAgICBpZiAoKDAsIGFwcGxpY2FiaWxpdHlfMS5zaG91bGRVc2VSdWxlKShzY2hlbWEsIHJ1bGUpKSB7CiAgICAgICAgICAgIGtleXdvcmRDb2RlKGl0LCBydWxlLmtleXdvcmQsIHJ1bGUuZGVmaW5pdGlvbiwgZ3JvdXAudHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoZWNrU3RyaWN0VHlwZXMoaXQsIHR5cGVzKSB7CiAgICAgIGlmIChpdC5zY2hlbWFFbnYubWV0YSB8fCAhaXQub3B0cy5zdHJpY3RUeXBlcykKICAgICAgICByZXR1cm47CiAgICAgIGNoZWNrQ29udGV4dFR5cGVzKGl0LCB0eXBlcyk7CiAgICAgIGlmICghaXQub3B0cy5hbGxvd1VuaW9uVHlwZXMpCiAgICAgICAgY2hlY2tNdWx0aXBsZVR5cGVzKGl0LCB0eXBlcyk7CiAgICAgIGNoZWNrS2V5d29yZFR5cGVzKGl0LCBpdC5kYXRhVHlwZXMpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tDb250ZXh0VHlwZXMoaXQsIHR5cGVzKSB7CiAgICAgIGlmICghdHlwZXMubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKCFpdC5kYXRhVHlwZXMubGVuZ3RoKSB7CiAgICAgICAgaXQuZGF0YVR5cGVzID0gdHlwZXM7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHR5cGVzLmZvckVhY2goKHQpID0+IHsKICAgICAgICBpZiAoIWluY2x1ZGVzVHlwZShpdC5kYXRhVHlwZXMsIHQpKSB7CiAgICAgICAgICBzdHJpY3RUeXBlc0Vycm9yKGl0LCBgdHlwZSAiJHt0fSIgbm90IGFsbG93ZWQgYnkgY29udGV4dCAiJHtpdC5kYXRhVHlwZXMuam9pbigiLCIpfSJgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBuYXJyb3dTY2hlbWFUeXBlcyhpdCwgdHlwZXMpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tNdWx0aXBsZVR5cGVzKGl0LCB0cykgewogICAgICBpZiAodHMubGVuZ3RoID4gMSAmJiAhKHRzLmxlbmd0aCA9PT0gMiAmJiB0cy5pbmNsdWRlcygibnVsbCIpKSkgewogICAgICAgIHN0cmljdFR5cGVzRXJyb3IoaXQsICJ1c2UgYWxsb3dVbmlvblR5cGVzIHRvIGFsbG93IHVuaW9uIHR5cGUga2V5d29yZCIpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja0tleXdvcmRUeXBlcyhpdCwgdHMpIHsKICAgICAgY29uc3QgcnVsZXMgPSBpdC5zZWxmLlJVTEVTLmFsbDsKICAgICAgZm9yIChjb25zdCBrZXl3b3JkIGluIHJ1bGVzKSB7CiAgICAgICAgY29uc3QgcnVsZSA9IHJ1bGVzW2tleXdvcmRdOwogICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PSAib2JqZWN0IiAmJiAoMCwgYXBwbGljYWJpbGl0eV8xLnNob3VsZFVzZVJ1bGUpKGl0LnNjaGVtYSwgcnVsZSkpIHsKICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gcnVsZS5kZWZpbml0aW9uOwogICAgICAgICAgaWYgKHR5cGUubGVuZ3RoICYmICF0eXBlLnNvbWUoKHQpID0+IGhhc0FwcGxpY2FibGVUeXBlKHRzLCB0KSkpIHsKICAgICAgICAgICAgc3RyaWN0VHlwZXNFcnJvcihpdCwgYG1pc3NpbmcgdHlwZSAiJHt0eXBlLmpvaW4oIiwiKX0iIGZvciBrZXl3b3JkICIke2tleXdvcmR9ImApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaGFzQXBwbGljYWJsZVR5cGUoc2NoVHMsIGt3ZFQpIHsKICAgICAgcmV0dXJuIHNjaFRzLmluY2x1ZGVzKGt3ZFQpIHx8IGt3ZFQgPT09ICJudW1iZXIiICYmIHNjaFRzLmluY2x1ZGVzKCJpbnRlZ2VyIik7CiAgICB9CiAgICBmdW5jdGlvbiBpbmNsdWRlc1R5cGUodHMsIHQpIHsKICAgICAgcmV0dXJuIHRzLmluY2x1ZGVzKHQpIHx8IHQgPT09ICJpbnRlZ2VyIiAmJiB0cy5pbmNsdWRlcygibnVtYmVyIik7CiAgICB9CiAgICBmdW5jdGlvbiBuYXJyb3dTY2hlbWFUeXBlcyhpdCwgd2l0aFR5cGVzKSB7CiAgICAgIGNvbnN0IHRzID0gW107CiAgICAgIGZvciAoY29uc3QgdCBvZiBpdC5kYXRhVHlwZXMpIHsKICAgICAgICBpZiAoaW5jbHVkZXNUeXBlKHdpdGhUeXBlcywgdCkpCiAgICAgICAgICB0cy5wdXNoKHQpOwogICAgICAgIGVsc2UgaWYgKHdpdGhUeXBlcy5pbmNsdWRlcygiaW50ZWdlciIpICYmIHQgPT09ICJudW1iZXIiKQogICAgICAgICAgdHMucHVzaCgiaW50ZWdlciIpOwogICAgICB9CiAgICAgIGl0LmRhdGFUeXBlcyA9IHRzOwogICAgfQogICAgZnVuY3Rpb24gc3RyaWN0VHlwZXNFcnJvcihpdCwgbXNnKSB7CiAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSBpdC5zY2hlbWFFbnYuYmFzZUlkICsgaXQuZXJyU2NoZW1hUGF0aDsKICAgICAgbXNnICs9IGAgYXQgIiR7c2NoZW1hUGF0aH0iIChzdHJpY3RUeXBlcylgOwogICAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIG1zZywgaXQub3B0cy5zdHJpY3RUeXBlcyk7CiAgICB9CiAgICB2YXIgS2V5d29yZEN4dCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoaXQsIGRlZiwga2V5d29yZCkgewogICAgICAgICgwLCBrZXl3b3JkXzEudmFsaWRhdGVLZXl3b3JkVXNhZ2UpKGl0LCBkZWYsIGtleXdvcmQpOwogICAgICAgIHRoaXMuZ2VuID0gaXQuZ2VuOwogICAgICAgIHRoaXMuYWxsRXJyb3JzID0gaXQuYWxsRXJyb3JzOwogICAgICAgIHRoaXMua2V5d29yZCA9IGtleXdvcmQ7CiAgICAgICAgdGhpcy5kYXRhID0gaXQuZGF0YTsKICAgICAgICB0aGlzLnNjaGVtYSA9IGl0LnNjaGVtYVtrZXl3b3JkXTsKICAgICAgICB0aGlzLiRkYXRhID0gZGVmLiRkYXRhICYmIGl0Lm9wdHMuJGRhdGEgJiYgdGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuJGRhdGE7CiAgICAgICAgdGhpcy5zY2hlbWFWYWx1ZSA9ICgwLCB1dGlsXzEuc2NoZW1hUmVmT3JWYWwpKGl0LCB0aGlzLnNjaGVtYSwga2V5d29yZCwgdGhpcy4kZGF0YSk7CiAgICAgICAgdGhpcy5zY2hlbWFUeXBlID0gZGVmLnNjaGVtYVR5cGU7CiAgICAgICAgdGhpcy5wYXJlbnRTY2hlbWEgPSBpdC5zY2hlbWE7CiAgICAgICAgdGhpcy5wYXJhbXMgPSB7fTsKICAgICAgICB0aGlzLml0ID0gaXQ7CiAgICAgICAgdGhpcy5kZWYgPSBkZWY7CiAgICAgICAgaWYgKHRoaXMuJGRhdGEpIHsKICAgICAgICAgIHRoaXMuc2NoZW1hQ29kZSA9IGl0Lmdlbi5jb25zdCgidlNjaGVtYSIsIGdldERhdGEodGhpcy4kZGF0YSwgaXQpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zY2hlbWFDb2RlID0gdGhpcy5zY2hlbWFWYWx1ZTsKICAgICAgICAgIGlmICghKDAsIGtleXdvcmRfMS52YWxpZFNjaGVtYVR5cGUpKHRoaXMuc2NoZW1hLCBkZWYuc2NoZW1hVHlwZSwgZGVmLmFsbG93VW5kZWZpbmVkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5d29yZH0gdmFsdWUgbXVzdCBiZSAke0pTT04uc3RyaW5naWZ5KGRlZi5zY2hlbWFUeXBlKX1gKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJjb2RlIiBpbiBkZWYgPyBkZWYudHJhY2tFcnJvcnMgOiBkZWYuZXJyb3JzICE9PSBmYWxzZSkgewogICAgICAgICAgdGhpcy5lcnJzQ291bnQgPSBpdC5nZW4uY29uc3QoIl9lcnJzIiwgbmFtZXNfMS5kZWZhdWx0LmVycm9ycyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VsdChjb25kaXRpb24sIHN1Y2Nlc3NBY3Rpb24sIGZhaWxBY3Rpb24pIHsKICAgICAgICB0aGlzLmZhaWxSZXN1bHQoKDAsIGNvZGVnZW5fMS5ub3QpKGNvbmRpdGlvbiksIHN1Y2Nlc3NBY3Rpb24sIGZhaWxBY3Rpb24pOwogICAgICB9CiAgICAgIGZhaWxSZXN1bHQoY29uZGl0aW9uLCBzdWNjZXNzQWN0aW9uLCBmYWlsQWN0aW9uKSB7CiAgICAgICAgdGhpcy5nZW4uaWYoY29uZGl0aW9uKTsKICAgICAgICBpZiAoZmFpbEFjdGlvbikKICAgICAgICAgIGZhaWxBY3Rpb24oKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmVycm9yKCk7CiAgICAgICAgaWYgKHN1Y2Nlc3NBY3Rpb24pIHsKICAgICAgICAgIHRoaXMuZ2VuLmVsc2UoKTsKICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24oKTsKICAgICAgICAgIGlmICh0aGlzLmFsbEVycm9ycykKICAgICAgICAgICAgdGhpcy5nZW4uZW5kSWYoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuYWxsRXJyb3JzKQogICAgICAgICAgICB0aGlzLmdlbi5lbmRJZigpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLmdlbi5lbHNlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHBhc3MoY29uZGl0aW9uLCBmYWlsQWN0aW9uKSB7CiAgICAgICAgdGhpcy5mYWlsUmVzdWx0KCgwLCBjb2RlZ2VuXzEubm90KShjb25kaXRpb24pLCB2b2lkIDAsIGZhaWxBY3Rpb24pOwogICAgICB9CiAgICAgIGZhaWwoY29uZGl0aW9uKSB7CiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLmVycm9yKCk7CiAgICAgICAgICBpZiAoIXRoaXMuYWxsRXJyb3JzKQogICAgICAgICAgICB0aGlzLmdlbi5pZihmYWxzZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2VuLmlmKGNvbmRpdGlvbik7CiAgICAgICAgdGhpcy5lcnJvcigpOwogICAgICAgIGlmICh0aGlzLmFsbEVycm9ycykKICAgICAgICAgIHRoaXMuZ2VuLmVuZElmKCk7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5nZW4uZWxzZSgpOwogICAgICB9CiAgICAgIGZhaWwkZGF0YShjb25kaXRpb24pIHsKICAgICAgICBpZiAoIXRoaXMuJGRhdGEpCiAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsKGNvbmRpdGlvbik7CiAgICAgICAgY29uc3QgeyBzY2hlbWFDb2RlIH0gPSB0aGlzOwogICAgICAgIHRoaXMuZmFpbCgoMCwgY29kZWdlbl8xLl8pYCR7c2NoZW1hQ29kZX0gIT09IHVuZGVmaW5lZCAmJiAoJHsoMCwgY29kZWdlbl8xLm9yKSh0aGlzLmludmFsaWQkZGF0YSgpLCBjb25kaXRpb24pfSlgKTsKICAgICAgfQogICAgICBlcnJvcihhcHBlbmQsIGVycm9yUGFyYW1zLCBlcnJvclBhdGhzKSB7CiAgICAgICAgaWYgKGVycm9yUGFyYW1zKSB7CiAgICAgICAgICB0aGlzLnNldFBhcmFtcyhlcnJvclBhcmFtcyk7CiAgICAgICAgICB0aGlzLl9lcnJvcihhcHBlbmQsIGVycm9yUGF0aHMpOwogICAgICAgICAgdGhpcy5zZXRQYXJhbXMoe30pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lcnJvcihhcHBlbmQsIGVycm9yUGF0aHMpOwogICAgICB9CiAgICAgIF9lcnJvcihhcHBlbmQsIGVycm9yUGF0aHMpIHsKICAgICAgICA7CiAgICAgICAgKGFwcGVuZCA/IGVycm9yc18xLnJlcG9ydEV4dHJhRXJyb3IgOiBlcnJvcnNfMS5yZXBvcnRFcnJvcikodGhpcywgdGhpcy5kZWYuZXJyb3IsIGVycm9yUGF0aHMpOwogICAgICB9CiAgICAgICRkYXRhRXJyb3IoKSB7CiAgICAgICAgKDAsIGVycm9yc18xLnJlcG9ydEVycm9yKSh0aGlzLCB0aGlzLmRlZi4kZGF0YUVycm9yIHx8IGVycm9yc18xLmtleXdvcmQkRGF0YUVycm9yKTsKICAgICAgfQogICAgICByZXNldCgpIHsKICAgICAgICBpZiAodGhpcy5lcnJzQ291bnQgPT09IHZvaWQgMCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYWRkICJ0cmFja0Vycm9ycyIgdG8ga2V5d29yZCBkZWZpbml0aW9uJyk7CiAgICAgICAgKDAsIGVycm9yc18xLnJlc2V0RXJyb3JzQ291bnQpKHRoaXMuZ2VuLCB0aGlzLmVycnNDb3VudCk7CiAgICAgIH0KICAgICAgb2soY29uZCkgewogICAgICAgIGlmICghdGhpcy5hbGxFcnJvcnMpCiAgICAgICAgICB0aGlzLmdlbi5pZihjb25kKTsKICAgICAgfQogICAgICBzZXRQYXJhbXMob2JqLCBhc3NpZ24pIHsKICAgICAgICBpZiAoYXNzaWduKQogICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgb2JqKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLnBhcmFtcyA9IG9iajsKICAgICAgfQogICAgICBibG9jayRkYXRhKHZhbGlkLCBjb2RlQmxvY2ssICRkYXRhVmFsaWQgPSBjb2RlZ2VuXzEubmlsKSB7CiAgICAgICAgdGhpcy5nZW4uYmxvY2soKCkgPT4gewogICAgICAgICAgdGhpcy5jaGVjayRkYXRhKHZhbGlkLCAkZGF0YVZhbGlkKTsKICAgICAgICAgIGNvZGVCbG9jaygpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNoZWNrJGRhdGEodmFsaWQgPSBjb2RlZ2VuXzEubmlsLCAkZGF0YVZhbGlkID0gY29kZWdlbl8xLm5pbCkgewogICAgICAgIGlmICghdGhpcy4kZGF0YSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCB7IGdlbiwgc2NoZW1hQ29kZSwgc2NoZW1hVHlwZSwgZGVmIH0gPSB0aGlzOwogICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLm9yKSgoMCwgY29kZWdlbl8xLl8pYCR7c2NoZW1hQ29kZX0gPT09IHVuZGVmaW5lZGAsICRkYXRhVmFsaWQpKTsKICAgICAgICBpZiAodmFsaWQgIT09IGNvZGVnZW5fMS5uaWwpCiAgICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCB0cnVlKTsKICAgICAgICBpZiAoc2NoZW1hVHlwZS5sZW5ndGggfHwgZGVmLnZhbGlkYXRlU2NoZW1hKSB7CiAgICAgICAgICBnZW4uZWxzZUlmKHRoaXMuaW52YWxpZCRkYXRhKCkpOwogICAgICAgICAgdGhpcy4kZGF0YUVycm9yKCk7CiAgICAgICAgICBpZiAodmFsaWQgIT09IGNvZGVnZW5fMS5uaWwpCiAgICAgICAgICAgIGdlbi5hc3NpZ24odmFsaWQsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgZ2VuLmVsc2UoKTsKICAgICAgfQogICAgICBpbnZhbGlkJGRhdGEoKSB7CiAgICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYUNvZGUsIHNjaGVtYVR5cGUsIGRlZiwgaXQgfSA9IHRoaXM7CiAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEub3IpKHdyb25nJERhdGFUeXBlKCksIGludmFsaWQkRGF0YVNjaGVtYSgpKTsKICAgICAgICBmdW5jdGlvbiB3cm9uZyREYXRhVHlwZSgpIHsKICAgICAgICAgIGlmIChzY2hlbWFUeXBlLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIShzY2hlbWFDb2RlIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUpKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgICAgICAgIGNvbnN0IHN0ID0gQXJyYXkuaXNBcnJheShzY2hlbWFUeXBlKSA/IHNjaGVtYVR5cGUgOiBbc2NoZW1hVHlwZV07CiAgICAgICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLl8pYCR7KDAsIGRhdGFUeXBlXzIuY2hlY2tEYXRhVHlwZXMpKHN0LCBzY2hlbWFDb2RlLCBpdC5vcHRzLnN0cmljdE51bWJlcnMsIGRhdGFUeXBlXzIuRGF0YVR5cGUuV3JvbmcpfWA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29kZWdlbl8xLm5pbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW52YWxpZCREYXRhU2NoZW1hKCkgewogICAgICAgICAgaWYgKGRlZi52YWxpZGF0ZVNjaGVtYSkgewogICAgICAgICAgICBjb25zdCB2YWxpZGF0ZVNjaGVtYVJlZiA9IGdlbi5zY29wZVZhbHVlKCJ2YWxpZGF0ZSRkYXRhIiwgeyByZWY6IGRlZi52YWxpZGF0ZVNjaGVtYSB9KTsKICAgICAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXylgISR7dmFsaWRhdGVTY2hlbWFSZWZ9KCR7c2NoZW1hQ29kZX0pYDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjb2RlZ2VuXzEubmlsOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJzY2hlbWEoYXBwbCwgdmFsaWQpIHsKICAgICAgICBjb25zdCBzdWJzY2hlbWEgPSAoMCwgc3Vic2NoZW1hXzEuZ2V0U3Vic2NoZW1hKSh0aGlzLml0LCBhcHBsKTsKICAgICAgICAoMCwgc3Vic2NoZW1hXzEuZXh0ZW5kU3Vic2NoZW1hRGF0YSkoc3Vic2NoZW1hLCB0aGlzLml0LCBhcHBsKTsKICAgICAgICAoMCwgc3Vic2NoZW1hXzEuZXh0ZW5kU3Vic2NoZW1hTW9kZSkoc3Vic2NoZW1hLCBhcHBsKTsKICAgICAgICBjb25zdCBuZXh0Q29udGV4dCA9IHsgLi4udGhpcy5pdCwgLi4uc3Vic2NoZW1hLCBpdGVtczogdm9pZCAwLCBwcm9wczogdm9pZCAwIH07CiAgICAgICAgc3Vic2NoZW1hQ29kZShuZXh0Q29udGV4dCwgdmFsaWQpOwogICAgICAgIHJldHVybiBuZXh0Q29udGV4dDsKICAgICAgfQogICAgICBtZXJnZUV2YWx1YXRlZChzY2hlbWFDeHQsIHRvTmFtZSkgewogICAgICAgIGNvbnN0IHsgaXQsIGdlbiB9ID0gdGhpczsKICAgICAgICBpZiAoIWl0Lm9wdHMudW5ldmFsdWF0ZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGl0LnByb3BzICE9PSB0cnVlICYmIHNjaGVtYUN4dC5wcm9wcyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICBpdC5wcm9wcyA9IHV0aWxfMS5tZXJnZUV2YWx1YXRlZC5wcm9wcyhnZW4sIHNjaGVtYUN4dC5wcm9wcywgaXQucHJvcHMsIHRvTmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpdC5pdGVtcyAhPT0gdHJ1ZSAmJiBzY2hlbWFDeHQuaXRlbXMgIT09IHZvaWQgMCkgewogICAgICAgICAgaXQuaXRlbXMgPSB1dGlsXzEubWVyZ2VFdmFsdWF0ZWQuaXRlbXMoZ2VuLCBzY2hlbWFDeHQuaXRlbXMsIGl0Lml0ZW1zLCB0b05hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBtZXJnZVZhbGlkRXZhbHVhdGVkKHNjaGVtYUN4dCwgdmFsaWQpIHsKICAgICAgICBjb25zdCB7IGl0LCBnZW4gfSA9IHRoaXM7CiAgICAgICAgaWYgKGl0Lm9wdHMudW5ldmFsdWF0ZWQgJiYgKGl0LnByb3BzICE9PSB0cnVlIHx8IGl0Lml0ZW1zICE9PSB0cnVlKSkgewogICAgICAgICAgZ2VuLmlmKHZhbGlkLCAoKSA9PiB0aGlzLm1lcmdlRXZhbHVhdGVkKHNjaGVtYUN4dCwgY29kZWdlbl8xLk5hbWUpKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLktleXdvcmRDeHQgPSBLZXl3b3JkQ3h0OwogICAgZnVuY3Rpb24ga2V5d29yZENvZGUoaXQsIGtleXdvcmQsIGRlZiwgcnVsZVR5cGUpIHsKICAgICAgY29uc3QgY3h0ID0gbmV3IEtleXdvcmRDeHQoaXQsIGRlZiwga2V5d29yZCk7CiAgICAgIGlmICgiY29kZSIgaW4gZGVmKSB7CiAgICAgICAgZGVmLmNvZGUoY3h0LCBydWxlVHlwZSk7CiAgICAgIH0gZWxzZSBpZiAoY3h0LiRkYXRhICYmIGRlZi52YWxpZGF0ZSkgewogICAgICAgICgwLCBrZXl3b3JkXzEuZnVuY0tleXdvcmRDb2RlKShjeHQsIGRlZik7CiAgICAgIH0gZWxzZSBpZiAoIm1hY3JvIiBpbiBkZWYpIHsKICAgICAgICAoMCwga2V5d29yZF8xLm1hY3JvS2V5d29yZENvZGUpKGN4dCwgZGVmKTsKICAgICAgfSBlbHNlIGlmIChkZWYuY29tcGlsZSB8fCBkZWYudmFsaWRhdGUpIHsKICAgICAgICAoMCwga2V5d29yZF8xLmZ1bmNLZXl3b3JkQ29kZSkoY3h0LCBkZWYpOwogICAgICB9CiAgICB9CiAgICB2YXIgSlNPTl9QT0lOVEVSID0gL15cLyg/Oltefl18fjB8fjEpKiQvOwogICAgdmFyIFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKFswLTldKykoI3xcLyg/Oltefl18fjB8fjEpKik/JC87CiAgICBmdW5jdGlvbiBnZXREYXRhKCRkYXRhLCB7IGRhdGFMZXZlbCwgZGF0YU5hbWVzLCBkYXRhUGF0aEFyciB9KSB7CiAgICAgIGxldCBqc29uUG9pbnRlcjsKICAgICAgbGV0IGRhdGE7CiAgICAgIGlmICgkZGF0YSA9PT0gIiIpCiAgICAgICAgcmV0dXJuIG5hbWVzXzEuZGVmYXVsdC5yb290RGF0YTsKICAgICAgaWYgKCRkYXRhWzBdID09PSAiLyIpIHsKICAgICAgICBpZiAoIUpTT05fUE9JTlRFUi50ZXN0KCRkYXRhKSkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBKU09OLXBvaW50ZXI6ICR7JGRhdGF9YCk7CiAgICAgICAganNvblBvaW50ZXIgPSAkZGF0YTsKICAgICAgICBkYXRhID0gbmFtZXNfMS5kZWZhdWx0LnJvb3REYXRhOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBSRUxBVElWRV9KU09OX1BPSU5URVIuZXhlYygkZGF0YSk7CiAgICAgICAgaWYgKCFtYXRjaGVzKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04tcG9pbnRlcjogJHskZGF0YX1gKTsKICAgICAgICBjb25zdCB1cCA9ICttYXRjaGVzWzFdOwogICAgICAgIGpzb25Qb2ludGVyID0gbWF0Y2hlc1syXTsKICAgICAgICBpZiAoanNvblBvaW50ZXIgPT09ICIjIikgewogICAgICAgICAgaWYgKHVwID49IGRhdGFMZXZlbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKCJwcm9wZXJ0eS9pbmRleCIsIHVwKSk7CiAgICAgICAgICByZXR1cm4gZGF0YVBhdGhBcnJbZGF0YUxldmVsIC0gdXBdOwogICAgICAgIH0KICAgICAgICBpZiAodXAgPiBkYXRhTGV2ZWwpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2coImRhdGEiLCB1cCkpOwogICAgICAgIGRhdGEgPSBkYXRhTmFtZXNbZGF0YUxldmVsIC0gdXBdOwogICAgICAgIGlmICghanNvblBvaW50ZXIpCiAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfQogICAgICBsZXQgZXhwciA9IGRhdGE7CiAgICAgIGNvbnN0IHNlZ21lbnRzID0ganNvblBvaW50ZXIuc3BsaXQoIi8iKTsKICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7CiAgICAgICAgaWYgKHNlZ21lbnQpIHsKICAgICAgICAgIGRhdGEgPSAoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0keygwLCBjb2RlZ2VuXzEuZ2V0UHJvcGVydHkpKCgwLCB1dGlsXzEudW5lc2NhcGVKc29uUG9pbnRlcikoc2VnbWVudCkpfWA7CiAgICAgICAgICBleHByID0gKDAsIGNvZGVnZW5fMS5fKWAke2V4cHJ9ICYmICR7ZGF0YX1gOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZXhwcjsKICAgICAgZnVuY3Rpb24gZXJyb3JNc2cocG9pbnRlclR5cGUsIHVwKSB7CiAgICAgICAgcmV0dXJuIGBDYW5ub3QgYWNjZXNzICR7cG9pbnRlclR5cGV9ICR7dXB9IGxldmVscyB1cCwgY3VycmVudCBsZXZlbCBpcyAke2RhdGFMZXZlbH1gOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5nZXREYXRhID0gZ2V0RGF0YTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvcnVudGltZS92YWxpZGF0aW9uX2Vycm9yLmpzCnZhciByZXF1aXJlX3ZhbGlkYXRpb25fZXJyb3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvcnVudGltZS92YWxpZGF0aW9uX2Vycm9yLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgVmFsaWRhdGlvbkVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKGVycm9ycykgewogICAgICAgIHN1cGVyKCJ2YWxpZGF0aW9uIGZhaWxlZCIpOwogICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgIHRoaXMuYWp2ID0gdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBWYWxpZGF0aW9uRXJyb3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvcmVmX2Vycm9yLmpzCnZhciByZXF1aXJlX3JlZl9lcnJvciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL3JlZl9lcnJvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIHJlc29sdmVfMSA9IHJlcXVpcmVfcmVzb2x2ZSgpOwogICAgdmFyIE1pc3NpbmdSZWZFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3IgewogICAgICBjb25zdHJ1Y3RvcihyZXNvbHZlciwgYmFzZUlkLCByZWYsIG1zZykgewogICAgICAgIHN1cGVyKG1zZyB8fCBgY2FuJ3QgcmVzb2x2ZSByZWZlcmVuY2UgJHtyZWZ9IGZyb20gaWQgJHtiYXNlSWR9YCk7CiAgICAgICAgdGhpcy5taXNzaW5nUmVmID0gKDAsIHJlc29sdmVfMS5yZXNvbHZlVXJsKShyZXNvbHZlciwgYmFzZUlkLCByZWYpOwogICAgICAgIHRoaXMubWlzc2luZ1NjaGVtYSA9ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKCgwLCByZXNvbHZlXzEuZ2V0RnVsbFBhdGgpKHJlc29sdmVyLCB0aGlzLm1pc3NpbmdSZWYpKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBNaXNzaW5nUmVmRXJyb3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvaW5kZXguanMKdmFyIHJlcXVpcmVfY29tcGlsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9jb21waWxlL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5yZXNvbHZlU2NoZW1hID0gZXhwb3J0czIuZ2V0Q29tcGlsaW5nU2NoZW1hID0gZXhwb3J0czIucmVzb2x2ZVJlZiA9IGV4cG9ydHMyLmNvbXBpbGVTY2hlbWEgPSBleHBvcnRzMi5TY2hlbWFFbnYgPSB2b2lkIDA7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdmFsaWRhdGlvbl9lcnJvcl8xID0gcmVxdWlyZV92YWxpZGF0aW9uX2Vycm9yKCk7CiAgICB2YXIgbmFtZXNfMSA9IHJlcXVpcmVfbmFtZXMoKTsKICAgIHZhciByZXNvbHZlXzEgPSByZXF1aXJlX3Jlc29sdmUoKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciB2YWxpZGF0ZV8xID0gcmVxdWlyZV92YWxpZGF0ZSgpOwogICAgdmFyIFNjaGVtYUVudiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZW52KSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIHRoaXMucmVmcyA9IHt9OwogICAgICAgIHRoaXMuZHluYW1pY0FuY2hvcnMgPSB7fTsKICAgICAgICBsZXQgc2NoZW1hOwogICAgICAgIGlmICh0eXBlb2YgZW52LnNjaGVtYSA9PSAib2JqZWN0IikKICAgICAgICAgIHNjaGVtYSA9IGVudi5zY2hlbWE7CiAgICAgICAgdGhpcy5zY2hlbWEgPSBlbnYuc2NoZW1hOwogICAgICAgIHRoaXMuc2NoZW1hSWQgPSBlbnYuc2NoZW1hSWQ7CiAgICAgICAgdGhpcy5yb290ID0gZW52LnJvb3QgfHwgdGhpczsKICAgICAgICB0aGlzLmJhc2VJZCA9IChfYSA9IGVudi5iYXNlSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYVtlbnYuc2NoZW1hSWQgfHwgIiRpZCJdKTsKICAgICAgICB0aGlzLnNjaGVtYVBhdGggPSBlbnYuc2NoZW1hUGF0aDsKICAgICAgICB0aGlzLmxvY2FsUmVmcyA9IGVudi5sb2NhbFJlZnM7CiAgICAgICAgdGhpcy5tZXRhID0gZW52Lm1ldGE7CiAgICAgICAgdGhpcy4kYXN5bmMgPSBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuJGFzeW5jOwogICAgICAgIHRoaXMucmVmcyA9IHt9OwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuU2NoZW1hRW52ID0gU2NoZW1hRW52OwogICAgZnVuY3Rpb24gY29tcGlsZVNjaGVtYShzY2gpIHsKICAgICAgY29uc3QgX3NjaCA9IGdldENvbXBpbGluZ1NjaGVtYS5jYWxsKHRoaXMsIHNjaCk7CiAgICAgIGlmIChfc2NoKQogICAgICAgIHJldHVybiBfc2NoOwogICAgICBjb25zdCByb290SWQgPSAoMCwgcmVzb2x2ZV8xLmdldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsIHNjaC5yb290LmJhc2VJZCk7CiAgICAgIGNvbnN0IHsgZXM1LCBsaW5lcyB9ID0gdGhpcy5vcHRzLmNvZGU7CiAgICAgIGNvbnN0IHsgb3duUHJvcGVydGllcyB9ID0gdGhpcy5vcHRzOwogICAgICBjb25zdCBnZW4gPSBuZXcgY29kZWdlbl8xLkNvZGVHZW4odGhpcy5zY29wZSwgeyBlczUsIGxpbmVzLCBvd25Qcm9wZXJ0aWVzIH0pOwogICAgICBsZXQgX1ZhbGlkYXRpb25FcnJvcjsKICAgICAgaWYgKHNjaC4kYXN5bmMpIHsKICAgICAgICBfVmFsaWRhdGlvbkVycm9yID0gZ2VuLnNjb3BlVmFsdWUoIkVycm9yIiwgewogICAgICAgICAgcmVmOiB2YWxpZGF0aW9uX2Vycm9yXzEuZGVmYXVsdCwKICAgICAgICAgIGNvZGU6ICgwLCBjb2RlZ2VuXzEuXylgcmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS92YWxpZGF0aW9uX2Vycm9yIikuZGVmYXVsdGAKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCB2YWxpZGF0ZU5hbWUgPSBnZW4uc2NvcGVOYW1lKCJ2YWxpZGF0ZSIpOwogICAgICBzY2gudmFsaWRhdGVOYW1lID0gdmFsaWRhdGVOYW1lOwogICAgICBjb25zdCBzY2hlbWFDeHQgPSB7CiAgICAgICAgZ2VuLAogICAgICAgIGFsbEVycm9yczogdGhpcy5vcHRzLmFsbEVycm9ycywKICAgICAgICBkYXRhOiBuYW1lc18xLmRlZmF1bHQuZGF0YSwKICAgICAgICBwYXJlbnREYXRhOiBuYW1lc18xLmRlZmF1bHQucGFyZW50RGF0YSwKICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6IG5hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksCiAgICAgICAgZGF0YU5hbWVzOiBbbmFtZXNfMS5kZWZhdWx0LmRhdGFdLAogICAgICAgIGRhdGFQYXRoQXJyOiBbY29kZWdlbl8xLm5pbF0sCiAgICAgICAgLy8gVE9ETyBjYW4gaXRzIGxlbmd0aCBiZSB1c2VkIGFzIGRhdGFMZXZlbCBpZiBuaWwgaXMgcmVtb3ZlZD8KICAgICAgICBkYXRhTGV2ZWw6IDAsCiAgICAgICAgZGF0YVR5cGVzOiBbXSwKICAgICAgICBkZWZpbmVkUHJvcGVydGllczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgICB0b3BTY2hlbWFSZWY6IGdlbi5zY29wZVZhbHVlKCJzY2hlbWEiLCB0aGlzLm9wdHMuY29kZS5zb3VyY2UgPT09IHRydWUgPyB7IHJlZjogc2NoLnNjaGVtYSwgY29kZTogKDAsIGNvZGVnZW5fMS5zdHJpbmdpZnkpKHNjaC5zY2hlbWEpIH0gOiB7IHJlZjogc2NoLnNjaGVtYSB9KSwKICAgICAgICB2YWxpZGF0ZU5hbWUsCiAgICAgICAgVmFsaWRhdGlvbkVycm9yOiBfVmFsaWRhdGlvbkVycm9yLAogICAgICAgIHNjaGVtYTogc2NoLnNjaGVtYSwKICAgICAgICBzY2hlbWFFbnY6IHNjaCwKICAgICAgICByb290SWQsCiAgICAgICAgYmFzZUlkOiBzY2guYmFzZUlkIHx8IHJvb3RJZCwKICAgICAgICBzY2hlbWFQYXRoOiBjb2RlZ2VuXzEubmlsLAogICAgICAgIGVyclNjaGVtYVBhdGg6IHNjaC5zY2hlbWFQYXRoIHx8ICh0aGlzLm9wdHMuanRkID8gIiIgOiAiIyIpLAogICAgICAgIGVycm9yUGF0aDogKDAsIGNvZGVnZW5fMS5fKWAiImAsCiAgICAgICAgb3B0czogdGhpcy5vcHRzLAogICAgICAgIHNlbGY6IHRoaXMKICAgICAgfTsKICAgICAgbGV0IHNvdXJjZUNvZGU7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5fY29tcGlsYXRpb25zLmFkZChzY2gpOwogICAgICAgICgwLCB2YWxpZGF0ZV8xLnZhbGlkYXRlRnVuY3Rpb25Db2RlKShzY2hlbWFDeHQpOwogICAgICAgIGdlbi5vcHRpbWl6ZSh0aGlzLm9wdHMuY29kZS5vcHRpbWl6ZSk7CiAgICAgICAgY29uc3QgdmFsaWRhdGVDb2RlID0gZ2VuLnRvU3RyaW5nKCk7CiAgICAgICAgc291cmNlQ29kZSA9IGAke2dlbi5zY29wZVJlZnMobmFtZXNfMS5kZWZhdWx0LnNjb3BlKX1yZXR1cm4gJHt2YWxpZGF0ZUNvZGV9YDsKICAgICAgICBpZiAodGhpcy5vcHRzLmNvZGUucHJvY2VzcykKICAgICAgICAgIHNvdXJjZUNvZGUgPSB0aGlzLm9wdHMuY29kZS5wcm9jZXNzKHNvdXJjZUNvZGUsIHNjaCk7CiAgICAgICAgY29uc3QgbWFrZVZhbGlkYXRlID0gbmV3IEZ1bmN0aW9uKGAke25hbWVzXzEuZGVmYXVsdC5zZWxmfWAsIGAke25hbWVzXzEuZGVmYXVsdC5zY29wZX1gLCBzb3VyY2VDb2RlKTsKICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IG1ha2VWYWxpZGF0ZSh0aGlzLCB0aGlzLnNjb3BlLmdldCgpKTsKICAgICAgICB0aGlzLnNjb3BlLnZhbHVlKHZhbGlkYXRlTmFtZSwgeyByZWY6IHZhbGlkYXRlIH0pOwogICAgICAgIHZhbGlkYXRlLmVycm9ycyA9IG51bGw7CiAgICAgICAgdmFsaWRhdGUuc2NoZW1hID0gc2NoLnNjaGVtYTsKICAgICAgICB2YWxpZGF0ZS5zY2hlbWFFbnYgPSBzY2g7CiAgICAgICAgaWYgKHNjaC4kYXN5bmMpCiAgICAgICAgICB2YWxpZGF0ZS4kYXN5bmMgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLm9wdHMuY29kZS5zb3VyY2UgPT09IHRydWUpIHsKICAgICAgICAgIHZhbGlkYXRlLnNvdXJjZSA9IHsgdmFsaWRhdGVOYW1lLCB2YWxpZGF0ZUNvZGUsIHNjb3BlVmFsdWVzOiBnZW4uX3ZhbHVlcyB9OwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vcHRzLnVuZXZhbHVhdGVkKSB7CiAgICAgICAgICBjb25zdCB7IHByb3BzLCBpdGVtcyB9ID0gc2NoZW1hQ3h0OwogICAgICAgICAgdmFsaWRhdGUuZXZhbHVhdGVkID0gewogICAgICAgICAgICBwcm9wczogcHJvcHMgaW5zdGFuY2VvZiBjb2RlZ2VuXzEuTmFtZSA/IHZvaWQgMCA6IHByb3BzLAogICAgICAgICAgICBpdGVtczogaXRlbXMgaW5zdGFuY2VvZiBjb2RlZ2VuXzEuTmFtZSA/IHZvaWQgMCA6IGl0ZW1zLAogICAgICAgICAgICBkeW5hbWljUHJvcHM6IHByb3BzIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUsCiAgICAgICAgICAgIGR5bmFtaWNJdGVtczogaXRlbXMgaW5zdGFuY2VvZiBjb2RlZ2VuXzEuTmFtZQogICAgICAgICAgfTsKICAgICAgICAgIGlmICh2YWxpZGF0ZS5zb3VyY2UpCiAgICAgICAgICAgIHZhbGlkYXRlLnNvdXJjZS5ldmFsdWF0ZWQgPSAoMCwgY29kZWdlbl8xLnN0cmluZ2lmeSkodmFsaWRhdGUuZXZhbHVhdGVkKTsKICAgICAgICB9CiAgICAgICAgc2NoLnZhbGlkYXRlID0gdmFsaWRhdGU7CiAgICAgICAgcmV0dXJuIHNjaDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGRlbGV0ZSBzY2gudmFsaWRhdGU7CiAgICAgICAgZGVsZXRlIHNjaC52YWxpZGF0ZU5hbWU7CiAgICAgICAgaWYgKHNvdXJjZUNvZGUpCiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigiRXJyb3IgY29tcGlsaW5nIHNjaGVtYSwgZnVuY3Rpb24gY29kZToiLCBzb3VyY2VDb2RlKTsKICAgICAgICB0aHJvdyBlOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoc2NoKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuY29tcGlsZVNjaGVtYSA9IGNvbXBpbGVTY2hlbWE7CiAgICBmdW5jdGlvbiByZXNvbHZlUmVmKHJvb3QsIGJhc2VJZCwgcmVmKSB7CiAgICAgIHZhciBfYTsKICAgICAgcmVmID0gKDAsIHJlc29sdmVfMS5yZXNvbHZlVXJsKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsIGJhc2VJZCwgcmVmKTsKICAgICAgY29uc3Qgc2NoT3JGdW5jID0gcm9vdC5yZWZzW3JlZl07CiAgICAgIGlmIChzY2hPckZ1bmMpCiAgICAgICAgcmV0dXJuIHNjaE9yRnVuYzsKICAgICAgbGV0IF9zY2ggPSByZXNvbHZlLmNhbGwodGhpcywgcm9vdCwgcmVmKTsKICAgICAgaWYgKF9zY2ggPT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IHNjaGVtYSA9IChfYSA9IHJvb3QubG9jYWxSZWZzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVmXTsKICAgICAgICBjb25zdCB7IHNjaGVtYUlkIH0gPSB0aGlzLm9wdHM7CiAgICAgICAgaWYgKHNjaGVtYSkKICAgICAgICAgIF9zY2ggPSBuZXcgU2NoZW1hRW52KHsgc2NoZW1hLCBzY2hlbWFJZCwgcm9vdCwgYmFzZUlkIH0pOwogICAgICB9CiAgICAgIGlmIChfc2NoID09PSB2b2lkIDApCiAgICAgICAgcmV0dXJuOwogICAgICByZXR1cm4gcm9vdC5yZWZzW3JlZl0gPSBpbmxpbmVPckNvbXBpbGUuY2FsbCh0aGlzLCBfc2NoKTsKICAgIH0KICAgIGV4cG9ydHMyLnJlc29sdmVSZWYgPSByZXNvbHZlUmVmOwogICAgZnVuY3Rpb24gaW5saW5lT3JDb21waWxlKHNjaCkgewogICAgICBpZiAoKDAsIHJlc29sdmVfMS5pbmxpbmVSZWYpKHNjaC5zY2hlbWEsIHRoaXMub3B0cy5pbmxpbmVSZWZzKSkKICAgICAgICByZXR1cm4gc2NoLnNjaGVtYTsKICAgICAgcmV0dXJuIHNjaC52YWxpZGF0ZSA/IHNjaCA6IGNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLCBzY2gpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q29tcGlsaW5nU2NoZW1hKHNjaEVudikgewogICAgICBmb3IgKGNvbnN0IHNjaCBvZiB0aGlzLl9jb21waWxhdGlvbnMpIHsKICAgICAgICBpZiAoc2FtZVNjaGVtYUVudihzY2gsIHNjaEVudikpCiAgICAgICAgICByZXR1cm4gc2NoOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5nZXRDb21waWxpbmdTY2hlbWEgPSBnZXRDb21waWxpbmdTY2hlbWE7CiAgICBmdW5jdGlvbiBzYW1lU2NoZW1hRW52KHMxLCBzMikgewogICAgICByZXR1cm4gczEuc2NoZW1hID09PSBzMi5zY2hlbWEgJiYgczEucm9vdCA9PT0gczIucm9vdCAmJiBzMS5iYXNlSWQgPT09IHMyLmJhc2VJZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmUocm9vdCwgcmVmKSB7CiAgICAgIGxldCBzY2g7CiAgICAgIHdoaWxlICh0eXBlb2YgKHNjaCA9IHRoaXMucmVmc1tyZWZdKSA9PSAic3RyaW5nIikKICAgICAgICByZWYgPSBzY2g7CiAgICAgIHJldHVybiBzY2ggfHwgdGhpcy5zY2hlbWFzW3JlZl0gfHwgcmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIHJvb3QsIHJlZik7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHJvb3QsIHJlZikgewogICAgICBjb25zdCBwID0gdGhpcy5vcHRzLnVyaVJlc29sdmVyLnBhcnNlKHJlZik7CiAgICAgIGNvbnN0IHJlZlBhdGggPSAoMCwgcmVzb2x2ZV8xLl9nZXRGdWxsUGF0aCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCBwKTsKICAgICAgbGV0IGJhc2VJZCA9ICgwLCByZXNvbHZlXzEuZ2V0RnVsbFBhdGgpKHRoaXMub3B0cy51cmlSZXNvbHZlciwgcm9vdC5iYXNlSWQsIHZvaWQgMCk7CiAgICAgIGlmIChPYmplY3Qua2V5cyhyb290LnNjaGVtYSkubGVuZ3RoID4gMCAmJiByZWZQYXRoID09PSBiYXNlSWQpIHsKICAgICAgICByZXR1cm4gZ2V0SnNvblBvaW50ZXIuY2FsbCh0aGlzLCBwLCByb290KTsKICAgICAgfQogICAgICBjb25zdCBpZCA9ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKHJlZlBhdGgpOwogICAgICBjb25zdCBzY2hPclJlZiA9IHRoaXMucmVmc1tpZF0gfHwgdGhpcy5zY2hlbWFzW2lkXTsKICAgICAgaWYgKHR5cGVvZiBzY2hPclJlZiA9PSAic3RyaW5nIikgewogICAgICAgIGNvbnN0IHNjaCA9IHJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCBzY2hPclJlZik7CiAgICAgICAgaWYgKHR5cGVvZiAoc2NoID09PSBudWxsIHx8IHNjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoLnNjaGVtYSkgIT09ICJvYmplY3QiKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHJldHVybiBnZXRKc29uUG9pbnRlci5jYWxsKHRoaXMsIHAsIHNjaCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiAoc2NoT3JSZWYgPT09IG51bGwgfHwgc2NoT3JSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaE9yUmVmLnNjaGVtYSkgIT09ICJvYmplY3QiKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKCFzY2hPclJlZi52YWxpZGF0ZSkKICAgICAgICBjb21waWxlU2NoZW1hLmNhbGwodGhpcywgc2NoT3JSZWYpOwogICAgICBpZiAoaWQgPT09ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKHJlZikpIHsKICAgICAgICBjb25zdCB7IHNjaGVtYSB9ID0gc2NoT3JSZWY7CiAgICAgICAgY29uc3QgeyBzY2hlbWFJZCB9ID0gdGhpcy5vcHRzOwogICAgICAgIGNvbnN0IHNjaElkID0gc2NoZW1hW3NjaGVtYUlkXTsKICAgICAgICBpZiAoc2NoSWQpCiAgICAgICAgICBiYXNlSWQgPSAoMCwgcmVzb2x2ZV8xLnJlc29sdmVVcmwpKHRoaXMub3B0cy51cmlSZXNvbHZlciwgYmFzZUlkLCBzY2hJZCk7CiAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFFbnYoeyBzY2hlbWEsIHNjaGVtYUlkLCByb290LCBiYXNlSWQgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGdldEpzb25Qb2ludGVyLmNhbGwodGhpcywgcCwgc2NoT3JSZWYpOwogICAgfQogICAgZXhwb3J0czIucmVzb2x2ZVNjaGVtYSA9IHJlc29sdmVTY2hlbWE7CiAgICB2YXIgUFJFVkVOVF9TQ09QRV9DSEFOR0UgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbCiAgICAgICJwcm9wZXJ0aWVzIiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIiwKICAgICAgImVudW0iLAogICAgICAiZGVwZW5kZW5jaWVzIiwKICAgICAgImRlZmluaXRpb25zIgogICAgXSk7CiAgICBmdW5jdGlvbiBnZXRKc29uUG9pbnRlcihwYXJzZWRSZWYsIHsgYmFzZUlkLCBzY2hlbWEsIHJvb3QgfSkgewogICAgICB2YXIgX2E7CiAgICAgIGlmICgoKF9hID0gcGFyc2VkUmVmLmZyYWdtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMF0pICE9PSAiLyIpCiAgICAgICAgcmV0dXJuOwogICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFyc2VkUmVmLmZyYWdtZW50LnNsaWNlKDEpLnNwbGl0KCIvIikpIHsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHBhcnRTY2hlbWEgPSBzY2hlbWFbKDAsIHV0aWxfMS51bmVzY2FwZUZyYWdtZW50KShwYXJ0KV07CiAgICAgICAgaWYgKHBhcnRTY2hlbWEgPT09IHZvaWQgMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBzY2hlbWEgPSBwYXJ0U2NoZW1hOwogICAgICAgIGNvbnN0IHNjaElkID0gdHlwZW9mIHNjaGVtYSA9PT0gIm9iamVjdCIgJiYgc2NoZW1hW3RoaXMub3B0cy5zY2hlbWFJZF07CiAgICAgICAgaWYgKCFQUkVWRU5UX1NDT1BFX0NIQU5HRS5oYXMocGFydCkgJiYgc2NoSWQpIHsKICAgICAgICAgIGJhc2VJZCA9ICgwLCByZXNvbHZlXzEucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCBiYXNlSWQsIHNjaElkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGVudjsKICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgIT0gImJvb2xlYW4iICYmIHNjaGVtYS4kcmVmICYmICEoMCwgdXRpbF8xLnNjaGVtYUhhc1J1bGVzQnV0UmVmKShzY2hlbWEsIHRoaXMuUlVMRVMpKSB7CiAgICAgICAgY29uc3QgJHJlZiA9ICgwLCByZXNvbHZlXzEucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLCBiYXNlSWQsIHNjaGVtYS4kcmVmKTsKICAgICAgICBlbnYgPSByZXNvbHZlU2NoZW1hLmNhbGwodGhpcywgcm9vdCwgJHJlZik7CiAgICAgIH0KICAgICAgY29uc3QgeyBzY2hlbWFJZCB9ID0gdGhpcy5vcHRzOwogICAgICBlbnYgPSBlbnYgfHwgbmV3IFNjaGVtYUVudih7IHNjaGVtYSwgc2NoZW1hSWQsIHJvb3QsIGJhc2VJZCB9KTsKICAgICAgaWYgKGVudi5zY2hlbWEgIT09IGVudi5yb290LnNjaGVtYSkKICAgICAgICByZXR1cm4gZW52OwogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9yZWZzL2RhdGEuanNvbgp2YXIgcmVxdWlyZV9kYXRhID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3JlZnMvZGF0YS5qc29uIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgbW9kdWxlMi5leHBvcnRzID0gewogICAgICAkaWQ6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMiLAogICAgICBkZXNjcmlwdGlvbjogIk1ldGEtc2NoZW1hIGZvciAkZGF0YSByZWZlcmVuY2UgKEpTT04gQW55U2NoZW1hIGV4dGVuc2lvbiBwcm9wb3NhbCkiLAogICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgcmVxdWlyZWQ6IFsiJGRhdGEiXSwKICAgICAgcHJvcGVydGllczogewogICAgICAgICRkYXRhOiB7CiAgICAgICAgICB0eXBlOiAic3RyaW5nIiwKICAgICAgICAgIGFueU9mOiBbeyBmb3JtYXQ6ICJyZWxhdGl2ZS1qc29uLXBvaW50ZXIiIH0sIHsgZm9ybWF0OiAianNvbi1wb2ludGVyIiB9XQogICAgICAgIH0KICAgICAgfSwKICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlCiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9mYXN0LXVyaS1ucG0tMy4wLjMtMDg3NDA3MjYyNS05MjQ4N2M3NTg0LnppcC9ub2RlX21vZHVsZXMvZmFzdC11cmkvbGliL3Njb3BlZENoYXJzLmpzCnZhciByZXF1aXJlX3Njb3BlZENoYXJzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Zhc3QtdXJpLW5wbS0zLjAuMy0wODc0MDcyNjI1LTkyNDg3Yzc1ODQuemlwL25vZGVfbW9kdWxlcy9mYXN0LXVyaS9saWIvc2NvcGVkQ2hhcnMuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgSEVYID0gewogICAgICAwOiAwLAogICAgICAxOiAxLAogICAgICAyOiAyLAogICAgICAzOiAzLAogICAgICA0OiA0LAogICAgICA1OiA1LAogICAgICA2OiA2LAogICAgICA3OiA3LAogICAgICA4OiA4LAogICAgICA5OiA5LAogICAgICBhOiAxMCwKICAgICAgQTogMTAsCiAgICAgIGI6IDExLAogICAgICBCOiAxMSwKICAgICAgYzogMTIsCiAgICAgIEM6IDEyLAogICAgICBkOiAxMywKICAgICAgRDogMTMsCiAgICAgIGU6IDE0LAogICAgICBFOiAxNCwKICAgICAgZjogMTUsCiAgICAgIEY6IDE1CiAgICB9OwogICAgbW9kdWxlMi5leHBvcnRzID0gewogICAgICBIRVgKICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Zhc3QtdXJpLW5wbS0zLjAuMy0wODc0MDcyNjI1LTkyNDg3Yzc1ODQuemlwL25vZGVfbW9kdWxlcy9mYXN0LXVyaS9saWIvdXRpbHMuanMKdmFyIHJlcXVpcmVfdXRpbHMyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Zhc3QtdXJpLW5wbS0zLjAuMy0wODc0MDcyNjI1LTkyNDg3Yzc1ODQuemlwL25vZGVfbW9kdWxlcy9mYXN0LXVyaS9saWIvdXRpbHMuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgeyBIRVggfSA9IHJlcXVpcmVfc2NvcGVkQ2hhcnMoKTsKICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUlQdjQoaG9zdCkgewogICAgICBpZiAoZmluZFRva2VuKGhvc3QsICIuIikgPCAzKSB7CiAgICAgICAgcmV0dXJuIHsgaG9zdCwgaXNJUFY0OiBmYWxzZSB9OwogICAgICB9CiAgICAgIGNvbnN0IG1hdGNoZXMgPSBob3N0Lm1hdGNoKC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkL3UpIHx8IFtdOwogICAgICBjb25zdCBbYWRkcmVzc10gPSBtYXRjaGVzOwogICAgICBpZiAoYWRkcmVzcykgewogICAgICAgIHJldHVybiB7IGhvc3Q6IHN0cmlwTGVhZGluZ1plcm9zKGFkZHJlc3MsICIuIiksIGlzSVBWNDogdHJ1ZSB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB7IGhvc3QsIGlzSVBWNDogZmFsc2UgfTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RyaW5nQXJyYXlUb0hleFN0cmlwcGVkKGlucHV0LCBrZWVwWmVybyA9IGZhbHNlKSB7CiAgICAgIGxldCBhY2MgPSAiIjsKICAgICAgbGV0IHN0cmlwID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCBjIG9mIGlucHV0KSB7CiAgICAgICAgaWYgKEhFWFtjXSA9PT0gdm9pZCAwKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGlmIChjICE9PSAiMCIgJiYgc3RyaXAgPT09IHRydWUpIHN0cmlwID0gZmFsc2U7CiAgICAgICAgaWYgKCFzdHJpcCkgYWNjICs9IGM7CiAgICAgIH0KICAgICAgaWYgKGtlZXBaZXJvICYmIGFjYy5sZW5ndGggPT09IDApIGFjYyA9ICIwIjsKICAgICAgcmV0dXJuIGFjYzsKICAgIH0KICAgIGZ1bmN0aW9uIGdldElQVjYoaW5wdXQpIHsKICAgICAgbGV0IHRva2VuQ291bnQgPSAwOwogICAgICBjb25zdCBvdXRwdXQgPSB7IGVycm9yOiBmYWxzZSwgYWRkcmVzczogIiIsIHpvbmU6ICIiIH07CiAgICAgIGNvbnN0IGFkZHJlc3MgPSBbXTsKICAgICAgY29uc3QgYnVmZmVyID0gW107CiAgICAgIGxldCBpc1pvbmUgPSBmYWxzZTsKICAgICAgbGV0IGVuZGlwdjZFbmNvdW50ZXJlZCA9IGZhbHNlOwogICAgICBsZXQgZW5kSXB2NiA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBjb25zdW1lKCkgewogICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoaXNab25lID09PSBmYWxzZSkgewogICAgICAgICAgICBjb25zdCBoZXggPSBzdHJpbmdBcnJheVRvSGV4U3RyaXBwZWQoYnVmZmVyKTsKICAgICAgICAgICAgaWYgKGhleCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgYWRkcmVzcy5wdXNoKGhleCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb3V0cHV0LmVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgY3Vyc29yID0gaW5wdXRbaV07CiAgICAgICAgaWYgKGN1cnNvciA9PT0gIlsiIHx8IGN1cnNvciA9PT0gIl0iKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnNvciA9PT0gIjoiKSB7CiAgICAgICAgICBpZiAoZW5kaXB2NkVuY291bnRlcmVkID09PSB0cnVlKSB7CiAgICAgICAgICAgIGVuZElwdjYgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFjb25zdW1lKCkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0b2tlbkNvdW50Kys7CiAgICAgICAgICBhZGRyZXNzLnB1c2goIjoiKTsKICAgICAgICAgIGlmICh0b2tlbkNvdW50ID4gNykgewogICAgICAgICAgICBvdXRwdXQuZXJyb3IgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpIC0gMSA+PSAwICYmIGlucHV0W2kgLSAxXSA9PT0gIjoiKSB7CiAgICAgICAgICAgIGVuZGlwdjZFbmNvdW50ZXJlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnNvciA9PT0gIiUiKSB7CiAgICAgICAgICBpZiAoIWNvbnN1bWUoKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlzWm9uZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnNvcik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgICBpZiAoaXNab25lKSB7CiAgICAgICAgICBvdXRwdXQuem9uZSA9IGJ1ZmZlci5qb2luKCIiKTsKICAgICAgICB9IGVsc2UgaWYgKGVuZElwdjYpIHsKICAgICAgICAgIGFkZHJlc3MucHVzaChidWZmZXIuam9pbigiIikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGRyZXNzLnB1c2goc3RyaW5nQXJyYXlUb0hleFN0cmlwcGVkKGJ1ZmZlcikpOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXRwdXQuYWRkcmVzcyA9IGFkZHJlc3Muam9pbigiIik7CiAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemVJUHY2KGhvc3QsIG9wdHMgPSB7fSkgewogICAgICBpZiAoZmluZFRva2VuKGhvc3QsICI6IikgPCAyKSB7CiAgICAgICAgcmV0dXJuIHsgaG9zdCwgaXNJUFY2OiBmYWxzZSB9OwogICAgICB9CiAgICAgIGNvbnN0IGlwdjYgPSBnZXRJUFY2KGhvc3QpOwogICAgICBpZiAoIWlwdjYuZXJyb3IpIHsKICAgICAgICBsZXQgbmV3SG9zdCA9IGlwdjYuYWRkcmVzczsKICAgICAgICBsZXQgZXNjYXBlZEhvc3QgPSBpcHY2LmFkZHJlc3M7CiAgICAgICAgaWYgKGlwdjYuem9uZSkgewogICAgICAgICAgbmV3SG9zdCArPSAiJSIgKyBpcHY2LnpvbmU7CiAgICAgICAgICBlc2NhcGVkSG9zdCArPSAiJTI1IiArIGlwdjYuem9uZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgaG9zdDogbmV3SG9zdCwgZXNjYXBlZEhvc3QsIGlzSVBWNjogdHJ1ZSB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB7IGhvc3QsIGlzSVBWNjogZmFsc2UgfTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RyaXBMZWFkaW5nWmVyb3Moc3RyLCB0b2tlbikgewogICAgICBsZXQgb3V0ID0gIiI7CiAgICAgIGxldCBza2lwID0gdHJ1ZTsKICAgICAgY29uc3QgbCA9IHN0ci5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgYyA9IHN0cltpXTsKICAgICAgICBpZiAoYyA9PT0gIjAiICYmIHNraXApIHsKICAgICAgICAgIGlmIChpICsgMSA8PSBsICYmIHN0cltpICsgMV0gPT09IHRva2VuIHx8IGkgKyAxID09PSBsKSB7CiAgICAgICAgICAgIG91dCArPSBjOwogICAgICAgICAgICBza2lwID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChjID09PSB0b2tlbikgewogICAgICAgICAgICBza2lwID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNraXAgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIG91dCArPSBjOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gZmluZFRva2VuKHN0ciwgdG9rZW4pIHsKICAgICAgbGV0IGluZCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHN0cltpXSA9PT0gdG9rZW4pIGluZCsrOwogICAgICB9CiAgICAgIHJldHVybiBpbmQ7CiAgICB9CiAgICB2YXIgUkRTMSA9IC9eXC5cLj9cLy91OwogICAgdmFyIFJEUzIgPSAvXlwvXC4oPzpcL3wkKS91OwogICAgdmFyIFJEUzMgPSAvXlwvXC5cLig/OlwvfCQpL3U7CiAgICB2YXIgUkRTNSA9IC9eXC8/KD86LnxcbikqPyg/PVwvfCQpL3U7CiAgICBmdW5jdGlvbiByZW1vdmVEb3RTZWdtZW50cyhpbnB1dCkgewogICAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgICAgd2hpbGUgKGlucHV0Lmxlbmd0aCkgewogICAgICAgIGlmIChpbnB1dC5tYXRjaChSRFMxKSkgewogICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFJEUzEsICIiKTsKICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzIpKSB7CiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMiwgIi8iKTsKICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzMpKSB7CiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMywgIi8iKTsKICAgICAgICAgIG91dHB1dC5wb3AoKTsKICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSAiLiIgfHwgaW5wdXQgPT09ICIuLiIpIHsKICAgICAgICAgIGlucHV0ID0gIiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGltID0gaW5wdXQubWF0Y2goUkRTNSk7CiAgICAgICAgICBpZiAoaW0pIHsKICAgICAgICAgICAgY29uc3QgcyA9IGltWzBdOwogICAgICAgICAgICBpbnB1dCA9IGlucHV0LnNsaWNlKHMubGVuZ3RoKTsKICAgICAgICAgICAgb3V0cHV0LnB1c2gocyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgZG90IHNlZ21lbnQgY29uZGl0aW9uIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvdXRwdXQuam9pbigiIik7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBlc2MpIHsKICAgICAgY29uc3QgZnVuYyA9IGVzYyAhPT0gdHJ1ZSA/IGVzY2FwZSA6IHVuZXNjYXBlOwogICAgICBpZiAoY29tcG9uZW50cy5zY2hlbWUgIT09IHZvaWQgMCkgewogICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gZnVuYyhjb21wb25lbnRzLnNjaGVtZSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHZvaWQgMCkgewogICAgICAgIGNvbXBvbmVudHMudXNlcmluZm8gPSBmdW5jKGNvbXBvbmVudHMudXNlcmluZm8pOwogICAgICB9CiAgICAgIGlmIChjb21wb25lbnRzLmhvc3QgIT09IHZvaWQgMCkgewogICAgICAgIGNvbXBvbmVudHMuaG9zdCA9IGZ1bmMoY29tcG9uZW50cy5ob3N0KTsKICAgICAgfQogICAgICBpZiAoY29tcG9uZW50cy5wYXRoICE9PSB2b2lkIDApIHsKICAgICAgICBjb21wb25lbnRzLnBhdGggPSBmdW5jKGNvbXBvbmVudHMucGF0aCk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvbmVudHMucXVlcnkgIT09IHZvaWQgMCkgewogICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSBmdW5jKGNvbXBvbmVudHMucXVlcnkpOwogICAgICB9CiAgICAgIGlmIChjb21wb25lbnRzLmZyYWdtZW50ICE9PSB2b2lkIDApIHsKICAgICAgICBjb21wb25lbnRzLmZyYWdtZW50ID0gZnVuYyhjb21wb25lbnRzLmZyYWdtZW50KTsKICAgICAgfQogICAgICByZXR1cm4gY29tcG9uZW50czsKICAgIH0KICAgIGZ1bmN0aW9uIHJlY29tcG9zZUF1dGhvcml0eShjb21wb25lbnRzLCBvcHRpb25zKSB7CiAgICAgIGNvbnN0IHVyaVRva2VucyA9IFtdOwogICAgICBpZiAoY29tcG9uZW50cy51c2VyaW5mbyAhPT0gdm9pZCAwKSB7CiAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy51c2VyaW5mbyk7CiAgICAgICAgdXJpVG9rZW5zLnB1c2goIkAiKTsKICAgICAgfQogICAgICBpZiAoY29tcG9uZW50cy5ob3N0ICE9PSB2b2lkIDApIHsKICAgICAgICBsZXQgaG9zdCA9IHVuZXNjYXBlKGNvbXBvbmVudHMuaG9zdCk7CiAgICAgICAgY29uc3QgaXBWNHJlcyA9IG5vcm1hbGl6ZUlQdjQoaG9zdCk7CiAgICAgICAgaWYgKGlwVjRyZXMuaXNJUFY0KSB7CiAgICAgICAgICBob3N0ID0gaXBWNHJlcy5ob3N0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBpcFY2cmVzID0gbm9ybWFsaXplSVB2NihpcFY0cmVzLmhvc3QsIHsgaXNJUFY0OiBmYWxzZSB9KTsKICAgICAgICAgIGlmIChpcFY2cmVzLmlzSVBWNiA9PT0gdHJ1ZSkgewogICAgICAgICAgICBob3N0ID0gYFske2lwVjZyZXMuZXNjYXBlZEhvc3R9XWA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBob3N0ID0gY29tcG9uZW50cy5ob3N0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cmlUb2tlbnMucHVzaChob3N0KTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gIm51bWJlciIgfHwgdHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gInN0cmluZyIpIHsKICAgICAgICB1cmlUb2tlbnMucHVzaCgiOiIpOwogICAgICAgIHVyaVRva2Vucy5wdXNoKFN0cmluZyhjb21wb25lbnRzLnBvcnQpKTsKICAgICAgfQogICAgICByZXR1cm4gdXJpVG9rZW5zLmxlbmd0aCA/IHVyaVRva2Vucy5qb2luKCIiKSA6IHZvaWQgMDsKICAgIH0KICAgIG1vZHVsZTIuZXhwb3J0cyA9IHsKICAgICAgcmVjb21wb3NlQXV0aG9yaXR5LAogICAgICBub3JtYWxpemVDb21wb25lbnRFbmNvZGluZywKICAgICAgcmVtb3ZlRG90U2VnbWVudHMsCiAgICAgIG5vcm1hbGl6ZUlQdjQsCiAgICAgIG5vcm1hbGl6ZUlQdjYsCiAgICAgIHN0cmluZ0FycmF5VG9IZXhTdHJpcHBlZAogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvZmFzdC11cmktbnBtLTMuMC4zLTA4NzQwNzI2MjUtOTI0ODdjNzU4NC56aXAvbm9kZV9tb2R1bGVzL2Zhc3QtdXJpL2xpYi9zY2hlbWVzLmpzCnZhciByZXF1aXJlX3NjaGVtZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvZmFzdC11cmktbnBtLTMuMC4zLTA4NzQwNzI2MjUtOTI0ODdjNzU4NC56aXAvbm9kZV9tb2R1bGVzL2Zhc3QtdXJpL2xpYi9zY2hlbWVzLmpzIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFVVSURfUkVHID0gL15bXGRhLWZdezh9XGItW1xkYS1mXXs0fVxiLVtcZGEtZl17NH1cYi1bXGRhLWZdezR9XGItW1xkYS1mXXsxMn0kL2l1OwogICAgdmFyIFVSTl9SRUcgPSAvKFtcZGEtel1bXGRcLWEtel17MCwzMX0pOigoPzpbXHchJCcoKSorLFwtLjo7PUBdfCVbXGRhLWZdezJ9KSspL2l1OwogICAgZnVuY3Rpb24gaXNTZWN1cmUod3NDb21wb25lbnRzKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygd3NDb21wb25lbnRzLnNlY3VyZSA9PT0gImJvb2xlYW4iID8gd3NDb21wb25lbnRzLnNlY3VyZSA6IFN0cmluZyh3c0NvbXBvbmVudHMuc2NoZW1lKS50b0xvd2VyQ2FzZSgpID09PSAid3NzIjsKICAgIH0KICAgIGZ1bmN0aW9uIGh0dHBQYXJzZShjb21wb25lbnRzKSB7CiAgICAgIGlmICghY29tcG9uZW50cy5ob3N0KSB7CiAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgIkhUVFAgVVJJcyBtdXN0IGhhdmUgYSBob3N0LiI7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAgICB9CiAgICBmdW5jdGlvbiBodHRwU2VyaWFsaXplKGNvbXBvbmVudHMpIHsKICAgICAgY29uc3Qgc2VjdXJlID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS50b0xvd2VyQ2FzZSgpID09PSAiaHR0cHMiOwogICAgICBpZiAoY29tcG9uZW50cy5wb3J0ID09PSAoc2VjdXJlID8gNDQzIDogODApIHx8IGNvbXBvbmVudHMucG9ydCA9PT0gIiIpIHsKICAgICAgICBjb21wb25lbnRzLnBvcnQgPSB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKCFjb21wb25lbnRzLnBhdGgpIHsKICAgICAgICBjb21wb25lbnRzLnBhdGggPSAiLyI7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAgICB9CiAgICBmdW5jdGlvbiB3c1BhcnNlKHdzQ29tcG9uZW50cykgewogICAgICB3c0NvbXBvbmVudHMuc2VjdXJlID0gaXNTZWN1cmUod3NDb21wb25lbnRzKTsKICAgICAgd3NDb21wb25lbnRzLnJlc291cmNlTmFtZSA9ICh3c0NvbXBvbmVudHMucGF0aCB8fCAiLyIpICsgKHdzQ29tcG9uZW50cy5xdWVyeSA/ICI/IiArIHdzQ29tcG9uZW50cy5xdWVyeSA6ICIiKTsKICAgICAgd3NDb21wb25lbnRzLnBhdGggPSB2b2lkIDA7CiAgICAgIHdzQ29tcG9uZW50cy5xdWVyeSA9IHZvaWQgMDsKICAgICAgcmV0dXJuIHdzQ29tcG9uZW50czsKICAgIH0KICAgIGZ1bmN0aW9uIHdzU2VyaWFsaXplKHdzQ29tcG9uZW50cykgewogICAgICBpZiAod3NDb21wb25lbnRzLnBvcnQgPT09IChpc1NlY3VyZSh3c0NvbXBvbmVudHMpID8gNDQzIDogODApIHx8IHdzQ29tcG9uZW50cy5wb3J0ID09PSAiIikgewogICAgICAgIHdzQ29tcG9uZW50cy5wb3J0ID0gdm9pZCAwOwogICAgICB9CiAgICAgIGlmICh0eXBlb2Ygd3NDb21wb25lbnRzLnNlY3VyZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgd3NDb21wb25lbnRzLnNjaGVtZSA9IHdzQ29tcG9uZW50cy5zZWN1cmUgPyAid3NzIiA6ICJ3cyI7CiAgICAgICAgd3NDb21wb25lbnRzLnNlY3VyZSA9IHZvaWQgMDsKICAgICAgfQogICAgICBpZiAod3NDb21wb25lbnRzLnJlc291cmNlTmFtZSkgewogICAgICAgIGNvbnN0IFtwYXRoLCBxdWVyeV0gPSB3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lLnNwbGl0KCI/Iik7CiAgICAgICAgd3NDb21wb25lbnRzLnBhdGggPSBwYXRoICYmIHBhdGggIT09ICIvIiA/IHBhdGggOiB2b2lkIDA7CiAgICAgICAgd3NDb21wb25lbnRzLnF1ZXJ5ID0gcXVlcnk7CiAgICAgICAgd3NDb21wb25lbnRzLnJlc291cmNlTmFtZSA9IHZvaWQgMDsKICAgICAgfQogICAgICB3c0NvbXBvbmVudHMuZnJhZ21lbnQgPSB2b2lkIDA7CiAgICAgIHJldHVybiB3c0NvbXBvbmVudHM7CiAgICB9CiAgICBmdW5jdGlvbiB1cm5QYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKSB7CiAgICAgIGlmICghdXJuQ29tcG9uZW50cy5wYXRoKSB7CiAgICAgICAgdXJuQ29tcG9uZW50cy5lcnJvciA9ICJVUk4gY2FuIG5vdCBiZSBwYXJzZWQiOwogICAgICAgIHJldHVybiB1cm5Db21wb25lbnRzOwogICAgICB9CiAgICAgIGNvbnN0IG1hdGNoZXMgPSB1cm5Db21wb25lbnRzLnBhdGgubWF0Y2goVVJOX1JFRyk7CiAgICAgIGlmIChtYXRjaGVzKSB7CiAgICAgICAgY29uc3Qgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgInVybiI7CiAgICAgICAgdXJuQ29tcG9uZW50cy5uaWQgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdXJuQ29tcG9uZW50cy5uc3MgPSBtYXRjaGVzWzJdOwogICAgICAgIGNvbnN0IHVyblNjaGVtZSA9IGAke3NjaGVtZX06JHtvcHRpb25zLm5pZCB8fCB1cm5Db21wb25lbnRzLm5pZH1gOwogICAgICAgIGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07CiAgICAgICAgdXJuQ29tcG9uZW50cy5wYXRoID0gdm9pZCAwOwogICAgICAgIGlmIChzY2hlbWVIYW5kbGVyKSB7CiAgICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5wYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXJuQ29tcG9uZW50cy5lcnJvciA9IHVybkNvbXBvbmVudHMuZXJyb3IgfHwgIlVSTiBjYW4gbm90IGJlIHBhcnNlZC4iOwogICAgICB9CiAgICAgIHJldHVybiB1cm5Db21wb25lbnRzOwogICAgfQogICAgZnVuY3Rpb24gdXJuU2VyaWFsaXplKHVybkNvbXBvbmVudHMsIG9wdGlvbnMpIHsKICAgICAgY29uc3Qgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgInVybiI7CiAgICAgIGNvbnN0IG5pZCA9IHVybkNvbXBvbmVudHMubmlkLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IHVyblNjaGVtZSA9IGAke3NjaGVtZX06JHtvcHRpb25zLm5pZCB8fCBuaWR9YDsKICAgICAgY29uc3Qgc2NoZW1lSGFuZGxlciA9IFNDSEVNRVNbdXJuU2NoZW1lXTsKICAgICAgaWYgKHNjaGVtZUhhbmRsZXIpIHsKICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5zZXJpYWxpemUodXJuQ29tcG9uZW50cywgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgY29uc3QgdXJpQ29tcG9uZW50cyA9IHVybkNvbXBvbmVudHM7CiAgICAgIGNvbnN0IG5zcyA9IHVybkNvbXBvbmVudHMubnNzOwogICAgICB1cmlDb21wb25lbnRzLnBhdGggPSBgJHtuaWQgfHwgb3B0aW9ucy5uaWR9OiR7bnNzfWA7CiAgICAgIG9wdGlvbnMuc2tpcEVzY2FwZSA9IHRydWU7CiAgICAgIHJldHVybiB1cmlDb21wb25lbnRzOwogICAgfQogICAgZnVuY3Rpb24gdXJudXVpZFBhcnNlKHVybkNvbXBvbmVudHMsIG9wdGlvbnMpIHsKICAgICAgY29uc3QgdXVpZENvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzOwogICAgICB1dWlkQ29tcG9uZW50cy51dWlkID0gdXVpZENvbXBvbmVudHMubnNzOwogICAgICB1dWlkQ29tcG9uZW50cy5uc3MgPSB2b2lkIDA7CiAgICAgIGlmICghb3B0aW9ucy50b2xlcmFudCAmJiAoIXV1aWRDb21wb25lbnRzLnV1aWQgfHwgIVVVSURfUkVHLnRlc3QodXVpZENvbXBvbmVudHMudXVpZCkpKSB7CiAgICAgICAgdXVpZENvbXBvbmVudHMuZXJyb3IgPSB1dWlkQ29tcG9uZW50cy5lcnJvciB8fCAiVVVJRCBpcyBub3QgdmFsaWQuIjsKICAgICAgfQogICAgICByZXR1cm4gdXVpZENvbXBvbmVudHM7CiAgICB9CiAgICBmdW5jdGlvbiB1cm51dWlkU2VyaWFsaXplKHV1aWRDb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHVybkNvbXBvbmVudHMgPSB1dWlkQ29tcG9uZW50czsKICAgICAgdXJuQ29tcG9uZW50cy5uc3MgPSAodXVpZENvbXBvbmVudHMudXVpZCB8fCAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgcmV0dXJuIHVybkNvbXBvbmVudHM7CiAgICB9CiAgICB2YXIgaHR0cCA9IHsKICAgICAgc2NoZW1lOiAiaHR0cCIsCiAgICAgIGRvbWFpbkhvc3Q6IHRydWUsCiAgICAgIHBhcnNlOiBodHRwUGFyc2UsCiAgICAgIHNlcmlhbGl6ZTogaHR0cFNlcmlhbGl6ZQogICAgfTsKICAgIHZhciBodHRwcyA9IHsKICAgICAgc2NoZW1lOiAiaHR0cHMiLAogICAgICBkb21haW5Ib3N0OiBodHRwLmRvbWFpbkhvc3QsCiAgICAgIHBhcnNlOiBodHRwUGFyc2UsCiAgICAgIHNlcmlhbGl6ZTogaHR0cFNlcmlhbGl6ZQogICAgfTsKICAgIHZhciB3cyA9IHsKICAgICAgc2NoZW1lOiAid3MiLAogICAgICBkb21haW5Ib3N0OiB0cnVlLAogICAgICBwYXJzZTogd3NQYXJzZSwKICAgICAgc2VyaWFsaXplOiB3c1NlcmlhbGl6ZQogICAgfTsKICAgIHZhciB3c3MgPSB7CiAgICAgIHNjaGVtZTogIndzcyIsCiAgICAgIGRvbWFpbkhvc3Q6IHdzLmRvbWFpbkhvc3QsCiAgICAgIHBhcnNlOiB3cy5wYXJzZSwKICAgICAgc2VyaWFsaXplOiB3cy5zZXJpYWxpemUKICAgIH07CiAgICB2YXIgdXJuID0gewogICAgICBzY2hlbWU6ICJ1cm4iLAogICAgICBwYXJzZTogdXJuUGFyc2UsCiAgICAgIHNlcmlhbGl6ZTogdXJuU2VyaWFsaXplLAogICAgICBza2lwTm9ybWFsaXplOiB0cnVlCiAgICB9OwogICAgdmFyIHVybnV1aWQgPSB7CiAgICAgIHNjaGVtZTogInVybjp1dWlkIiwKICAgICAgcGFyc2U6IHVybnV1aWRQYXJzZSwKICAgICAgc2VyaWFsaXplOiB1cm51dWlkU2VyaWFsaXplLAogICAgICBza2lwTm9ybWFsaXplOiB0cnVlCiAgICB9OwogICAgdmFyIFNDSEVNRVMgPSB7CiAgICAgIGh0dHAsCiAgICAgIGh0dHBzLAogICAgICB3cywKICAgICAgd3NzLAogICAgICB1cm4sCiAgICAgICJ1cm46dXVpZCI6IHVybnV1aWQKICAgIH07CiAgICBtb2R1bGUyLmV4cG9ydHMgPSBTQ0hFTUVTOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9mYXN0LXVyaS1ucG0tMy4wLjMtMDg3NDA3MjYyNS05MjQ4N2M3NTg0LnppcC9ub2RlX21vZHVsZXMvZmFzdC11cmkvaW5kZXguanMKdmFyIHJlcXVpcmVfZmFzdF91cmkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvZmFzdC11cmktbnBtLTMuMC4zLTA4NzQwNzI2MjUtOTI0ODdjNzU4NC56aXAvbm9kZV9tb2R1bGVzL2Zhc3QtdXJpL2luZGV4LmpzIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIHsgbm9ybWFsaXplSVB2Niwgbm9ybWFsaXplSVB2NCwgcmVtb3ZlRG90U2VnbWVudHMsIHJlY29tcG9zZUF1dGhvcml0eSwgbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcgfSA9IHJlcXVpcmVfdXRpbHMyKCk7CiAgICB2YXIgU0NIRU1FUyA9IHJlcXVpcmVfc2NoZW1lcygpOwogICAgZnVuY3Rpb24gbm9ybWFsaXplKHVyaSwgb3B0aW9ucykgewogICAgICBpZiAodHlwZW9mIHVyaSA9PT0gInN0cmluZyIpIHsKICAgICAgICB1cmkgPSBzZXJpYWxpemUocGFyc2UodXJpLCBvcHRpb25zKSwgb3B0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVyaSA9PT0gIm9iamVjdCIpIHsKICAgICAgICB1cmkgPSBwYXJzZShzZXJpYWxpemUodXJpLCBvcHRpb25zKSwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVyaTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmUoYmFzZVVSSSwgcmVsYXRpdmVVUkksIG9wdGlvbnMpIHsKICAgICAgY29uc3Qgc2NoZW1lbGVzc09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgc2NoZW1lOiAibnVsbCIgfSwgb3B0aW9ucyk7CiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUNvbXBvbmVudHMocGFyc2UoYmFzZVVSSSwgc2NoZW1lbGVzc09wdGlvbnMpLCBwYXJzZShyZWxhdGl2ZVVSSSwgc2NoZW1lbGVzc09wdGlvbnMpLCBzY2hlbWVsZXNzT3B0aW9ucywgdHJ1ZSk7CiAgICAgIHJldHVybiBzZXJpYWxpemUocmVzb2x2ZWQsIHsgLi4uc2NoZW1lbGVzc09wdGlvbnMsIHNraXBFc2NhcGU6IHRydWUgfSk7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50cyhiYXNlLCByZWxhdGl2ZSwgb3B0aW9ucywgc2tpcE5vcm1hbGl6YXRpb24pIHsKICAgICAgY29uc3QgdGFyZ2V0ID0ge307CiAgICAgIGlmICghc2tpcE5vcm1hbGl6YXRpb24pIHsKICAgICAgICBiYXNlID0gcGFyc2Uoc2VyaWFsaXplKGJhc2UsIG9wdGlvbnMpLCBvcHRpb25zKTsKICAgICAgICByZWxhdGl2ZSA9IHBhcnNlKHNlcmlhbGl6ZShyZWxhdGl2ZSwgb3B0aW9ucyksIG9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBpZiAoIW9wdGlvbnMudG9sZXJhbnQgJiYgcmVsYXRpdmUuc2NoZW1lKSB7CiAgICAgICAgdGFyZ2V0LnNjaGVtZSA9IHJlbGF0aXZlLnNjaGVtZTsKICAgICAgICB0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbzsKICAgICAgICB0YXJnZXQuaG9zdCA9IHJlbGF0aXZlLmhvc3Q7CiAgICAgICAgdGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0OwogICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCB8fCAiIik7CiAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHJlbGF0aXZlLnVzZXJpbmZvICE9PSB2b2lkIDAgfHwgcmVsYXRpdmUuaG9zdCAhPT0gdm9pZCAwIHx8IHJlbGF0aXZlLnBvcnQgIT09IHZvaWQgMCkgewogICAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gcmVsYXRpdmUudXNlcmluZm87CiAgICAgICAgICB0YXJnZXQuaG9zdCA9IHJlbGF0aXZlLmhvc3Q7CiAgICAgICAgICB0YXJnZXQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7CiAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHJlbGF0aXZlLnBhdGggfHwgIiIpOwogICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghcmVsYXRpdmUucGF0aCkgewogICAgICAgICAgICB0YXJnZXQucGF0aCA9IGJhc2UucGF0aDsKICAgICAgICAgICAgaWYgKHJlbGF0aXZlLnF1ZXJ5ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocmVsYXRpdmUucGF0aC5jaGFyQXQoMCkgPT09ICIvIikgewogICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKChiYXNlLnVzZXJpbmZvICE9PSB2b2lkIDAgfHwgYmFzZS5ob3N0ICE9PSB2b2lkIDAgfHwgYmFzZS5wb3J0ICE9PSB2b2lkIDApICYmICFiYXNlLnBhdGgpIHsKICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gIi8iICsgcmVsYXRpdmUucGF0aDsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiYXNlLnBhdGgpIHsKICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVsYXRpdmUucGF0aDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSBiYXNlLnBhdGguc2xpY2UoMCwgYmFzZS5wYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxKSArIHJlbGF0aXZlLnBhdGg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHModGFyZ2V0LnBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5OwogICAgICAgICAgfQogICAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gYmFzZS51c2VyaW5mbzsKICAgICAgICAgIHRhcmdldC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgdGFyZ2V0LnBvcnQgPSBiYXNlLnBvcnQ7CiAgICAgICAgfQogICAgICAgIHRhcmdldC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKICAgICAgfQogICAgICB0YXJnZXQuZnJhZ21lbnQgPSByZWxhdGl2ZS5mcmFnbWVudDsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZ1bmN0aW9uIGVxdWFsKHVyaUEsIHVyaUIsIG9wdGlvbnMpIHsKICAgICAgaWYgKHR5cGVvZiB1cmlBID09PSAic3RyaW5nIikgewogICAgICAgIHVyaUEgPSB1bmVzY2FwZSh1cmlBKTsKICAgICAgICB1cmlBID0gc2VyaWFsaXplKG5vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKHBhcnNlKHVyaUEsIG9wdGlvbnMpLCB0cnVlKSwgeyAuLi5vcHRpb25zLCBza2lwRXNjYXBlOiB0cnVlIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cmlBID09PSAib2JqZWN0IikgewogICAgICAgIHVyaUEgPSBzZXJpYWxpemUobm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcodXJpQSwgdHJ1ZSksIHsgLi4ub3B0aW9ucywgc2tpcEVzY2FwZTogdHJ1ZSB9KTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHVyaUIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdXJpQiA9IHVuZXNjYXBlKHVyaUIpOwogICAgICAgIHVyaUIgPSBzZXJpYWxpemUobm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcocGFyc2UodXJpQiwgb3B0aW9ucyksIHRydWUpLCB7IC4uLm9wdGlvbnMsIHNraXBFc2NhcGU6IHRydWUgfSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVyaUIgPT09ICJvYmplY3QiKSB7CiAgICAgICAgdXJpQiA9IHNlcmlhbGl6ZShub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyh1cmlCLCB0cnVlKSwgeyAuLi5vcHRpb25zLCBza2lwRXNjYXBlOiB0cnVlIH0pOwogICAgICB9CiAgICAgIHJldHVybiB1cmlBLnRvTG93ZXJDYXNlKCkgPT09IHVyaUIudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZShjbXB0cywgb3B0cykgewogICAgICBjb25zdCBjb21wb25lbnRzID0gewogICAgICAgIGhvc3Q6IGNtcHRzLmhvc3QsCiAgICAgICAgc2NoZW1lOiBjbXB0cy5zY2hlbWUsCiAgICAgICAgdXNlcmluZm86IGNtcHRzLnVzZXJpbmZvLAogICAgICAgIHBvcnQ6IGNtcHRzLnBvcnQsCiAgICAgICAgcGF0aDogY21wdHMucGF0aCwKICAgICAgICBxdWVyeTogY21wdHMucXVlcnksCiAgICAgICAgbmlkOiBjbXB0cy5uaWQsCiAgICAgICAgbnNzOiBjbXB0cy5uc3MsCiAgICAgICAgdXVpZDogY21wdHMudXVpZCwKICAgICAgICBmcmFnbWVudDogY21wdHMuZnJhZ21lbnQsCiAgICAgICAgcmVmZXJlbmNlOiBjbXB0cy5yZWZlcmVuY2UsCiAgICAgICAgcmVzb3VyY2VOYW1lOiBjbXB0cy5yZXNvdXJjZU5hbWUsCiAgICAgICAgc2VjdXJlOiBjbXB0cy5zZWN1cmUsCiAgICAgICAgZXJyb3I6ICIiCiAgICAgIH07CiAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzKTsKICAgICAgY29uc3QgdXJpVG9rZW5zID0gW107CiAgICAgIGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCAiIikudG9Mb3dlckNhc2UoKV07CiAgICAgIGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKSBzY2hlbWVIYW5kbGVyLnNlcmlhbGl6ZShjb21wb25lbnRzLCBvcHRpb25zKTsKICAgICAgaWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdm9pZCAwKSB7CiAgICAgICAgaWYgKCFvcHRpb25zLnNraXBFc2NhcGUpIHsKICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IGVzY2FwZShjb21wb25lbnRzLnBhdGgpOwogICAgICAgICAgaWYgKGNvbXBvbmVudHMuc2NoZW1lICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgY29tcG9uZW50cy5wYXRoID0gY29tcG9uZW50cy5wYXRoLnNwbGl0KCIlM0EiKS5qb2luKCI6Iik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IHVuZXNjYXBlKGNvbXBvbmVudHMucGF0aCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLnJlZmVyZW5jZSAhPT0gInN1ZmZpeCIgJiYgY29tcG9uZW50cy5zY2hlbWUpIHsKICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnNjaGVtZSwgIjoiKTsKICAgICAgfQogICAgICBjb25zdCBhdXRob3JpdHkgPSByZWNvbXBvc2VBdXRob3JpdHkoY29tcG9uZW50cywgb3B0aW9ucyk7CiAgICAgIGlmIChhdXRob3JpdHkgIT09IHZvaWQgMCkgewogICAgICAgIGlmIChvcHRpb25zLnJlZmVyZW5jZSAhPT0gInN1ZmZpeCIpIHsKICAgICAgICAgIHVyaVRva2Vucy5wdXNoKCIvLyIpOwogICAgICAgIH0KICAgICAgICB1cmlUb2tlbnMucHVzaChhdXRob3JpdHkpOwogICAgICAgIGlmIChjb21wb25lbnRzLnBhdGggJiYgY29tcG9uZW50cy5wYXRoLmNoYXJBdCgwKSAhPT0gIi8iKSB7CiAgICAgICAgICB1cmlUb2tlbnMucHVzaCgiLyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29tcG9uZW50cy5wYXRoICE9PSB2b2lkIDApIHsKICAgICAgICBsZXQgcyA9IGNvbXBvbmVudHMucGF0aDsKICAgICAgICBpZiAoIW9wdGlvbnMuYWJzb2x1dGVQYXRoICYmICghc2NoZW1lSGFuZGxlciB8fCAhc2NoZW1lSGFuZGxlci5hYnNvbHV0ZVBhdGgpKSB7CiAgICAgICAgICBzID0gcmVtb3ZlRG90U2VnbWVudHMocyk7CiAgICAgICAgfQogICAgICAgIGlmIChhdXRob3JpdHkgPT09IHZvaWQgMCkgewogICAgICAgICAgcyA9IHMucmVwbGFjZSgvXlwvXC8vdSwgIi8lMkYiKTsKICAgICAgICB9CiAgICAgICAgdXJpVG9rZW5zLnB1c2gocyk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvbmVudHMucXVlcnkgIT09IHZvaWQgMCkgewogICAgICAgIHVyaVRva2Vucy5wdXNoKCI/IiwgY29tcG9uZW50cy5xdWVyeSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvbmVudHMuZnJhZ21lbnQgIT09IHZvaWQgMCkgewogICAgICAgIHVyaVRva2Vucy5wdXNoKCIjIiwgY29tcG9uZW50cy5mcmFnbWVudCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVyaVRva2Vucy5qb2luKCIiKTsKICAgIH0KICAgIHZhciBoZXhMb29rVXAgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMjcgfSwgKHYsIGspID0+IC9bXiEiJCYnKCkqKyxcLS47PV9gYS16e31+XS91LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShrKSkpOwogICAgZnVuY3Rpb24gbm9uU2ltcGxlRG9tYWluKHZhbHVlKSB7CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaWYgKGNvZGUgPiAxMjYgfHwgaGV4TG9va1VwW2NvZGVdKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIFVSSV9QQVJTRSA9IC9eKD86KFteIy86P10rKTopPyg/OlwvXC8oKD86KFteIy8/QF0qKUApPyhcW1teIy8/XF1dK1xdfFteIy86P10qKSg/OjooXGQqKSk/KSk/KFteIz9dKikoPzpcPyhbXiNdKikpPyg/OiMoKD86LnxbXG5ccl0pKikpPy91OwogICAgZnVuY3Rpb24gcGFyc2UodXJpLCBvcHRzKSB7CiAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzKTsKICAgICAgY29uc3QgcGFyc2VkID0gewogICAgICAgIHNjaGVtZTogdm9pZCAwLAogICAgICAgIHVzZXJpbmZvOiB2b2lkIDAsCiAgICAgICAgaG9zdDogIiIsCiAgICAgICAgcG9ydDogdm9pZCAwLAogICAgICAgIHBhdGg6ICIiLAogICAgICAgIHF1ZXJ5OiB2b2lkIDAsCiAgICAgICAgZnJhZ21lbnQ6IHZvaWQgMAogICAgICB9OwogICAgICBjb25zdCBnb3RFbmNvZGluZyA9IHVyaS5pbmRleE9mKCIlIikgIT09IC0xOwogICAgICBsZXQgaXNJUCA9IGZhbHNlOwogICAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgPT09ICJzdWZmaXgiKSB1cmkgPSAob3B0aW9ucy5zY2hlbWUgPyBvcHRpb25zLnNjaGVtZSArICI6IiA6ICIiKSArICIvLyIgKyB1cmk7CiAgICAgIGNvbnN0IG1hdGNoZXMgPSB1cmkubWF0Y2goVVJJX1BBUlNFKTsKICAgICAgaWYgKG1hdGNoZXMpIHsKICAgICAgICBwYXJzZWQuc2NoZW1lID0gbWF0Y2hlc1sxXTsKICAgICAgICBwYXJzZWQudXNlcmluZm8gPSBtYXRjaGVzWzNdOwogICAgICAgIHBhcnNlZC5ob3N0ID0gbWF0Y2hlc1s0XTsKICAgICAgICBwYXJzZWQucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTsKICAgICAgICBwYXJzZWQucGF0aCA9IG1hdGNoZXNbNl0gfHwgIiI7CiAgICAgICAgcGFyc2VkLnF1ZXJ5ID0gbWF0Y2hlc1s3XTsKICAgICAgICBwYXJzZWQuZnJhZ21lbnQgPSBtYXRjaGVzWzhdOwogICAgICAgIGlmIChpc05hTihwYXJzZWQucG9ydCkpIHsKICAgICAgICAgIHBhcnNlZC5wb3J0ID0gbWF0Y2hlc1s1XTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnNlZC5ob3N0KSB7CiAgICAgICAgICBjb25zdCBpcHY0cmVzdWx0ID0gbm9ybWFsaXplSVB2NChwYXJzZWQuaG9zdCk7CiAgICAgICAgICBpZiAoaXB2NHJlc3VsdC5pc0lQVjQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNvbnN0IGlwdjZyZXN1bHQgPSBub3JtYWxpemVJUHY2KGlwdjRyZXN1bHQuaG9zdCwgeyBpc0lQVjQ6IGZhbHNlIH0pOwogICAgICAgICAgICBwYXJzZWQuaG9zdCA9IGlwdjZyZXN1bHQuaG9zdC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBpc0lQID0gaXB2NnJlc3VsdC5pc0lQVjY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJzZWQuaG9zdCA9IGlwdjRyZXN1bHQuaG9zdDsKICAgICAgICAgICAgaXNJUCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwYXJzZWQuc2NoZW1lID09PSB2b2lkIDAgJiYgcGFyc2VkLnVzZXJpbmZvID09PSB2b2lkIDAgJiYgcGFyc2VkLmhvc3QgPT09IHZvaWQgMCAmJiBwYXJzZWQucG9ydCA9PT0gdm9pZCAwICYmICFwYXJzZWQucGF0aCAmJiBwYXJzZWQucXVlcnkgPT09IHZvaWQgMCkgewogICAgICAgICAgcGFyc2VkLnJlZmVyZW5jZSA9ICJzYW1lLWRvY3VtZW50IjsKICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZC5zY2hlbWUgPT09IHZvaWQgMCkgewogICAgICAgICAgcGFyc2VkLnJlZmVyZW5jZSA9ICJyZWxhdGl2ZSI7CiAgICAgICAgfSBlbHNlIGlmIChwYXJzZWQuZnJhZ21lbnQgPT09IHZvaWQgMCkgewogICAgICAgICAgcGFyc2VkLnJlZmVyZW5jZSA9ICJhYnNvbHV0ZSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcnNlZC5yZWZlcmVuY2UgPSAidXJpIjsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSAic3VmZml4IiAmJiBvcHRpb25zLnJlZmVyZW5jZSAhPT0gcGFyc2VkLnJlZmVyZW5jZSkgewogICAgICAgICAgcGFyc2VkLmVycm9yID0gcGFyc2VkLmVycm9yIHx8ICJVUkkgaXMgbm90IGEgIiArIG9wdGlvbnMucmVmZXJlbmNlICsgIiByZWZlcmVuY2UuIjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2NoZW1lSGFuZGxlciA9IFNDSEVNRVNbKG9wdGlvbnMuc2NoZW1lIHx8IHBhcnNlZC5zY2hlbWUgfHwgIiIpLnRvTG93ZXJDYXNlKCldOwogICAgICAgIGlmICghb3B0aW9ucy51bmljb2RlU3VwcG9ydCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIudW5pY29kZVN1cHBvcnQpKSB7CiAgICAgICAgICBpZiAocGFyc2VkLmhvc3QgJiYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCBzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIuZG9tYWluSG9zdCkgJiYgaXNJUCA9PT0gZmFsc2UgJiYgbm9uU2ltcGxlRG9tYWluKHBhcnNlZC5ob3N0KSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHBhcnNlZC5ob3N0ID0gVVJMLmRvbWFpblRvQVNDSUkocGFyc2VkLmhvc3QudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBwYXJzZWQuZXJyb3IgPSBwYXJzZWQuZXJyb3IgfHwgIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSTogIiArIGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzY2hlbWVIYW5kbGVyIHx8IHNjaGVtZUhhbmRsZXIgJiYgIXNjaGVtZUhhbmRsZXIuc2tpcE5vcm1hbGl6ZSkgewogICAgICAgICAgaWYgKGdvdEVuY29kaW5nICYmIHBhcnNlZC5zY2hlbWUgIT09IHZvaWQgMCkgewogICAgICAgICAgICBwYXJzZWQuc2NoZW1lID0gdW5lc2NhcGUocGFyc2VkLnNjaGVtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZ290RW5jb2RpbmcgJiYgcGFyc2VkLmhvc3QgIT09IHZvaWQgMCkgewogICAgICAgICAgICBwYXJzZWQuaG9zdCA9IHVuZXNjYXBlKHBhcnNlZC5ob3N0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJzZWQucGF0aCAhPT0gdm9pZCAwICYmIHBhcnNlZC5wYXRoLmxlbmd0aCkgewogICAgICAgICAgICBwYXJzZWQucGF0aCA9IGVzY2FwZSh1bmVzY2FwZShwYXJzZWQucGF0aCkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnNlZC5mcmFnbWVudCAhPT0gdm9pZCAwICYmIHBhcnNlZC5mcmFnbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgcGFyc2VkLmZyYWdtZW50ID0gZW5jb2RlVVJJKGRlY29kZVVSSUNvbXBvbmVudChwYXJzZWQuZnJhZ21lbnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5wYXJzZSkgewogICAgICAgICAgc2NoZW1lSGFuZGxlci5wYXJzZShwYXJzZWQsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJzZWQuZXJyb3IgPSBwYXJzZWQuZXJyb3IgfHwgIlVSSSBjYW4gbm90IGJlIHBhcnNlZC4iOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZWQ7CiAgICB9CiAgICB2YXIgZmFzdFVyaSA9IHsKICAgICAgU0NIRU1FUywKICAgICAgbm9ybWFsaXplLAogICAgICByZXNvbHZlLAogICAgICByZXNvbHZlQ29tcG9uZW50cywKICAgICAgZXF1YWwsCiAgICAgIHNlcmlhbGl6ZSwKICAgICAgcGFyc2UKICAgIH07CiAgICBtb2R1bGUyLmV4cG9ydHMgPSBmYXN0VXJpOwogICAgbW9kdWxlMi5leHBvcnRzLmRlZmF1bHQgPSBmYXN0VXJpOwogICAgbW9kdWxlMi5leHBvcnRzLmZhc3RVcmkgPSBmYXN0VXJpOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9ydW50aW1lL3VyaS5qcwp2YXIgcmVxdWlyZV91cmkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvcnVudGltZS91cmkuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciB1cmkgPSByZXF1aXJlX2Zhc3RfdXJpKCk7CiAgICB1cmkuY29kZSA9ICdyZXF1aXJlKCJhanYvZGlzdC9ydW50aW1lL3VyaSIpLmRlZmF1bHQnOwogICAgZXhwb3J0czIuZGVmYXVsdCA9IHVyaTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29yZS5qcwp2YXIgcmVxdWlyZV9jb3JlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvcmUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkNvZGVHZW4gPSBleHBvcnRzMi5OYW1lID0gZXhwb3J0czIubmlsID0gZXhwb3J0czIuc3RyaW5naWZ5ID0gZXhwb3J0czIuc3RyID0gZXhwb3J0czIuXyA9IGV4cG9ydHMyLktleXdvcmRDeHQgPSB2b2lkIDA7CiAgICB2YXIgdmFsaWRhdGVfMSA9IHJlcXVpcmVfdmFsaWRhdGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIktleXdvcmRDeHQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB2YWxpZGF0ZV8xLktleXdvcmRDeHQ7CiAgICB9IH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiXyIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVnZW5fMS5fOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInN0ciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVnZW5fMS5zdHI7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic3RyaW5naWZ5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZWdlbl8xLnN0cmluZ2lmeTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJuaWwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlZ2VuXzEubmlsOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIk5hbWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlZ2VuXzEuTmFtZTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJDb2RlR2VuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZWdlbl8xLkNvZGVHZW47CiAgICB9IH0pOwogICAgdmFyIHZhbGlkYXRpb25fZXJyb3JfMSA9IHJlcXVpcmVfdmFsaWRhdGlvbl9lcnJvcigpOwogICAgdmFyIHJlZl9lcnJvcl8xID0gcmVxdWlyZV9yZWZfZXJyb3IoKTsKICAgIHZhciBydWxlc18xID0gcmVxdWlyZV9ydWxlcygpOwogICAgdmFyIGNvbXBpbGVfMSA9IHJlcXVpcmVfY29tcGlsZSgpOwogICAgdmFyIGNvZGVnZW5fMiA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHJlc29sdmVfMSA9IHJlcXVpcmVfcmVzb2x2ZSgpOwogICAgdmFyIGRhdGFUeXBlXzEgPSByZXF1aXJlX2RhdGFUeXBlKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgJGRhdGFSZWZTY2hlbWEgPSByZXF1aXJlX2RhdGEoKTsKICAgIHZhciB1cmlfMSA9IHJlcXVpcmVfdXJpKCk7CiAgICB2YXIgZGVmYXVsdFJlZ0V4cCA9IChzdHIsIGZsYWdzKSA9PiBuZXcgUmVnRXhwKHN0ciwgZmxhZ3MpOwogICAgZGVmYXVsdFJlZ0V4cC5jb2RlID0gIm5ldyBSZWdFeHAiOwogICAgdmFyIE1FVEFfSUdOT1JFX09QVElPTlMgPSBbInJlbW92ZUFkZGl0aW9uYWwiLCAidXNlRGVmYXVsdHMiLCAiY29lcmNlVHlwZXMiXTsKICAgIHZhciBFWFRfU0NPUEVfTkFNRVMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbCiAgICAgICJ2YWxpZGF0ZSIsCiAgICAgICJzZXJpYWxpemUiLAogICAgICAicGFyc2UiLAogICAgICAid3JhcHBlciIsCiAgICAgICJyb290IiwKICAgICAgInNjaGVtYSIsCiAgICAgICJrZXl3b3JkIiwKICAgICAgInBhdHRlcm4iLAogICAgICAiZm9ybWF0cyIsCiAgICAgICJ2YWxpZGF0ZSRkYXRhIiwKICAgICAgImZ1bmMiLAogICAgICAib2JqIiwKICAgICAgIkVycm9yIgogICAgXSk7CiAgICB2YXIgcmVtb3ZlZE9wdGlvbnMgPSB7CiAgICAgIGVycm9yRGF0YVBhdGg6ICIiLAogICAgICBmb3JtYXQ6ICJgdmFsaWRhdGVGb3JtYXRzOiBmYWxzZWAgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLAogICAgICBudWxsYWJsZTogJyJudWxsYWJsZSIga2V5d29yZCBpcyBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4nLAogICAgICBqc29uUG9pbnRlcnM6ICJEZXByZWNhdGVkIGpzUHJvcGVydHlTeW50YXggY2FuIGJlIHVzZWQgaW5zdGVhZC4iLAogICAgICBleHRlbmRSZWZzOiAiRGVwcmVjYXRlZCBpZ25vcmVLZXl3b3Jkc1dpdGhSZWYgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLAogICAgICBtaXNzaW5nUmVmczogIlBhc3MgZW1wdHkgc2NoZW1hIHdpdGggJGlkIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgdG8gYWp2LmFkZFNjaGVtYS4iLAogICAgICBwcm9jZXNzQ29kZTogIlVzZSBvcHRpb24gYGNvZGU6IHtwcm9jZXNzOiAoY29kZSwgc2NoZW1hRW52OiBvYmplY3QpID0+IHN0cmluZ31gIiwKICAgICAgc291cmNlQ29kZTogIlVzZSBvcHRpb24gYGNvZGU6IHtzb3VyY2U6IHRydWV9YCIsCiAgICAgIHN0cmljdERlZmF1bHRzOiAiSXQgaXMgZGVmYXVsdCBub3csIHNlZSBvcHRpb24gYHN0cmljdGAuIiwKICAgICAgc3RyaWN0S2V5d29yZHM6ICJJdCBpcyBkZWZhdWx0IG5vdywgc2VlIG9wdGlvbiBgc3RyaWN0YC4iLAogICAgICB1bmlxdWVJdGVtczogJyJ1bmlxdWVJdGVtcyIga2V5d29yZCBpcyBhbHdheXMgdmFsaWRhdGVkLicsCiAgICAgIHVua25vd25Gb3JtYXRzOiAiRGlzYWJsZSBzdHJpY3QgbW9kZSBvciBwYXNzIGB0cnVlYCB0byBgYWp2LmFkZEZvcm1hdGAgKG9yIGBmb3JtYXRzYCBvcHRpb24pLiIsCiAgICAgIGNhY2hlOiAiTWFwIGlzIHVzZWQgYXMgY2FjaGUsIHNjaGVtYSBvYmplY3QgYXMga2V5LiIsCiAgICAgIHNlcmlhbGl6ZTogIk1hcCBpcyB1c2VkIGFzIGNhY2hlLCBzY2hlbWEgb2JqZWN0IGFzIGtleS4iLAogICAgICBhanZFcnJvcnM6ICJJdCBpcyBkZWZhdWx0IG5vdy4iCiAgICB9OwogICAgdmFyIGRlcHJlY2F0ZWRPcHRpb25zID0gewogICAgICBpZ25vcmVLZXl3b3Jkc1dpdGhSZWY6ICIiLAogICAgICBqc1Byb3BlcnR5U3ludGF4OiAiIiwKICAgICAgdW5pY29kZTogJyJtaW5MZW5ndGgiLyJtYXhMZW5ndGgiIGFjY291bnQgZm9yIHVuaWNvZGUgY2hhcmFjdGVycyBieSBkZWZhdWx0LicKICAgIH07CiAgICB2YXIgTUFYX0VYUFJFU1NJT04gPSAyMDA7CiAgICBmdW5jdGlvbiByZXF1aXJlZE9wdGlvbnMobykgewogICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdCwgX3UsIF92LCBfdywgX3gsIF95LCBfeiwgXzA7CiAgICAgIGNvbnN0IHMgPSBvLnN0cmljdDsKICAgICAgY29uc3QgX29wdHogPSAoX2EgPSBvLmNvZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpbWl6ZTsKICAgICAgY29uc3Qgb3B0aW1pemUgPSBfb3B0eiA9PT0gdHJ1ZSB8fCBfb3B0eiA9PT0gdm9pZCAwID8gMSA6IF9vcHR6IHx8IDA7CiAgICAgIGNvbnN0IHJlZ0V4cCA9IChfYyA9IChfYiA9IG8uY29kZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlZ0V4cCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVmYXVsdFJlZ0V4cDsKICAgICAgY29uc3QgdXJpUmVzb2x2ZXIgPSAoX2QgPSBvLnVyaVJlc29sdmVyKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1cmlfMS5kZWZhdWx0OwogICAgICByZXR1cm4gewogICAgICAgIHN0cmljdFNjaGVtYTogKF9mID0gKF9lID0gby5zdHJpY3RTY2hlbWEpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHMpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHRydWUsCiAgICAgICAgc3RyaWN0TnVtYmVyczogKF9oID0gKF9nID0gby5zdHJpY3ROdW1iZXJzKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBzKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiB0cnVlLAogICAgICAgIHN0cmljdFR5cGVzOiAoX2sgPSAoX2ogPSBvLnN0cmljdFR5cGVzKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBzKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAibG9nIiwKICAgICAgICBzdHJpY3RUdXBsZXM6IChfbSA9IChfbCA9IG8uc3RyaWN0VHVwbGVzKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiBzKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAibG9nIiwKICAgICAgICBzdHJpY3RSZXF1aXJlZDogKF9wID0gKF9vID0gby5zdHJpY3RSZXF1aXJlZCkgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogcykgIT09IG51bGwgJiYgX3AgIT09IHZvaWQgMCA/IF9wIDogZmFsc2UsCiAgICAgICAgY29kZTogby5jb2RlID8geyAuLi5vLmNvZGUsIG9wdGltaXplLCByZWdFeHAgfSA6IHsgb3B0aW1pemUsIHJlZ0V4cCB9LAogICAgICAgIGxvb3BSZXF1aXJlZDogKF9xID0gby5sb29wUmVxdWlyZWQpICE9PSBudWxsICYmIF9xICE9PSB2b2lkIDAgPyBfcSA6IE1BWF9FWFBSRVNTSU9OLAogICAgICAgIGxvb3BFbnVtOiAoX3IgPSBvLmxvb3BFbnVtKSAhPT0gbnVsbCAmJiBfciAhPT0gdm9pZCAwID8gX3IgOiBNQVhfRVhQUkVTU0lPTiwKICAgICAgICBtZXRhOiAoX3MgPSBvLm1ldGEpICE9PSBudWxsICYmIF9zICE9PSB2b2lkIDAgPyBfcyA6IHRydWUsCiAgICAgICAgbWVzc2FnZXM6IChfdCA9IG8ubWVzc2FnZXMpICE9PSBudWxsICYmIF90ICE9PSB2b2lkIDAgPyBfdCA6IHRydWUsCiAgICAgICAgaW5saW5lUmVmczogKF91ID0gby5pbmxpbmVSZWZzKSAhPT0gbnVsbCAmJiBfdSAhPT0gdm9pZCAwID8gX3UgOiB0cnVlLAogICAgICAgIHNjaGVtYUlkOiAoX3YgPSBvLnNjaGVtYUlkKSAhPT0gbnVsbCAmJiBfdiAhPT0gdm9pZCAwID8gX3YgOiAiJGlkIiwKICAgICAgICBhZGRVc2VkU2NoZW1hOiAoX3cgPSBvLmFkZFVzZWRTY2hlbWEpICE9PSBudWxsICYmIF93ICE9PSB2b2lkIDAgPyBfdyA6IHRydWUsCiAgICAgICAgdmFsaWRhdGVTY2hlbWE6IChfeCA9IG8udmFsaWRhdGVTY2hlbWEpICE9PSBudWxsICYmIF94ICE9PSB2b2lkIDAgPyBfeCA6IHRydWUsCiAgICAgICAgdmFsaWRhdGVGb3JtYXRzOiAoX3kgPSBvLnZhbGlkYXRlRm9ybWF0cykgIT09IG51bGwgJiYgX3kgIT09IHZvaWQgMCA/IF95IDogdHJ1ZSwKICAgICAgICB1bmljb2RlUmVnRXhwOiAoX3ogPSBvLnVuaWNvZGVSZWdFeHApICE9PSBudWxsICYmIF96ICE9PSB2b2lkIDAgPyBfeiA6IHRydWUsCiAgICAgICAgaW50MzJyYW5nZTogKF8wID0gby5pbnQzMnJhbmdlKSAhPT0gbnVsbCAmJiBfMCAhPT0gdm9pZCAwID8gXzAgOiB0cnVlLAogICAgICAgIHVyaVJlc29sdmVyCiAgICAgIH07CiAgICB9CiAgICB2YXIgQWp2ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHsKICAgICAgICB0aGlzLnNjaGVtYXMgPSB7fTsKICAgICAgICB0aGlzLnJlZnMgPSB7fTsKICAgICAgICB0aGlzLmZvcm1hdHMgPSB7fTsKICAgICAgICB0aGlzLl9jb21waWxhdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIHRoaXMuX2xvYWRpbmcgPSB7fTsKICAgICAgICB0aGlzLl9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgb3B0cyA9IHRoaXMub3B0cyA9IHsgLi4ub3B0cywgLi4ucmVxdWlyZWRPcHRpb25zKG9wdHMpIH07CiAgICAgICAgY29uc3QgeyBlczUsIGxpbmVzIH0gPSB0aGlzLm9wdHMuY29kZTsKICAgICAgICB0aGlzLnNjb3BlID0gbmV3IGNvZGVnZW5fMi5WYWx1ZVNjb3BlKHsgc2NvcGU6IHt9LCBwcmVmaXhlczogRVhUX1NDT1BFX05BTUVTLCBlczUsIGxpbmVzIH0pOwogICAgICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKG9wdHMubG9nZ2VyKTsKICAgICAgICBjb25zdCBmb3JtYXRPcHQgPSBvcHRzLnZhbGlkYXRlRm9ybWF0czsKICAgICAgICBvcHRzLnZhbGlkYXRlRm9ybWF0cyA9IGZhbHNlOwogICAgICAgIHRoaXMuUlVMRVMgPSAoMCwgcnVsZXNfMS5nZXRSdWxlcykoKTsKICAgICAgICBjaGVja09wdGlvbnMuY2FsbCh0aGlzLCByZW1vdmVkT3B0aW9ucywgb3B0cywgIk5PVCBTVVBQT1JURUQiKTsKICAgICAgICBjaGVja09wdGlvbnMuY2FsbCh0aGlzLCBkZXByZWNhdGVkT3B0aW9ucywgb3B0cywgIkRFUFJFQ0FURUQiLCAid2FybiIpOwogICAgICAgIHRoaXMuX21ldGFPcHRzID0gZ2V0TWV0YVNjaGVtYU9wdGlvbnMuY2FsbCh0aGlzKTsKICAgICAgICBpZiAob3B0cy5mb3JtYXRzKQogICAgICAgICAgYWRkSW5pdGlhbEZvcm1hdHMuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLl9hZGRWb2NhYnVsYXJpZXMoKTsKICAgICAgICB0aGlzLl9hZGREZWZhdWx0TWV0YVNjaGVtYSgpOwogICAgICAgIGlmIChvcHRzLmtleXdvcmRzKQogICAgICAgICAgYWRkSW5pdGlhbEtleXdvcmRzLmNhbGwodGhpcywgb3B0cy5rZXl3b3Jkcyk7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm1ldGEgPT0gIm9iamVjdCIpCiAgICAgICAgICB0aGlzLmFkZE1ldGFTY2hlbWEob3B0cy5tZXRhKTsKICAgICAgICBhZGRJbml0aWFsU2NoZW1hcy5jYWxsKHRoaXMpOwogICAgICAgIG9wdHMudmFsaWRhdGVGb3JtYXRzID0gZm9ybWF0T3B0OwogICAgICB9CiAgICAgIF9hZGRWb2NhYnVsYXJpZXMoKSB7CiAgICAgICAgdGhpcy5hZGRLZXl3b3JkKCIkYXN5bmMiKTsKICAgICAgfQogICAgICBfYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSB7CiAgICAgICAgY29uc3QgeyAkZGF0YSwgbWV0YSwgc2NoZW1hSWQgfSA9IHRoaXMub3B0czsKICAgICAgICBsZXQgX2RhdGFSZWZTY2hlbWEgPSAkZGF0YVJlZlNjaGVtYTsKICAgICAgICBpZiAoc2NoZW1hSWQgPT09ICJpZCIpIHsKICAgICAgICAgIF9kYXRhUmVmU2NoZW1hID0geyAuLi4kZGF0YVJlZlNjaGVtYSB9OwogICAgICAgICAgX2RhdGFSZWZTY2hlbWEuaWQgPSBfZGF0YVJlZlNjaGVtYS4kaWQ7CiAgICAgICAgICBkZWxldGUgX2RhdGFSZWZTY2hlbWEuJGlkOwogICAgICAgIH0KICAgICAgICBpZiAobWV0YSAmJiAkZGF0YSkKICAgICAgICAgIHRoaXMuYWRkTWV0YVNjaGVtYShfZGF0YVJlZlNjaGVtYSwgX2RhdGFSZWZTY2hlbWFbc2NoZW1hSWRdLCBmYWxzZSk7CiAgICAgIH0KICAgICAgZGVmYXVsdE1ldGEoKSB7CiAgICAgICAgY29uc3QgeyBtZXRhLCBzY2hlbWFJZCB9ID0gdGhpcy5vcHRzOwogICAgICAgIHJldHVybiB0aGlzLm9wdHMuZGVmYXVsdE1ldGEgPSB0eXBlb2YgbWV0YSA9PSAib2JqZWN0IiA/IG1ldGFbc2NoZW1hSWRdIHx8IG1ldGEgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgdmFsaWRhdGUoc2NoZW1hS2V5UmVmLCBkYXRhKSB7CiAgICAgICAgbGV0IHY7CiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFLZXlSZWYgPT0gInN0cmluZyIpIHsKICAgICAgICAgIHYgPSB0aGlzLmdldFNjaGVtYShzY2hlbWFLZXlSZWYpOwogICAgICAgICAgaWYgKCF2KQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgIiR7c2NoZW1hS2V5UmVmfSJgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdiA9IHRoaXMuY29tcGlsZShzY2hlbWFLZXlSZWYpOwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWxpZCA9IHYoZGF0YSk7CiAgICAgICAgaWYgKCEoIiRhc3luYyIgaW4gdikpCiAgICAgICAgICB0aGlzLmVycm9ycyA9IHYuZXJyb3JzOwogICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgfQogICAgICBjb21waWxlKHNjaGVtYSwgX21ldGEpIHsKICAgICAgICBjb25zdCBzY2ggPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfbWV0YSk7CiAgICAgICAgcmV0dXJuIHNjaC52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlU2NoZW1hRW52KHNjaCk7CiAgICAgIH0KICAgICAgY29tcGlsZUFzeW5jKHNjaGVtYSwgbWV0YSkgewogICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmxvYWRTY2hlbWEgIT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmxvYWRTY2hlbWEgc2hvdWxkIGJlIGEgZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyBsb2FkU2NoZW1hIH0gPSB0aGlzLm9wdHM7CiAgICAgICAgcmV0dXJuIHJ1bkNvbXBpbGVBc3luYy5jYWxsKHRoaXMsIHNjaGVtYSwgbWV0YSk7CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gcnVuQ29tcGlsZUFzeW5jKF9zY2hlbWEsIF9tZXRhKSB7CiAgICAgICAgICBhd2FpdCBsb2FkTWV0YVNjaGVtYS5jYWxsKHRoaXMsIF9zY2hlbWEuJHNjaGVtYSk7CiAgICAgICAgICBjb25zdCBzY2ggPSB0aGlzLl9hZGRTY2hlbWEoX3NjaGVtYSwgX21ldGEpOwogICAgICAgICAgcmV0dXJuIHNjaC52YWxpZGF0ZSB8fCBfY29tcGlsZUFzeW5jLmNhbGwodGhpcywgc2NoKTsKICAgICAgICB9CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gbG9hZE1ldGFTY2hlbWEoJHJlZikgewogICAgICAgICAgaWYgKCRyZWYgJiYgIXRoaXMuZ2V0U2NoZW1hKCRyZWYpKSB7CiAgICAgICAgICAgIGF3YWl0IHJ1bkNvbXBpbGVBc3luYy5jYWxsKHRoaXMsIHsgJHJlZiB9LCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gX2NvbXBpbGVBc3luYyhzY2gpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21waWxlU2NoZW1hRW52KHNjaCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiByZWZfZXJyb3JfMS5kZWZhdWx0KSkKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICBjaGVja0xvYWRlZC5jYWxsKHRoaXMsIGUpOwogICAgICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1NjaGVtYS5jYWxsKHRoaXMsIGUubWlzc2luZ1NjaGVtYSk7CiAgICAgICAgICAgIHJldHVybiBfY29tcGlsZUFzeW5jLmNhbGwodGhpcywgc2NoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2FkZWQoeyBtaXNzaW5nU2NoZW1hOiByZWYsIG1pc3NpbmdSZWYgfSkgewogICAgICAgICAgaWYgKHRoaXMucmVmc1tyZWZdKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW55U2NoZW1hICR7cmVmfSBpcyBsb2FkZWQgYnV0ICR7bWlzc2luZ1JlZn0gY2Fubm90IGJlIHJlc29sdmVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRNaXNzaW5nU2NoZW1hKHJlZikgewogICAgICAgICAgY29uc3QgX3NjaGVtYSA9IGF3YWl0IF9sb2FkU2NoZW1hLmNhbGwodGhpcywgcmVmKTsKICAgICAgICAgIGlmICghdGhpcy5yZWZzW3JlZl0pCiAgICAgICAgICAgIGF3YWl0IGxvYWRNZXRhU2NoZW1hLmNhbGwodGhpcywgX3NjaGVtYS4kc2NoZW1hKTsKICAgICAgICAgIGlmICghdGhpcy5yZWZzW3JlZl0pCiAgICAgICAgICAgIHRoaXMuYWRkU2NoZW1hKF9zY2hlbWEsIHJlZiwgbWV0YSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIGZ1bmN0aW9uIF9sb2FkU2NoZW1hKHJlZikgewogICAgICAgICAgY29uc3QgcCA9IHRoaXMuX2xvYWRpbmdbcmVmXTsKICAgICAgICAgIGlmIChwKQogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBhd2FpdCAodGhpcy5fbG9hZGluZ1tyZWZdID0gbG9hZFNjaGVtYShyZWYpKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sb2FkaW5nW3JlZl07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEFkZHMgc2NoZW1hIHRvIHRoZSBpbnN0YW5jZQogICAgICBhZGRTY2hlbWEoc2NoZW1hLCBrZXksIF9tZXRhLCBfdmFsaWRhdGVTY2hlbWEgPSB0aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHNjaCBvZiBzY2hlbWEpCiAgICAgICAgICAgIHRoaXMuYWRkU2NoZW1hKHNjaCwgdm9pZCAwLCBfbWV0YSwgX3ZhbGlkYXRlU2NoZW1hKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBsZXQgaWQ7CiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICBjb25zdCB7IHNjaGVtYUlkIH0gPSB0aGlzLm9wdHM7CiAgICAgICAgICBpZCA9IHNjaGVtYVtzY2hlbWFJZF07CiAgICAgICAgICBpZiAoaWQgIT09IHZvaWQgMCAmJiB0eXBlb2YgaWQgIT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgJHtzY2hlbWFJZH0gbXVzdCBiZSBzdHJpbmdgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAga2V5ID0gKDAsIHJlc29sdmVfMS5ub3JtYWxpemVJZCkoa2V5IHx8IGlkKTsKICAgICAgICB0aGlzLl9jaGVja1VuaXF1ZShrZXkpOwogICAgICAgIHRoaXMuc2NoZW1hc1trZXldID0gdGhpcy5fYWRkU2NoZW1hKHNjaGVtYSwgX21ldGEsIGtleSwgX3ZhbGlkYXRlU2NoZW1hLCB0cnVlKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICAvLyBBZGQgc2NoZW1hIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIG90aGVyIHNjaGVtYXMKICAgICAgLy8gb3B0aW9ucyBpbiBNRVRBX0lHTk9SRV9PUFRJT05TIGFyZSBhbHdheSBzZXQgdG8gZmFsc2UKICAgICAgYWRkTWV0YVNjaGVtYShzY2hlbWEsIGtleSwgX3ZhbGlkYXRlU2NoZW1hID0gdGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hKSB7CiAgICAgICAgdGhpcy5hZGRTY2hlbWEoc2NoZW1hLCBrZXksIHRydWUsIF92YWxpZGF0ZVNjaGVtYSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gIFZhbGlkYXRlIHNjaGVtYSBhZ2FpbnN0IGl0cyBtZXRhLXNjaGVtYQogICAgICB2YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRocm93T3JMb2dFcnJvcikgewogICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09ICJib29sZWFuIikKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGxldCAkc2NoZW1hOwogICAgICAgICRzY2hlbWEgPSBzY2hlbWEuJHNjaGVtYTsKICAgICAgICBpZiAoJHNjaGVtYSAhPT0gdm9pZCAwICYmIHR5cGVvZiAkc2NoZW1hICE9ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiRzY2hlbWEgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgIH0KICAgICAgICAkc2NoZW1hID0gJHNjaGVtYSB8fCB0aGlzLm9wdHMuZGVmYXVsdE1ldGEgfHwgdGhpcy5kZWZhdWx0TWV0YSgpOwogICAgICAgIGlmICghJHNjaGVtYSkgewogICAgICAgICAgdGhpcy5sb2dnZXIud2FybigibWV0YS1zY2hlbWEgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgdGhpcy5lcnJvcnMgPSBudWxsOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy52YWxpZGF0ZSgkc2NoZW1hLCBzY2hlbWEpOwogICAgICAgIGlmICghdmFsaWQgJiYgdGhyb3dPckxvZ0Vycm9yKSB7CiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gInNjaGVtYSBpcyBpbnZhbGlkOiAiICsgdGhpcy5lcnJvcnNUZXh0KCk7CiAgICAgICAgICBpZiAodGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hID09PSAibG9nIikKICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IobWVzc2FnZSk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICB9CiAgICAgIC8vIEdldCBjb21waWxlZCBzY2hlbWEgYnkgYGtleWAgb3IgYHJlZmAuCiAgICAgIC8vIChga2V5YCB0aGF0IHdhcyBwYXNzZWQgdG8gYGFkZFNjaGVtYWAgb3IgZnVsbCBzY2hlbWEgcmVmZXJlbmNlIC0gYHNjaGVtYS4kaWRgIG9yIHJlc29sdmVkIGlkKQogICAgICBnZXRTY2hlbWEoa2V5UmVmKSB7CiAgICAgICAgbGV0IHNjaDsKICAgICAgICB3aGlsZSAodHlwZW9mIChzY2ggPSBnZXRTY2hFbnYuY2FsbCh0aGlzLCBrZXlSZWYpKSA9PSAic3RyaW5nIikKICAgICAgICAgIGtleVJlZiA9IHNjaDsKICAgICAgICBpZiAoc2NoID09PSB2b2lkIDApIHsKICAgICAgICAgIGNvbnN0IHsgc2NoZW1hSWQgfSA9IHRoaXMub3B0czsKICAgICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgY29tcGlsZV8xLlNjaGVtYUVudih7IHNjaGVtYToge30sIHNjaGVtYUlkIH0pOwogICAgICAgICAgc2NoID0gY29tcGlsZV8xLnJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCBrZXlSZWYpOwogICAgICAgICAgaWYgKCFzY2gpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIHRoaXMucmVmc1trZXlSZWZdID0gc2NoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2NoLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYoc2NoKTsKICAgICAgfQogICAgICAvLyBSZW1vdmUgY2FjaGVkIHNjaGVtYShzKS4KICAgICAgLy8gSWYgbm8gcGFyYW1ldGVyIGlzIHBhc3NlZCBhbGwgc2NoZW1hcyBidXQgbWV0YS1zY2hlbWFzIGFyZSByZW1vdmVkLgogICAgICAvLyBJZiBSZWdFeHAgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIHdpdGgga2V5L2lkIG1hdGNoaW5nIHBhdHRlcm4gYnV0IG1ldGEtc2NoZW1hcyBhcmUgcmVtb3ZlZC4KICAgICAgLy8gRXZlbiBpZiBzY2hlbWEgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBzY2hlbWFzIGl0IHN0aWxsIGNhbiBiZSByZW1vdmVkIGFzIG90aGVyIHNjaGVtYXMgaGF2ZSBsb2NhbCByZWZlcmVuY2VzLgogICAgICByZW1vdmVTY2hlbWEoc2NoZW1hS2V5UmVmKSB7CiAgICAgICAgaWYgKHNjaGVtYUtleVJlZiBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnNjaGVtYXMsIHNjaGVtYUtleVJlZik7CiAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMucmVmcywgc2NoZW1hS2V5UmVmKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWFLZXlSZWYpIHsKICAgICAgICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFNjaGVtYXModGhpcy5zY2hlbWFzKTsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMpOwogICAgICAgICAgICB0aGlzLl9jYWNoZS5jbGVhcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIGNhc2UgInN0cmluZyI6IHsKICAgICAgICAgICAgY29uc3Qgc2NoID0gZ2V0U2NoRW52LmNhbGwodGhpcywgc2NoZW1hS2V5UmVmKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzY2ggPT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKHNjaC5zY2hlbWEpOwogICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWFzW3NjaGVtYUtleVJlZl07CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlZnNbc2NoZW1hS2V5UmVmXTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJvYmplY3QiOiB7CiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gc2NoZW1hS2V5UmVmOwogICAgICAgICAgICB0aGlzLl9jYWNoZS5kZWxldGUoY2FjaGVLZXkpOwogICAgICAgICAgICBsZXQgaWQgPSBzY2hlbWFLZXlSZWZbdGhpcy5vcHRzLnNjaGVtYUlkXTsKICAgICAgICAgICAgaWYgKGlkKSB7CiAgICAgICAgICAgICAgaWQgPSAoMCwgcmVzb2x2ZV8xLm5vcm1hbGl6ZUlkKShpZCk7CiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hc1tpZF07CiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVmc1tpZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFqdi5yZW1vdmVTY2hlbWE6IGludmFsaWQgcGFyYW1ldGVyIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGFkZCAidm9jYWJ1bGFyeSIgLSBhIGNvbGxlY3Rpb24gb2Yga2V5d29yZHMKICAgICAgYWRkVm9jYWJ1bGFyeShkZWZpbml0aW9ucykgewogICAgICAgIGZvciAoY29uc3QgZGVmIG9mIGRlZmluaXRpb25zKQogICAgICAgICAgdGhpcy5hZGRLZXl3b3JkKGRlZik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgYWRkS2V5d29yZChrd2RPckRlZiwgZGVmKSB7CiAgICAgICAgbGV0IGtleXdvcmQ7CiAgICAgICAgaWYgKHR5cGVvZiBrd2RPckRlZiA9PSAic3RyaW5nIikgewogICAgICAgICAga2V5d29yZCA9IGt3ZE9yRGVmOwogICAgICAgICAgaWYgKHR5cGVvZiBkZWYgPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhlc2UgcGFyYW1ldGVycyBhcmUgZGVwcmVjYXRlZCwgc2VlIGRvY3MgZm9yIGFkZEtleXdvcmQiKTsKICAgICAgICAgICAgZGVmLmtleXdvcmQgPSBrZXl3b3JkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGt3ZE9yRGVmID09ICJvYmplY3QiICYmIGRlZiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWYgPSBrd2RPckRlZjsKICAgICAgICAgIGtleXdvcmQgPSBkZWYua2V5d29yZDsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXdvcmQpICYmICFrZXl3b3JkLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFkZEtleXdvcmRzOiBrZXl3b3JkIG11c3QgYmUgc3RyaW5nIG9yIG5vbi1lbXB0eSBhcnJheSIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYWRkS2V5d29yZHMgcGFyYW1ldGVycyIpOwogICAgICAgIH0KICAgICAgICBjaGVja0tleXdvcmQuY2FsbCh0aGlzLCBrZXl3b3JkLCBkZWYpOwogICAgICAgIGlmICghZGVmKSB7CiAgICAgICAgICAoMCwgdXRpbF8xLmVhY2hJdGVtKShrZXl3b3JkLCAoa3dkKSA9PiBhZGRSdWxlLmNhbGwodGhpcywga3dkKSk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAga2V5d29yZE1ldGFzY2hlbWEuY2FsbCh0aGlzLCBkZWYpOwogICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB7CiAgICAgICAgICAuLi5kZWYsCiAgICAgICAgICB0eXBlOiAoMCwgZGF0YVR5cGVfMS5nZXRKU09OVHlwZXMpKGRlZi50eXBlKSwKICAgICAgICAgIHNjaGVtYVR5cGU6ICgwLCBkYXRhVHlwZV8xLmdldEpTT05UeXBlcykoZGVmLnNjaGVtYVR5cGUpCiAgICAgICAgfTsKICAgICAgICAoMCwgdXRpbF8xLmVhY2hJdGVtKShrZXl3b3JkLCBkZWZpbml0aW9uLnR5cGUubGVuZ3RoID09PSAwID8gKGspID0+IGFkZFJ1bGUuY2FsbCh0aGlzLCBrLCBkZWZpbml0aW9uKSA6IChrKSA9PiBkZWZpbml0aW9uLnR5cGUuZm9yRWFjaCgodCkgPT4gYWRkUnVsZS5jYWxsKHRoaXMsIGssIGRlZmluaXRpb24sIHQpKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgZ2V0S2V5d29yZChrZXl3b3JkKSB7CiAgICAgICAgY29uc3QgcnVsZSA9IHRoaXMuUlVMRVMuYWxsW2tleXdvcmRdOwogICAgICAgIHJldHVybiB0eXBlb2YgcnVsZSA9PSAib2JqZWN0IiA/IHJ1bGUuZGVmaW5pdGlvbiA6ICEhcnVsZTsKICAgICAgfQogICAgICAvLyBSZW1vdmUga2V5d29yZAogICAgICByZW1vdmVLZXl3b3JkKGtleXdvcmQpIHsKICAgICAgICBjb25zdCB7IFJVTEVTIH0gPSB0aGlzOwogICAgICAgIGRlbGV0ZSBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXTsKICAgICAgICBkZWxldGUgUlVMRVMuYWxsW2tleXdvcmRdOwogICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgUlVMRVMucnVsZXMpIHsKICAgICAgICAgIGNvbnN0IGkgPSBncm91cC5ydWxlcy5maW5kSW5kZXgoKHJ1bGUpID0+IHJ1bGUua2V5d29yZCA9PT0ga2V5d29yZCk7CiAgICAgICAgICBpZiAoaSA+PSAwKQogICAgICAgICAgICBncm91cC5ydWxlcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8vIEFkZCBmb3JtYXQKICAgICAgYWRkRm9ybWF0KG5hbWUsIGZvcm1hdCkgewogICAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09ICJzdHJpbmciKQogICAgICAgICAgZm9ybWF0ID0gbmV3IFJlZ0V4cChmb3JtYXQpOwogICAgICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IGZvcm1hdDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBlcnJvcnNUZXh0KGVycm9ycyA9IHRoaXMuZXJyb3JzLCB7IHNlcGFyYXRvciA9ICIsICIsIGRhdGFWYXIgPSAiZGF0YSIgfSA9IHt9KSB7CiAgICAgICAgaWYgKCFlcnJvcnMgfHwgZXJyb3JzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiAiTm8gZXJyb3JzIjsKICAgICAgICByZXR1cm4gZXJyb3JzLm1hcCgoZSkgPT4gYCR7ZGF0YVZhcn0ke2UuaW5zdGFuY2VQYXRofSAke2UubWVzc2FnZX1gKS5yZWR1Y2UoKHRleHQsIG1zZykgPT4gdGV4dCArIHNlcGFyYXRvciArIG1zZyk7CiAgICAgIH0KICAgICAgJGRhdGFNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIGtleXdvcmRzSnNvblBvaW50ZXJzKSB7CiAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLlJVTEVTLmFsbDsKICAgICAgICBtZXRhU2NoZW1hID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtZXRhU2NoZW1hKSk7CiAgICAgICAgZm9yIChjb25zdCBqc29uUG9pbnRlciBvZiBrZXl3b3Jkc0pzb25Qb2ludGVycykgewogICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBqc29uUG9pbnRlci5zcGxpdCgiLyIpLnNsaWNlKDEpOwogICAgICAgICAgbGV0IGtleXdvcmRzID0gbWV0YVNjaGVtYTsKICAgICAgICAgIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKQogICAgICAgICAgICBrZXl3b3JkcyA9IGtleXdvcmRzW3NlZ107CiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBydWxlcykgewogICAgICAgICAgICBjb25zdCBydWxlID0gcnVsZXNba2V5XTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBydWxlICE9ICJvYmplY3QiKQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCB7ICRkYXRhIH0gPSBydWxlLmRlZmluaXRpb247CiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IGtleXdvcmRzW2tleV07CiAgICAgICAgICAgIGlmICgkZGF0YSAmJiBzY2hlbWEpCiAgICAgICAgICAgICAga2V5d29yZHNba2V5XSA9IHNjaGVtYU9yRGF0YShzY2hlbWEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YVNjaGVtYTsKICAgICAgfQogICAgICBfcmVtb3ZlQWxsU2NoZW1hcyhzY2hlbWFzLCByZWdleCkgewogICAgICAgIGZvciAoY29uc3Qga2V5UmVmIGluIHNjaGVtYXMpIHsKICAgICAgICAgIGNvbnN0IHNjaCA9IHNjaGVtYXNba2V5UmVmXTsKICAgICAgICAgIGlmICghcmVnZXggfHwgcmVnZXgudGVzdChrZXlSZWYpKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgZGVsZXRlIHNjaGVtYXNba2V5UmVmXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzY2ggJiYgIXNjaC5tZXRhKSB7CiAgICAgICAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKHNjaC5zY2hlbWEpOwogICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFzW2tleVJlZl07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgX2FkZFNjaGVtYShzY2hlbWEsIG1ldGEsIGJhc2VJZCwgdmFsaWRhdGVTY2hlbWEgPSB0aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEsIGFkZFNjaGVtYSA9IHRoaXMub3B0cy5hZGRVc2VkU2NoZW1hKSB7CiAgICAgICAgbGV0IGlkOwogICAgICAgIGNvbnN0IHsgc2NoZW1hSWQgfSA9IHRoaXMub3B0czsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAib2JqZWN0IikgewogICAgICAgICAgaWQgPSBzY2hlbWFbc2NoZW1hSWRdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodGhpcy5vcHRzLmp0ZCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJzY2hlbWEgbXVzdCBiZSBvYmplY3QiKTsKICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzY2hlbWEgIT0gImJvb2xlYW4iKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNjaGVtYSBtdXN0IGJlIG9iamVjdCBvciBib29sZWFuIik7CiAgICAgICAgfQogICAgICAgIGxldCBzY2ggPSB0aGlzLl9jYWNoZS5nZXQoc2NoZW1hKTsKICAgICAgICBpZiAoc2NoICE9PSB2b2lkIDApCiAgICAgICAgICByZXR1cm4gc2NoOwogICAgICAgIGJhc2VJZCA9ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKGlkIHx8IGJhc2VJZCk7CiAgICAgICAgY29uc3QgbG9jYWxSZWZzID0gcmVzb2x2ZV8xLmdldFNjaGVtYVJlZnMuY2FsbCh0aGlzLCBzY2hlbWEsIGJhc2VJZCk7CiAgICAgICAgc2NoID0gbmV3IGNvbXBpbGVfMS5TY2hlbWFFbnYoeyBzY2hlbWEsIHNjaGVtYUlkLCBtZXRhLCBiYXNlSWQsIGxvY2FsUmVmcyB9KTsKICAgICAgICB0aGlzLl9jYWNoZS5zZXQoc2NoLnNjaGVtYSwgc2NoKTsKICAgICAgICBpZiAoYWRkU2NoZW1hICYmICFiYXNlSWQuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgICAgICBpZiAoYmFzZUlkKQogICAgICAgICAgICB0aGlzLl9jaGVja1VuaXF1ZShiYXNlSWQpOwogICAgICAgICAgdGhpcy5yZWZzW2Jhc2VJZF0gPSBzY2g7CiAgICAgICAgfQogICAgICAgIGlmICh2YWxpZGF0ZVNjaGVtYSkKICAgICAgICAgIHRoaXMudmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0cnVlKTsKICAgICAgICByZXR1cm4gc2NoOwogICAgICB9CiAgICAgIF9jaGVja1VuaXF1ZShpZCkgewogICAgICAgIGlmICh0aGlzLnNjaGVtYXNbaWRdIHx8IHRoaXMucmVmc1tpZF0pIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hIHdpdGgga2V5IG9yIGlkICIke2lkfSIgYWxyZWFkeSBleGlzdHNgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX2NvbXBpbGVTY2hlbWFFbnYoc2NoKSB7CiAgICAgICAgaWYgKHNjaC5tZXRhKQogICAgICAgICAgdGhpcy5fY29tcGlsZU1ldGFTY2hlbWEoc2NoKTsKICAgICAgICBlbHNlCiAgICAgICAgICBjb21waWxlXzEuY29tcGlsZVNjaGVtYS5jYWxsKHRoaXMsIHNjaCk7CiAgICAgICAgaWYgKCFzY2gudmFsaWRhdGUpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvciIpOwogICAgICAgIHJldHVybiBzY2gudmFsaWRhdGU7CiAgICAgIH0KICAgICAgX2NvbXBpbGVNZXRhU2NoZW1hKHNjaCkgewogICAgICAgIGNvbnN0IGN1cnJlbnRPcHRzID0gdGhpcy5vcHRzOwogICAgICAgIHRoaXMub3B0cyA9IHRoaXMuX21ldGFPcHRzOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb21waWxlXzEuY29tcGlsZVNjaGVtYS5jYWxsKHRoaXMsIHNjaCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMub3B0cyA9IGN1cnJlbnRPcHRzOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIEFqdi5WYWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0aW9uX2Vycm9yXzEuZGVmYXVsdDsKICAgIEFqdi5NaXNzaW5nUmVmRXJyb3IgPSByZWZfZXJyb3JfMS5kZWZhdWx0OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IEFqdjsKICAgIGZ1bmN0aW9uIGNoZWNrT3B0aW9ucyhjaGVja09wdHMsIG9wdGlvbnMsIG1zZywgbG9nID0gImVycm9yIikgewogICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGVja09wdHMpIHsKICAgICAgICBjb25zdCBvcHQgPSBrZXk7CiAgICAgICAgaWYgKG9wdCBpbiBvcHRpb25zKQogICAgICAgICAgdGhpcy5sb2dnZXJbbG9nXShgJHttc2d9OiBvcHRpb24gJHtrZXl9LiAke2NoZWNrT3B0c1tvcHRdfWApOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTY2hFbnYoa2V5UmVmKSB7CiAgICAgIGtleVJlZiA9ICgwLCByZXNvbHZlXzEubm9ybWFsaXplSWQpKGtleVJlZik7CiAgICAgIHJldHVybiB0aGlzLnNjaGVtYXNba2V5UmVmXSB8fCB0aGlzLnJlZnNba2V5UmVmXTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZEluaXRpYWxTY2hlbWFzKCkgewogICAgICBjb25zdCBvcHRzU2NoZW1hcyA9IHRoaXMub3B0cy5zY2hlbWFzOwogICAgICBpZiAoIW9wdHNTY2hlbWFzKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0c1NjaGVtYXMpKQogICAgICAgIHRoaXMuYWRkU2NoZW1hKG9wdHNTY2hlbWFzKTsKICAgICAgZWxzZQogICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdHNTY2hlbWFzKQogICAgICAgICAgdGhpcy5hZGRTY2hlbWEob3B0c1NjaGVtYXNba2V5XSwga2V5KTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZEluaXRpYWxGb3JtYXRzKCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGhpcy5vcHRzLmZvcm1hdHMpIHsKICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLm9wdHMuZm9ybWF0c1tuYW1lXTsKICAgICAgICBpZiAoZm9ybWF0KQogICAgICAgICAgdGhpcy5hZGRGb3JtYXQobmFtZSwgZm9ybWF0KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkSW5pdGlhbEtleXdvcmRzKGRlZnMpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVmcykpIHsKICAgICAgICB0aGlzLmFkZFZvY2FidWxhcnkoZGVmcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubG9nZ2VyLndhcm4oImtleXdvcmRzIG9wdGlvbiBhcyBtYXAgaXMgZGVwcmVjYXRlZCwgcGFzcyBhcnJheSIpOwogICAgICBmb3IgKGNvbnN0IGtleXdvcmQgaW4gZGVmcykgewogICAgICAgIGNvbnN0IGRlZiA9IGRlZnNba2V5d29yZF07CiAgICAgICAgaWYgKCFkZWYua2V5d29yZCkKICAgICAgICAgIGRlZi5rZXl3b3JkID0ga2V5d29yZDsKICAgICAgICB0aGlzLmFkZEtleXdvcmQoZGVmKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0TWV0YVNjaGVtYU9wdGlvbnMoKSB7CiAgICAgIGNvbnN0IG1ldGFPcHRzID0geyAuLi50aGlzLm9wdHMgfTsKICAgICAgZm9yIChjb25zdCBvcHQgb2YgTUVUQV9JR05PUkVfT1BUSU9OUykKICAgICAgICBkZWxldGUgbWV0YU9wdHNbb3B0XTsKICAgICAgcmV0dXJuIG1ldGFPcHRzOwogICAgfQogICAgdmFyIG5vTG9ncyA9IHsgbG9nKCkgewogICAgfSwgd2FybigpIHsKICAgIH0sIGVycm9yKCkgewogICAgfSB9OwogICAgZnVuY3Rpb24gZ2V0TG9nZ2VyKGxvZ2dlcikgewogICAgICBpZiAobG9nZ2VyID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gbm9Mb2dzOwogICAgICBpZiAobG9nZ2VyID09PSB2b2lkIDApCiAgICAgICAgcmV0dXJuIGNvbnNvbGU7CiAgICAgIGlmIChsb2dnZXIubG9nICYmIGxvZ2dlci53YXJuICYmIGxvZ2dlci5lcnJvcikKICAgICAgICByZXR1cm4gbG9nZ2VyOwogICAgICB0aHJvdyBuZXcgRXJyb3IoImxvZ2dlciBtdXN0IGltcGxlbWVudCBsb2csIHdhcm4gYW5kIGVycm9yIG1ldGhvZHMiKTsKICAgIH0KICAgIHZhciBLRVlXT1JEX05BTUUgPSAvXlthLXpfJF1bYS16MC05XyQ6LV0qJC9pOwogICAgZnVuY3Rpb24gY2hlY2tLZXl3b3JkKGtleXdvcmQsIGRlZikgewogICAgICBjb25zdCB7IFJVTEVTIH0gPSB0aGlzOwogICAgICAoMCwgdXRpbF8xLmVhY2hJdGVtKShrZXl3b3JkLCAoa3dkKSA9PiB7CiAgICAgICAgaWYgKFJVTEVTLmtleXdvcmRzW2t3ZF0pCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleXdvcmQgJHtrd2R9IGlzIGFscmVhZHkgZGVmaW5lZGApOwogICAgICAgIGlmICghS0VZV09SRF9OQU1FLnRlc3Qoa3dkKSkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5d29yZCAke2t3ZH0gaGFzIGludmFsaWQgbmFtZWApOwogICAgICB9KTsKICAgICAgaWYgKCFkZWYpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoZGVmLiRkYXRhICYmICEoImNvZGUiIGluIGRlZiB8fCAidmFsaWRhdGUiIGluIGRlZikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyRkYXRhIGtleXdvcmQgbXVzdCBoYXZlICJjb2RlIiBvciAidmFsaWRhdGUiIGZ1bmN0aW9uJyk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFkZFJ1bGUoa2V5d29yZCwgZGVmaW5pdGlvbiwgZGF0YVR5cGUpIHsKICAgICAgdmFyIF9hOwogICAgICBjb25zdCBwb3N0ID0gZGVmaW5pdGlvbiA9PT0gbnVsbCB8fCBkZWZpbml0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZpbml0aW9uLnBvc3Q7CiAgICAgIGlmIChkYXRhVHlwZSAmJiBwb3N0KQogICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5d29yZCB3aXRoICJwb3N0IiBmbGFnIGNhbm5vdCBoYXZlICJ0eXBlIicpOwogICAgICBjb25zdCB7IFJVTEVTIH0gPSB0aGlzOwogICAgICBsZXQgcnVsZUdyb3VwID0gcG9zdCA/IFJVTEVTLnBvc3QgOiBSVUxFUy5ydWxlcy5maW5kKCh7IHR5cGU6IHQgfSkgPT4gdCA9PT0gZGF0YVR5cGUpOwogICAgICBpZiAoIXJ1bGVHcm91cCkgewogICAgICAgIHJ1bGVHcm91cCA9IHsgdHlwZTogZGF0YVR5cGUsIHJ1bGVzOiBbXSB9OwogICAgICAgIFJVTEVTLnJ1bGVzLnB1c2gocnVsZUdyb3VwKTsKICAgICAgfQogICAgICBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXSA9IHRydWU7CiAgICAgIGlmICghZGVmaW5pdGlvbikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHJ1bGUgPSB7CiAgICAgICAga2V5d29yZCwKICAgICAgICBkZWZpbml0aW9uOiB7CiAgICAgICAgICAuLi5kZWZpbml0aW9uLAogICAgICAgICAgdHlwZTogKDAsIGRhdGFUeXBlXzEuZ2V0SlNPTlR5cGVzKShkZWZpbml0aW9uLnR5cGUpLAogICAgICAgICAgc2NoZW1hVHlwZTogKDAsIGRhdGFUeXBlXzEuZ2V0SlNPTlR5cGVzKShkZWZpbml0aW9uLnNjaGVtYVR5cGUpCiAgICAgICAgfQogICAgICB9OwogICAgICBpZiAoZGVmaW5pdGlvbi5iZWZvcmUpCiAgICAgICAgYWRkQmVmb3JlUnVsZS5jYWxsKHRoaXMsIHJ1bGVHcm91cCwgcnVsZSwgZGVmaW5pdGlvbi5iZWZvcmUpOwogICAgICBlbHNlCiAgICAgICAgcnVsZUdyb3VwLnJ1bGVzLnB1c2gocnVsZSk7CiAgICAgIFJVTEVTLmFsbFtrZXl3b3JkXSA9IHJ1bGU7CiAgICAgIChfYSA9IGRlZmluaXRpb24uaW1wbGVtZW50cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goKGt3ZCkgPT4gdGhpcy5hZGRLZXl3b3JkKGt3ZCkpOwogICAgfQogICAgZnVuY3Rpb24gYWRkQmVmb3JlUnVsZShydWxlR3JvdXAsIHJ1bGUsIGJlZm9yZSkgewogICAgICBjb25zdCBpID0gcnVsZUdyb3VwLnJ1bGVzLmZpbmRJbmRleCgoX3J1bGUpID0+IF9ydWxlLmtleXdvcmQgPT09IGJlZm9yZSk7CiAgICAgIGlmIChpID49IDApIHsKICAgICAgICBydWxlR3JvdXAucnVsZXMuc3BsaWNlKGksIDAsIHJ1bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJ1bGVHcm91cC5ydWxlcy5wdXNoKHJ1bGUpOwogICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYHJ1bGUgJHtiZWZvcmV9IGlzIG5vdCBkZWZpbmVkYCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGtleXdvcmRNZXRhc2NoZW1hKGRlZikgewogICAgICBsZXQgeyBtZXRhU2NoZW1hIH0gPSBkZWY7CiAgICAgIGlmIChtZXRhU2NoZW1hID09PSB2b2lkIDApCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoZGVmLiRkYXRhICYmIHRoaXMub3B0cy4kZGF0YSkKICAgICAgICBtZXRhU2NoZW1hID0gc2NoZW1hT3JEYXRhKG1ldGFTY2hlbWEpOwogICAgICBkZWYudmFsaWRhdGVTY2hlbWEgPSB0aGlzLmNvbXBpbGUobWV0YVNjaGVtYSwgdHJ1ZSk7CiAgICB9CiAgICB2YXIgJGRhdGFSZWYgPSB7CiAgICAgICRyZWY6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMiCiAgICB9OwogICAgZnVuY3Rpb24gc2NoZW1hT3JEYXRhKHNjaGVtYSkgewogICAgICByZXR1cm4geyBhbnlPZjogW3NjaGVtYSwgJGRhdGFSZWZdIH07CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9jb3JlL2lkLmpzCnZhciByZXF1aXJlX2lkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9jb3JlL2lkLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiaWQiLAogICAgICBjb2RlKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignTk9UIFNVUFBPUlRFRDoga2V5d29yZCAiaWQiLCB1c2UgIiRpZCIgZm9yIHNjaGVtYSBJRCcpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2NvcmUvcmVmLmpzCnZhciByZXF1aXJlX3JlZiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvY29yZS9yZWYuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNhbGxSZWYgPSBleHBvcnRzMi5nZXRWYWxpZGF0ZSA9IHZvaWQgMDsKICAgIHZhciByZWZfZXJyb3JfMSA9IHJlcXVpcmVfcmVmX2Vycm9yKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIG5hbWVzXzEgPSByZXF1aXJlX25hbWVzKCk7CiAgICB2YXIgY29tcGlsZV8xID0gcmVxdWlyZV9jb21waWxlKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiJHJlZiIsCiAgICAgIHNjaGVtYVR5cGU6ICJzdHJpbmciLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWE6ICRyZWYsIGl0IH0gPSBjeHQ7CiAgICAgICAgY29uc3QgeyBiYXNlSWQsIHNjaGVtYUVudjogZW52LCB2YWxpZGF0ZU5hbWUsIG9wdHMsIHNlbGY6IHNlbGYyIH0gPSBpdDsKICAgICAgICBjb25zdCB7IHJvb3QgfSA9IGVudjsKICAgICAgICBpZiAoKCRyZWYgPT09ICIjIiB8fCAkcmVmID09PSAiIy8iKSAmJiBiYXNlSWQgPT09IHJvb3QuYmFzZUlkKQogICAgICAgICAgcmV0dXJuIGNhbGxSb290UmVmKCk7CiAgICAgICAgY29uc3Qgc2NoT3JFbnYgPSBjb21waWxlXzEucmVzb2x2ZVJlZi5jYWxsKHNlbGYyLCByb290LCBiYXNlSWQsICRyZWYpOwogICAgICAgIGlmIChzY2hPckVudiA9PT0gdm9pZCAwKQogICAgICAgICAgdGhyb3cgbmV3IHJlZl9lcnJvcl8xLmRlZmF1bHQoaXQub3B0cy51cmlSZXNvbHZlciwgYmFzZUlkLCAkcmVmKTsKICAgICAgICBpZiAoc2NoT3JFbnYgaW5zdGFuY2VvZiBjb21waWxlXzEuU2NoZW1hRW52KQogICAgICAgICAgcmV0dXJuIGNhbGxWYWxpZGF0ZShzY2hPckVudik7CiAgICAgICAgcmV0dXJuIGlubGluZVJlZlNjaGVtYShzY2hPckVudik7CiAgICAgICAgZnVuY3Rpb24gY2FsbFJvb3RSZWYoKSB7CiAgICAgICAgICBpZiAoZW52ID09PSByb290KQogICAgICAgICAgICByZXR1cm4gY2FsbFJlZihjeHQsIHZhbGlkYXRlTmFtZSwgZW52LCBlbnYuJGFzeW5jKTsKICAgICAgICAgIGNvbnN0IHJvb3ROYW1lID0gZ2VuLnNjb3BlVmFsdWUoInJvb3QiLCB7IHJlZjogcm9vdCB9KTsKICAgICAgICAgIHJldHVybiBjYWxsUmVmKGN4dCwgKDAsIGNvZGVnZW5fMS5fKWAke3Jvb3ROYW1lfS52YWxpZGF0ZWAsIHJvb3QsIHJvb3QuJGFzeW5jKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRlKHNjaCkgewogICAgICAgICAgY29uc3QgdiA9IGdldFZhbGlkYXRlKGN4dCwgc2NoKTsKICAgICAgICAgIGNhbGxSZWYoY3h0LCB2LCBzY2gsIHNjaC4kYXN5bmMpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpbmxpbmVSZWZTY2hlbWEoc2NoKSB7CiAgICAgICAgICBjb25zdCBzY2hOYW1lID0gZ2VuLnNjb3BlVmFsdWUoInNjaGVtYSIsIG9wdHMuY29kZS5zb3VyY2UgPT09IHRydWUgPyB7IHJlZjogc2NoLCBjb2RlOiAoMCwgY29kZWdlbl8xLnN0cmluZ2lmeSkoc2NoKSB9IDogeyByZWY6IHNjaCB9KTsKICAgICAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLm5hbWUoInZhbGlkIik7CiAgICAgICAgICBjb25zdCBzY2hDeHQgPSBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAgc2NoZW1hOiBzY2gsCiAgICAgICAgICAgIGRhdGFUeXBlczogW10sCiAgICAgICAgICAgIHNjaGVtYVBhdGg6IGNvZGVnZW5fMS5uaWwsCiAgICAgICAgICAgIHRvcFNjaGVtYVJlZjogc2NoTmFtZSwKICAgICAgICAgICAgZXJyU2NoZW1hUGF0aDogJHJlZgogICAgICAgICAgfSwgdmFsaWQpOwogICAgICAgICAgY3h0Lm1lcmdlRXZhbHVhdGVkKHNjaEN4dCk7CiAgICAgICAgICBjeHQub2sodmFsaWQpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGdldFZhbGlkYXRlKGN4dCwgc2NoKSB7CiAgICAgIGNvbnN0IHsgZ2VuIH0gPSBjeHQ7CiAgICAgIHJldHVybiBzY2gudmFsaWRhdGUgPyBnZW4uc2NvcGVWYWx1ZSgidmFsaWRhdGUiLCB7IHJlZjogc2NoLnZhbGlkYXRlIH0pIDogKDAsIGNvZGVnZW5fMS5fKWAke2dlbi5zY29wZVZhbHVlKCJ3cmFwcGVyIiwgeyByZWY6IHNjaCB9KX0udmFsaWRhdGVgOwogICAgfQogICAgZXhwb3J0czIuZ2V0VmFsaWRhdGUgPSBnZXRWYWxpZGF0ZTsKICAgIGZ1bmN0aW9uIGNhbGxSZWYoY3h0LCB2LCBzY2gsICRhc3luYykgewogICAgICBjb25zdCB7IGdlbiwgaXQgfSA9IGN4dDsKICAgICAgY29uc3QgeyBhbGxFcnJvcnMsIHNjaGVtYUVudjogZW52LCBvcHRzIH0gPSBpdDsKICAgICAgY29uc3QgcGFzc0N4dCA9IG9wdHMucGFzc0NvbnRleHQgPyBuYW1lc18xLmRlZmF1bHQudGhpcyA6IGNvZGVnZW5fMS5uaWw7CiAgICAgIGlmICgkYXN5bmMpCiAgICAgICAgY2FsbEFzeW5jUmVmKCk7CiAgICAgIGVsc2UKICAgICAgICBjYWxsU3luY1JlZigpOwogICAgICBmdW5jdGlvbiBjYWxsQXN5bmNSZWYoKSB7CiAgICAgICAgaWYgKCFlbnYuJGFzeW5jKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3luYyBzY2hlbWEgcmVmZXJlbmNlZCBieSBzeW5jIHNjaGVtYSIpOwogICAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLmxldCgidmFsaWQiKTsKICAgICAgICBnZW4udHJ5KCgpID0+IHsKICAgICAgICAgIGdlbi5jb2RlKCgwLCBjb2RlZ2VuXzEuXylgYXdhaXQgJHsoMCwgY29kZV8xLmNhbGxWYWxpZGF0ZUNvZGUpKGN4dCwgdiwgcGFzc0N4dCl9YCk7CiAgICAgICAgICBhZGRFdmFsdWF0ZWRGcm9tKHYpOwogICAgICAgICAgaWYgKCFhbGxFcnJvcnMpCiAgICAgICAgICAgIGdlbi5hc3NpZ24odmFsaWQsIHRydWUpOwogICAgICAgIH0sIChlKSA9PiB7CiAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAhKCR7ZX0gaW5zdGFuY2VvZiAke2l0LlZhbGlkYXRpb25FcnJvcn0pYCwgKCkgPT4gZ2VuLnRocm93KGUpKTsKICAgICAgICAgIGFkZEVycm9yc0Zyb20oZSk7CiAgICAgICAgICBpZiAoIWFsbEVycm9ycykKICAgICAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgZmFsc2UpOwogICAgICAgIH0pOwogICAgICAgIGN4dC5vayh2YWxpZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY2FsbFN5bmNSZWYoKSB7CiAgICAgICAgY3h0LnJlc3VsdCgoMCwgY29kZV8xLmNhbGxWYWxpZGF0ZUNvZGUpKGN4dCwgdiwgcGFzc0N4dCksICgpID0+IGFkZEV2YWx1YXRlZEZyb20odiksICgpID0+IGFkZEVycm9yc0Zyb20odikpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFkZEVycm9yc0Zyb20oc291cmNlKSB7CiAgICAgICAgY29uc3QgZXJycyA9ICgwLCBjb2RlZ2VuXzEuXylgJHtzb3VyY2V9LmVycm9yc2A7CiAgICAgICAgZ2VuLmFzc2lnbihuYW1lc18xLmRlZmF1bHQudkVycm9ycywgKDAsIGNvZGVnZW5fMS5fKWAke25hbWVzXzEuZGVmYXVsdC52RXJyb3JzfSA9PT0gbnVsbCA/ICR7ZXJyc30gOiAke25hbWVzXzEuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHtlcnJzfSlgKTsKICAgICAgICBnZW4uYXNzaWduKG5hbWVzXzEuZGVmYXVsdC5lcnJvcnMsICgwLCBjb2RlZ2VuXzEuXylgJHtuYW1lc18xLmRlZmF1bHQudkVycm9yc30ubGVuZ3RoYCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWRkRXZhbHVhdGVkRnJvbShzb3VyY2UpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgaWYgKCFpdC5vcHRzLnVuZXZhbHVhdGVkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHNjaEV2YWx1YXRlZCA9IChfYSA9IHNjaCA9PT0gbnVsbCB8fCBzY2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaC52YWxpZGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmV2YWx1YXRlZDsKICAgICAgICBpZiAoaXQucHJvcHMgIT09IHRydWUpIHsKICAgICAgICAgIGlmIChzY2hFdmFsdWF0ZWQgJiYgIXNjaEV2YWx1YXRlZC5keW5hbWljUHJvcHMpIHsKICAgICAgICAgICAgaWYgKHNjaEV2YWx1YXRlZC5wcm9wcyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgaXQucHJvcHMgPSB1dGlsXzEubWVyZ2VFdmFsdWF0ZWQucHJvcHMoZ2VuLCBzY2hFdmFsdWF0ZWQucHJvcHMsIGl0LnByb3BzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZW4udmFyKCJwcm9wcyIsICgwLCBjb2RlZ2VuXzEuXylgJHtzb3VyY2V9LmV2YWx1YXRlZC5wcm9wc2ApOwogICAgICAgICAgICBpdC5wcm9wcyA9IHV0aWxfMS5tZXJnZUV2YWx1YXRlZC5wcm9wcyhnZW4sIHByb3BzLCBpdC5wcm9wcywgY29kZWdlbl8xLk5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXQuaXRlbXMgIT09IHRydWUpIHsKICAgICAgICAgIGlmIChzY2hFdmFsdWF0ZWQgJiYgIXNjaEV2YWx1YXRlZC5keW5hbWljSXRlbXMpIHsKICAgICAgICAgICAgaWYgKHNjaEV2YWx1YXRlZC5pdGVtcyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgaXQuaXRlbXMgPSB1dGlsXzEubWVyZ2VFdmFsdWF0ZWQuaXRlbXMoZ2VuLCBzY2hFdmFsdWF0ZWQuaXRlbXMsIGl0Lml0ZW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBnZW4udmFyKCJpdGVtcyIsICgwLCBjb2RlZ2VuXzEuXylgJHtzb3VyY2V9LmV2YWx1YXRlZC5pdGVtc2ApOwogICAgICAgICAgICBpdC5pdGVtcyA9IHV0aWxfMS5tZXJnZUV2YWx1YXRlZC5pdGVtcyhnZW4sIGl0ZW1zLCBpdC5pdGVtcywgY29kZWdlbl8xLk5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXhwb3J0czIuY2FsbFJlZiA9IGNhbGxSZWY7CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvY29yZS9pbmRleC5qcwp2YXIgcmVxdWlyZV9jb3JlMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvY29yZS9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGlkXzEgPSByZXF1aXJlX2lkKCk7CiAgICB2YXIgcmVmXzEgPSByZXF1aXJlX3JlZigpOwogICAgdmFyIGNvcmUgPSBbCiAgICAgICIkc2NoZW1hIiwKICAgICAgIiRpZCIsCiAgICAgICIkZGVmcyIsCiAgICAgICIkdm9jYWJ1bGFyeSIsCiAgICAgIHsga2V5d29yZDogIiRjb21tZW50IiB9LAogICAgICAiZGVmaW5pdGlvbnMiLAogICAgICBpZF8xLmRlZmF1bHQsCiAgICAgIHJlZl8xLmRlZmF1bHQKICAgIF07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gY29yZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vbGltaXROdW1iZXIuanMKdmFyIHJlcXVpcmVfbGltaXROdW1iZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vbGltaXROdW1iZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciBvcHMgPSBjb2RlZ2VuXzEub3BlcmF0b3JzOwogICAgdmFyIEtXRHMgPSB7CiAgICAgIG1heGltdW06IHsgb2tTdHI6ICI8PSIsIG9rOiBvcHMuTFRFLCBmYWlsOiBvcHMuR1QgfSwKICAgICAgbWluaW11bTogeyBva1N0cjogIj49Iiwgb2s6IG9wcy5HVEUsIGZhaWw6IG9wcy5MVCB9LAogICAgICBleGNsdXNpdmVNYXhpbXVtOiB7IG9rU3RyOiAiPCIsIG9rOiBvcHMuTFQsIGZhaWw6IG9wcy5HVEUgfSwKICAgICAgZXhjbHVzaXZlTWluaW11bTogeyBva1N0cjogIj4iLCBvazogb3BzLkdULCBmYWlsOiBvcHMuTFRFIH0KICAgIH07CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IGtleXdvcmQsIHNjaGVtYUNvZGUgfSkgPT4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgYmUgJHtLV0RzW2tleXdvcmRdLm9rU3RyfSAke3NjaGVtYUNvZGV9YCwKICAgICAgcGFyYW1zOiAoeyBrZXl3b3JkLCBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2NvbXBhcmlzb246ICR7S1dEc1trZXl3b3JkXS5va1N0cn0sIGxpbWl0OiAke3NjaGVtYUNvZGV9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiBPYmplY3Qua2V5cyhLV0RzKSwKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIHNjaGVtYVR5cGU6ICJudW1iZXIiLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBrZXl3b3JkLCBkYXRhLCBzY2hlbWFDb2RlIH0gPSBjeHQ7CiAgICAgICAgY3h0LmZhaWwkZGF0YSgoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0gJHtLV0RzW2tleXdvcmRdLmZhaWx9ICR7c2NoZW1hQ29kZX0gfHwgaXNOYU4oJHtkYXRhfSlgKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL211bHRpcGxlT2YuanMKdmFyIHJlcXVpcmVfbXVsdGlwbGVPZiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvdmFsaWRhdGlvbi9tdWx0aXBsZU9mLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IHNjaGVtYUNvZGUgfSkgPT4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgYmUgbXVsdGlwbGUgb2YgJHtzY2hlbWFDb2RlfWAsCiAgICAgIHBhcmFtczogKHsgc2NoZW1hQ29kZSB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHttdWx0aXBsZU9mOiAke3NjaGVtYUNvZGV9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAibXVsdGlwbGVPZiIsCiAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICBzY2hlbWFUeXBlOiAibnVtYmVyIiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCBzY2hlbWFDb2RlLCBpdCB9ID0gY3h0OwogICAgICAgIGNvbnN0IHByZWMgPSBpdC5vcHRzLm11bHRpcGxlT2ZQcmVjaXNpb247CiAgICAgICAgY29uc3QgcmVzID0gZ2VuLmxldCgicmVzIik7CiAgICAgICAgY29uc3QgaW52YWxpZCA9IHByZWMgPyAoMCwgY29kZWdlbl8xLl8pYE1hdGguYWJzKE1hdGgucm91bmQoJHtyZXN9KSAtICR7cmVzfSkgPiAxZS0ke3ByZWN9YCA6ICgwLCBjb2RlZ2VuXzEuXylgJHtyZXN9ICE9PSBwYXJzZUludCgke3Jlc30pYDsKICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEuXylgKCR7c2NoZW1hQ29kZX0gPT09IDAgfHwgKCR7cmVzfSA9ICR7ZGF0YX0vJHtzY2hlbWFDb2RlfSwgJHtpbnZhbGlkfSkpYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9ydW50aW1lL3VjczJsZW5ndGguanMKdmFyIHJlcXVpcmVfdWNzMmxlbmd0aCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9ydW50aW1lL3VjczJsZW5ndGguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGZ1bmN0aW9uIHVjczJsZW5ndGgoc3RyKSB7CiAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7CiAgICAgIGxldCBsZW5ndGggPSAwOwogICAgICBsZXQgcG9zID0gMDsKICAgICAgbGV0IHZhbHVlOwogICAgICB3aGlsZSAocG9zIDwgbGVuKSB7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgdmFsdWUgPSBzdHIuY2hhckNvZGVBdChwb3MrKyk7CiAgICAgICAgaWYgKHZhbHVlID49IDU1Mjk2ICYmIHZhbHVlIDw9IDU2MzE5ICYmIHBvcyA8IGxlbikgewogICAgICAgICAgdmFsdWUgPSBzdHIuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgaWYgKCh2YWx1ZSAmIDY0NTEyKSA9PT0gNTYzMjApCiAgICAgICAgICAgIHBvcysrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGVuZ3RoOwogICAgfQogICAgZXhwb3J0czIuZGVmYXVsdCA9IHVjczJsZW5ndGg7CiAgICB1Y3MybGVuZ3RoLmNvZGUgPSAncmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS91Y3MybGVuZ3RoIikuZGVmYXVsdCc7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL2xpbWl0TGVuZ3RoLmpzCnZhciByZXF1aXJlX2xpbWl0TGVuZ3RoID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL2xpbWl0TGVuZ3RoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgdWNzMmxlbmd0aF8xID0gcmVxdWlyZV91Y3MybGVuZ3RoKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2UoeyBrZXl3b3JkLCBzY2hlbWFDb2RlIH0pIHsKICAgICAgICBjb25zdCBjb21wID0ga2V5d29yZCA9PT0gIm1heExlbmd0aCIgPyAibW9yZSIgOiAiZmV3ZXIiOwogICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLnN0cilgbXVzdCBOT1QgaGF2ZSAke2NvbXB9IHRoYW4gJHtzY2hlbWFDb2RlfSBjaGFyYWN0ZXJzYDsKICAgICAgfSwKICAgICAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2xpbWl0OiAke3NjaGVtYUNvZGV9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiBbIm1heExlbmd0aCIsICJtaW5MZW5ndGgiXSwKICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgIHNjaGVtYVR5cGU6ICJudW1iZXIiLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBrZXl3b3JkLCBkYXRhLCBzY2hlbWFDb2RlLCBpdCB9ID0gY3h0OwogICAgICAgIGNvbnN0IG9wID0ga2V5d29yZCA9PT0gIm1heExlbmd0aCIgPyBjb2RlZ2VuXzEub3BlcmF0b3JzLkdUIDogY29kZWdlbl8xLm9wZXJhdG9ycy5MVDsKICAgICAgICBjb25zdCBsZW4gPSBpdC5vcHRzLnVuaWNvZGUgPT09IGZhbHNlID8gKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9Lmxlbmd0aGAgOiAoMCwgY29kZWdlbl8xLl8pYCR7KDAsIHV0aWxfMS51c2VGdW5jKShjeHQuZ2VuLCB1Y3MybGVuZ3RoXzEuZGVmYXVsdCl9KCR7ZGF0YX0pYDsKICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEuXylgJHtsZW59ICR7b3B9ICR7c2NoZW1hQ29kZX1gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL3BhdHRlcm4uanMKdmFyIHJlcXVpcmVfcGF0dGVybiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvdmFsaWRhdGlvbi9wYXR0ZXJuLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuc3RyKWBtdXN0IG1hdGNoIHBhdHRlcm4gIiR7c2NoZW1hQ29kZX0iYCwKICAgICAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge3BhdHRlcm46ICR7c2NoZW1hQ29kZX19YAogICAgfTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJwYXR0ZXJuIiwKICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgIHNjaGVtYVR5cGU6ICJzdHJpbmciLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBkYXRhLCAkZGF0YSwgc2NoZW1hLCBzY2hlbWFDb2RlLCBpdCB9ID0gY3h0OwogICAgICAgIGNvbnN0IHUgPSBpdC5vcHRzLnVuaWNvZGVSZWdFeHAgPyAidSIgOiAiIjsKICAgICAgICBjb25zdCByZWdFeHAgPSAkZGF0YSA/ICgwLCBjb2RlZ2VuXzEuXylgKG5ldyBSZWdFeHAoJHtzY2hlbWFDb2RlfSwgJHt1fSkpYCA6ICgwLCBjb2RlXzEudXNlUGF0dGVybikoY3h0LCBzY2hlbWEpOwogICAgICAgIGN4dC5mYWlsJGRhdGEoKDAsIGNvZGVnZW5fMS5fKWAhJHtyZWdFeHB9LnRlc3QoJHtkYXRhfSlgKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL2xpbWl0UHJvcGVydGllcy5qcwp2YXIgcmVxdWlyZV9saW1pdFByb3BlcnRpZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vbGltaXRQcm9wZXJ0aWVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2UoeyBrZXl3b3JkLCBzY2hlbWFDb2RlIH0pIHsKICAgICAgICBjb25zdCBjb21wID0ga2V5d29yZCA9PT0gIm1heFByb3BlcnRpZXMiID8gIm1vcmUiIDogImZld2VyIjsKICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgTk9UIGhhdmUgJHtjb21wfSB0aGFuICR7c2NoZW1hQ29kZX0gcHJvcGVydGllc2A7CiAgICAgIH0sCiAgICAgIHBhcmFtczogKHsgc2NoZW1hQ29kZSB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHtsaW1pdDogJHtzY2hlbWFDb2RlfX1gCiAgICB9OwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogWyJtYXhQcm9wZXJ0aWVzIiwgIm1pblByb3BlcnRpZXMiXSwKICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgIHNjaGVtYVR5cGU6ICJudW1iZXIiLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBrZXl3b3JkLCBkYXRhLCBzY2hlbWFDb2RlIH0gPSBjeHQ7CiAgICAgICAgY29uc3Qgb3AgPSBrZXl3b3JkID09PSAibWF4UHJvcGVydGllcyIgPyBjb2RlZ2VuXzEub3BlcmF0b3JzLkdUIDogY29kZWdlbl8xLm9wZXJhdG9ycy5MVDsKICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEuXylgT2JqZWN0LmtleXMoJHtkYXRhfSkubGVuZ3RoICR7b3B9ICR7c2NoZW1hQ29kZX1gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL3JlcXVpcmVkLmpzCnZhciByZXF1aXJlX3JlcXVpcmVkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL3JlcXVpcmVkLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAoeyBwYXJhbXM6IHsgbWlzc2luZ1Byb3BlcnR5IH0gfSkgPT4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSAnJHttaXNzaW5nUHJvcGVydHl9J2AsCiAgICAgIHBhcmFtczogKHsgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eSB9IH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge21pc3NpbmdQcm9wZXJ0eTogJHttaXNzaW5nUHJvcGVydHl9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAicmVxdWlyZWQiLAogICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgc2NoZW1hVHlwZTogImFycmF5IiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIHNjaGVtYUNvZGUsIGRhdGEsICRkYXRhLCBpdCB9ID0gY3h0OwogICAgICAgIGNvbnN0IHsgb3B0cyB9ID0gaXQ7CiAgICAgICAgaWYgKCEkZGF0YSAmJiBzY2hlbWEubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHVzZUxvb3AgPSBzY2hlbWEubGVuZ3RoID49IG9wdHMubG9vcFJlcXVpcmVkOwogICAgICAgIGlmIChpdC5hbGxFcnJvcnMpCiAgICAgICAgICBhbGxFcnJvcnNNb2RlKCk7CiAgICAgICAgZWxzZQogICAgICAgICAgZXhpdE9uRXJyb3JNb2RlKCk7CiAgICAgICAgaWYgKG9wdHMuc3RyaWN0UmVxdWlyZWQpIHsKICAgICAgICAgIGNvbnN0IHByb3BzID0gY3h0LnBhcmVudFNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgY29uc3QgeyBkZWZpbmVkUHJvcGVydGllcyB9ID0gY3h0Lml0OwogICAgICAgICAgZm9yIChjb25zdCByZXF1aXJlZEtleSBvZiBzY2hlbWEpIHsKICAgICAgICAgICAgaWYgKChwcm9wcyA9PT0gbnVsbCB8fCBwcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvcHNbcmVxdWlyZWRLZXldKSA9PT0gdm9pZCAwICYmICFkZWZpbmVkUHJvcGVydGllcy5oYXMocmVxdWlyZWRLZXkpKSB7CiAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IGl0LnNjaGVtYUVudi5iYXNlSWQgKyBpdC5lcnJTY2hlbWFQYXRoOwogICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGByZXF1aXJlZCBwcm9wZXJ0eSAiJHtyZXF1aXJlZEtleX0iIGlzIG5vdCBkZWZpbmVkIGF0ICIke3NjaGVtYVBhdGh9IiAoc3RyaWN0UmVxdWlyZWQpYDsKICAgICAgICAgICAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIG1zZywgaXQub3B0cy5zdHJpY3RSZXF1aXJlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWxsRXJyb3JzTW9kZSgpIHsKICAgICAgICAgIGlmICh1c2VMb29wIHx8ICRkYXRhKSB7CiAgICAgICAgICAgIGN4dC5ibG9jayRkYXRhKGNvZGVnZW5fMS5uaWwsIGxvb3BBbGxSZXF1aXJlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NoZW1hKSB7CiAgICAgICAgICAgICAgKDAsIGNvZGVfMS5jaGVja1JlcG9ydE1pc3NpbmdQcm9wKShjeHQsIHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGV4aXRPbkVycm9yTW9kZSgpIHsKICAgICAgICAgIGNvbnN0IG1pc3NpbmcgPSBnZW4ubGV0KCJtaXNzaW5nIik7CiAgICAgICAgICBpZiAodXNlTG9vcCB8fCAkZGF0YSkgewogICAgICAgICAgICBjb25zdCB2YWxpZCA9IGdlbi5sZXQoInZhbGlkIiwgdHJ1ZSk7CiAgICAgICAgICAgIGN4dC5ibG9jayRkYXRhKHZhbGlkLCAoKSA9PiBsb29wVW50aWxNaXNzaW5nKG1pc3NpbmcsIHZhbGlkKSk7CiAgICAgICAgICAgIGN4dC5vayh2YWxpZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVfMS5jaGVja01pc3NpbmdQcm9wKShjeHQsIHNjaGVtYSwgbWlzc2luZykpOwogICAgICAgICAgICAoMCwgY29kZV8xLnJlcG9ydE1pc3NpbmdQcm9wKShjeHQsIG1pc3NpbmcpOwogICAgICAgICAgICBnZW4uZWxzZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsb29wQWxsUmVxdWlyZWQoKSB7CiAgICAgICAgICBnZW4uZm9yT2YoInByb3AiLCBzY2hlbWFDb2RlLCAocHJvcCkgPT4gewogICAgICAgICAgICBjeHQuc2V0UGFyYW1zKHsgbWlzc2luZ1Byb3BlcnR5OiBwcm9wIH0pOwogICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVfMS5ub1Byb3BlcnR5SW5EYXRhKShnZW4sIGRhdGEsIHByb3AsIG9wdHMub3duUHJvcGVydGllcyksICgpID0+IGN4dC5lcnJvcigpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsb29wVW50aWxNaXNzaW5nKG1pc3NpbmcsIHZhbGlkKSB7CiAgICAgICAgICBjeHQuc2V0UGFyYW1zKHsgbWlzc2luZ1Byb3BlcnR5OiBtaXNzaW5nIH0pOwogICAgICAgICAgZ2VuLmZvck9mKG1pc3NpbmcsIHNjaGVtYUNvZGUsICgpID0+IHsKICAgICAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgKDAsIGNvZGVfMS5wcm9wZXJ0eUluRGF0YSkoZ2VuLCBkYXRhLCBtaXNzaW5nLCBvcHRzLm93blByb3BlcnRpZXMpKTsKICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEubm90KSh2YWxpZCksICgpID0+IHsKICAgICAgICAgICAgICBjeHQuZXJyb3IoKTsKICAgICAgICAgICAgICBnZW4uYnJlYWsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCBjb2RlZ2VuXzEubmlsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvdmFsaWRhdGlvbi9saW1pdEl0ZW1zLmpzCnZhciByZXF1aXJlX2xpbWl0SXRlbXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vbGltaXRJdGVtcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlKHsga2V5d29yZCwgc2NoZW1hQ29kZSB9KSB7CiAgICAgICAgY29uc3QgY29tcCA9IGtleXdvcmQgPT09ICJtYXhJdGVtcyIgPyAibW9yZSIgOiAiZmV3ZXIiOwogICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLnN0cilgbXVzdCBOT1QgaGF2ZSAke2NvbXB9IHRoYW4gJHtzY2hlbWFDb2RlfSBpdGVtc2A7CiAgICAgIH0sCiAgICAgIHBhcmFtczogKHsgc2NoZW1hQ29kZSB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHtsaW1pdDogJHtzY2hlbWFDb2RlfX1gCiAgICB9OwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogWyJtYXhJdGVtcyIsICJtaW5JdGVtcyJdLAogICAgICB0eXBlOiAiYXJyYXkiLAogICAgICBzY2hlbWFUeXBlOiAibnVtYmVyIiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsga2V5d29yZCwgZGF0YSwgc2NoZW1hQ29kZSB9ID0gY3h0OwogICAgICAgIGNvbnN0IG9wID0ga2V5d29yZCA9PT0gIm1heEl0ZW1zIiA/IGNvZGVnZW5fMS5vcGVyYXRvcnMuR1QgOiBjb2RlZ2VuXzEub3BlcmF0b3JzLkxUOwogICAgICAgIGN4dC5mYWlsJGRhdGEoKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9Lmxlbmd0aCAke29wfSAke3NjaGVtYUNvZGV9YCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9ydW50aW1lL2VxdWFsLmpzCnZhciByZXF1aXJlX2VxdWFsID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3J1bnRpbWUvZXF1YWwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBlcXVhbCA9IHJlcXVpcmVfZmFzdF9kZWVwX2VxdWFsKCk7CiAgICBlcXVhbC5jb2RlID0gJ3JlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvZXF1YWwiKS5kZWZhdWx0JzsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBlcXVhbDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vdW5pcXVlSXRlbXMuanMKdmFyIHJlcXVpcmVfdW5pcXVlSXRlbXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vdW5pcXVlSXRlbXMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBkYXRhVHlwZV8xID0gcmVxdWlyZV9kYXRhVHlwZSgpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVxdWFsXzEgPSByZXF1aXJlX2VxdWFsKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IHBhcmFtczogeyBpLCBqIH0gfSkgPT4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgTk9UIGhhdmUgZHVwbGljYXRlIGl0ZW1zIChpdGVtcyAjIyAke2p9IGFuZCAke2l9IGFyZSBpZGVudGljYWwpYCwKICAgICAgcGFyYW1zOiAoeyBwYXJhbXM6IHsgaSwgaiB9IH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2k6ICR7aX0sIGo6ICR7an19YAogICAgfTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJ1bmlxdWVJdGVtcyIsCiAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgIHNjaGVtYVR5cGU6ICJib29sZWFuIiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCAkZGF0YSwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIHNjaGVtYUNvZGUsIGl0IH0gPSBjeHQ7CiAgICAgICAgaWYgKCEkZGF0YSAmJiAhc2NoZW1hKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLmxldCgidmFsaWQiKTsKICAgICAgICBjb25zdCBpdGVtVHlwZXMgPSBwYXJlbnRTY2hlbWEuaXRlbXMgPyAoMCwgZGF0YVR5cGVfMS5nZXRTY2hlbWFUeXBlcykocGFyZW50U2NoZW1hLml0ZW1zKSA6IFtdOwogICAgICAgIGN4dC5ibG9jayRkYXRhKHZhbGlkLCB2YWxpZGF0ZVVuaXF1ZUl0ZW1zLCAoMCwgY29kZWdlbl8xLl8pYCR7c2NoZW1hQ29kZX0gPT09IGZhbHNlYCk7CiAgICAgICAgY3h0Lm9rKHZhbGlkKTsKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZVVuaXF1ZUl0ZW1zKCkgewogICAgICAgICAgY29uc3QgaSA9IGdlbi5sZXQoImkiLCAoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0ubGVuZ3RoYCk7CiAgICAgICAgICBjb25zdCBqID0gZ2VuLmxldCgiaiIpOwogICAgICAgICAgY3h0LnNldFBhcmFtcyh7IGksIGogfSk7CiAgICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCB0cnVlKTsKICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7aX0gPiAxYCwgKCkgPT4gKGNhbk9wdGltaXplKCkgPyBsb29wTiA6IGxvb3BOMikoaSwgaikpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjYW5PcHRpbWl6ZSgpIHsKICAgICAgICAgIHJldHVybiBpdGVtVHlwZXMubGVuZ3RoID4gMCAmJiAhaXRlbVR5cGVzLnNvbWUoKHQpID0+IHQgPT09ICJvYmplY3QiIHx8IHQgPT09ICJhcnJheSIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsb29wTihpLCBqKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gZ2VuLm5hbWUoIml0ZW0iKTsKICAgICAgICAgIGNvbnN0IHdyb25nVHlwZSA9ICgwLCBkYXRhVHlwZV8xLmNoZWNrRGF0YVR5cGVzKShpdGVtVHlwZXMsIGl0ZW0sIGl0Lm9wdHMuc3RyaWN0TnVtYmVycywgZGF0YVR5cGVfMS5EYXRhVHlwZS5Xcm9uZyk7CiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZ2VuLmNvbnN0KCJpbmRpY2VzIiwgKDAsIGNvZGVnZW5fMS5fKWB7fWApOwogICAgICAgICAgZ2VuLmZvcigoMCwgY29kZWdlbl8xLl8pYDske2l9LS07YCwgKCkgPT4gewogICAgICAgICAgICBnZW4ubGV0KGl0ZW0sICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfVske2l9XWApOwogICAgICAgICAgICBnZW4uaWYod3JvbmdUeXBlLCAoMCwgY29kZWdlbl8xLl8pYGNvbnRpbnVlYCk7CiAgICAgICAgICAgIGlmIChpdGVtVHlwZXMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtpdGVtfSA9PSAic3RyaW5nImAsICgwLCBjb2RlZ2VuXzEuXylgJHtpdGVtfSArPSAiXyJgKTsKICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgdHlwZW9mICR7aW5kaWNlc31bJHtpdGVtfV0gPT0gIm51bWJlciJgLCAoKSA9PiB7CiAgICAgICAgICAgICAgZ2VuLmFzc2lnbihqLCAoMCwgY29kZWdlbl8xLl8pYCR7aW5kaWNlc31bJHtpdGVtfV1gKTsKICAgICAgICAgICAgICBjeHQuZXJyb3IoKTsKICAgICAgICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCBmYWxzZSkuYnJlYWsoKTsKICAgICAgICAgICAgfSkuY29kZSgoMCwgY29kZWdlbl8xLl8pYCR7aW5kaWNlc31bJHtpdGVtfV0gPSAke2l9YCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbG9vcE4yKGksIGopIHsKICAgICAgICAgIGNvbnN0IGVxbCA9ICgwLCB1dGlsXzEudXNlRnVuYykoZ2VuLCBlcXVhbF8xLmRlZmF1bHQpOwogICAgICAgICAgY29uc3Qgb3V0ZXIgPSBnZW4ubmFtZSgib3V0ZXIiKTsKICAgICAgICAgIGdlbi5sYWJlbChvdXRlcikuZm9yKCgwLCBjb2RlZ2VuXzEuXylgOyR7aX0tLTtgLCAoKSA9PiBnZW4uZm9yKCgwLCBjb2RlZ2VuXzEuXylgJHtqfSA9ICR7aX07ICR7an0tLTtgLCAoKSA9PiBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAke2VxbH0oJHtkYXRhfVske2l9XSwgJHtkYXRhfVske2p9XSlgLCAoKSA9PiB7CiAgICAgICAgICAgIGN4dC5lcnJvcigpOwogICAgICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCBmYWxzZSkuYnJlYWsob3V0ZXIpOwogICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvdmFsaWRhdGlvbi9jb25zdC5qcwp2YXIgcmVxdWlyZV9jb25zdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvdmFsaWRhdGlvbi9jb25zdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVxdWFsXzEgPSByZXF1aXJlX2VxdWFsKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGVxdWFsIHRvIGNvbnN0YW50IiwKICAgICAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2FsbG93ZWRWYWx1ZTogJHtzY2hlbWFDb2RlfX1gCiAgICB9OwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogImNvbnN0IiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCAkZGF0YSwgc2NoZW1hQ29kZSwgc2NoZW1hIH0gPSBjeHQ7CiAgICAgICAgaWYgKCRkYXRhIHx8IHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiKSB7CiAgICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEuXylgISR7KDAsIHV0aWxfMS51c2VGdW5jKShnZW4sIGVxdWFsXzEuZGVmYXVsdCl9KCR7ZGF0YX0sICR7c2NoZW1hQ29kZX0pYCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN4dC5mYWlsKCgwLCBjb2RlZ2VuXzEuXylgJHtzY2hlbWF9ICE9PSAke2RhdGF9YCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vZW51bS5qcwp2YXIgcmVxdWlyZV9lbnVtID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL2VudW0uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBlcXVhbF8xID0gcmVxdWlyZV9lcXVhbCgpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAibXVzdCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzIiwKICAgICAgcGFyYW1zOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2FsbG93ZWRWYWx1ZXM6ICR7c2NoZW1hQ29kZX19YAogICAgfTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJlbnVtIiwKICAgICAgc2NoZW1hVHlwZTogImFycmF5IiwKICAgICAgJGRhdGE6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCAkZGF0YSwgc2NoZW1hLCBzY2hlbWFDb2RlLCBpdCB9ID0gY3h0OwogICAgICAgIGlmICghJGRhdGEgJiYgc2NoZW1hLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZW51bSBtdXN0IGhhdmUgbm9uLWVtcHR5IGFycmF5Iik7CiAgICAgICAgY29uc3QgdXNlTG9vcCA9IHNjaGVtYS5sZW5ndGggPj0gaXQub3B0cy5sb29wRW51bTsKICAgICAgICBsZXQgZXFsOwogICAgICAgIGNvbnN0IGdldEVxbCA9ICgpID0+IGVxbCAhPT0gbnVsbCAmJiBlcWwgIT09IHZvaWQgMCA/IGVxbCA6IGVxbCA9ICgwLCB1dGlsXzEudXNlRnVuYykoZ2VuLCBlcXVhbF8xLmRlZmF1bHQpOwogICAgICAgIGxldCB2YWxpZDsKICAgICAgICBpZiAodXNlTG9vcCB8fCAkZGF0YSkgewogICAgICAgICAgdmFsaWQgPSBnZW4ubGV0KCJ2YWxpZCIpOwogICAgICAgICAgY3h0LmJsb2NrJGRhdGEodmFsaWQsIGxvb3BFbnVtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgICAgICBjb25zdCB2U2NoZW1hID0gZ2VuLmNvbnN0KCJ2U2NoZW1hIiwgc2NoZW1hQ29kZSk7CiAgICAgICAgICB2YWxpZCA9ICgwLCBjb2RlZ2VuXzEub3IpKC4uLnNjaGVtYS5tYXAoKF94LCBpKSA9PiBlcXVhbENvZGUodlNjaGVtYSwgaSkpKTsKICAgICAgICB9CiAgICAgICAgY3h0LnBhc3ModmFsaWQpOwogICAgICAgIGZ1bmN0aW9uIGxvb3BFbnVtKCkgewogICAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgZmFsc2UpOwogICAgICAgICAgZ2VuLmZvck9mKCJ2Iiwgc2NoZW1hQ29kZSwgKHYpID0+IGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7Z2V0RXFsKCl9KCR7ZGF0YX0sICR7dn0pYCwgKCkgPT4gZ2VuLmFzc2lnbih2YWxpZCwgdHJ1ZSkuYnJlYWsoKSkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBlcXVhbENvZGUodlNjaGVtYSwgaSkgewogICAgICAgICAgY29uc3Qgc2NoID0gc2NoZW1hW2ldOwogICAgICAgICAgcmV0dXJuIHR5cGVvZiBzY2ggPT09ICJvYmplY3QiICYmIHNjaCAhPT0gbnVsbCA/ICgwLCBjb2RlZ2VuXzEuXylgJHtnZXRFcWwoKX0oJHtkYXRhfSwgJHt2U2NoZW1hfVske2l9XSlgIDogKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9ID09PSAke3NjaH1gOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy92YWxpZGF0aW9uL2luZGV4LmpzCnZhciByZXF1aXJlX3ZhbGlkYXRpb24gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL3ZhbGlkYXRpb24vaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBsaW1pdE51bWJlcl8xID0gcmVxdWlyZV9saW1pdE51bWJlcigpOwogICAgdmFyIG11bHRpcGxlT2ZfMSA9IHJlcXVpcmVfbXVsdGlwbGVPZigpOwogICAgdmFyIGxpbWl0TGVuZ3RoXzEgPSByZXF1aXJlX2xpbWl0TGVuZ3RoKCk7CiAgICB2YXIgcGF0dGVybl8xID0gcmVxdWlyZV9wYXR0ZXJuKCk7CiAgICB2YXIgbGltaXRQcm9wZXJ0aWVzXzEgPSByZXF1aXJlX2xpbWl0UHJvcGVydGllcygpOwogICAgdmFyIHJlcXVpcmVkXzEgPSByZXF1aXJlX3JlcXVpcmVkKCk7CiAgICB2YXIgbGltaXRJdGVtc18xID0gcmVxdWlyZV9saW1pdEl0ZW1zKCk7CiAgICB2YXIgdW5pcXVlSXRlbXNfMSA9IHJlcXVpcmVfdW5pcXVlSXRlbXMoKTsKICAgIHZhciBjb25zdF8xID0gcmVxdWlyZV9jb25zdCgpOwogICAgdmFyIGVudW1fMSA9IHJlcXVpcmVfZW51bSgpOwogICAgdmFyIHZhbGlkYXRpb24gPSBbCiAgICAgIC8vIG51bWJlcgogICAgICBsaW1pdE51bWJlcl8xLmRlZmF1bHQsCiAgICAgIG11bHRpcGxlT2ZfMS5kZWZhdWx0LAogICAgICAvLyBzdHJpbmcKICAgICAgbGltaXRMZW5ndGhfMS5kZWZhdWx0LAogICAgICBwYXR0ZXJuXzEuZGVmYXVsdCwKICAgICAgLy8gb2JqZWN0CiAgICAgIGxpbWl0UHJvcGVydGllc18xLmRlZmF1bHQsCiAgICAgIHJlcXVpcmVkXzEuZGVmYXVsdCwKICAgICAgLy8gYXJyYXkKICAgICAgbGltaXRJdGVtc18xLmRlZmF1bHQsCiAgICAgIHVuaXF1ZUl0ZW1zXzEuZGVmYXVsdCwKICAgICAgLy8gYW55CiAgICAgIHsga2V5d29yZDogInR5cGUiLCBzY2hlbWFUeXBlOiBbInN0cmluZyIsICJhcnJheSJdIH0sCiAgICAgIHsga2V5d29yZDogIm51bGxhYmxlIiwgc2NoZW1hVHlwZTogImJvb2xlYW4iIH0sCiAgICAgIGNvbnN0XzEuZGVmYXVsdCwKICAgICAgZW51bV8xLmRlZmF1bHQKICAgIF07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gdmFsaWRhdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvYWRkaXRpb25hbEl0ZW1zLmpzCnZhciByZXF1aXJlX2FkZGl0aW9uYWxJdGVtcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9hZGRpdGlvbmFsSXRlbXMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnZhbGlkYXRlQWRkaXRpb25hbEl0ZW1zID0gdm9pZCAwOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAoeyBwYXJhbXM6IHsgbGVuIH0gfSkgPT4gKDAsIGNvZGVnZW5fMS5zdHIpYG11c3QgTk9UIGhhdmUgbW9yZSB0aGFuICR7bGVufSBpdGVtc2AsCiAgICAgIHBhcmFtczogKHsgcGFyYW1zOiB7IGxlbiB9IH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2xpbWl0OiAke2xlbn19YAogICAgfTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsSXRlbXMiLAogICAgICB0eXBlOiAiYXJyYXkiLAogICAgICBzY2hlbWFUeXBlOiBbImJvb2xlYW4iLCAib2JqZWN0Il0sCiAgICAgIGJlZm9yZTogInVuaXF1ZUl0ZW1zIiwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBwYXJlbnRTY2hlbWEsIGl0IH0gPSBjeHQ7CiAgICAgICAgY29uc3QgeyBpdGVtcyB9ID0gcGFyZW50U2NoZW1hOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHsKICAgICAgICAgICgwLCB1dGlsXzEuY2hlY2tTdHJpY3RNb2RlKShpdCwgJyJhZGRpdGlvbmFsSXRlbXMiIGlzIGlnbm9yZWQgd2hlbiAiaXRlbXMiIGlzIG5vdCBhbiBhcnJheSBvZiBzY2hlbWFzJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhbGlkYXRlQWRkaXRpb25hbEl0ZW1zKGN4dCwgaXRlbXMpOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gdmFsaWRhdGVBZGRpdGlvbmFsSXRlbXMoY3h0LCBpdGVtcykgewogICAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCBkYXRhLCBrZXl3b3JkLCBpdCB9ID0gY3h0OwogICAgICBpdC5pdGVtcyA9IHRydWU7CiAgICAgIGNvbnN0IGxlbiA9IGdlbi5jb25zdCgibGVuIiwgKDAsIGNvZGVnZW5fMS5fKWAke2RhdGF9Lmxlbmd0aGApOwogICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkgewogICAgICAgIGN4dC5zZXRQYXJhbXMoeyBsZW46IGl0ZW1zLmxlbmd0aCB9KTsKICAgICAgICBjeHQucGFzcygoMCwgY29kZWdlbl8xLl8pYCR7bGVufSA8PSAke2l0ZW1zLmxlbmd0aH1gKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiICYmICEoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hKSkgewogICAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLnZhcigidmFsaWQiLCAoMCwgY29kZWdlbl8xLl8pYCR7bGVufSA8PSAke2l0ZW1zLmxlbmd0aH1gKTsKICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5ub3QpKHZhbGlkKSwgKCkgPT4gdmFsaWRhdGVJdGVtcyh2YWxpZCkpOwogICAgICAgIGN4dC5vayh2YWxpZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmFsaWRhdGVJdGVtcyh2YWxpZCkgewogICAgICAgIGdlbi5mb3JSYW5nZSgiaSIsIGl0ZW1zLmxlbmd0aCwgbGVuLCAoaSkgPT4gewogICAgICAgICAgY3h0LnN1YnNjaGVtYSh7IGtleXdvcmQsIGRhdGFQcm9wOiBpLCBkYXRhUHJvcFR5cGU6IHV0aWxfMS5UeXBlLk51bSB9LCB2YWxpZCk7CiAgICAgICAgICBpZiAoIWl0LmFsbEVycm9ycykKICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEubm90KSh2YWxpZCksICgpID0+IGdlbi5icmVhaygpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIudmFsaWRhdGVBZGRpdGlvbmFsSXRlbXMgPSB2YWxpZGF0ZUFkZGl0aW9uYWxJdGVtczsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2l0ZW1zLmpzCnZhciByZXF1aXJlX2l0ZW1zID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2l0ZW1zLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi52YWxpZGF0ZVR1cGxlID0gdm9pZCAwOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGNvZGVfMSA9IHJlcXVpcmVfY29kZTIoKTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJpdGVtcyIsCiAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgIHNjaGVtYVR5cGU6IFsib2JqZWN0IiwgImFycmF5IiwgImJvb2xlYW4iXSwKICAgICAgYmVmb3JlOiAidW5pcXVlSXRlbXMiLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgc2NoZW1hLCBpdCB9ID0gY3h0OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpCiAgICAgICAgICByZXR1cm4gdmFsaWRhdGVUdXBsZShjeHQsICJhZGRpdGlvbmFsSXRlbXMiLCBzY2hlbWEpOwogICAgICAgIGl0Lml0ZW1zID0gdHJ1ZTsKICAgICAgICBpZiAoKDAsIHV0aWxfMS5hbHdheXNWYWxpZFNjaGVtYSkoaXQsIHNjaGVtYSkpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY3h0Lm9rKCgwLCBjb2RlXzEudmFsaWRhdGVBcnJheSkoY3h0KSk7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiB2YWxpZGF0ZVR1cGxlKGN4dCwgZXh0cmFJdGVtcywgc2NoQXJyID0gY3h0LnNjaGVtYSkgewogICAgICBjb25zdCB7IGdlbiwgcGFyZW50U2NoZW1hLCBkYXRhLCBrZXl3b3JkLCBpdCB9ID0gY3h0OwogICAgICBjaGVja1N0cmljdFR1cGxlKHBhcmVudFNjaGVtYSk7CiAgICAgIGlmIChpdC5vcHRzLnVuZXZhbHVhdGVkICYmIHNjaEFyci5sZW5ndGggJiYgaXQuaXRlbXMgIT09IHRydWUpIHsKICAgICAgICBpdC5pdGVtcyA9IHV0aWxfMS5tZXJnZUV2YWx1YXRlZC5pdGVtcyhnZW4sIHNjaEFyci5sZW5ndGgsIGl0Lml0ZW1zKTsKICAgICAgfQogICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICBjb25zdCBsZW4gPSBnZW4uY29uc3QoImxlbiIsICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfS5sZW5ndGhgKTsKICAgICAgc2NoQXJyLmZvckVhY2goKHNjaCwgaSkgPT4gewogICAgICAgIGlmICgoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAke2xlbn0gPiAke2l9YCwgKCkgPT4gY3h0LnN1YnNjaGVtYSh7CiAgICAgICAgICBrZXl3b3JkLAogICAgICAgICAgc2NoZW1hUHJvcDogaSwKICAgICAgICAgIGRhdGFQcm9wOiBpCiAgICAgICAgfSwgdmFsaWQpKTsKICAgICAgICBjeHQub2sodmFsaWQpOwogICAgICB9KTsKICAgICAgZnVuY3Rpb24gY2hlY2tTdHJpY3RUdXBsZShzY2gpIHsKICAgICAgICBjb25zdCB7IG9wdHMsIGVyclNjaGVtYVBhdGggfSA9IGl0OwogICAgICAgIGNvbnN0IGwgPSBzY2hBcnIubGVuZ3RoOwogICAgICAgIGNvbnN0IGZ1bGxUdXBsZSA9IGwgPT09IHNjaC5taW5JdGVtcyAmJiAobCA9PT0gc2NoLm1heEl0ZW1zIHx8IHNjaFtleHRyYUl0ZW1zXSA9PT0gZmFsc2UpOwogICAgICAgIGlmIChvcHRzLnN0cmljdFR1cGxlcyAmJiAhZnVsbFR1cGxlKSB7CiAgICAgICAgICBjb25zdCBtc2cgPSBgIiR7a2V5d29yZH0iIGlzICR7bH0tdHVwbGUsIGJ1dCBtaW5JdGVtcyBvciBtYXhJdGVtcy8ke2V4dHJhSXRlbXN9IGFyZSBub3Qgc3BlY2lmaWVkIG9yIGRpZmZlcmVudCBhdCBwYXRoICIke2VyclNjaGVtYVBhdGh9ImA7CiAgICAgICAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIG1zZywgb3B0cy5zdHJpY3RUdXBsZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXhwb3J0czIudmFsaWRhdGVUdXBsZSA9IHZhbGlkYXRlVHVwbGU7CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9wcmVmaXhJdGVtcy5qcwp2YXIgcmVxdWlyZV9wcmVmaXhJdGVtcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9wcmVmaXhJdGVtcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGl0ZW1zXzEgPSByZXF1aXJlX2l0ZW1zKCk7CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAicHJlZml4SXRlbXMiLAogICAgICB0eXBlOiAiYXJyYXkiLAogICAgICBzY2hlbWFUeXBlOiBbImFycmF5Il0sCiAgICAgIGJlZm9yZTogInVuaXF1ZUl0ZW1zIiwKICAgICAgY29kZTogKGN4dCkgPT4gKDAsIGl0ZW1zXzEudmFsaWRhdGVUdXBsZSkoY3h0LCAiaXRlbXMiKQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2l0ZW1zMjAyMC5qcwp2YXIgcmVxdWlyZV9pdGVtczIwMjAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvaXRlbXMyMDIwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGFkZGl0aW9uYWxJdGVtc18xID0gcmVxdWlyZV9hZGRpdGlvbmFsSXRlbXMoKTsKICAgIHZhciBlcnJvciA9IHsKICAgICAgbWVzc2FnZTogKHsgcGFyYW1zOiB7IGxlbiB9IH0pID0+ICgwLCBjb2RlZ2VuXzEuc3RyKWBtdXN0IE5PVCBoYXZlIG1vcmUgdGhhbiAke2xlbn0gaXRlbXNgLAogICAgICBwYXJhbXM6ICh7IHBhcmFtczogeyBsZW4gfSB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHtsaW1pdDogJHtsZW59fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiaXRlbXMiLAogICAgICB0eXBlOiAiYXJyYXkiLAogICAgICBzY2hlbWFUeXBlOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgIGJlZm9yZTogInVuaXF1ZUl0ZW1zIiwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQgfSA9IGN4dDsKICAgICAgICBjb25zdCB7IHByZWZpeEl0ZW1zIH0gPSBwYXJlbnRTY2hlbWE7CiAgICAgICAgaXQuaXRlbXMgPSB0cnVlOwogICAgICAgIGlmICgoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAocHJlZml4SXRlbXMpCiAgICAgICAgICAoMCwgYWRkaXRpb25hbEl0ZW1zXzEudmFsaWRhdGVBZGRpdGlvbmFsSXRlbXMpKGN4dCwgcHJlZml4SXRlbXMpOwogICAgICAgIGVsc2UKICAgICAgICAgIGN4dC5vaygoMCwgY29kZV8xLnZhbGlkYXRlQXJyYXkpKGN4dCkpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvY29udGFpbnMuanMKdmFyIHJlcXVpcmVfY29udGFpbnMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvY29udGFpbnMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBlcnJvciA9IHsKICAgICAgbWVzc2FnZTogKHsgcGFyYW1zOiB7IG1pbiwgbWF4IH0gfSkgPT4gbWF4ID09PSB2b2lkIDAgPyAoMCwgY29kZWdlbl8xLnN0cilgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWlufSB2YWxpZCBpdGVtKHMpYCA6ICgwLCBjb2RlZ2VuXzEuc3RyKWBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW59IGFuZCBubyBtb3JlIHRoYW4gJHttYXh9IHZhbGlkIGl0ZW0ocylgLAogICAgICBwYXJhbXM6ICh7IHBhcmFtczogeyBtaW4sIG1heCB9IH0pID0+IG1heCA9PT0gdm9pZCAwID8gKDAsIGNvZGVnZW5fMS5fKWB7bWluQ29udGFpbnM6ICR7bWlufX1gIDogKDAsIGNvZGVnZW5fMS5fKWB7bWluQ29udGFpbnM6ICR7bWlufSwgbWF4Q29udGFpbnM6ICR7bWF4fX1gCiAgICB9OwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogImNvbnRhaW5zIiwKICAgICAgdHlwZTogImFycmF5IiwKICAgICAgc2NoZW1hVHlwZTogWyJvYmplY3QiLCAiYm9vbGVhbiJdLAogICAgICBiZWZvcmU6ICJ1bmlxdWVJdGVtcyIsCiAgICAgIHRyYWNrRXJyb3JzOiB0cnVlLAogICAgICBlcnJvciwKICAgICAgY29kZShjeHQpIHsKICAgICAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGRhdGEsIGl0IH0gPSBjeHQ7CiAgICAgICAgbGV0IG1pbjsKICAgICAgICBsZXQgbWF4OwogICAgICAgIGNvbnN0IHsgbWluQ29udGFpbnMsIG1heENvbnRhaW5zIH0gPSBwYXJlbnRTY2hlbWE7CiAgICAgICAgaWYgKGl0Lm9wdHMubmV4dCkgewogICAgICAgICAgbWluID0gbWluQ29udGFpbnMgPT09IHZvaWQgMCA/IDEgOiBtaW5Db250YWluczsKICAgICAgICAgIG1heCA9IG1heENvbnRhaW5zOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtaW4gPSAxOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW4gPSBnZW4uY29uc3QoImxlbiIsICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfS5sZW5ndGhgKTsKICAgICAgICBjeHQuc2V0UGFyYW1zKHsgbWluLCBtYXggfSk7CiAgICAgICAgaWYgKG1heCA9PT0gdm9pZCAwICYmIG1pbiA9PT0gMCkgewogICAgICAgICAgKDAsIHV0aWxfMS5jaGVja1N0cmljdE1vZGUpKGl0LCBgIm1pbkNvbnRhaW5zIiA9PSAwIHdpdGhvdXQgIm1heENvbnRhaW5zIjogImNvbnRhaW5zIiBrZXl3b3JkIGlnbm9yZWRgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG1heCAhPT0gdm9pZCAwICYmIG1pbiA+IG1heCkgewogICAgICAgICAgKDAsIHV0aWxfMS5jaGVja1N0cmljdE1vZGUpKGl0LCBgIm1pbkNvbnRhaW5zIiA+ICJtYXhDb250YWlucyIgaXMgYWx3YXlzIGludmFsaWRgKTsKICAgICAgICAgIGN4dC5mYWlsKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hKSkgewogICAgICAgICAgbGV0IGNvbmQgPSAoMCwgY29kZWdlbl8xLl8pYCR7bGVufSA+PSAke21pbn1gOwogICAgICAgICAgaWYgKG1heCAhPT0gdm9pZCAwKQogICAgICAgICAgICBjb25kID0gKDAsIGNvZGVnZW5fMS5fKWAke2NvbmR9ICYmICR7bGVufSA8PSAke21heH1gOwogICAgICAgICAgY3h0LnBhc3MoY29uZCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGl0Lml0ZW1zID0gdHJ1ZTsKICAgICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICAgIGlmIChtYXggPT09IHZvaWQgMCAmJiBtaW4gPT09IDEpIHsKICAgICAgICAgIHZhbGlkYXRlSXRlbXModmFsaWQsICgpID0+IGdlbi5pZih2YWxpZCwgKCkgPT4gZ2VuLmJyZWFrKCkpKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbiA9PT0gMCkgewogICAgICAgICAgZ2VuLmxldCh2YWxpZCwgdHJ1ZSk7CiAgICAgICAgICBpZiAobWF4ICE9PSB2b2lkIDApCiAgICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7ZGF0YX0ubGVuZ3RoID4gMGAsIHZhbGlkYXRlSXRlbXNXaXRoQ291bnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW4ubGV0KHZhbGlkLCBmYWxzZSk7CiAgICAgICAgICB2YWxpZGF0ZUl0ZW1zV2l0aENvdW50KCk7CiAgICAgICAgfQogICAgICAgIGN4dC5yZXN1bHQodmFsaWQsICgpID0+IGN4dC5yZXNldCgpKTsKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zV2l0aENvdW50KCkgewogICAgICAgICAgY29uc3Qgc2NoVmFsaWQgPSBnZW4ubmFtZSgiX3ZhbGlkIik7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGdlbi5sZXQoImNvdW50IiwgMCk7CiAgICAgICAgICB2YWxpZGF0ZUl0ZW1zKHNjaFZhbGlkLCAoKSA9PiBnZW4uaWYoc2NoVmFsaWQsICgpID0+IGNoZWNrTGltaXRzKGNvdW50KSkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zKF92YWxpZCwgYmxvY2spIHsKICAgICAgICAgIGdlbi5mb3JSYW5nZSgiaSIsIDAsIGxlbiwgKGkpID0+IHsKICAgICAgICAgICAgY3h0LnN1YnNjaGVtYSh7CiAgICAgICAgICAgICAga2V5d29yZDogImNvbnRhaW5zIiwKICAgICAgICAgICAgICBkYXRhUHJvcDogaSwKICAgICAgICAgICAgICBkYXRhUHJvcFR5cGU6IHV0aWxfMS5UeXBlLk51bSwKICAgICAgICAgICAgICBjb21wb3NpdGVSdWxlOiB0cnVlCiAgICAgICAgICAgIH0sIF92YWxpZCk7CiAgICAgICAgICAgIGJsb2NrKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2hlY2tMaW1pdHMoY291bnQpIHsKICAgICAgICAgIGdlbi5jb2RlKCgwLCBjb2RlZ2VuXzEuXylgJHtjb3VudH0rK2ApOwogICAgICAgICAgaWYgKG1heCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pYCR7Y291bnR9ID49ICR7bWlufWAsICgpID0+IGdlbi5hc3NpZ24odmFsaWQsIHRydWUpLmJyZWFrKCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtjb3VudH0gPiAke21heH1gLCAoKSA9PiBnZW4uYXNzaWduKHZhbGlkLCBmYWxzZSkuYnJlYWsoKSk7CiAgICAgICAgICAgIGlmIChtaW4gPT09IDEpCiAgICAgICAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgdHJ1ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAke2NvdW50fSA+PSAke21pbn1gLCAoKSA9PiBnZW4uYXNzaWduKHZhbGlkLCB0cnVlKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvZGVwZW5kZW5jaWVzLmpzCnZhciByZXF1aXJlX2RlcGVuZGVuY2llcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9kZXBlbmRlbmNpZXMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnZhbGlkYXRlU2NoZW1hRGVwcyA9IGV4cG9ydHMyLnZhbGlkYXRlUHJvcGVydHlEZXBzID0gZXhwb3J0czIuZXJyb3IgPSB2b2lkIDA7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgZXhwb3J0czIuZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IHBhcmFtczogeyBwcm9wZXJ0eSwgZGVwc0NvdW50LCBkZXBzIH0gfSkgPT4gewogICAgICAgIGNvbnN0IHByb3BlcnR5X2llcyA9IGRlcHNDb3VudCA9PT0gMSA/ICJwcm9wZXJ0eSIgOiAicHJvcGVydGllcyI7CiAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuc3RyKWBtdXN0IGhhdmUgJHtwcm9wZXJ0eV9pZXN9ICR7ZGVwc30gd2hlbiBwcm9wZXJ0eSAke3Byb3BlcnR5fSBpcyBwcmVzZW50YDsKICAgICAgfSwKICAgICAgcGFyYW1zOiAoeyBwYXJhbXM6IHsgcHJvcGVydHksIGRlcHNDb3VudCwgZGVwcywgbWlzc2luZ1Byb3BlcnR5IH0gfSkgPT4gKDAsIGNvZGVnZW5fMS5fKWB7cHJvcGVydHk6ICR7cHJvcGVydHl9LAogICAgbWlzc2luZ1Byb3BlcnR5OiAke21pc3NpbmdQcm9wZXJ0eX0sCiAgICBkZXBzQ291bnQ6ICR7ZGVwc0NvdW50fSwKICAgIGRlcHM6ICR7ZGVwc319YAogICAgICAvLyBUT0RPIGNoYW5nZSB0byByZWZlcmVuY2UKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiZGVwZW5kZW5jaWVzIiwKICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgIHNjaGVtYVR5cGU6ICJvYmplY3QiLAogICAgICBlcnJvcjogZXhwb3J0czIuZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgW3Byb3BEZXBzLCBzY2hEZXBzXSA9IHNwbGl0RGVwZW5kZW5jaWVzKGN4dCk7CiAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eURlcHMoY3h0LCBwcm9wRGVwcyk7CiAgICAgICAgdmFsaWRhdGVTY2hlbWFEZXBzKGN4dCwgc2NoRGVwcyk7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBzcGxpdERlcGVuZGVuY2llcyh7IHNjaGVtYSB9KSB7CiAgICAgIGNvbnN0IHByb3BlcnR5RGVwcyA9IHt9OwogICAgICBjb25zdCBzY2hlbWFEZXBzID0ge307CiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkgewogICAgICAgIGlmIChrZXkgPT09ICJfX3Byb3RvX18iKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgY29uc3QgZGVwcyA9IEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pID8gcHJvcGVydHlEZXBzIDogc2NoZW1hRGVwczsKICAgICAgICBkZXBzW2tleV0gPSBzY2hlbWFba2V5XTsKICAgICAgfQogICAgICByZXR1cm4gW3Byb3BlcnR5RGVwcywgc2NoZW1hRGVwc107CiAgICB9CiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5RGVwcyhjeHQsIHByb3BlcnR5RGVwcyA9IGN4dC5zY2hlbWEpIHsKICAgICAgY29uc3QgeyBnZW4sIGRhdGEsIGl0IH0gPSBjeHQ7CiAgICAgIGlmIChPYmplY3Qua2V5cyhwcm9wZXJ0eURlcHMpLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG1pc3NpbmcgPSBnZW4ubGV0KCJtaXNzaW5nIik7CiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wZXJ0eURlcHMpIHsKICAgICAgICBjb25zdCBkZXBzID0gcHJvcGVydHlEZXBzW3Byb3BdOwogICAgICAgIGlmIChkZXBzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IGhhc1Byb3BlcnR5ID0gKDAsIGNvZGVfMS5wcm9wZXJ0eUluRGF0YSkoZ2VuLCBkYXRhLCBwcm9wLCBpdC5vcHRzLm93blByb3BlcnRpZXMpOwogICAgICAgIGN4dC5zZXRQYXJhbXMoewogICAgICAgICAgcHJvcGVydHk6IHByb3AsCiAgICAgICAgICBkZXBzQ291bnQ6IGRlcHMubGVuZ3RoLAogICAgICAgICAgZGVwczogZGVwcy5qb2luKCIsICIpCiAgICAgICAgfSk7CiAgICAgICAgaWYgKGl0LmFsbEVycm9ycykgewogICAgICAgICAgZ2VuLmlmKGhhc1Byb3BlcnR5LCAoKSA9PiB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwUHJvcCBvZiBkZXBzKSB7CiAgICAgICAgICAgICAgKDAsIGNvZGVfMS5jaGVja1JlcG9ydE1pc3NpbmdQcm9wKShjeHQsIGRlcFByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgJHtoYXNQcm9wZXJ0eX0gJiYgKCR7KDAsIGNvZGVfMS5jaGVja01pc3NpbmdQcm9wKShjeHQsIGRlcHMsIG1pc3NpbmcpfSlgKTsKICAgICAgICAgICgwLCBjb2RlXzEucmVwb3J0TWlzc2luZ1Byb3ApKGN4dCwgbWlzc2luZyk7CiAgICAgICAgICBnZW4uZWxzZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXhwb3J0czIudmFsaWRhdGVQcm9wZXJ0eURlcHMgPSB2YWxpZGF0ZVByb3BlcnR5RGVwczsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlU2NoZW1hRGVwcyhjeHQsIHNjaGVtYURlcHMgPSBjeHQuc2NoZW1hKSB7CiAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCBrZXl3b3JkLCBpdCB9ID0gY3h0OwogICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICBmb3IgKGNvbnN0IHByb3AgaW4gc2NoZW1hRGVwcykgewogICAgICAgIGlmICgoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hRGVwc1twcm9wXSkpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBnZW4uaWYoCiAgICAgICAgICAoMCwgY29kZV8xLnByb3BlcnR5SW5EYXRhKShnZW4sIGRhdGEsIHByb3AsIGl0Lm9wdHMub3duUHJvcGVydGllcyksCiAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHNjaEN4dCA9IGN4dC5zdWJzY2hlbWEoeyBrZXl3b3JkLCBzY2hlbWFQcm9wOiBwcm9wIH0sIHZhbGlkKTsKICAgICAgICAgICAgY3h0Lm1lcmdlVmFsaWRFdmFsdWF0ZWQoc2NoQ3h0LCB2YWxpZCk7CiAgICAgICAgICB9LAogICAgICAgICAgKCkgPT4gZ2VuLnZhcih2YWxpZCwgdHJ1ZSkKICAgICAgICAgIC8vIFRPRE8gdmFyCiAgICAgICAgKTsKICAgICAgICBjeHQub2sodmFsaWQpOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi52YWxpZGF0ZVNjaGVtYURlcHMgPSB2YWxpZGF0ZVNjaGVtYURlcHM7CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9wcm9wZXJ0eU5hbWVzLmpzCnZhciByZXF1aXJlX3Byb3BlcnR5TmFtZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvcHJvcGVydHlOYW1lcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAicHJvcGVydHkgbmFtZSBtdXN0IGJlIHZhbGlkIiwKICAgICAgcGFyYW1zOiAoeyBwYXJhbXMgfSkgPT4gKDAsIGNvZGVnZW5fMS5fKWB7cHJvcGVydHlOYW1lOiAke3BhcmFtcy5wcm9wZXJ0eU5hbWV9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAicHJvcGVydHlOYW1lcyIsCiAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICBzY2hlbWFUeXBlOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIGRhdGEsIGl0IH0gPSBjeHQ7CiAgICAgICAgaWYgKCgwLCB1dGlsXzEuYWx3YXlzVmFsaWRTY2hlbWEpKGl0LCBzY2hlbWEpKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHZhbGlkID0gZ2VuLm5hbWUoInZhbGlkIik7CiAgICAgICAgZ2VuLmZvckluKCJrZXkiLCBkYXRhLCAoa2V5KSA9PiB7CiAgICAgICAgICBjeHQuc2V0UGFyYW1zKHsgcHJvcGVydHlOYW1lOiBrZXkgfSk7CiAgICAgICAgICBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAga2V5d29yZDogInByb3BlcnR5TmFtZXMiLAogICAgICAgICAgICBkYXRhOiBrZXksCiAgICAgICAgICAgIGRhdGFUeXBlczogWyJzdHJpbmciXSwKICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBrZXksCiAgICAgICAgICAgIGNvbXBvc2l0ZVJ1bGU6IHRydWUKICAgICAgICAgIH0sIHZhbGlkKTsKICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLm5vdCkodmFsaWQpLCAoKSA9PiB7CiAgICAgICAgICAgIGN4dC5lcnJvcih0cnVlKTsKICAgICAgICAgICAgaWYgKCFpdC5hbGxFcnJvcnMpCiAgICAgICAgICAgICAgZ2VuLmJyZWFrKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBjeHQub2sodmFsaWQpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvYWRkaXRpb25hbFByb3BlcnRpZXMuanMKdmFyIHJlcXVpcmVfYWRkaXRpb25hbFByb3BlcnRpZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvYWRkaXRpb25hbFByb3BlcnRpZXMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBjb2RlXzEgPSByZXF1aXJlX2NvZGUyKCk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgbmFtZXNfMSA9IHJlcXVpcmVfbmFtZXMoKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBlcnJvciA9IHsKICAgICAgbWVzc2FnZTogIm11c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIiwKICAgICAgcGFyYW1zOiAoeyBwYXJhbXMgfSkgPT4gKDAsIGNvZGVnZW5fMS5fKWB7YWRkaXRpb25hbFByb3BlcnR5OiAke3BhcmFtcy5hZGRpdGlvbmFsUHJvcGVydHl9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICB0eXBlOiBbIm9iamVjdCJdLAogICAgICBzY2hlbWFUeXBlOiBbImJvb2xlYW4iLCAib2JqZWN0Il0sCiAgICAgIGFsbG93VW5kZWZpbmVkOiB0cnVlLAogICAgICB0cmFja0Vycm9yczogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYSwgcGFyZW50U2NoZW1hLCBkYXRhLCBlcnJzQ291bnQsIGl0IH0gPSBjeHQ7CiAgICAgICAgaWYgKCFlcnJzQ291bnQpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvciIpOwogICAgICAgIGNvbnN0IHsgYWxsRXJyb3JzLCBvcHRzIH0gPSBpdDsKICAgICAgICBpdC5wcm9wcyA9IHRydWU7CiAgICAgICAgaWYgKG9wdHMucmVtb3ZlQWRkaXRpb25hbCAhPT0gImFsbCIgJiYgKDAsIHV0aWxfMS5hbHdheXNWYWxpZFNjaGVtYSkoaXQsIHNjaGVtYSkpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgcHJvcHMgPSAoMCwgY29kZV8xLmFsbFNjaGVtYVByb3BlcnRpZXMpKHBhcmVudFNjaGVtYS5wcm9wZXJ0aWVzKTsKICAgICAgICBjb25zdCBwYXRQcm9wcyA9ICgwLCBjb2RlXzEuYWxsU2NoZW1hUHJvcGVydGllcykocGFyZW50U2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTsKICAgICAgICBjaGVja0FkZGl0aW9uYWxQcm9wZXJ0aWVzKCk7CiAgICAgICAgY3h0Lm9rKCgwLCBjb2RlZ2VuXzEuXylgJHtlcnJzQ291bnR9ID09PSAke25hbWVzXzEuZGVmYXVsdC5lcnJvcnN9YCk7CiAgICAgICAgZnVuY3Rpb24gY2hlY2tBZGRpdGlvbmFsUHJvcGVydGllcygpIHsKICAgICAgICAgIGdlbi5mb3JJbigia2V5IiwgZGF0YSwgKGtleSkgPT4gewogICAgICAgICAgICBpZiAoIXByb3BzLmxlbmd0aCAmJiAhcGF0UHJvcHMubGVuZ3RoKQogICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eUNvZGUoa2V5KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGdlbi5pZihpc0FkZGl0aW9uYWwoa2V5KSwgKCkgPT4gYWRkaXRpb25hbFByb3BlcnR5Q29kZShrZXkpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpc0FkZGl0aW9uYWwoa2V5KSB7CiAgICAgICAgICBsZXQgZGVmaW5lZFByb3A7CiAgICAgICAgICBpZiAocHJvcHMubGVuZ3RoID4gOCkgewogICAgICAgICAgICBjb25zdCBwcm9wc1NjaGVtYSA9ICgwLCB1dGlsXzEuc2NoZW1hUmVmT3JWYWwpKGl0LCBwYXJlbnRTY2hlbWEucHJvcGVydGllcywgInByb3BlcnRpZXMiKTsKICAgICAgICAgICAgZGVmaW5lZFByb3AgPSAoMCwgY29kZV8xLmlzT3duUHJvcGVydHkpKGdlbiwgcHJvcHNTY2hlbWEsIGtleSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLmxlbmd0aCkgewogICAgICAgICAgICBkZWZpbmVkUHJvcCA9ICgwLCBjb2RlZ2VuXzEub3IpKC4uLnByb3BzLm1hcCgocCkgPT4gKDAsIGNvZGVnZW5fMS5fKWAke2tleX0gPT09ICR7cH1gKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZWZpbmVkUHJvcCA9IGNvZGVnZW5fMS5uaWw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0UHJvcHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGRlZmluZWRQcm9wID0gKDAsIGNvZGVnZW5fMS5vcikoZGVmaW5lZFByb3AsIC4uLnBhdFByb3BzLm1hcCgocCkgPT4gKDAsIGNvZGVnZW5fMS5fKWAkeygwLCBjb2RlXzEudXNlUGF0dGVybikoY3h0LCBwKX0udGVzdCgke2tleX0pYCkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEubm90KShkZWZpbmVkUHJvcCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRlbGV0ZUFkZGl0aW9uYWwoa2V5KSB7CiAgICAgICAgICBnZW4uY29kZSgoMCwgY29kZWdlbl8xLl8pYGRlbGV0ZSAke2RhdGF9WyR7a2V5fV1gKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWRkaXRpb25hbFByb3BlcnR5Q29kZShrZXkpIHsKICAgICAgICAgIGlmIChvcHRzLnJlbW92ZUFkZGl0aW9uYWwgPT09ICJhbGwiIHx8IG9wdHMucmVtb3ZlQWRkaXRpb25hbCAmJiBzY2hlbWEgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGRlbGV0ZUFkZGl0aW9uYWwoa2V5KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgY3h0LnNldFBhcmFtcyh7IGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5IH0pOwogICAgICAgICAgICBjeHQuZXJyb3IoKTsKICAgICAgICAgICAgaWYgKCFhbGxFcnJvcnMpCiAgICAgICAgICAgICAgZ2VuLmJyZWFrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09ICJvYmplY3QiICYmICEoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hKSkgewogICAgICAgICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICAgICAgICBpZiAob3B0cy5yZW1vdmVBZGRpdGlvbmFsID09PSAiZmFpbGluZyIpIHsKICAgICAgICAgICAgICBhcHBseUFkZGl0aW9uYWxTY2hlbWEoa2V5LCB2YWxpZCwgZmFsc2UpOwogICAgICAgICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLm5vdCkodmFsaWQpLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBjeHQucmVzZXQoKTsKICAgICAgICAgICAgICAgIGRlbGV0ZUFkZGl0aW9uYWwoa2V5KTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhcHBseUFkZGl0aW9uYWxTY2hlbWEoa2V5LCB2YWxpZCk7CiAgICAgICAgICAgICAgaWYgKCFhbGxFcnJvcnMpCiAgICAgICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5ub3QpKHZhbGlkKSwgKCkgPT4gZ2VuLmJyZWFrKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFwcGx5QWRkaXRpb25hbFNjaGVtYShrZXksIHZhbGlkLCBlcnJvcnMpIHsKICAgICAgICAgIGNvbnN0IHN1YnNjaGVtYSA9IHsKICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgZGF0YVByb3A6IGtleSwKICAgICAgICAgICAgZGF0YVByb3BUeXBlOiB1dGlsXzEuVHlwZS5TdHIKICAgICAgICAgIH07CiAgICAgICAgICBpZiAoZXJyb3JzID09PSBmYWxzZSkgewogICAgICAgICAgICBPYmplY3QuYXNzaWduKHN1YnNjaGVtYSwgewogICAgICAgICAgICAgIGNvbXBvc2l0ZVJ1bGU6IHRydWUsCiAgICAgICAgICAgICAgY3JlYXRlRXJyb3JzOiBmYWxzZSwKICAgICAgICAgICAgICBhbGxFcnJvcnM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY3h0LnN1YnNjaGVtYShzdWJzY2hlbWEsIHZhbGlkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9wcm9wZXJ0aWVzLmpzCnZhciByZXF1aXJlX3Byb3BlcnRpZXMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvcHJvcGVydGllcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIHZhbGlkYXRlXzEgPSByZXF1aXJlX3ZhbGlkYXRlKCk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXzEgPSByZXF1aXJlX2FkZGl0aW9uYWxQcm9wZXJ0aWVzKCk7CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAicHJvcGVydGllcyIsCiAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICBzY2hlbWFUeXBlOiAib2JqZWN0IiwKICAgICAgY29kZShjeHQpIHsKICAgICAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGRhdGEsIGl0IH0gPSBjeHQ7CiAgICAgICAgaWYgKGl0Lm9wdHMucmVtb3ZlQWRkaXRpb25hbCA9PT0gImFsbCIgJiYgcGFyZW50U2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID09PSB2b2lkIDApIHsKICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXzEuZGVmYXVsdC5jb2RlKG5ldyB2YWxpZGF0ZV8xLktleXdvcmRDeHQoaXQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXzEuZGVmYXVsdCwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIikpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhbGxQcm9wcyA9ICgwLCBjb2RlXzEuYWxsU2NoZW1hUHJvcGVydGllcykoc2NoZW1hKTsKICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYWxsUHJvcHMpIHsKICAgICAgICAgIGl0LmRlZmluZWRQcm9wZXJ0aWVzLmFkZChwcm9wKTsKICAgICAgICB9CiAgICAgICAgaWYgKGl0Lm9wdHMudW5ldmFsdWF0ZWQgJiYgYWxsUHJvcHMubGVuZ3RoICYmIGl0LnByb3BzICE9PSB0cnVlKSB7CiAgICAgICAgICBpdC5wcm9wcyA9IHV0aWxfMS5tZXJnZUV2YWx1YXRlZC5wcm9wcyhnZW4sICgwLCB1dGlsXzEudG9IYXNoKShhbGxQcm9wcyksIGl0LnByb3BzKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGFsbFByb3BzLmZpbHRlcigocCkgPT4gISgwLCB1dGlsXzEuYWx3YXlzVmFsaWRTY2hlbWEpKGl0LCBzY2hlbWFbcF0pKTsKICAgICAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubmFtZSgidmFsaWQiKTsKICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykgewogICAgICAgICAgaWYgKGhhc0RlZmF1bHQocHJvcCkpIHsKICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eVNjaGVtYShwcm9wKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdlbi5pZigoMCwgY29kZV8xLnByb3BlcnR5SW5EYXRhKShnZW4sIGRhdGEsIHByb3AsIGl0Lm9wdHMub3duUHJvcGVydGllcykpOwogICAgICAgICAgICBhcHBseVByb3BlcnR5U2NoZW1hKHByb3ApOwogICAgICAgICAgICBpZiAoIWl0LmFsbEVycm9ycykKICAgICAgICAgICAgICBnZW4uZWxzZSgpLnZhcih2YWxpZCwgdHJ1ZSk7CiAgICAgICAgICAgIGdlbi5lbmRJZigpOwogICAgICAgICAgfQogICAgICAgICAgY3h0Lml0LmRlZmluZWRQcm9wZXJ0aWVzLmFkZChwcm9wKTsKICAgICAgICAgIGN4dC5vayh2YWxpZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhc0RlZmF1bHQocHJvcCkgewogICAgICAgICAgcmV0dXJuIGl0Lm9wdHMudXNlRGVmYXVsdHMgJiYgIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgc2NoZW1hW3Byb3BdLmRlZmF1bHQgIT09IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wZXJ0eVNjaGVtYShwcm9wKSB7CiAgICAgICAgICBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAga2V5d29yZDogInByb3BlcnRpZXMiLAogICAgICAgICAgICBzY2hlbWFQcm9wOiBwcm9wLAogICAgICAgICAgICBkYXRhUHJvcDogcHJvcAogICAgICAgICAgfSwgdmFsaWQpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL3BhdHRlcm5Qcm9wZXJ0aWVzLmpzCnZhciByZXF1aXJlX3BhdHRlcm5Qcm9wZXJ0aWVzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL3BhdHRlcm5Qcm9wZXJ0aWVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIHV0aWxfMSA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIHV0aWxfMiA9IHJlcXVpcmVfdXRpbCgpOwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogInBhdHRlcm5Qcm9wZXJ0aWVzIiwKICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgIHNjaGVtYVR5cGU6ICJvYmplY3QiLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIGRhdGEsIHBhcmVudFNjaGVtYSwgaXQgfSA9IGN4dDsKICAgICAgICBjb25zdCB7IG9wdHMgfSA9IGl0OwogICAgICAgIGNvbnN0IHBhdHRlcm5zID0gKDAsIGNvZGVfMS5hbGxTY2hlbWFQcm9wZXJ0aWVzKShzY2hlbWEpOwogICAgICAgIGNvbnN0IGFsd2F5c1ZhbGlkUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIoKHApID0+ICgwLCB1dGlsXzEuYWx3YXlzVmFsaWRTY2hlbWEpKGl0LCBzY2hlbWFbcF0pKTsKICAgICAgICBpZiAocGF0dGVybnMubGVuZ3RoID09PSAwIHx8IGFsd2F5c1ZhbGlkUGF0dGVybnMubGVuZ3RoID09PSBwYXR0ZXJucy5sZW5ndGggJiYgKCFpdC5vcHRzLnVuZXZhbHVhdGVkIHx8IGl0LnByb3BzID09PSB0cnVlKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaGVja1Byb3BlcnRpZXMgPSBvcHRzLnN0cmljdFNjaGVtYSAmJiAhb3B0cy5hbGxvd01hdGNoaW5nUHJvcGVydGllcyAmJiBwYXJlbnRTY2hlbWEucHJvcGVydGllczsKICAgICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICAgIGlmIChpdC5wcm9wcyAhPT0gdHJ1ZSAmJiAhKGl0LnByb3BzIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUpKSB7CiAgICAgICAgICBpdC5wcm9wcyA9ICgwLCB1dGlsXzIuZXZhbHVhdGVkUHJvcHNUb05hbWUpKGdlbiwgaXQucHJvcHMpOwogICAgICAgIH0KICAgICAgICBjb25zdCB7IHByb3BzIH0gPSBpdDsKICAgICAgICB2YWxpZGF0ZVBhdHRlcm5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuUHJvcGVydGllcygpIHsKICAgICAgICAgIGZvciAoY29uc3QgcGF0IG9mIHBhdHRlcm5zKSB7CiAgICAgICAgICAgIGlmIChjaGVja1Byb3BlcnRpZXMpCiAgICAgICAgICAgICAgY2hlY2tNYXRjaGluZ1Byb3BlcnRpZXMocGF0KTsKICAgICAgICAgICAgaWYgKGl0LmFsbEVycm9ycykgewogICAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydGllcyhwYXQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGdlbi52YXIodmFsaWQsIHRydWUpOwogICAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydGllcyhwYXQpOwogICAgICAgICAgICAgIGdlbi5pZih2YWxpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2hlY2tNYXRjaGluZ1Byb3BlcnRpZXMocGF0KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2hlY2tQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIGlmIChuZXcgUmVnRXhwKHBhdCkudGVzdChwcm9wKSkgewogICAgICAgICAgICAgICgwLCB1dGlsXzEuY2hlY2tTdHJpY3RNb2RlKShpdCwgYHByb3BlcnR5ICR7cHJvcH0gbWF0Y2hlcyBwYXR0ZXJuICR7cGF0fSAodXNlIGFsbG93TWF0Y2hpbmdQcm9wZXJ0aWVzKWApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyhwYXQpIHsKICAgICAgICAgIGdlbi5mb3JJbigia2V5IiwgZGF0YSwgKGtleSkgPT4gewogICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAkeygwLCBjb2RlXzEudXNlUGF0dGVybikoY3h0LCBwYXQpfS50ZXN0KCR7a2V5fSlgLCAoKSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgYWx3YXlzVmFsaWQgPSBhbHdheXNWYWxpZFBhdHRlcm5zLmluY2x1ZGVzKHBhdCk7CiAgICAgICAgICAgICAgaWYgKCFhbHdheXNWYWxpZCkgewogICAgICAgICAgICAgICAgY3h0LnN1YnNjaGVtYSh7CiAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJwYXR0ZXJuUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgIHNjaGVtYVByb3A6IHBhdCwKICAgICAgICAgICAgICAgICAgZGF0YVByb3A6IGtleSwKICAgICAgICAgICAgICAgICAgZGF0YVByb3BUeXBlOiB1dGlsXzIuVHlwZS5TdHIKICAgICAgICAgICAgICAgIH0sIHZhbGlkKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudW5ldmFsdWF0ZWQgJiYgcHJvcHMgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKWAke3Byb3BzfVske2tleX1dYCwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICghYWx3YXlzVmFsaWQgJiYgIWl0LmFsbEVycm9ycykgewogICAgICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEubm90KSh2YWxpZCksICgpID0+IGdlbi5icmVhaygpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3Ivbm90LmpzCnZhciByZXF1aXJlX25vdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvYXBwbGljYXRvci9ub3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJub3QiLAogICAgICBzY2hlbWFUeXBlOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgIHRyYWNrRXJyb3JzOiB0cnVlLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIGl0IH0gPSBjeHQ7CiAgICAgICAgaWYgKCgwLCB1dGlsXzEuYWx3YXlzVmFsaWRTY2hlbWEpKGl0LCBzY2hlbWEpKSB7CiAgICAgICAgICBjeHQuZmFpbCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWxpZCA9IGdlbi5uYW1lKCJ2YWxpZCIpOwogICAgICAgIGN4dC5zdWJzY2hlbWEoewogICAgICAgICAga2V5d29yZDogIm5vdCIsCiAgICAgICAgICBjb21wb3NpdGVSdWxlOiB0cnVlLAogICAgICAgICAgY3JlYXRlRXJyb3JzOiBmYWxzZSwKICAgICAgICAgIGFsbEVycm9yczogZmFsc2UKICAgICAgICB9LCB2YWxpZCk7CiAgICAgICAgY3h0LmZhaWxSZXN1bHQodmFsaWQsICgpID0+IGN4dC5yZXNldCgpLCAoKSA9PiBjeHQuZXJyb3IoKSk7CiAgICAgIH0sCiAgICAgIGVycm9yOiB7IG1lc3NhZ2U6ICJtdXN0IE5PVCBiZSB2YWxpZCIgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2FueU9mLmpzCnZhciByZXF1aXJlX2FueU9mID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2FueU9mLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZV8xID0gcmVxdWlyZV9jb2RlMigpOwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogImFueU9mIiwKICAgICAgc2NoZW1hVHlwZTogImFycmF5IiwKICAgICAgdHJhY2tFcnJvcnM6IHRydWUsCiAgICAgIGNvZGU6IGNvZGVfMS52YWxpZGF0ZVVuaW9uLAogICAgICBlcnJvcjogeyBtZXNzYWdlOiAibXVzdCBtYXRjaCBhIHNjaGVtYSBpbiBhbnlPZiIgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL29uZU9mLmpzCnZhciByZXF1aXJlX29uZU9mID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL29uZU9mLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICJtdXN0IG1hdGNoIGV4YWN0bHkgb25lIHNjaGVtYSBpbiBvbmVPZiIsCiAgICAgIHBhcmFtczogKHsgcGFyYW1zIH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge3Bhc3NpbmdTY2hlbWFzOiAke3BhcmFtcy5wYXNzaW5nfX1gCiAgICB9OwogICAgdmFyIGRlZiA9IHsKICAgICAga2V5d29yZDogIm9uZU9mIiwKICAgICAgc2NoZW1hVHlwZTogImFycmF5IiwKICAgICAgdHJhY2tFcnJvcnM6IHRydWUsCiAgICAgIGVycm9yLAogICAgICBjb2RlKGN4dCkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQgfSA9IGN4dDsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgICAgaWYgKGl0Lm9wdHMuZGlzY3JpbWluYXRvciAmJiBwYXJlbnRTY2hlbWEuZGlzY3JpbWluYXRvcikKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBzY2hBcnIgPSBzY2hlbWE7CiAgICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubGV0KCJ2YWxpZCIsIGZhbHNlKTsKICAgICAgICBjb25zdCBwYXNzaW5nID0gZ2VuLmxldCgicGFzc2luZyIsIG51bGwpOwogICAgICAgIGNvbnN0IHNjaFZhbGlkID0gZ2VuLm5hbWUoIl92YWxpZCIpOwogICAgICAgIGN4dC5zZXRQYXJhbXMoeyBwYXNzaW5nIH0pOwogICAgICAgIGdlbi5ibG9jayh2YWxpZGF0ZU9uZU9mKTsKICAgICAgICBjeHQucmVzdWx0KHZhbGlkLCAoKSA9PiBjeHQucmVzZXQoKSwgKCkgPT4gY3h0LmVycm9yKHRydWUpKTsKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZU9uZU9mKCkgewogICAgICAgICAgc2NoQXJyLmZvckVhY2goKHNjaCwgaSkgPT4gewogICAgICAgICAgICBsZXQgc2NoQ3h0OwogICAgICAgICAgICBpZiAoKDAsIHV0aWxfMS5hbHdheXNWYWxpZFNjaGVtYSkoaXQsIHNjaCkpIHsKICAgICAgICAgICAgICBnZW4udmFyKHNjaFZhbGlkLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzY2hDeHQgPSBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJvbmVPZiIsCiAgICAgICAgICAgICAgICBzY2hlbWFQcm9wOiBpLAogICAgICAgICAgICAgICAgY29tcG9zaXRlUnVsZTogdHJ1ZQogICAgICAgICAgICAgIH0sIHNjaFZhbGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKWAke3NjaFZhbGlkfSAmJiAke3ZhbGlkfWApLmFzc2lnbih2YWxpZCwgZmFsc2UpLmFzc2lnbihwYXNzaW5nLCAoMCwgY29kZWdlbl8xLl8pYFske3Bhc3Npbmd9LCAke2l9XWApLmVsc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZW4uaWYoc2NoVmFsaWQsICgpID0+IHsKICAgICAgICAgICAgICBnZW4uYXNzaWduKHZhbGlkLCB0cnVlKTsKICAgICAgICAgICAgICBnZW4uYXNzaWduKHBhc3NpbmcsIGkpOwogICAgICAgICAgICAgIGlmIChzY2hDeHQpCiAgICAgICAgICAgICAgICBjeHQubWVyZ2VFdmFsdWF0ZWQoc2NoQ3h0LCBjb2RlZ2VuXzEuTmFtZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGRlZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvYWxsT2YuanMKdmFyIHJlcXVpcmVfYWxsT2YgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvYWxsT2YuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJhbGxPZiIsCiAgICAgIHNjaGVtYVR5cGU6ICJhcnJheSIsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYSwgaXQgfSA9IGN4dDsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7CiAgICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubmFtZSgidmFsaWQiKTsKICAgICAgICBzY2hlbWEuZm9yRWFjaCgoc2NoLCBpKSA9PiB7CiAgICAgICAgICBpZiAoKDAsIHV0aWxfMS5hbHdheXNWYWxpZFNjaGVtYSkoaXQsIHNjaCkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IHNjaEN4dCA9IGN4dC5zdWJzY2hlbWEoeyBrZXl3b3JkOiAiYWxsT2YiLCBzY2hlbWFQcm9wOiBpIH0sIHZhbGlkKTsKICAgICAgICAgIGN4dC5vayh2YWxpZCk7CiAgICAgICAgICBjeHQubWVyZ2VFdmFsdWF0ZWQoc2NoQ3h0KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2lmLmpzCnZhciByZXF1aXJlX2lmID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2lmLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29kZWdlbl8xID0gcmVxdWlyZV9jb2RlZ2VuKCk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgZXJyb3IgPSB7CiAgICAgIG1lc3NhZ2U6ICh7IHBhcmFtcyB9KSA9PiAoMCwgY29kZWdlbl8xLnN0cilgbXVzdCBtYXRjaCAiJHtwYXJhbXMuaWZDbGF1c2V9IiBzY2hlbWFgLAogICAgICBwYXJhbXM6ICh7IHBhcmFtcyB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHtmYWlsaW5nS2V5d29yZDogJHtwYXJhbXMuaWZDbGF1c2V9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiaWYiLAogICAgICBzY2hlbWFUeXBlOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgIHRyYWNrRXJyb3JzOiB0cnVlLAogICAgICBlcnJvciwKICAgICAgY29kZShjeHQpIHsKICAgICAgICBjb25zdCB7IGdlbiwgcGFyZW50U2NoZW1hLCBpdCB9ID0gY3h0OwogICAgICAgIGlmIChwYXJlbnRTY2hlbWEudGhlbiA9PT0gdm9pZCAwICYmIHBhcmVudFNjaGVtYS5lbHNlID09PSB2b2lkIDApIHsKICAgICAgICAgICgwLCB1dGlsXzEuY2hlY2tTdHJpY3RNb2RlKShpdCwgJyJpZiIgd2l0aG91dCAidGhlbiIgYW5kICJlbHNlIiBpcyBpZ25vcmVkJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhc1RoZW4gPSBoYXNTY2hlbWEoaXQsICJ0aGVuIik7CiAgICAgICAgY29uc3QgaGFzRWxzZSA9IGhhc1NjaGVtYShpdCwgImVsc2UiKTsKICAgICAgICBpZiAoIWhhc1RoZW4gJiYgIWhhc0Vsc2UpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubGV0KCJ2YWxpZCIsIHRydWUpOwogICAgICAgIGNvbnN0IHNjaFZhbGlkID0gZ2VuLm5hbWUoIl92YWxpZCIpOwogICAgICAgIHZhbGlkYXRlSWYoKTsKICAgICAgICBjeHQucmVzZXQoKTsKICAgICAgICBpZiAoaGFzVGhlbiAmJiBoYXNFbHNlKSB7CiAgICAgICAgICBjb25zdCBpZkNsYXVzZSA9IGdlbi5sZXQoImlmQ2xhdXNlIik7CiAgICAgICAgICBjeHQuc2V0UGFyYW1zKHsgaWZDbGF1c2UgfSk7CiAgICAgICAgICBnZW4uaWYoc2NoVmFsaWQsIHZhbGlkYXRlQ2xhdXNlKCJ0aGVuIiwgaWZDbGF1c2UpLCB2YWxpZGF0ZUNsYXVzZSgiZWxzZSIsIGlmQ2xhdXNlKSk7CiAgICAgICAgfSBlbHNlIGlmIChoYXNUaGVuKSB7CiAgICAgICAgICBnZW4uaWYoc2NoVmFsaWQsIHZhbGlkYXRlQ2xhdXNlKCJ0aGVuIikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5ub3QpKHNjaFZhbGlkKSwgdmFsaWRhdGVDbGF1c2UoImVsc2UiKSk7CiAgICAgICAgfQogICAgICAgIGN4dC5wYXNzKHZhbGlkLCAoKSA9PiBjeHQuZXJyb3IodHJ1ZSkpOwogICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWYoKSB7CiAgICAgICAgICBjb25zdCBzY2hDeHQgPSBjeHQuc3Vic2NoZW1hKHsKICAgICAgICAgICAga2V5d29yZDogImlmIiwKICAgICAgICAgICAgY29tcG9zaXRlUnVsZTogdHJ1ZSwKICAgICAgICAgICAgY3JlYXRlRXJyb3JzOiBmYWxzZSwKICAgICAgICAgICAgYWxsRXJyb3JzOiBmYWxzZQogICAgICAgICAgfSwgc2NoVmFsaWQpOwogICAgICAgICAgY3h0Lm1lcmdlRXZhbHVhdGVkKHNjaEN4dCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlQ2xhdXNlKGtleXdvcmQsIGlmQ2xhdXNlKSB7CiAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICBjb25zdCBzY2hDeHQgPSBjeHQuc3Vic2NoZW1hKHsga2V5d29yZCB9LCBzY2hWYWxpZCk7CiAgICAgICAgICAgIGdlbi5hc3NpZ24odmFsaWQsIHNjaFZhbGlkKTsKICAgICAgICAgICAgY3h0Lm1lcmdlVmFsaWRFdmFsdWF0ZWQoc2NoQ3h0LCB2YWxpZCk7CiAgICAgICAgICAgIGlmIChpZkNsYXVzZSkKICAgICAgICAgICAgICBnZW4uYXNzaWduKGlmQ2xhdXNlLCAoMCwgY29kZWdlbl8xLl8pYCR7a2V5d29yZH1gKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGN4dC5zZXRQYXJhbXMoeyBpZkNsYXVzZToga2V5d29yZCB9KTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gaGFzU2NoZW1hKGl0LCBrZXl3b3JkKSB7CiAgICAgIGNvbnN0IHNjaGVtYSA9IGl0LnNjaGVtYVtrZXl3b3JkXTsKICAgICAgcmV0dXJuIHNjaGVtYSAhPT0gdm9pZCAwICYmICEoMCwgdXRpbF8xLmFsd2F5c1ZhbGlkU2NoZW1hKShpdCwgc2NoZW1hKTsKICAgIH0KICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL3RoZW5FbHNlLmpzCnZhciByZXF1aXJlX3RoZW5FbHNlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL3RoZW5FbHNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgdXRpbF8xID0gcmVxdWlyZV91dGlsKCk7CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiBbInRoZW4iLCAiZWxzZSJdLAogICAgICBzY2hlbWFUeXBlOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgIGNvZGUoeyBrZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGl0IH0pIHsKICAgICAgICBpZiAocGFyZW50U2NoZW1hLmlmID09PSB2b2lkIDApCiAgICAgICAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIGAiJHtrZXl3b3JkfSIgd2l0aG91dCAiaWYiIGlzIGlnbm9yZWRgKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9hcHBsaWNhdG9yL2luZGV4LmpzCnZhciByZXF1aXJlX2FwcGxpY2F0b3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2FwcGxpY2F0b3IvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBhZGRpdGlvbmFsSXRlbXNfMSA9IHJlcXVpcmVfYWRkaXRpb25hbEl0ZW1zKCk7CiAgICB2YXIgcHJlZml4SXRlbXNfMSA9IHJlcXVpcmVfcHJlZml4SXRlbXMoKTsKICAgIHZhciBpdGVtc18xID0gcmVxdWlyZV9pdGVtcygpOwogICAgdmFyIGl0ZW1zMjAyMF8xID0gcmVxdWlyZV9pdGVtczIwMjAoKTsKICAgIHZhciBjb250YWluc18xID0gcmVxdWlyZV9jb250YWlucygpOwogICAgdmFyIGRlcGVuZGVuY2llc18xID0gcmVxdWlyZV9kZXBlbmRlbmNpZXMoKTsKICAgIHZhciBwcm9wZXJ0eU5hbWVzXzEgPSByZXF1aXJlX3Byb3BlcnR5TmFtZXMoKTsKICAgIHZhciBhZGRpdGlvbmFsUHJvcGVydGllc18xID0gcmVxdWlyZV9hZGRpdGlvbmFsUHJvcGVydGllcygpOwogICAgdmFyIHByb3BlcnRpZXNfMSA9IHJlcXVpcmVfcHJvcGVydGllcygpOwogICAgdmFyIHBhdHRlcm5Qcm9wZXJ0aWVzXzEgPSByZXF1aXJlX3BhdHRlcm5Qcm9wZXJ0aWVzKCk7CiAgICB2YXIgbm90XzEgPSByZXF1aXJlX25vdCgpOwogICAgdmFyIGFueU9mXzEgPSByZXF1aXJlX2FueU9mKCk7CiAgICB2YXIgb25lT2ZfMSA9IHJlcXVpcmVfb25lT2YoKTsKICAgIHZhciBhbGxPZl8xID0gcmVxdWlyZV9hbGxPZigpOwogICAgdmFyIGlmXzEgPSByZXF1aXJlX2lmKCk7CiAgICB2YXIgdGhlbkVsc2VfMSA9IHJlcXVpcmVfdGhlbkVsc2UoKTsKICAgIGZ1bmN0aW9uIGdldEFwcGxpY2F0b3IoZHJhZnQyMDIwID0gZmFsc2UpIHsKICAgICAgY29uc3QgYXBwbGljYXRvciA9IFsKICAgICAgICAvLyBhbnkKICAgICAgICBub3RfMS5kZWZhdWx0LAogICAgICAgIGFueU9mXzEuZGVmYXVsdCwKICAgICAgICBvbmVPZl8xLmRlZmF1bHQsCiAgICAgICAgYWxsT2ZfMS5kZWZhdWx0LAogICAgICAgIGlmXzEuZGVmYXVsdCwKICAgICAgICB0aGVuRWxzZV8xLmRlZmF1bHQsCiAgICAgICAgLy8gb2JqZWN0CiAgICAgICAgcHJvcGVydHlOYW1lc18xLmRlZmF1bHQsCiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXNfMS5kZWZhdWx0LAogICAgICAgIGRlcGVuZGVuY2llc18xLmRlZmF1bHQsCiAgICAgICAgcHJvcGVydGllc18xLmRlZmF1bHQsCiAgICAgICAgcGF0dGVyblByb3BlcnRpZXNfMS5kZWZhdWx0CiAgICAgIF07CiAgICAgIGlmIChkcmFmdDIwMjApCiAgICAgICAgYXBwbGljYXRvci5wdXNoKHByZWZpeEl0ZW1zXzEuZGVmYXVsdCwgaXRlbXMyMDIwXzEuZGVmYXVsdCk7CiAgICAgIGVsc2UKICAgICAgICBhcHBsaWNhdG9yLnB1c2goYWRkaXRpb25hbEl0ZW1zXzEuZGVmYXVsdCwgaXRlbXNfMS5kZWZhdWx0KTsKICAgICAgYXBwbGljYXRvci5wdXNoKGNvbnRhaW5zXzEuZGVmYXVsdCk7CiAgICAgIHJldHVybiBhcHBsaWNhdG9yOwogICAgfQogICAgZXhwb3J0czIuZGVmYXVsdCA9IGdldEFwcGxpY2F0b3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9mb3JtYXQvZm9ybWF0LmpzCnZhciByZXF1aXJlX2Zvcm1hdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvZm9ybWF0L2Zvcm1hdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIGVycm9yID0gewogICAgICBtZXNzYWdlOiAoeyBzY2hlbWFDb2RlIH0pID0+ICgwLCBjb2RlZ2VuXzEuc3RyKWBtdXN0IG1hdGNoIGZvcm1hdCAiJHtzY2hlbWFDb2RlfSJgLAogICAgICBwYXJhbXM6ICh7IHNjaGVtYUNvZGUgfSkgPT4gKDAsIGNvZGVnZW5fMS5fKWB7Zm9ybWF0OiAke3NjaGVtYUNvZGV9fWAKICAgIH07CiAgICB2YXIgZGVmID0gewogICAgICBrZXl3b3JkOiAiZm9ybWF0IiwKICAgICAgdHlwZTogWyJudW1iZXIiLCAic3RyaW5nIl0sCiAgICAgIHNjaGVtYVR5cGU6ICJzdHJpbmciLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0LCBydWxlVHlwZSkgewogICAgICAgIGNvbnN0IHsgZ2VuLCBkYXRhLCAkZGF0YSwgc2NoZW1hLCBzY2hlbWFDb2RlLCBpdCB9ID0gY3h0OwogICAgICAgIGNvbnN0IHsgb3B0cywgZXJyU2NoZW1hUGF0aCwgc2NoZW1hRW52LCBzZWxmOiBzZWxmMiB9ID0gaXQ7CiAgICAgICAgaWYgKCFvcHRzLnZhbGlkYXRlRm9ybWF0cykKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAoJGRhdGEpCiAgICAgICAgICB2YWxpZGF0ZSREYXRhRm9ybWF0KCk7CiAgICAgICAgZWxzZQogICAgICAgICAgdmFsaWRhdGVGb3JtYXQoKTsKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZSREYXRhRm9ybWF0KCkgewogICAgICAgICAgY29uc3QgZm10cyA9IGdlbi5zY29wZVZhbHVlKCJmb3JtYXRzIiwgewogICAgICAgICAgICByZWY6IHNlbGYyLmZvcm1hdHMsCiAgICAgICAgICAgIGNvZGU6IG9wdHMuY29kZS5mb3JtYXRzCiAgICAgICAgICB9KTsKICAgICAgICAgIGNvbnN0IGZEZWYgPSBnZW4uY29uc3QoImZEZWYiLCAoMCwgY29kZWdlbl8xLl8pYCR7Zm10c31bJHtzY2hlbWFDb2RlfV1gKTsKICAgICAgICAgIGNvbnN0IGZUeXBlID0gZ2VuLmxldCgiZlR5cGUiKTsKICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGdlbi5sZXQoImZvcm1hdCIpOwogICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgdHlwZW9mICR7ZkRlZn0gPT0gIm9iamVjdCIgJiYgISgke2ZEZWZ9IGluc3RhbmNlb2YgUmVnRXhwKWAsICgpID0+IGdlbi5hc3NpZ24oZlR5cGUsICgwLCBjb2RlZ2VuXzEuXylgJHtmRGVmfS50eXBlIHx8ICJzdHJpbmciYCkuYXNzaWduKGZvcm1hdCwgKDAsIGNvZGVnZW5fMS5fKWAke2ZEZWZ9LnZhbGlkYXRlYCksICgpID0+IGdlbi5hc3NpZ24oZlR5cGUsICgwLCBjb2RlZ2VuXzEuXylgInN0cmluZyJgKS5hc3NpZ24oZm9ybWF0LCBmRGVmKSk7CiAgICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEub3IpKHVua25vd25GbXQoKSwgaW52YWxpZEZtdCgpKSk7CiAgICAgICAgICBmdW5jdGlvbiB1bmtub3duRm10KCkgewogICAgICAgICAgICBpZiAob3B0cy5zdHJpY3RTY2hlbWEgPT09IGZhbHNlKQogICAgICAgICAgICAgIHJldHVybiBjb2RlZ2VuXzEubmlsOwogICAgICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWAke3NjaGVtYUNvZGV9ICYmICEke2Zvcm1hdH1gOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaW52YWxpZEZtdCgpIHsKICAgICAgICAgICAgY29uc3QgY2FsbEZvcm1hdCA9IHNjaGVtYUVudi4kYXN5bmMgPyAoMCwgY29kZWdlbl8xLl8pYCgke2ZEZWZ9LmFzeW5jID8gYXdhaXQgJHtmb3JtYXR9KCR7ZGF0YX0pIDogJHtmb3JtYXR9KCR7ZGF0YX0pKWAgOiAoMCwgY29kZWdlbl8xLl8pYCR7Zm9ybWF0fSgke2RhdGF9KWA7CiAgICAgICAgICAgIGNvbnN0IHZhbGlkRGF0YSA9ICgwLCBjb2RlZ2VuXzEuXylgKHR5cGVvZiAke2Zvcm1hdH0gPT0gImZ1bmN0aW9uIiA/ICR7Y2FsbEZvcm1hdH0gOiAke2Zvcm1hdH0udGVzdCgke2RhdGF9KSlgOwogICAgICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWAke2Zvcm1hdH0gJiYgJHtmb3JtYXR9ICE9PSB0cnVlICYmICR7ZlR5cGV9ID09PSAke3J1bGVUeXBlfSAmJiAhJHt2YWxpZERhdGF9YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoKSB7CiAgICAgICAgICBjb25zdCBmb3JtYXREZWYgPSBzZWxmMi5mb3JtYXRzW3NjaGVtYV07CiAgICAgICAgICBpZiAoIWZvcm1hdERlZikgewogICAgICAgICAgICB1bmtub3duRm9ybWF0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmb3JtYXREZWYgPT09IHRydWUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IFtmbXRUeXBlLCBmb3JtYXQsIGZtdFJlZl0gPSBnZXRGb3JtYXQoZm9ybWF0RGVmKTsKICAgICAgICAgIGlmIChmbXRUeXBlID09PSBydWxlVHlwZSkKICAgICAgICAgICAgY3h0LnBhc3ModmFsaWRDb25kaXRpb24oKSk7CiAgICAgICAgICBmdW5jdGlvbiB1bmtub3duRm9ybWF0KCkgewogICAgICAgICAgICBpZiAob3B0cy5zdHJpY3RTY2hlbWEgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgc2VsZjIubG9nZ2VyLndhcm4odW5rbm93bk1zZygpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVua25vd25Nc2coKSk7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVua25vd25Nc2coKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGB1bmtub3duIGZvcm1hdCAiJHtzY2hlbWF9IiBpZ25vcmVkIGluIHNjaGVtYSBhdCBwYXRoICIke2VyclNjaGVtYVBhdGh9ImA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGdldEZvcm1hdChmbXREZWYpIHsKICAgICAgICAgICAgY29uc3QgY29kZSA9IGZtdERlZiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICgwLCBjb2RlZ2VuXzEucmVnZXhwQ29kZSkoZm10RGVmKSA6IG9wdHMuY29kZS5mb3JtYXRzID8gKDAsIGNvZGVnZW5fMS5fKWAke29wdHMuY29kZS5mb3JtYXRzfSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkoc2NoZW1hKX1gIDogdm9pZCAwOwogICAgICAgICAgICBjb25zdCBmbXQgPSBnZW4uc2NvcGVWYWx1ZSgiZm9ybWF0cyIsIHsga2V5OiBzY2hlbWEsIHJlZjogZm10RGVmLCBjb2RlIH0pOwogICAgICAgICAgICBpZiAodHlwZW9mIGZtdERlZiA9PSAib2JqZWN0IiAmJiAhKGZtdERlZiBpbnN0YW5jZW9mIFJlZ0V4cCkpIHsKICAgICAgICAgICAgICByZXR1cm4gW2ZtdERlZi50eXBlIHx8ICJzdHJpbmciLCBmbXREZWYudmFsaWRhdGUsICgwLCBjb2RlZ2VuXzEuXylgJHtmbXR9LnZhbGlkYXRlYF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFsic3RyaW5nIiwgZm10RGVmLCBmbXRdOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gdmFsaWRDb25kaXRpb24oKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0RGVmID09ICJvYmplY3QiICYmICEoZm9ybWF0RGVmIGluc3RhbmNlb2YgUmVnRXhwKSAmJiBmb3JtYXREZWYuYXN5bmMpIHsKICAgICAgICAgICAgICBpZiAoIXNjaGVtYUVudi4kYXN5bmMpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFzeW5jIGZvcm1hdCBpbiBzeW5jIHNjaGVtYSIpOwogICAgICAgICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLl8pYGF3YWl0ICR7Zm10UmVmfSgke2RhdGF9KWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT0gImZ1bmN0aW9uIiA/ICgwLCBjb2RlZ2VuXzEuXylgJHtmbXRSZWZ9KCR7ZGF0YX0pYCA6ICgwLCBjb2RlZ2VuXzEuXylgJHtmbXRSZWZ9LnRlc3QoJHtkYXRhfSlgOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWY7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9mb3JtYXQvaW5kZXguanMKdmFyIHJlcXVpcmVfZm9ybWF0MiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvZm9ybWF0L2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgZm9ybWF0XzEgPSByZXF1aXJlX2Zvcm1hdCgpOwogICAgdmFyIGZvcm1hdCA9IFtmb3JtYXRfMS5kZWZhdWx0XTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBmb3JtYXQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9tZXRhZGF0YS5qcwp2YXIgcmVxdWlyZV9tZXRhZGF0YSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvbWV0YWRhdGEuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbnRlbnRWb2NhYnVsYXJ5ID0gZXhwb3J0czIubWV0YWRhdGFWb2NhYnVsYXJ5ID0gdm9pZCAwOwogICAgZXhwb3J0czIubWV0YWRhdGFWb2NhYnVsYXJ5ID0gWwogICAgICAidGl0bGUiLAogICAgICAiZGVzY3JpcHRpb24iLAogICAgICAiZGVmYXVsdCIsCiAgICAgICJkZXByZWNhdGVkIiwKICAgICAgInJlYWRPbmx5IiwKICAgICAgIndyaXRlT25seSIsCiAgICAgICJleGFtcGxlcyIKICAgIF07CiAgICBleHBvcnRzMi5jb250ZW50Vm9jYWJ1bGFyeSA9IFsKICAgICAgImNvbnRlbnRNZWRpYVR5cGUiLAogICAgICAiY29udGVudEVuY29kaW5nIiwKICAgICAgImNvbnRlbnRTY2hlbWEiCiAgICBdOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvZHJhZnQ3LmpzCnZhciByZXF1aXJlX2RyYWZ0NyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC92b2NhYnVsYXJpZXMvZHJhZnQ3LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9jb3JlMigpOwogICAgdmFyIHZhbGlkYXRpb25fMSA9IHJlcXVpcmVfdmFsaWRhdGlvbigpOwogICAgdmFyIGFwcGxpY2F0b3JfMSA9IHJlcXVpcmVfYXBwbGljYXRvcigpOwogICAgdmFyIGZvcm1hdF8xID0gcmVxdWlyZV9mb3JtYXQyKCk7CiAgICB2YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmVfbWV0YWRhdGEoKTsKICAgIHZhciBkcmFmdDdWb2NhYnVsYXJpZXMgPSBbCiAgICAgIGNvcmVfMS5kZWZhdWx0LAogICAgICB2YWxpZGF0aW9uXzEuZGVmYXVsdCwKICAgICAgKDAsIGFwcGxpY2F0b3JfMS5kZWZhdWx0KSgpLAogICAgICBmb3JtYXRfMS5kZWZhdWx0LAogICAgICBtZXRhZGF0YV8xLm1ldGFkYXRhVm9jYWJ1bGFyeSwKICAgICAgbWV0YWRhdGFfMS5jb250ZW50Vm9jYWJ1bGFyeQogICAgXTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkcmFmdDdWb2NhYnVsYXJpZXM7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9kaXNjcmltaW5hdG9yL3R5cGVzLmpzCnZhciByZXF1aXJlX3R5cGVzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9kaXNjcmltaW5hdG9yL3R5cGVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5EaXNjckVycm9yID0gdm9pZCAwOwogICAgdmFyIERpc2NyRXJyb3I7CiAgICAoZnVuY3Rpb24oRGlzY3JFcnJvcjIpIHsKICAgICAgRGlzY3JFcnJvcjJbIlRhZyJdID0gInRhZyI7CiAgICAgIERpc2NyRXJyb3IyWyJNYXBwaW5nIl0gPSAibWFwcGluZyI7CiAgICB9KShEaXNjckVycm9yIHx8IChleHBvcnRzMi5EaXNjckVycm9yID0gRGlzY3JFcnJvciA9IHt9KSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2Fqdi1ucG0tOC4xNy4xLTEyYWRlN2VkYzYtZWUzYzYyMTYyYy56aXAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L3ZvY2FidWxhcmllcy9kaXNjcmltaW5hdG9yL2luZGV4LmpzCnZhciByZXF1aXJlX2Rpc2NyaW1pbmF0b3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3Qvdm9jYWJ1bGFyaWVzL2Rpc2NyaW1pbmF0b3IvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciB0eXBlc18xID0gcmVxdWlyZV90eXBlcygpOwogICAgdmFyIGNvbXBpbGVfMSA9IHJlcXVpcmVfY29tcGlsZSgpOwogICAgdmFyIHJlZl9lcnJvcl8xID0gcmVxdWlyZV9yZWZfZXJyb3IoKTsKICAgIHZhciB1dGlsXzEgPSByZXF1aXJlX3V0aWwoKTsKICAgIHZhciBlcnJvciA9IHsKICAgICAgbWVzc2FnZTogKHsgcGFyYW1zOiB7IGRpc2NyRXJyb3IsIHRhZ05hbWUgfSB9KSA9PiBkaXNjckVycm9yID09PSB0eXBlc18xLkRpc2NyRXJyb3IuVGFnID8gYHRhZyAiJHt0YWdOYW1lfSIgbXVzdCBiZSBzdHJpbmdgIDogYHZhbHVlIG9mIHRhZyAiJHt0YWdOYW1lfSIgbXVzdCBiZSBpbiBvbmVPZmAsCiAgICAgIHBhcmFtczogKHsgcGFyYW1zOiB7IGRpc2NyRXJyb3IsIHRhZywgdGFnTmFtZSB9IH0pID0+ICgwLCBjb2RlZ2VuXzEuXylge2Vycm9yOiAke2Rpc2NyRXJyb3J9LCB0YWc6ICR7dGFnTmFtZX0sIHRhZ1ZhbHVlOiAke3RhZ319YAogICAgfTsKICAgIHZhciBkZWYgPSB7CiAgICAgIGtleXdvcmQ6ICJkaXNjcmltaW5hdG9yIiwKICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgIHNjaGVtYVR5cGU6ICJvYmplY3QiLAogICAgICBlcnJvciwKICAgICAgY29kZShjeHQpIHsKICAgICAgICBjb25zdCB7IGdlbiwgZGF0YSwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGl0IH0gPSBjeHQ7CiAgICAgICAgY29uc3QgeyBvbmVPZiB9ID0gcGFyZW50U2NoZW1hOwogICAgICAgIGlmICghaXQub3B0cy5kaXNjcmltaW5hdG9yKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRpc2NyaW1pbmF0b3I6IHJlcXVpcmVzIGRpc2NyaW1pbmF0b3Igb3B0aW9uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRhZ05hbWUgPSBzY2hlbWEucHJvcGVydHlOYW1lOwogICAgICAgIGlmICh0eXBlb2YgdGFnTmFtZSAhPSAic3RyaW5nIikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZGlzY3JpbWluYXRvcjogcmVxdWlyZXMgcHJvcGVydHlOYW1lIik7CiAgICAgICAgaWYgKHNjaGVtYS5tYXBwaW5nKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkaXNjcmltaW5hdG9yOiBtYXBwaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICBpZiAoIW9uZU9mKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkaXNjcmltaW5hdG9yOiByZXF1aXJlcyBvbmVPZiBrZXl3b3JkIik7CiAgICAgICAgY29uc3QgdmFsaWQgPSBnZW4ubGV0KCJ2YWxpZCIsIGZhbHNlKTsKICAgICAgICBjb25zdCB0YWcgPSBnZW4uY29uc3QoInRhZyIsICgwLCBjb2RlZ2VuXzEuXylgJHtkYXRhfSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkodGFnTmFtZSl9YCk7CiAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXylgdHlwZW9mICR7dGFnfSA9PSAic3RyaW5nImAsICgpID0+IHZhbGlkYXRlTWFwcGluZygpLCAoKSA9PiBjeHQuZXJyb3IoZmFsc2UsIHsgZGlzY3JFcnJvcjogdHlwZXNfMS5EaXNjckVycm9yLlRhZywgdGFnLCB0YWdOYW1lIH0pKTsKICAgICAgICBjeHQub2sodmFsaWQpOwogICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlTWFwcGluZygpIHsKICAgICAgICAgIGNvbnN0IG1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7CiAgICAgICAgICBnZW4uaWYoZmFsc2UpOwogICAgICAgICAgZm9yIChjb25zdCB0YWdWYWx1ZSBpbiBtYXBwaW5nKSB7CiAgICAgICAgICAgIGdlbi5lbHNlSWYoKDAsIGNvZGVnZW5fMS5fKWAke3RhZ30gPT09ICR7dGFnVmFsdWV9YCk7CiAgICAgICAgICAgIGdlbi5hc3NpZ24odmFsaWQsIGFwcGx5VGFnU2NoZW1hKG1hcHBpbmdbdGFnVmFsdWVdKSk7CiAgICAgICAgICB9CiAgICAgICAgICBnZW4uZWxzZSgpOwogICAgICAgICAgY3h0LmVycm9yKGZhbHNlLCB7IGRpc2NyRXJyb3I6IHR5cGVzXzEuRGlzY3JFcnJvci5NYXBwaW5nLCB0YWcsIHRhZ05hbWUgfSk7CiAgICAgICAgICBnZW4uZW5kSWYoKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYXBwbHlUYWdTY2hlbWEoc2NoZW1hUHJvcCkgewogICAgICAgICAgY29uc3QgX3ZhbGlkID0gZ2VuLm5hbWUoInZhbGlkIik7CiAgICAgICAgICBjb25zdCBzY2hDeHQgPSBjeHQuc3Vic2NoZW1hKHsga2V5d29yZDogIm9uZU9mIiwgc2NoZW1hUHJvcCB9LCBfdmFsaWQpOwogICAgICAgICAgY3h0Lm1lcmdlRXZhbHVhdGVkKHNjaEN4dCwgY29kZWdlbl8xLk5hbWUpOwogICAgICAgICAgcmV0dXJuIF92YWxpZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0TWFwcGluZygpIHsKICAgICAgICAgIHZhciBfYTsKICAgICAgICAgIGNvbnN0IG9uZU9mTWFwcGluZyA9IHt9OwogICAgICAgICAgY29uc3QgdG9wUmVxdWlyZWQgPSBoYXNSZXF1aXJlZChwYXJlbnRTY2hlbWEpOwogICAgICAgICAgbGV0IHRhZ1JlcXVpcmVkID0gdHJ1ZTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25lT2YubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IHNjaCA9IG9uZU9mW2ldOwogICAgICAgICAgICBpZiAoKHNjaCA9PT0gbnVsbCB8fCBzY2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaC4kcmVmKSAmJiAhKDAsIHV0aWxfMS5zY2hlbWFIYXNSdWxlc0J1dFJlZikoc2NoLCBpdC5zZWxmLlJVTEVTKSkgewogICAgICAgICAgICAgIGNvbnN0IHJlZiA9IHNjaC4kcmVmOwogICAgICAgICAgICAgIHNjaCA9IGNvbXBpbGVfMS5yZXNvbHZlUmVmLmNhbGwoaXQuc2VsZiwgaXQuc2NoZW1hRW52LnJvb3QsIGl0LmJhc2VJZCwgcmVmKTsKICAgICAgICAgICAgICBpZiAoc2NoIGluc3RhbmNlb2YgY29tcGlsZV8xLlNjaGVtYUVudikKICAgICAgICAgICAgICAgIHNjaCA9IHNjaC5zY2hlbWE7CiAgICAgICAgICAgICAgaWYgKHNjaCA9PT0gdm9pZCAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHJlZl9lcnJvcl8xLmRlZmF1bHQoaXQub3B0cy51cmlSZXNvbHZlciwgaXQuYmFzZUlkLCByZWYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHByb3BTY2ggPSAoX2EgPSBzY2ggPT09IG51bGwgfHwgc2NoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2gucHJvcGVydGllcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW3RhZ05hbWVdOwogICAgICAgICAgICBpZiAodHlwZW9mIHByb3BTY2ggIT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRpc2NyaW1pbmF0b3I6IG9uZU9mIHN1YnNjaGVtYXMgKG9yIHJlZmVyZW5jZWQgc2NoZW1hcykgbXVzdCBoYXZlICJwcm9wZXJ0aWVzLyR7dGFnTmFtZX0iYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFnUmVxdWlyZWQgPSB0YWdSZXF1aXJlZCAmJiAodG9wUmVxdWlyZWQgfHwgaGFzUmVxdWlyZWQoc2NoKSk7CiAgICAgICAgICAgIGFkZE1hcHBpbmdzKHByb3BTY2gsIGkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF0YWdSZXF1aXJlZCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNjcmltaW5hdG9yOiAiJHt0YWdOYW1lfSIgbXVzdCBiZSByZXF1aXJlZGApOwogICAgICAgICAgcmV0dXJuIG9uZU9mTWFwcGluZzsKICAgICAgICAgIGZ1bmN0aW9uIGhhc1JlcXVpcmVkKHsgcmVxdWlyZWQgfSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXF1aXJlZCkgJiYgcmVxdWlyZWQuaW5jbHVkZXModGFnTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBhZGRNYXBwaW5ncyhzY2gsIGkpIHsKICAgICAgICAgICAgaWYgKHNjaC5jb25zdCkgewogICAgICAgICAgICAgIGFkZE1hcHBpbmcoc2NoLmNvbnN0LCBpKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzY2guZW51bSkgewogICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnVmFsdWUgb2Ygc2NoLmVudW0pIHsKICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodGFnVmFsdWUsIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRpc2NyaW1pbmF0b3I6ICJwcm9wZXJ0aWVzLyR7dGFnTmFtZX0iIG11c3QgaGF2ZSAiY29uc3QiIG9yICJlbnVtImApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBhZGRNYXBwaW5nKHRhZ1ZhbHVlLCBpKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFnVmFsdWUgIT0gInN0cmluZyIgfHwgdGFnVmFsdWUgaW4gb25lT2ZNYXBwaW5nKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNjcmltaW5hdG9yOiAiJHt0YWdOYW1lfSIgdmFsdWVzIG11c3QgYmUgdW5pcXVlIHN0cmluZ3NgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbmVPZk1hcHBpbmdbdGFnVmFsdWVdID0gaTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gZGVmOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9yZWZzL2pzb24tc2NoZW1hLWRyYWZ0LTA3Lmpzb24KdmFyIHJlcXVpcmVfanNvbl9zY2hlbWFfZHJhZnRfMDcgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvcmVmcy9qc29uLXNjaGVtYS1kcmFmdC0wNy5qc29uIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgbW9kdWxlMi5leHBvcnRzID0gewogICAgICAkc2NoZW1hOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIiwKICAgICAgJGlkOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIiwKICAgICAgdGl0bGU6ICJDb3JlIHNjaGVtYSBtZXRhLXNjaGVtYSIsCiAgICAgIGRlZmluaXRpb25zOiB7CiAgICAgICAgc2NoZW1hQXJyYXk6IHsKICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICBtaW5JdGVtczogMSwKICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6ICIjIiB9CiAgICAgICAgfSwKICAgICAgICBub25OZWdhdGl2ZUludGVnZXI6IHsKICAgICAgICAgIHR5cGU6ICJpbnRlZ2VyIiwKICAgICAgICAgIG1pbmltdW06IDAKICAgICAgICB9LAogICAgICAgIG5vbk5lZ2F0aXZlSW50ZWdlckRlZmF1bHQwOiB7CiAgICAgICAgICBhbGxPZjogW3sgJHJlZjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LCB7IGRlZmF1bHQ6IDAgfV0KICAgICAgICB9LAogICAgICAgIHNpbXBsZVR5cGVzOiB7CiAgICAgICAgICBlbnVtOiBbImFycmF5IiwgImJvb2xlYW4iLCAiaW50ZWdlciIsICJudWxsIiwgIm51bWJlciIsICJvYmplY3QiLCAic3RyaW5nIl0KICAgICAgICB9LAogICAgICAgIHN0cmluZ0FycmF5OiB7CiAgICAgICAgICB0eXBlOiAiYXJyYXkiLAogICAgICAgICAgaXRlbXM6IHsgdHlwZTogInN0cmluZyIgfSwKICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLAogICAgICAgICAgZGVmYXVsdDogW10KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHR5cGU6IFsib2JqZWN0IiwgImJvb2xlYW4iXSwKICAgICAgcHJvcGVydGllczogewogICAgICAgICRpZDogewogICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICBmb3JtYXQ6ICJ1cmktcmVmZXJlbmNlIgogICAgICAgIH0sCiAgICAgICAgJHNjaGVtYTogewogICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICBmb3JtYXQ6ICJ1cmkiCiAgICAgICAgfSwKICAgICAgICAkcmVmOiB7CiAgICAgICAgICB0eXBlOiAic3RyaW5nIiwKICAgICAgICAgIGZvcm1hdDogInVyaS1yZWZlcmVuY2UiCiAgICAgICAgfSwKICAgICAgICAkY29tbWVudDogewogICAgICAgICAgdHlwZTogInN0cmluZyIKICAgICAgICB9LAogICAgICAgIHRpdGxlOiB7CiAgICAgICAgICB0eXBlOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgZGVzY3JpcHRpb246IHsKICAgICAgICAgIHR5cGU6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICBkZWZhdWx0OiB0cnVlLAogICAgICAgIHJlYWRPbmx5OiB7CiAgICAgICAgICB0eXBlOiAiYm9vbGVhbiIsCiAgICAgICAgICBkZWZhdWx0OiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgZXhhbXBsZXM6IHsKICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICBpdGVtczogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgbXVsdGlwbGVPZjogewogICAgICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgICAgICBleGNsdXNpdmVNaW5pbXVtOiAwCiAgICAgICAgfSwKICAgICAgICBtYXhpbXVtOiB7CiAgICAgICAgICB0eXBlOiAibnVtYmVyIgogICAgICAgIH0sCiAgICAgICAgZXhjbHVzaXZlTWF4aW11bTogewogICAgICAgICAgdHlwZTogIm51bWJlciIKICAgICAgICB9LAogICAgICAgIG1pbmltdW06IHsKICAgICAgICAgIHR5cGU6ICJudW1iZXIiCiAgICAgICAgfSwKICAgICAgICBleGNsdXNpdmVNaW5pbXVtOiB7CiAgICAgICAgICB0eXBlOiAibnVtYmVyIgogICAgICAgIH0sCiAgICAgICAgbWF4TGVuZ3RoOiB7ICRyZWY6ICIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciIgfSwKICAgICAgICBtaW5MZW5ndGg6IHsgJHJlZjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAiIH0sCiAgICAgICAgcGF0dGVybjogewogICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICBmb3JtYXQ6ICJyZWdleCIKICAgICAgICB9LAogICAgICAgIGFkZGl0aW9uYWxJdGVtczogeyAkcmVmOiAiIyIgfSwKICAgICAgICBpdGVtczogewogICAgICAgICAgYW55T2Y6IFt7ICRyZWY6ICIjIiB9LCB7ICRyZWY6ICIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5IiB9XSwKICAgICAgICAgIGRlZmF1bHQ6IHRydWUKICAgICAgICB9LAogICAgICAgIG1heEl0ZW1zOiB7ICRyZWY6ICIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciIgfSwKICAgICAgICBtaW5JdGVtczogeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCIgfSwKICAgICAgICB1bmlxdWVJdGVtczogewogICAgICAgICAgdHlwZTogImJvb2xlYW4iLAogICAgICAgICAgZGVmYXVsdDogZmFsc2UKICAgICAgICB9LAogICAgICAgIGNvbnRhaW5zOiB7ICRyZWY6ICIjIiB9LAogICAgICAgIG1heFByb3BlcnRpZXM6IHsgJHJlZjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LAogICAgICAgIG1pblByb3BlcnRpZXM6IHsgJHJlZjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAiIH0sCiAgICAgICAgcmVxdWlyZWQ6IHsgJHJlZjogIiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkiIH0sCiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgJHJlZjogIiMiIH0sCiAgICAgICAgZGVmaW5pdGlvbnM6IHsKICAgICAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgJHJlZjogIiMiIH0sCiAgICAgICAgICBkZWZhdWx0OiB7fQogICAgICAgIH0sCiAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogeyAkcmVmOiAiIyIgfSwKICAgICAgICAgIGRlZmF1bHQ6IHt9CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuUHJvcGVydGllczogewogICAgICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogeyAkcmVmOiAiIyIgfSwKICAgICAgICAgIHByb3BlcnR5TmFtZXM6IHsgZm9ybWF0OiAicmVnZXgiIH0sCiAgICAgICAgICBkZWZhdWx0OiB7fQogICAgICAgIH0sCiAgICAgICAgZGVwZW5kZW5jaWVzOiB7CiAgICAgICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgIGFueU9mOiBbeyAkcmVmOiAiIyIgfSwgeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSIgfV0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHByb3BlcnR5TmFtZXM6IHsgJHJlZjogIiMiIH0sCiAgICAgICAgY29uc3Q6IHRydWUsCiAgICAgICAgZW51bTogewogICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgIGl0ZW1zOiB0cnVlLAogICAgICAgICAgbWluSXRlbXM6IDEsCiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgdHlwZTogewogICAgICAgICAgYW55T2Y6IFsKICAgICAgICAgICAgeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyIgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICAgICAgaXRlbXM6IHsgJHJlZjogIiMvZGVmaW5pdGlvbnMvc2ltcGxlVHlwZXMiIH0sCiAgICAgICAgICAgICAgbWluSXRlbXM6IDEsCiAgICAgICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiB7IHR5cGU6ICJzdHJpbmciIH0sCiAgICAgICAgY29udGVudE1lZGlhVHlwZTogeyB0eXBlOiAic3RyaW5nIiB9LAogICAgICAgIGNvbnRlbnRFbmNvZGluZzogeyB0eXBlOiAic3RyaW5nIiB9LAogICAgICAgIGlmOiB7ICRyZWY6ICIjIiB9LAogICAgICAgIHRoZW46IHsgJHJlZjogIiMiIH0sCiAgICAgICAgZWxzZTogeyAkcmVmOiAiIyIgfSwKICAgICAgICBhbGxPZjogeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIgfSwKICAgICAgICBhbnlPZjogeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIgfSwKICAgICAgICBvbmVPZjogeyAkcmVmOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIgfSwKICAgICAgICBub3Q6IHsgJHJlZjogIiMiIH0KICAgICAgfSwKICAgICAgZGVmYXVsdDogdHJ1ZQogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvYWp2LW5wbS04LjE3LjEtMTJhZGU3ZWRjNi1lZTNjNjIxNjJjLnppcC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvYWp2LmpzCnZhciByZXF1aXJlX2FqdiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9hanYtbnBtLTguMTcuMS0xMmFkZTdlZGM2LWVlM2M2MjE2MmMuemlwL25vZGVfbW9kdWxlcy9hanYvZGlzdC9hanYuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLk1pc3NpbmdSZWZFcnJvciA9IGV4cG9ydHMyLlZhbGlkYXRpb25FcnJvciA9IGV4cG9ydHMyLkNvZGVHZW4gPSBleHBvcnRzMi5OYW1lID0gZXhwb3J0czIubmlsID0gZXhwb3J0czIuc3RyaW5naWZ5ID0gZXhwb3J0czIuc3RyID0gZXhwb3J0czIuXyA9IGV4cG9ydHMyLktleXdvcmRDeHQgPSBleHBvcnRzMi5BanYgPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9jb3JlKCk7CiAgICB2YXIgZHJhZnQ3XzEgPSByZXF1aXJlX2RyYWZ0NygpOwogICAgdmFyIGRpc2NyaW1pbmF0b3JfMSA9IHJlcXVpcmVfZGlzY3JpbWluYXRvcigpOwogICAgdmFyIGRyYWZ0N01ldGFTY2hlbWEgPSByZXF1aXJlX2pzb25fc2NoZW1hX2RyYWZ0XzA3KCk7CiAgICB2YXIgTUVUQV9TVVBQT1JUX0RBVEEgPSBbIi9wcm9wZXJ0aWVzIl07CiAgICB2YXIgTUVUQV9TQ0hFTUFfSUQgPSAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEiOwogICAgdmFyIEFqdiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLmRlZmF1bHQgewogICAgICBfYWRkVm9jYWJ1bGFyaWVzKCkgewogICAgICAgIHN1cGVyLl9hZGRWb2NhYnVsYXJpZXMoKTsKICAgICAgICBkcmFmdDdfMS5kZWZhdWx0LmZvckVhY2goKHYpID0+IHRoaXMuYWRkVm9jYWJ1bGFyeSh2KSk7CiAgICAgICAgaWYgKHRoaXMub3B0cy5kaXNjcmltaW5hdG9yKQogICAgICAgICAgdGhpcy5hZGRLZXl3b3JkKGRpc2NyaW1pbmF0b3JfMS5kZWZhdWx0KTsKICAgICAgfQogICAgICBfYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSB7CiAgICAgICAgc3VwZXIuX2FkZERlZmF1bHRNZXRhU2NoZW1hKCk7CiAgICAgICAgaWYgKCF0aGlzLm9wdHMubWV0YSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBtZXRhU2NoZW1hID0gdGhpcy5vcHRzLiRkYXRhID8gdGhpcy4kZGF0YU1ldGFTY2hlbWEoZHJhZnQ3TWV0YVNjaGVtYSwgTUVUQV9TVVBQT1JUX0RBVEEpIDogZHJhZnQ3TWV0YVNjaGVtYTsKICAgICAgICB0aGlzLmFkZE1ldGFTY2hlbWEobWV0YVNjaGVtYSwgTUVUQV9TQ0hFTUFfSUQsIGZhbHNlKTsKICAgICAgICB0aGlzLnJlZnNbImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hIl0gPSBNRVRBX1NDSEVNQV9JRDsKICAgICAgfQogICAgICBkZWZhdWx0TWV0YSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcHRzLmRlZmF1bHRNZXRhID0gc3VwZXIuZGVmYXVsdE1ldGEoKSB8fCAodGhpcy5nZXRTY2hlbWEoTUVUQV9TQ0hFTUFfSUQpID8gTUVUQV9TQ0hFTUFfSUQgOiB2b2lkIDApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuQWp2ID0gQWp2OwogICAgbW9kdWxlMi5leHBvcnRzID0gZXhwb3J0czIgPSBBanY7CiAgICBtb2R1bGUyLmV4cG9ydHMuQWp2ID0gQWp2OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5kZWZhdWx0ID0gQWp2OwogICAgdmFyIHZhbGlkYXRlXzEgPSByZXF1aXJlX3ZhbGlkYXRlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJLZXl3b3JkQ3h0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdmFsaWRhdGVfMS5LZXl3b3JkQ3h0OwogICAgfSB9KTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl8iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlZ2VuXzEuXzsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzdHIiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb2RlZ2VuXzEuc3RyOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInN0cmluZ2lmeSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVnZW5fMS5zdHJpbmdpZnk7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAibmlsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZWdlbl8xLm5pbDsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJOYW1lIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29kZWdlbl8xLk5hbWU7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiQ29kZUdlbiIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvZGVnZW5fMS5Db2RlR2VuOwogICAgfSB9KTsKICAgIHZhciB2YWxpZGF0aW9uX2Vycm9yXzEgPSByZXF1aXJlX3ZhbGlkYXRpb25fZXJyb3IoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIlZhbGlkYXRpb25FcnJvciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHZhbGlkYXRpb25fZXJyb3JfMS5kZWZhdWx0OwogICAgfSB9KTsKICAgIHZhciByZWZfZXJyb3JfMSA9IHJlcXVpcmVfcmVmX2Vycm9yKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJNaXNzaW5nUmVmRXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZWZfZXJyb3JfMS5kZWZhdWx0OwogICAgfSB9KTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vYWp2LWZvcm1hdHMtdmlydHVhbC0wZGZiMjFhYjRlLzAvY2FjaGUvYWp2LWZvcm1hdHMtbnBtLTMuMC4xLTI2NjJjZjViMTItNTY3OWI5ZjljZS56aXAvbm9kZV9tb2R1bGVzL2Fqdi1mb3JtYXRzL2Rpc3QvZm9ybWF0cy5qcwp2YXIgcmVxdWlyZV9mb3JtYXRzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL2Fqdi1mb3JtYXRzLXZpcnR1YWwtMGRmYjIxYWI0ZS8wL2NhY2hlL2Fqdi1mb3JtYXRzLW5wbS0zLjAuMS0yNjYyY2Y1YjEyLTU2NzliOWY5Y2UuemlwL25vZGVfbW9kdWxlcy9hanYtZm9ybWF0cy9kaXN0L2Zvcm1hdHMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZvcm1hdE5hbWVzID0gZXhwb3J0czIuZmFzdEZvcm1hdHMgPSBleHBvcnRzMi5mdWxsRm9ybWF0cyA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIGZtdERlZih2YWxpZGF0ZSwgY29tcGFyZSkgewogICAgICByZXR1cm4geyB2YWxpZGF0ZSwgY29tcGFyZSB9OwogICAgfQogICAgZXhwb3J0czIuZnVsbEZvcm1hdHMgPSB7CiAgICAgIC8vIGRhdGU6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkjc2VjdGlvbi01LjYKICAgICAgZGF0ZTogZm10RGVmKGRhdGUsIGNvbXBhcmVEYXRlKSwKICAgICAgLy8gZGF0ZS10aW1lOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42CiAgICAgIHRpbWU6IGZtdERlZihnZXRUaW1lKHRydWUpLCBjb21wYXJlVGltZSksCiAgICAgICJkYXRlLXRpbWUiOiBmbXREZWYoZ2V0RGF0ZVRpbWUodHJ1ZSksIGNvbXBhcmVEYXRlVGltZSksCiAgICAgICJpc28tdGltZSI6IGZtdERlZihnZXRUaW1lKCksIGNvbXBhcmVJc29UaW1lKSwKICAgICAgImlzby1kYXRlLXRpbWUiOiBmbXREZWYoZ2V0RGF0ZVRpbWUoKSwgY29tcGFyZUlzb0RhdGVUaW1lKSwKICAgICAgLy8gZHVyYXRpb246IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I2FwcGVuZGl4LUEKICAgICAgZHVyYXRpb246IC9eUCg/ISQpKChcZCtZKT8oXGQrTSk/KFxkK0QpPyhUKD89XGQpKFxkK0gpPyhcZCtNKT8oXGQrUyk/KT98KFxkK1cpPykkLywKICAgICAgdXJpLAogICAgICAidXJpLXJlZmVyZW5jZSI6IC9eKD86W2Etel1bYS16MC05K1wtLl0qOik/KD86XC8/XC8oPzooPzpbYS16MC05XC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFsoPzooPzooPzooPzpbMC05YS1mXXsxLDR9Oil7Nn18OjooPzpbMC05YS1mXXsxLDR9Oil7NX18KD86WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7NH18KD86KD86WzAtOWEtZl17MSw0fTopezAsMX1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXszfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDN9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9OnwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw0fVswLTlhLWZdezEsNH0pPzo6KSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzooPzoyNVswLTVdfDJbMC00XVxkfFswMV0/XGRcZD8pXC4pezN9KD86MjVbMC01XXwyWzAtNF1cZHxbMDFdP1xkXGQ/KSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNX1bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH18KD86KD86WzAtOWEtZl17MSw0fTopezAsNn1bMC05YS1mXXsxLDR9KT86Oil8W1Z2XVswLTlhLWZdK1wuW2EtejAtOVwtLl9+ISQmJygpKissOz06XSspXF18KD86KD86MjVbMC01XXwyWzAtNF1cZHxbMDFdP1xkXGQ/KVwuKXszfSg/OjI1WzAtNV18MlswLTRdXGR8WzAxXT9cZFxkPyl8KD86W2EtejAtOVwtLl9+ISQmJyIoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XGQqKT8oPzpcLyg/OlthLXowLTlcLS5ffiEkJiciKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqfFwvKD86KD86W2EtejAtOVwtLl9+ISQmJyIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XC8oPzpbYS16MC05XC0uX34hJCYnIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/fCg/OlthLXowLTlcLS5ffiEkJiciKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKyg/OlwvKD86W2EtejAtOVwtLl9+ISQmJyIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopPyg/Olw/KD86W2EtejAtOVwtLl9+ISQmJyIoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyg/OiMoPzpbYS16MC05XC0uX34hJCYnIigpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/JC9pLAogICAgICAvLyB1cmktdGVtcGxhdGU6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwCiAgICAgICJ1cmktdGVtcGxhdGUiOiAvXig/Oig/OlteXHgwMC1ceDIwIic8PiVcXF5ge3x9XXwlWzAtOWEtZl17Mn0pfFx7WysjLi87PyY9LCFAfF0/KD86W2EtejAtOV9dfCVbMC05YS1mXXsyfSkrKD86OlsxLTldWzAtOV17MCwzfXxcKik/KD86LCg/OlthLXowLTlfXXwlWzAtOWEtZl17Mn0pKyg/OjpbMS05XVswLTldezAsM318XCopPykqXH0pKiQvaSwKICAgICAgLy8gRm9yIHRoZSBzb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RwZXJpbmkvNzI5Mjk0CiAgICAgIC8vIEZvciB0ZXN0IGNhc2VzOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvZGVtby91cmwtcmVnZXgKICAgICAgdXJsOiAvXig/Omh0dHBzP3xmdHApOlwvXC8oPzpcUysoPzo6XFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XC5cZHsxLDN9KXszfSkoPyEoPzoxNjlcLjI1NHwxOTJcLjE2OCkoPzpcLlxkezEsM30pezJ9KSg/ITE3MlwuKD86MVs2LTldfDJcZHwzWzAtMV0pKD86XC5cZHsxLDN9KXsyfSkoPzpbMS05XVxkP3wxXGRcZHwyWzAxXVxkfDIyWzAtM10pKD86XC4oPzoxP1xkezEsMn18MlswLTRdXGR8MjVbMC01XSkpezJ9KD86XC4oPzpbMS05XVxkP3wxXGRcZHwyWzAtNF1cZHwyNVswLTRdKSl8KD86KD86W2EtejAtOVx1ezAwYTF9LVx1e2ZmZmZ9XSstKSpbYS16MC05XHV7MDBhMX0tXHV7ZmZmZn1dKykoPzpcLig/OlthLXowLTlcdXswMGExfS1cdXtmZmZmfV0rLSkqW2EtejAtOVx1ezAwYTF9LVx1e2ZmZmZ9XSspKig/OlwuKD86W2Etelx1ezAwYTF9LVx1e2ZmZmZ9XXsyLH0pKSkoPzo6XGR7Miw1fSk/KD86XC9bXlxzXSopPyQvaXUsCiAgICAgIGVtYWlsOiAvXlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT8kL2ksCiAgICAgIGhvc3RuYW1lOiAvXig/PS57MSwyNTN9XC4/JClbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcLlthLXowLTldKD86Wy0wLTlhLXpdezAsNjF9WzAtOWEtel0pPykqXC4/JC9pLAogICAgICAvLyBvcHRpbWl6ZWQgaHR0cHM6Ly93d3cuc2FmYXJpYm9va3NvbmxpbmUuY29tL2xpYnJhcnkvdmlldy9yZWd1bGFyLWV4cHJlc3Npb25zLWNvb2tib29rLzk3ODA1OTY4MDI4MzcvY2gwN3MxNi5odG1sCiAgICAgIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZClcLil7M30oPzoyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSQvLAogICAgICBpcHY2OiAvXigoKFswLTlhLWZdezEsNH06KXs3fShbMC05YS1mXXsxLDR9fDopKXwoKFswLTlhLWZdezEsNH06KXs2fSg6WzAtOWEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOWEtZl17MSw0fTopezV9KCgoOlswLTlhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOWEtZl17MSw0fTopezR9KCgoOlswLTlhLWZdezEsNH0pezEsM30pfCgoOlswLTlhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlhLWZdezEsNH06KXszfSgoKDpbMC05YS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05YS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOWEtZl17MSw0fTopezJ9KCgoOlswLTlhLWZdezEsNH0pezEsNX0pfCgoOlswLTlhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05YS1mXXsxLDR9Oil7MX0oKCg6WzAtOWEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOWEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoOigoKDpbMC05YS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05YS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpKSQvaSwKICAgICAgcmVnZXgsCiAgICAgIC8vIHV1aWQ6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxMjIKICAgICAgdXVpZDogL14oPzp1cm46dXVpZDopP1swLTlhLWZdezh9LSg/OlswLTlhLWZdezR9LSl7M31bMC05YS1mXXsxMn0kL2ksCiAgICAgIC8vIEpTT04tcG9pbnRlcjogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEKICAgICAgLy8gdXJpIGZyYWdtZW50OiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNhcHBlbmRpeC1BCiAgICAgICJqc29uLXBvaW50ZXIiOiAvXig/OlwvKD86W15+L118fjB8fjEpKikqJC8sCiAgICAgICJqc29uLXBvaW50ZXItdXJpLWZyYWdtZW50IjogL14jKD86XC8oPzpbYS16MC05X1wtLiEkJicoKSorLDs6PUBdfCVbMC05YS1mXXsyfXx+MHx+MSkqKSokL2ksCiAgICAgIC8vIHJlbGF0aXZlIEpTT04tcG9pbnRlcjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbHVmZi1yZWxhdGl2ZS1qc29uLXBvaW50ZXItMDAKICAgICAgInJlbGF0aXZlLWpzb24tcG9pbnRlciI6IC9eKD86MHxbMS05XVswLTldKikoPzojfCg/OlwvKD86W15+L118fjB8fjEpKikqKSQvLAogICAgICAvLyB0aGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIHVzZWQgYnkgdGhlIG9wZW5hcGkgc3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC4wI2RhdGEtdHlwZXMKICAgICAgLy8gYnl0ZTogaHR0cHM6Ly9naXRodWIuY29tL21pZ3VlbG1vdGEvaXMtYmFzZTY0CiAgICAgIGJ5dGUsCiAgICAgIC8vIHNpZ25lZCAzMiBiaXQgaW50ZWdlcgogICAgICBpbnQzMjogeyB0eXBlOiAibnVtYmVyIiwgdmFsaWRhdGU6IHZhbGlkYXRlSW50MzIgfSwKICAgICAgLy8gc2lnbmVkIDY0IGJpdCBpbnRlZ2VyCiAgICAgIGludDY0OiB7IHR5cGU6ICJudW1iZXIiLCB2YWxpZGF0ZTogdmFsaWRhdGVJbnQ2NCB9LAogICAgICAvLyBDLXR5cGUgZmxvYXQKICAgICAgZmxvYXQ6IHsgdHlwZTogIm51bWJlciIsIHZhbGlkYXRlOiB2YWxpZGF0ZU51bWJlciB9LAogICAgICAvLyBDLXR5cGUgZG91YmxlCiAgICAgIGRvdWJsZTogeyB0eXBlOiAibnVtYmVyIiwgdmFsaWRhdGU6IHZhbGlkYXRlTnVtYmVyIH0sCiAgICAgIC8vIGhpbnQgdG8gdGhlIFVJIHRvIGhpZGUgaW5wdXQgc3RyaW5ncwogICAgICBwYXNzd29yZDogdHJ1ZSwKICAgICAgLy8gdW5jaGVja2VkIHN0cmluZyBwYXlsb2FkCiAgICAgIGJpbmFyeTogdHJ1ZQogICAgfTsKICAgIGV4cG9ydHMyLmZhc3RGb3JtYXRzID0gewogICAgICAuLi5leHBvcnRzMi5mdWxsRm9ybWF0cywKICAgICAgZGF0ZTogZm10RGVmKC9eXGRcZFxkXGQtWzAtMV1cZC1bMC0zXVxkJC8sIGNvbXBhcmVEYXRlKSwKICAgICAgdGltZTogZm10RGVmKC9eKD86WzAtMl1cZDpbMC01XVxkOlswLTVdXGR8MjM6NTk6NjApKD86XC5cZCspPyg/Onp8WystXVxkXGQoPzo6P1xkXGQpPykkL2ksIGNvbXBhcmVUaW1lKSwKICAgICAgImRhdGUtdGltZSI6IGZtdERlZigvXlxkXGRcZFxkLVswLTFdXGQtWzAtM11cZHQoPzpbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZHwyMzo1OTo2MCkoPzpcLlxkKyk/KD86enxbKy1dXGRcZCg/Ojo/XGRcZCk/KSQvaSwgY29tcGFyZURhdGVUaW1lKSwKICAgICAgImlzby10aW1lIjogZm10RGVmKC9eKD86WzAtMl1cZDpbMC01XVxkOlswLTVdXGR8MjM6NTk6NjApKD86XC5cZCspPyg/Onp8WystXVxkXGQoPzo6P1xkXGQpPyk/JC9pLCBjb21wYXJlSXNvVGltZSksCiAgICAgICJpc28tZGF0ZS10aW1lIjogZm10RGVmKC9eXGRcZFxkXGQtWzAtMV1cZC1bMC0zXVxkW3Rcc10oPzpbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZHwyMzo1OTo2MCkoPzpcLlxkKyk/KD86enxbKy1dXGRcZCg/Ojo/XGRcZCk/KT8kL2ksIGNvbXBhcmVJc29EYXRlVGltZSksCiAgICAgIC8vIHVyaTogaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9pcy1teS1qc29uLXZhbGlkL2Jsb2IvbWFzdGVyL2Zvcm1hdHMuanMKICAgICAgdXJpOiAvXig/OlthLXpdW2EtejAtOStcLS5dKjopKD86XC8/XC8pP1teXHNdKiQvaSwKICAgICAgInVyaS1yZWZlcmVuY2UiOiAvXig/Oig/OlthLXpdW2EtejAtOStcLS5dKjopP1wvP1wvKT8oPzpbXlxcXHMjXVteXHMjXSopPyg/OiNbXlxcXHNdKik/JC9pLAogICAgICAvLyBlbWFpbCAoc291cmNlcyBmcm9tIGpzZW4gdmFsaWRhdG9yKToKICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDEzMjMvdXNpbmctYS1yZWd1bGFyLWV4cHJlc3Npb24tdG8tdmFsaWRhdGUtYW4tZW1haWwtYWRkcmVzcyNhbnN3ZXItODgyOTM2MwogICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9mb3Jtcy5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzIChzZWFyY2ggZm9yICd3aWxmdWwgdmlvbGF0aW9uJykKICAgICAgZW1haWw6IC9eW2EtejAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XC5bYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8pKiQvaQogICAgfTsKICAgIGV4cG9ydHMyLmZvcm1hdE5hbWVzID0gT2JqZWN0LmtleXMoZXhwb3J0czIuZnVsbEZvcm1hdHMpOwogICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7CiAgICAgIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTsKICAgIH0KICAgIHZhciBEQVRFID0gL14oXGRcZFxkXGQpLShcZFxkKS0oXGRcZCkkLzsKICAgIHZhciBEQVlTID0gWzAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwogICAgZnVuY3Rpb24gZGF0ZShzdHIpIHsKICAgICAgY29uc3QgbWF0Y2hlcyA9IERBVEUuZXhlYyhzdHIpOwogICAgICBpZiAoIW1hdGNoZXMpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBjb25zdCB5ZWFyID0gK21hdGNoZXNbMV07CiAgICAgIGNvbnN0IG1vbnRoID0gK21hdGNoZXNbMl07CiAgICAgIGNvbnN0IGRheSA9ICttYXRjaGVzWzNdOwogICAgICByZXR1cm4gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiAmJiBkYXkgPj0gMSAmJiBkYXkgPD0gKG1vbnRoID09PSAyICYmIGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IERBWVNbbW9udGhdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVEYXRlKGQxLCBkMikgewogICAgICBpZiAoIShkMSAmJiBkMikpCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgaWYgKGQxID4gZDIpCiAgICAgICAgcmV0dXJuIDE7CiAgICAgIGlmIChkMSA8IGQyKQogICAgICAgIHJldHVybiAtMTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB2YXIgVElNRSA9IC9eKFxkXGQpOihcZFxkKTooXGRcZCg/OlwuXGQrKT8pKHp8KFsrLV0pKFxkXGQpKD86Oj8oXGRcZCkpPyk/JC9pOwogICAgZnVuY3Rpb24gZ2V0VGltZShzdHJpY3RUaW1lWm9uZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24gdGltZShzdHIpIHsKICAgICAgICBjb25zdCBtYXRjaGVzID0gVElNRS5leGVjKHN0cik7CiAgICAgICAgaWYgKCFtYXRjaGVzKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IGhyID0gK21hdGNoZXNbMV07CiAgICAgICAgY29uc3QgbWluID0gK21hdGNoZXNbMl07CiAgICAgICAgY29uc3Qgc2VjID0gK21hdGNoZXNbM107CiAgICAgICAgY29uc3QgdHogPSBtYXRjaGVzWzRdOwogICAgICAgIGNvbnN0IHR6U2lnbiA9IG1hdGNoZXNbNV0gPT09ICItIiA/IC0xIDogMTsKICAgICAgICBjb25zdCB0ekggPSArKG1hdGNoZXNbNl0gfHwgMCk7CiAgICAgICAgY29uc3QgdHpNID0gKyhtYXRjaGVzWzddIHx8IDApOwogICAgICAgIGlmICh0ekggPiAyMyB8fCB0ek0gPiA1OSB8fCBzdHJpY3RUaW1lWm9uZSAmJiAhdHopCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGhyIDw9IDIzICYmIG1pbiA8PSA1OSAmJiBzZWMgPCA2MCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGNvbnN0IHV0Y01pbiA9IG1pbiAtIHR6TSAqIHR6U2lnbjsKICAgICAgICBjb25zdCB1dGNIciA9IGhyIC0gdHpIICogdHpTaWduIC0gKHV0Y01pbiA8IDAgPyAxIDogMCk7CiAgICAgICAgcmV0dXJuICh1dGNIciA9PT0gMjMgfHwgdXRjSHIgPT09IC0xKSAmJiAodXRjTWluID09PSA1OSB8fCB1dGNNaW4gPT09IC0xKSAmJiBzZWMgPCA2MTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVUaW1lKHMxLCBzMikgewogICAgICBpZiAoIShzMSAmJiBzMikpCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgY29uc3QgdDEgPSAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCIyMDIwLTAxLTAxVCIgKyBzMSkpLnZhbHVlT2YoKTsKICAgICAgY29uc3QgdDIgPSAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCIyMDIwLTAxLTAxVCIgKyBzMikpLnZhbHVlT2YoKTsKICAgICAgaWYgKCEodDEgJiYgdDIpKQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIHJldHVybiB0MSAtIHQyOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZUlzb1RpbWUodDEsIHQyKSB7CiAgICAgIGlmICghKHQxICYmIHQyKSkKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICBjb25zdCBhMSA9IFRJTUUuZXhlYyh0MSk7CiAgICAgIGNvbnN0IGEyID0gVElNRS5leGVjKHQyKTsKICAgICAgaWYgKCEoYTEgJiYgYTIpKQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIHQxID0gYTFbMV0gKyBhMVsyXSArIGExWzNdOwogICAgICB0MiA9IGEyWzFdICsgYTJbMl0gKyBhMlszXTsKICAgICAgaWYgKHQxID4gdDIpCiAgICAgICAgcmV0dXJuIDE7CiAgICAgIGlmICh0MSA8IHQyKQogICAgICAgIHJldHVybiAtMTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB2YXIgREFURV9USU1FX1NFUEFSQVRPUiA9IC90fFxzL2k7CiAgICBmdW5jdGlvbiBnZXREYXRlVGltZShzdHJpY3RUaW1lWm9uZSkgewogICAgICBjb25zdCB0aW1lID0gZ2V0VGltZShzdHJpY3RUaW1lWm9uZSk7CiAgICAgIHJldHVybiBmdW5jdGlvbiBkYXRlX3RpbWUoc3RyKSB7CiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBzdHIuc3BsaXQoREFURV9USU1FX1NFUEFSQVRPUik7CiAgICAgICAgcmV0dXJuIGRhdGVUaW1lLmxlbmd0aCA9PT0gMiAmJiBkYXRlKGRhdGVUaW1lWzBdKSAmJiB0aW1lKGRhdGVUaW1lWzFdKTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVEYXRlVGltZShkdDEsIGR0MikgewogICAgICBpZiAoIShkdDEgJiYgZHQyKSkKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICBjb25zdCBkMSA9IG5ldyBEYXRlKGR0MSkudmFsdWVPZigpOwogICAgICBjb25zdCBkMiA9IG5ldyBEYXRlKGR0MikudmFsdWVPZigpOwogICAgICBpZiAoIShkMSAmJiBkMikpCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgcmV0dXJuIGQxIC0gZDI7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlSXNvRGF0ZVRpbWUoZHQxLCBkdDIpIHsKICAgICAgaWYgKCEoZHQxICYmIGR0MikpCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgY29uc3QgW2QxLCB0MV0gPSBkdDEuc3BsaXQoREFURV9USU1FX1NFUEFSQVRPUik7CiAgICAgIGNvbnN0IFtkMiwgdDJdID0gZHQyLnNwbGl0KERBVEVfVElNRV9TRVBBUkFUT1IpOwogICAgICBjb25zdCByZXMgPSBjb21wYXJlRGF0ZShkMSwgZDIpOwogICAgICBpZiAocmVzID09PSB2b2lkIDApCiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgcmV0dXJuIHJlcyB8fCBjb21wYXJlVGltZSh0MSwgdDIpOwogICAgfQogICAgdmFyIE5PVF9VUklfRlJBR01FTlQgPSAvXC98Oi87CiAgICB2YXIgVVJJID0gL14oPzpbYS16XVthLXowLTkrXC0uXSo6KSg/OlwvP1wvKD86KD86W2EtejAtOVwtLl9+ISQmJygpKissOz06XXwlWzAtOWEtZl17Mn0pKkApPyg/OlxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cZHxbMDFdP1xkXGQ/KVwuKXszfSg/OjI1WzAtNV18MlswLTRdXGR8WzAxXT9cZFxkPykpfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfFtWdl1bMC05YS1mXStcLlthLXowLTlcLS5ffiEkJicoKSorLDs9Ol0rKVxdfCg/Oig/OjI1WzAtNV18MlswLTRdXGR8WzAxXT9cZFxkPylcLil7M30oPzoyNVswLTVdfDJbMC00XVxkfFswMV0/XGRcZD8pfCg/OlthLXowLTlcLS5ffiEkJicoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XGQqKT8oPzpcLyg/OlthLXowLTlcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSp8XC8oPzooPzpbYS16MC05XC0uX34hJCYnKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKyg/OlwvKD86W2EtejAtOVwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/fCg/OlthLXowLTlcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XC8oPzpbYS16MC05XC0uX34hJCYnKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqKSg/Olw/KD86W2EtejAtOVwtLl9+ISQmJygpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcLS5ffiEkJicoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyQvaTsKICAgIGZ1bmN0aW9uIHVyaShzdHIpIHsKICAgICAgcmV0dXJuIE5PVF9VUklfRlJBR01FTlQudGVzdChzdHIpICYmIFVSSS50ZXN0KHN0cik7CiAgICB9CiAgICB2YXIgQllURSA9IC9eKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kL2dtOwogICAgZnVuY3Rpb24gYnl0ZShzdHIpIHsKICAgICAgQllURS5sYXN0SW5kZXggPSAwOwogICAgICByZXR1cm4gQllURS50ZXN0KHN0cik7CiAgICB9CiAgICB2YXIgTUlOX0lOVDMyID0gLSgyICoqIDMxKTsKICAgIHZhciBNQVhfSU5UMzIgPSAyICoqIDMxIC0gMTsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlSW50MzIodmFsdWUpIHsKICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IE1BWF9JTlQzMiAmJiB2YWx1ZSA+PSBNSU5fSU5UMzI7CiAgICB9CiAgICBmdW5jdGlvbiB2YWxpZGF0ZUludDY0KHZhbHVlKSB7CiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBaX0FOQ0hPUiA9IC9bXlxcXVxcWi87CiAgICBmdW5jdGlvbiByZWdleChzdHIpIHsKICAgICAgaWYgKFpfQU5DSE9SLnRlc3Qoc3RyKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgbmV3IFJlZ0V4cChzdHIpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL2Fqdi1mb3JtYXRzLXZpcnR1YWwtMGRmYjIxYWI0ZS8wL2NhY2hlL2Fqdi1mb3JtYXRzLW5wbS0zLjAuMS0yNjYyY2Y1YjEyLTU2NzliOWY5Y2UuemlwL25vZGVfbW9kdWxlcy9hanYtZm9ybWF0cy9kaXN0L2xpbWl0LmpzCnZhciByZXF1aXJlX2xpbWl0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL2Fqdi1mb3JtYXRzLXZpcnR1YWwtMGRmYjIxYWI0ZS8wL2NhY2hlL2Fqdi1mb3JtYXRzLW5wbS0zLjAuMS0yNjYyY2Y1YjEyLTU2NzliOWY5Y2UuemlwL25vZGVfbW9kdWxlcy9hanYtZm9ybWF0cy9kaXN0L2xpbWl0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5mb3JtYXRMaW1pdERlZmluaXRpb24gPSB2b2lkIDA7CiAgICB2YXIgYWp2XzEgPSByZXF1aXJlX2FqdigpOwogICAgdmFyIGNvZGVnZW5fMSA9IHJlcXVpcmVfY29kZWdlbigpOwogICAgdmFyIG9wcyA9IGNvZGVnZW5fMS5vcGVyYXRvcnM7CiAgICB2YXIgS1dEcyA9IHsKICAgICAgZm9ybWF0TWF4aW11bTogeyBva1N0cjogIjw9Iiwgb2s6IG9wcy5MVEUsIGZhaWw6IG9wcy5HVCB9LAogICAgICBmb3JtYXRNaW5pbXVtOiB7IG9rU3RyOiAiPj0iLCBvazogb3BzLkdURSwgZmFpbDogb3BzLkxUIH0sCiAgICAgIGZvcm1hdEV4Y2x1c2l2ZU1heGltdW06IHsgb2tTdHI6ICI8Iiwgb2s6IG9wcy5MVCwgZmFpbDogb3BzLkdURSB9LAogICAgICBmb3JtYXRFeGNsdXNpdmVNaW5pbXVtOiB7IG9rU3RyOiAiPiIsIG9rOiBvcHMuR1QsIGZhaWw6IG9wcy5MVEUgfQogICAgfTsKICAgIHZhciBlcnJvciA9IHsKICAgICAgbWVzc2FnZTogKHsga2V5d29yZCwgc2NoZW1hQ29kZSB9KSA9PiAoMCwgY29kZWdlbl8xLnN0cilgc2hvdWxkIGJlICR7S1dEc1trZXl3b3JkXS5va1N0cn0gJHtzY2hlbWFDb2RlfWAsCiAgICAgIHBhcmFtczogKHsga2V5d29yZCwgc2NoZW1hQ29kZSB9KSA9PiAoMCwgY29kZWdlbl8xLl8pYHtjb21wYXJpc29uOiAke0tXRHNba2V5d29yZF0ub2tTdHJ9LCBsaW1pdDogJHtzY2hlbWFDb2RlfX1gCiAgICB9OwogICAgZXhwb3J0czIuZm9ybWF0TGltaXREZWZpbml0aW9uID0gewogICAgICBrZXl3b3JkOiBPYmplY3Qua2V5cyhLV0RzKSwKICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgIHNjaGVtYVR5cGU6ICJzdHJpbmciLAogICAgICAkZGF0YTogdHJ1ZSwKICAgICAgZXJyb3IsCiAgICAgIGNvZGUoY3h0KSB7CiAgICAgICAgY29uc3QgeyBnZW4sIGRhdGEsIHNjaGVtYUNvZGUsIGtleXdvcmQsIGl0IH0gPSBjeHQ7CiAgICAgICAgY29uc3QgeyBvcHRzLCBzZWxmOiBzZWxmMiB9ID0gaXQ7CiAgICAgICAgaWYgKCFvcHRzLnZhbGlkYXRlRm9ybWF0cykKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBmQ3h0ID0gbmV3IGFqdl8xLktleXdvcmRDeHQoaXQsIHNlbGYyLlJVTEVTLmFsbC5mb3JtYXQuZGVmaW5pdGlvbiwgImZvcm1hdCIpOwogICAgICAgIGlmIChmQ3h0LiRkYXRhKQogICAgICAgICAgdmFsaWRhdGUkRGF0YUZvcm1hdCgpOwogICAgICAgIGVsc2UKICAgICAgICAgIHZhbGlkYXRlRm9ybWF0KCk7CiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGUkRGF0YUZvcm1hdCgpIHsKICAgICAgICAgIGNvbnN0IGZtdHMgPSBnZW4uc2NvcGVWYWx1ZSgiZm9ybWF0cyIsIHsKICAgICAgICAgICAgcmVmOiBzZWxmMi5mb3JtYXRzLAogICAgICAgICAgICBjb2RlOiBvcHRzLmNvZGUuZm9ybWF0cwogICAgICAgICAgfSk7CiAgICAgICAgICBjb25zdCBmbXQgPSBnZW4uY29uc3QoImZtdCIsICgwLCBjb2RlZ2VuXzEuXylgJHtmbXRzfVske2ZDeHQuc2NoZW1hQ29kZX1dYCk7CiAgICAgICAgICBjeHQuZmFpbCRkYXRhKCgwLCBjb2RlZ2VuXzEub3IpKCgwLCBjb2RlZ2VuXzEuXylgdHlwZW9mICR7Zm10fSAhPSAib2JqZWN0ImAsICgwLCBjb2RlZ2VuXzEuXylgJHtmbXR9IGluc3RhbmNlb2YgUmVnRXhwYCwgKDAsIGNvZGVnZW5fMS5fKWB0eXBlb2YgJHtmbXR9LmNvbXBhcmUgIT0gImZ1bmN0aW9uImAsIGNvbXBhcmVDb2RlKGZtdCkpKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoKSB7CiAgICAgICAgICBjb25zdCBmb3JtYXQgPSBmQ3h0LnNjaGVtYTsKICAgICAgICAgIGNvbnN0IGZtdERlZiA9IHNlbGYyLmZvcm1hdHNbZm9ybWF0XTsKICAgICAgICAgIGlmICghZm10RGVmIHx8IGZtdERlZiA9PT0gdHJ1ZSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgaWYgKHR5cGVvZiBmbXREZWYgIT0gIm9iamVjdCIgfHwgZm10RGVmIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGVvZiBmbXREZWYuY29tcGFyZSAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgIiR7a2V5d29yZH0iOiBmb3JtYXQgIiR7Zm9ybWF0fSIgZG9lcyBub3QgZGVmaW5lICJjb21wYXJlIiBmdW5jdGlvbmApOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZm10ID0gZ2VuLnNjb3BlVmFsdWUoImZvcm1hdHMiLCB7CiAgICAgICAgICAgIGtleTogZm9ybWF0LAogICAgICAgICAgICByZWY6IGZtdERlZiwKICAgICAgICAgICAgY29kZTogb3B0cy5jb2RlLmZvcm1hdHMgPyAoMCwgY29kZWdlbl8xLl8pYCR7b3B0cy5jb2RlLmZvcm1hdHN9JHsoMCwgY29kZWdlbl8xLmdldFByb3BlcnR5KShmb3JtYXQpfWAgOiB2b2lkIDAKICAgICAgICAgIH0pOwogICAgICAgICAgY3h0LmZhaWwkZGF0YShjb21wYXJlQ29kZShmbXQpKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGFyZUNvZGUoZm10KSB7CiAgICAgICAgICByZXR1cm4gKDAsIGNvZGVnZW5fMS5fKWAke2ZtdH0uY29tcGFyZSgke2RhdGF9LCAke3NjaGVtYUNvZGV9KSAke0tXRHNba2V5d29yZF0uZmFpbH0gMGA7CiAgICAgICAgfQogICAgICB9LAogICAgICBkZXBlbmRlbmNpZXM6IFsiZm9ybWF0Il0KICAgIH07CiAgICB2YXIgZm9ybWF0TGltaXRQbHVnaW4gPSAoYWp2KSA9PiB7CiAgICAgIGFqdi5hZGRLZXl3b3JkKGV4cG9ydHMyLmZvcm1hdExpbWl0RGVmaW5pdGlvbik7CiAgICAgIHJldHVybiBhanY7CiAgICB9OwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGZvcm1hdExpbWl0UGx1Z2luOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9hanYtZm9ybWF0cy12aXJ0dWFsLTBkZmIyMWFiNGUvMC9jYWNoZS9hanYtZm9ybWF0cy1ucG0tMy4wLjEtMjY2MmNmNWIxMi01Njc5YjlmOWNlLnppcC9ub2RlX21vZHVsZXMvYWp2LWZvcm1hdHMvZGlzdC9pbmRleC5qcwp2YXIgcmVxdWlyZV9kaXN0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL2Fqdi1mb3JtYXRzLXZpcnR1YWwtMGRmYjIxYWI0ZS8wL2NhY2hlL2Fqdi1mb3JtYXRzLW5wbS0zLjAuMS0yNjYyY2Y1YjEyLTU2NzliOWY5Y2UuemlwL25vZGVfbW9kdWxlcy9hanYtZm9ybWF0cy9kaXN0L2luZGV4LmpzIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgZm9ybWF0c18xID0gcmVxdWlyZV9mb3JtYXRzKCk7CiAgICB2YXIgbGltaXRfMSA9IHJlcXVpcmVfbGltaXQoKTsKICAgIHZhciBjb2RlZ2VuXzEgPSByZXF1aXJlX2NvZGVnZW4oKTsKICAgIHZhciBmdWxsTmFtZSA9IG5ldyBjb2RlZ2VuXzEuTmFtZSgiZnVsbEZvcm1hdHMiKTsKICAgIHZhciBmYXN0TmFtZSA9IG5ldyBjb2RlZ2VuXzEuTmFtZSgiZmFzdEZvcm1hdHMiKTsKICAgIHZhciBmb3JtYXRzUGx1Z2luID0gKGFqdiwgb3B0cyA9IHsga2V5d29yZHM6IHRydWUgfSkgPT4gewogICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzKSkgewogICAgICAgIGFkZEZvcm1hdHMoYWp2LCBvcHRzLCBmb3JtYXRzXzEuZnVsbEZvcm1hdHMsIGZ1bGxOYW1lKTsKICAgICAgICByZXR1cm4gYWp2OwogICAgICB9CiAgICAgIGNvbnN0IFtmb3JtYXRzLCBleHBvcnROYW1lXSA9IG9wdHMubW9kZSA9PT0gImZhc3QiID8gW2Zvcm1hdHNfMS5mYXN0Rm9ybWF0cywgZmFzdE5hbWVdIDogW2Zvcm1hdHNfMS5mdWxsRm9ybWF0cywgZnVsbE5hbWVdOwogICAgICBjb25zdCBsaXN0ID0gb3B0cy5mb3JtYXRzIHx8IGZvcm1hdHNfMS5mb3JtYXROYW1lczsKICAgICAgYWRkRm9ybWF0cyhhanYsIGxpc3QsIGZvcm1hdHMsIGV4cG9ydE5hbWUpOwogICAgICBpZiAob3B0cy5rZXl3b3JkcykKICAgICAgICAoMCwgbGltaXRfMS5kZWZhdWx0KShhanYpOwogICAgICByZXR1cm4gYWp2OwogICAgfTsKICAgIGZvcm1hdHNQbHVnaW4uZ2V0ID0gKG5hbWUsIG1vZGUgPSAiZnVsbCIpID0+IHsKICAgICAgY29uc3QgZm9ybWF0cyA9IG1vZGUgPT09ICJmYXN0IiA/IGZvcm1hdHNfMS5mYXN0Rm9ybWF0cyA6IGZvcm1hdHNfMS5mdWxsRm9ybWF0czsKICAgICAgY29uc3QgZiA9IGZvcm1hdHNbbmFtZV07CiAgICAgIGlmICghZikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZm9ybWF0ICIke25hbWV9ImApOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgICBmdW5jdGlvbiBhZGRGb3JtYXRzKGFqdiwgbGlzdCwgZnMsIGV4cG9ydE5hbWUpIHsKICAgICAgdmFyIF9hOwogICAgICB2YXIgX2I7CiAgICAgIChfYSA9IChfYiA9IGFqdi5vcHRzLmNvZGUpLmZvcm1hdHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IF9iLmZvcm1hdHMgPSAoMCwgY29kZWdlbl8xLl8pYHJlcXVpcmUoImFqdi1mb3JtYXRzL2Rpc3QvZm9ybWF0cyIpLiR7ZXhwb3J0TmFtZX1gOwogICAgICBmb3IgKGNvbnN0IGYgb2YgbGlzdCkKICAgICAgICBhanYuYWRkRm9ybWF0KGYsIGZzW2ZdKTsKICAgIH0KICAgIG1vZHVsZTIuZXhwb3J0cyA9IGV4cG9ydHMyID0gZm9ybWF0c1BsdWdpbjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZGVmYXVsdCA9IGZvcm1hdHNQbHVnaW47CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9pc0Z1bmN0aW9uLmpzCnZhciByZXF1aXJlX2lzRnVuY3Rpb24gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzRnVuY3Rpb24gPSB2b2lkIDA7CiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiI7CiAgICB9CiAgICBleHBvcnRzMi5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2NyZWF0ZUVycm9yQ2xhc3MuanMKdmFyIHJlcXVpcmVfY3JlYXRlRXJyb3JDbGFzcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvY3JlYXRlRXJyb3JDbGFzcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY3JlYXRlRXJyb3JDbGFzcyA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIGNyZWF0ZUVycm9yQ2xhc3MoY3JlYXRlSW1wbCkgewogICAgICB2YXIgX3N1cGVyID0gZnVuY3Rpb24oaW5zdGFuY2UpIHsKICAgICAgICBFcnJvci5jYWxsKGluc3RhbmNlKTsKICAgICAgICBpbnN0YW5jZS5zdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrOwogICAgICB9OwogICAgICB2YXIgY3RvckZ1bmMgPSBjcmVhdGVJbXBsKF9zdXBlcik7CiAgICAgIGN0b3JGdW5jLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgICAgY3RvckZ1bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvckZ1bmM7CiAgICAgIHJldHVybiBjdG9yRnVuYzsKICAgIH0KICAgIGV4cG9ydHMyLmNyZWF0ZUVycm9yQ2xhc3MgPSBjcmVhdGVFcnJvckNsYXNzOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvci5qcwp2YXIgcmVxdWlyZV9VbnN1YnNjcmlwdGlvbkVycm9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9VbnN1YnNjcmlwdGlvbkVycm9yLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5VbnN1YnNjcmlwdGlvbkVycm9yID0gdm9pZCAwOwogICAgdmFyIGNyZWF0ZUVycm9yQ2xhc3NfMSA9IHJlcXVpcmVfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgZXhwb3J0czIuVW5zdWJzY3JpcHRpb25FcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3NfMS5jcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9ycyA/IGVycm9ycy5sZW5ndGggKyAiIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XG4iICsgZXJyb3JzLm1hcChmdW5jdGlvbihlcnIsIGkpIHsKICAgICAgICAgIHJldHVybiBpICsgMSArICIpICIgKyBlcnIudG9TdHJpbmcoKTsKICAgICAgICB9KS5qb2luKCJcbiAgIikgOiAiIjsKICAgICAgICB0aGlzLm5hbWUgPSAiVW5zdWJzY3JpcHRpb25FcnJvciI7CiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgIH07CiAgICB9KTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcwp2YXIgcmVxdWlyZV9hcnJSZW1vdmUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYXJyUmVtb3ZlID0gdm9pZCAwOwogICAgZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkgewogICAgICBpZiAoYXJyKSB7CiAgICAgICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuYXJyUmVtb3ZlID0gYXJyUmVtb3ZlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1N1YnNjcmlwdGlvbi5qcwp2YXIgcmVxdWlyZV9TdWJzY3JpcHRpb24gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9TdWJzY3JpcHRpb24uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICB2YXIgX19yZWFkID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19yZWFkIHx8IGZ1bmN0aW9uKG8sIG4pIHsKICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsKICAgICAgaWYgKCFtKSByZXR1cm4gbzsKICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7CiAgICAgIHRyeSB7CiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgZSA9IHsgZXJyb3IgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbInJldHVybiJdKSkgbS5jYWxsKGkpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFyOwogICAgfTsKICAgIHZhciBfX3NwcmVhZEFycmF5ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zcHJlYWRBcnJheSB8fCBmdW5jdGlvbih0bywgZnJvbSkgewogICAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKykKICAgICAgICB0b1tqXSA9IGZyb21baV07CiAgICAgIHJldHVybiB0bzsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzU3Vic2NyaXB0aW9uID0gZXhwb3J0czIuRU1QVFlfU1VCU0NSSVBUSU9OID0gZXhwb3J0czIuU3Vic2NyaXB0aW9uID0gdm9pZCAwOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgdmFyIFVuc3Vic2NyaXB0aW9uRXJyb3JfMSA9IHJlcXVpcmVfVW5zdWJzY3JpcHRpb25FcnJvcigpOwogICAgdmFyIGFyclJlbW92ZV8xID0gcmVxdWlyZV9hcnJSZW1vdmUoKTsKICAgIHZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uMihpbml0aWFsVGVhcmRvd24pIHsKICAgICAgICB0aGlzLmluaXRpYWxUZWFyZG93biA9IGluaXRpYWxUZWFyZG93bjsKICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7CiAgICAgICAgdGhpcy5fZmluYWxpemVycyA9IG51bGw7CiAgICAgIH0KICAgICAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjsKICAgICAgICB2YXIgZXJyb3JzOwogICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlOwogICAgICAgICAgaWYgKF9wYXJlbnRhZ2UpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50YWdlID0gbnVsbDsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgX3BhcmVudGFnZV8xID0gX192YWx1ZXMoX3BhcmVudGFnZSksIF9wYXJlbnRhZ2VfMV8xID0gX3BhcmVudGFnZV8xLm5leHQoKTsgIV9wYXJlbnRhZ2VfMV8xLmRvbmU7IF9wYXJlbnRhZ2VfMV8xID0gX3BhcmVudGFnZV8xLm5leHQoKSkgewogICAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBfcGFyZW50YWdlXzFfMS52YWx1ZTsKICAgICAgICAgICAgICAgICAgcGFyZW50XzEucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBpZiAoX3BhcmVudGFnZV8xXzEgJiYgIV9wYXJlbnRhZ2VfMV8xLmRvbmUgJiYgKF9hID0gX3BhcmVudGFnZV8xLnJldHVybikpIF9hLmNhbGwoX3BhcmVudGFnZV8xKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3BhcmVudGFnZS5yZW1vdmUodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBpbml0aWFsRmluYWxpemVyID0gdGhpcy5pbml0aWFsVGVhcmRvd247CiAgICAgICAgICBpZiAoaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcl8xLlVuc3Vic2NyaXB0aW9uRXJyb3IgPyBlLmVycm9ycyA6IFtlXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdmFyIF9maW5hbGl6ZXJzID0gdGhpcy5fZmluYWxpemVyczsKICAgICAgICAgIGlmIChfZmluYWxpemVycykgewogICAgICAgICAgICB0aGlzLl9maW5hbGl6ZXJzID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKHZhciBfZmluYWxpemVyc18xID0gX192YWx1ZXMoX2ZpbmFsaXplcnMpLCBfZmluYWxpemVyc18xXzEgPSBfZmluYWxpemVyc18xLm5leHQoKTsgIV9maW5hbGl6ZXJzXzFfMS5kb25lOyBfZmluYWxpemVyc18xXzEgPSBfZmluYWxpemVyc18xLm5leHQoKSkgewogICAgICAgICAgICAgICAgdmFyIGZpbmFsaXplciA9IF9maW5hbGl6ZXJzXzFfMS52YWx1ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGV4ZWNGaW5hbGl6ZXIoZmluYWxpemVyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgIT09IG51bGwgJiYgZXJyb3JzICE9PSB2b2lkIDAgPyBlcnJvcnMgOiBbXTsKICAgICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3JfMS5VbnN1YnNjcmlwdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZXJyb3JzKSksIF9fcmVhZChlcnIuZXJyb3JzKSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHsKICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoX2ZpbmFsaXplcnNfMV8xICYmICFfZmluYWxpemVyc18xXzEuZG9uZSAmJiAoX2IgPSBfZmluYWxpemVyc18xLnJldHVybikpIF9iLmNhbGwoX2ZpbmFsaXplcnNfMSk7CiAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3Vic2NyaXB0aW9uRXJyb3JfMS5VbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih0ZWFyZG93bikgewogICAgICAgIHZhciBfYTsKICAgICAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHsKICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYSA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5wdXNoKHRlYXJkb3duKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpOwogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7CiAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICAgICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7CiAgICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkgewogICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikgewogICAgICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7CiAgICAgICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7CiAgICAgICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikgewogICAgICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZW1wdHkgPSBuZXcgU3Vic2NyaXB0aW9uMigpOwogICAgICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIGVtcHR5OwogICAgICB9KCk7CiAgICAgIHJldHVybiBTdWJzY3JpcHRpb24yOwogICAgfSgpOwogICAgZXhwb3J0czIuU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uOwogICAgZXhwb3J0czIuRU1QVFlfU1VCU0NSSVBUSU9OID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgZnVuY3Rpb24gaXNTdWJzY3JpcHRpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uIHx8IHZhbHVlICYmICJjbG9zZWQiIGluIHZhbHVlICYmIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHZhbHVlLnJlbW92ZSkgJiYgaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24odmFsdWUuYWRkKSAmJiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbih2YWx1ZS51bnN1YnNjcmliZSk7CiAgICB9CiAgICBleHBvcnRzMi5pc1N1YnNjcmlwdGlvbiA9IGlzU3Vic2NyaXB0aW9uOwogICAgZnVuY3Rpb24gZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpIHsKICAgICAgaWYgKGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKGZpbmFsaXplcikpIHsKICAgICAgICBmaW5hbGl6ZXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaW5hbGl6ZXIudW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL2NvbmZpZy5qcwp2YXIgcmVxdWlyZV9jb25maWcgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9jb25maWcuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbmZpZyA9IHZvaWQgMDsKICAgIGV4cG9ydHMyLmNvbmZpZyA9IHsKICAgICAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCwKICAgICAgb25TdG9wcGVkTm90aWZpY2F0aW9uOiBudWxsLAogICAgICBQcm9taXNlOiB2b2lkIDAsCiAgICAgIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLAogICAgICB1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6IGZhbHNlCiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci90aW1lb3V0UHJvdmlkZXIuanMKdmFyIHJlcXVpcmVfdGltZW91dFByb3ZpZGVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGltZW91dFByb3ZpZGVyID0gdm9pZCAwOwogICAgZXhwb3J0czIudGltZW91dFByb3ZpZGVyID0gewogICAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbihoYW5kbGVyLCB0aW1lb3V0KSB7CiAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIudGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0VGltZW91dCkgewogICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldFRpbWVvdXQuYXBwbHkoZGVsZWdhdGUsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIsIHRpbWVvdXRdLCBfX3JlYWQoYXJncykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24oaGFuZGxlKSB7CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIudGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jbGVhclRpbWVvdXQpIHx8IGNsZWFyVGltZW91dCkoaGFuZGxlKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzCnZhciByZXF1aXJlX3JlcG9ydFVuaGFuZGxlZEVycm9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9yZXBvcnRVbmhhbmRsZWRFcnJvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmVwb3J0VW5oYW5kbGVkRXJyb3IgPSB2b2lkIDA7CiAgICB2YXIgY29uZmlnXzEgPSByZXF1aXJlX2NvbmZpZygpOwogICAgdmFyIHRpbWVvdXRQcm92aWRlcl8xID0gcmVxdWlyZV90aW1lb3V0UHJvdmlkZXIoKTsKICAgIGZ1bmN0aW9uIHJlcG9ydFVuaGFuZGxlZEVycm9yKGVycikgewogICAgICB0aW1lb3V0UHJvdmlkZXJfMS50aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb25VbmhhbmRsZWRFcnJvciA9IGNvbmZpZ18xLmNvbmZpZy5vblVuaGFuZGxlZEVycm9yOwogICAgICAgIGlmIChvblVuaGFuZGxlZEVycm9yKSB7CiAgICAgICAgICBvblVuaGFuZGxlZEVycm9yKGVycik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIucmVwb3J0VW5oYW5kbGVkRXJyb3IgPSByZXBvcnRVbmhhbmRsZWRFcnJvcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL25vb3AuanMKdmFyIHJlcXVpcmVfbm9vcCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvbm9vcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubm9vcCA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIG5vb3AoKSB7CiAgICB9CiAgICBleHBvcnRzMi5ub29wID0gbm9vcDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9Ob3RpZmljYXRpb25GYWN0b3JpZXMuanMKdmFyIHJlcXVpcmVfTm90aWZpY2F0aW9uRmFjdG9yaWVzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvTm90aWZpY2F0aW9uRmFjdG9yaWVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jcmVhdGVOb3RpZmljYXRpb24gPSBleHBvcnRzMi5uZXh0Tm90aWZpY2F0aW9uID0gZXhwb3J0czIuZXJyb3JOb3RpZmljYXRpb24gPSBleHBvcnRzMi5DT01QTEVURV9OT1RJRklDQVRJT04gPSB2b2lkIDA7CiAgICBleHBvcnRzMi5DT01QTEVURV9OT1RJRklDQVRJT04gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbigiQyIsIHZvaWQgMCwgdm9pZCAwKTsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIGVycm9yTm90aWZpY2F0aW9uKGVycm9yKSB7CiAgICAgIHJldHVybiBjcmVhdGVOb3RpZmljYXRpb24oIkUiLCB2b2lkIDAsIGVycm9yKTsKICAgIH0KICAgIGV4cG9ydHMyLmVycm9yTm90aWZpY2F0aW9uID0gZXJyb3JOb3RpZmljYXRpb247CiAgICBmdW5jdGlvbiBuZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBjcmVhdGVOb3RpZmljYXRpb24oIk4iLCB2YWx1ZSwgdm9pZCAwKTsKICAgIH0KICAgIGV4cG9ydHMyLm5leHROb3RpZmljYXRpb24gPSBuZXh0Tm90aWZpY2F0aW9uOwogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZpY2F0aW9uKGtpbmQsIHZhbHVlLCBlcnJvcikgewogICAgICByZXR1cm4gewogICAgICAgIGtpbmQsCiAgICAgICAgdmFsdWUsCiAgICAgICAgZXJyb3IKICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLmNyZWF0ZU5vdGlmaWNhdGlvbiA9IGNyZWF0ZU5vdGlmaWNhdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2Vycm9yQ29udGV4dC5qcwp2YXIgcmVxdWlyZV9lcnJvckNvbnRleHQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2Vycm9yQ29udGV4dC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY2FwdHVyZUVycm9yID0gZXhwb3J0czIuZXJyb3JDb250ZXh0ID0gdm9pZCAwOwogICAgdmFyIGNvbmZpZ18xID0gcmVxdWlyZV9jb25maWcoKTsKICAgIHZhciBjb250ZXh0ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikgewogICAgICBpZiAoY29uZmlnXzEuY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7CiAgICAgICAgaWYgKGlzUm9vdCkgewogICAgICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9OwogICAgICAgIH0KICAgICAgICBjYigpOwogICAgICAgIGlmIChpc1Jvb3QpIHsKICAgICAgICAgIHZhciBfYSA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EuZXJyb3JUaHJvd24sIGVycm9yID0gX2EuZXJyb3I7CiAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgICAgIGlmIChlcnJvclRocm93bikgewogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2IoKTsKICAgICAgfQogICAgfQogICAgZXhwb3J0czIuZXJyb3JDb250ZXh0ID0gZXJyb3JDb250ZXh0OwogICAgZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikgewogICAgICBpZiAoY29uZmlnXzEuY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgY29udGV4dCkgewogICAgICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlOwogICAgICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMyLmNhcHR1cmVFcnJvciA9IGNhcHR1cmVFcnJvcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzCnZhciByZXF1aXJlX1N1YnNjcmliZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fZXh0ZW5kcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXh0ZW5kcyB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGQyLl9fcHJvdG9fXyA9IGIyOwogICAgICAgIH0gfHwgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBmb3IgKHZhciBwIGluIGIyKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIyLCBwKSkgZDJbcF0gPSBiMltwXTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gImZ1bmN0aW9uIiAmJiBiICE9PSBudWxsKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkOwogICAgICAgIH0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgIH07CiAgICB9KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkVNUFRZX09CU0VSVkVSID0gZXhwb3J0czIuU2FmZVN1YnNjcmliZXIgPSBleHBvcnRzMi5TdWJzY3JpYmVyID0gdm9pZCAwOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgdmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZV9TdWJzY3JpcHRpb24oKTsKICAgIHZhciBjb25maWdfMSA9IHJlcXVpcmVfY29uZmlnKCk7CiAgICB2YXIgcmVwb3J0VW5oYW5kbGVkRXJyb3JfMSA9IHJlcXVpcmVfcmVwb3J0VW5oYW5kbGVkRXJyb3IoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBOb3RpZmljYXRpb25GYWN0b3JpZXNfMSA9IHJlcXVpcmVfTm90aWZpY2F0aW9uRmFjdG9yaWVzKCk7CiAgICB2YXIgdGltZW91dFByb3ZpZGVyXzEgPSByZXF1aXJlX3RpbWVvdXRQcm92aWRlcigpOwogICAgdmFyIGVycm9yQ29udGV4dF8xID0gcmVxdWlyZV9lcnJvckNvbnRleHQoKTsKICAgIHZhciBTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIGlmIChkZXN0aW5hdGlvbikgewogICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgICAgICAgIGlmIChTdWJzY3JpcHRpb25fMS5pc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBleHBvcnRzMi5FTVBUWV9PQlNFUlZFUjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHJldHVybiBuZXcgU2FmZVN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihOb3RpZmljYXRpb25GYWN0b3JpZXNfMS5uZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbkZhY3Rvcmllc18xLmVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbkZhY3Rvcmllc18xLkNPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2NvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gU3Vic2NyaWJlcjI7CiAgICB9KFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbik7CiAgICBleHBvcnRzMi5TdWJzY3JpYmVyID0gU3Vic2NyaWJlcjsKICAgIHZhciBfYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kOwogICAgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykgewogICAgICByZXR1cm4gX2JpbmQuY2FsbChmbiwgdGhpc0FyZyk7CiAgICB9CiAgICB2YXIgQ29uc3VtZXJPYnNlcnZlciA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBDb25zdW1lck9ic2VydmVyMihwYXJ0aWFsT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLnBhcnRpYWxPYnNlcnZlciA9IHBhcnRpYWxPYnNlcnZlcjsKICAgICAgfQogICAgICBDb25zdW1lck9ic2VydmVyMi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlciA9IHRoaXMucGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIubmV4dCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyLm5leHQodmFsdWUpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlciA9IHRoaXMucGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5lcnJvcihlcnIpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlciA9IHRoaXMucGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIENvbnN1bWVyT2JzZXJ2ZXIyOwogICAgfSgpOwogICAgdmFyIFNhZmVTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTYWZlU3Vic2NyaWJlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyMihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7CiAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7CiAgICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCwKICAgICAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCwKICAgICAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbnRleHRfMTsKICAgICAgICAgIGlmIChfdGhpcyAmJiBjb25maWdfMS5jb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpOwogICAgICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyID0gewogICAgICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLAogICAgICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLAogICAgICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICByZXR1cm4gU2FmZVN1YnNjcmliZXIyOwogICAgfShTdWJzY3JpYmVyKTsKICAgIGV4cG9ydHMyLlNhZmVTdWJzY3JpYmVyID0gU2FmZVN1YnNjcmliZXI7CiAgICBmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcikgewogICAgICBpZiAoY29uZmlnXzEuY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICBlcnJvckNvbnRleHRfMS5jYXB0dXJlRXJyb3IoZXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFVuaGFuZGxlZEVycm9yXzEucmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikgewogICAgICB0aHJvdyBlcnI7CiAgICB9CiAgICBmdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikgewogICAgICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnXzEuY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjsKICAgICAgb25TdG9wcGVkTm90aWZpY2F0aW9uICYmIHRpbWVvdXRQcm92aWRlcl8xLnRpbWVvdXRQcm92aWRlci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5FTVBUWV9PQlNFUlZFUiA9IHsKICAgICAgY2xvc2VkOiB0cnVlLAogICAgICBuZXh0OiBub29wXzEubm9vcCwKICAgICAgZXJyb3I6IGRlZmF1bHRFcnJvckhhbmRsZXIsCiAgICAgIGNvbXBsZXRlOiBub29wXzEubm9vcAogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zeW1ib2wvb2JzZXJ2YWJsZS5qcwp2YXIgcmVxdWlyZV9vYnNlcnZhYmxlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm9ic2VydmFibGUgPSB2b2lkIDA7CiAgICBleHBvcnRzMi5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8ICJAQG9ic2VydmFibGUiOwogICAgfSgpOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanMKdmFyIHJlcXVpcmVfaWRlbnRpdHkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lkZW50aXR5LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pZGVudGl0eSA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CiAgICBleHBvcnRzMi5pZGVudGl0eSA9IGlkZW50aXR5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvcGlwZS5qcwp2YXIgcmVxdWlyZV9waXBlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9waXBlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5waXBlRnJvbUFycmF5ID0gZXhwb3J0czIucGlwZSA9IHZvaWQgMDsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgZnVuY3Rpb24gcGlwZSgpIHsKICAgICAgdmFyIGZucyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIGZuc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHJldHVybiBwaXBlRnJvbUFycmF5KGZucyk7CiAgICB9CiAgICBleHBvcnRzMi5waXBlID0gcGlwZTsKICAgIGZ1bmN0aW9uIHBpcGVGcm9tQXJyYXkoZm5zKSB7CiAgICAgIGlmIChmbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aXR5XzEuaWRlbnRpdHk7CiAgICAgIH0KICAgICAgaWYgKGZucy5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZm5zWzBdOwogICAgICB9CiAgICAgIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkgewogICAgICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7CiAgICAgICAgICByZXR1cm4gZm4ocHJldik7CiAgICAgICAgfSwgaW5wdXQpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIucGlwZUZyb21BcnJheSA9IHBpcGVGcm9tQXJyYXk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcwp2YXIgcmVxdWlyZV9PYnNlcnZhYmxlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuT2JzZXJ2YWJsZSA9IHZvaWQgMDsKICAgIHZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlX1N1YnNjcmliZXIoKTsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICB2YXIgb2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9vYnNlcnZhYmxlKCk7CiAgICB2YXIgcGlwZV8xID0gcmVxdWlyZV9waXBlKCk7CiAgICB2YXIgY29uZmlnXzEgPSByZXF1aXJlX2NvbmZpZygpOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgdmFyIGVycm9yQ29udGV4dF8xID0gcmVxdWlyZV9lcnJvckNvbnRleHQoKTsKICAgIHZhciBPYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIE9ic2VydmFibGUyKHN1YnNjcmliZSkgewogICAgICAgIGlmIChzdWJzY3JpYmUpIHsKICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUyKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIG9ic2VydmFibGUub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBzdWJzY3JpYmVyID0gaXNTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0KSA/IG9ic2VydmVyT3JOZXh0IDogbmV3IFN1YnNjcmliZXJfMS5TYWZlU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgICBlcnJvckNvbnRleHRfMS5lcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgX2EgPSBfdGhpcywgb3BlcmF0b3IgPSBfYS5vcGVyYXRvciwgc291cmNlID0gX2Euc291cmNlOwogICAgICAgICAgc3Vic2NyaWJlci5hZGQob3BlcmF0b3IgPyBvcGVyYXRvci5jYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgOiBzb3VyY2UgPyBfdGhpcy5fc3Vic2NyaWJlKHN1YnNjcmliZXIpIDogX3RoaXMuX3RyeVN1YnNjcmliZShzdWJzY3JpYmVyKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc2luaykgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgc2luay5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihuZXh0LCBwcm9taXNlQ3RvcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7CiAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFN1YnNjcmliZXJfMS5TYWZlU3Vic2NyaWJlcih7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG5leHQodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBlcnJvcjogcmVqZWN0LAogICAgICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZQogICAgICAgICAgfSk7CiAgICAgICAgICBfdGhpcy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZVtvYnNlcnZhYmxlXzEub2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb3BlcmF0aW9ucyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwaXBlXzEucGlwZUZyb21BcnJheShvcGVyYXRpb25zKSh0aGlzKTsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnRvUHJvbWlzZSA9IGZ1bmN0aW9uKHByb21pc2VDdG9yKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgICAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgX3RoaXMuc3Vic2NyaWJlKGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID0geDsKICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7CiAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodmFsdWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLmNyZWF0ZSA9IGZ1bmN0aW9uKHN1YnNjcmliZSkgewogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTIoc3Vic2NyaWJlKTsKICAgICAgfTsKICAgICAgcmV0dXJuIE9ic2VydmFibGUyOwogICAgfSgpOwogICAgZXhwb3J0czIuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGU7CiAgICBmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogICAgICB2YXIgX2E7CiAgICAgIHJldHVybiAoX2EgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWdfMS5jb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHZhbHVlLm5leHQpICYmIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHZhbHVlLmVycm9yKSAmJiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIgfHwgaXNPYnNlcnZlcih2YWx1ZSkgJiYgU3Vic2NyaXB0aW9uXzEuaXNTdWJzY3JpcHRpb24odmFsdWUpOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvbGlmdC5qcwp2YXIgcmVxdWlyZV9saWZ0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9saWZ0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5vcGVyYXRlID0gZXhwb3J0czIuaGFzTGlmdCA9IHZvaWQgMDsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIGZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7CiAgICAgIHJldHVybiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzb3VyY2UubGlmdCk7CiAgICB9CiAgICBleHBvcnRzMi5oYXNMaWZ0ID0gaGFzTGlmdDsKICAgIGZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgaWYgKGhhc0xpZnQoc291cmNlKSkgewogICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJldHVybiBpbml0KGxpZnRlZFNvdXJjZSwgdGhpcyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVuYWJsZSB0byBsaWZ0IHVua25vd24gT2JzZXJ2YWJsZSB0eXBlIik7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5vcGVyYXRlID0gb3BlcmF0ZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvT3BlcmF0b3JTdWJzY3JpYmVyLmpzCnZhciByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuT3BlcmF0b3JTdWJzY3JpYmVyID0gZXhwb3J0czIuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyID0gdm9pZCAwOwogICAgdmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmVfU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpIHsKICAgICAgcmV0dXJuIG5ldyBPcGVyYXRvclN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSk7CiAgICB9CiAgICBleHBvcnRzMi5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXI7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhPcGVyYXRvclN1YnNjcmliZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBPcGVyYXRvclN1YnNjcmliZXIyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUsIHNob3VsZFVuc3Vic2NyaWJlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pIHx8IHRoaXM7CiAgICAgICAgX3RoaXMub25GaW5hbGl6ZSA9IG9uRmluYWxpemU7CiAgICAgICAgX3RoaXMuc2hvdWxkVW5zdWJzY3JpYmUgPSBzaG91bGRVbnN1YnNjcmliZTsKICAgICAgICBfdGhpcy5fbmV4dCA9IG9uTmV4dCA/IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvbk5leHQodmFsdWUpOwogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICB9CiAgICAgICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX25leHQ7CiAgICAgICAgX3RoaXMuX2Vycm9yID0gb25FcnJvciA/IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgfSBjYXRjaCAoZXJyMikgewogICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIyKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICB9IDogX3N1cGVyLnByb3RvdHlwZS5fZXJyb3I7CiAgICAgICAgX3RoaXMuX2NvbXBsZXRlID0gb25Db21wbGV0ZSA/IGZ1bmN0aW9uKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2NvbXBsZXRlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBPcGVyYXRvclN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBpZiAoIXRoaXMuc2hvdWxkVW5zdWJzY3JpYmUgfHwgdGhpcy5zaG91bGRVbnN1YnNjcmliZSgpKSB7CiAgICAgICAgICB2YXIgY2xvc2VkXzEgPSB0aGlzLmNsb3NlZDsKICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgICAgICFjbG9zZWRfMSAmJiAoKF9hID0gdGhpcy5vbkZpbmFsaXplKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0aGlzKSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gT3BlcmF0b3JTdWJzY3JpYmVyMjsKICAgIH0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpOwogICAgZXhwb3J0czIuT3BlcmF0b3JTdWJzY3JpYmVyID0gT3BlcmF0b3JTdWJzY3JpYmVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZWZDb3VudC5qcwp2YXIgcmVxdWlyZV9yZWZDb3VudCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZWZDb3VudC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmVmQ291bnQgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gcmVmQ291bnQoKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgc291cmNlLl9yZWZDb3VudCsrOwogICAgICAgIHZhciByZWZDb3VudGVyID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCFzb3VyY2UgfHwgc291cmNlLl9yZWZDb3VudCA8PSAwIHx8IDAgPCAtLXNvdXJjZS5fcmVmQ291bnQpIHsKICAgICAgICAgICAgY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBzaGFyZWRDb25uZWN0aW9uID0gc291cmNlLl9jb25uZWN0aW9uOwogICAgICAgICAgdmFyIGNvbm4gPSBjb25uZWN0aW9uOwogICAgICAgICAgY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICBpZiAoc2hhcmVkQ29ubmVjdGlvbiAmJiAoIWNvbm4gfHwgc2hhcmVkQ29ubmVjdGlvbiA9PT0gY29ubikpIHsKICAgICAgICAgICAgc2hhcmVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgIH0pOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUocmVmQ291bnRlcik7CiAgICAgICAgaWYgKCFyZWZDb3VudGVyLmNsb3NlZCkgewogICAgICAgICAgY29ubmVjdGlvbiA9IHNvdXJjZS5jb25uZWN0KCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnJlZkNvdW50ID0gcmVmQ291bnQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUuanMKdmFyIHJlcXVpcmVfQ29ubmVjdGFibGVPYnNlcnZhYmxlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQ29ubmVjdGFibGVPYnNlcnZhYmxlID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZV9TdWJzY3JpcHRpb24oKTsKICAgIHZhciByZWZDb3VudF8xID0gcmVxdWlyZV9yZWZDb3VudCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGUgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIoc291cmNlLCBzdWJqZWN0RmFjdG9yeSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc291cmNlID0gc291cmNlOwogICAgICAgIF90aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgX3RoaXMuX3N1YmplY3QgPSBudWxsOwogICAgICAgIF90aGlzLl9yZWZDb3VudCA9IDA7CiAgICAgICAgX3RoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIGlmIChsaWZ0XzEuaGFzTGlmdChzb3VyY2UpKSB7CiAgICAgICAgICBfdGhpcy5saWZ0ID0gc291cmNlLmxpZnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBDb25uZWN0YWJsZU9ic2VydmFibGUyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiB0aGlzLmdldFN1YmplY3QoKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH07CiAgICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIucHJvdG90eXBlLmdldFN1YmplY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3ViamVjdCA9IHRoaXMuX3N1YmplY3Q7CiAgICAgICAgaWYgKCFzdWJqZWN0IHx8IHN1YmplY3QuaXNTdG9wcGVkKSB7CiAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdDsKICAgICAgfTsKICAgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3RlYXJkb3duID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcmVmQ291bnQgPSAwOwogICAgICAgIHZhciBfY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb247CiAgICAgICAgdGhpcy5fc3ViamVjdCA9IHRoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIF9jb25uZWN0aW9uID09PSBudWxsIHx8IF9jb25uZWN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9OwogICAgICBDb25uZWN0YWJsZU9ic2VydmFibGUyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb247CiAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7CiAgICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbiA9IG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oKTsKICAgICAgICAgIHZhciBzdWJqZWN0XzEgPSB0aGlzLmdldFN1YmplY3QoKTsKICAgICAgICAgIGNvbm5lY3Rpb24uYWRkKHRoaXMuc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3ViamVjdF8xLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBfdGhpcy5fdGVhcmRvd24oKTsKICAgICAgICAgICAgc3ViamVjdF8xLmNvbXBsZXRlKCk7CiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgX3RoaXMuX3RlYXJkb3duKCk7CiAgICAgICAgICAgIHN1YmplY3RfMS5lcnJvcihlcnIpOwogICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fdGVhcmRvd24oKTsKICAgICAgICAgIH0pKSk7CiAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgICB9OwogICAgICBDb25uZWN0YWJsZU9ic2VydmFibGUyLnByb3RvdHlwZS5yZWZDb3VudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByZWZDb3VudF8xLnJlZkNvdW50KCkodGhpcyk7CiAgICAgIH07CiAgICAgIHJldHVybiBDb25uZWN0YWJsZU9ic2VydmFibGUyOwogICAgfShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSk7CiAgICBleHBvcnRzMi5Db25uZWN0YWJsZU9ic2VydmFibGUgPSBDb25uZWN0YWJsZU9ic2VydmFibGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL3BlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIuanMKdmFyIHJlcXVpcmVfcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyID0gdm9pZCAwOwogICAgZXhwb3J0czIucGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlciA9IHsKICAgICAgbm93OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKGV4cG9ydHMyLnBlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgcGVyZm9ybWFuY2UpLm5vdygpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZTogdm9pZCAwCiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZVByb3ZpZGVyLmpzCnZhciByZXF1aXJlX2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvYW5pbWF0aW9uRnJhbWVQcm92aWRlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYW5pbWF0aW9uRnJhbWVQcm92aWRlciA9IHZvaWQgMDsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICBleHBvcnRzMi5hbmltYXRpb25GcmFtZVByb3ZpZGVyID0gewogICAgICBzY2hlZHVsZTogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICB2YXIgcmVxdWVzdCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTsKICAgICAgICB2YXIgY2FuY2VsID0gY2FuY2VsQW5pbWF0aW9uRnJhbWU7CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIuYW5pbWF0aW9uRnJhbWVQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICBpZiAoZGVsZWdhdGUpIHsKICAgICAgICAgIHJlcXVlc3QgPSBkZWxlZ2F0ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CiAgICAgICAgICBjYW5jZWwgPSBkZWxlZ2F0ZS5jYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICB9CiAgICAgICAgdmFyIGhhbmRsZSA9IHJlcXVlc3QoZnVuY3Rpb24odGltZXN0YW1wKSB7CiAgICAgICAgICBjYW5jZWwgPSB2b2lkIDA7CiAgICAgICAgICBjYWxsYmFjayh0aW1lc3RhbXApOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNhbmNlbCA9PT0gbnVsbCB8fCBjYW5jZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbmNlbChoYW5kbGUpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIuYW5pbWF0aW9uRnJhbWVQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB8fCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGV4cG9ydHMyLmFuaW1hdGlvbkZyYW1lUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB8fCBjYW5jZWxBbmltYXRpb25GcmFtZSkuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9hbmltYXRpb25GcmFtZXMuanMKdmFyIHJlcXVpcmVfYW5pbWF0aW9uRnJhbWVzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kb20vYW5pbWF0aW9uRnJhbWVzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hbmltYXRpb25GcmFtZXMgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlcl8xID0gcmVxdWlyZV9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyKCk7CiAgICB2YXIgYW5pbWF0aW9uRnJhbWVQcm92aWRlcl8xID0gcmVxdWlyZV9hbmltYXRpb25GcmFtZVByb3ZpZGVyKCk7CiAgICBmdW5jdGlvbiBhbmltYXRpb25GcmFtZXModGltZXN0YW1wUHJvdmlkZXIpIHsKICAgICAgcmV0dXJuIHRpbWVzdGFtcFByb3ZpZGVyID8gYW5pbWF0aW9uRnJhbWVzRmFjdG9yeSh0aW1lc3RhbXBQcm92aWRlcikgOiBERUZBVUxUX0FOSU1BVElPTl9GUkFNRVM7CiAgICB9CiAgICBleHBvcnRzMi5hbmltYXRpb25GcmFtZXMgPSBhbmltYXRpb25GcmFtZXM7CiAgICBmdW5jdGlvbiBhbmltYXRpb25GcmFtZXNGYWN0b3J5KHRpbWVzdGFtcFByb3ZpZGVyKSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBwcm92aWRlciA9IHRpbWVzdGFtcFByb3ZpZGVyIHx8IHBlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXJfMS5wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyOwogICAgICAgIHZhciBzdGFydCA9IHByb3ZpZGVyLm5vdygpOwogICAgICAgIHZhciBpZCA9IDA7CiAgICAgICAgdmFyIHJ1biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICBpZCA9IGFuaW1hdGlvbkZyYW1lUHJvdmlkZXJfMS5hbmltYXRpb25GcmFtZVByb3ZpZGVyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbih0aW1lc3RhbXApIHsKICAgICAgICAgICAgICBpZCA9IDA7CiAgICAgICAgICAgICAgdmFyIG5vdyA9IHByb3ZpZGVyLm5vdygpOwogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFByb3ZpZGVyID8gbm93IDogdGltZXN0YW1wLAogICAgICAgICAgICAgICAgZWxhcHNlZDogbm93IC0gc3RhcnQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBydW4oKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWVQcm92aWRlcl8xLmFuaW1hdGlvbkZyYW1lUHJvdmlkZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0pOwogICAgfQogICAgdmFyIERFRkFVTFRfQU5JTUFUSU9OX0ZSQU1FUyA9IGFuaW1hdGlvbkZyYW1lc0ZhY3RvcnkoKTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL09iamVjdFVuc3Vic2NyaWJlZEVycm9yLmpzCnZhciByZXF1aXJlX09iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IgPSB2b2lkIDA7CiAgICB2YXIgY3JlYXRlRXJyb3JDbGFzc18xID0gcmVxdWlyZV9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBleHBvcnRzMi5PYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3NfMS5jcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsKCkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICJvYmplY3QgdW5zdWJzY3JpYmVkIjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1N1YmplY3QuanMKdmFyIHJlcXVpcmVfU3ViamVjdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1N1YmplY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIHZhciBfX3ZhbHVlcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fdmFsdWVzIHx8IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CiAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pOwogICAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/ICJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiIgOiAiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQW5vbnltb3VzU3ViamVjdCA9IGV4cG9ydHMyLlN1YmplY3QgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlX1N1YnNjcmlwdGlvbigpOwogICAgdmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yXzEgPSByZXF1aXJlX09iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICB2YXIgYXJyUmVtb3ZlXzEgPSByZXF1aXJlX2FyclJlbW92ZSgpOwogICAgdmFyIGVycm9yQ29udGV4dF8xID0gcmVxdWlyZV9lcnJvckNvbnRleHQoKTsKICAgIHZhciBTdWJqZWN0ID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gU3ViamVjdDIoKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgICBfdGhpcy5vYnNlcnZlcnMgPSBbXTsKICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICBfdGhpcy5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgU3ViamVjdDIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgICAgIHZhciBzdWJqZWN0ID0gbmV3IEFub255bW91c1N1YmplY3QodGhpcywgdGhpcyk7CiAgICAgICAgc3ViamVjdC5vcGVyYXRvciA9IG9wZXJhdG9yOwogICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX3Rocm93SWZDbG9zZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xLk9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBlcnJvckNvbnRleHRfMS5lcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZV8xLCBfYTsKICAgICAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgICBpZiAoIV90aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBpZiAoIV90aGlzLmN1cnJlbnRPYnNlcnZlcnMpIHsKICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gQXJyYXkuZnJvbShfdGhpcy5vYnNlcnZlcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gX2MudmFsdWU7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpOwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgZXJyb3JDb250ZXh0XzEuZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkgewogICAgICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIF90aGlzLmhhc0Vycm9yID0gX3RoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXMudGhyb3duRXJyb3IgPSBlcnI7CiAgICAgICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGVycm9yQ29udGV4dF8xLmVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgICBpZiAoIV90aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gX3RoaXMub2JzZXJ2ZXJzOwogICAgICAgICAgICB3aGlsZSAob2JzZXJ2ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSB0aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdDIucHJvdG90eXBlLCAib2JzZXJ2ZWQiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBfYTsKICAgICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5vYnNlcnZlcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMDsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUuY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX2lubmVyU3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBvYnNlcnZlcnMgPSBfYS5vYnNlcnZlcnM7CiAgICAgICAgaWYgKGhhc0Vycm9yIHx8IGlzU3RvcHBlZCkgewogICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbl8xLkVNUFRZX1NVQlNDUklQVElPTjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgICBvYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsOwogICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKG9ic2VydmVycywgc3Vic2NyaWJlcik7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBoYXNFcnJvciA9IF9hLmhhc0Vycm9yLCB0aHJvd25FcnJvciA9IF9hLnRocm93bkVycm9yLCBpc1N0b3BwZWQgPSBfYS5pc1N0b3BwZWQ7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRocm93bkVycm9yKTsKICAgICAgICB9IGVsc2UgaWYgKGlzU3RvcHBlZCkgewogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLmFzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpOwogICAgICB9OwogICAgICByZXR1cm4gU3ViamVjdDI7CiAgICB9KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKTsKICAgIGV4cG9ydHMyLlN1YmplY3QgPSBTdWJqZWN0OwogICAgdmFyIEFub255bW91c1N1YmplY3QgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB2YWx1ZSk7CiAgICAgIH07CiAgICAgIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXJyKTsKICAgICAgfTsKICAgICAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTsKICAgICAgfTsKICAgICAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFN1YnNjcmlwdGlvbl8xLkVNUFRZX1NVQlNDUklQVElPTjsKICAgICAgfTsKICAgICAgcmV0dXJuIEFub255bW91c1N1YmplY3QyOwogICAgfShTdWJqZWN0KTsKICAgIGV4cG9ydHMyLkFub255bW91c1N1YmplY3QgPSBBbm9ueW1vdXNTdWJqZWN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL0JlaGF2aW9yU3ViamVjdC5qcwp2YXIgcmVxdWlyZV9CZWhhdmlvclN1YmplY3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9CZWhhdmlvclN1YmplY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQmVoYXZpb3JTdWJqZWN0ID0gdm9pZCAwOwogICAgdmFyIFN1YmplY3RfMSA9IHJlcXVpcmVfU3ViamVjdCgpOwogICAgdmFyIEJlaGF2aW9yU3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQmVoYXZpb3JTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQmVoYXZpb3JTdWJqZWN0MihfdmFsdWUpIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgIF90aGlzLl92YWx1ZSA9IF92YWx1ZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJlaGF2aW9yU3ViamVjdDIucHJvdG90eXBlLCAidmFsdWUiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIEJlaGF2aW9yU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IF9zdXBlci5wcm90b3R5cGUuX3N1YnNjcmliZS5jYWxsKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICAgICFzdWJzY3JpcHRpb24uY2xvc2VkICYmIHN1YnNjcmliZXIubmV4dCh0aGlzLl92YWx1ZSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgfTsKICAgICAgQmVoYXZpb3JTdWJqZWN0Mi5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBoYXNFcnJvciA9IF9hLmhhc0Vycm9yLCB0aHJvd25FcnJvciA9IF9hLnRocm93bkVycm9yLCBfdmFsdWUgPSBfYS5fdmFsdWU7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICB0aHJvdyB0aHJvd25FcnJvcjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgIHJldHVybiBfdmFsdWU7CiAgICAgIH07CiAgICAgIEJlaGF2aW9yU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIHRoaXMuX3ZhbHVlID0gdmFsdWUpOwogICAgICB9OwogICAgICByZXR1cm4gQmVoYXZpb3JTdWJqZWN0MjsKICAgIH0oU3ViamVjdF8xLlN1YmplY3QpOwogICAgZXhwb3J0czIuQmVoYXZpb3JTdWJqZWN0ID0gQmVoYXZpb3JTdWJqZWN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanMKdmFyIHJlcXVpcmVfZGF0ZVRpbWVzdGFtcFByb3ZpZGVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2RhdGVUaW1lc3RhbXBQcm92aWRlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZGF0ZVRpbWVzdGFtcFByb3ZpZGVyID0gdm9pZCAwOwogICAgZXhwb3J0czIuZGF0ZVRpbWVzdGFtcFByb3ZpZGVyID0gewogICAgICBub3c6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoZXhwb3J0czIuZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLmRlbGVnYXRlIHx8IERhdGUpLm5vdygpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZTogdm9pZCAwCiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1JlcGxheVN1YmplY3QuanMKdmFyIHJlcXVpcmVfUmVwbGF5U3ViamVjdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1JlcGxheVN1YmplY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuUmVwbGF5U3ViamVjdCA9IHZvaWQgMDsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXJfMSA9IHJlcXVpcmVfZGF0ZVRpbWVzdGFtcFByb3ZpZGVyKCk7CiAgICB2YXIgUmVwbGF5U3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7CiAgICAgICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHsKICAgICAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBfd2luZG93VGltZSA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHsKICAgICAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcl8xLmRhdGVUaW1lc3RhbXBQcm92aWRlcjsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplOwogICAgICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7CiAgICAgICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyOwogICAgICAgIF90aGlzLl9idWZmZXIgPSBbXTsKICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTsKICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5OwogICAgICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpOwogICAgICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIF9hID0gdGhpcywgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2EuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYS5fd2luZG93VGltZTsKICAgICAgICBpZiAoIWlzU3RvcHBlZCkgewogICAgICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3RyaW1CdWZmZXIoKTsKICAgICAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7CiAgICAgIH07CiAgICAgIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIHZhciBfYSA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYS5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EuX2J1ZmZlcjsKICAgICAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2ldKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICB9OwogICAgICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBfYnVmZmVyU2l6ZSA9IF9hLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYS5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYS5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EuX2luZmluaXRlVGltZVdpbmRvdzsKICAgICAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTsKICAgICAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTsKICAgICAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHsKICAgICAgICAgIHZhciBub3cgPSBfdGltZXN0YW1wUHJvdmlkZXIubm93KCk7CiAgICAgICAgICB2YXIgbGFzdCA9IDA7CiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXJbaV0gPD0gbm93OyBpICs9IDIpIHsKICAgICAgICAgICAgbGFzdCA9IGk7CiAgICAgICAgICB9CiAgICAgICAgICBsYXN0ICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QgKyAxKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBSZXBsYXlTdWJqZWN0MjsKICAgIH0oU3ViamVjdF8xLlN1YmplY3QpOwogICAgZXhwb3J0czIuUmVwbGF5U3ViamVjdCA9IFJlcGxheVN1YmplY3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvQXN5bmNTdWJqZWN0LmpzCnZhciByZXF1aXJlX0FzeW5jU3ViamVjdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL0FzeW5jU3ViamVjdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2V4dGVuZHMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4dGVuZHMgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBkMi5fX3Byb3RvX18gPSBiMjsKICAgICAgICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZm9yICh2YXIgcCBpbiBiMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiMiwgcCkpIGQyW3BdID0gYjJbcF07CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJmdW5jdGlvbiIgJiYgYiAhPT0gbnVsbCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIiArIFN0cmluZyhiKSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgZnVuY3Rpb24gX18oKSB7CiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDsKICAgICAgICB9CiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICB9OwogICAgfSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5Bc3luY1N1YmplY3QgPSB2b2lkIDA7CiAgICB2YXIgU3ViamVjdF8xID0gcmVxdWlyZV9TdWJqZWN0KCk7CiAgICB2YXIgQXN5bmNTdWJqZWN0ID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBc3luY1N1YmplY3QyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBc3luY1N1YmplY3QyKCkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIF90aGlzLl92YWx1ZSA9IG51bGw7CiAgICAgICAgX3RoaXMuX2hhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgX3RoaXMuX2lzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQXN5bmNTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgX2hhc1ZhbHVlID0gX2EuX2hhc1ZhbHVlLCBfdmFsdWUgPSBfYS5fdmFsdWUsIHRocm93bkVycm9yID0gX2EudGhyb3duRXJyb3IsIGlzU3RvcHBlZCA9IF9hLmlzU3RvcHBlZCwgX2lzQ29tcGxldGUgPSBfYS5faXNDb21wbGV0ZTsKICAgICAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhyb3duRXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAoaXNTdG9wcGVkIHx8IF9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBfaGFzVmFsdWUgJiYgc3Vic2NyaWJlci5uZXh0KF92YWx1ZSk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBBc3luY1N1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwogICAgICAgICAgdGhpcy5faGFzVmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXN5bmNTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBfaGFzVmFsdWUgPSBfYS5faGFzVmFsdWUsIF92YWx1ZSA9IF9hLl92YWx1ZSwgX2lzQ29tcGxldGUgPSBfYS5faXNDb21wbGV0ZTsKICAgICAgICBpZiAoIV9pc0NvbXBsZXRlKSB7CiAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgIF9oYXNWYWx1ZSAmJiBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCBfdmFsdWUpOwogICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5jb21wbGV0ZS5jYWxsKHRoaXMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFzeW5jU3ViamVjdDI7CiAgICB9KFN1YmplY3RfMS5TdWJqZWN0KTsKICAgIGV4cG9ydHMyLkFzeW5jU3ViamVjdCA9IEFzeW5jU3ViamVjdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvQWN0aW9uLmpzCnZhciByZXF1aXJlX0FjdGlvbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9BY3Rpb24uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQWN0aW9uID0gdm9pZCAwOwogICAgdmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZV9TdWJzY3JpcHRpb24oKTsKICAgIHZhciBBY3Rpb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgIH0KICAgICAgQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkpIHsKICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgcmV0dXJuIEFjdGlvbjI7CiAgICB9KFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbik7CiAgICBleHBvcnRzMi5BY3Rpb24gPSBBY3Rpb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2ludGVydmFsUHJvdmlkZXIuanMKdmFyIHJlcXVpcmVfaW50ZXJ2YWxQcm92aWRlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pbnRlcnZhbFByb3ZpZGVyID0gdm9pZCAwOwogICAgZXhwb3J0czIuaW50ZXJ2YWxQcm92aWRlciA9IHsKICAgICAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIsIHRpbWVvdXQpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgZGVsZWdhdGUgPSBleHBvcnRzMi5pbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHsKICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZSkgewogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGV4cG9ydHMyLmludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW50ZXJ2YWwpIHx8IGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlOiB2b2lkIDAKICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jQWN0aW9uLmpzCnZhciByZXF1aXJlX0FzeW5jQWN0aW9uID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jQWN0aW9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fZXh0ZW5kcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXh0ZW5kcyB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGQyLl9fcHJvdG9fXyA9IGIyOwogICAgICAgIH0gfHwgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBmb3IgKHZhciBwIGluIGIyKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIyLCBwKSkgZDJbcF0gPSBiMltwXTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gImZ1bmN0aW9uIiAmJiBiICE9PSBudWxsKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkOwogICAgICAgIH0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgIH07CiAgICB9KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkFzeW5jQWN0aW9uID0gdm9pZCAwOwogICAgdmFyIEFjdGlvbl8xID0gcmVxdWlyZV9BY3Rpb24oKTsKICAgIHZhciBpbnRlcnZhbFByb3ZpZGVyXzEgPSByZXF1aXJlX2ludGVydmFsUHJvdmlkZXIoKTsKICAgIHZhciBhcnJSZW1vdmVfMSA9IHJlcXVpcmVfYXJyUmVtb3ZlKCk7CiAgICB2YXIgQXN5bmNBY3Rpb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFzeW5jQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQXN5bmNBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgX3RoaXMud29yayA9IHdvcms7CiAgICAgICAgX3RoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5KSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKICAgICAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjsKICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICB0aGlzLmlkID0gKF9hID0gdGhpcy5pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgX2lkLCBkZWxheSkgewogICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbnRlcnZhbFByb3ZpZGVyXzEuaW50ZXJ2YWxQcm92aWRlci5zZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheSk7CiAgICAgIH07CiAgICAgIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQgPSBmdW5jdGlvbihfc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHsKICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheSAmJiB0aGlzLnBlbmRpbmcgPT09IGZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICBpbnRlcnZhbFByb3ZpZGVyXzEuaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5KSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCJleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uIik7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZCh0aGlzLnNjaGVkdWxlciwgdGhpcy5pZCwgbnVsbCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLl9leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIF9kZWxheSkgewogICAgICAgIHZhciBlcnJvcmVkID0gZmFsc2U7CiAgICAgICAgdmFyIGVycm9yVmFsdWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMud29yayhzdGF0ZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgZXJyb3JlZCA9IHRydWU7CiAgICAgICAgICBlcnJvclZhbHVlID0gZSA/IGUgOiBuZXcgRXJyb3IoIlNjaGVkdWxlZCBhY3Rpb24gdGhyZXcgZmFsc3kgZXJyb3IiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yZWQpIHsKICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHZhciBfYSA9IHRoaXMsIGlkID0gX2EuaWQsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjsKICAgICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsOwogICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICBhcnJSZW1vdmVfMS5hcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7CiAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGVsYXkgPSBudWxsOwogICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFzeW5jQWN0aW9uMjsKICAgIH0oQWN0aW9uXzEuQWN0aW9uKTsKICAgIGV4cG9ydHMyLkFzeW5jQWN0aW9uID0gQXN5bmNBY3Rpb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9JbW1lZGlhdGUuanMKdmFyIHJlcXVpcmVfSW1tZWRpYXRlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9JbW1lZGlhdGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlRlc3RUb29scyA9IGV4cG9ydHMyLkltbWVkaWF0ZSA9IHZvaWQgMDsKICAgIHZhciBuZXh0SGFuZGxlID0gMTsKICAgIHZhciByZXNvbHZlZDsKICAgIHZhciBhY3RpdmVIYW5kbGVzID0ge307CiAgICBmdW5jdGlvbiBmaW5kQW5kQ2xlYXJIYW5kbGUoaGFuZGxlKSB7CiAgICAgIGlmIChoYW5kbGUgaW4gYWN0aXZlSGFuZGxlcykgewogICAgICAgIGRlbGV0ZSBhY3RpdmVIYW5kbGVzW2hhbmRsZV07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZXhwb3J0czIuSW1tZWRpYXRlID0gewogICAgICBzZXRJbW1lZGlhdGU6IGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgdmFyIGhhbmRsZSA9IG5leHRIYW5kbGUrKzsKICAgICAgICBhY3RpdmVIYW5kbGVzW2hhbmRsZV0gPSB0cnVlOwogICAgICAgIGlmICghcmVzb2x2ZWQpIHsKICAgICAgICAgIHJlc29sdmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgfQogICAgICAgIHJlc29sdmVkLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSkgJiYgY2IoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgICB9LAogICAgICBjbGVhckltbWVkaWF0ZTogZnVuY3Rpb24oaGFuZGxlKSB7CiAgICAgICAgZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5UZXN0VG9vbHMgPSB7CiAgICAgIHBlbmRpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3RpdmVIYW5kbGVzKS5sZW5ndGg7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2ltbWVkaWF0ZVByb3ZpZGVyLmpzCnZhciByZXF1aXJlX2ltbWVkaWF0ZVByb3ZpZGVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2ltbWVkaWF0ZVByb3ZpZGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pbW1lZGlhdGVQcm92aWRlciA9IHZvaWQgMDsKICAgIHZhciBJbW1lZGlhdGVfMSA9IHJlcXVpcmVfSW1tZWRpYXRlKCk7CiAgICB2YXIgc2V0SW1tZWRpYXRlID0gSW1tZWRpYXRlXzEuSW1tZWRpYXRlLnNldEltbWVkaWF0ZTsKICAgIHZhciBjbGVhckltbWVkaWF0ZSA9IEltbWVkaWF0ZV8xLkltbWVkaWF0ZS5jbGVhckltbWVkaWF0ZTsKICAgIGV4cG9ydHMyLmltbWVkaWF0ZVByb3ZpZGVyID0gewogICAgICBzZXRJbW1lZGlhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIuaW1tZWRpYXRlUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldEltbWVkaWF0ZSkgfHwgc2V0SW1tZWRpYXRlKS5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpOwogICAgICB9LAogICAgICBjbGVhckltbWVkaWF0ZTogZnVuY3Rpb24oaGFuZGxlKSB7CiAgICAgICAgdmFyIGRlbGVnYXRlID0gZXhwb3J0czIuaW1tZWRpYXRlUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW1tZWRpYXRlKSB8fCBjbGVhckltbWVkaWF0ZSkoaGFuZGxlKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvQXNhcEFjdGlvbi5qcwp2YXIgcmVxdWlyZV9Bc2FwQWN0aW9uID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FzYXBBY3Rpb24uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQXNhcEFjdGlvbiA9IHZvaWQgMDsKICAgIHZhciBBc3luY0FjdGlvbl8xID0gcmVxdWlyZV9Bc3luY0FjdGlvbigpOwogICAgdmFyIGltbWVkaWF0ZVByb3ZpZGVyXzEgPSByZXF1aXJlX2ltbWVkaWF0ZVByb3ZpZGVyKCk7CiAgICB2YXIgQXNhcEFjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXNhcEFjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzYXBBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgX3RoaXMud29yayA9IHdvcms7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIEFzYXBBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7CiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5fc2NoZWR1bGVkIHx8IChzY2hlZHVsZXIuX3NjaGVkdWxlZCA9IGltbWVkaWF0ZVByb3ZpZGVyXzEuaW1tZWRpYXRlUHJvdmlkZXIuc2V0SW1tZWRpYXRlKHNjaGVkdWxlci5mbHVzaC5iaW5kKHNjaGVkdWxlciwgdm9pZCAwKSkpOwogICAgICB9OwogICAgICBBc2FwQWN0aW9uMi5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIGlkLCBkZWxheSkgewogICAgICAgIHZhciBfYTsKICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkgIT0gbnVsbCA/IGRlbGF5ID4gMCA6IHRoaXMuZGVsYXkgPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZC5jYWxsKHRoaXMsIHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgdmFyIGFjdGlvbnMgPSBzY2hlZHVsZXIuYWN0aW9uczsKICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiAoKF9hID0gYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWQpICE9PSBpZCkgewogICAgICAgICAgaW1tZWRpYXRlUHJvdmlkZXJfMS5pbW1lZGlhdGVQcm92aWRlci5jbGVhckltbWVkaWF0ZShpZCk7CiAgICAgICAgICBpZiAoc2NoZWR1bGVyLl9zY2hlZHVsZWQgPT09IGlkKSB7CiAgICAgICAgICAgIHNjaGVkdWxlci5fc2NoZWR1bGVkID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICByZXR1cm4gQXNhcEFjdGlvbjI7CiAgICB9KEFzeW5jQWN0aW9uXzEuQXN5bmNBY3Rpb24pOwogICAgZXhwb3J0czIuQXNhcEFjdGlvbiA9IEFzYXBBY3Rpb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvU2NoZWR1bGVyLmpzCnZhciByZXF1aXJlX1NjaGVkdWxlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL1NjaGVkdWxlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuU2NoZWR1bGVyID0gdm9pZCAwOwogICAgdmFyIGRhdGVUaW1lc3RhbXBQcm92aWRlcl8xID0gcmVxdWlyZV9kYXRlVGltZXN0YW1wUHJvdmlkZXIoKTsKICAgIHZhciBTY2hlZHVsZXIgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gU2NoZWR1bGVyMihzY2hlZHVsZXJBY3Rpb25DdG9yLCBub3cpIHsKICAgICAgICBpZiAobm93ID09PSB2b2lkIDApIHsKICAgICAgICAgIG5vdyA9IFNjaGVkdWxlcjIubm93OwogICAgICAgIH0KICAgICAgICB0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3IgPSBzY2hlZHVsZXJBY3Rpb25DdG9yOwogICAgICAgIHRoaXMubm93ID0gbm93OwogICAgICB9CiAgICAgIFNjaGVkdWxlcjIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24od29yaywgZGVsYXksIHN0YXRlKSB7CiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3IodGhpcywgd29yaykuc2NoZWR1bGUoc3RhdGUsIGRlbGF5KTsKICAgICAgfTsKICAgICAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXJfMS5kYXRlVGltZXN0YW1wUHJvdmlkZXIubm93OwogICAgICByZXR1cm4gU2NoZWR1bGVyMjsKICAgIH0oKTsKICAgIGV4cG9ydHMyLlNjaGVkdWxlciA9IFNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNTY2hlZHVsZXIuanMKdmFyIHJlcXVpcmVfQXN5bmNTY2hlZHVsZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNTY2hlZHVsZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQXN5bmNTY2hlZHVsZXIgPSB2b2lkIDA7CiAgICB2YXIgU2NoZWR1bGVyXzEgPSByZXF1aXJlX1NjaGVkdWxlcigpOwogICAgdmFyIEFzeW5jU2NoZWR1bGVyID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBc3luY1NjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyMihTY2hlZHVsZXJBY3Rpb24sIG5vdykgewogICAgICAgIGlmIChub3cgPT09IHZvaWQgMCkgewogICAgICAgICAgbm93ID0gU2NoZWR1bGVyXzEuU2NoZWR1bGVyLm5vdzsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuYWN0aW9ucyA9IFtdOwogICAgICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikgewogICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zOwogICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZXJyb3I7CiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBBc3luY1NjaGVkdWxlcjI7CiAgICB9KFNjaGVkdWxlcl8xLlNjaGVkdWxlcik7CiAgICBleHBvcnRzMi5Bc3luY1NjaGVkdWxlciA9IEFzeW5jU2NoZWR1bGVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9Bc2FwU2NoZWR1bGVyLmpzCnZhciByZXF1aXJlX0FzYXBTY2hlZHVsZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvQXNhcFNjaGVkdWxlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2V4dGVuZHMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4dGVuZHMgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBkMi5fX3Byb3RvX18gPSBiMjsKICAgICAgICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZm9yICh2YXIgcCBpbiBiMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiMiwgcCkpIGQyW3BdID0gYjJbcF07CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJmdW5jdGlvbiIgJiYgYiAhPT0gbnVsbCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIiArIFN0cmluZyhiKSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgZnVuY3Rpb24gX18oKSB7CiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDsKICAgICAgICB9CiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICB9OwogICAgfSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5Bc2FwU2NoZWR1bGVyID0gdm9pZCAwOwogICAgdmFyIEFzeW5jU2NoZWR1bGVyXzEgPSByZXF1aXJlX0FzeW5jU2NoZWR1bGVyKCk7CiAgICB2YXIgQXNhcFNjaGVkdWxlciA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXNhcFNjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzYXBTY2hlZHVsZXIyKCkgewogICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgfQogICAgICBBc2FwU2NoZWR1bGVyMi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhY3Rpb24pIHsKICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlOwogICAgICAgIHZhciBmbHVzaElkID0gdGhpcy5fc2NoZWR1bGVkOwogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHZvaWQgMDsKICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9uczsKICAgICAgICB2YXIgZXJyb3I7CiAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IGFjdGlvbnMuc2hpZnQoKTsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbnNbMF0pICYmIGFjdGlvbi5pZCA9PT0gZmx1c2hJZCAmJiBhY3Rpb25zLnNoaWZ0KCkpOwogICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uaWQgPT09IGZsdXNoSWQgJiYgYWN0aW9ucy5zaGlmdCgpKSB7CiAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gQXNhcFNjaGVkdWxlcjI7CiAgICB9KEFzeW5jU2NoZWR1bGVyXzEuQXN5bmNTY2hlZHVsZXIpOwogICAgZXhwb3J0czIuQXNhcFNjaGVkdWxlciA9IEFzYXBTY2hlZHVsZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2FzYXAuanMKdmFyIHJlcXVpcmVfYXNhcCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9hc2FwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hc2FwID0gZXhwb3J0czIuYXNhcFNjaGVkdWxlciA9IHZvaWQgMDsKICAgIHZhciBBc2FwQWN0aW9uXzEgPSByZXF1aXJlX0FzYXBBY3Rpb24oKTsKICAgIHZhciBBc2FwU2NoZWR1bGVyXzEgPSByZXF1aXJlX0FzYXBTY2hlZHVsZXIoKTsKICAgIGV4cG9ydHMyLmFzYXBTY2hlZHVsZXIgPSBuZXcgQXNhcFNjaGVkdWxlcl8xLkFzYXBTY2hlZHVsZXIoQXNhcEFjdGlvbl8xLkFzYXBBY3Rpb24pOwogICAgZXhwb3J0czIuYXNhcCA9IGV4cG9ydHMyLmFzYXBTY2hlZHVsZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2FzeW5jLmpzCnZhciByZXF1aXJlX2FzeW5jID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL2FzeW5jLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hc3luYyA9IGV4cG9ydHMyLmFzeW5jU2NoZWR1bGVyID0gdm9pZCAwOwogICAgdmFyIEFzeW5jQWN0aW9uXzEgPSByZXF1aXJlX0FzeW5jQWN0aW9uKCk7CiAgICB2YXIgQXN5bmNTY2hlZHVsZXJfMSA9IHJlcXVpcmVfQXN5bmNTY2hlZHVsZXIoKTsKICAgIGV4cG9ydHMyLmFzeW5jU2NoZWR1bGVyID0gbmV3IEFzeW5jU2NoZWR1bGVyXzEuQXN5bmNTY2hlZHVsZXIoQXN5bmNBY3Rpb25fMS5Bc3luY0FjdGlvbik7CiAgICBleHBvcnRzMi5hc3luYyA9IGV4cG9ydHMyLmFzeW5jU2NoZWR1bGVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9RdWV1ZUFjdGlvbi5qcwp2YXIgcmVxdWlyZV9RdWV1ZUFjdGlvbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9RdWV1ZUFjdGlvbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2V4dGVuZHMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4dGVuZHMgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBkMi5fX3Byb3RvX18gPSBiMjsKICAgICAgICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZm9yICh2YXIgcCBpbiBiMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiMiwgcCkpIGQyW3BdID0gYjJbcF07CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJmdW5jdGlvbiIgJiYgYiAhPT0gbnVsbCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIiArIFN0cmluZyhiKSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgZnVuY3Rpb24gX18oKSB7CiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDsKICAgICAgICB9CiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICB9OwogICAgfSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5RdWV1ZUFjdGlvbiA9IHZvaWQgMDsKICAgIHZhciBBc3luY0FjdGlvbl8xID0gcmVxdWlyZV9Bc3luY0FjdGlvbigpOwogICAgdmFyIFF1ZXVlQWN0aW9uID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhRdWV1ZUFjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFF1ZXVlQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIF90aGlzLndvcmsgPSB3b3JrOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBRdWV1ZUFjdGlvbjIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5KSB7CiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5ID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuc2NoZWR1bGUuY2FsbCh0aGlzLCBzdGF0ZSwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMuc2NoZWR1bGVyLmZsdXNoKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9OwogICAgICBRdWV1ZUFjdGlvbjIucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkID8gX3N1cGVyLnByb3RvdHlwZS5leGVjdXRlLmNhbGwodGhpcywgc3RhdGUsIGRlbGF5KSA6IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTsKICAgICAgfTsKICAgICAgUXVldWVBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7CiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5ICE9IG51bGwgJiYgZGVsYXkgPiAwIHx8IGRlbGF5ID09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH07CiAgICAgIHJldHVybiBRdWV1ZUFjdGlvbjI7CiAgICB9KEFzeW5jQWN0aW9uXzEuQXN5bmNBY3Rpb24pOwogICAgZXhwb3J0czIuUXVldWVBY3Rpb24gPSBRdWV1ZUFjdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanMKdmFyIHJlcXVpcmVfUXVldWVTY2hlZHVsZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuUXVldWVTY2hlZHVsZXIgPSB2b2lkIDA7CiAgICB2YXIgQXN5bmNTY2hlZHVsZXJfMSA9IHJlcXVpcmVfQXN5bmNTY2hlZHVsZXIoKTsKICAgIHZhciBRdWV1ZVNjaGVkdWxlciA9IGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoUXVldWVTY2hlZHVsZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBRdWV1ZVNjaGVkdWxlcjIoKSB7CiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICB9CiAgICAgIHJldHVybiBRdWV1ZVNjaGVkdWxlcjI7CiAgICB9KEFzeW5jU2NoZWR1bGVyXzEuQXN5bmNTY2hlZHVsZXIpOwogICAgZXhwb3J0czIuUXVldWVTY2hlZHVsZXIgPSBRdWV1ZVNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvcXVldWUuanMKdmFyIHJlcXVpcmVfcXVldWUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvcXVldWUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnF1ZXVlID0gZXhwb3J0czIucXVldWVTY2hlZHVsZXIgPSB2b2lkIDA7CiAgICB2YXIgUXVldWVBY3Rpb25fMSA9IHJlcXVpcmVfUXVldWVBY3Rpb24oKTsKICAgIHZhciBRdWV1ZVNjaGVkdWxlcl8xID0gcmVxdWlyZV9RdWV1ZVNjaGVkdWxlcigpOwogICAgZXhwb3J0czIucXVldWVTY2hlZHVsZXIgPSBuZXcgUXVldWVTY2hlZHVsZXJfMS5RdWV1ZVNjaGVkdWxlcihRdWV1ZUFjdGlvbl8xLlF1ZXVlQWN0aW9uKTsKICAgIGV4cG9ydHMyLnF1ZXVlID0gZXhwb3J0czIucXVldWVTY2hlZHVsZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lQWN0aW9uLmpzCnZhciByZXF1aXJlX0FuaW1hdGlvbkZyYW1lQWN0aW9uID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lQWN0aW9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fZXh0ZW5kcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXh0ZW5kcyB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGQyLl9fcHJvdG9fXyA9IGIyOwogICAgICAgIH0gfHwgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBmb3IgKHZhciBwIGluIGIyKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIyLCBwKSkgZDJbcF0gPSBiMltwXTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gImZ1bmN0aW9uIiAmJiBiICE9PSBudWxsKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkOwogICAgICAgIH0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgIH07CiAgICB9KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkFuaW1hdGlvbkZyYW1lQWN0aW9uID0gdm9pZCAwOwogICAgdmFyIEFzeW5jQWN0aW9uXzEgPSByZXF1aXJlX0FzeW5jQWN0aW9uKCk7CiAgICB2YXIgYW5pbWF0aW9uRnJhbWVQcm92aWRlcl8xID0gcmVxdWlyZV9hbmltYXRpb25GcmFtZVByb3ZpZGVyKCk7CiAgICB2YXIgQW5pbWF0aW9uRnJhbWVBY3Rpb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFuaW1hdGlvbkZyYW1lQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uRnJhbWVBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgX3RoaXMud29yayA9IHdvcms7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIEFuaW1hdGlvbkZyYW1lQWN0aW9uMi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIGlkLCBkZWxheSkgewogICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZXIuYWN0aW9ucy5wdXNoKHRoaXMpOwogICAgICAgIHJldHVybiBzY2hlZHVsZXIuX3NjaGVkdWxlZCB8fCAoc2NoZWR1bGVyLl9zY2hlZHVsZWQgPSBhbmltYXRpb25GcmFtZVByb3ZpZGVyXzEuYW5pbWF0aW9uRnJhbWVQcm92aWRlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLmZsdXNoKHZvaWQgMCk7CiAgICAgICAgfSkpOwogICAgICB9OwogICAgICBBbmltYXRpb25GcmFtZUFjdGlvbjIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5ICE9IG51bGwgPyBkZWxheSA+IDAgOiB0aGlzLmRlbGF5ID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgKChfYSA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlkKSAhPT0gaWQpIHsKICAgICAgICAgIGFuaW1hdGlvbkZyYW1lUHJvdmlkZXJfMS5hbmltYXRpb25GcmFtZVByb3ZpZGVyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICAgIHNjaGVkdWxlci5fc2NoZWR1bGVkID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICByZXR1cm4gQW5pbWF0aW9uRnJhbWVBY3Rpb24yOwogICAgfShBc3luY0FjdGlvbl8xLkFzeW5jQWN0aW9uKTsKICAgIGV4cG9ydHMyLkFuaW1hdGlvbkZyYW1lQWN0aW9uID0gQW5pbWF0aW9uRnJhbWVBY3Rpb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLmpzCnZhciByZXF1aXJlX0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fZXh0ZW5kcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXh0ZW5kcyB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGQyLl9fcHJvdG9fXyA9IGIyOwogICAgICAgIH0gfHwgZnVuY3Rpb24oZDIsIGIyKSB7CiAgICAgICAgICBmb3IgKHZhciBwIGluIGIyKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIyLCBwKSkgZDJbcF0gPSBiMltwXTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gImZ1bmN0aW9uIiAmJiBiICE9PSBudWxsKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkOwogICAgICAgIH0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgIH07CiAgICB9KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyID0gdm9pZCAwOwogICAgdmFyIEFzeW5jU2NoZWR1bGVyXzEgPSByZXF1aXJlX0FzeW5jU2NoZWR1bGVyKCk7CiAgICB2YXIgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIyKCkgewogICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgfQogICAgICBBbmltYXRpb25GcmFtZVNjaGVkdWxlcjIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTsKICAgICAgICB2YXIgZmx1c2hJZCA9IHRoaXMuX3NjaGVkdWxlZDsKICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB2b2lkIDA7CiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7CiAgICAgICAgdmFyIGVycm9yOwogICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uaWQgPT09IGZsdXNoSWQgJiYgYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlICgoYWN0aW9uID0gYWN0aW9uc1swXSkgJiYgYWN0aW9uLmlkID09PSBmbHVzaElkICYmIGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyMjsKICAgIH0oQXN5bmNTY2hlZHVsZXJfMS5Bc3luY1NjaGVkdWxlcik7CiAgICBleHBvcnRzMi5BbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qcwp2YXIgcmVxdWlyZV9hbmltYXRpb25GcmFtZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYW5pbWF0aW9uRnJhbWUgPSBleHBvcnRzMi5hbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IHZvaWQgMDsKICAgIHZhciBBbmltYXRpb25GcmFtZUFjdGlvbl8xID0gcmVxdWlyZV9BbmltYXRpb25GcmFtZUFjdGlvbigpOwogICAgdmFyIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyXzEgPSByZXF1aXJlX0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKCk7CiAgICBleHBvcnRzMi5hbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IG5ldyBBbmltYXRpb25GcmFtZVNjaGVkdWxlcl8xLkFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKEFuaW1hdGlvbkZyYW1lQWN0aW9uXzEuQW5pbWF0aW9uRnJhbWVBY3Rpb24pOwogICAgZXhwb3J0czIuYW5pbWF0aW9uRnJhbWUgPSBleHBvcnRzMi5hbmltYXRpb25GcmFtZVNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvVmlydHVhbFRpbWVTY2hlZHVsZXIuanMKdmFyIHJlcXVpcmVfVmlydHVhbFRpbWVTY2hlZHVsZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZXIvVmlydHVhbFRpbWVTY2hlZHVsZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19leHRlbmRzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHRlbmRzIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAiZnVuY3Rpb24iICYmIGIgIT09IG51bGwpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYikgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgIGZ1bmN0aW9uIF9fKCkgewogICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgfTsKICAgIH0oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuVmlydHVhbEFjdGlvbiA9IGV4cG9ydHMyLlZpcnR1YWxUaW1lU2NoZWR1bGVyID0gdm9pZCAwOwogICAgdmFyIEFzeW5jQWN0aW9uXzEgPSByZXF1aXJlX0FzeW5jQWN0aW9uKCk7CiAgICB2YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlX1N1YnNjcmlwdGlvbigpOwogICAgdmFyIEFzeW5jU2NoZWR1bGVyXzEgPSByZXF1aXJlX0FzeW5jU2NoZWR1bGVyKCk7CiAgICB2YXIgVmlydHVhbFRpbWVTY2hlZHVsZXIgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFZpcnR1YWxUaW1lU2NoZWR1bGVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gVmlydHVhbFRpbWVTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG1heEZyYW1lcykgewogICAgICAgIGlmIChzY2hlZHVsZXJBY3Rpb25DdG9yID09PSB2b2lkIDApIHsKICAgICAgICAgIHNjaGVkdWxlckFjdGlvbkN0b3IgPSBWaXJ0dWFsQWN0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAobWF4RnJhbWVzID09PSB2b2lkIDApIHsKICAgICAgICAgIG1heEZyYW1lcyA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXJBY3Rpb25DdG9yLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5mcmFtZTsKICAgICAgICB9KSB8fCB0aGlzOwogICAgICAgIF90aGlzLm1heEZyYW1lcyA9IG1heEZyYW1lczsKICAgICAgICBfdGhpcy5mcmFtZSA9IDA7CiAgICAgICAgX3RoaXMuaW5kZXggPSAtMTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgVmlydHVhbFRpbWVTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYSA9IHRoaXMsIGFjdGlvbnMgPSBfYS5hY3Rpb25zLCBtYXhGcmFtZXMgPSBfYS5tYXhGcmFtZXM7CiAgICAgICAgdmFyIGVycm9yOwogICAgICAgIHZhciBhY3Rpb247CiAgICAgICAgd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uZGVsYXkgPD0gbWF4RnJhbWVzKSB7CiAgICAgICAgICBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgICB0aGlzLmZyYW1lID0gYWN0aW9uLmRlbGF5OwogICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFZpcnR1YWxUaW1lU2NoZWR1bGVyMi5mcmFtZVRpbWVGYWN0b3IgPSAxMDsKICAgICAgcmV0dXJuIFZpcnR1YWxUaW1lU2NoZWR1bGVyMjsKICAgIH0oQXN5bmNTY2hlZHVsZXJfMS5Bc3luY1NjaGVkdWxlcik7CiAgICBleHBvcnRzMi5WaXJ0dWFsVGltZVNjaGVkdWxlciA9IFZpcnR1YWxUaW1lU2NoZWR1bGVyOwogICAgdmFyIFZpcnR1YWxBY3Rpb24gPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFZpcnR1YWxBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBWaXJ0dWFsQWN0aW9uMihzY2hlZHVsZXIsIHdvcmssIGluZGV4KSB7CiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHsKICAgICAgICAgIGluZGV4ID0gc2NoZWR1bGVyLmluZGV4ICs9IDE7CiAgICAgICAgfQogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgX3RoaXMud29yayA9IHdvcms7CiAgICAgICAgX3RoaXMuaW5kZXggPSBpbmRleDsKICAgICAgICBfdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgIF90aGlzLmluZGV4ID0gc2NoZWR1bGVyLmluZGV4ID0gaW5kZXg7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFZpcnR1YWxBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheSkgewogICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZGVsYXkpKSB7CiAgICAgICAgICBpZiAoIXRoaXMuaWQpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuc2NoZWR1bGUuY2FsbCh0aGlzLCBzdGF0ZSwgZGVsYXkpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgIHZhciBhY3Rpb24gPSBuZXcgVmlydHVhbEFjdGlvbjIodGhpcy5zY2hlZHVsZXIsIHRoaXMud29yayk7CiAgICAgICAgICB0aGlzLmFkZChhY3Rpb24pOwogICAgICAgICAgcmV0dXJuIGFjdGlvbi5zY2hlZHVsZShzdGF0ZSwgZGVsYXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgICAgfTsKICAgICAgVmlydHVhbEFjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHsKICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkgPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLmRlbGF5ID0gc2NoZWR1bGVyLmZyYW1lICsgZGVsYXk7CiAgICAgICAgdmFyIGFjdGlvbnMgPSBzY2hlZHVsZXIuYWN0aW9uczsKICAgICAgICBhY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgYWN0aW9ucy5zb3J0KFZpcnR1YWxBY3Rpb24yLnNvcnRBY3Rpb25zKTsKICAgICAgICByZXR1cm4gMTsKICAgICAgfTsKICAgICAgVmlydHVhbEFjdGlvbjIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHsKICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICBWaXJ0dWFsQWN0aW9uMi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkpIHsKICAgICAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9leGVjdXRlLmNhbGwodGhpcywgc3RhdGUsIGRlbGF5KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFZpcnR1YWxBY3Rpb24yLnNvcnRBY3Rpb25zID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIGlmIChhLmRlbGF5ID09PSBiLmRlbGF5KSB7CiAgICAgICAgICBpZiAoYS5pbmRleCA9PT0gYi5pbmRleCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0gZWxzZSBpZiAoYS5pbmRleCA+IGIuaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhLmRlbGF5ID4gYi5kZWxheSkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBWaXJ0dWFsQWN0aW9uMjsKICAgIH0oQXN5bmNBY3Rpb25fMS5Bc3luY0FjdGlvbik7CiAgICBleHBvcnRzMi5WaXJ0dWFsQWN0aW9uID0gVmlydHVhbEFjdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2VtcHR5LmpzCnZhciByZXF1aXJlX2VtcHR5ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9lbXB0eS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZW1wdHkgPSBleHBvcnRzMi5FTVBUWSA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIGV4cG9ydHMyLkVNUFRZID0gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0pOwogICAgZnVuY3Rpb24gZW1wdHkoc2NoZWR1bGVyKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZXIgPyBlbXB0eVNjaGVkdWxlZChzY2hlZHVsZXIpIDogZXhwb3J0czIuRU1QVFk7CiAgICB9CiAgICBleHBvcnRzMi5lbXB0eSA9IGVtcHR5OwogICAgZnVuY3Rpb24gZW1wdHlTY2hlZHVsZWQoc2NoZWR1bGVyKSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzU2NoZWR1bGVyLmpzCnZhciByZXF1aXJlX2lzU2NoZWR1bGVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaXNTY2hlZHVsZXIgPSB2b2lkIDA7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBpc1NjaGVkdWxlcih2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgJiYgaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24odmFsdWUuc2NoZWR1bGUpOwogICAgfQogICAgZXhwb3J0czIuaXNTY2hlZHVsZXIgPSBpc1NjaGVkdWxlcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2FyZ3MuanMKdmFyIHJlcXVpcmVfYXJncyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvYXJncy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucG9wTnVtYmVyID0gZXhwb3J0czIucG9wU2NoZWR1bGVyID0gZXhwb3J0czIucG9wUmVzdWx0U2VsZWN0b3IgPSB2b2lkIDA7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICB2YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmVfaXNTY2hlZHVsZXIoKTsKICAgIGZ1bmN0aW9uIGxhc3QoYXJyKSB7CiAgICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdOwogICAgfQogICAgZnVuY3Rpb24gcG9wUmVzdWx0U2VsZWN0b3IoYXJncykgewogICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwOwogICAgfQogICAgZXhwb3J0czIucG9wUmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcjsKICAgIGZ1bmN0aW9uIHBvcFNjaGVkdWxlcihhcmdzKSB7CiAgICAgIHJldHVybiBpc1NjaGVkdWxlcl8xLmlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDsKICAgIH0KICAgIGV4cG9ydHMyLnBvcFNjaGVkdWxlciA9IHBvcFNjaGVkdWxlcjsKICAgIGZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSAibnVtYmVyIiA/IGFyZ3MucG9wKCkgOiBkZWZhdWx0VmFsdWU7CiAgICB9CiAgICBleHBvcnRzMi5wb3BOdW1iZXIgPSBwb3BOdW1iZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9pc0FycmF5TGlrZS5qcwp2YXIgcmVxdWlyZV9pc0FycmF5TGlrZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzQXJyYXlMaWtlID0gdm9pZCAwOwogICAgZXhwb3J0czIuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiB4ICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gIm51bWJlciIgJiYgdHlwZW9mIHggIT09ICJmdW5jdGlvbiI7CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNQcm9taXNlLmpzCnZhciByZXF1aXJlX2lzUHJvbWlzZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNQcm9taXNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pc1Byb21pc2UgPSB2b2lkIDA7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS50aGVuKTsKICAgIH0KICAgIGV4cG9ydHMyLmlzUHJvbWlzZSA9IGlzUHJvbWlzZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMKdmFyIHJlcXVpcmVfaXNJbnRlcm9wT2JzZXJ2YWJsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNJbnRlcm9wT2JzZXJ2YWJsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaXNJbnRlcm9wT2JzZXJ2YWJsZSA9IHZvaWQgMDsKICAgIHZhciBvYnNlcnZhYmxlXzEgPSByZXF1aXJlX29ic2VydmFibGUoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIGZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKGlucHV0W29ic2VydmFibGVfMS5vYnNlcnZhYmxlXSk7CiAgICB9CiAgICBleHBvcnRzMi5pc0ludGVyb3BPYnNlcnZhYmxlID0gaXNJbnRlcm9wT2JzZXJ2YWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcwp2YXIgcmVxdWlyZV9pc0FzeW5jSXRlcmFibGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaXNBc3luY0l0ZXJhYmxlID0gdm9pZCAwOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlKG9iaikgewogICAgICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7CiAgICB9CiAgICBleHBvcnRzMi5pc0FzeW5jSXRlcmFibGUgPSBpc0FzeW5jSXRlcmFibGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC90aHJvd1Vub2JzZXJ2YWJsZUVycm9yLmpzCnZhciByZXF1aXJlX3Rocm93VW5vYnNlcnZhYmxlRXJyb3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yID0gdm9pZCAwOwogICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IoaW5wdXQpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoIllvdSBwcm92aWRlZCAiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gIm9iamVjdCIgPyAiYW4gaW52YWxpZCBvYmplY3QiIDogIiciICsgaW5wdXQgKyAiJyIpICsgIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLiIpOwogICAgfQogICAgZXhwb3J0czIuY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IgPSBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zeW1ib2wvaXRlcmF0b3IuanMKdmFyIHJlcXVpcmVfaXRlcmF0b3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zeW1ib2wvaXRlcmF0b3IuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLml0ZXJhdG9yID0gZXhwb3J0czIuZ2V0U3ltYm9sSXRlcmF0b3IgPSB2b2lkIDA7CiAgICBmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHsKICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJmdW5jdGlvbiIgfHwgIVN5bWJvbC5pdGVyYXRvcikgewogICAgICAgIHJldHVybiAiQEBpdGVyYXRvciI7CiAgICAgIH0KICAgICAgcmV0dXJuIFN5bWJvbC5pdGVyYXRvcjsKICAgIH0KICAgIGV4cG9ydHMyLmdldFN5bWJvbEl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3I7CiAgICBleHBvcnRzMi5pdGVyYXRvciA9IGdldFN5bWJvbEl0ZXJhdG9yKCk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9pc0l0ZXJhYmxlLmpzCnZhciByZXF1aXJlX2lzSXRlcmFibGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzSXRlcmFibGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzSXRlcmFibGUgPSB2b2lkIDA7CiAgICB2YXIgaXRlcmF0b3JfMSA9IHJlcXVpcmVfaXRlcmF0b3IoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIGZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dFtpdGVyYXRvcl8xLml0ZXJhdG9yXSk7CiAgICB9CiAgICBleHBvcnRzMi5pc0l0ZXJhYmxlID0gaXNJdGVyYWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2lzUmVhZGFibGVTdHJlYW1MaWtlLmpzCnZhciByZXF1aXJlX2lzUmVhZGFibGVTdHJlYW1MaWtlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9pc1JlYWRhYmxlU3RyZWFtTGlrZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2dlbmVyYXRvciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHsKICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07CiAgICAgICAgcmV0dXJuIHRbMV07CiAgICAgIH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7CiAgICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSksIGc7CiAgICAgIGZ1bmN0aW9uIHZlcmIobikgewogICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7CiAgICAgICAgICByZXR1cm4gc3RlcChbbiwgdl0pOwogICAgICAgIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUgKF8pIHRyeSB7CiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIHQgPSBvcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBfLmxhYmVsKys7CiAgICAgICAgICAgICAgeSA9IG9wWzFdOwogICAgICAgICAgICAgIG9wID0gWzBdOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsKICAgICAgICAgICAgICAgIF8gPSAwOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHsKICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsKICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdOwogICAgICAgICAgICAgICAgdCA9IG9wOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7CiAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTsKICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBvcCA9IFs2LCBlXTsKICAgICAgICAgIHkgPSAwOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBmID0gdCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOwogICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07CiAgICAgIH0KICAgIH07CiAgICB2YXIgX19hd2FpdCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fYXdhaXQgfHwgZnVuY3Rpb24odikgewogICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTsKICAgIH07CiAgICB2YXIgX19hc3luY0dlbmVyYXRvciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fYXN5bmNHZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7CiAgICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdOwogICAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBpOwogICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHN0ZXAoZ1tuXSh2KSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgc2V0dGxlKHFbMF1bM10sIGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBzdGVwKHIpIHsKICAgICAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7CiAgICAgICAgcmVzdW1lKCJuZXh0IiwgdmFsdWUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgewogICAgICAgIHJlc3VtZSgidGhyb3ciLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsKICAgICAgICBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOwogICAgICB9CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pc1JlYWRhYmxlU3RyZWFtTGlrZSA9IGV4cG9ydHMyLnJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IgPSB2b2lkIDA7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKHJlYWRhYmxlU3RyZWFtKSB7CiAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcl8xKCkgewogICAgICAgIHZhciByZWFkZXIsIF9hLCB2YWx1ZSwgZG9uZTsKICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX2IpIHsKICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgICAgICAgICAgIF9iLmxhYmVsID0gMTsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgLCA5LCAxMF0pOwogICAgICAgICAgICAgIF9iLmxhYmVsID0gMjsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGlmIChmYWxzZSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgICAgICByZXR1cm4gWzQsIF9fYXdhaXQocmVhZGVyLnJlYWQoKSldOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCksIHZhbHVlID0gX2EudmFsdWUsIGRvbmUgPSBfYS5kb25lOwogICAgICAgICAgICAgIGlmICghZG9uZSkgcmV0dXJuIFszLCA1XTsKICAgICAgICAgICAgICByZXR1cm4gWzQsIF9fYXdhaXQodm9pZCAwKV07CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICByZXR1cm4gWzIsIF9iLnNlbnQoKV07CiAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICByZXR1cm4gWzQsIF9fYXdhaXQodmFsdWUpXTsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIHJldHVybiBbNCwgX2Iuc2VudCgpXTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgIF9iLnNlbnQoKTsKICAgICAgICAgICAgICByZXR1cm4gWzMsIDJdOwogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgcmV0dXJuIFszLCAxMF07CiAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTsKICAgICAgICAgICAgICByZXR1cm4gWzddOwogICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgIHJldHVybiBbMl07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIucmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvciA9IHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3I7CiAgICBmdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZShvYmopIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5nZXRSZWFkZXIpOwogICAgfQogICAgZXhwb3J0czIuaXNSZWFkYWJsZVN0cmVhbUxpa2UgPSBpc1JlYWRhYmxlU3RyZWFtTGlrZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcwp2YXIgcmVxdWlyZV9pbm5lckZyb20gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2F3YWl0ZXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24odGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7CiAgICAgICAgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIF9fZ2VuZXJhdG9yID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkgewogICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsKICAgICAgICByZXR1cm4gdFsxXTsKICAgICAgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsKICAgICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICJ0aHJvdyI6IHZlcmIoMSksICJyZXR1cm4iOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9KSwgZzsKICAgICAgZnVuY3Rpb24gdmVyYihuKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIHJldHVybiBzdGVwKFtuLCB2XSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbInJldHVybiJdIDogb3BbMF0gPyB5WyJ0aHJvdyJdIHx8ICgodCA9IHlbInJldHVybiJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDsKICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTsKICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgdCA9IG9wOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgXy5sYWJlbCsrOwogICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICB5ID0gb3BbMV07CiAgICAgICAgICAgICAgb3AgPSBbMF07CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgewogICAgICAgICAgICAgICAgXyA9IDA7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkgewogICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgewogICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07CiAgICAgICAgICAgICAgICB0ID0gb3A7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsKICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdOwogICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIG9wID0gWzYsIGVdOwogICAgICAgICAgeSA9IDA7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGYgPSB0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsKICAgICAgfQogICAgfTsKICAgIHZhciBfX2FzeW5jVmFsdWVzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19hc3luY1ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpOwogICAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSAiZnVuY3Rpb24iID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBpKTsKICAgICAgZnVuY3Rpb24gdmVyYihuKSB7CiAgICAgICAgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24odikgewogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsKICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgewogICAgICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYyKSB7CiAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHYyLCBkb25lOiBkIH0pOwogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZyb21SZWFkYWJsZVN0cmVhbUxpa2UgPSBleHBvcnRzMi5mcm9tQXN5bmNJdGVyYWJsZSA9IGV4cG9ydHMyLmZyb21JdGVyYWJsZSA9IGV4cG9ydHMyLmZyb21Qcm9taXNlID0gZXhwb3J0czIuZnJvbUFycmF5TGlrZSA9IGV4cG9ydHMyLmZyb21JbnRlcm9wT2JzZXJ2YWJsZSA9IGV4cG9ydHMyLmlubmVyRnJvbSA9IHZvaWQgMDsKICAgIHZhciBpc0FycmF5TGlrZV8xID0gcmVxdWlyZV9pc0FycmF5TGlrZSgpOwogICAgdmFyIGlzUHJvbWlzZV8xID0gcmVxdWlyZV9pc1Byb21pc2UoKTsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIHZhciBpc0ludGVyb3BPYnNlcnZhYmxlXzEgPSByZXF1aXJlX2lzSW50ZXJvcE9ic2VydmFibGUoKTsKICAgIHZhciBpc0FzeW5jSXRlcmFibGVfMSA9IHJlcXVpcmVfaXNBc3luY0l0ZXJhYmxlKCk7CiAgICB2YXIgdGhyb3dVbm9ic2VydmFibGVFcnJvcl8xID0gcmVxdWlyZV90aHJvd1Vub2JzZXJ2YWJsZUVycm9yKCk7CiAgICB2YXIgaXNJdGVyYWJsZV8xID0gcmVxdWlyZV9pc0l0ZXJhYmxlKCk7CiAgICB2YXIgaXNSZWFkYWJsZVN0cmVhbUxpa2VfMSA9IHJlcXVpcmVfaXNSZWFkYWJsZVN0cmVhbUxpa2UoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIHZhciByZXBvcnRVbmhhbmRsZWRFcnJvcl8xID0gcmVxdWlyZV9yZXBvcnRVbmhhbmRsZWRFcnJvcigpOwogICAgdmFyIG9ic2VydmFibGVfMSA9IHJlcXVpcmVfb2JzZXJ2YWJsZSgpOwogICAgZnVuY3Rpb24gaW5uZXJGcm9tKGlucHV0KSB7CiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSB7CiAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICB9CiAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGlzSW50ZXJvcE9ic2VydmFibGVfMS5pc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkgewogICAgICAgICAgcmV0dXJuIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0FycmF5TGlrZV8xLmlzQXJyYXlMaWtlKGlucHV0KSkgewogICAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UoaW5wdXQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNQcm9taXNlXzEuaXNQcm9taXNlKGlucHV0KSkgewogICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGlucHV0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQXN5bmNJdGVyYWJsZV8xLmlzQXN5bmNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBmcm9tQXN5bmNJdGVyYWJsZShpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0l0ZXJhYmxlXzEuaXNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBmcm9tSXRlcmFibGUoaW5wdXQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbUxpa2VfMS5pc1JlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBmcm9tUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgdGhyb3dVbm9ic2VydmFibGVFcnJvcl8xLmNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKICAgIH0KICAgIGV4cG9ydHMyLmlubmVyRnJvbSA9IGlubmVyRnJvbTsKICAgIGZ1bmN0aW9uIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShvYmopIHsKICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXzEub2JzZXJ2YWJsZV0oKTsKICAgICAgICBpZiAoaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ob2JzLnN1YnNjcmliZSkpIHsKICAgICAgICAgIHJldHVybiBvYnMuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmZyb21JbnRlcm9wT2JzZXJ2YWJsZSA9IGZyb21JbnRlcm9wT2JzZXJ2YWJsZTsKICAgIGZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHsKICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGggJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChhcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tQXJyYXlMaWtlID0gZnJvbUFycmF5TGlrZTsKICAgIGZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHsKICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgfSkudGhlbihudWxsLCByZXBvcnRVbmhhbmRsZWRFcnJvcl8xLnJlcG9ydFVuaGFuZGxlZEVycm9yKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tUHJvbWlzZSA9IGZyb21Qcm9taXNlOwogICAgZnVuY3Rpb24gZnJvbUl0ZXJhYmxlKGl0ZXJhYmxlKSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBlXzEsIF9hOwogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciBpdGVyYWJsZV8xID0gX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVyYWJsZV8xXzEudmFsdWU7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoaXRlcmFibGVfMV8xICYmICFpdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2EgPSBpdGVyYWJsZV8xLnJldHVybikpIF9hLmNhbGwoaXRlcmFibGVfMSk7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tSXRlcmFibGUgPSBmcm9tSXRlcmFibGU7CiAgICBmdW5jdGlvbiBmcm9tQXN5bmNJdGVyYWJsZShhc3luY0l0ZXJhYmxlKSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHByb2Nlc3MyKGFzeW5jSXRlcmFibGUsIHN1YnNjcmliZXIpLmNhdGNoKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tQXN5bmNJdGVyYWJsZSA9IGZyb21Bc3luY0l0ZXJhYmxlOwogICAgZnVuY3Rpb24gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZShyZWFkYWJsZVN0cmVhbSkgewogICAgICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUoaXNSZWFkYWJsZVN0cmVhbUxpa2VfMS5yZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKHJlYWRhYmxlU3RyZWFtKSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tUmVhZGFibGVTdHJlYW1MaWtlID0gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZTsKICAgIGZ1bmN0aW9uIHByb2Nlc3MyKGFzeW5jSXRlcmFibGUsIHN1YnNjcmliZXIpIHsKICAgICAgdmFyIGFzeW5jSXRlcmFibGVfMSwgYXN5bmNJdGVyYWJsZV8xXzE7CiAgICAgIHZhciBlXzIsIF9hOwogICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUsIGVfMl8xOwogICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikgewogICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFswLCA1LCA2LCAxMV0pOwogICAgICAgICAgICAgIGFzeW5jSXRlcmFibGVfMSA9IF9fYXN5bmNWYWx1ZXMoYXN5bmNJdGVyYWJsZSk7CiAgICAgICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgcmV0dXJuIFs0LCBhc3luY0l0ZXJhYmxlXzEubmV4dCgpXTsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGlmICghKGFzeW5jSXRlcmFibGVfMV8xID0gX2Iuc2VudCgpLCAhYXN5bmNJdGVyYWJsZV8xXzEuZG9uZSkpIHJldHVybiBbMywgNF07CiAgICAgICAgICAgICAgdmFsdWUgPSBhc3luY0l0ZXJhYmxlXzFfMS52YWx1ZTsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX2IubGFiZWwgPSAzOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgcmV0dXJuIFszLCAxXTsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIHJldHVybiBbMywgMTFdOwogICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgZV8yXzEgPSBfYi5zZW50KCk7CiAgICAgICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICAgICAgICByZXR1cm4gWzMsIDExXTsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbNiwgLCA5LCAxMF0pOwogICAgICAgICAgICAgIGlmICghKGFzeW5jSXRlcmFibGVfMV8xICYmICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGFzeW5jSXRlcmFibGVfMS5yZXR1cm4pKSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgICAgICByZXR1cm4gWzQsIF9hLmNhbGwoYXN5bmNJdGVyYWJsZV8xKV07CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICBfYi5zZW50KCk7CiAgICAgICAgICAgICAgX2IubGFiZWwgPSA4OwogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgcmV0dXJuIFszLCAxMF07CiAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7CiAgICAgICAgICAgICAgcmV0dXJuIFs3XTsKICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICByZXR1cm4gWzddOwogICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICByZXR1cm4gWzJdOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcwp2YXIgcmVxdWlyZV9leGVjdXRlU2NoZWR1bGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZXhlY3V0ZVNjaGVkdWxlID0gdm9pZCAwOwogICAgZnVuY3Rpb24gZXhlY3V0ZVNjaGVkdWxlKHBhcmVudFN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCB3b3JrLCBkZWxheSwgcmVwZWF0KSB7CiAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGVsYXkgPSAwOwogICAgICB9CiAgICAgIGlmIChyZXBlYXQgPT09IHZvaWQgMCkgewogICAgICAgIHJlcGVhdCA9IGZhbHNlOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZVN1YnNjcmlwdGlvbiA9IHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgICB3b3JrKCk7CiAgICAgICAgaWYgKHJlcGVhdCkgewogICAgICAgICAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNjaGVkdWxlKG51bGwsIGRlbGF5KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgIH0sIGRlbGF5KTsKICAgICAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7CiAgICAgIGlmICghcmVwZWF0KSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uOwogICAgICB9CiAgICB9CiAgICBleHBvcnRzMi5leGVjdXRlU2NoZWR1bGUgPSBleGVjdXRlU2NoZWR1bGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL29ic2VydmVPbi5qcwp2YXIgcmVxdWlyZV9vYnNlcnZlT24gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5vYnNlcnZlT24gPSB2b2lkIDA7CiAgICB2YXIgZXhlY3V0ZVNjaGVkdWxlXzEgPSByZXF1aXJlX2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIG9ic2VydmVPbihzY2hlZHVsZXIsIGRlbGF5KSB7CiAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGVsYXkgPSAwOwogICAgICB9CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZV8xLmV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgIH0sIGRlbGF5KTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGVfMS5leGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0sIGRlbGF5KTsKICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGVfMS5leGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgIH0sIGRlbGF5KTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIub2JzZXJ2ZU9uID0gb2JzZXJ2ZU9uOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zdWJzY3JpYmVPbi5qcwp2YXIgcmVxdWlyZV9zdWJzY3JpYmVPbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zdWJzY3JpYmVPbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc3Vic2NyaWJlT24gPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICBmdW5jdGlvbiBzdWJzY3JpYmVPbihzY2hlZHVsZXIsIGRlbGF5KSB7CiAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGVsYXkgPSAwOwogICAgICB9CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9LCBkZWxheSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnN1YnNjcmliZU9uID0gc3Vic2NyaWJlT247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlT2JzZXJ2YWJsZS5qcwp2YXIgcmVxdWlyZV9zY2hlZHVsZU9ic2VydmFibGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVPYnNlcnZhYmxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zY2hlZHVsZU9ic2VydmFibGUgPSB2b2lkIDA7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIG9ic2VydmVPbl8xID0gcmVxdWlyZV9vYnNlcnZlT24oKTsKICAgIHZhciBzdWJzY3JpYmVPbl8xID0gcmVxdWlyZV9zdWJzY3JpYmVPbigpOwogICAgZnVuY3Rpb24gc2NoZWR1bGVPYnNlcnZhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgICAgcmV0dXJuIGlubmVyRnJvbV8xLmlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbl8xLnN1YnNjcmliZU9uKHNjaGVkdWxlciksIG9ic2VydmVPbl8xLm9ic2VydmVPbihzY2hlZHVsZXIpKTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVkdWxlT2JzZXJ2YWJsZSA9IHNjaGVkdWxlT2JzZXJ2YWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVQcm9taXNlLmpzCnZhciByZXF1aXJlX3NjaGVkdWxlUHJvbWlzZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVByb21pc2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnNjaGVkdWxlUHJvbWlzZSA9IHZvaWQgMDsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgb2JzZXJ2ZU9uXzEgPSByZXF1aXJlX29ic2VydmVPbigpOwogICAgdmFyIHN1YnNjcmliZU9uXzEgPSByZXF1aXJlX3N1YnNjcmliZU9uKCk7CiAgICBmdW5jdGlvbiBzY2hlZHVsZVByb21pc2UoaW5wdXQsIHNjaGVkdWxlcikgewogICAgICByZXR1cm4gaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGlucHV0KS5waXBlKHN1YnNjcmliZU9uXzEuc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uXzEub2JzZXJ2ZU9uKHNjaGVkdWxlcikpOwogICAgfQogICAgZXhwb3J0czIuc2NoZWR1bGVQcm9taXNlID0gc2NoZWR1bGVQcm9taXNlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFycmF5LmpzCnZhciByZXF1aXJlX3NjaGVkdWxlQXJyYXkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2NoZWR1bGVBcnJheSA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChpID09PSBpbnB1dC5sZW5ndGgpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2krK10pOwogICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuc2NoZWR1bGVBcnJheSA9IHNjaGVkdWxlQXJyYXk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlSXRlcmFibGUuanMKdmFyIHJlcXVpcmVfc2NoZWR1bGVJdGVyYWJsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zY2hlZHVsZUl0ZXJhYmxlID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGl0ZXJhdG9yXzEgPSByZXF1aXJlX2l0ZXJhdG9yKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICB2YXIgZXhlY3V0ZVNjaGVkdWxlXzEgPSByZXF1aXJlX2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgZnVuY3Rpb24gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBpdGVyYXRvcjsKICAgICAgICBleGVjdXRlU2NoZWR1bGVfMS5leGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGl0ZXJhdG9yID0gaW5wdXRbaXRlcmF0b3JfMS5pdGVyYXRvcl0oKTsKICAgICAgICAgIGV4ZWN1dGVTY2hlZHVsZV8xLmV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIHZhciB2YWx1ZTsKICAgICAgICAgICAgdmFyIGRvbmU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgX2EgPSBpdGVyYXRvci5uZXh0KCksIHZhbHVlID0gX2EudmFsdWUsIGRvbmUgPSBfYS5kb25lOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb25lKSB7CiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDAsIHRydWUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihpdGVyYXRvciA9PT0gbnVsbCB8fCBpdGVyYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IucmV0dXJuKSAmJiBpdGVyYXRvci5yZXR1cm4oKTsKICAgICAgICB9OwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVkdWxlSXRlcmFibGUgPSBzY2hlZHVsZUl0ZXJhYmxlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFzeW5jSXRlcmFibGUuanMKdmFyIHJlcXVpcmVfc2NoZWR1bGVBc3luY0l0ZXJhYmxlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2NoZWR1bGVBc3luY0l0ZXJhYmxlID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGV4ZWN1dGVTY2hlZHVsZV8xID0gcmVxdWlyZV9leGVjdXRlU2NoZWR1bGUoKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgIGlmICghaW5wdXQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgZXhlY3V0ZVNjaGVkdWxlXzEuZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpbnB1dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTsKICAgICAgICAgIGV4ZWN1dGVTY2hlZHVsZV8xLmV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpdGVyYXRvci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDAsIHRydWUpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVkdWxlQXN5bmNJdGVyYWJsZSA9IHNjaGVkdWxlQXN5bmNJdGVyYWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UuanMKdmFyIHJlcXVpcmVfc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlID0gdm9pZCAwOwogICAgdmFyIHNjaGVkdWxlQXN5bmNJdGVyYWJsZV8xID0gcmVxdWlyZV9zY2hlZHVsZUFzeW5jSXRlcmFibGUoKTsKICAgIHZhciBpc1JlYWRhYmxlU3RyZWFtTGlrZV8xID0gcmVxdWlyZV9pc1JlYWRhYmxlU3RyZWFtTGlrZSgpOwogICAgZnVuY3Rpb24gc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQsIHNjaGVkdWxlcikgewogICAgICByZXR1cm4gc2NoZWR1bGVBc3luY0l0ZXJhYmxlXzEuc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlzUmVhZGFibGVTdHJlYW1MaWtlXzEucmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihpbnB1dCksIHNjaGVkdWxlcik7CiAgICB9CiAgICBleHBvcnRzMi5zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZSA9IHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZWQuanMKdmFyIHJlcXVpcmVfc2NoZWR1bGVkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlZC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2NoZWR1bGVkID0gdm9pZCAwOwogICAgdmFyIHNjaGVkdWxlT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9zY2hlZHVsZU9ic2VydmFibGUoKTsKICAgIHZhciBzY2hlZHVsZVByb21pc2VfMSA9IHJlcXVpcmVfc2NoZWR1bGVQcm9taXNlKCk7CiAgICB2YXIgc2NoZWR1bGVBcnJheV8xID0gcmVxdWlyZV9zY2hlZHVsZUFycmF5KCk7CiAgICB2YXIgc2NoZWR1bGVJdGVyYWJsZV8xID0gcmVxdWlyZV9zY2hlZHVsZUl0ZXJhYmxlKCk7CiAgICB2YXIgc2NoZWR1bGVBc3luY0l0ZXJhYmxlXzEgPSByZXF1aXJlX3NjaGVkdWxlQXN5bmNJdGVyYWJsZSgpOwogICAgdmFyIGlzSW50ZXJvcE9ic2VydmFibGVfMSA9IHJlcXVpcmVfaXNJbnRlcm9wT2JzZXJ2YWJsZSgpOwogICAgdmFyIGlzUHJvbWlzZV8xID0gcmVxdWlyZV9pc1Byb21pc2UoKTsKICAgIHZhciBpc0FycmF5TGlrZV8xID0gcmVxdWlyZV9pc0FycmF5TGlrZSgpOwogICAgdmFyIGlzSXRlcmFibGVfMSA9IHJlcXVpcmVfaXNJdGVyYWJsZSgpOwogICAgdmFyIGlzQXN5bmNJdGVyYWJsZV8xID0gcmVxdWlyZV9pc0FzeW5jSXRlcmFibGUoKTsKICAgIHZhciB0aHJvd1Vub2JzZXJ2YWJsZUVycm9yXzEgPSByZXF1aXJlX3Rocm93VW5vYnNlcnZhYmxlRXJyb3IoKTsKICAgIHZhciBpc1JlYWRhYmxlU3RyZWFtTGlrZV8xID0gcmVxdWlyZV9pc1JlYWRhYmxlU3RyZWFtTGlrZSgpOwogICAgdmFyIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlXzEgPSByZXF1aXJlX3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKCk7CiAgICBmdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikgewogICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlXzEuaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBzY2hlZHVsZU9ic2VydmFibGVfMS5zY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGlmIChpc0FycmF5TGlrZV8xLmlzQXJyYXlMaWtlKGlucHV0KSkgewogICAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXlfMS5zY2hlZHVsZUFycmF5KGlucHV0LCBzY2hlZHVsZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNQcm9taXNlXzEuaXNQcm9taXNlKGlucHV0KSkgewogICAgICAgICAgcmV0dXJuIHNjaGVkdWxlUHJvbWlzZV8xLnNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQXN5bmNJdGVyYWJsZV8xLmlzQXN5bmNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGVfMS5zY2hlZHVsZUFzeW5jSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGlmIChpc0l0ZXJhYmxlXzEuaXNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgICAgIHJldHVybiBzY2hlZHVsZUl0ZXJhYmxlXzEuc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlXzEuaXNSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpKSB7CiAgICAgICAgICByZXR1cm4gc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2VfMS5zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgdGhyb3dVbm9ic2VydmFibGVFcnJvcl8xLmNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKICAgIH0KICAgIGV4cG9ydHMyLnNjaGVkdWxlZCA9IHNjaGVkdWxlZDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanMKdmFyIHJlcXVpcmVfZnJvbSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvZnJvbS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZnJvbSA9IHZvaWQgMDsKICAgIHZhciBzY2hlZHVsZWRfMSA9IHJlcXVpcmVfc2NoZWR1bGVkKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZXIgPyBzY2hlZHVsZWRfMS5zY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikgOiBpbm5lckZyb21fMS5pbm5lckZyb20oaW5wdXQpOwogICAgfQogICAgZXhwb3J0czIuZnJvbSA9IGZyb207CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZi5qcwp2YXIgcmVxdWlyZV9vZiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvb2YuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm9mID0gdm9pZCAwOwogICAgdmFyIGFyZ3NfMSA9IHJlcXVpcmVfYXJncygpOwogICAgdmFyIGZyb21fMSA9IHJlcXVpcmVfZnJvbSgpOwogICAgZnVuY3Rpb24gb2YoKSB7CiAgICAgIHZhciBhcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZXIgPSBhcmdzXzEucG9wU2NoZWR1bGVyKGFyZ3MpOwogICAgICByZXR1cm4gZnJvbV8xLmZyb20oYXJncywgc2NoZWR1bGVyKTsKICAgIH0KICAgIGV4cG9ydHMyLm9mID0gb2Y7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aHJvd0Vycm9yLmpzCnZhciByZXF1aXJlX3Rocm93RXJyb3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3Rocm93RXJyb3IuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRocm93RXJyb3IgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiB0aHJvd0Vycm9yKGVycm9yT3JFcnJvckZhY3RvcnksIHNjaGVkdWxlcikgewogICAgICB2YXIgZXJyb3JGYWN0b3J5ID0gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24oZXJyb3JPckVycm9yRmFjdG9yeSkgPyBlcnJvck9yRXJyb3JGYWN0b3J5IDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGVycm9yT3JFcnJvckZhY3Rvcnk7CiAgICAgIH07CiAgICAgIHZhciBpbml0ID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycm9yRmFjdG9yeSgpKTsKICAgICAgfTsKICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShzY2hlZHVsZXIgPyBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShpbml0LCAwLCBzdWJzY3JpYmVyKTsKICAgICAgfSA6IGluaXQpOwogICAgfQogICAgZXhwb3J0czIudGhyb3dFcnJvciA9IHRocm93RXJyb3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvTm90aWZpY2F0aW9uLmpzCnZhciByZXF1aXJlX05vdGlmaWNhdGlvbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL05vdGlmaWNhdGlvbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIub2JzZXJ2ZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMyLk5vdGlmaWNhdGlvbiA9IGV4cG9ydHMyLk5vdGlmaWNhdGlvbktpbmQgPSB2b2lkIDA7CiAgICB2YXIgZW1wdHlfMSA9IHJlcXVpcmVfZW1wdHkoKTsKICAgIHZhciBvZl8xID0gcmVxdWlyZV9vZigpOwogICAgdmFyIHRocm93RXJyb3JfMSA9IHJlcXVpcmVfdGhyb3dFcnJvcigpOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgdmFyIE5vdGlmaWNhdGlvbktpbmQ7CiAgICAoZnVuY3Rpb24oTm90aWZpY2F0aW9uS2luZDIpIHsKICAgICAgTm90aWZpY2F0aW9uS2luZDJbIk5FWFQiXSA9ICJOIjsKICAgICAgTm90aWZpY2F0aW9uS2luZDJbIkVSUk9SIl0gPSAiRSI7CiAgICAgIE5vdGlmaWNhdGlvbktpbmQyWyJDT01QTEVURSJdID0gIkMiOwogICAgfSkoTm90aWZpY2F0aW9uS2luZCA9IGV4cG9ydHMyLk5vdGlmaWNhdGlvbktpbmQgfHwgKGV4cG9ydHMyLk5vdGlmaWNhdGlvbktpbmQgPSB7fSkpOwogICAgdmFyIE5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBOb3RpZmljYXRpb24yKGtpbmQsIHZhbHVlLCBlcnJvcikgewogICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0ga2luZCA9PT0gIk4iOwogICAgICB9CiAgICAgIE5vdGlmaWNhdGlvbjIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbihvYnNlcnZlcikgewogICAgICAgIHJldHVybiBvYnNlcnZlTm90aWZpY2F0aW9uKHRoaXMsIG9ic2VydmVyKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5wcm90b3R5cGUuZG8gPSBmdW5jdGlvbihuZXh0SGFuZGxlciwgZXJyb3JIYW5kbGVyLCBjb21wbGV0ZUhhbmRsZXIpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBraW5kID0gX2Eua2luZCwgdmFsdWUgPSBfYS52YWx1ZSwgZXJyb3IgPSBfYS5lcnJvcjsKICAgICAgICByZXR1cm4ga2luZCA9PT0gIk4iID8gbmV4dEhhbmRsZXIgPT09IG51bGwgfHwgbmV4dEhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5leHRIYW5kbGVyKHZhbHVlKSA6IGtpbmQgPT09ICJFIiA/IGVycm9ySGFuZGxlciA9PT0gbnVsbCB8fCBlcnJvckhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9ySGFuZGxlcihlcnJvcikgOiBjb21wbGV0ZUhhbmRsZXIgPT09IG51bGwgfHwgY29tcGxldGVIYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wbGV0ZUhhbmRsZXIoKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24oKF9hID0gbmV4dE9yT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uZXh0KSA/IHRoaXMub2JzZXJ2ZShuZXh0T3JPYnNlcnZlcikgOiB0aGlzLmRvKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLnByb3RvdHlwZS50b09ic2VydmFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCBraW5kID0gX2Eua2luZCwgdmFsdWUgPSBfYS52YWx1ZSwgZXJyb3IgPSBfYS5lcnJvcjsKICAgICAgICB2YXIgcmVzdWx0ID0ga2luZCA9PT0gIk4iID8gb2ZfMS5vZih2YWx1ZSkgOiBraW5kID09PSAiRSIgPyB0aHJvd0Vycm9yXzEudGhyb3dFcnJvcihmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9KSA6IGtpbmQgPT09ICJDIiA/IGVtcHR5XzEuRU1QVFkgOiAwOwogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIG5vdGlmaWNhdGlvbiBraW5kICIgKyBraW5kKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5jcmVhdGVOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbjIoIk4iLCB2YWx1ZSk7CiAgICAgIH07CiAgICAgIE5vdGlmaWNhdGlvbjIuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbjIoIkUiLCB2b2lkIDAsIGVycik7CiAgICAgIH07CiAgICAgIE5vdGlmaWNhdGlvbjIuY3JlYXRlQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTm90aWZpY2F0aW9uMi5jb21wbGV0ZU5vdGlmaWNhdGlvbjsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5jb21wbGV0ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24yKCJDIik7CiAgICAgIHJldHVybiBOb3RpZmljYXRpb24yOwogICAgfSgpOwogICAgZXhwb3J0czIuTm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uOwogICAgZnVuY3Rpb24gb2JzZXJ2ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG9ic2VydmVyKSB7CiAgICAgIHZhciBfYSwgX2IsIF9jOwogICAgICB2YXIgX2QgPSBub3RpZmljYXRpb24sIGtpbmQgPSBfZC5raW5kLCB2YWx1ZSA9IF9kLnZhbHVlLCBlcnJvciA9IF9kLmVycm9yOwogICAgICBpZiAodHlwZW9mIGtpbmQgIT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBub3RpZmljYXRpb24sIG1pc3NpbmcgImtpbmQiJyk7CiAgICAgIH0KICAgICAga2luZCA9PT0gIk4iID8gKF9hID0gb2JzZXJ2ZXIubmV4dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKSA6IGtpbmQgPT09ICJFIiA/IChfYiA9IG9ic2VydmVyLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChvYnNlcnZlciwgZXJyb3IpIDogKF9jID0gb2JzZXJ2ZXIuY29tcGxldGUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jYWxsKG9ic2VydmVyKTsKICAgIH0KICAgIGV4cG9ydHMyLm9ic2VydmVOb3RpZmljYXRpb24gPSBvYnNlcnZlTm90aWZpY2F0aW9uOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNPYnNlcnZhYmxlLmpzCnZhciByZXF1aXJlX2lzT2JzZXJ2YWJsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNPYnNlcnZhYmxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pc09ic2VydmFibGUgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBpc09ic2VydmFibGUob2JqKSB7CiAgICAgIHJldHVybiAhIW9iaiAmJiAob2JqIGluc3RhbmNlb2YgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUgfHwgaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ob2JqLmxpZnQpICYmIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKG9iai5zdWJzY3JpYmUpKTsKICAgIH0KICAgIGV4cG9ydHMyLmlzT2JzZXJ2YWJsZSA9IGlzT2JzZXJ2YWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL0VtcHR5RXJyb3IuanMKdmFyIHJlcXVpcmVfRW1wdHlFcnJvciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvRW1wdHlFcnJvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuRW1wdHlFcnJvciA9IHZvaWQgMDsKICAgIHZhciBjcmVhdGVFcnJvckNsYXNzXzEgPSByZXF1aXJlX2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIGV4cG9ydHMyLkVtcHR5RXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzXzEuY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIEVtcHR5RXJyb3JJbXBsKCkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiRW1wdHlFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gIm5vIGVsZW1lbnRzIGluIHNlcXVlbmNlIjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL2xhc3RWYWx1ZUZyb20uanMKdmFyIHJlcXVpcmVfbGFzdFZhbHVlRnJvbSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL2xhc3RWYWx1ZUZyb20uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmxhc3RWYWx1ZUZyb20gPSB2b2lkIDA7CiAgICB2YXIgRW1wdHlFcnJvcl8xID0gcmVxdWlyZV9FbXB0eUVycm9yKCk7CiAgICBmdW5jdGlvbiBsYXN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnKSB7CiAgICAgIHZhciBoYXNDb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAib2JqZWN0IjsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciBfaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB2YXIgX3ZhbHVlOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoewogICAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIF9oYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgZXJyb3I6IHJlamVjdCwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKF9oYXNWYWx1ZSkgewogICAgICAgICAgICAgIHJlc29sdmUoX3ZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDb25maWcpIHsKICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZy5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlamVjdChuZXcgRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3IoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5sYXN0VmFsdWVGcm9tID0gbGFzdFZhbHVlRnJvbTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9maXJzdFZhbHVlRnJvbS5qcwp2YXIgcmVxdWlyZV9maXJzdFZhbHVlRnJvbSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL2ZpcnN0VmFsdWVGcm9tLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5maXJzdFZhbHVlRnJvbSA9IHZvaWQgMDsKICAgIHZhciBFbXB0eUVycm9yXzEgPSByZXF1aXJlX0VtcHR5RXJyb3IoKTsKICAgIHZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlX1N1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIGZpcnN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnKSB7CiAgICAgIHZhciBoYXNDb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAib2JqZWN0IjsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFN1YnNjcmliZXJfMS5TYWZlU3Vic2NyaWJlcih7CiAgICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICByZXNvbHZlKHZhbHVlKTsKICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgfSwKICAgICAgICAgIGVycm9yOiByZWplY3QsCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChoYXNDb25maWcpIHsKICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZy5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlamVjdChuZXcgRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3IoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmZpcnN0VmFsdWVGcm9tID0gZmlyc3RWYWx1ZUZyb207CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvci5qcwp2YXIgcmVxdWlyZV9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yID0gdm9pZCAwOwogICAgdmFyIGNyZWF0ZUVycm9yQ2xhc3NfMSA9IHJlcXVpcmVfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgZXhwb3J0czIuQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzXzEuY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbCgpIHsKICAgICAgICBfc3VwZXIodGhpcyk7CiAgICAgICAgdGhpcy5uYW1lID0gIkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yIjsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvTm90Rm91bmRFcnJvci5qcwp2YXIgcmVxdWlyZV9Ob3RGb3VuZEVycm9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9Ob3RGb3VuZEVycm9yLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5Ob3RGb3VuZEVycm9yID0gdm9pZCAwOwogICAgdmFyIGNyZWF0ZUVycm9yQ2xhc3NfMSA9IHJlcXVpcmVfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgZXhwb3J0czIuTm90Rm91bmRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3NfMS5jcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gTm90Rm91bmRFcnJvckltcGwobWVzc2FnZSkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiTm90Rm91bmRFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvU2VxdWVuY2VFcnJvci5qcwp2YXIgcmVxdWlyZV9TZXF1ZW5jZUVycm9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9TZXF1ZW5jZUVycm9yLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5TZXF1ZW5jZUVycm9yID0gdm9pZCAwOwogICAgdmFyIGNyZWF0ZUVycm9yQ2xhc3NfMSA9IHJlcXVpcmVfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgZXhwb3J0czIuU2VxdWVuY2VFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3NfMS5jcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gU2VxdWVuY2VFcnJvckltcGwobWVzc2FnZSkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiU2VxdWVuY2VFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNEYXRlLmpzCnZhciByZXF1aXJlX2lzRGF0ZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvaXNEYXRlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5pc1ZhbGlkRGF0ZSA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlKTsKICAgIH0KICAgIGV4cG9ydHMyLmlzVmFsaWREYXRlID0gaXNWYWxpZERhdGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXQuanMKdmFyIHJlcXVpcmVfdGltZW91dCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aW1lb3V0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi50aW1lb3V0ID0gZXhwb3J0czIuVGltZW91dEVycm9yID0gdm9pZCAwOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICB2YXIgaXNEYXRlXzEgPSByZXF1aXJlX2lzRGF0ZSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBjcmVhdGVFcnJvckNsYXNzXzEgPSByZXF1aXJlX2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgZXhlY3V0ZVNjaGVkdWxlXzEgPSByZXF1aXJlX2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgZXhwb3J0czIuVGltZW91dEVycm9yID0gY3JlYXRlRXJyb3JDbGFzc18xLmNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBUaW1lb3V0RXJyb3JJbXBsKGluZm8pIHsKICAgICAgICBpZiAoaW5mbyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpbmZvID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICJUaW1lb3V0IGhhcyBvY2N1cnJlZCI7CiAgICAgICAgdGhpcy5uYW1lID0gIlRpbWVvdXRFcnJvciI7CiAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKICAgICAgfTsKICAgIH0pOwogICAgZnVuY3Rpb24gdGltZW91dChjb25maWcsIHNjaGVkdWxlckFyZykgewogICAgICB2YXIgX2EgPSBpc0RhdGVfMS5pc1ZhbGlkRGF0ZShjb25maWcpID8geyBmaXJzdDogY29uZmlnIH0gOiB0eXBlb2YgY29uZmlnID09PSAibnVtYmVyIiA/IHsgZWFjaDogY29uZmlnIH0gOiBjb25maWcsIGZpcnN0ID0gX2EuZmlyc3QsIGVhY2ggPSBfYS5lYWNoLCBfYiA9IF9hLndpdGgsIF93aXRoID0gX2IgPT09IHZvaWQgMCA/IHRpbWVvdXRFcnJvckZhY3RvcnkgOiBfYiwgX2MgPSBfYS5zY2hlZHVsZXIsIHNjaGVkdWxlciA9IF9jID09PSB2b2lkIDAgPyBzY2hlZHVsZXJBcmcgIT09IG51bGwgJiYgc2NoZWR1bGVyQXJnICE9PSB2b2lkIDAgPyBzY2hlZHVsZXJBcmcgOiBhc3luY18xLmFzeW5jU2NoZWR1bGVyIDogX2MsIF9kID0gX2EubWV0YSwgbWV0YSA9IF9kID09PSB2b2lkIDAgPyBudWxsIDogX2Q7CiAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIGVhY2ggPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk5vIHRpbWVvdXQgcHJvdmlkZWQuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbjsKICAgICAgICB2YXIgdGltZXJTdWJzY3JpcHRpb247CiAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdmFyIHNlZW4gPSAwOwogICAgICAgIHZhciBzdGFydFRpbWVyID0gZnVuY3Rpb24oZGVsYXkpIHsKICAgICAgICAgIHRpbWVyU3Vic2NyaXB0aW9uID0gZXhlY3V0ZVNjaGVkdWxlXzEuZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oX3dpdGgoewogICAgICAgICAgICAgICAgbWV0YSwKICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSwKICAgICAgICAgICAgICAgIHNlZW4KICAgICAgICAgICAgICB9KSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIGRlbGF5KTsKICAgICAgICB9OwogICAgICAgIG9yaWdpbmFsU291cmNlU3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHRpbWVyU3Vic2NyaXB0aW9uID09PSBudWxsIHx8IHRpbWVyU3Vic2NyaXB0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgc2VlbisrOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGxhc3RWYWx1ZSA9IHZhbHVlKTsKICAgICAgICAgIGVhY2ggPiAwICYmIHN0YXJ0VGltZXIoZWFjaCk7CiAgICAgICAgfSwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCEodGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkpIHsKICAgICAgICAgICAgdGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgICAgIH0pKTsKICAgICAgICAhc2VlbiAmJiBzdGFydFRpbWVyKGZpcnN0ICE9IG51bGwgPyB0eXBlb2YgZmlyc3QgPT09ICJudW1iZXIiID8gZmlyc3QgOiArZmlyc3QgLSBzY2hlZHVsZXIubm93KCkgOiBlYWNoKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi50aW1lb3V0ID0gdGltZW91dDsKICAgIGZ1bmN0aW9uIHRpbWVvdXRFcnJvckZhY3RvcnkoaW5mbykgewogICAgICB0aHJvdyBuZXcgZXhwb3J0czIuVGltZW91dEVycm9yKGluZm8pOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tYXAuanMKdmFyIHJlcXVpcmVfbWFwID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21hcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWFwID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIG1hcChwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocHJvamVjdC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSk7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLm1hcCA9IG1hcDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL21hcE9uZU9yTWFueUFyZ3MuanMKdmFyIHJlcXVpcmVfbWFwT25lT3JNYW55QXJncyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWFwT25lT3JNYW55QXJncyA9IHZvaWQgMDsKICAgIHZhciBtYXBfMSA9IHJlcXVpcmVfbWFwKCk7CiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CiAgICBmdW5jdGlvbiBjYWxsT3JBcHBseShmbiwgYXJncykgewogICAgICByZXR1cm4gaXNBcnJheShhcmdzKSA/IGZuLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSkgOiBmbihhcmdzKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcE9uZU9yTWFueUFyZ3MoZm4pIHsKICAgICAgcmV0dXJuIG1hcF8xLm1hcChmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgcmV0dXJuIGNhbGxPckFwcGx5KGZuLCBhcmdzKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5tYXBPbmVPck1hbnlBcmdzID0gbWFwT25lT3JNYW55QXJnczsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2JpbmRDYWxsYmFja0ludGVybmFscy5qcwp2YXIgcmVxdWlyZV9iaW5kQ2FsbGJhY2tJbnRlcm5hbHMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2JpbmRDYWxsYmFja0ludGVybmFscy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYmluZENhbGxiYWNrSW50ZXJuYWxzID0gdm9pZCAwOwogICAgdmFyIGlzU2NoZWR1bGVyXzEgPSByZXF1aXJlX2lzU2NoZWR1bGVyKCk7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgc3Vic2NyaWJlT25fMSA9IHJlcXVpcmVfc3Vic2NyaWJlT24oKTsKICAgIHZhciBtYXBPbmVPck1hbnlBcmdzXzEgPSByZXF1aXJlX21hcE9uZU9yTWFueUFyZ3MoKTsKICAgIHZhciBvYnNlcnZlT25fMSA9IHJlcXVpcmVfb2JzZXJ2ZU9uKCk7CiAgICB2YXIgQXN5bmNTdWJqZWN0XzEgPSByZXF1aXJlX0FzeW5jU3ViamVjdCgpOwogICAgZnVuY3Rpb24gYmluZENhbGxiYWNrSW50ZXJuYWxzKGlzTm9kZVN0eWxlLCBjYWxsYmFja0Z1bmMsIHJlc3VsdFNlbGVjdG9yLCBzY2hlZHVsZXIpIHsKICAgICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgaWYgKGlzU2NoZWR1bGVyXzEuaXNTY2hlZHVsZXIocmVzdWx0U2VsZWN0b3IpKSB7CiAgICAgICAgICBzY2hlZHVsZXIgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrSW50ZXJuYWxzKGlzTm9kZVN0eWxlLCBjYWxsYmFja0Z1bmMsIHNjaGVkdWxlcikuYXBwbHkodGhpcywgYXJncykucGlwZShtYXBPbmVPck1hbnlBcmdzXzEubWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNjaGVkdWxlcikgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrSW50ZXJuYWxzKGlzTm9kZVN0eWxlLCBjYWxsYmFja0Z1bmMpLmFwcGx5KHRoaXMsIGFyZ3MpLnBpcGUoc3Vic2NyaWJlT25fMS5zdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT25fMS5vYnNlcnZlT24oc2NoZWR1bGVyKSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBzdWJqZWN0ID0gbmV3IEFzeW5jU3ViamVjdF8xLkFzeW5jU3ViamVjdCgpOwogICAgICAgIHZhciB1bmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICAgIHZhciBzdWJzID0gc3ViamVjdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgICBpZiAodW5pbml0aWFsaXplZCkgewogICAgICAgICAgICB1bmluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBpc0FzeW5jXzEgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIGlzQ29tcGxldGVfMSA9IGZhbHNlOwogICAgICAgICAgICBjYWxsYmFja0Z1bmMuYXBwbHkoX3RoaXMsIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSwgWwogICAgICAgICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgICAgICAgICAgIHJlc3VsdHNbX2kyXSA9IGFyZ3VtZW50c1tfaTJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzTm9kZVN0eWxlKSB7CiAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSByZXN1bHRzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1YmplY3QubmV4dCgxIDwgcmVzdWx0cy5sZW5ndGggPyByZXN1bHRzIDogcmVzdWx0c1swXSk7CiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlXzEgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGlzQXN5bmNfMSkgewogICAgICAgICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdKSk7CiAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlXzEpIHsKICAgICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNBc3luY18xID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdWJzOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIuYmluZENhbGxiYWNrSW50ZXJuYWxzID0gYmluZENhbGxiYWNrSW50ZXJuYWxzOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzCnZhciByZXF1aXJlX2JpbmRDYWxsYmFjayA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5iaW5kQ2FsbGJhY2sgPSB2b2lkIDA7CiAgICB2YXIgYmluZENhbGxiYWNrSW50ZXJuYWxzXzEgPSByZXF1aXJlX2JpbmRDYWxsYmFja0ludGVybmFscygpOwogICAgZnVuY3Rpb24gYmluZENhbGxiYWNrKGNhbGxiYWNrRnVuYywgcmVzdWx0U2VsZWN0b3IsIHNjaGVkdWxlcikgewogICAgICByZXR1cm4gYmluZENhbGxiYWNrSW50ZXJuYWxzXzEuYmluZENhbGxiYWNrSW50ZXJuYWxzKGZhbHNlLCBjYWxsYmFja0Z1bmMsIHJlc3VsdFNlbGVjdG9yLCBzY2hlZHVsZXIpOwogICAgfQogICAgZXhwb3J0czIuYmluZENhbGxiYWNrID0gYmluZENhbGxiYWNrOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvYmluZE5vZGVDYWxsYmFjay5qcwp2YXIgcmVxdWlyZV9iaW5kTm9kZUNhbGxiYWNrID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9iaW5kTm9kZUNhbGxiYWNrLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5iaW5kTm9kZUNhbGxiYWNrID0gdm9pZCAwOwogICAgdmFyIGJpbmRDYWxsYmFja0ludGVybmFsc18xID0gcmVxdWlyZV9iaW5kQ2FsbGJhY2tJbnRlcm5hbHMoKTsKICAgIGZ1bmN0aW9uIGJpbmROb2RlQ2FsbGJhY2soY2FsbGJhY2tGdW5jLCByZXN1bHRTZWxlY3Rvciwgc2NoZWR1bGVyKSB7CiAgICAgIHJldHVybiBiaW5kQ2FsbGJhY2tJbnRlcm5hbHNfMS5iaW5kQ2FsbGJhY2tJbnRlcm5hbHModHJ1ZSwgY2FsbGJhY2tGdW5jLCByZXN1bHRTZWxlY3Rvciwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGV4cG9ydHMyLmJpbmROb2RlQ2FsbGJhY2sgPSBiaW5kTm9kZUNhbGxiYWNrOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvYXJnc0FyZ0FycmF5T3JPYmplY3QuanMKdmFyIHJlcXVpcmVfYXJnc0FyZ0FycmF5T3JPYmplY3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2FyZ3NBcmdBcnJheU9yT2JqZWN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hcmdzQXJnQXJyYXlPck9iamVjdCA9IHZvaWQgMDsKICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKICAgIHZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICAgIHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CiAgICB2YXIgZ2V0S2V5cyA9IE9iamVjdC5rZXlzOwogICAgZnVuY3Rpb24gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncykgewogICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHsKICAgICAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGlzQXJyYXkoZmlyc3RfMSkpIHsKICAgICAgICAgIHJldHVybiB7IGFyZ3M6IGZpcnN0XzEsIGtleXM6IG51bGwgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUE9KTyhmaXJzdF8xKSkgewogICAgICAgICAgdmFyIGtleXMgPSBnZXRLZXlzKGZpcnN0XzEpOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYXJnczoga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0XzFba2V5XTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGtleXMKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGFyZ3MsIGtleXM6IG51bGwgfTsKICAgIH0KICAgIGV4cG9ydHMyLmFyZ3NBcmdBcnJheU9yT2JqZWN0ID0gYXJnc0FyZ0FycmF5T3JPYmplY3Q7CiAgICBmdW5jdGlvbiBpc1BPSk8ob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgJiYgZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gb2JqZWN0UHJvdG87CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9jcmVhdGVPYmplY3QuanMKdmFyIHJlcXVpcmVfY3JlYXRlT2JqZWN0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdXRpbC9jcmVhdGVPYmplY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNyZWF0ZU9iamVjdCA9IHZvaWQgMDsKICAgIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpIHsKICAgICAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwga2V5LCBpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFtrZXldID0gdmFsdWVzW2ldLCByZXN1bHQ7CiAgICAgIH0sIHt9KTsKICAgIH0KICAgIGV4cG9ydHMyLmNyZWF0ZU9iamVjdCA9IGNyZWF0ZU9iamVjdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanMKdmFyIHJlcXVpcmVfY29tYmluZUxhdGVzdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29tYmluZUxhdGVzdEluaXQgPSBleHBvcnRzMi5jb21iaW5lTGF0ZXN0ID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGFyZ3NBcmdBcnJheU9yT2JqZWN0XzEgPSByZXF1aXJlX2FyZ3NBcmdBcnJheU9yT2JqZWN0KCk7CiAgICB2YXIgZnJvbV8xID0gcmVxdWlyZV9mcm9tKCk7CiAgICB2YXIgaWRlbnRpdHlfMSA9IHJlcXVpcmVfaWRlbnRpdHkoKTsKICAgIHZhciBtYXBPbmVPck1hbnlBcmdzXzEgPSByZXF1aXJlX21hcE9uZU9yTWFueUFyZ3MoKTsKICAgIHZhciBhcmdzXzEgPSByZXF1aXJlX2FyZ3MoKTsKICAgIHZhciBjcmVhdGVPYmplY3RfMSA9IHJlcXVpcmVfY3JlYXRlT2JqZWN0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGV4ZWN1dGVTY2hlZHVsZV8xID0gcmVxdWlyZV9leGVjdXRlU2NoZWR1bGUoKTsKICAgIGZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoKSB7CiAgICAgIHZhciBhcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZXIgPSBhcmdzXzEucG9wU2NoZWR1bGVyKGFyZ3MpOwogICAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBhcmdzXzEucG9wUmVzdWx0U2VsZWN0b3IoYXJncyk7CiAgICAgIHZhciBfYSA9IGFyZ3NBcmdBcnJheU9yT2JqZWN0XzEuYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIG9ic2VydmFibGVzID0gX2EuYXJncywga2V5cyA9IF9hLmtleXM7CiAgICAgIGlmIChvYnNlcnZhYmxlcy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gZnJvbV8xLmZyb20oW10sIHNjaGVkdWxlcik7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzID8gZnVuY3Rpb24odmFsdWVzKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdF8xLmNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpOwogICAgICB9IDogaWRlbnRpdHlfMS5pZGVudGl0eSkpOwogICAgICByZXR1cm4gcmVzdWx0U2VsZWN0b3IgPyByZXN1bHQucGlwZShtYXBPbmVPck1hbnlBcmdzXzEubWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0OwogICAgfQogICAgZXhwb3J0czIuY29tYmluZUxhdGVzdCA9IGNvbWJpbmVMYXRlc3Q7CiAgICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCB2YWx1ZVRyYW5zZm9ybSkgewogICAgICBpZiAodmFsdWVUcmFuc2Zvcm0gPT09IHZvaWQgMCkgewogICAgICAgIHZhbHVlVHJhbnNmb3JtID0gaWRlbnRpdHlfMS5pZGVudGl0eTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBvYnNlcnZhYmxlcy5sZW5ndGg7CiAgICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgICB2YXIgYWN0aXZlID0gbGVuZ3RoOwogICAgICAgICAgdmFyIHJlbWFpbmluZ0ZpcnN0VmFsdWVzID0gbGVuZ3RoOwogICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikgewogICAgICAgICAgICBtYXliZVNjaGVkdWxlKHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGZyb21fMS5mcm9tKG9ic2VydmFibGVzW2kyXSwgc2NoZWR1bGVyKTsKICAgICAgICAgICAgICB2YXIgaGFzRmlyc3RWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbaTJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoIWhhc0ZpcnN0VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgaGFzRmlyc3RWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0ZpcnN0VmFsdWVzLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXJlbWFpbmluZ0ZpcnN0VmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZVRyYW5zZm9ybSh2YWx1ZXMuc2xpY2UoKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCEtLWFjdGl2ZSkgewogICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9LCBzdWJzY3JpYmVyKTsKICAgICAgICAgIH07CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIF9sb29wXzEoaSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgc3Vic2NyaWJlcik7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5jb21iaW5lTGF0ZXN0SW5pdCA9IGNvbWJpbmVMYXRlc3RJbml0OwogICAgZnVuY3Rpb24gbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGV4ZWN1dGUsIHN1YnNjcmlwdGlvbikgewogICAgICBpZiAoc2NoZWR1bGVyKSB7CiAgICAgICAgZXhlY3V0ZVNjaGVkdWxlXzEuZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleGVjdXRlKCk7CiAgICAgIH0KICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VJbnRlcm5hbHMuanMKdmFyIHJlcXVpcmVfbWVyZ2VJbnRlcm5hbHMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VJbnRlcm5hbHMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm1lcmdlSW50ZXJuYWxzID0gdm9pZCAwOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBleGVjdXRlU2NoZWR1bGVfMSA9IHJlcXVpcmVfZXhlY3V0ZVNjaGVkdWxlKCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gbWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50LCBvbkJlZm9yZU5leHQsIGV4cGFuZCwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHsKICAgICAgdmFyIGJ1ZmZlciA9IFtdOwogICAgICB2YXIgYWN0aXZlID0gMDsKICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhYnVmZmVyLmxlbmd0aCAmJiAhYWN0aXZlKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICB2YXIgb3V0ZXJOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUpIDogYnVmZmVyLnB1c2godmFsdWUpOwogICAgICB9OwogICAgICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgZXhwYW5kICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgYWN0aXZlKys7CiAgICAgICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkgewogICAgICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpOwogICAgICAgICAgaWYgKGV4cGFuZCkgewogICAgICAgICAgICBvdXRlck5leHQoaW5uZXJWYWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBhY3RpdmUtLTsKICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIuc2hpZnQoKTsKICAgICAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikgewogICAgICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGVfMS5leGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7CiAgICAgICAgICAgICAgICBfbG9vcF8xKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9OwogICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkgewogICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgIGNoZWNrQ29tcGxldGUoKTsKICAgICAgfSkpOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5tZXJnZUludGVybmFscyA9IG1lcmdlSW50ZXJuYWxzOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcwp2YXIgcmVxdWlyZV9tZXJnZU1hcCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWVyZ2VNYXAgPSB2b2lkIDA7CiAgICB2YXIgbWFwXzEgPSByZXF1aXJlX21hcCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBtZXJnZUludGVybmFsc18xID0gcmVxdWlyZV9tZXJnZUludGVybmFscygpOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgZnVuY3Rpb24gbWVyZ2VNYXAocHJvamVjdCwgcmVzdWx0U2VsZWN0b3IsIGNvbmN1cnJlbnQpIHsKICAgICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgewogICAgICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICAgICAgfQogICAgICBpZiAoaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKGEsIGkpIHsKICAgICAgICAgIHJldHVybiBtYXBfMS5tYXAoZnVuY3Rpb24oYiwgaWkpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTsKICAgICAgICAgIH0pKGlubmVyRnJvbV8xLmlubmVyRnJvbShwcm9qZWN0KGEsIGkpKSk7CiAgICAgICAgfSwgY29uY3VycmVudCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAibnVtYmVyIikgewogICAgICAgIGNvbmN1cnJlbnQgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgfQogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzXzEubWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50KTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5tZXJnZU1hcCA9IG1lcmdlTWFwOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qcwp2YXIgcmVxdWlyZV9tZXJnZUFsbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWVyZ2VBbGwgPSB2b2lkIDA7CiAgICB2YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmVfbWVyZ2VNYXAoKTsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkgewogICAgICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7CiAgICAgICAgY29uY3VycmVudCA9IEluZmluaXR5OwogICAgICB9CiAgICAgIHJldHVybiBtZXJnZU1hcF8xLm1lcmdlTWFwKGlkZW50aXR5XzEuaWRlbnRpdHksIGNvbmN1cnJlbnQpOwogICAgfQogICAgZXhwb3J0czIubWVyZ2VBbGwgPSBtZXJnZUFsbDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzCnZhciByZXF1aXJlX2NvbmNhdEFsbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRBbGwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbmNhdEFsbCA9IHZvaWQgMDsKICAgIHZhciBtZXJnZUFsbF8xID0gcmVxdWlyZV9tZXJnZUFsbCgpOwogICAgZnVuY3Rpb24gY29uY2F0QWxsKCkgewogICAgICByZXR1cm4gbWVyZ2VBbGxfMS5tZXJnZUFsbCgxKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbmNhdEFsbCA9IGNvbmNhdEFsbDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbmNhdC5qcwp2YXIgcmVxdWlyZV9jb25jYXQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbmNhdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29uY2F0ID0gdm9pZCAwOwogICAgdmFyIGNvbmNhdEFsbF8xID0gcmVxdWlyZV9jb25jYXRBbGwoKTsKICAgIHZhciBhcmdzXzEgPSByZXF1aXJlX2FyZ3MoKTsKICAgIHZhciBmcm9tXzEgPSByZXF1aXJlX2Zyb20oKTsKICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbmNhdEFsbF8xLmNvbmNhdEFsbCgpKGZyb21fMS5mcm9tKGFyZ3MsIGFyZ3NfMS5wb3BTY2hlZHVsZXIoYXJncykpKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbmNhdCA9IGNvbmNhdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RlZmVyLmpzCnZhciByZXF1aXJlX2RlZmVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZGVmZXIgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHsKICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKG9ic2VydmFibGVGYWN0b3J5KCkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kZWZlciA9IGRlZmVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvY29ubmVjdGFibGUuanMKdmFyIHJlcXVpcmVfY29ubmVjdGFibGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Nvbm5lY3RhYmxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jb25uZWN0YWJsZSA9IHZvaWQgMDsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIHZhciBkZWZlcl8xID0gcmVxdWlyZV9kZWZlcigpOwogICAgdmFyIERFRkFVTFRfQ09ORklHID0gewogICAgICBjb25uZWN0b3I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTsKICAgICAgfSwKICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IHRydWUKICAgIH07CiAgICBmdW5jdGlvbiBjb25uZWN0YWJsZShzb3VyY2UsIGNvbmZpZykgewogICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsKICAgICAgICBjb25maWcgPSBERUZBVUxUX0NPTkZJRzsKICAgICAgfQogICAgICB2YXIgY29ubmVjdGlvbiA9IG51bGw7CiAgICAgIHZhciBjb25uZWN0b3IgPSBjb25maWcuY29ubmVjdG9yLCBfYSA9IGNvbmZpZy5yZXNldE9uRGlzY29ubmVjdCwgcmVzZXRPbkRpc2Nvbm5lY3QgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hOwogICAgICB2YXIgc3ViamVjdCA9IGNvbm5lY3RvcigpOwogICAgICB2YXIgcmVzdWx0ID0gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICByZXR1cm4gc3ViamVjdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH0pOwogICAgICByZXN1bHQuY29ubmVjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghY29ubmVjdGlvbiB8fCBjb25uZWN0aW9uLmNsb3NlZCkgewogICAgICAgICAgY29ubmVjdGlvbiA9IGRlZmVyXzEuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7CiAgICAgICAgICB9KS5zdWJzY3JpYmUoc3ViamVjdCk7CiAgICAgICAgICBpZiAocmVzZXRPbkRpc2Nvbm5lY3QpIHsKICAgICAgICAgICAgY29ubmVjdGlvbi5hZGQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QgPSBjb25uZWN0b3IoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgICB9OwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZXhwb3J0czIuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2ZvcmtKb2luLmpzCnZhciByZXF1aXJlX2ZvcmtKb2luID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mb3JrSm9pbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZm9ya0pvaW4gPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgYXJnc0FyZ0FycmF5T3JPYmplY3RfMSA9IHJlcXVpcmVfYXJnc0FyZ0FycmF5T3JPYmplY3QoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgYXJnc18xID0gcmVxdWlyZV9hcmdzKCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIG1hcE9uZU9yTWFueUFyZ3NfMSA9IHJlcXVpcmVfbWFwT25lT3JNYW55QXJncygpOwogICAgdmFyIGNyZWF0ZU9iamVjdF8xID0gcmVxdWlyZV9jcmVhdGVPYmplY3QoKTsKICAgIGZ1bmN0aW9uIGZvcmtKb2luKCkgewogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBhcmdzXzEucG9wUmVzdWx0U2VsZWN0b3IoYXJncyk7CiAgICAgIHZhciBfYSA9IGFyZ3NBcmdBcnJheU9yT2JqZWN0XzEuYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIHNvdXJjZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5czsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoOwogICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICB2YXIgcmVtYWluaW5nQ29tcGxldGlvbnMgPSBsZW5ndGg7CiAgICAgICAgdmFyIHJlbWFpbmluZ0VtaXNzaW9ucyA9IGxlbmd0aDsKICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKHNvdXJjZUluZGV4MikgewogICAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlc1tzb3VyY2VJbmRleDJdKS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghaGFzVmFsdWUpIHsKICAgICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgcmVtYWluaW5nRW1pc3Npb25zLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsdWVzW3NvdXJjZUluZGV4Ml0gPSB2YWx1ZTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nQ29tcGxldGlvbnMtLTsKICAgICAgICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghcmVtYWluaW5nQ29tcGxldGlvbnMgfHwgIWhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdFbWlzc2lvbnMpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChrZXlzID8gY3JlYXRlT2JqZWN0XzEuY3JlYXRlT2JqZWN0KGtleXMsIHZhbHVlcykgOiB2YWx1ZXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIHNvdXJjZUluZGV4ID0gMDsgc291cmNlSW5kZXggPCBsZW5ndGg7IHNvdXJjZUluZGV4KyspIHsKICAgICAgICAgIF9sb29wXzEoc291cmNlSW5kZXgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHRTZWxlY3RvciA/IHJlc3VsdC5waXBlKG1hcE9uZU9yTWFueUFyZ3NfMS5tYXBPbmVPck1hbnlBcmdzKHJlc3VsdFNlbGVjdG9yKSkgOiByZXN1bHQ7CiAgICB9CiAgICBleHBvcnRzMi5mb3JrSm9pbiA9IGZvcmtKb2luOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50LmpzCnZhciByZXF1aXJlX2Zyb21FdmVudCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZyb21FdmVudCA9IHZvaWQgMDsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmVfbWVyZ2VNYXAoKTsKICAgIHZhciBpc0FycmF5TGlrZV8xID0gcmVxdWlyZV9pc0FycmF5TGlrZSgpOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgdmFyIG1hcE9uZU9yTWFueUFyZ3NfMSA9IHJlcXVpcmVfbWFwT25lT3JNYW55QXJncygpOwogICAgdmFyIG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzID0gWyJhZGRMaXN0ZW5lciIsICJyZW1vdmVMaXN0ZW5lciJdOwogICAgdmFyIGV2ZW50VGFyZ2V0TWV0aG9kcyA9IFsiYWRkRXZlbnRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIl07CiAgICB2YXIganF1ZXJ5TWV0aG9kcyA9IFsib24iLCAib2ZmIl07CiAgICBmdW5jdGlvbiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgIGlmIChpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihvcHRpb25zKSkgewogICAgICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9uczsKICAgICAgICBvcHRpb25zID0gdm9pZCAwOwogICAgICB9CiAgICAgIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJnc18xLm1hcE9uZU9yTWFueUFyZ3MocmVzdWx0U2VsZWN0b3IpKTsKICAgICAgfQogICAgICB2YXIgX2EgPSBfX3JlYWQoaXNFdmVudFRhcmdldCh0YXJnZXQpID8gZXZlbnRUYXJnZXRNZXRob2RzLm1hcChmdW5jdGlvbihtZXRob2ROYW1lKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIpIHsKICAgICAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTsKICAgICAgICB9OwogICAgICB9KSA6IGlzTm9kZVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgPyBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IGlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IGpxdWVyeU1ldGhvZHMubWFwKHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSkgOiBbXSwgMiksIGFkZCA9IF9hWzBdLCByZW1vdmUgPSBfYVsxXTsKICAgICAgaWYgKCFhZGQpIHsKICAgICAgICBpZiAoaXNBcnJheUxpa2VfMS5pc0FycmF5TGlrZSh0YXJnZXQpKSB7CiAgICAgICAgICByZXR1cm4gbWVyZ2VNYXBfMS5tZXJnZU1hcChmdW5jdGlvbihzdWJUYXJnZXQpIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudChzdWJUYXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucyk7CiAgICAgICAgICB9KShpbm5lckZyb21fMS5pbm5lckZyb20odGFyZ2V0KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYWRkKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBldmVudCB0YXJnZXQiKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLm5leHQoMSA8IGFyZ3MubGVuZ3RoID8gYXJncyA6IGFyZ3NbMF0pOwogICAgICAgIH07CiAgICAgICAgYWRkKGhhbmRsZXIpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZW1vdmUoaGFuZGxlcik7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tRXZlbnQgPSBmcm9tRXZlbnQ7CiAgICBmdW5jdGlvbiB0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbihoYW5kbGVyKSB7CiAgICAgICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTm9kZVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgewogICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24odGFyZ2V0LmFkZExpc3RlbmVyKSAmJiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlTGlzdGVuZXIpOwogICAgfQogICAgZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHRhcmdldC5vbikgJiYgaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24odGFyZ2V0Lm9mZik7CiAgICB9CiAgICBmdW5jdGlvbiBpc0V2ZW50VGFyZ2V0KHRhcmdldCkgewogICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24odGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpICYmIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudFBhdHRlcm4uanMKdmFyIHJlcXVpcmVfZnJvbUV2ZW50UGF0dGVybiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50UGF0dGVybi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZnJvbUV2ZW50UGF0dGVybiA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIHZhciBtYXBPbmVPck1hbnlBcmdzXzEgPSByZXF1aXJlX21hcE9uZU9yTWFueUFyZ3MoKTsKICAgIGZ1bmN0aW9uIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlciwgcmVzdWx0U2VsZWN0b3IpIHsKICAgICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXBPbmVPck1hbnlBcmdzXzEubWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZSA9IFtdOwogICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgZVtfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dChlLmxlbmd0aCA9PT0gMSA/IGVbMF0gOiBlKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXRWYWx1ZSA9IGFkZEhhbmRsZXIoaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHJlbW92ZUhhbmRsZXIpID8gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gcmVtb3ZlSGFuZGxlcihoYW5kbGVyLCByZXRWYWx1ZSk7CiAgICAgICAgfSA6IHZvaWQgMDsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tRXZlbnRQYXR0ZXJuID0gZnJvbUV2ZW50UGF0dGVybjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2dlbmVyYXRlLmpzCnZhciByZXF1aXJlX2dlbmVyYXRlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9nZW5lcmF0ZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2dlbmVyYXRvciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZ2VuZXJhdG9yIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIGJvZHkpIHsKICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07CiAgICAgICAgcmV0dXJuIHRbMV07CiAgICAgIH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7CiAgICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSksIGc7CiAgICAgIGZ1bmN0aW9uIHZlcmIobikgewogICAgICAgIHJldHVybiBmdW5jdGlvbih2KSB7CiAgICAgICAgICByZXR1cm4gc3RlcChbbiwgdl0pOwogICAgICAgIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUgKF8pIHRyeSB7CiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIHQgPSBvcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBfLmxhYmVsKys7CiAgICAgICAgICAgICAgeSA9IG9wWzFdOwogICAgICAgICAgICAgIG9wID0gWzBdOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsKICAgICAgICAgICAgICAgIF8gPSAwOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHsKICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsKICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdOwogICAgICAgICAgICAgICAgdCA9IG9wOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7CiAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTsKICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBvcCA9IFs2LCBlXTsKICAgICAgICAgIHkgPSAwOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBmID0gdCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOwogICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07CiAgICAgIH0KICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmdlbmVyYXRlID0gdm9pZCAwOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICB2YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmVfaXNTY2hlZHVsZXIoKTsKICAgIHZhciBkZWZlcl8xID0gcmVxdWlyZV9kZWZlcigpOwogICAgdmFyIHNjaGVkdWxlSXRlcmFibGVfMSA9IHJlcXVpcmVfc2NoZWR1bGVJdGVyYWJsZSgpOwogICAgZnVuY3Rpb24gZ2VuZXJhdGUoaW5pdGlhbFN0YXRlT3JPcHRpb25zLCBjb25kaXRpb24sIGl0ZXJhdGUsIHJlc3VsdFNlbGVjdG9yT3JTY2hlZHVsZXIsIHNjaGVkdWxlcikgewogICAgICB2YXIgX2EsIF9iOwogICAgICB2YXIgcmVzdWx0U2VsZWN0b3I7CiAgICAgIHZhciBpbml0aWFsU3RhdGU7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgX2EgPSBpbml0aWFsU3RhdGVPck9wdGlvbnMsIGluaXRpYWxTdGF0ZSA9IF9hLmluaXRpYWxTdGF0ZSwgY29uZGl0aW9uID0gX2EuY29uZGl0aW9uLCBpdGVyYXRlID0gX2EuaXRlcmF0ZSwgX2IgPSBfYS5yZXN1bHRTZWxlY3RvciwgcmVzdWx0U2VsZWN0b3IgPSBfYiA9PT0gdm9pZCAwID8gaWRlbnRpdHlfMS5pZGVudGl0eSA6IF9iLCBzY2hlZHVsZXIgPSBfYS5zY2hlZHVsZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlT3JPcHRpb25zOwogICAgICAgIGlmICghcmVzdWx0U2VsZWN0b3JPclNjaGVkdWxlciB8fCBpc1NjaGVkdWxlcl8xLmlzU2NoZWR1bGVyKHJlc3VsdFNlbGVjdG9yT3JTY2hlZHVsZXIpKSB7CiAgICAgICAgICByZXN1bHRTZWxlY3RvciA9IGlkZW50aXR5XzEuaWRlbnRpdHk7CiAgICAgICAgICBzY2hlZHVsZXIgPSByZXN1bHRTZWxlY3Rvck9yU2NoZWR1bGVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yT3JTY2hlZHVsZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdlbigpIHsKICAgICAgICB2YXIgc3RhdGU7CiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9hMikgewogICAgICAgICAgc3dpdGNoIChfYTIubGFiZWwpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIHN0YXRlID0gaW5pdGlhbFN0YXRlOwogICAgICAgICAgICAgIF9hMi5sYWJlbCA9IDE7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBpZiAoISghY29uZGl0aW9uIHx8IGNvbmRpdGlvbihzdGF0ZSkpKSByZXR1cm4gWzMsIDRdOwogICAgICAgICAgICAgIHJldHVybiBbNCwgcmVzdWx0U2VsZWN0b3Ioc3RhdGUpXTsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIF9hMi5zZW50KCk7CiAgICAgICAgICAgICAgX2EyLmxhYmVsID0gMzsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIHN0YXRlID0gaXRlcmF0ZShzdGF0ZSk7CiAgICAgICAgICAgICAgcmV0dXJuIFszLCAxXTsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIHJldHVybiBbMl07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRlZmVyXzEuZGVmZXIoc2NoZWR1bGVyID8gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlSXRlcmFibGVfMS5zY2hlZHVsZUl0ZXJhYmxlKGdlbigpLCBzY2hlZHVsZXIpOwogICAgICB9IDogZ2VuKTsKICAgIH0KICAgIGV4cG9ydHMyLmdlbmVyYXRlID0gZ2VuZXJhdGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9paWYuanMKdmFyIHJlcXVpcmVfaWlmID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9paWYuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlpZiA9IHZvaWQgMDsKICAgIHZhciBkZWZlcl8xID0gcmVxdWlyZV9kZWZlcigpOwogICAgZnVuY3Rpb24gaWlmKGNvbmRpdGlvbiwgdHJ1ZVJlc3VsdCwgZmFsc2VSZXN1bHQpIHsKICAgICAgcmV0dXJuIGRlZmVyXzEuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbigpID8gdHJ1ZVJlc3VsdCA6IGZhbHNlUmVzdWx0OwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmlpZiA9IGlpZjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3RpbWVyLmpzCnZhciByZXF1aXJlX3RpbWVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGltZXIgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgYXN5bmNfMSA9IHJlcXVpcmVfYXN5bmMoKTsKICAgIHZhciBpc1NjaGVkdWxlcl8xID0gcmVxdWlyZV9pc1NjaGVkdWxlcigpOwogICAgdmFyIGlzRGF0ZV8xID0gcmVxdWlyZV9pc0RhdGUoKTsKICAgIGZ1bmN0aW9uIHRpbWVyKGR1ZVRpbWUsIGludGVydmFsT3JTY2hlZHVsZXIsIHNjaGVkdWxlcikgewogICAgICBpZiAoZHVlVGltZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZHVlVGltZSA9IDA7CiAgICAgIH0KICAgICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsKICAgICAgfQogICAgICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xOwogICAgICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGlzU2NoZWR1bGVyXzEuaXNTY2hlZHVsZXIoaW50ZXJ2YWxPclNjaGVkdWxlcikpIHsKICAgICAgICAgIHNjaGVkdWxlciA9IGludGVydmFsT3JTY2hlZHVsZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludGVydmFsRHVyYXRpb24gPSBpbnRlcnZhbE9yU2NoZWR1bGVyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgZHVlID0gaXNEYXRlXzEuaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7CiAgICAgICAgaWYgKGR1ZSA8IDApIHsKICAgICAgICAgIGR1ZSA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciBuID0gMDsKICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobisrKTsKICAgICAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikgewogICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LCBkdWUpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnRpbWVyID0gdGltZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9pbnRlcnZhbC5qcwp2YXIgcmVxdWlyZV9pbnRlcnZhbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvaW50ZXJ2YWwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmludGVydmFsID0gdm9pZCAwOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICB2YXIgdGltZXJfMSA9IHJlcXVpcmVfdGltZXIoKTsKICAgIGZ1bmN0aW9uIGludGVydmFsKHBlcmlvZCwgc2NoZWR1bGVyKSB7CiAgICAgIGlmIChwZXJpb2QgPT09IHZvaWQgMCkgewogICAgICAgIHBlcmlvZCA9IDA7CiAgICAgIH0KICAgICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luY1NjaGVkdWxlcjsKICAgICAgfQogICAgICBpZiAocGVyaW9kIDwgMCkgewogICAgICAgIHBlcmlvZCA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbWVyXzEudGltZXIocGVyaW9kLCBwZXJpb2QsIHNjaGVkdWxlcik7CiAgICB9CiAgICBleHBvcnRzMi5pbnRlcnZhbCA9IGludGVydmFsOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanMKdmFyIHJlcXVpcmVfbWVyZ2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL21lcmdlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5tZXJnZSA9IHZvaWQgMDsKICAgIHZhciBtZXJnZUFsbF8xID0gcmVxdWlyZV9tZXJnZUFsbCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBlbXB0eV8xID0gcmVxdWlyZV9lbXB0eSgpOwogICAgdmFyIGFyZ3NfMSA9IHJlcXVpcmVfYXJncygpOwogICAgdmFyIGZyb21fMSA9IHJlcXVpcmVfZnJvbSgpOwogICAgZnVuY3Rpb24gbWVyZ2UoKSB7CiAgICAgIHZhciBhcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZXIgPSBhcmdzXzEucG9wU2NoZWR1bGVyKGFyZ3MpOwogICAgICB2YXIgY29uY3VycmVudCA9IGFyZ3NfMS5wb3BOdW1iZXIoYXJncywgSW5maW5pdHkpOwogICAgICB2YXIgc291cmNlcyA9IGFyZ3M7CiAgICAgIHJldHVybiAhc291cmNlcy5sZW5ndGggPyBlbXB0eV8xLkVNUFRZIDogc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlc1swXSkgOiBtZXJnZUFsbF8xLm1lcmdlQWxsKGNvbmN1cnJlbnQpKGZyb21fMS5mcm9tKHNvdXJjZXMsIHNjaGVkdWxlcikpOwogICAgfQogICAgZXhwb3J0czIubWVyZ2UgPSBtZXJnZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL25ldmVyLmpzCnZhciByZXF1aXJlX25ldmVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubmV2ZXIgPSBleHBvcnRzMi5ORVZFUiA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIGV4cG9ydHMyLk5FVkVSID0gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKG5vb3BfMS5ub29wKTsKICAgIGZ1bmN0aW9uIG5ldmVyKCkgewogICAgICByZXR1cm4gZXhwb3J0czIuTkVWRVI7CiAgICB9CiAgICBleHBvcnRzMi5uZXZlciA9IG5ldmVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvYXJnc09yQXJnQXJyYXkuanMKdmFyIHJlcXVpcmVfYXJnc09yQXJnQXJyYXkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL2FyZ3NPckFyZ0FycmF5LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5hcmdzT3JBcmdBcnJheSA9IHZvaWQgMDsKICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKICAgIGZ1bmN0aW9uIGFyZ3NPckFyZ0FycmF5KGFyZ3MpIHsKICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIGlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJnczsKICAgIH0KICAgIGV4cG9ydHMyLmFyZ3NPckFyZ0FycmF5ID0gYXJnc09yQXJnQXJyYXk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vbkVycm9yUmVzdW1lTmV4dC5qcwp2YXIgcmVxdWlyZV9vbkVycm9yUmVzdW1lTmV4dCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvb25FcnJvclJlc3VtZU5leHQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm9uRXJyb3JSZXN1bWVOZXh0ID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGFyZ3NPckFyZ0FycmF5XzEgPSByZXF1aXJlX2FyZ3NPckFyZ0FycmF5KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIG5vb3BfMSA9IHJlcXVpcmVfbm9vcCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIGZ1bmN0aW9uIG9uRXJyb3JSZXN1bWVOZXh0KCkgewogICAgICB2YXIgc291cmNlcyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgbmV4dFNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheV8xLmFyZ3NPckFyZ0FycmF5KHNvdXJjZXMpOwogICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgc291cmNlSW5kZXggPSAwOwogICAgICAgIHZhciBzdWJzY3JpYmVOZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoc291cmNlSW5kZXggPCBuZXh0U291cmNlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIG5leHRTb3VyY2UgPSB2b2lkIDA7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgbmV4dFNvdXJjZSA9IGlubmVyRnJvbV8xLmlubmVyRnJvbShuZXh0U291cmNlc1tzb3VyY2VJbmRleCsrXSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgIHN1YnNjcmliZU5leHQoKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlubmVyU3Vic2NyaWJlciA9IG5ldyBPcGVyYXRvclN1YnNjcmliZXJfMS5PcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgdm9pZCAwLCBub29wXzEubm9vcCwgbm9vcF8xLm5vb3ApOwogICAgICAgICAgICBuZXh0U291cmNlLnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIpOwogICAgICAgICAgICBpbm5lclN1YnNjcmliZXIuYWRkKHN1YnNjcmliZU5leHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgc3Vic2NyaWJlTmV4dCgpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLm9uRXJyb3JSZXN1bWVOZXh0ID0gb25FcnJvclJlc3VtZU5leHQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9wYWlycy5qcwp2YXIgcmVxdWlyZV9wYWlycyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvcGFpcnMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnBhaXJzID0gdm9pZCAwOwogICAgdmFyIGZyb21fMSA9IHJlcXVpcmVfZnJvbSgpOwogICAgZnVuY3Rpb24gcGFpcnMob2JqLCBzY2hlZHVsZXIpIHsKICAgICAgcmV0dXJuIGZyb21fMS5mcm9tKE9iamVjdC5lbnRyaWVzKG9iaiksIHNjaGVkdWxlcik7CiAgICB9CiAgICBleHBvcnRzMi5wYWlycyA9IHBhaXJzOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL3V0aWwvbm90LmpzCnZhciByZXF1aXJlX25vdDIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC91dGlsL25vdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubm90ID0gdm9pZCAwOwogICAgZnVuY3Rpb24gbm90KHByZWQsIHRoaXNBcmcpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICAgIHJldHVybiAhcHJlZC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5ub3QgPSBub3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcwp2YXIgcmVxdWlyZV9maWx0ZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmlsdGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5maWx0ZXIgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSwgdGhpc0FyZykgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5maWx0ZXIgPSBmaWx0ZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9wYXJ0aXRpb24uanMKdmFyIHJlcXVpcmVfcGFydGl0aW9uID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9wYXJ0aXRpb24uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnBhcnRpdGlvbiA9IHZvaWQgMDsKICAgIHZhciBub3RfMSA9IHJlcXVpcmVfbm90MigpOwogICAgdmFyIGZpbHRlcl8xID0gcmVxdWlyZV9maWx0ZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICBmdW5jdGlvbiBwYXJ0aXRpb24oc291cmNlLCBwcmVkaWNhdGUsIHRoaXNBcmcpIHsKICAgICAgcmV0dXJuIFtmaWx0ZXJfMS5maWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKShpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlKSksIGZpbHRlcl8xLmZpbHRlcihub3RfMS5ub3QocHJlZGljYXRlLCB0aGlzQXJnKSkoaW5uZXJGcm9tXzEuaW5uZXJGcm9tKHNvdXJjZSkpXTsKICAgIH0KICAgIGV4cG9ydHMyLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanMKdmFyIHJlcXVpcmVfcmFjZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvcmFjZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmFjZUluaXQgPSBleHBvcnRzMi5yYWNlID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBhcmdzT3JBcmdBcnJheV8xID0gcmVxdWlyZV9hcmdzT3JBcmdBcnJheSgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHJhY2UoKSB7CiAgICAgIHZhciBzb3VyY2VzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheV8xLmFyZ3NPckFyZ0FycmF5KHNvdXJjZXMpOwogICAgICByZXR1cm4gc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlc1swXSkgOiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUocmFjZUluaXQoc291cmNlcykpOwogICAgfQogICAgZXhwb3J0czIucmFjZSA9IHJhY2U7CiAgICBmdW5jdGlvbiByYWNlSW5pdChzb3VyY2VzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbnMgPSBbXTsKICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkyKSB7CiAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXJGcm9tXzEuaW5uZXJGcm9tKHNvdXJjZXNbaTJdKS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBzdWJzY3JpcHRpb25zLmxlbmd0aDsgcysrKSB7CiAgICAgICAgICAgICAgICBzICE9PSBpMiAmJiBzdWJzY3JpcHRpb25zW3NdLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICB9KSkpOwogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IHN1YnNjcmlwdGlvbnMgJiYgIXN1YnNjcmliZXIuY2xvc2VkICYmIGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBfbG9vcF8xKGkpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLnJhY2VJbml0ID0gcmFjZUluaXQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9yYW5nZS5qcwp2YXIgcmVxdWlyZV9yYW5nZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29ic2VydmFibGUvcmFuZ2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnJhbmdlID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGVtcHR5XzEgPSByZXF1aXJlX2VtcHR5KCk7CiAgICBmdW5jdGlvbiByYW5nZShzdGFydCwgY291bnQsIHNjaGVkdWxlcikgewogICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgIGNvdW50ID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICAgIGlmIChjb3VudCA8PSAwKSB7CiAgICAgICAgcmV0dXJuIGVtcHR5XzEuRU1QVFk7CiAgICAgIH0KICAgICAgdmFyIGVuZCA9IGNvdW50ICsgc3RhcnQ7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoc2NoZWR1bGVyID8gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBuID0gc3RhcnQ7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChuIDwgZW5kKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChuKyspOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0gOiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIG4gPSBzdGFydDsKICAgICAgICB3aGlsZSAobiA8IGVuZCAmJiAhc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChuKyspOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIucmFuZ2UgPSByYW5nZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3VzaW5nLmpzCnZhciByZXF1aXJlX3VzaW5nID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS91c2luZy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudXNpbmcgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIGVtcHR5XzEgPSByZXF1aXJlX2VtcHR5KCk7CiAgICBmdW5jdGlvbiB1c2luZyhyZXNvdXJjZUZhY3RvcnksIG9ic2VydmFibGVGYWN0b3J5KSB7CiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeSgpOwogICAgICAgIHZhciByZXN1bHQgPSBvYnNlcnZhYmxlRmFjdG9yeShyZXNvdXJjZSk7CiAgICAgICAgdmFyIHNvdXJjZSA9IHJlc3VsdCA/IGlubmVyRnJvbV8xLmlubmVyRnJvbShyZXN1bHQpIDogZW1wdHlfMS5FTVBUWTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChyZXNvdXJjZSkgewogICAgICAgICAgICByZXNvdXJjZS51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudXNpbmcgPSB1c2luZzsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qcwp2YXIgcmVxdWlyZV96aXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuemlwID0gdm9pZCAwOwogICAgdmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmVfT2JzZXJ2YWJsZSgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBhcmdzT3JBcmdBcnJheV8xID0gcmVxdWlyZV9hcmdzT3JBcmdBcnJheSgpOwogICAgdmFyIGVtcHR5XzEgPSByZXF1aXJlX2VtcHR5KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGFyZ3NfMSA9IHJlcXVpcmVfYXJncygpOwogICAgZnVuY3Rpb24gemlwKCkgewogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBhcmdzXzEucG9wUmVzdWx0U2VsZWN0b3IoYXJncyk7CiAgICAgIHZhciBzb3VyY2VzID0gYXJnc09yQXJnQXJyYXlfMS5hcmdzT3JBcmdBcnJheShhcmdzKTsKICAgICAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID8gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgYnVmZmVycyA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0pOwogICAgICAgIHZhciBjb21wbGV0ZWQgPSBzb3VyY2VzLm1hcChmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChmdW5jdGlvbigpIHsKICAgICAgICAgIGJ1ZmZlcnMgPSBjb21wbGV0ZWQgPSBudWxsOwogICAgICAgIH0pOwogICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oc291cmNlSW5kZXgyKSB7CiAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlc1tzb3VyY2VJbmRleDJdKS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGJ1ZmZlcnNbc291cmNlSW5kZXgyXS5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuZXZlcnkoZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7CiAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJ1ZmZlcnMubWFwKGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zaGlmdCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHRTZWxlY3RvciA/IHJlc3VsdFNlbGVjdG9yLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlc3VsdCkpKSA6IHJlc3VsdCk7CiAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc29tZShmdW5jdGlvbihidWZmZXIsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhYnVmZmVyLmxlbmd0aCAmJiBjb21wbGV0ZWRbaV07CiAgICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb21wbGV0ZWRbc291cmNlSW5kZXgyXSA9IHRydWU7CiAgICAgICAgICAgICFidWZmZXJzW3NvdXJjZUluZGV4Ml0ubGVuZ3RoICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0pKTsKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIHNvdXJjZUluZGV4ID0gMDsgIXN1YnNjcmliZXIuY2xvc2VkICYmIHNvdXJjZUluZGV4IDwgc291cmNlcy5sZW5ndGg7IHNvdXJjZUluZGV4KyspIHsKICAgICAgICAgIF9sb29wXzEoc291cmNlSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICBidWZmZXJzID0gY29tcGxldGVkID0gbnVsbDsKICAgICAgICB9OwogICAgICB9KSA6IGVtcHR5XzEuRU1QVFk7CiAgICB9CiAgICBleHBvcnRzMi56aXAgPSB6aXA7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdHlwZXMuanMKdmFyIHJlcXVpcmVfdHlwZXMyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvdHlwZXMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvYXVkaXQuanMKdmFyIHJlcXVpcmVfYXVkaXQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvYXVkaXQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmF1ZGl0ID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiBhdWRpdChkdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB2YXIgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICB2YXIgZHVyYXRpb25TdWJzY3JpYmVyID0gbnVsbDsKICAgICAgICB2YXIgaXNDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIHZhciBlbmREdXJhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID09PSBudWxsIHx8IGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZHVyYXRpb25TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxhc3RWYWx1ZTsKICAgICAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlzQ29tcGxldGUgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH07CiAgICAgICAgdmFyIGNsZWFudXBEdXJhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID0gbnVsbDsKICAgICAgICAgIGlzQ29tcGxldGUgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH07CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgaWYgKCFkdXJhdGlvblN1YnNjcmliZXIpIHsKICAgICAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUpKS5zdWJzY3JpYmUoZHVyYXRpb25TdWJzY3JpYmVyID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGVuZER1cmF0aW9uLCBjbGVhbnVwRHVyYXRpb24pKTsKICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgKCFoYXNWYWx1ZSB8fCAhZHVyYXRpb25TdWJzY3JpYmVyIHx8IGR1cmF0aW9uU3Vic2NyaWJlci5jbG9zZWQpICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuYXVkaXQgPSBhdWRpdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvYXVkaXRUaW1lLmpzCnZhciByZXF1aXJlX2F1ZGl0VGltZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9hdWRpdFRpbWUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmF1ZGl0VGltZSA9IHZvaWQgMDsKICAgIHZhciBhc3luY18xID0gcmVxdWlyZV9hc3luYygpOwogICAgdmFyIGF1ZGl0XzEgPSByZXF1aXJlX2F1ZGl0KCk7CiAgICB2YXIgdGltZXJfMSA9IHJlcXVpcmVfdGltZXIoKTsKICAgIGZ1bmN0aW9uIGF1ZGl0VGltZShkdXJhdGlvbiwgc2NoZWR1bGVyKSB7CiAgICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgewogICAgICAgIHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmNTY2hlZHVsZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGF1ZGl0XzEuYXVkaXQoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRpbWVyXzEudGltZXIoZHVyYXRpb24sIHNjaGVkdWxlcik7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuYXVkaXRUaW1lID0gYXVkaXRUaW1lOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXIuanMKdmFyIHJlcXVpcmVfYnVmZmVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYnVmZmVyID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIG5vb3BfMSA9IHJlcXVpcmVfbm9vcCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICBmdW5jdGlvbiBidWZmZXIoY2xvc2luZ05vdGlmaWVyKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgY3VycmVudEJ1ZmZlciA9IFtdOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gY3VycmVudEJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChjdXJyZW50QnVmZmVyKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KSk7CiAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGNsb3NpbmdOb3RpZmllcikuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBiID0gY3VycmVudEJ1ZmZlcjsKICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBbXTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChiKTsKICAgICAgICB9LCBub29wXzEubm9vcCkpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBudWxsOwogICAgICAgIH07CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuYnVmZmVyID0gYnVmZmVyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJDb3VudC5qcwp2YXIgcmVxdWlyZV9idWZmZXJDb3VudCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJDb3VudC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3ZhbHVlcyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fdmFsdWVzIHx8IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CiAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pOwogICAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/ICJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiIgOiAiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYnVmZmVyQ291bnQgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGFyclJlbW92ZV8xID0gcmVxdWlyZV9hcnJSZW1vdmUoKTsKICAgIGZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHsKICAgICAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkgewogICAgICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsOwogICAgICB9CiAgICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSBudWxsICYmIHN0YXJ0QnVmZmVyRXZlcnkgIT09IHZvaWQgMCA/IHN0YXJ0QnVmZmVyRXZlcnkgOiBidWZmZXJTaXplOwogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGJ1ZmZlcnMgPSBbXTsKICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjsKICAgICAgICAgIHZhciB0b0VtaXQgPSBudWxsOwogICAgICAgICAgaWYgKGNvdW50KysgJSBzdGFydEJ1ZmZlckV2ZXJ5ID09PSAwKSB7CiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBidWZmZXJzXzEgPSBfX3ZhbHVlcyhidWZmZXJzKSwgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpOyAhYnVmZmVyc18xXzEuZG9uZTsgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlcnNfMV8xLnZhbHVlOwogICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSBidWZmZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQgIT09IG51bGwgJiYgdG9FbWl0ICE9PSB2b2lkIDAgPyB0b0VtaXQgOiBbXTsKICAgICAgICAgICAgICAgIHRvRW1pdC5wdXNoKGJ1ZmZlcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoYnVmZmVyc18xXzEgJiYgIWJ1ZmZlcnNfMV8xLmRvbmUgJiYgKF9hID0gYnVmZmVyc18xLnJldHVybikpIF9hLmNhbGwoYnVmZmVyc18xKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b0VtaXQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKHZhciB0b0VtaXRfMSA9IF9fdmFsdWVzKHRvRW1pdCksIHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCk7ICF0b0VtaXRfMV8xLmRvbmU7IHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSB0b0VtaXRfMV8xLnZhbHVlOwogICAgICAgICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKGJ1ZmZlcnMsIGJ1ZmZlcik7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYnVmZmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7CiAgICAgICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHRvRW1pdF8xXzEgJiYgIXRvRW1pdF8xXzEuZG9uZSAmJiAoX2IgPSB0b0VtaXRfMS5yZXR1cm4pKSBfYi5jYWxsKHRvRW1pdF8xKTsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGVfMywgX2E7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBidWZmZXJzXzIgPSBfX3ZhbHVlcyhidWZmZXJzKSwgYnVmZmVyc18yXzEgPSBidWZmZXJzXzIubmV4dCgpOyAhYnVmZmVyc18yXzEuZG9uZTsgYnVmZmVyc18yXzEgPSBidWZmZXJzXzIubmV4dCgpKSB7CiAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlcnNfMl8xLnZhbHVlOwogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlXzNfMSkgewogICAgICAgICAgICBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoYnVmZmVyc18yXzEgJiYgIWJ1ZmZlcnNfMl8xLmRvbmUgJiYgKF9hID0gYnVmZmVyc18yLnJldHVybikpIF9hLmNhbGwoYnVmZmVyc18yKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgYnVmZmVycyA9IG51bGw7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlclRpbWUuanMKdmFyIHJlcXVpcmVfYnVmZmVyVGltZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUaW1lLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fdmFsdWVzID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX192YWx1ZXMgfHwgZnVuY3Rpb24obykgewogICAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDsKICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CiAgICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHJldHVybiB7CiAgICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwOwogICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwogICAgICAgIH0KICAgICAgfTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5idWZmZXJUaW1lID0gdm9pZCAwOwogICAgdmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZV9TdWJzY3JpcHRpb24oKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgYXJyUmVtb3ZlXzEgPSByZXF1aXJlX2FyclJlbW92ZSgpOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICB2YXIgYXJnc18xID0gcmVxdWlyZV9hcmdzKCk7CiAgICB2YXIgZXhlY3V0ZVNjaGVkdWxlXzEgPSByZXF1aXJlX2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgZnVuY3Rpb24gYnVmZmVyVGltZShidWZmZXJUaW1lU3BhbikgewogICAgICB2YXIgX2EsIF9iOwogICAgICB2YXIgb3RoZXJBcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgb3RoZXJBcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZXIgPSAoX2EgPSBhcmdzXzEucG9wU2NoZWR1bGVyKG90aGVyQXJncykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGFzeW5jXzEuYXN5bmNTY2hlZHVsZXI7CiAgICAgIHZhciBidWZmZXJDcmVhdGlvbkludGVydmFsID0gKF9iID0gb3RoZXJBcmdzWzBdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBudWxsOwogICAgICB2YXIgbWF4QnVmZmVyU2l6ZSA9IG90aGVyQXJnc1sxXSB8fCBJbmZpbml0eTsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBidWZmZXJSZWNvcmRzID0gW107CiAgICAgICAgdmFyIHJlc3RhcnRPbkVtaXQgPSBmYWxzZTsKICAgICAgICB2YXIgZW1pdCA9IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgICAgdmFyIGJ1ZmZlciA9IHJlY29yZC5idWZmZXIsIHN1YnMgPSByZWNvcmQuc3ViczsKICAgICAgICAgIHN1YnMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIGFyclJlbW92ZV8xLmFyclJlbW92ZShidWZmZXJSZWNvcmRzLCByZWNvcmQpOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcik7CiAgICAgICAgICByZXN0YXJ0T25FbWl0ICYmIHN0YXJ0QnVmZmVyKCk7CiAgICAgICAgfTsKICAgICAgICB2YXIgc3RhcnRCdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChidWZmZXJSZWNvcmRzKSB7CiAgICAgICAgICAgIHZhciBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBzdWJzY3JpYmVyLmFkZChzdWJzKTsKICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFtdOwogICAgICAgICAgICB2YXIgcmVjb3JkXzEgPSB7CiAgICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAgIHN1YnMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYnVmZmVyUmVjb3Jkcy5wdXNoKHJlY29yZF8xKTsKICAgICAgICAgICAgZXhlY3V0ZVNjaGVkdWxlXzEuZXhlY3V0ZVNjaGVkdWxlKHN1YnMsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGVtaXQocmVjb3JkXzEpOwogICAgICAgICAgICB9LCBidWZmZXJUaW1lU3Bhbik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpZiAoYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCAhPT0gbnVsbCAmJiBidWZmZXJDcmVhdGlvbkludGVydmFsID49IDApIHsKICAgICAgICAgIGV4ZWN1dGVTY2hlZHVsZV8xLmV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIHN0YXJ0QnVmZmVyLCBidWZmZXJDcmVhdGlvbkludGVydmFsLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdGFydE9uRW1pdCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN0YXJ0QnVmZmVyKCk7CiAgICAgICAgdmFyIGJ1ZmZlclRpbWVTdWJzY3JpYmVyID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIgZV8xLCBfYTI7CiAgICAgICAgICB2YXIgcmVjb3Jkc0NvcHkgPSBidWZmZXJSZWNvcmRzLnNsaWNlKCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciByZWNvcmRzQ29weV8xID0gX192YWx1ZXMocmVjb3Jkc0NvcHkpLCByZWNvcmRzQ29weV8xXzEgPSByZWNvcmRzQ29weV8xLm5leHQoKTsgIXJlY29yZHNDb3B5XzFfMS5kb25lOyByZWNvcmRzQ29weV8xXzEgPSByZWNvcmRzQ29weV8xLm5leHQoKSkgewogICAgICAgICAgICAgIHZhciByZWNvcmQgPSByZWNvcmRzQ29weV8xXzEudmFsdWU7CiAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHJlY29yZC5idWZmZXI7CiAgICAgICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpOwogICAgICAgICAgICAgIG1heEJ1ZmZlclNpemUgPD0gYnVmZmVyLmxlbmd0aCAmJiBlbWl0KHJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmIChyZWNvcmRzQ29weV8xXzEgJiYgIXJlY29yZHNDb3B5XzFfMS5kb25lICYmIChfYTIgPSByZWNvcmRzQ29weV8xLnJldHVybikpIF9hMi5jYWxsKHJlY29yZHNDb3B5XzEpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgd2hpbGUgKGJ1ZmZlclJlY29yZHMgPT09IG51bGwgfHwgYnVmZmVyUmVjb3JkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVmZmVyUmVjb3Jkcy5sZW5ndGgpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlclJlY29yZHMuc2hpZnQoKS5idWZmZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnVmZmVyVGltZVN1YnNjcmliZXIgPT09IG51bGwgfHwgYnVmZmVyVGltZVN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlclRpbWVTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICBzdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBidWZmZXJSZWNvcmRzID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGJ1ZmZlclRpbWVTdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5idWZmZXJUaW1lID0gYnVmZmVyVGltZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyVG9nZ2xlLmpzCnZhciByZXF1aXJlX2J1ZmZlclRvZ2dsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUb2dnbGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmJ1ZmZlclRvZ2dsZSA9IHZvaWQgMDsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBhcnJSZW1vdmVfMSA9IHJlcXVpcmVfYXJyUmVtb3ZlKCk7CiAgICBmdW5jdGlvbiBidWZmZXJUb2dnbGUob3BlbmluZ3MsIGNsb3NpbmdTZWxlY3RvcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGJ1ZmZlcnMgPSBbXTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20ob3BlbmluZ3MpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24ob3BlblZhbHVlKSB7CiAgICAgICAgICB2YXIgYnVmZmVyID0gW107CiAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTsKICAgICAgICAgIHZhciBjbG9zaW5nU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbigpOwogICAgICAgICAgdmFyIGVtaXRCdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKGJ1ZmZlcnMsIGJ1ZmZlcik7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpOwogICAgICAgICAgICBjbG9zaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgY2xvc2luZ1N1YnNjcmlwdGlvbi5hZGQoaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGNsb3NpbmdTZWxlY3RvcihvcGVuVmFsdWUpKS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGVtaXRCdWZmZXIsIG5vb3BfMS5ub29wKSkpOwogICAgICAgIH0sIG5vb3BfMS5ub29wKSk7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHZhciBlXzEsIF9hOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yICh2YXIgYnVmZmVyc18xID0gX192YWx1ZXMoYnVmZmVycyksIGJ1ZmZlcnNfMV8xID0gYnVmZmVyc18xLm5leHQoKTsgIWJ1ZmZlcnNfMV8xLmRvbmU7IGJ1ZmZlcnNfMV8xID0gYnVmZmVyc18xLm5leHQoKSkgewogICAgICAgICAgICAgIHZhciBidWZmZXIgPSBidWZmZXJzXzFfMS52YWx1ZTsKICAgICAgICAgICAgICBidWZmZXIucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzEpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgd2hpbGUgKGJ1ZmZlcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYnVmZmVycy5zaGlmdCgpKTsKICAgICAgICAgIH0KICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuYnVmZmVyVG9nZ2xlID0gYnVmZmVyVG9nZ2xlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJXaGVuLmpzCnZhciByZXF1aXJlX2J1ZmZlcldoZW4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyV2hlbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuYnVmZmVyV2hlbiA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gYnVmZmVyV2hlbihjbG9zaW5nU2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBidWZmZXIgPSBudWxsOwogICAgICAgIHZhciBjbG9zaW5nU3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgdmFyIG9wZW5CdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGNsb3NpbmdTdWJzY3JpYmVyID09PSBudWxsIHx8IGNsb3NpbmdTdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbG9zaW5nU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgdmFyIGIgPSBidWZmZXI7CiAgICAgICAgICBidWZmZXIgPSBbXTsKICAgICAgICAgIGIgJiYgc3Vic2NyaWJlci5uZXh0KGIpOwogICAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGNsb3NpbmdTZWxlY3RvcigpKS5zdWJzY3JpYmUoY2xvc2luZ1N1YnNjcmliZXIgPSBPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgb3BlbkJ1ZmZlciwgbm9vcF8xLm5vb3ApKTsKICAgICAgICB9OwogICAgICAgIG9wZW5CdWZmZXIoKTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGJ1ZmZlciA9PT0gbnVsbCB8fCBidWZmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIGJ1ZmZlciAmJiBzdWJzY3JpYmVyLm5leHQoYnVmZmVyKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGJ1ZmZlciA9IGNsb3NpbmdTdWJzY3JpYmVyID0gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuYnVmZmVyV2hlbiA9IGJ1ZmZlcldoZW47CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanMKdmFyIHJlcXVpcmVfY2F0Y2hFcnJvciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jYXRjaEVycm9yLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jYXRjaEVycm9yID0gdm9pZCAwOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICBmdW5jdGlvbiBjYXRjaEVycm9yKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaW5uZXJTdWIgPSBudWxsOwogICAgICAgIHZhciBzeW5jVW5zdWIgPSBmYWxzZTsKICAgICAgICB2YXIgaGFuZGxlZFJlc3VsdDsKICAgICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIGhhbmRsZWRSZXN1bHQgPSBpbm5lckZyb21fMS5pbm5lckZyb20oc2VsZWN0b3IoZXJyLCBjYXRjaEVycm9yKHNlbGVjdG9yKShzb3VyY2UpKSk7CiAgICAgICAgICBpZiAoaW5uZXJTdWIpIHsKICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsOwogICAgICAgICAgICBoYW5kbGVkUmVzdWx0LnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN5bmNVbnN1YiA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGlmIChzeW5jVW5zdWIpIHsKICAgICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBpbm5lclN1YiA9IG51bGw7CiAgICAgICAgICBoYW5kbGVkUmVzdWx0LnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuY2F0Y2hFcnJvciA9IGNhdGNoRXJyb3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NjYW5JbnRlcm5hbHMuanMKdmFyIHJlcXVpcmVfc2NhbkludGVybmFscyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zY2FuSW50ZXJuYWxzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zY2FuSW50ZXJuYWxzID0gdm9pZCAwOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHNjYW5JbnRlcm5hbHMoYWNjdW11bGF0b3IsIHNlZWQsIGhhc1NlZWQsIGVtaXRPbk5leHQsIGVtaXRCZWZvcmVDb21wbGV0ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGhhc1N0YXRlID0gaGFzU2VlZDsKICAgICAgICB2YXIgc3RhdGUgPSBzZWVkOwogICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHZhciBpID0gaW5kZXgrKzsKICAgICAgICAgIHN0YXRlID0gaGFzU3RhdGUgPyBhY2N1bXVsYXRvcihzdGF0ZSwgdmFsdWUsIGkpIDogKGhhc1N0YXRlID0gdHJ1ZSwgdmFsdWUpOwogICAgICAgICAgZW1pdE9uTmV4dCAmJiBzdWJzY3JpYmVyLm5leHQoc3RhdGUpOwogICAgICAgIH0sIGVtaXRCZWZvcmVDb21wbGV0ZSAmJiBmdW5jdGlvbigpIHsKICAgICAgICAgIGhhc1N0YXRlICYmIHN1YnNjcmliZXIubmV4dChzdGF0ZSk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSkpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIuc2NhbkludGVybmFscyA9IHNjYW5JbnRlcm5hbHM7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3JlZHVjZS5qcwp2YXIgcmVxdWlyZV9yZWR1Y2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcmVkdWNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5yZWR1Y2UgPSB2b2lkIDA7CiAgICB2YXIgc2NhbkludGVybmFsc18xID0gcmVxdWlyZV9zY2FuSW50ZXJuYWxzKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICBmdW5jdGlvbiByZWR1Y2UoYWNjdW11bGF0b3IsIHNlZWQpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKHNjYW5JbnRlcm5hbHNfMS5zY2FuSW50ZXJuYWxzKGFjY3VtdWxhdG9yLCBzZWVkLCBhcmd1bWVudHMubGVuZ3RoID49IDIsIGZhbHNlLCB0cnVlKSk7CiAgICB9CiAgICBleHBvcnRzMi5yZWR1Y2UgPSByZWR1Y2U7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RvQXJyYXkuanMKdmFyIHJlcXVpcmVfdG9BcnJheSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90b0FycmF5LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi50b0FycmF5ID0gdm9pZCAwOwogICAgdmFyIHJlZHVjZV8xID0gcmVxdWlyZV9yZWR1Y2UoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBhcnJSZWR1Y2VyID0gZnVuY3Rpb24oYXJyLCB2YWx1ZSkgewogICAgICByZXR1cm4gYXJyLnB1c2godmFsdWUpLCBhcnI7CiAgICB9OwogICAgZnVuY3Rpb24gdG9BcnJheSgpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHJlZHVjZV8xLnJlZHVjZShhcnJSZWR1Y2VyLCBbXSkoc291cmNlKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudG9BcnJheSA9IHRvQXJyYXk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2pvaW5BbGxJbnRlcm5hbHMuanMKdmFyIHJlcXVpcmVfam9pbkFsbEludGVybmFscyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9qb2luQWxsSW50ZXJuYWxzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5qb2luQWxsSW50ZXJuYWxzID0gdm9pZCAwOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICB2YXIgbWFwT25lT3JNYW55QXJnc18xID0gcmVxdWlyZV9tYXBPbmVPck1hbnlBcmdzKCk7CiAgICB2YXIgcGlwZV8xID0gcmVxdWlyZV9waXBlKCk7CiAgICB2YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmVfbWVyZ2VNYXAoKTsKICAgIHZhciB0b0FycmF5XzEgPSByZXF1aXJlX3RvQXJyYXkoKTsKICAgIGZ1bmN0aW9uIGpvaW5BbGxJbnRlcm5hbHMoam9pbkZuLCBwcm9qZWN0KSB7CiAgICAgIHJldHVybiBwaXBlXzEucGlwZSh0b0FycmF5XzEudG9BcnJheSgpLCBtZXJnZU1hcF8xLm1lcmdlTWFwKGZ1bmN0aW9uKHNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gam9pbkZuKHNvdXJjZXMpOwogICAgICB9KSwgcHJvamVjdCA/IG1hcE9uZU9yTWFueUFyZ3NfMS5tYXBPbmVPck1hbnlBcmdzKHByb2plY3QpIDogaWRlbnRpdHlfMS5pZGVudGl0eSk7CiAgICB9CiAgICBleHBvcnRzMi5qb2luQWxsSW50ZXJuYWxzID0gam9pbkFsbEludGVybmFsczsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdEFsbC5qcwp2YXIgcmVxdWlyZV9jb21iaW5lTGF0ZXN0QWxsID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3RBbGwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbWJpbmVMYXRlc3RBbGwgPSB2b2lkIDA7CiAgICB2YXIgY29tYmluZUxhdGVzdF8xID0gcmVxdWlyZV9jb21iaW5lTGF0ZXN0KCk7CiAgICB2YXIgam9pbkFsbEludGVybmFsc18xID0gcmVxdWlyZV9qb2luQWxsSW50ZXJuYWxzKCk7CiAgICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0QWxsKHByb2plY3QpIHsKICAgICAgcmV0dXJuIGpvaW5BbGxJbnRlcm5hbHNfMS5qb2luQWxsSW50ZXJuYWxzKGNvbWJpbmVMYXRlc3RfMS5jb21iaW5lTGF0ZXN0LCBwcm9qZWN0KTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbWJpbmVMYXRlc3RBbGwgPSBjb21iaW5lTGF0ZXN0QWxsOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lQWxsLmpzCnZhciByZXF1aXJlX2NvbWJpbmVBbGwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUFsbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29tYmluZUFsbCA9IHZvaWQgMDsKICAgIHZhciBjb21iaW5lTGF0ZXN0QWxsXzEgPSByZXF1aXJlX2NvbWJpbmVMYXRlc3RBbGwoKTsKICAgIGV4cG9ydHMyLmNvbWJpbmVBbGwgPSBjb21iaW5lTGF0ZXN0QWxsXzEuY29tYmluZUxhdGVzdEFsbDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdC5qcwp2YXIgcmVxdWlyZV9jb21iaW5lTGF0ZXN0MiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jb21iaW5lTGF0ZXN0ID0gdm9pZCAwOwogICAgdmFyIGNvbWJpbmVMYXRlc3RfMSA9IHJlcXVpcmVfY29tYmluZUxhdGVzdCgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIGFyZ3NPckFyZ0FycmF5XzEgPSByZXF1aXJlX2FyZ3NPckFyZ0FycmF5KCk7CiAgICB2YXIgbWFwT25lT3JNYW55QXJnc18xID0gcmVxdWlyZV9tYXBPbmVPck1hbnlBcmdzKCk7CiAgICB2YXIgcGlwZV8xID0gcmVxdWlyZV9waXBlKCk7CiAgICB2YXIgYXJnc18xID0gcmVxdWlyZV9hcmdzKCk7CiAgICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0KCkgewogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBhcmdzXzEucG9wUmVzdWx0U2VsZWN0b3IoYXJncyk7CiAgICAgIHJldHVybiByZXN1bHRTZWxlY3RvciA/IHBpcGVfMS5waXBlKGNvbWJpbmVMYXRlc3QuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKSwgbWFwT25lT3JNYW55QXJnc18xLm1hcE9uZU9yTWFueUFyZ3MocmVzdWx0U2VsZWN0b3IpKSA6IGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIGNvbWJpbmVMYXRlc3RfMS5jb21iaW5lTGF0ZXN0SW5pdChfX3NwcmVhZEFycmF5KFtzb3VyY2VdLCBfX3JlYWQoYXJnc09yQXJnQXJyYXlfMS5hcmdzT3JBcmdBcnJheShhcmdzKSkpKShzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5jb21iaW5lTGF0ZXN0ID0gY29tYmluZUxhdGVzdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdFdpdGguanMKdmFyIHJlcXVpcmVfY29tYmluZUxhdGVzdFdpdGggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdFdpdGguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19yZWFkID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19yZWFkIHx8IGZ1bmN0aW9uKG8sIG4pIHsKICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsKICAgICAgaWYgKCFtKSByZXR1cm4gbzsKICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7CiAgICAgIHRyeSB7CiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgZSA9IHsgZXJyb3IgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbInJldHVybiJdKSkgbS5jYWxsKGkpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFyOwogICAgfTsKICAgIHZhciBfX3NwcmVhZEFycmF5ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zcHJlYWRBcnJheSB8fCBmdW5jdGlvbih0bywgZnJvbSkgewogICAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKykKICAgICAgICB0b1tqXSA9IGZyb21baV07CiAgICAgIHJldHVybiB0bzsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbWJpbmVMYXRlc3RXaXRoID0gdm9pZCAwOwogICAgdmFyIGNvbWJpbmVMYXRlc3RfMSA9IHJlcXVpcmVfY29tYmluZUxhdGVzdDIoKTsKICAgIGZ1bmN0aW9uIGNvbWJpbmVMYXRlc3RXaXRoKCkgewogICAgICB2YXIgb3RoZXJTb3VyY2VzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgb3RoZXJTb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3RfMS5jb21iaW5lTGF0ZXN0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKG90aGVyU291cmNlcykpKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbWJpbmVMYXRlc3RXaXRoID0gY29tYmluZUxhdGVzdFdpdGg7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdE1hcC5qcwp2YXIgcmVxdWlyZV9jb25jYXRNYXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0TWFwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jb25jYXRNYXAgPSB2b2lkIDA7CiAgICB2YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmVfbWVyZ2VNYXAoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIGZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpID8gbWVyZ2VNYXBfMS5tZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkgOiBtZXJnZU1hcF8xLm1lcmdlTWFwKHByb2plY3QsIDEpOwogICAgfQogICAgZXhwb3J0czIuY29uY2F0TWFwID0gY29uY2F0TWFwOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXBUby5qcwp2YXIgcmVxdWlyZV9jb25jYXRNYXBUbyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXBUby5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29uY2F0TWFwVG8gPSB2b2lkIDA7CiAgICB2YXIgY29uY2F0TWFwXzEgPSByZXF1aXJlX2NvbmNhdE1hcCgpOwogICAgdmFyIGlzRnVuY3Rpb25fMSA9IHJlcXVpcmVfaXNGdW5jdGlvbigpOwogICAgZnVuY3Rpb24gY29uY2F0TWFwVG8oaW5uZXJPYnNlcnZhYmxlLCByZXN1bHRTZWxlY3RvcikgewogICAgICByZXR1cm4gaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpID8gY29uY2F0TWFwXzEuY29uY2F0TWFwKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpbm5lck9ic2VydmFibGU7CiAgICAgIH0sIHJlc3VsdFNlbGVjdG9yKSA6IGNvbmNhdE1hcF8xLmNvbmNhdE1hcChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gaW5uZXJPYnNlcnZhYmxlOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbmNhdE1hcFRvID0gY29uY2F0TWFwVG87CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdC5qcwp2YXIgcmVxdWlyZV9jb25jYXQyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29uY2F0ID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIGNvbmNhdEFsbF8xID0gcmVxdWlyZV9jb25jYXRBbGwoKTsKICAgIHZhciBhcmdzXzEgPSByZXF1aXJlX2FyZ3MoKTsKICAgIHZhciBmcm9tXzEgPSByZXF1aXJlX2Zyb20oKTsKICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgdmFyIHNjaGVkdWxlciA9IGFyZ3NfMS5wb3BTY2hlZHVsZXIoYXJncyk7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICBjb25jYXRBbGxfMS5jb25jYXRBbGwoKShmcm9tXzEuZnJvbShfX3NwcmVhZEFycmF5KFtzb3VyY2VdLCBfX3JlYWQoYXJncykpLCBzY2hlZHVsZXIpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuY29uY2F0ID0gY29uY2F0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRXaXRoLmpzCnZhciByZXF1aXJlX2NvbmNhdFdpdGggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0V2l0aC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY29uY2F0V2l0aCA9IHZvaWQgMDsKICAgIHZhciBjb25jYXRfMSA9IHJlcXVpcmVfY29uY2F0MigpOwogICAgZnVuY3Rpb24gY29uY2F0V2l0aCgpIHsKICAgICAgdmFyIG90aGVyU291cmNlcyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIG90aGVyU291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHJldHVybiBjb25jYXRfMS5jb25jYXQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQob3RoZXJTb3VyY2VzKSkpOwogICAgfQogICAgZXhwb3J0czIuY29uY2F0V2l0aCA9IGNvbmNhdFdpdGg7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tU3Vic2NyaWJhYmxlLmpzCnZhciByZXF1aXJlX2Zyb21TdWJzY3JpYmFibGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21TdWJzY3JpYmFibGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZyb21TdWJzY3JpYmFibGUgPSB2b2lkIDA7CiAgICB2YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZV9PYnNlcnZhYmxlKCk7CiAgICBmdW5jdGlvbiBmcm9tU3Vic2NyaWJhYmxlKHN1YnNjcmliYWJsZSkgewogICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJhYmxlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tU3Vic2NyaWJhYmxlID0gZnJvbVN1YnNjcmliYWJsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvY29ubmVjdC5qcwp2YXIgcmVxdWlyZV9jb25uZWN0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2Nvbm5lY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNvbm5lY3QgPSB2b2lkIDA7CiAgICB2YXIgU3ViamVjdF8xID0gcmVxdWlyZV9TdWJqZWN0KCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIGZyb21TdWJzY3JpYmFibGVfMSA9IHJlcXVpcmVfZnJvbVN1YnNjcmliYWJsZSgpOwogICAgdmFyIERFRkFVTFRfQ09ORklHID0gewogICAgICBjb25uZWN0b3I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGNvbm5lY3Qoc2VsZWN0b3IsIGNvbmZpZykgewogICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsKICAgICAgICBjb25maWcgPSBERUZBVUxUX0NPTkZJRzsKICAgICAgfQogICAgICB2YXIgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBzdWJqZWN0ID0gY29ubmVjdG9yKCk7CiAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKHNlbGVjdG9yKGZyb21TdWJzY3JpYmFibGVfMS5mcm9tU3Vic2NyaWJhYmxlKHN1YmplY3QpKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIHN1YnNjcmliZXIuYWRkKHNvdXJjZS5zdWJzY3JpYmUoc3ViamVjdCkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbm5lY3QgPSBjb25uZWN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb3VudC5qcwp2YXIgcmVxdWlyZV9jb3VudCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9jb3VudC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY291bnQgPSB2b2lkIDA7CiAgICB2YXIgcmVkdWNlXzEgPSByZXF1aXJlX3JlZHVjZSgpOwogICAgZnVuY3Rpb24gY291bnQocHJlZGljYXRlKSB7CiAgICAgIHJldHVybiByZWR1Y2VfMS5yZWR1Y2UoZnVuY3Rpb24odG90YWwsIHZhbHVlLCBpKSB7CiAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHZhbHVlLCBpKSA/IHRvdGFsICsgMSA6IHRvdGFsOwogICAgICB9LCAwKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvdW50ID0gY291bnQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlLmpzCnZhciByZXF1aXJlX2RlYm91bmNlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5kZWJvdW5jZSA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gZGVib3VuY2UoZHVyYXRpb25TZWxlY3RvcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdmFyIGR1cmF0aW9uU3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBkdXJhdGlvblN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGR1cmF0aW9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID0gbnVsbDsKICAgICAgICAgIGlmIChoYXNWYWx1ZSkgewogICAgICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgdmFsdWUgPSBsYXN0VmFsdWU7CiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID09PSBudWxsIHx8IGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZHVyYXRpb25TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICBsYXN0VmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9IE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbWl0LCBub29wXzEubm9vcCk7CiAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oZHVyYXRpb25TZWxlY3Rvcih2YWx1ZSkpLnN1YnNjcmliZShkdXJhdGlvblN1YnNjcmliZXIpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgZW1pdCgpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBsYXN0VmFsdWUgPSBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kZWJvdW5jZSA9IGRlYm91bmNlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanMKdmFyIHJlcXVpcmVfZGVib3VuY2VUaW1lID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlVGltZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZGVib3VuY2VUaW1lID0gdm9pZCAwOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gZGVib3VuY2VUaW1lKGR1ZVRpbWUsIHNjaGVkdWxlcikgewogICAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsKICAgICAgICBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jU2NoZWR1bGVyOwogICAgICB9CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgYWN0aXZlVGFzayA9IG51bGw7CiAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdmFyIGxhc3RUaW1lID0gbnVsbDsKICAgICAgICB2YXIgZW1pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGFjdGl2ZVRhc2spIHsKICAgICAgICAgICAgYWN0aXZlVGFzay51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBhY3RpdmVUYXNrID0gbnVsbDsKICAgICAgICAgICAgdmFyIHZhbHVlID0gbGFzdFZhbHVlOwogICAgICAgICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gZW1pdFdoZW5JZGxlKCkgewogICAgICAgICAgdmFyIHRhcmdldFRpbWUgPSBsYXN0VGltZSArIGR1ZVRpbWU7CiAgICAgICAgICB2YXIgbm93ID0gc2NoZWR1bGVyLm5vdygpOwogICAgICAgICAgaWYgKG5vdyA8IHRhcmdldFRpbWUpIHsKICAgICAgICAgICAgYWN0aXZlVGFzayA9IHRoaXMuc2NoZWR1bGUodm9pZCAwLCB0YXJnZXRUaW1lIC0gbm93KTsKICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGVtaXQoKTsKICAgICAgICB9CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgbGFzdFRpbWUgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgICAgICBpZiAoIWFjdGl2ZVRhc2spIHsKICAgICAgICAgICAgYWN0aXZlVGFzayA9IHNjaGVkdWxlci5zY2hlZHVsZShlbWl0V2hlbklkbGUsIGR1ZVRpbWUpOwogICAgICAgICAgICBzdWJzY3JpYmVyLmFkZChhY3RpdmVUYXNrKTsKICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIGVtaXQoKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgbGFzdFZhbHVlID0gYWN0aXZlVGFzayA9IG51bGw7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmRlYm91bmNlVGltZSA9IGRlYm91bmNlVGltZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanMKdmFyIHJlcXVpcmVfZGVmYXVsdElmRW1wdHkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRlZmF1bHRJZkVtcHR5ID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChkZWZhdWx0VmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kZWZhdWx0SWZFbXB0eSA9IGRlZmF1bHRJZkVtcHR5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzCnZhciByZXF1aXJlX3Rha2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGFrZSA9IHZvaWQgMDsKICAgIHZhciBlbXB0eV8xID0gcmVxdWlyZV9lbXB0eSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHRha2UoY291bnQpIHsKICAgICAgcmV0dXJuIGNvdW50IDw9IDAgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZW1wdHlfMS5FTVBUWTsKICAgICAgfSA6IGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBzZWVuID0gMDsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgaWYgKCsrc2VlbiA8PSBjb3VudCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICBpZiAoY291bnQgPD0gc2VlbikgewogICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi50YWtlID0gdGFrZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvaWdub3JlRWxlbWVudHMuanMKdmFyIHJlcXVpcmVfaWdub3JlRWxlbWVudHMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvaWdub3JlRWxlbWVudHMuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlnbm9yZUVsZW1lbnRzID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIGZ1bmN0aW9uIGlnbm9yZUVsZW1lbnRzKCkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgbm9vcF8xLm5vb3ApKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5pZ25vcmVFbGVtZW50cyA9IGlnbm9yZUVsZW1lbnRzOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qcwp2YXIgcmVxdWlyZV9tYXBUbyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWFwVG8gPSB2b2lkIDA7CiAgICB2YXIgbWFwXzEgPSByZXF1aXJlX21hcCgpOwogICAgZnVuY3Rpb24gbWFwVG8odmFsdWUpIHsKICAgICAgcmV0dXJuIG1hcF8xLm1hcChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIubWFwVG8gPSBtYXBUbzsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXlXaGVuLmpzCnZhciByZXF1aXJlX2RlbGF5V2hlbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9kZWxheVdoZW4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRlbGF5V2hlbiA9IHZvaWQgMDsKICAgIHZhciBjb25jYXRfMSA9IHJlcXVpcmVfY29uY2F0KCk7CiAgICB2YXIgdGFrZV8xID0gcmVxdWlyZV90YWtlKCk7CiAgICB2YXIgaWdub3JlRWxlbWVudHNfMSA9IHJlcXVpcmVfaWdub3JlRWxlbWVudHMoKTsKICAgIHZhciBtYXBUb18xID0gcmVxdWlyZV9tYXBUbygpOwogICAgdmFyIG1lcmdlTWFwXzEgPSByZXF1aXJlX21lcmdlTWFwKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gZGVsYXlXaGVuKGRlbGF5RHVyYXRpb25TZWxlY3Rvciwgc3Vic2NyaXB0aW9uRGVsYXkpIHsKICAgICAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIGNvbmNhdF8xLmNvbmNhdChzdWJzY3JpcHRpb25EZWxheS5waXBlKHRha2VfMS50YWtlKDEpLCBpZ25vcmVFbGVtZW50c18xLmlnbm9yZUVsZW1lbnRzKCkpLCBzb3VyY2UucGlwZShkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yKSkpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG1lcmdlTWFwXzEubWVyZ2VNYXAoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuIGlubmVyRnJvbV8xLmlubmVyRnJvbShkZWxheUR1cmF0aW9uU2VsZWN0b3IodmFsdWUsIGluZGV4KSkucGlwZSh0YWtlXzEudGFrZSgxKSwgbWFwVG9fMS5tYXBUbyh2YWx1ZSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmRlbGF5V2hlbiA9IGRlbGF5V2hlbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanMKdmFyIHJlcXVpcmVfZGVsYXkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRlbGF5ID0gdm9pZCAwOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICB2YXIgZGVsYXlXaGVuXzEgPSByZXF1aXJlX2RlbGF5V2hlbigpOwogICAgdmFyIHRpbWVyXzEgPSByZXF1aXJlX3RpbWVyKCk7CiAgICBmdW5jdGlvbiBkZWxheShkdWUsIHNjaGVkdWxlcikgewogICAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsKICAgICAgICBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jU2NoZWR1bGVyOwogICAgICB9CiAgICAgIHZhciBkdXJhdGlvbiA9IHRpbWVyXzEudGltZXIoZHVlLCBzY2hlZHVsZXIpOwogICAgICByZXR1cm4gZGVsYXlXaGVuXzEuZGVsYXlXaGVuKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkdXJhdGlvbjsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kZWxheSA9IGRlbGF5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9kZW1hdGVyaWFsaXplLmpzCnZhciByZXF1aXJlX2RlbWF0ZXJpYWxpemUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGVtYXRlcmlhbGl6ZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZGVtYXRlcmlhbGl6ZSA9IHZvaWQgMDsKICAgIHZhciBOb3RpZmljYXRpb25fMSA9IHJlcXVpcmVfTm90aWZpY2F0aW9uKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gZGVtYXRlcmlhbGl6ZSgpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKG5vdGlmaWNhdGlvbikgewogICAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbl8xLm9ic2VydmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuZGVtYXRlcmlhbGl6ZSA9IGRlbWF0ZXJpYWxpemU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0LmpzCnZhciByZXF1aXJlX2Rpc3RpbmN0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5kaXN0aW5jdCA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgbm9vcF8xID0gcmVxdWlyZV9ub29wKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gZGlzdGluY3Qoa2V5U2VsZWN0b3IsIGZsdXNoZXMpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBkaXN0aW5jdEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5U2VsZWN0b3IgPyBrZXlTZWxlY3Rvcih2YWx1ZSkgOiB2YWx1ZTsKICAgICAgICAgIGlmICghZGlzdGluY3RLZXlzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgIGRpc3RpbmN0S2V5cy5hZGQoa2V5KTsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgZmx1c2hlcyAmJiBpbm5lckZyb21fMS5pbm5lckZyb20oZmx1c2hlcykuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBkaXN0aW5jdEtleXMuY2xlYXIoKTsKICAgICAgICB9LCBub29wXzEubm9vcCkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmRpc3RpbmN0ID0gZGlzdGluY3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxDaGFuZ2VkLmpzCnZhciByZXF1aXJlX2Rpc3RpbmN0VW50aWxDaGFuZ2VkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxDaGFuZ2VkLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5kaXN0aW5jdFVudGlsQ2hhbmdlZCA9IHZvaWQgMDsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGNvbXBhcmF0b3IsIGtleVNlbGVjdG9yKSB7CiAgICAgIGlmIChrZXlTZWxlY3RvciA9PT0gdm9pZCAwKSB7CiAgICAgICAga2V5U2VsZWN0b3IgPSBpZGVudGl0eV8xLmlkZW50aXR5OwogICAgICB9CiAgICAgIGNvbXBhcmF0b3IgPSBjb21wYXJhdG9yICE9PSBudWxsICYmIGNvbXBhcmF0b3IgIT09IHZvaWQgMCA/IGNvbXBhcmF0b3IgOiBkZWZhdWx0Q29tcGFyZTsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBwcmV2aW91c0tleTsKICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIgY3VycmVudEtleSA9IGtleVNlbGVjdG9yKHZhbHVlKTsKICAgICAgICAgIGlmIChmaXJzdCB8fCAhY29tcGFyYXRvcihwcmV2aW91c0tleSwgY3VycmVudEtleSkpIHsKICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgcHJldmlvdXNLZXkgPSBjdXJyZW50S2V5OwogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kaXN0aW5jdFVudGlsQ2hhbmdlZCA9IGRpc3RpbmN0VW50aWxDaGFuZ2VkOwogICAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikgewogICAgICByZXR1cm4gYSA9PT0gYjsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3RVbnRpbEtleUNoYW5nZWQuanMKdmFyIHJlcXVpcmVfZGlzdGluY3RVbnRpbEtleUNoYW5nZWQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3RVbnRpbEtleUNoYW5nZWQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkID0gdm9pZCAwOwogICAgdmFyIGRpc3RpbmN0VW50aWxDaGFuZ2VkXzEgPSByZXF1aXJlX2Rpc3RpbmN0VW50aWxDaGFuZ2VkKCk7CiAgICBmdW5jdGlvbiBkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZChrZXksIGNvbXBhcmUpIHsKICAgICAgcmV0dXJuIGRpc3RpbmN0VW50aWxDaGFuZ2VkXzEuZGlzdGluY3RVbnRpbENoYW5nZWQoZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHJldHVybiBjb21wYXJlID8gY29tcGFyZSh4W2tleV0sIHlba2V5XSkgOiB4W2tleV0gPT09IHlba2V5XTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCA9IGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aHJvd0lmRW1wdHkuanMKdmFyIHJlcXVpcmVfdGhyb3dJZkVtcHR5ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGhyb3dJZkVtcHR5ID0gdm9pZCAwOwogICAgdmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmVfRW1wdHlFcnJvcigpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHRocm93SWZFbXB0eShlcnJvckZhY3RvcnkpIHsKICAgICAgaWYgKGVycm9yRmFjdG9yeSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZXJyb3JGYWN0b3J5ID0gZGVmYXVsdEVycm9yRmFjdG9yeTsKICAgICAgfQogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gaGFzVmFsdWUgPyBzdWJzY3JpYmVyLmNvbXBsZXRlKCkgOiBzdWJzY3JpYmVyLmVycm9yKGVycm9yRmFjdG9yeSgpKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudGhyb3dJZkVtcHR5ID0gdGhyb3dJZkVtcHR5OwogICAgZnVuY3Rpb24gZGVmYXVsdEVycm9yRmFjdG9yeSgpIHsKICAgICAgcmV0dXJuIG5ldyBFbXB0eUVycm9yXzEuRW1wdHlFcnJvcigpOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9lbGVtZW50QXQuanMKdmFyIHJlcXVpcmVfZWxlbWVudEF0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2VsZW1lbnRBdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZWxlbWVudEF0ID0gdm9pZCAwOwogICAgdmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yXzEgPSByZXF1aXJlX0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7CiAgICB2YXIgZmlsdGVyXzEgPSByZXF1aXJlX2ZpbHRlcigpOwogICAgdmFyIHRocm93SWZFbXB0eV8xID0gcmVxdWlyZV90aHJvd0lmRW1wdHkoKTsKICAgIHZhciBkZWZhdWx0SWZFbXB0eV8xID0gcmVxdWlyZV9kZWZhdWx0SWZFbXB0eSgpOwogICAgdmFyIHRha2VfMSA9IHJlcXVpcmVfdGFrZSgpOwogICAgZnVuY3Rpb24gZWxlbWVudEF0KGluZGV4LCBkZWZhdWx0VmFsdWUpIHsKICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7CiAgICAgIH0KICAgICAgdmFyIGhhc0RlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UucGlwZShmaWx0ZXJfMS5maWx0ZXIoZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgcmV0dXJuIGkgPT09IGluZGV4OwogICAgICAgIH0pLCB0YWtlXzEudGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHlfMS5kZWZhdWx0SWZFbXB0eShkZWZhdWx0VmFsdWUpIDogdGhyb3dJZkVtcHR5XzEudGhyb3dJZkVtcHR5KGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7CiAgICAgICAgfSkpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIuZWxlbWVudEF0ID0gZWxlbWVudEF0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9lbmRXaXRoLmpzCnZhciByZXF1aXJlX2VuZFdpdGggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZW5kV2l0aC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZW5kV2l0aCA9IHZvaWQgMDsKICAgIHZhciBjb25jYXRfMSA9IHJlcXVpcmVfY29uY2F0KCk7CiAgICB2YXIgb2ZfMSA9IHJlcXVpcmVfb2YoKTsKICAgIGZ1bmN0aW9uIGVuZFdpdGgoKSB7CiAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIGNvbmNhdF8xLmNvbmNhdChzb3VyY2UsIG9mXzEub2YuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodmFsdWVzKSkpKTsKICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLmVuZFdpdGggPSBlbmRXaXRoOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9ldmVyeS5qcwp2YXIgcmVxdWlyZV9ldmVyeSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9ldmVyeS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZXZlcnkgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gZXZlcnkocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBpZiAoIXByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrLCBzb3VyY2UpKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChmYWxzZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh0cnVlKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuZXZlcnkgPSBldmVyeTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdE1hcC5qcwp2YXIgcmVxdWlyZV9leGhhdXN0TWFwID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3RNYXAuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmV4aGF1c3RNYXAgPSB2b2lkIDA7CiAgICB2YXIgbWFwXzEgPSByZXF1aXJlX21hcCgpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiBleGhhdXN0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHJldHVybiBzb3VyY2UucGlwZShleGhhdXN0TWFwKGZ1bmN0aW9uKGEsIGkpIHsKICAgICAgICAgICAgcmV0dXJuIGlubmVyRnJvbV8xLmlubmVyRnJvbShwcm9qZWN0KGEsIGkpKS5waXBlKG1hcF8xLm1hcChmdW5jdGlvbihiLCBpaSkgewogICAgICAgICAgICAgIHJldHVybiByZXN1bHRTZWxlY3RvcihhLCBiLCBpLCBpaSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0pKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHZhciBpbm5lclN1YiA9IG51bGw7CiAgICAgICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbihvdXRlclZhbHVlKSB7CiAgICAgICAgICBpZiAoIWlubmVyU3ViKSB7CiAgICAgICAgICAgIGlubmVyU3ViID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsOwogICAgICAgICAgICAgIGlzQ29tcGxldGUgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKHByb2plY3Qob3V0ZXJWYWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShpbm5lclN1Yik7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICFpbm5lclN1YiAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmV4aGF1c3RNYXAgPSBleGhhdXN0TWFwOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0QWxsLmpzCnZhciByZXF1aXJlX2V4aGF1c3RBbGwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdEFsbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZXhoYXVzdEFsbCA9IHZvaWQgMDsKICAgIHZhciBleGhhdXN0TWFwXzEgPSByZXF1aXJlX2V4aGF1c3RNYXAoKTsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgZnVuY3Rpb24gZXhoYXVzdEFsbCgpIHsKICAgICAgcmV0dXJuIGV4aGF1c3RNYXBfMS5leGhhdXN0TWFwKGlkZW50aXR5XzEuaWRlbnRpdHkpOwogICAgfQogICAgZXhwb3J0czIuZXhoYXVzdEFsbCA9IGV4aGF1c3RBbGw7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3QuanMKdmFyIHJlcXVpcmVfZXhoYXVzdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5leGhhdXN0ID0gdm9pZCAwOwogICAgdmFyIGV4aGF1c3RBbGxfMSA9IHJlcXVpcmVfZXhoYXVzdEFsbCgpOwogICAgZXhwb3J0czIuZXhoYXVzdCA9IGV4aGF1c3RBbGxfMS5leGhhdXN0QWxsOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9leHBhbmQuanMKdmFyIHJlcXVpcmVfZXhwYW5kID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2V4cGFuZC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZXhwYW5kID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIG1lcmdlSW50ZXJuYWxzXzEgPSByZXF1aXJlX21lcmdlSW50ZXJuYWxzKCk7CiAgICBmdW5jdGlvbiBleHBhbmQocHJvamVjdCwgY29uY3VycmVudCwgc2NoZWR1bGVyKSB7CiAgICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsKICAgICAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7CiAgICAgIH0KICAgICAgY29uY3VycmVudCA9IChjb25jdXJyZW50IHx8IDApIDwgMSA/IEluZmluaXR5IDogY29uY3VycmVudDsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiBtZXJnZUludGVybmFsc18xLm1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgcHJvamVjdCwgY29uY3VycmVudCwgdm9pZCAwLCB0cnVlLCBzY2hlZHVsZXIpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmV4cGFuZCA9IGV4cGFuZDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmluYWxpemUuanMKdmFyIHJlcXVpcmVfZmluYWxpemUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmluYWxpemUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZpbmFsaXplID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgZnVuY3Rpb24gZmluYWxpemUoY2FsbGJhY2spIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmFkZChjYWxsYmFjayk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmZpbmFsaXplID0gZmluYWxpemU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmQuanMKdmFyIHJlcXVpcmVfZmluZCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9maW5kLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jcmVhdGVGaW5kID0gZXhwb3J0czIuZmluZCA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSwgdGhpc0FyZykgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoY3JlYXRlRmluZChwcmVkaWNhdGUsIHRoaXNBcmcsICJ2YWx1ZSIpKTsKICAgIH0KICAgIGV4cG9ydHMyLmZpbmQgPSBmaW5kOwogICAgZnVuY3Rpb24gY3JlYXRlRmluZChwcmVkaWNhdGUsIHRoaXNBcmcsIGVtaXQpIHsKICAgICAgdmFyIGZpbmRJbmRleCA9IGVtaXQgPT09ICJpbmRleCI7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIgaSA9IGluZGV4Kys7CiAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywgdmFsdWUsIGksIHNvdXJjZSkpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGZpbmRJbmRleCA/IGkgOiB2YWx1ZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChmaW5kSW5kZXggPyAtMSA6IHZvaWQgMCk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSkpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIuY3JlYXRlRmluZCA9IGNyZWF0ZUZpbmQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmRJbmRleC5qcwp2YXIgcmVxdWlyZV9maW5kSW5kZXggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmluZEluZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5maW5kSW5kZXggPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgZmluZF8xID0gcmVxdWlyZV9maW5kKCk7CiAgICBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmaW5kXzEuY3JlYXRlRmluZChwcmVkaWNhdGUsIHRoaXNBcmcsICJpbmRleCIpKTsKICAgIH0KICAgIGV4cG9ydHMyLmZpbmRJbmRleCA9IGZpbmRJbmRleDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmlyc3QuanMKdmFyIHJlcXVpcmVfZmlyc3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmlyc3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmZpcnN0ID0gdm9pZCAwOwogICAgdmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmVfRW1wdHlFcnJvcigpOwogICAgdmFyIGZpbHRlcl8xID0gcmVxdWlyZV9maWx0ZXIoKTsKICAgIHZhciB0YWtlXzEgPSByZXF1aXJlX3Rha2UoKTsKICAgIHZhciBkZWZhdWx0SWZFbXB0eV8xID0gcmVxdWlyZV9kZWZhdWx0SWZFbXB0eSgpOwogICAgdmFyIHRocm93SWZFbXB0eV8xID0gcmVxdWlyZV90aHJvd0lmRW1wdHkoKTsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgZnVuY3Rpb24gZmlyc3QocHJlZGljYXRlLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgdmFyIGhhc0RlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UucGlwZShwcmVkaWNhdGUgPyBmaWx0ZXJfMS5maWx0ZXIoZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2LCBpLCBzb3VyY2UpOwogICAgICAgIH0pIDogaWRlbnRpdHlfMS5pZGVudGl0eSwgdGFrZV8xLnRha2UoMSksIGhhc0RlZmF1bHRWYWx1ZSA/IGRlZmF1bHRJZkVtcHR5XzEuZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eV8xLnRocm93SWZFbXB0eShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3IoKTsKICAgICAgICB9KSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5maXJzdCA9IGZpcnN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9ncm91cEJ5LmpzCnZhciByZXF1aXJlX2dyb3VwQnkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZ3JvdXBCeS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZ3JvdXBCeSA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgU3ViamVjdF8xID0gcmVxdWlyZV9TdWJqZWN0KCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gZ3JvdXBCeShrZXlTZWxlY3RvciwgZWxlbWVudE9yT3B0aW9ucywgZHVyYXRpb24sIGNvbm5lY3RvcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGVsZW1lbnQ7CiAgICAgICAgaWYgKCFlbGVtZW50T3JPcHRpb25zIHx8IHR5cGVvZiBlbGVtZW50T3JPcHRpb25zID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudE9yT3B0aW9uczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZHVyYXRpb24gPSBlbGVtZW50T3JPcHRpb25zLmR1cmF0aW9uLCBlbGVtZW50ID0gZWxlbWVudE9yT3B0aW9ucy5lbGVtZW50LCBjb25uZWN0b3IgPSBlbGVtZW50T3JPcHRpb25zLmNvbm5lY3RvcjsKICAgICAgICB9CiAgICAgICAgdmFyIGdyb3VwcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgdmFyIG5vdGlmeSA9IGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgICBncm91cHMuZm9yRWFjaChjYik7CiAgICAgICAgICBjYihzdWJzY3JpYmVyKTsKICAgICAgICB9OwogICAgICAgIHZhciBoYW5kbGVFcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgcmV0dXJuIG5vdGlmeShmdW5jdGlvbihjb25zdW1lcikgewogICAgICAgICAgICByZXR1cm4gY29uc3VtZXIuZXJyb3IoZXJyKTsKICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGFjdGl2ZUdyb3VwcyA9IDA7CiAgICAgICAgdmFyIHRlYXJkb3duQXR0ZW1wdGVkID0gZmFsc2U7CiAgICAgICAgdmFyIGdyb3VwQnlTb3VyY2VTdWJzY3JpYmVyID0gbmV3IE9wZXJhdG9yU3Vic2NyaWJlcl8xLk9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIGtleV8xID0ga2V5U2VsZWN0b3IodmFsdWUpOwogICAgICAgICAgICB2YXIgZ3JvdXBfMSA9IGdyb3Vwcy5nZXQoa2V5XzEpOwogICAgICAgICAgICBpZiAoIWdyb3VwXzEpIHsKICAgICAgICAgICAgICBncm91cHMuc2V0KGtleV8xLCBncm91cF8xID0gY29ubmVjdG9yID8gY29ubmVjdG9yKCkgOiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKSk7CiAgICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBjcmVhdGVHcm91cGVkT2JzZXJ2YWJsZShrZXlfMSwgZ3JvdXBfMSk7CiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGdyb3VwZWQpOwogICAgICAgICAgICAgIGlmIChkdXJhdGlvbikgewogICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uU3Vic2NyaWJlcl8xID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKGdyb3VwXzEsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICBncm91cF8xLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uU3Vic2NyaWJlcl8xID09PSBudWxsIHx8IGR1cmF0aW9uU3Vic2NyaWJlcl8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkdXJhdGlvblN1YnNjcmliZXJfMS51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfSwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBzLmRlbGV0ZShrZXlfMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdyb3VwQnlTb3VyY2VTdWJzY3JpYmVyLmFkZChpbm5lckZyb21fMS5pbm5lckZyb20oZHVyYXRpb24oZ3JvdXBlZCkpLnN1YnNjcmliZShkdXJhdGlvblN1YnNjcmliZXJfMSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBncm91cF8xLm5leHQoZWxlbWVudCA/IGVsZW1lbnQodmFsdWUpIDogdmFsdWUpOwogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbm90aWZ5KGZ1bmN0aW9uKGNvbnN1bWVyKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdW1lci5jb21wbGV0ZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwgaGFuZGxlRXJyb3IsIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGdyb3Vwcy5jbGVhcigpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdGVhcmRvd25BdHRlbXB0ZWQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGFjdGl2ZUdyb3VwcyA9PT0gMDsKICAgICAgICB9KTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGdyb3VwQnlTb3VyY2VTdWJzY3JpYmVyKTsKICAgICAgICBmdW5jdGlvbiBjcmVhdGVHcm91cGVkT2JzZXJ2YWJsZShrZXksIGdyb3VwU3ViamVjdCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZShmdW5jdGlvbihncm91cFN1YnNjcmliZXIpIHsKICAgICAgICAgICAgYWN0aXZlR3JvdXBzKys7CiAgICAgICAgICAgIHZhciBpbm5lclN1YiA9IGdyb3VwU3ViamVjdC5zdWJzY3JpYmUoZ3JvdXBTdWJzY3JpYmVyKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgLS1hY3RpdmVHcm91cHMgPT09IDAgJiYgdGVhcmRvd25BdHRlbXB0ZWQgJiYgZ3JvdXBCeVNvdXJjZVN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmVzdWx0LmtleSA9IGtleTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmdyb3VwQnkgPSBncm91cEJ5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9pc0VtcHR5LmpzCnZhciByZXF1aXJlX2lzRW1wdHkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvaXNFbXB0eS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaXNFbXB0eSA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiBpc0VtcHR5KCkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZmFsc2UpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRydWUpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5pc0VtcHR5ID0gaXNFbXB0eTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZUxhc3QuanMKdmFyIHJlcXVpcmVfdGFrZUxhc3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZUxhc3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRha2VMYXN0ID0gdm9pZCAwOwogICAgdmFyIGVtcHR5XzEgPSByZXF1aXJlX2VtcHR5KCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gdGFrZUxhc3QoY291bnQpIHsKICAgICAgcmV0dXJuIGNvdW50IDw9IDAgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZW1wdHlfMS5FTVBUWTsKICAgICAgfSA6IGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBidWZmZXIgPSBbXTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpOwogICAgICAgICAgY291bnQgPCBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlci5zaGlmdCgpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGVfMSwgX2E7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBidWZmZXJfMSA9IF9fdmFsdWVzKGJ1ZmZlciksIGJ1ZmZlcl8xXzEgPSBidWZmZXJfMS5uZXh0KCk7ICFidWZmZXJfMV8xLmRvbmU7IGJ1ZmZlcl8xXzEgPSBidWZmZXJfMS5uZXh0KCkpIHsKICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBidWZmZXJfMV8xLnZhbHVlOwogICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmIChidWZmZXJfMV8xICYmICFidWZmZXJfMV8xLmRvbmUgJiYgKF9hID0gYnVmZmVyXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJfMSk7CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGJ1ZmZlciA9IG51bGw7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnRha2VMYXN0ID0gdGFrZUxhc3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL2xhc3QuanMKdmFyIHJlcXVpcmVfbGFzdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9sYXN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5sYXN0ID0gdm9pZCAwOwogICAgdmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmVfRW1wdHlFcnJvcigpOwogICAgdmFyIGZpbHRlcl8xID0gcmVxdWlyZV9maWx0ZXIoKTsKICAgIHZhciB0YWtlTGFzdF8xID0gcmVxdWlyZV90YWtlTGFzdCgpOwogICAgdmFyIHRocm93SWZFbXB0eV8xID0gcmVxdWlyZV90aHJvd0lmRW1wdHkoKTsKICAgIHZhciBkZWZhdWx0SWZFbXB0eV8xID0gcmVxdWlyZV9kZWZhdWx0SWZFbXB0eSgpOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICBmdW5jdGlvbiBsYXN0KHByZWRpY2F0ZSwgZGVmYXVsdFZhbHVlKSB7CiAgICAgIHZhciBoYXNEZWZhdWx0VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID49IDI7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnBpcGUocHJlZGljYXRlID8gZmlsdGVyXzEuZmlsdGVyKGZ1bmN0aW9uKHYsIGkpIHsKICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUodiwgaSwgc291cmNlKTsKICAgICAgICB9KSA6IGlkZW50aXR5XzEuaWRlbnRpdHksIHRha2VMYXN0XzEudGFrZUxhc3QoMSksIGhhc0RlZmF1bHRWYWx1ZSA/IGRlZmF1bHRJZkVtcHR5XzEuZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eV8xLnRocm93SWZFbXB0eShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3IoKTsKICAgICAgICB9KSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5sYXN0ID0gbGFzdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWF0ZXJpYWxpemUuanMKdmFyIHJlcXVpcmVfbWF0ZXJpYWxpemUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWF0ZXJpYWxpemUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm1hdGVyaWFsaXplID0gdm9pZCAwOwogICAgdmFyIE5vdGlmaWNhdGlvbl8xID0gcmVxdWlyZV9Ob3RpZmljYXRpb24oKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiBtYXRlcmlhbGl6ZSgpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQodmFsdWUpKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlQ29tcGxldGUoKSk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZUVycm9yKGVycikpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5tYXRlcmlhbGl6ZSA9IG1hdGVyaWFsaXplOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tYXguanMKdmFyIHJlcXVpcmVfbWF4ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21heC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWF4ID0gdm9pZCAwOwogICAgdmFyIHJlZHVjZV8xID0gcmVxdWlyZV9yZWR1Y2UoKTsKICAgIHZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlX2lzRnVuY3Rpb24oKTsKICAgIGZ1bmN0aW9uIG1heChjb21wYXJlcikgewogICAgICByZXR1cm4gcmVkdWNlXzEucmVkdWNlKGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKGNvbXBhcmVyKSA/IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICByZXR1cm4gY29tcGFyZXIoeCwgeSkgPiAwID8geCA6IHk7CiAgICAgIH0gOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgcmV0dXJuIHggPiB5ID8geCA6IHk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIubWF4ID0gbWF4OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9mbGF0TWFwLmpzCnZhciByZXF1aXJlX2ZsYXRNYXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvZmxhdE1hcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZmxhdE1hcCA9IHZvaWQgMDsKICAgIHZhciBtZXJnZU1hcF8xID0gcmVxdWlyZV9tZXJnZU1hcCgpOwogICAgZXhwb3J0czIuZmxhdE1hcCA9IG1lcmdlTWFwXzEubWVyZ2VNYXA7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlTWFwVG8uanMKdmFyIHJlcXVpcmVfbWVyZ2VNYXBUbyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcFRvLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5tZXJnZU1hcFRvID0gdm9pZCAwOwogICAgdmFyIG1lcmdlTWFwXzEgPSByZXF1aXJlX21lcmdlTWFwKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBtZXJnZU1hcFRvKGlubmVyT2JzZXJ2YWJsZSwgcmVzdWx0U2VsZWN0b3IsIGNvbmN1cnJlbnQpIHsKICAgICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgewogICAgICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICAgICAgfQogICAgICBpZiAoaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlTWFwXzEubWVyZ2VNYXAoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gaW5uZXJPYnNlcnZhYmxlOwogICAgICAgIH0sIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAibnVtYmVyIikgewogICAgICAgIGNvbmN1cnJlbnQgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgfQogICAgICByZXR1cm4gbWVyZ2VNYXBfMS5tZXJnZU1hcChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gaW5uZXJPYnNlcnZhYmxlOwogICAgICB9LCBjb25jdXJyZW50KTsKICAgIH0KICAgIGV4cG9ydHMyLm1lcmdlTWFwVG8gPSBtZXJnZU1hcFRvOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanMKdmFyIHJlcXVpcmVfbWVyZ2VTY2FuID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlU2Nhbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWVyZ2VTY2FuID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIG1lcmdlSW50ZXJuYWxzXzEgPSByZXF1aXJlX21lcmdlSW50ZXJuYWxzKCk7CiAgICBmdW5jdGlvbiBtZXJnZVNjYW4oYWNjdW11bGF0b3IsIHNlZWQsIGNvbmN1cnJlbnQpIHsKICAgICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgewogICAgICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICAgICAgfQogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHN0YXRlID0gc2VlZDsKICAgICAgICByZXR1cm4gbWVyZ2VJbnRlcm5hbHNfMS5tZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yKHN0YXRlLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIH0sIGNvbmN1cnJlbnQsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBzdGF0ZSA9IHZhbHVlOwogICAgICAgIH0sIGZhbHNlLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHN0YXRlID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5tZXJnZVNjYW4gPSBtZXJnZVNjYW47CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlLmpzCnZhciByZXF1aXJlX21lcmdlMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIubWVyZ2UgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgYXJnc09yQXJnQXJyYXlfMSA9IHJlcXVpcmVfYXJnc09yQXJnQXJyYXkoKTsKICAgIHZhciBtZXJnZUFsbF8xID0gcmVxdWlyZV9tZXJnZUFsbCgpOwogICAgdmFyIGFyZ3NfMSA9IHJlcXVpcmVfYXJncygpOwogICAgdmFyIGZyb21fMSA9IHJlcXVpcmVfZnJvbSgpOwogICAgZnVuY3Rpb24gbWVyZ2UoKSB7CiAgICAgIHZhciBhcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHZhciBzY2hlZHVsZXIgPSBhcmdzXzEucG9wU2NoZWR1bGVyKGFyZ3MpOwogICAgICB2YXIgY29uY3VycmVudCA9IGFyZ3NfMS5wb3BOdW1iZXIoYXJncywgSW5maW5pdHkpOwogICAgICBhcmdzID0gYXJnc09yQXJnQXJyYXlfMS5hcmdzT3JBcmdBcnJheShhcmdzKTsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIG1lcmdlQWxsXzEubWVyZ2VBbGwoY29uY3VycmVudCkoZnJvbV8xLmZyb20oX19zcHJlYWRBcnJheShbc291cmNlXSwgX19yZWFkKGFyZ3MpKSwgc2NoZWR1bGVyKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLm1lcmdlID0gbWVyZ2U7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlV2l0aC5qcwp2YXIgcmVxdWlyZV9tZXJnZVdpdGggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VXaXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5tZXJnZVdpdGggPSB2b2lkIDA7CiAgICB2YXIgbWVyZ2VfMSA9IHJlcXVpcmVfbWVyZ2UyKCk7CiAgICBmdW5jdGlvbiBtZXJnZVdpdGgyKCkgewogICAgICB2YXIgb3RoZXJTb3VyY2VzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgb3RoZXJTb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIG1lcmdlXzEubWVyZ2UuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQob3RoZXJTb3VyY2VzKSkpOwogICAgfQogICAgZXhwb3J0czIubWVyZ2VXaXRoID0gbWVyZ2VXaXRoMjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWluLmpzCnZhciByZXF1aXJlX21pbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9taW4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm1pbiA9IHZvaWQgMDsKICAgIHZhciByZWR1Y2VfMSA9IHJlcXVpcmVfcmVkdWNlKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBtaW4oY29tcGFyZXIpIHsKICAgICAgcmV0dXJuIHJlZHVjZV8xLnJlZHVjZShpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihjb21wYXJlcikgPyBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVyKHgsIHkpIDwgMCA/IHggOiB5OwogICAgICB9IDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHJldHVybiB4IDwgeSA/IHggOiB5OwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLm1pbiA9IG1pbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbXVsdGljYXN0LmpzCnZhciByZXF1aXJlX211bHRpY2FzdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9tdWx0aWNhc3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLm11bHRpY2FzdCA9IHZvaWQgMDsKICAgIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGVfMSA9IHJlcXVpcmVfQ29ubmVjdGFibGVPYnNlcnZhYmxlKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICB2YXIgY29ubmVjdF8xID0gcmVxdWlyZV9jb25uZWN0KCk7CiAgICBmdW5jdGlvbiBtdWx0aWNhc3Qoc3ViamVjdE9yU3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7CiAgICAgIHZhciBzdWJqZWN0RmFjdG9yeSA9IGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKHN1YmplY3RPclN1YmplY3RGYWN0b3J5KSA/IHN1YmplY3RPclN1YmplY3RGYWN0b3J5IDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN1YmplY3RPclN1YmplY3RGYWN0b3J5OwogICAgICB9OwogICAgICBpZiAoaXNGdW5jdGlvbl8xLmlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7CiAgICAgICAgcmV0dXJuIGNvbm5lY3RfMS5jb25uZWN0KHNlbGVjdG9yLCB7CiAgICAgICAgICBjb25uZWN0b3I6IHN1YmplY3RGYWN0b3J5CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGFibGVPYnNlcnZhYmxlXzEuQ29ubmVjdGFibGVPYnNlcnZhYmxlKHNvdXJjZSwgc3ViamVjdEZhY3RvcnkpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIubXVsdGljYXN0ID0gbXVsdGljYXN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9vbkVycm9yUmVzdW1lTmV4dFdpdGguanMKdmFyIHJlcXVpcmVfb25FcnJvclJlc3VtZU5leHRXaXRoID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL29uRXJyb3JSZXN1bWVOZXh0V2l0aC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIub25FcnJvclJlc3VtZU5leHQgPSBleHBvcnRzMi5vbkVycm9yUmVzdW1lTmV4dFdpdGggPSB2b2lkIDA7CiAgICB2YXIgYXJnc09yQXJnQXJyYXlfMSA9IHJlcXVpcmVfYXJnc09yQXJnQXJyYXkoKTsKICAgIHZhciBvbkVycm9yUmVzdW1lTmV4dF8xID0gcmVxdWlyZV9vbkVycm9yUmVzdW1lTmV4dCgpOwogICAgZnVuY3Rpb24gb25FcnJvclJlc3VtZU5leHRXaXRoKCkgewogICAgICB2YXIgc291cmNlcyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgbmV4dFNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheV8xLmFyZ3NPckFyZ0FycmF5KHNvdXJjZXMpOwogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIG9uRXJyb3JSZXN1bWVOZXh0XzEub25FcnJvclJlc3VtZU5leHQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtzb3VyY2VdLCBfX3JlYWQobmV4dFNvdXJjZXMpKSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5vbkVycm9yUmVzdW1lTmV4dFdpdGggPSBvbkVycm9yUmVzdW1lTmV4dFdpdGg7CiAgICBleHBvcnRzMi5vbkVycm9yUmVzdW1lTmV4dCA9IG9uRXJyb3JSZXN1bWVOZXh0V2l0aDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcGFpcndpc2UuanMKdmFyIHJlcXVpcmVfcGFpcndpc2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcGFpcndpc2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnBhaXJ3aXNlID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHBhaXJ3aXNlKCkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHByZXY7CiAgICAgICAgdmFyIGhhc1ByZXYgPSBmYWxzZTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgdmFyIHAgPSBwcmV2OwogICAgICAgICAgcHJldiA9IHZhbHVlOwogICAgICAgICAgaGFzUHJldiAmJiBzdWJzY3JpYmVyLm5leHQoW3AsIHZhbHVlXSk7CiAgICAgICAgICBoYXNQcmV2ID0gdHJ1ZTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIucGFpcndpc2UgPSBwYWlyd2lzZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcGx1Y2suanMKdmFyIHJlcXVpcmVfcGx1Y2sgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcGx1Y2suanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnBsdWNrID0gdm9pZCAwOwogICAgdmFyIG1hcF8xID0gcmVxdWlyZV9tYXAoKTsKICAgIGZ1bmN0aW9uIHBsdWNrKCkgewogICAgICB2YXIgcHJvcGVydGllcyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIHByb3BlcnRpZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImxpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG1hcF8xLm1hcChmdW5jdGlvbih4KSB7CiAgICAgICAgdmFyIGN1cnJlbnRQcm9wID0geDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcCA9IGN1cnJlbnRQcm9wID09PSBudWxsIHx8IGN1cnJlbnRQcm9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjdXJyZW50UHJvcFtwcm9wZXJ0aWVzW2ldXTsKICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgY3VycmVudFByb3AgPSBwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9wOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnBsdWNrID0gcGx1Y2s7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2guanMKdmFyIHJlcXVpcmVfcHVibGlzaCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5wdWJsaXNoID0gdm9pZCAwOwogICAgdmFyIFN1YmplY3RfMSA9IHJlcXVpcmVfU3ViamVjdCgpOwogICAgdmFyIG11bHRpY2FzdF8xID0gcmVxdWlyZV9tdWx0aWNhc3QoKTsKICAgIHZhciBjb25uZWN0XzEgPSByZXF1aXJlX2Nvbm5lY3QoKTsKICAgIGZ1bmN0aW9uIHB1Ymxpc2goc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIGNvbm5lY3RfMS5jb25uZWN0KHNlbGVjdG9yKShzb3VyY2UpOwogICAgICB9IDogZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIG11bHRpY2FzdF8xLm11bHRpY2FzdChuZXcgU3ViamVjdF8xLlN1YmplY3QoKSkoc291cmNlKTsKICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMyLnB1Ymxpc2ggPSBwdWJsaXNoOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoQmVoYXZpb3IuanMKdmFyIHJlcXVpcmVfcHVibGlzaEJlaGF2aW9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hCZWhhdmlvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucHVibGlzaEJlaGF2aW9yID0gdm9pZCAwOwogICAgdmFyIEJlaGF2aW9yU3ViamVjdF8xID0gcmVxdWlyZV9CZWhhdmlvclN1YmplY3QoKTsKICAgIHZhciBDb25uZWN0YWJsZU9ic2VydmFibGVfMSA9IHJlcXVpcmVfQ29ubmVjdGFibGVPYnNlcnZhYmxlKCk7CiAgICBmdW5jdGlvbiBwdWJsaXNoQmVoYXZpb3IoaW5pdGlhbFZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICB2YXIgc3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3RfMS5CZWhhdmlvclN1YmplY3QoaW5pdGlhbFZhbHVlKTsKICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RhYmxlT2JzZXJ2YWJsZV8xLkNvbm5lY3RhYmxlT2JzZXJ2YWJsZShzb3VyY2UsIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5wdWJsaXNoQmVoYXZpb3IgPSBwdWJsaXNoQmVoYXZpb3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hMYXN0LmpzCnZhciByZXF1aXJlX3B1Ymxpc2hMYXN0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hMYXN0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5wdWJsaXNoTGFzdCA9IHZvaWQgMDsKICAgIHZhciBBc3luY1N1YmplY3RfMSA9IHJlcXVpcmVfQXN5bmNTdWJqZWN0KCk7CiAgICB2YXIgQ29ubmVjdGFibGVPYnNlcnZhYmxlXzEgPSByZXF1aXJlX0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZSgpOwogICAgZnVuY3Rpb24gcHVibGlzaExhc3QoKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICB2YXIgc3ViamVjdCA9IG5ldyBBc3luY1N1YmplY3RfMS5Bc3luY1N1YmplY3QoKTsKICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RhYmxlT2JzZXJ2YWJsZV8xLkNvbm5lY3RhYmxlT2JzZXJ2YWJsZShzb3VyY2UsIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5wdWJsaXNoTGFzdCA9IHB1Ymxpc2hMYXN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoUmVwbGF5LmpzCnZhciByZXF1aXJlX3B1Ymxpc2hSZXBsYXkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaFJlcGxheS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucHVibGlzaFJlcGxheSA9IHZvaWQgMDsKICAgIHZhciBSZXBsYXlTdWJqZWN0XzEgPSByZXF1aXJlX1JlcGxheVN1YmplY3QoKTsKICAgIHZhciBtdWx0aWNhc3RfMSA9IHJlcXVpcmVfbXVsdGljYXN0KCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBwdWJsaXNoUmVwbGF5KGJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNlbGVjdG9yT3JTY2hlZHVsZXIsIHRpbWVzdGFtcFByb3ZpZGVyKSB7CiAgICAgIGlmIChzZWxlY3Rvck9yU2NoZWR1bGVyICYmICFpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihzZWxlY3Rvck9yU2NoZWR1bGVyKSkgewogICAgICAgIHRpbWVzdGFtcFByb3ZpZGVyID0gc2VsZWN0b3JPclNjaGVkdWxlcjsKICAgICAgfQogICAgICB2YXIgc2VsZWN0b3IgPSBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihzZWxlY3Rvck9yU2NoZWR1bGVyKSA/IHNlbGVjdG9yT3JTY2hlZHVsZXIgOiB2b2lkIDA7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICByZXR1cm4gbXVsdGljYXN0XzEubXVsdGljYXN0KG5ldyBSZXBsYXlTdWJqZWN0XzEuUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lLCB0aW1lc3RhbXBQcm92aWRlciksIHNlbGVjdG9yKShzb3VyY2UpOwogICAgICB9OwogICAgfQogICAgZXhwb3J0czIucHVibGlzaFJlcGxheSA9IHB1Ymxpc2hSZXBsYXk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3JhY2VXaXRoLmpzCnZhciByZXF1aXJlX3JhY2VXaXRoID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3JhY2VXaXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5yYWNlV2l0aCA9IHZvaWQgMDsKICAgIHZhciByYWNlXzEgPSByZXF1aXJlX3JhY2UoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBpZGVudGl0eV8xID0gcmVxdWlyZV9pZGVudGl0eSgpOwogICAgZnVuY3Rpb24gcmFjZVdpdGgoKSB7CiAgICAgIHZhciBvdGhlclNvdXJjZXMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBvdGhlclNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICByZXR1cm4gIW90aGVyU291cmNlcy5sZW5ndGggPyBpZGVudGl0eV8xLmlkZW50aXR5IDogbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgcmFjZV8xLnJhY2VJbml0KF9fc3ByZWFkQXJyYXkoW3NvdXJjZV0sIF9fcmVhZChvdGhlclNvdXJjZXMpKSkoc3Vic2NyaWJlcik7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIucmFjZVdpdGggPSByYWNlV2l0aDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcmVwZWF0LmpzCnZhciByZXF1aXJlX3JlcGVhdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZXBlYXQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnJlcGVhdCA9IHZvaWQgMDsKICAgIHZhciBlbXB0eV8xID0gcmVxdWlyZV9lbXB0eSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgdGltZXJfMSA9IHJlcXVpcmVfdGltZXIoKTsKICAgIGZ1bmN0aW9uIHJlcGVhdChjb3VudE9yQ29uZmlnKSB7CiAgICAgIHZhciBfYTsKICAgICAgdmFyIGNvdW50ID0gSW5maW5pdHk7CiAgICAgIHZhciBkZWxheTsKICAgICAgaWYgKGNvdW50T3JDb25maWcgIT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlb2YgY291bnRPckNvbmZpZyA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIF9hID0gY291bnRPckNvbmZpZy5jb3VudCwgY291bnQgPSBfYSA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfYSwgZGVsYXkgPSBjb3VudE9yQ29uZmlnLmRlbGF5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3VudCA9IGNvdW50T3JDb25maWc7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb3VudCA8PSAwID8gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGVtcHR5XzEuRU1QVFk7CiAgICAgIH0gOiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgc29GYXIgPSAwOwogICAgICAgIHZhciBzb3VyY2VTdWI7CiAgICAgICAgdmFyIHJlc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBzb3VyY2VTdWIgPT09IG51bGwgfHwgc291cmNlU3ViID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzb3VyY2VTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHNvdXJjZVN1YiA9IG51bGw7CiAgICAgICAgICBpZiAoZGVsYXkgIT0gbnVsbCkgewogICAgICAgICAgICB2YXIgbm90aWZpZXIgPSB0eXBlb2YgZGVsYXkgPT09ICJudW1iZXIiID8gdGltZXJfMS50aW1lcihkZWxheSkgOiBpbm5lckZyb21fMS5pbm5lckZyb20oZGVsYXkoc29GYXIpKTsKICAgICAgICAgICAgdmFyIG5vdGlmaWVyU3Vic2NyaWJlcl8xID0gT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIG5vdGlmaWVyU3Vic2NyaWJlcl8xLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgc3Vic2NyaWJlVG9Tb3VyY2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG5vdGlmaWVyLnN1YnNjcmliZShub3RpZmllclN1YnNjcmliZXJfMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJzY3JpYmVUb1NvdXJjZSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIHN1YnNjcmliZVRvU291cmNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7CiAgICAgICAgICBzb3VyY2VTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoKytzb0ZhciA8IGNvdW50KSB7CiAgICAgICAgICAgICAgaWYgKHNvdXJjZVN1YikgewogICAgICAgICAgICAgICAgcmVzdWJzY3JpYmUoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3luY1Vuc3ViID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgICBpZiAoc3luY1Vuc3ViKSB7CiAgICAgICAgICAgIHJlc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBzdWJzY3JpYmVUb1NvdXJjZSgpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnJlcGVhdCA9IHJlcGVhdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvcmVwZWF0V2hlbi5qcwp2YXIgcmVxdWlyZV9yZXBlYXRXaGVuID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3JlcGVhdFdoZW4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnJlcGVhdFdoZW4gPSB2b2lkIDA7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIFN1YmplY3RfMSA9IHJlcXVpcmVfU3ViamVjdCgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHJlcGVhdFdoZW4obm90aWZpZXIpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBpbm5lclN1YjsKICAgICAgICB2YXIgc3luY1Jlc3ViID0gZmFsc2U7CiAgICAgICAgdmFyIGNvbXBsZXRpb25zJDsKICAgICAgICB2YXIgaXNOb3RpZmllckNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgdmFyIGlzTWFpbkNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBpc01haW5Db21wbGV0ZSAmJiBpc05vdGlmaWVyQ29tcGxldGUgJiYgKHN1YnNjcmliZXIuY29tcGxldGUoKSwgdHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICB2YXIgZ2V0Q29tcGxldGlvblN1YmplY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghY29tcGxldGlvbnMkKSB7CiAgICAgICAgICAgIGNvbXBsZXRpb25zJCA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpOwogICAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20obm90aWZpZXIoY29tcGxldGlvbnMkKSkuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBpZiAoaW5uZXJTdWIpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZUZvclJlcGVhdFdoZW4oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3luY1Jlc3ViID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlzTm90aWZpZXJDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgY2hlY2tDb21wbGV0ZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29tcGxldGlvbnMkOwogICAgICAgIH07CiAgICAgICAgdmFyIHN1YnNjcmliZUZvclJlcGVhdFdoZW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlzTWFpbkNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlzTWFpbkNvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgIWNoZWNrQ29tcGxldGUoKSAmJiBnZXRDb21wbGV0aW9uU3ViamVjdCgpLm5leHQoKTsKICAgICAgICAgIH0pKTsKICAgICAgICAgIGlmIChzeW5jUmVzdWIpIHsKICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsOwogICAgICAgICAgICBzeW5jUmVzdWIgPSBmYWxzZTsKICAgICAgICAgICAgc3Vic2NyaWJlRm9yUmVwZWF0V2hlbigpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgc3Vic2NyaWJlRm9yUmVwZWF0V2hlbigpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnJlcGVhdFdoZW4gPSByZXBlYXRXaGVuOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZXRyeS5qcwp2YXIgcmVxdWlyZV9yZXRyeSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZXRyeS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmV0cnkgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICB2YXIgdGltZXJfMSA9IHJlcXVpcmVfdGltZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICBmdW5jdGlvbiByZXRyeShjb25maWdPckNvdW50KSB7CiAgICAgIGlmIChjb25maWdPckNvdW50ID09PSB2b2lkIDApIHsKICAgICAgICBjb25maWdPckNvdW50ID0gSW5maW5pdHk7CiAgICAgIH0KICAgICAgdmFyIGNvbmZpZzsKICAgICAgaWYgKGNvbmZpZ09yQ291bnQgJiYgdHlwZW9mIGNvbmZpZ09yQ291bnQgPT09ICJvYmplY3QiKSB7CiAgICAgICAgY29uZmlnID0gY29uZmlnT3JDb3VudDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICBjb3VudDogY29uZmlnT3JDb3VudAogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFyIF9hID0gY29uZmlnLmNvdW50LCBjb3VudCA9IF9hID09PSB2b2lkIDAgPyBJbmZpbml0eSA6IF9hLCBkZWxheSA9IGNvbmZpZy5kZWxheSwgX2IgPSBjb25maWcucmVzZXRPblN1Y2Nlc3MsIHJlc2V0T25TdWNjZXNzID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7CiAgICAgIHJldHVybiBjb3VudCA8PSAwID8gaWRlbnRpdHlfMS5pZGVudGl0eSA6IGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBzb0ZhciA9IDA7CiAgICAgICAgdmFyIGlubmVyU3ViOwogICAgICAgIHZhciBzdWJzY3JpYmVGb3JSZXRyeSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHN5bmNVbnN1YiA9IGZhbHNlOwogICAgICAgICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpZiAocmVzZXRPblN1Y2Nlc3MpIHsKICAgICAgICAgICAgICBzb0ZhciA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgIGlmIChzb0ZhcisrIDwgY291bnQpIHsKICAgICAgICAgICAgICB2YXIgcmVzdWJfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGlubmVyU3ViKSB7CiAgICAgICAgICAgICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgIGlubmVyU3ViID0gbnVsbDsKICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlRm9yUmV0cnkoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN5bmNVbnN1YiA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoZGVsYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIG5vdGlmaWVyID0gdHlwZW9mIGRlbGF5ID09PSAibnVtYmVyIiA/IHRpbWVyXzEudGltZXIoZGVsYXkpIDogaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGRlbGF5KGVyciwgc29GYXIpKTsKICAgICAgICAgICAgICAgIHZhciBub3RpZmllclN1YnNjcmliZXJfMSA9IE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgbm90aWZpZXJTdWJzY3JpYmVyXzEudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgcmVzdWJfMSgpOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbm90aWZpZXIuc3Vic2NyaWJlKG5vdGlmaWVyU3Vic2NyaWJlcl8xKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWJfMSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIGlmIChzeW5jVW5zdWIpIHsKICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsOwogICAgICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgc3Vic2NyaWJlRm9yUmV0cnkoKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5yZXRyeSA9IHJldHJ5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9yZXRyeVdoZW4uanMKdmFyIHJlcXVpcmVfcmV0cnlXaGVuID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3JldHJ5V2hlbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIucmV0cnlXaGVuID0gdm9pZCAwOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBmdW5jdGlvbiByZXRyeVdoZW4obm90aWZpZXIpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBpbm5lclN1YjsKICAgICAgICB2YXIgc3luY1Jlc3ViID0gZmFsc2U7CiAgICAgICAgdmFyIGVycm9ycyQ7CiAgICAgICAgdmFyIHN1YnNjcmliZUZvclJldHJ5V2hlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JzJCkgewogICAgICAgICAgICAgIGVycm9ycyQgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTsKICAgICAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20obm90aWZpZXIoZXJyb3JzJCkpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJTdWIgPyBzdWJzY3JpYmVGb3JSZXRyeVdoZW4oKSA6IHN5bmNSZXN1YiA9IHRydWU7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlcnJvcnMkKSB7CiAgICAgICAgICAgICAgZXJyb3JzJC5uZXh0KGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIGlmIChzeW5jUmVzdWIpIHsKICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsOwogICAgICAgICAgICBzeW5jUmVzdWIgPSBmYWxzZTsKICAgICAgICAgICAgc3Vic2NyaWJlRm9yUmV0cnlXaGVuKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeVdoZW4oKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5yZXRyeVdoZW4gPSByZXRyeVdoZW47CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NhbXBsZS5qcwp2YXIgcmVxdWlyZV9zYW1wbGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2FtcGxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zYW1wbGUgPSB2b2lkIDA7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIG5vb3BfMSA9IHJlcXVpcmVfbm9vcCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHNhbXBsZShub3RpZmllcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOwogICAgICAgIH0pKTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20obm90aWZpZXIpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHZhbHVlID0gbGFzdFZhbHVlOwogICAgICAgICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0sIG5vb3BfMS5ub29wKSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuc2FtcGxlID0gc2FtcGxlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zYW1wbGVUaW1lLmpzCnZhciByZXF1aXJlX3NhbXBsZVRpbWUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2FtcGxlVGltZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2FtcGxlVGltZSA9IHZvaWQgMDsKICAgIHZhciBhc3luY18xID0gcmVxdWlyZV9hc3luYygpOwogICAgdmFyIHNhbXBsZV8xID0gcmVxdWlyZV9zYW1wbGUoKTsKICAgIHZhciBpbnRlcnZhbF8xID0gcmVxdWlyZV9pbnRlcnZhbCgpOwogICAgZnVuY3Rpb24gc2FtcGxlVGltZShwZXJpb2QsIHNjaGVkdWxlcikgewogICAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsKICAgICAgICBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jU2NoZWR1bGVyOwogICAgICB9CiAgICAgIHJldHVybiBzYW1wbGVfMS5zYW1wbGUoaW50ZXJ2YWxfMS5pbnRlcnZhbChwZXJpb2QsIHNjaGVkdWxlcikpOwogICAgfQogICAgZXhwb3J0czIuc2FtcGxlVGltZSA9IHNhbXBsZVRpbWU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NjYW4uanMKdmFyIHJlcXVpcmVfc2NhbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zY2FuLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zY2FuID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIHNjYW5JbnRlcm5hbHNfMSA9IHJlcXVpcmVfc2NhbkludGVybmFscygpOwogICAgZnVuY3Rpb24gc2NhbihhY2N1bXVsYXRvciwgc2VlZCkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoc2NhbkludGVybmFsc18xLnNjYW5JbnRlcm5hbHMoYWNjdW11bGF0b3IsIHNlZWQsIGFyZ3VtZW50cy5sZW5ndGggPj0gMiwgdHJ1ZSkpOwogICAgfQogICAgZXhwb3J0czIuc2NhbiA9IHNjYW47CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NlcXVlbmNlRXF1YWwuanMKdmFyIHJlcXVpcmVfc2VxdWVuY2VFcXVhbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zZXF1ZW5jZUVxdWFsLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zZXF1ZW5jZUVxdWFsID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICBmdW5jdGlvbiBzZXF1ZW5jZUVxdWFsKGNvbXBhcmVUbywgY29tcGFyYXRvcikgewogICAgICBpZiAoY29tcGFyYXRvciA9PT0gdm9pZCAwKSB7CiAgICAgICAgY29tcGFyYXRvciA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgIHJldHVybiBhID09PSBiOwogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBhU3RhdGUgPSBjcmVhdGVTdGF0ZSgpOwogICAgICAgIHZhciBiU3RhdGUgPSBjcmVhdGVTdGF0ZSgpOwogICAgICAgIHZhciBlbWl0ID0gZnVuY3Rpb24oaXNFcXVhbCkgewogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlzRXF1YWwpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH07CiAgICAgICAgdmFyIGNyZWF0ZVN1YnNjcmliZXIgPSBmdW5jdGlvbihzZWxmU3RhdGUsIG90aGVyU3RhdGUpIHsKICAgICAgICAgIHZhciBzZXF1ZW5jZUVxdWFsU3Vic2NyaWJlciA9IE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIHZhciBidWZmZXIgPSBvdGhlclN0YXRlLmJ1ZmZlciwgY29tcGxldGUgPSBvdGhlclN0YXRlLmNvbXBsZXRlOwogICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGNvbXBsZXRlID8gZW1pdChmYWxzZSkgOiBzZWxmU3RhdGUuYnVmZmVyLnB1c2goYSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIWNvbXBhcmF0b3IoYSwgYnVmZmVyLnNoaWZ0KCkpICYmIGVtaXQoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2VsZlN0YXRlLmNvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gb3RoZXJTdGF0ZS5jb21wbGV0ZSwgYnVmZmVyID0gb3RoZXJTdGF0ZS5idWZmZXI7CiAgICAgICAgICAgIGNvbXBsZXRlICYmIGVtaXQoYnVmZmVyLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgICAgIHNlcXVlbmNlRXF1YWxTdWJzY3JpYmVyID09PSBudWxsIHx8IHNlcXVlbmNlRXF1YWxTdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXF1ZW5jZUVxdWFsU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gc2VxdWVuY2VFcXVhbFN1YnNjcmliZXI7CiAgICAgICAgfTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZVN1YnNjcmliZXIoYVN0YXRlLCBiU3RhdGUpKTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oY29tcGFyZVRvKS5zdWJzY3JpYmUoY3JlYXRlU3Vic2NyaWJlcihiU3RhdGUsIGFTdGF0ZSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnNlcXVlbmNlRXF1YWwgPSBzZXF1ZW5jZUVxdWFsOwogICAgZnVuY3Rpb24gY3JlYXRlU3RhdGUoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYnVmZmVyOiBbXSwKICAgICAgICBjb21wbGV0ZTogZmFsc2UKICAgICAgfTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmUuanMKdmFyIHJlcXVpcmVfc2hhcmUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19yZWFkID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19yZWFkIHx8IGZ1bmN0aW9uKG8sIG4pIHsKICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsKICAgICAgaWYgKCFtKSByZXR1cm4gbzsKICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7CiAgICAgIHRyeSB7CiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgZSA9IHsgZXJyb3IgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbInJldHVybiJdKSkgbS5jYWxsKGkpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFyOwogICAgfTsKICAgIHZhciBfX3NwcmVhZEFycmF5ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zcHJlYWRBcnJheSB8fCBmdW5jdGlvbih0bywgZnJvbSkgewogICAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKykKICAgICAgICB0b1tqXSA9IGZyb21baV07CiAgICAgIHJldHVybiB0bzsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnNoYXJlID0gdm9pZCAwOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlX1N1YnNjcmliZXIoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIGZ1bmN0aW9uIHNoYXJlKG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB2YXIgX2EgPSBvcHRpb25zLmNvbm5lY3RvciwgY29ubmVjdG9yID0gX2EgPT09IHZvaWQgMCA/IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTsKICAgICAgfSA6IF9hLCBfYiA9IG9wdGlvbnMucmVzZXRPbkVycm9yLCByZXNldE9uRXJyb3IgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IG9wdGlvbnMucmVzZXRPbkNvbXBsZXRlLCByZXNldE9uQ29tcGxldGUgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMucmVzZXRPblJlZkNvdW50WmVybywgcmVzZXRPblJlZkNvdW50WmVybyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7CiAgICAgIHJldHVybiBmdW5jdGlvbih3cmFwcGVyU291cmNlKSB7CiAgICAgICAgdmFyIGNvbm5lY3Rpb247CiAgICAgICAgdmFyIHJlc2V0Q29ubmVjdGlvbjsKICAgICAgICB2YXIgc3ViamVjdDsKICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgIHZhciBoYXNDb21wbGV0ZWQgPSBmYWxzZTsKICAgICAgICB2YXIgaGFzRXJyb3JlZCA9IGZhbHNlOwogICAgICAgIHZhciBjYW5jZWxSZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmVzZXRDb25uZWN0aW9uID09PSBudWxsIHx8IHJlc2V0Q29ubmVjdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzZXRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICByZXNldENvbm5lY3Rpb24gPSB2b2lkIDA7CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGNhbmNlbFJlc2V0KCk7CiAgICAgICAgICBjb25uZWN0aW9uID0gc3ViamVjdCA9IHZvaWQgMDsKICAgICAgICAgIGhhc0NvbXBsZXRlZCA9IGhhc0Vycm9yZWQgPSBmYWxzZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXNldEFuZFVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgY29ubiA9IGNvbm5lY3Rpb247CiAgICAgICAgICByZXNldCgpOwogICAgICAgICAgY29ubiA9PT0gbnVsbCB8fCBjb25uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgICByZWZDb3VudCsrOwogICAgICAgICAgaWYgKCFoYXNFcnJvcmVkICYmICFoYXNDb21wbGV0ZWQpIHsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBkZXN0ID0gc3ViamVjdCA9IHN1YmplY3QgIT09IG51bGwgJiYgc3ViamVjdCAhPT0gdm9pZCAwID8gc3ViamVjdCA6IGNvbm5lY3RvcigpOwogICAgICAgICAgc3Vic2NyaWJlci5hZGQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJlZkNvdW50LS07CiAgICAgICAgICAgIGlmIChyZWZDb3VudCA9PT0gMCAmJiAhaGFzRXJyb3JlZCAmJiAhaGFzQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXRBbmRVbnN1YnNjcmliZSwgcmVzZXRPblJlZkNvdW50WmVybyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgZGVzdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgICBpZiAoIWNvbm5lY3Rpb24gJiYgcmVmQ291bnQgPiAwKSB7CiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgU3Vic2NyaWJlcl8xLlNhZmVTdWJzY3JpYmVyKHsKICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlc3QubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICBoYXNFcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNhbmNlbFJlc2V0KCk7CiAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb24gPSBoYW5kbGVSZXNldChyZXNldCwgcmVzZXRPbkVycm9yLCBlcnIpOwogICAgICAgICAgICAgICAgZGVzdC5lcnJvcihlcnIpOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNhbmNlbFJlc2V0KCk7CiAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb24gPSBoYW5kbGVSZXNldChyZXNldCwgcmVzZXRPbkNvbXBsZXRlKTsKICAgICAgICAgICAgICAgIGRlc3QuY29tcGxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20oc291cmNlKS5zdWJzY3JpYmUoY29ubmVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSkod3JhcHBlclNvdXJjZSk7CiAgICAgIH07CiAgICB9CiAgICBleHBvcnRzMi5zaGFyZSA9IHNoYXJlOwogICAgZnVuY3Rpb24gaGFuZGxlUmVzZXQocmVzZXQsIG9uKSB7CiAgICAgIHZhciBhcmdzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICBpZiAob24gPT09IHRydWUpIHsKICAgICAgICByZXNldCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAob24gPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBvblN1YnNjcmliZXIgPSBuZXcgU3Vic2NyaWJlcl8xLlNhZmVTdWJzY3JpYmVyKHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIG9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgcmVzZXQoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gaW5uZXJGcm9tXzEuaW5uZXJGcm9tKG9uLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSkpLnN1YnNjcmliZShvblN1YnNjcmliZXIpOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zaGFyZVJlcGxheS5qcwp2YXIgcmVxdWlyZV9zaGFyZVJlcGxheSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zaGFyZVJlcGxheS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2hhcmVSZXBsYXkgPSB2b2lkIDA7CiAgICB2YXIgUmVwbGF5U3ViamVjdF8xID0gcmVxdWlyZV9SZXBsYXlTdWJqZWN0KCk7CiAgICB2YXIgc2hhcmVfMSA9IHJlcXVpcmVfc2hhcmUoKTsKICAgIGZ1bmN0aW9uIHNoYXJlUmVwbGF5KGNvbmZpZ09yQnVmZmVyU2l6ZSwgd2luZG93VGltZSwgc2NoZWR1bGVyKSB7CiAgICAgIHZhciBfYSwgX2IsIF9jOwogICAgICB2YXIgYnVmZmVyU2l6ZTsKICAgICAgdmFyIHJlZkNvdW50ID0gZmFsc2U7CiAgICAgIGlmIChjb25maWdPckJ1ZmZlclNpemUgJiYgdHlwZW9mIGNvbmZpZ09yQnVmZmVyU2l6ZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICBfYSA9IGNvbmZpZ09yQnVmZmVyU2l6ZS5idWZmZXJTaXplLCBidWZmZXJTaXplID0gX2EgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2EsIF9iID0gY29uZmlnT3JCdWZmZXJTaXplLndpbmRvd1RpbWUsIHdpbmRvd1RpbWUgPSBfYiA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfYiwgX2MgPSBjb25maWdPckJ1ZmZlclNpemUucmVmQ291bnQsIHJlZkNvdW50ID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsIHNjaGVkdWxlciA9IGNvbmZpZ09yQnVmZmVyU2l6ZS5zY2hlZHVsZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmZmVyU2l6ZSA9IGNvbmZpZ09yQnVmZmVyU2l6ZSAhPT0gbnVsbCAmJiBjb25maWdPckJ1ZmZlclNpemUgIT09IHZvaWQgMCA/IGNvbmZpZ09yQnVmZmVyU2l6ZSA6IEluZmluaXR5OwogICAgICB9CiAgICAgIHJldHVybiBzaGFyZV8xLnNoYXJlKHsKICAgICAgICBjb25uZWN0b3I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYXlTdWJqZWN0XzEuUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lLCBzY2hlZHVsZXIpOwogICAgICAgIH0sCiAgICAgICAgcmVzZXRPbkVycm9yOiB0cnVlLAogICAgICAgIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsCiAgICAgICAgcmVzZXRPblJlZkNvdW50WmVybzogcmVmQ291bnQKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5zaGFyZVJlcGxheSA9IHNoYXJlUmVwbGF5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zaW5nbGUuanMKdmFyIHJlcXVpcmVfc2luZ2xlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NpbmdsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2luZ2xlID0gdm9pZCAwOwogICAgdmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmVfRW1wdHlFcnJvcigpOwogICAgdmFyIFNlcXVlbmNlRXJyb3JfMSA9IHJlcXVpcmVfU2VxdWVuY2VFcnJvcigpOwogICAgdmFyIE5vdEZvdW5kRXJyb3JfMSA9IHJlcXVpcmVfTm90Rm91bmRFcnJvcigpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHNpbmdsZShwcmVkaWNhdGUpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIHZhciBzaW5nbGVWYWx1ZTsKICAgICAgICB2YXIgc2VlblZhbHVlID0gZmFsc2U7CiAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgc2VlblZhbHVlID0gdHJ1ZTsKICAgICAgICAgIGlmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKywgc291cmNlKSkgewogICAgICAgICAgICBoYXNWYWx1ZSAmJiBzdWJzY3JpYmVyLmVycm9yKG5ldyBTZXF1ZW5jZUVycm9yXzEuU2VxdWVuY2VFcnJvcigiVG9vIG1hbnkgbWF0Y2hpbmcgdmFsdWVzIikpOwogICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgIHNpbmdsZVZhbHVlID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHNpbmdsZVZhbHVlKTsKICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihzZWVuVmFsdWUgPyBuZXcgTm90Rm91bmRFcnJvcl8xLk5vdEZvdW5kRXJyb3IoIk5vIG1hdGNoaW5nIHZhbHVlcyIpIDogbmV3IEVtcHR5RXJyb3JfMS5FbXB0eUVycm9yKCkpOwogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5zaW5nbGUgPSBzaW5nbGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXAuanMKdmFyIHJlcXVpcmVfc2tpcCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9za2lwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5za2lwID0gdm9pZCAwOwogICAgdmFyIGZpbHRlcl8xID0gcmVxdWlyZV9maWx0ZXIoKTsKICAgIGZ1bmN0aW9uIHNraXAoY291bnQpIHsKICAgICAgcmV0dXJuIGZpbHRlcl8xLmZpbHRlcihmdW5jdGlvbihfLCBpbmRleCkgewogICAgICAgIHJldHVybiBjb3VudCA8PSBpbmRleDsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5za2lwID0gc2tpcDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcExhc3QuanMKdmFyIHJlcXVpcmVfc2tpcExhc3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcExhc3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnNraXBMYXN0ID0gdm9pZCAwOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gc2tpcExhc3Qoc2tpcENvdW50KSB7CiAgICAgIHJldHVybiBza2lwQ291bnQgPD0gMCA/IGlkZW50aXR5XzEuaWRlbnRpdHkgOiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgcmluZyA9IG5ldyBBcnJheShza2lwQ291bnQpOwogICAgICAgIHZhciBzZWVuID0gMDsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgdmFyIHZhbHVlSW5kZXggPSBzZWVuKys7CiAgICAgICAgICBpZiAodmFsdWVJbmRleCA8IHNraXBDb3VudCkgewogICAgICAgICAgICByaW5nW3ZhbHVlSW5kZXhdID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgaW5kZXggPSB2YWx1ZUluZGV4ICUgc2tpcENvdW50OwogICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSByaW5nW2luZGV4XTsKICAgICAgICAgICAgcmluZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG9sZFZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmluZyA9IG51bGw7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5za2lwTGFzdCA9IHNraXBMYXN0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9za2lwVW50aWwuanMKdmFyIHJlcXVpcmVfc2tpcFVudGlsID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBVbnRpbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc2tpcFVudGlsID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgbm9vcF8xID0gcmVxdWlyZV9ub29wKCk7CiAgICBmdW5jdGlvbiBza2lwVW50aWwobm90aWZpZXIpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciB0YWtpbmcgPSBmYWxzZTsKICAgICAgICB2YXIgc2tpcFN1YnNjcmliZXIgPSBPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBza2lwU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBza2lwU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2tpcFN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHRha2luZyA9IHRydWU7CiAgICAgICAgfSwgbm9vcF8xLm5vb3ApOwogICAgICAgIGlubmVyRnJvbV8xLmlubmVyRnJvbShub3RpZmllcikuc3Vic2NyaWJlKHNraXBTdWJzY3JpYmVyKTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHRha2luZyAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5za2lwVW50aWwgPSBza2lwVW50aWw7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBXaGlsZS5qcwp2YXIgcmVxdWlyZV9za2lwV2hpbGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcFdoaWxlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5za2lwV2hpbGUgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgZnVuY3Rpb24gc2tpcFdoaWxlKHByZWRpY2F0ZSkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHRha2luZyA9IGZhbHNlOwogICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiAodGFraW5nIHx8ICh0YWtpbmcgPSAhcHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkpICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnNraXBXaGlsZSA9IHNraXBXaGlsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzCnZhciByZXF1aXJlX3N0YXJ0V2l0aCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy9zdGFydFdpdGguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnN0YXJ0V2l0aCA9IHZvaWQgMDsKICAgIHZhciBjb25jYXRfMSA9IHJlcXVpcmVfY29uY2F0KCk7CiAgICB2YXIgYXJnc18xID0gcmVxdWlyZV9hcmdzKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICBmdW5jdGlvbiBzdGFydFdpdGgoKSB7CiAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICB2YXIgc2NoZWR1bGVyID0gYXJnc18xLnBvcFNjaGVkdWxlcih2YWx1ZXMpOwogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgKHNjaGVkdWxlciA/IGNvbmNhdF8xLmNvbmNhdCh2YWx1ZXMsIHNvdXJjZSwgc2NoZWR1bGVyKSA6IGNvbmNhdF8xLmNvbmNhdCh2YWx1ZXMsIHNvdXJjZSkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5zdGFydFdpdGggPSBzdGFydFdpdGg7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qcwp2YXIgcmVxdWlyZV9zd2l0Y2hNYXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoTWFwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zd2l0Y2hNYXAgPSB2b2lkIDA7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHN3aXRjaE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGlubmVyU3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICB2YXIgaXNDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIHZhciBjaGVja0NvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gaXNDb21wbGV0ZSAmJiAhaW5uZXJTdWJzY3JpYmVyICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9OwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBpbm5lclN1YnNjcmliZXIgPT09IG51bGwgfHwgaW5uZXJTdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbm5lclN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHZhciBpbm5lckluZGV4ID0gMDsKICAgICAgICAgIHZhciBvdXRlckluZGV4ID0gaW5kZXgrKzsKICAgICAgICAgIGlubmVyRnJvbV8xLmlubmVyRnJvbShwcm9qZWN0KHZhbHVlLCBvdXRlckluZGV4KSkuc3Vic2NyaWJlKGlubmVyU3Vic2NyaWJlciA9IE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbihpbm5lclZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLm5leHQocmVzdWx0U2VsZWN0b3IgPyByZXN1bHRTZWxlY3Rvcih2YWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCsrKSA6IGlubmVyVmFsdWUpOwogICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlubmVyU3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTsKICAgICAgICAgIH0pKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgY2hlY2tDb21wbGV0ZSgpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5zd2l0Y2hNYXAgPSBzd2l0Y2hNYXA7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaEFsbC5qcwp2YXIgcmVxdWlyZV9zd2l0Y2hBbGwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoQWxsLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zd2l0Y2hBbGwgPSB2b2lkIDA7CiAgICB2YXIgc3dpdGNoTWFwXzEgPSByZXF1aXJlX3N3aXRjaE1hcCgpOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICBmdW5jdGlvbiBzd2l0Y2hBbGwoKSB7CiAgICAgIHJldHVybiBzd2l0Y2hNYXBfMS5zd2l0Y2hNYXAoaWRlbnRpdHlfMS5pZGVudGl0eSk7CiAgICB9CiAgICBleHBvcnRzMi5zd2l0Y2hBbGwgPSBzd2l0Y2hBbGw7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcFRvLmpzCnZhciByZXF1aXJlX3N3aXRjaE1hcFRvID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcFRvLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zd2l0Y2hNYXBUbyA9IHZvaWQgMDsKICAgIHZhciBzd2l0Y2hNYXBfMSA9IHJlcXVpcmVfc3dpdGNoTWFwKCk7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICBmdW5jdGlvbiBzd2l0Y2hNYXBUbyhpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyBzd2l0Y2hNYXBfMS5zd2l0Y2hNYXAoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGlubmVyT2JzZXJ2YWJsZTsKICAgICAgfSwgcmVzdWx0U2VsZWN0b3IpIDogc3dpdGNoTWFwXzEuc3dpdGNoTWFwKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpbm5lck9ic2VydmFibGU7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIuc3dpdGNoTWFwVG8gPSBzd2l0Y2hNYXBUbzsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoU2Nhbi5qcwp2YXIgcmVxdWlyZV9zd2l0Y2hTY2FuID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaFNjYW4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnN3aXRjaFNjYW4gPSB2b2lkIDA7CiAgICB2YXIgc3dpdGNoTWFwXzEgPSByZXF1aXJlX3N3aXRjaE1hcCgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgZnVuY3Rpb24gc3dpdGNoU2NhbihhY2N1bXVsYXRvciwgc2VlZCkgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHN0YXRlID0gc2VlZDsKICAgICAgICBzd2l0Y2hNYXBfMS5zd2l0Y2hNYXAoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3Ioc3RhdGUsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgfSwgZnVuY3Rpb24oXywgaW5uZXJWYWx1ZSkgewogICAgICAgICAgcmV0dXJuIHN0YXRlID0gaW5uZXJWYWx1ZSwgaW5uZXJWYWx1ZTsKICAgICAgICB9KShzb3VyY2UpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICBzdGF0ZSA9IG51bGw7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi5zd2l0Y2hTY2FuID0gc3dpdGNoU2NhbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVVudGlsLmpzCnZhciByZXF1aXJlX3Rha2VVbnRpbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90YWtlVW50aWwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRha2VVbnRpbCA9IHZvaWQgMDsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIG5vb3BfMSA9IHJlcXVpcmVfbm9vcCgpOwogICAgZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20obm90aWZpZXIpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0sIG5vb3BfMS5ub29wKSk7CiAgICAgICAgIXN1YnNjcmliZXIuY2xvc2VkICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudGFrZVVudGlsID0gdGFrZVVudGlsOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90YWtlV2hpbGUuanMKdmFyIHJlcXVpcmVfdGFrZVdoaWxlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VXaGlsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGFrZVdoaWxlID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHRha2VXaGlsZShwcmVkaWNhdGUsIGluY2x1c2l2ZSkgewogICAgICBpZiAoaW5jbHVzaXZlID09PSB2b2lkIDApIHsKICAgICAgICBpbmNsdXNpdmUgPSBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKyk7CiAgICAgICAgICAocmVzdWx0IHx8IGluY2x1c2l2ZSkgJiYgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgICFyZXN1bHQgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi50YWtlV2hpbGUgPSB0YWtlV2hpbGU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RhcC5qcwp2YXIgcmVxdWlyZV90YXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGFwLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi50YXAgPSB2b2lkIDA7CiAgICB2YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZV9pc0Z1bmN0aW9uKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGlkZW50aXR5XzEgPSByZXF1aXJlX2lkZW50aXR5KCk7CiAgICBmdW5jdGlvbiB0YXAob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICB2YXIgdGFwT2JzZXJ2ZXIgPSBpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgZXJyb3IgfHwgY29tcGxldGUgPyB7IG5leHQ6IG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUgfSA6IG9ic2VydmVyT3JOZXh0OwogICAgICByZXR1cm4gdGFwT2JzZXJ2ZXIgPyBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgKF9hID0gdGFwT2JzZXJ2ZXIuc3Vic2NyaWJlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0YXBPYnNlcnZlcik7CiAgICAgICAgdmFyIGlzVW5zdWIgPSB0cnVlOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICB2YXIgX2EyOwogICAgICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLm5leHQpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIHZhbHVlKTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgX2EyOwogICAgICAgICAgaXNVbnN1YiA9IGZhbHNlOwogICAgICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRhcE9ic2VydmVyKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHZhciBfYTI7CiAgICAgICAgICBpc1Vuc3ViID0gZmFsc2U7CiAgICAgICAgICAoX2EyID0gdGFwT2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIGVycik7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgX2EyLCBfYjsKICAgICAgICAgIGlmIChpc1Vuc3ViKSB7CiAgICAgICAgICAgIChfYTIgPSB0YXBPYnNlcnZlci51bnN1YnNjcmliZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh0YXBPYnNlcnZlcik7CiAgICAgICAgICB9CiAgICAgICAgICAoX2IgPSB0YXBPYnNlcnZlci5maW5hbGl6ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodGFwT2JzZXJ2ZXIpOwogICAgICAgIH0pKTsKICAgICAgfSkgOiBpZGVudGl0eV8xLmlkZW50aXR5OwogICAgfQogICAgZXhwb3J0czIudGFwID0gdGFwOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZS5qcwp2YXIgcmVxdWlyZV90aHJvdHRsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudGhyb3R0bGUgPSB2b2lkIDA7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGlubmVyRnJvbV8xID0gcmVxdWlyZV9pbm5lckZyb20oKTsKICAgIGZ1bmN0aW9uIHRocm90dGxlKGR1cmF0aW9uU2VsZWN0b3IsIGNvbmZpZykgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hID0gY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdm9pZCAwID8gY29uZmlnIDoge30sIF9iID0gX2EubGVhZGluZywgbGVhZGluZyA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIF9jID0gX2EudHJhaWxpbmcsIHRyYWlsaW5nID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2M7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgdmFyIHNlbmRWYWx1ZSA9IG51bGw7CiAgICAgICAgdmFyIHRocm90dGxlZCA9IG51bGw7CiAgICAgICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICB2YXIgZW5kVGhyb3R0bGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhyb3R0bGVkID09PSBudWxsIHx8IHRocm90dGxlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGhyb3R0bGVkLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICAgICAgaWYgKHRyYWlsaW5nKSB7CiAgICAgICAgICAgIHNlbmQoKTsKICAgICAgICAgICAgaXNDb21wbGV0ZSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgY2xlYW51cFRocm90dGxpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHRocm90dGxlZCA9IG51bGw7CiAgICAgICAgICBpc0NvbXBsZXRlICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9OwogICAgICAgIHZhciBzdGFydFRocm90dGxlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0aHJvdHRsZWQgPSBpbm5lckZyb21fMS5pbm5lckZyb20oZHVyYXRpb25TZWxlY3Rvcih2YWx1ZSkpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZW5kVGhyb3R0bGluZywgY2xlYW51cFRocm90dGxpbmcpKTsKICAgICAgICB9OwogICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VuZFZhbHVlOwogICAgICAgICAgICBzZW5kVmFsdWUgPSBudWxsOwogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICAhaXNDb21wbGV0ZSAmJiBzdGFydFRocm90dGxlKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICBzZW5kVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICEodGhyb3R0bGVkICYmICF0aHJvdHRsZWQuY2xvc2VkKSAmJiAobGVhZGluZyA/IHNlbmQoKSA6IHN0YXJ0VGhyb3R0bGUodmFsdWUpKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgISh0cmFpbGluZyAmJiBoYXNWYWx1ZSAmJiB0aHJvdHRsZWQgJiYgIXRocm90dGxlZC5jbG9zZWQpICYmIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIudGhyb3R0bGUgPSB0aHJvdHRsZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGhyb3R0bGVUaW1lLmpzCnZhciByZXF1aXJlX3Rocm90dGxlVGltZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZVRpbWUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRocm90dGxlVGltZSA9IHZvaWQgMDsKICAgIHZhciBhc3luY18xID0gcmVxdWlyZV9hc3luYygpOwogICAgdmFyIHRocm90dGxlXzEgPSByZXF1aXJlX3Rocm90dGxlKCk7CiAgICB2YXIgdGltZXJfMSA9IHJlcXVpcmVfdGltZXIoKTsKICAgIGZ1bmN0aW9uIHRocm90dGxlVGltZShkdXJhdGlvbiwgc2NoZWR1bGVyLCBjb25maWcpIHsKICAgICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luY1NjaGVkdWxlcjsKICAgICAgfQogICAgICB2YXIgZHVyYXRpb24kID0gdGltZXJfMS50aW1lcihkdXJhdGlvbiwgc2NoZWR1bGVyKTsKICAgICAgcmV0dXJuIHRocm90dGxlXzEudGhyb3R0bGUoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGR1cmF0aW9uJDsKICAgICAgfSwgY29uZmlnKTsKICAgIH0KICAgIGV4cG9ydHMyLnRocm90dGxlVGltZSA9IHRocm90dGxlVGltZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZUludGVydmFsLmpzCnZhciByZXF1aXJlX3RpbWVJbnRlcnZhbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy90aW1lSW50ZXJ2YWwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlRpbWVJbnRlcnZhbCA9IGV4cG9ydHMyLnRpbWVJbnRlcnZhbCA9IHZvaWQgMDsKICAgIHZhciBhc3luY18xID0gcmVxdWlyZV9hc3luYygpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHRpbWVJbnRlcnZhbChzY2hlZHVsZXIpIHsKICAgICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luY1NjaGVkdWxlcjsKICAgICAgfQogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGxhc3QgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHZhciBub3cgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSBub3cgLSBsYXN0OwogICAgICAgICAgbGFzdCA9IG5vdzsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChuZXcgVGltZUludGVydmFsKHZhbHVlLCBpbnRlcnZhbCkpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi50aW1lSW50ZXJ2YWwgPSB0aW1lSW50ZXJ2YWw7CiAgICB2YXIgVGltZUludGVydmFsID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBUaW1lSW50ZXJ2YWwyKHZhbHVlLCBpbnRlcnZhbCkgewogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CiAgICAgIH0KICAgICAgcmV0dXJuIFRpbWVJbnRlcnZhbDI7CiAgICB9KCk7CiAgICBleHBvcnRzMi5UaW1lSW50ZXJ2YWwgPSBUaW1lSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXRXaXRoLmpzCnZhciByZXF1aXJlX3RpbWVvdXRXaXRoID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXRXaXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi50aW1lb3V0V2l0aCA9IHZvaWQgMDsKICAgIHZhciBhc3luY18xID0gcmVxdWlyZV9hc3luYygpOwogICAgdmFyIGlzRGF0ZV8xID0gcmVxdWlyZV9pc0RhdGUoKTsKICAgIHZhciB0aW1lb3V0XzEgPSByZXF1aXJlX3RpbWVvdXQoKTsKICAgIGZ1bmN0aW9uIHRpbWVvdXRXaXRoKGR1ZSwgd2l0aE9ic2VydmFibGUsIHNjaGVkdWxlcikgewogICAgICB2YXIgZmlyc3Q7CiAgICAgIHZhciBlYWNoOwogICAgICB2YXIgX3dpdGg7CiAgICAgIHNjaGVkdWxlciA9IHNjaGVkdWxlciAhPT0gbnVsbCAmJiBzY2hlZHVsZXIgIT09IHZvaWQgMCA/IHNjaGVkdWxlciA6IGFzeW5jXzEuYXN5bmM7CiAgICAgIGlmIChpc0RhdGVfMS5pc1ZhbGlkRGF0ZShkdWUpKSB7CiAgICAgICAgZmlyc3QgPSBkdWU7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1ZSA9PT0gIm51bWJlciIpIHsKICAgICAgICBlYWNoID0gZHVlOwogICAgICB9CiAgICAgIGlmICh3aXRoT2JzZXJ2YWJsZSkgewogICAgICAgIF93aXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gd2l0aE9ic2VydmFibGU7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvYnNlcnZhYmxlIHByb3ZpZGVkIHRvIHN3aXRjaCB0byIpOwogICAgICB9CiAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIGVhY2ggPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk5vIHRpbWVvdXQgcHJvdmlkZWQuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbWVvdXRfMS50aW1lb3V0KHsKICAgICAgICBmaXJzdCwKICAgICAgICBlYWNoLAogICAgICAgIHNjaGVkdWxlciwKICAgICAgICB3aXRoOiBfd2l0aAogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnRpbWVvdXRXaXRoID0gdGltZW91dFdpdGg7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVzdGFtcC5qcwp2YXIgcmVxdWlyZV90aW1lc3RhbXAgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZXN0YW1wLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi50aW1lc3RhbXAgPSB2b2lkIDA7CiAgICB2YXIgZGF0ZVRpbWVzdGFtcFByb3ZpZGVyXzEgPSByZXF1aXJlX2RhdGVUaW1lc3RhbXBQcm92aWRlcigpOwogICAgdmFyIG1hcF8xID0gcmVxdWlyZV9tYXAoKTsKICAgIGZ1bmN0aW9uIHRpbWVzdGFtcCh0aW1lc3RhbXBQcm92aWRlcikgewogICAgICBpZiAodGltZXN0YW1wUHJvdmlkZXIgPT09IHZvaWQgMCkgewogICAgICAgIHRpbWVzdGFtcFByb3ZpZGVyID0gZGF0ZVRpbWVzdGFtcFByb3ZpZGVyXzEuZGF0ZVRpbWVzdGFtcFByb3ZpZGVyOwogICAgICB9CiAgICAgIHJldHVybiBtYXBfMS5tYXAoZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4geyB2YWx1ZSwgdGltZXN0YW1wOiB0aW1lc3RhbXBQcm92aWRlci5ub3coKSB9OwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93LmpzCnZhciByZXF1aXJlX3dpbmRvdyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy93aW5kb3cuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndpbmRvdyA9IHZvaWQgMDsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgbm9vcF8xID0gcmVxdWlyZV9ub29wKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gd2luZG93Mih3aW5kb3dCb3VuZGFyaWVzKSB7CiAgICAgIHJldHVybiBsaWZ0XzEub3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgd2luZG93U3ViamVjdCA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpOwogICAgICAgIHN1YnNjcmliZXIubmV4dCh3aW5kb3dTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpKTsKICAgICAgICB2YXIgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICB3aW5kb3dTdWJqZWN0LmVycm9yKGVycik7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgfTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHdpbmRvd1N1YmplY3QgPT09IG51bGwgfHwgd2luZG93U3ViamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93U3ViamVjdC5uZXh0KHZhbHVlKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHdpbmRvd1N1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCBlcnJvckhhbmRsZXIpKTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20od2luZG93Qm91bmRhcmllcykuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHdpbmRvd1N1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh3aW5kb3dTdWJqZWN0ID0gbmV3IFN1YmplY3RfMS5TdWJqZWN0KCkpOwogICAgICAgIH0sIG5vb3BfMS5ub29wLCBlcnJvckhhbmRsZXIpKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICB3aW5kb3dTdWJqZWN0ID09PSBudWxsIHx8IHdpbmRvd1N1YmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvd1N1YmplY3QudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHdpbmRvd1N1YmplY3QgPSBudWxsOwogICAgICAgIH07CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIud2luZG93ID0gd2luZG93MjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93Q291bnQuanMKdmFyIHJlcXVpcmVfd2luZG93Q291bnQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93Q291bnQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndpbmRvd0NvdW50ID0gdm9pZCAwOwogICAgdmFyIFN1YmplY3RfMSA9IHJlcXVpcmVfU3ViamVjdCgpOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGZ1bmN0aW9uIHdpbmRvd0NvdW50KHdpbmRvd1NpemUsIHN0YXJ0V2luZG93RXZlcnkpIHsKICAgICAgaWYgKHN0YXJ0V2luZG93RXZlcnkgPT09IHZvaWQgMCkgewogICAgICAgIHN0YXJ0V2luZG93RXZlcnkgPSAwOwogICAgICB9CiAgICAgIHZhciBzdGFydEV2ZXJ5ID0gc3RhcnRXaW5kb3dFdmVyeSA+IDAgPyBzdGFydFdpbmRvd0V2ZXJ5IDogd2luZG93U2l6ZTsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciB3aW5kb3dzID0gW25ldyBTdWJqZWN0XzEuU3ViamVjdCgpXTsKICAgICAgICB2YXIgc3RhcnRzID0gW107CiAgICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQod2luZG93c1swXS5hc09ic2VydmFibGUoKSk7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHZhciBlXzEsIF9hOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yICh2YXIgd2luZG93c18xID0gX192YWx1ZXMod2luZG93cyksIHdpbmRvd3NfMV8xID0gd2luZG93c18xLm5leHQoKTsgIXdpbmRvd3NfMV8xLmRvbmU7IHdpbmRvd3NfMV8xID0gd2luZG93c18xLm5leHQoKSkgewogICAgICAgICAgICAgIHZhciB3aW5kb3dfMSA9IHdpbmRvd3NfMV8xLnZhbHVlOwogICAgICAgICAgICAgIHdpbmRvd18xLm5leHQodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAod2luZG93c18xXzEgJiYgIXdpbmRvd3NfMV8xLmRvbmUgJiYgKF9hID0gd2luZG93c18xLnJldHVybikpIF9hLmNhbGwod2luZG93c18xKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBjID0gY291bnQgLSB3aW5kb3dTaXplICsgMTsKICAgICAgICAgIGlmIChjID49IDAgJiYgYyAlIHN0YXJ0RXZlcnkgPT09IDApIHsKICAgICAgICAgICAgd2luZG93cy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKytjb3VudCAlIHN0YXJ0RXZlcnkgPT09IDApIHsKICAgICAgICAgICAgdmFyIHdpbmRvd18yID0gbmV3IFN1YmplY3RfMS5TdWJqZWN0KCk7CiAgICAgICAgICAgIHdpbmRvd3MucHVzaCh3aW5kb3dfMik7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh3aW5kb3dfMi5hc09ic2VydmFibGUoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB3aGlsZSAod2luZG93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHdpbmRvd3Muc2hpZnQoKS5jb21wbGV0ZSgpOwogICAgICAgICAgfQogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgd2hpbGUgKHdpbmRvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICB3aW5kb3dzLnNoaWZ0KCkuZXJyb3IoZXJyKTsKICAgICAgICAgIH0KICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0YXJ0cyA9IG51bGw7CiAgICAgICAgICB3aW5kb3dzID0gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIud2luZG93Q291bnQgPSB3aW5kb3dDb3VudDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93VGltZS5qcwp2YXIgcmVxdWlyZV93aW5kb3dUaW1lID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd1RpbWUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndpbmRvd1RpbWUgPSB2b2lkIDA7CiAgICB2YXIgU3ViamVjdF8xID0gcmVxdWlyZV9TdWJqZWN0KCk7CiAgICB2YXIgYXN5bmNfMSA9IHJlcXVpcmVfYXN5bmMoKTsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgT3BlcmF0b3JTdWJzY3JpYmVyXzEgPSByZXF1aXJlX09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgdmFyIGFyclJlbW92ZV8xID0gcmVxdWlyZV9hcnJSZW1vdmUoKTsKICAgIHZhciBhcmdzXzEgPSByZXF1aXJlX2FyZ3MoKTsKICAgIHZhciBleGVjdXRlU2NoZWR1bGVfMSA9IHJlcXVpcmVfZXhlY3V0ZVNjaGVkdWxlKCk7CiAgICBmdW5jdGlvbiB3aW5kb3dUaW1lKHdpbmRvd1RpbWVTcGFuKSB7CiAgICAgIHZhciBfYSwgX2I7CiAgICAgIHZhciBvdGhlckFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBvdGhlckFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgdmFyIHNjaGVkdWxlciA9IChfYSA9IGFyZ3NfMS5wb3BTY2hlZHVsZXIob3RoZXJBcmdzKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogYXN5bmNfMS5hc3luY1NjaGVkdWxlcjsKICAgICAgdmFyIHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWwgPSAoX2IgPSBvdGhlckFyZ3NbMF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7CiAgICAgIHZhciBtYXhXaW5kb3dTaXplID0gb3RoZXJBcmdzWzFdIHx8IEluZmluaXR5OwogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHdpbmRvd1JlY29yZHMgPSBbXTsKICAgICAgICB2YXIgcmVzdGFydE9uQ2xvc2UgPSBmYWxzZTsKICAgICAgICB2YXIgY2xvc2VXaW5kb3cgPSBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgIHZhciB3aW5kb3cyID0gcmVjb3JkLndpbmRvdywgc3VicyA9IHJlY29yZC5zdWJzOwogICAgICAgICAgd2luZG93Mi5jb21wbGV0ZSgpOwogICAgICAgICAgc3Vicy51bnN1YnNjcmliZSgpOwogICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKHdpbmRvd1JlY29yZHMsIHJlY29yZCk7CiAgICAgICAgICByZXN0YXJ0T25DbG9zZSAmJiBzdGFydFdpbmRvdygpOwogICAgICAgIH07CiAgICAgICAgdmFyIHN0YXJ0V2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAod2luZG93UmVjb3JkcykgewogICAgICAgICAgICB2YXIgc3VicyA9IG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oKTsKICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoc3Vicyk7CiAgICAgICAgICAgIHZhciB3aW5kb3dfMSA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpOwogICAgICAgICAgICB2YXIgcmVjb3JkXzEgPSB7CiAgICAgICAgICAgICAgd2luZG93OiB3aW5kb3dfMSwKICAgICAgICAgICAgICBzdWJzLAogICAgICAgICAgICAgIHNlZW46IDAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2luZG93UmVjb3Jkcy5wdXNoKHJlY29yZF8xKTsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHdpbmRvd18xLmFzT2JzZXJ2YWJsZSgpKTsKICAgICAgICAgICAgZXhlY3V0ZVNjaGVkdWxlXzEuZXhlY3V0ZVNjaGVkdWxlKHN1YnMsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlV2luZG93KHJlY29yZF8xKTsKICAgICAgICAgICAgfSwgd2luZG93VGltZVNwYW4pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaWYgKHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWwgIT09IG51bGwgJiYgd2luZG93Q3JlYXRpb25JbnRlcnZhbCA+PSAwKSB7CiAgICAgICAgICBleGVjdXRlU2NoZWR1bGVfMS5leGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBzdGFydFdpbmRvdywgd2luZG93Q3JlYXRpb25JbnRlcnZhbCwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3RhcnRPbkNsb3NlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgc3RhcnRXaW5kb3coKTsKICAgICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgICByZXR1cm4gd2luZG93UmVjb3Jkcy5zbGljZSgpLmZvckVhY2goY2IpOwogICAgICAgIH07CiAgICAgICAgdmFyIHRlcm1pbmF0ZSA9IGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgICBsb29wKGZ1bmN0aW9uKF9hMikgewogICAgICAgICAgICB2YXIgd2luZG93MiA9IF9hMi53aW5kb3c7CiAgICAgICAgICAgIHJldHVybiBjYih3aW5kb3cyKTsKICAgICAgICAgIH0pOwogICAgICAgICAgY2Ioc3Vic2NyaWJlcik7CiAgICAgICAgICBzdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfTsKICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgbG9vcChmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgICAgcmVjb3JkLndpbmRvdy5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgbWF4V2luZG93U2l6ZSA8PSArK3JlY29yZC5zZWVuICYmIGNsb3NlV2luZG93KHJlY29yZCk7CiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0ZXJtaW5hdGUoZnVuY3Rpb24oY29uc3VtZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVyLmNvbXBsZXRlKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHJldHVybiB0ZXJtaW5hdGUoZnVuY3Rpb24oY29uc3VtZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVyLmVycm9yKGVycik7CiAgICAgICAgICB9KTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgd2luZG93UmVjb3JkcyA9IG51bGw7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi53aW5kb3dUaW1lID0gd2luZG93VGltZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93VG9nZ2xlLmpzCnZhciByZXF1aXJlX3dpbmRvd1RvZ2dsZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dUb2dnbGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX192YWx1ZXMgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CiAgICAgICAgfQogICAgICB9OwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndpbmRvd1RvZ2dsZSA9IHZvaWQgMDsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICB2YXIgbGlmdF8xID0gcmVxdWlyZV9saWZ0KCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBhcnJSZW1vdmVfMSA9IHJlcXVpcmVfYXJyUmVtb3ZlKCk7CiAgICBmdW5jdGlvbiB3aW5kb3dUb2dnbGUob3BlbmluZ3MsIGNsb3NpbmdTZWxlY3RvcikgewogICAgICByZXR1cm4gbGlmdF8xLm9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHdpbmRvd3MgPSBbXTsKICAgICAgICB2YXIgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHdoaWxlICgwIDwgd2luZG93cy5sZW5ndGgpIHsKICAgICAgICAgICAgd2luZG93cy5zaGlmdCgpLmVycm9yKGVycik7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgfTsKICAgICAgICBpbm5lckZyb21fMS5pbm5lckZyb20ob3BlbmluZ3MpLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24ob3BlblZhbHVlKSB7CiAgICAgICAgICB2YXIgd2luZG93MiA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpOwogICAgICAgICAgd2luZG93cy5wdXNoKHdpbmRvdzIpOwogICAgICAgICAgdmFyIGNsb3NpbmdTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICB2YXIgY2xvc2VXaW5kb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYXJyUmVtb3ZlXzEuYXJyUmVtb3ZlKHdpbmRvd3MsIHdpbmRvdzIpOwogICAgICAgICAgICB3aW5kb3cyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIGNsb3NpbmdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgY2xvc2luZ05vdGlmaWVyOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvc2luZ05vdGlmaWVyID0gaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGNsb3NpbmdTZWxlY3RvcihvcGVuVmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQod2luZG93Mi5hc09ic2VydmFibGUoKSk7CiAgICAgICAgICBjbG9zaW5nU3Vic2NyaXB0aW9uLmFkZChjbG9zaW5nTm90aWZpZXIuc3Vic2NyaWJlKE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBjbG9zZVdpbmRvdywgbm9vcF8xLm5vb3AsIGhhbmRsZUVycm9yKSkpOwogICAgICAgIH0sIG5vb3BfMS5ub29wKSk7CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHZhciBlXzEsIF9hOwogICAgICAgICAgdmFyIHdpbmRvd3NDb3B5ID0gd2luZG93cy5zbGljZSgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yICh2YXIgd2luZG93c0NvcHlfMSA9IF9fdmFsdWVzKHdpbmRvd3NDb3B5KSwgd2luZG93c0NvcHlfMV8xID0gd2luZG93c0NvcHlfMS5uZXh0KCk7ICF3aW5kb3dzQ29weV8xXzEuZG9uZTsgd2luZG93c0NvcHlfMV8xID0gd2luZG93c0NvcHlfMS5uZXh0KCkpIHsKICAgICAgICAgICAgICB2YXIgd2luZG93XzEgPSB3aW5kb3dzQ29weV8xXzEudmFsdWU7CiAgICAgICAgICAgICAgd2luZG93XzEubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGlmICh3aW5kb3dzQ29weV8xXzEgJiYgIXdpbmRvd3NDb3B5XzFfMS5kb25lICYmIChfYSA9IHdpbmRvd3NDb3B5XzEucmV0dXJuKSkgX2EuY2FsbCh3aW5kb3dzQ29weV8xKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHdoaWxlICgwIDwgd2luZG93cy5sZW5ndGgpIHsKICAgICAgICAgICAgd2luZG93cy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSwgaGFuZGxlRXJyb3IsIGZ1bmN0aW9uKCkgewogICAgICAgICAgd2hpbGUgKDAgPCB3aW5kb3dzLmxlbmd0aCkgewogICAgICAgICAgICB3aW5kb3dzLnNoaWZ0KCkudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgfQogICAgZXhwb3J0czIud2luZG93VG9nZ2xlID0gd2luZG93VG9nZ2xlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dXaGVuLmpzCnZhciByZXF1aXJlX3dpbmRvd1doZW4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93V2hlbi5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIud2luZG93V2hlbiA9IHZvaWQgMDsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIHZhciBPcGVyYXRvclN1YnNjcmliZXJfMSA9IHJlcXVpcmVfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICB2YXIgaW5uZXJGcm9tXzEgPSByZXF1aXJlX2lubmVyRnJvbSgpOwogICAgZnVuY3Rpb24gd2luZG93V2hlbihjbG9zaW5nU2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciB3aW5kb3cyOwogICAgICAgIHZhciBjbG9zaW5nU3Vic2NyaWJlcjsKICAgICAgICB2YXIgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHdpbmRvdzIuZXJyb3IoZXJyKTsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9OwogICAgICAgIHZhciBvcGVuV2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBjbG9zaW5nU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBjbG9zaW5nU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xvc2luZ1N1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHdpbmRvdzIgPT09IG51bGwgfHwgd2luZG93MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93Mi5jb21wbGV0ZSgpOwogICAgICAgICAgd2luZG93MiA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHdpbmRvdzIuYXNPYnNlcnZhYmxlKCkpOwogICAgICAgICAgdmFyIGNsb3NpbmdOb3RpZmllcjsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNsb3NpbmdOb3RpZmllciA9IGlubmVyRnJvbV8xLmlubmVyRnJvbShjbG9zaW5nU2VsZWN0b3IoKSk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgY2xvc2luZ05vdGlmaWVyLnN1YnNjcmliZShjbG9zaW5nU3Vic2NyaWJlciA9IE9wZXJhdG9yU3Vic2NyaWJlcl8xLmNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvcGVuV2luZG93LCBvcGVuV2luZG93LCBoYW5kbGVFcnJvcikpOwogICAgICAgIH07CiAgICAgICAgb3BlbldpbmRvdygpOwogICAgICAgIHNvdXJjZS5zdWJzY3JpYmUoT3BlcmF0b3JTdWJzY3JpYmVyXzEuY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gd2luZG93Mi5uZXh0KHZhbHVlKTsKICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgIHdpbmRvdzIuY29tcGxldGUoKTsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9LCBoYW5kbGVFcnJvciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBjbG9zaW5nU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBjbG9zaW5nU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xvc2luZ1N1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHdpbmRvdzIgPSBudWxsOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi53aW5kb3dXaGVuID0gd2luZG93V2hlbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2l0aExhdGVzdEZyb20uanMKdmFyIHJlcXVpcmVfd2l0aExhdGVzdEZyb20gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvd2l0aExhdGVzdEZyb20uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19yZWFkID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19yZWFkIHx8IGZ1bmN0aW9uKG8sIG4pIHsKICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsKICAgICAgaWYgKCFtKSByZXR1cm4gbzsKICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7CiAgICAgIHRyeSB7CiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgZSA9IHsgZXJyb3IgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbInJldHVybiJdKSkgbS5jYWxsKGkpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFyOwogICAgfTsKICAgIHZhciBfX3NwcmVhZEFycmF5ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zcHJlYWRBcnJheSB8fCBmdW5jdGlvbih0bywgZnJvbSkgewogICAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKykKICAgICAgICB0b1tqXSA9IGZyb21baV07CiAgICAgIHJldHVybiB0bzsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndpdGhMYXRlc3RGcm9tID0gdm9pZCAwOwogICAgdmFyIGxpZnRfMSA9IHJlcXVpcmVfbGlmdCgpOwogICAgdmFyIE9wZXJhdG9yU3Vic2NyaWJlcl8xID0gcmVxdWlyZV9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIHZhciBpbm5lckZyb21fMSA9IHJlcXVpcmVfaW5uZXJGcm9tKCk7CiAgICB2YXIgaWRlbnRpdHlfMSA9IHJlcXVpcmVfaWRlbnRpdHkoKTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIHZhciBhcmdzXzEgPSByZXF1aXJlX2FyZ3MoKTsKICAgIGZ1bmN0aW9uIHdpdGhMYXRlc3RGcm9tKCkgewogICAgICB2YXIgaW5wdXRzID0gW107CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgaW5wdXRzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgdmFyIHByb2plY3QgPSBhcmdzXzEucG9wUmVzdWx0U2VsZWN0b3IoaW5wdXRzKTsKICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHZhciBsZW4gPSBpbnB1dHMubGVuZ3RoOwogICAgICAgIHZhciBvdGhlclZhbHVlcyA9IG5ldyBBcnJheShsZW4pOwogICAgICAgIHZhciBoYXNWYWx1ZSA9IGlucHV0cy5tYXAoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIHJlYWR5ID0gZmFsc2U7CiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikgewogICAgICAgICAgaW5uZXJGcm9tXzEuaW5uZXJGcm9tKGlucHV0c1tpMl0pLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgb3RoZXJWYWx1ZXNbaTJdID0gdmFsdWU7CiAgICAgICAgICAgIGlmICghcmVhZHkgJiYgIWhhc1ZhbHVlW2kyXSkgewogICAgICAgICAgICAgIGhhc1ZhbHVlW2kyXSA9IHRydWU7CiAgICAgICAgICAgICAgKHJlYWR5ID0gaGFzVmFsdWUuZXZlcnkoaWRlbnRpdHlfMS5pZGVudGl0eSkpICYmIChoYXNWYWx1ZSA9IG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBub29wXzEubm9vcCkpOwogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgX2xvb3BfMShpKTsKICAgICAgICB9CiAgICAgICAgc291cmNlLnN1YnNjcmliZShPcGVyYXRvclN1YnNjcmliZXJfMS5jcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmIChyZWFkeSkgewogICAgICAgICAgICB2YXIgdmFsdWVzID0gX19zcHJlYWRBcnJheShbdmFsdWVdLCBfX3JlYWQob3RoZXJWYWx1ZXMpKTsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHByb2plY3QgPyBwcm9qZWN0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHZhbHVlcykpKSA6IHZhbHVlcyk7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLndpdGhMYXRlc3RGcm9tID0gd2l0aExhdGVzdEZyb207CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcEFsbC5qcwp2YXIgcmVxdWlyZV96aXBBbGwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbnRlcm5hbC9vcGVyYXRvcnMvemlwQWxsLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi56aXBBbGwgPSB2b2lkIDA7CiAgICB2YXIgemlwXzEgPSByZXF1aXJlX3ppcCgpOwogICAgdmFyIGpvaW5BbGxJbnRlcm5hbHNfMSA9IHJlcXVpcmVfam9pbkFsbEludGVybmFscygpOwogICAgZnVuY3Rpb24gemlwQWxsKHByb2plY3QpIHsKICAgICAgcmV0dXJuIGpvaW5BbGxJbnRlcm5hbHNfMS5qb2luQWxsSW50ZXJuYWxzKHppcF8xLnppcCwgcHJvamVjdCk7CiAgICB9CiAgICBleHBvcnRzMi56aXBBbGwgPSB6aXBBbGw7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcC5qcwp2YXIgcmVxdWlyZV96aXAyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX3JlYWQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3JlYWQgfHwgZnVuY3Rpb24obywgbikgewogICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdOwogICAgICBpZiAoIW0pIHJldHVybiBvOwogICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTsKICAgICAgdHJ5IHsKICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBlID0geyBlcnJvciB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVsicmV0dXJuIl0pKSBtLmNhbGwoaSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXI7CiAgICB9OwogICAgdmFyIF9fc3ByZWFkQXJyYXkgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NwcmVhZEFycmF5IHx8IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgICAgcmV0dXJuIHRvOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuemlwID0gdm9pZCAwOwogICAgdmFyIHppcF8xID0gcmVxdWlyZV96aXAoKTsKICAgIHZhciBsaWZ0XzEgPSByZXF1aXJlX2xpZnQoKTsKICAgIGZ1bmN0aW9uIHppcCgpIHsKICAgICAgdmFyIHNvdXJjZXMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBzb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIGxpZnRfMS5vcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgICAgIHppcF8xLnppcC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW3NvdXJjZV0sIF9fcmVhZChzb3VyY2VzKSkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfSk7CiAgICB9CiAgICBleHBvcnRzMi56aXAgPSB6aXA7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3J4anMtbnBtLTcuOC4xLTQxYzQ0M2E3NWItYjEwY2FjMWE1Mi56aXAvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9janMvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcFdpdGguanMKdmFyIHJlcXVpcmVfemlwV2l0aCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9yeGpzLW5wbS03LjguMS00MWM0NDNhNzViLWIxMGNhYzFhNTIuemlwL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvY2pzL2ludGVybmFsL29wZXJhdG9ycy96aXBXaXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fcmVhZCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fcmVhZCB8fCBmdW5jdGlvbihvLCBuKSB7CiAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgIGlmICghbSkgcmV0dXJuIG87CiAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlOwogICAgICB0cnkgewogICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGUgPSB7IGVycm9yIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhcjsKICAgIH07CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24odG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgICByZXR1cm4gdG87CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi56aXBXaXRoID0gdm9pZCAwOwogICAgdmFyIHppcF8xID0gcmVxdWlyZV96aXAyKCk7CiAgICBmdW5jdGlvbiB6aXBXaXRoKCkgewogICAgICB2YXIgb3RoZXJJbnB1dHMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBvdGhlcklucHV0c1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICB9CiAgICAgIHJldHVybiB6aXBfMS56aXAuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQob3RoZXJJbnB1dHMpKSk7CiAgICB9CiAgICBleHBvcnRzMi56aXBXaXRoID0gemlwV2l0aDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbmRleC5qcwp2YXIgcmVxdWlyZV9janMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcnhqcy1ucG0tNy44LjEtNDFjNDQzYTc1Yi1iMTBjYWMxYTUyLnppcC9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2Nqcy9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2NyZWF0ZUJpbmRpbmcgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbVtrXTsKICAgICAgfSB9KTsKICAgIH0gOiBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBvW2syXSA9IG1ba107CiAgICB9KTsKICAgIHZhciBfX2V4cG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4cG9ydFN0YXIgfHwgZnVuY3Rpb24obSwgZXhwb3J0czMpIHsKICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0czMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0czMsIG0sIHApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaW50ZXJ2YWwgPSBleHBvcnRzMi5paWYgPSBleHBvcnRzMi5nZW5lcmF0ZSA9IGV4cG9ydHMyLmZyb21FdmVudFBhdHRlcm4gPSBleHBvcnRzMi5mcm9tRXZlbnQgPSBleHBvcnRzMi5mcm9tID0gZXhwb3J0czIuZm9ya0pvaW4gPSBleHBvcnRzMi5lbXB0eSA9IGV4cG9ydHMyLmRlZmVyID0gZXhwb3J0czIuY29ubmVjdGFibGUgPSBleHBvcnRzMi5jb25jYXQgPSBleHBvcnRzMi5jb21iaW5lTGF0ZXN0ID0gZXhwb3J0czIuYmluZE5vZGVDYWxsYmFjayA9IGV4cG9ydHMyLmJpbmRDYWxsYmFjayA9IGV4cG9ydHMyLlVuc3Vic2NyaXB0aW9uRXJyb3IgPSBleHBvcnRzMi5UaW1lb3V0RXJyb3IgPSBleHBvcnRzMi5TZXF1ZW5jZUVycm9yID0gZXhwb3J0czIuT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IgPSBleHBvcnRzMi5Ob3RGb3VuZEVycm9yID0gZXhwb3J0czIuRW1wdHlFcnJvciA9IGV4cG9ydHMyLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yID0gZXhwb3J0czIuZmlyc3RWYWx1ZUZyb20gPSBleHBvcnRzMi5sYXN0VmFsdWVGcm9tID0gZXhwb3J0czIuaXNPYnNlcnZhYmxlID0gZXhwb3J0czIuaWRlbnRpdHkgPSBleHBvcnRzMi5ub29wID0gZXhwb3J0czIucGlwZSA9IGV4cG9ydHMyLk5vdGlmaWNhdGlvbktpbmQgPSBleHBvcnRzMi5Ob3RpZmljYXRpb24gPSBleHBvcnRzMi5TdWJzY3JpYmVyID0gZXhwb3J0czIuU3Vic2NyaXB0aW9uID0gZXhwb3J0czIuU2NoZWR1bGVyID0gZXhwb3J0czIuVmlydHVhbEFjdGlvbiA9IGV4cG9ydHMyLlZpcnR1YWxUaW1lU2NoZWR1bGVyID0gZXhwb3J0czIuYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSBleHBvcnRzMi5hbmltYXRpb25GcmFtZSA9IGV4cG9ydHMyLnF1ZXVlU2NoZWR1bGVyID0gZXhwb3J0czIucXVldWUgPSBleHBvcnRzMi5hc3luY1NjaGVkdWxlciA9IGV4cG9ydHMyLmFzeW5jID0gZXhwb3J0czIuYXNhcFNjaGVkdWxlciA9IGV4cG9ydHMyLmFzYXAgPSBleHBvcnRzMi5Bc3luY1N1YmplY3QgPSBleHBvcnRzMi5SZXBsYXlTdWJqZWN0ID0gZXhwb3J0czIuQmVoYXZpb3JTdWJqZWN0ID0gZXhwb3J0czIuU3ViamVjdCA9IGV4cG9ydHMyLmFuaW1hdGlvbkZyYW1lcyA9IGV4cG9ydHMyLm9ic2VydmFibGUgPSBleHBvcnRzMi5Db25uZWN0YWJsZU9ic2VydmFibGUgPSBleHBvcnRzMi5PYnNlcnZhYmxlID0gdm9pZCAwOwogICAgZXhwb3J0czIuZmlsdGVyID0gZXhwb3J0czIuZXhwYW5kID0gZXhwb3J0czIuZXhoYXVzdE1hcCA9IGV4cG9ydHMyLmV4aGF1c3RBbGwgPSBleHBvcnRzMi5leGhhdXN0ID0gZXhwb3J0czIuZXZlcnkgPSBleHBvcnRzMi5lbmRXaXRoID0gZXhwb3J0czIuZWxlbWVudEF0ID0gZXhwb3J0czIuZGlzdGluY3RVbnRpbEtleUNoYW5nZWQgPSBleHBvcnRzMi5kaXN0aW5jdFVudGlsQ2hhbmdlZCA9IGV4cG9ydHMyLmRpc3RpbmN0ID0gZXhwb3J0czIuZGVtYXRlcmlhbGl6ZSA9IGV4cG9ydHMyLmRlbGF5V2hlbiA9IGV4cG9ydHMyLmRlbGF5ID0gZXhwb3J0czIuZGVmYXVsdElmRW1wdHkgPSBleHBvcnRzMi5kZWJvdW5jZVRpbWUgPSBleHBvcnRzMi5kZWJvdW5jZSA9IGV4cG9ydHMyLmNvdW50ID0gZXhwb3J0czIuY29ubmVjdCA9IGV4cG9ydHMyLmNvbmNhdFdpdGggPSBleHBvcnRzMi5jb25jYXRNYXBUbyA9IGV4cG9ydHMyLmNvbmNhdE1hcCA9IGV4cG9ydHMyLmNvbmNhdEFsbCA9IGV4cG9ydHMyLmNvbWJpbmVMYXRlc3RXaXRoID0gZXhwb3J0czIuY29tYmluZUxhdGVzdEFsbCA9IGV4cG9ydHMyLmNvbWJpbmVBbGwgPSBleHBvcnRzMi5jYXRjaEVycm9yID0gZXhwb3J0czIuYnVmZmVyV2hlbiA9IGV4cG9ydHMyLmJ1ZmZlclRvZ2dsZSA9IGV4cG9ydHMyLmJ1ZmZlclRpbWUgPSBleHBvcnRzMi5idWZmZXJDb3VudCA9IGV4cG9ydHMyLmJ1ZmZlciA9IGV4cG9ydHMyLmF1ZGl0VGltZSA9IGV4cG9ydHMyLmF1ZGl0ID0gZXhwb3J0czIuY29uZmlnID0gZXhwb3J0czIuTkVWRVIgPSBleHBvcnRzMi5FTVBUWSA9IGV4cG9ydHMyLnNjaGVkdWxlZCA9IGV4cG9ydHMyLnppcCA9IGV4cG9ydHMyLnVzaW5nID0gZXhwb3J0czIudGltZXIgPSBleHBvcnRzMi50aHJvd0Vycm9yID0gZXhwb3J0czIucmFuZ2UgPSBleHBvcnRzMi5yYWNlID0gZXhwb3J0czIucGFydGl0aW9uID0gZXhwb3J0czIucGFpcnMgPSBleHBvcnRzMi5vbkVycm9yUmVzdW1lTmV4dCA9IGV4cG9ydHMyLm9mID0gZXhwb3J0czIubmV2ZXIgPSBleHBvcnRzMi5tZXJnZSA9IHZvaWQgMDsKICAgIGV4cG9ydHMyLnN3aXRjaE1hcCA9IGV4cG9ydHMyLnN3aXRjaEFsbCA9IGV4cG9ydHMyLnN1YnNjcmliZU9uID0gZXhwb3J0czIuc3RhcnRXaXRoID0gZXhwb3J0czIuc2tpcFdoaWxlID0gZXhwb3J0czIuc2tpcFVudGlsID0gZXhwb3J0czIuc2tpcExhc3QgPSBleHBvcnRzMi5za2lwID0gZXhwb3J0czIuc2luZ2xlID0gZXhwb3J0czIuc2hhcmVSZXBsYXkgPSBleHBvcnRzMi5zaGFyZSA9IGV4cG9ydHMyLnNlcXVlbmNlRXF1YWwgPSBleHBvcnRzMi5zY2FuID0gZXhwb3J0czIuc2FtcGxlVGltZSA9IGV4cG9ydHMyLnNhbXBsZSA9IGV4cG9ydHMyLnJlZkNvdW50ID0gZXhwb3J0czIucmV0cnlXaGVuID0gZXhwb3J0czIucmV0cnkgPSBleHBvcnRzMi5yZXBlYXRXaGVuID0gZXhwb3J0czIucmVwZWF0ID0gZXhwb3J0czIucmVkdWNlID0gZXhwb3J0czIucmFjZVdpdGggPSBleHBvcnRzMi5wdWJsaXNoUmVwbGF5ID0gZXhwb3J0czIucHVibGlzaExhc3QgPSBleHBvcnRzMi5wdWJsaXNoQmVoYXZpb3IgPSBleHBvcnRzMi5wdWJsaXNoID0gZXhwb3J0czIucGx1Y2sgPSBleHBvcnRzMi5wYWlyd2lzZSA9IGV4cG9ydHMyLm9uRXJyb3JSZXN1bWVOZXh0V2l0aCA9IGV4cG9ydHMyLm9ic2VydmVPbiA9IGV4cG9ydHMyLm11bHRpY2FzdCA9IGV4cG9ydHMyLm1pbiA9IGV4cG9ydHMyLm1lcmdlV2l0aCA9IGV4cG9ydHMyLm1lcmdlU2NhbiA9IGV4cG9ydHMyLm1lcmdlTWFwVG8gPSBleHBvcnRzMi5tZXJnZU1hcCA9IGV4cG9ydHMyLmZsYXRNYXAgPSBleHBvcnRzMi5tZXJnZUFsbCA9IGV4cG9ydHMyLm1heCA9IGV4cG9ydHMyLm1hdGVyaWFsaXplID0gZXhwb3J0czIubWFwVG8gPSBleHBvcnRzMi5tYXAgPSBleHBvcnRzMi5sYXN0ID0gZXhwb3J0czIuaXNFbXB0eSA9IGV4cG9ydHMyLmlnbm9yZUVsZW1lbnRzID0gZXhwb3J0czIuZ3JvdXBCeSA9IGV4cG9ydHMyLmZpcnN0ID0gZXhwb3J0czIuZmluZEluZGV4ID0gZXhwb3J0czIuZmluZCA9IGV4cG9ydHMyLmZpbmFsaXplID0gdm9pZCAwOwogICAgZXhwb3J0czIuemlwV2l0aCA9IGV4cG9ydHMyLnppcEFsbCA9IGV4cG9ydHMyLndpdGhMYXRlc3RGcm9tID0gZXhwb3J0czIud2luZG93V2hlbiA9IGV4cG9ydHMyLndpbmRvd1RvZ2dsZSA9IGV4cG9ydHMyLndpbmRvd1RpbWUgPSBleHBvcnRzMi53aW5kb3dDb3VudCA9IGV4cG9ydHMyLndpbmRvdyA9IGV4cG9ydHMyLnRvQXJyYXkgPSBleHBvcnRzMi50aW1lc3RhbXAgPSBleHBvcnRzMi50aW1lb3V0V2l0aCA9IGV4cG9ydHMyLnRpbWVvdXQgPSBleHBvcnRzMi50aW1lSW50ZXJ2YWwgPSBleHBvcnRzMi50aHJvd0lmRW1wdHkgPSBleHBvcnRzMi50aHJvdHRsZVRpbWUgPSBleHBvcnRzMi50aHJvdHRsZSA9IGV4cG9ydHMyLnRhcCA9IGV4cG9ydHMyLnRha2VXaGlsZSA9IGV4cG9ydHMyLnRha2VVbnRpbCA9IGV4cG9ydHMyLnRha2VMYXN0ID0gZXhwb3J0czIudGFrZSA9IGV4cG9ydHMyLnN3aXRjaFNjYW4gPSBleHBvcnRzMi5zd2l0Y2hNYXBUbyA9IHZvaWQgMDsKICAgIHZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlX09ic2VydmFibGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIk9ic2VydmFibGUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZTsKICAgIH0gfSk7CiAgICB2YXIgQ29ubmVjdGFibGVPYnNlcnZhYmxlXzEgPSByZXF1aXJlX0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiQ29ubmVjdGFibGVPYnNlcnZhYmxlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gQ29ubmVjdGFibGVPYnNlcnZhYmxlXzEuQ29ubmVjdGFibGVPYnNlcnZhYmxlOwogICAgfSB9KTsKICAgIHZhciBvYnNlcnZhYmxlXzEgPSByZXF1aXJlX29ic2VydmFibGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm9ic2VydmFibGUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBvYnNlcnZhYmxlXzEub2JzZXJ2YWJsZTsKICAgIH0gfSk7CiAgICB2YXIgYW5pbWF0aW9uRnJhbWVzXzEgPSByZXF1aXJlX2FuaW1hdGlvbkZyYW1lcygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiYW5pbWF0aW9uRnJhbWVzIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYW5pbWF0aW9uRnJhbWVzXzEuYW5pbWF0aW9uRnJhbWVzOwogICAgfSB9KTsKICAgIHZhciBTdWJqZWN0XzEgPSByZXF1aXJlX1N1YmplY3QoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIlN1YmplY3QiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBTdWJqZWN0XzEuU3ViamVjdDsKICAgIH0gfSk7CiAgICB2YXIgQmVoYXZpb3JTdWJqZWN0XzEgPSByZXF1aXJlX0JlaGF2aW9yU3ViamVjdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiQmVoYXZpb3JTdWJqZWN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gQmVoYXZpb3JTdWJqZWN0XzEuQmVoYXZpb3JTdWJqZWN0OwogICAgfSB9KTsKICAgIHZhciBSZXBsYXlTdWJqZWN0XzEgPSByZXF1aXJlX1JlcGxheVN1YmplY3QoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIlJlcGxheVN1YmplY3QiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBSZXBsYXlTdWJqZWN0XzEuUmVwbGF5U3ViamVjdDsKICAgIH0gfSk7CiAgICB2YXIgQXN5bmNTdWJqZWN0XzEgPSByZXF1aXJlX0FzeW5jU3ViamVjdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiQXN5bmNTdWJqZWN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gQXN5bmNTdWJqZWN0XzEuQXN5bmNTdWJqZWN0OwogICAgfSB9KTsKICAgIHZhciBhc2FwXzEgPSByZXF1aXJlX2FzYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImFzYXAiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhc2FwXzEuYXNhcDsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJhc2FwU2NoZWR1bGVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYXNhcF8xLmFzYXBTY2hlZHVsZXI7CiAgICB9IH0pOwogICAgdmFyIGFzeW5jXzEgPSByZXF1aXJlX2FzeW5jKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJhc3luYyIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGFzeW5jXzEuYXN5bmM7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiYXN5bmNTY2hlZHVsZXIiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhc3luY18xLmFzeW5jU2NoZWR1bGVyOwogICAgfSB9KTsKICAgIHZhciBxdWV1ZV8xID0gcmVxdWlyZV9xdWV1ZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicXVldWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBxdWV1ZV8xLnF1ZXVlOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInF1ZXVlU2NoZWR1bGVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcXVldWVfMS5xdWV1ZVNjaGVkdWxlcjsKICAgIH0gfSk7CiAgICB2YXIgYW5pbWF0aW9uRnJhbWVfMSA9IHJlcXVpcmVfYW5pbWF0aW9uRnJhbWUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImFuaW1hdGlvbkZyYW1lIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYW5pbWF0aW9uRnJhbWVfMS5hbmltYXRpb25GcmFtZTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJhbmltYXRpb25GcmFtZVNjaGVkdWxlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGFuaW1hdGlvbkZyYW1lXzEuYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXI7CiAgICB9IH0pOwogICAgdmFyIFZpcnR1YWxUaW1lU2NoZWR1bGVyXzEgPSByZXF1aXJlX1ZpcnR1YWxUaW1lU2NoZWR1bGVyKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJWaXJ0dWFsVGltZVNjaGVkdWxlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFZpcnR1YWxUaW1lU2NoZWR1bGVyXzEuVmlydHVhbFRpbWVTY2hlZHVsZXI7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiVmlydHVhbEFjdGlvbiIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFZpcnR1YWxUaW1lU2NoZWR1bGVyXzEuVmlydHVhbEFjdGlvbjsKICAgIH0gfSk7CiAgICB2YXIgU2NoZWR1bGVyXzEgPSByZXF1aXJlX1NjaGVkdWxlcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiU2NoZWR1bGVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gU2NoZWR1bGVyXzEuU2NoZWR1bGVyOwogICAgfSB9KTsKICAgIHZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmVfU3Vic2NyaXB0aW9uKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJTdWJzY3JpcHRpb24iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb247CiAgICB9IH0pOwogICAgdmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmVfU3Vic2NyaWJlcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiU3Vic2NyaWJlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyOwogICAgfSB9KTsKICAgIHZhciBOb3RpZmljYXRpb25fMSA9IHJlcXVpcmVfTm90aWZpY2F0aW9uKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJOb3RpZmljYXRpb24iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb247CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiTm90aWZpY2F0aW9uS2luZCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbktpbmQ7CiAgICB9IH0pOwogICAgdmFyIHBpcGVfMSA9IHJlcXVpcmVfcGlwZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicGlwZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHBpcGVfMS5waXBlOwogICAgfSB9KTsKICAgIHZhciBub29wXzEgPSByZXF1aXJlX25vb3AoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm5vb3AiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBub29wXzEubm9vcDsKICAgIH0gfSk7CiAgICB2YXIgaWRlbnRpdHlfMSA9IHJlcXVpcmVfaWRlbnRpdHkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImlkZW50aXR5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaWRlbnRpdHlfMS5pZGVudGl0eTsKICAgIH0gfSk7CiAgICB2YXIgaXNPYnNlcnZhYmxlXzEgPSByZXF1aXJlX2lzT2JzZXJ2YWJsZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiaXNPYnNlcnZhYmxlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaXNPYnNlcnZhYmxlXzEuaXNPYnNlcnZhYmxlOwogICAgfSB9KTsKICAgIHZhciBsYXN0VmFsdWVGcm9tXzEgPSByZXF1aXJlX2xhc3RWYWx1ZUZyb20oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImxhc3RWYWx1ZUZyb20iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBsYXN0VmFsdWVGcm9tXzEubGFzdFZhbHVlRnJvbTsKICAgIH0gfSk7CiAgICB2YXIgZmlyc3RWYWx1ZUZyb21fMSA9IHJlcXVpcmVfZmlyc3RWYWx1ZUZyb20oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImZpcnN0VmFsdWVGcm9tIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb21fMS5maXJzdFZhbHVlRnJvbTsKICAgIH0gfSk7CiAgICB2YXIgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JfMSA9IHJlcXVpcmVfQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JfMS5Bcmd1bWVudE91dE9mUmFuZ2VFcnJvcjsKICAgIH0gfSk7CiAgICB2YXIgRW1wdHlFcnJvcl8xID0gcmVxdWlyZV9FbXB0eUVycm9yKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJFbXB0eUVycm9yIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3I7CiAgICB9IH0pOwogICAgdmFyIE5vdEZvdW5kRXJyb3JfMSA9IHJlcXVpcmVfTm90Rm91bmRFcnJvcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiTm90Rm91bmRFcnJvciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIE5vdEZvdW5kRXJyb3JfMS5Ob3RGb3VuZEVycm9yOwogICAgfSB9KTsKICAgIHZhciBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xID0gcmVxdWlyZV9PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xLk9iamVjdFVuc3Vic2NyaWJlZEVycm9yOwogICAgfSB9KTsKICAgIHZhciBTZXF1ZW5jZUVycm9yXzEgPSByZXF1aXJlX1NlcXVlbmNlRXJyb3IoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIlNlcXVlbmNlRXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBTZXF1ZW5jZUVycm9yXzEuU2VxdWVuY2VFcnJvcjsKICAgIH0gfSk7CiAgICB2YXIgdGltZW91dF8xID0gcmVxdWlyZV90aW1lb3V0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJUaW1lb3V0RXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aW1lb3V0XzEuVGltZW91dEVycm9yOwogICAgfSB9KTsKICAgIHZhciBVbnN1YnNjcmlwdGlvbkVycm9yXzEgPSByZXF1aXJlX1Vuc3Vic2NyaXB0aW9uRXJyb3IoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIlVuc3Vic2NyaXB0aW9uRXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBVbnN1YnNjcmlwdGlvbkVycm9yXzEuVW5zdWJzY3JpcHRpb25FcnJvcjsKICAgIH0gfSk7CiAgICB2YXIgYmluZENhbGxiYWNrXzEgPSByZXF1aXJlX2JpbmRDYWxsYmFjaygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiYmluZENhbGxiYWNrIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYmluZENhbGxiYWNrXzEuYmluZENhbGxiYWNrOwogICAgfSB9KTsKICAgIHZhciBiaW5kTm9kZUNhbGxiYWNrXzEgPSByZXF1aXJlX2JpbmROb2RlQ2FsbGJhY2soKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImJpbmROb2RlQ2FsbGJhY2siLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBiaW5kTm9kZUNhbGxiYWNrXzEuYmluZE5vZGVDYWxsYmFjazsKICAgIH0gfSk7CiAgICB2YXIgY29tYmluZUxhdGVzdF8xID0gcmVxdWlyZV9jb21iaW5lTGF0ZXN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJjb21iaW5lTGF0ZXN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29tYmluZUxhdGVzdF8xLmNvbWJpbmVMYXRlc3Q7CiAgICB9IH0pOwogICAgdmFyIGNvbmNhdF8xID0gcmVxdWlyZV9jb25jYXQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImNvbmNhdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbmNhdF8xLmNvbmNhdDsKICAgIH0gfSk7CiAgICB2YXIgY29ubmVjdGFibGVfMSA9IHJlcXVpcmVfY29ubmVjdGFibGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImNvbm5lY3RhYmxlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29ubmVjdGFibGVfMS5jb25uZWN0YWJsZTsKICAgIH0gfSk7CiAgICB2YXIgZGVmZXJfMSA9IHJlcXVpcmVfZGVmZXIoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRlZmVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVmZXJfMS5kZWZlcjsKICAgIH0gfSk7CiAgICB2YXIgZW1wdHlfMSA9IHJlcXVpcmVfZW1wdHkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImVtcHR5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZW1wdHlfMS5lbXB0eTsKICAgIH0gfSk7CiAgICB2YXIgZm9ya0pvaW5fMSA9IHJlcXVpcmVfZm9ya0pvaW4oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImZvcmtKb2luIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZm9ya0pvaW5fMS5mb3JrSm9pbjsKICAgIH0gfSk7CiAgICB2YXIgZnJvbV8xID0gcmVxdWlyZV9mcm9tKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmcm9tIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZnJvbV8xLmZyb207CiAgICB9IH0pOwogICAgdmFyIGZyb21FdmVudF8xID0gcmVxdWlyZV9mcm9tRXZlbnQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImZyb21FdmVudCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZyb21FdmVudF8xLmZyb21FdmVudDsKICAgIH0gfSk7CiAgICB2YXIgZnJvbUV2ZW50UGF0dGVybl8xID0gcmVxdWlyZV9mcm9tRXZlbnRQYXR0ZXJuKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmcm9tRXZlbnRQYXR0ZXJuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybl8xLmZyb21FdmVudFBhdHRlcm47CiAgICB9IH0pOwogICAgdmFyIGdlbmVyYXRlXzEgPSByZXF1aXJlX2dlbmVyYXRlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJnZW5lcmF0ZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRlXzEuZ2VuZXJhdGU7CiAgICB9IH0pOwogICAgdmFyIGlpZl8xID0gcmVxdWlyZV9paWYoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImlpZiIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGlpZl8xLmlpZjsKICAgIH0gfSk7CiAgICB2YXIgaW50ZXJ2YWxfMSA9IHJlcXVpcmVfaW50ZXJ2YWwoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImludGVydmFsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaW50ZXJ2YWxfMS5pbnRlcnZhbDsKICAgIH0gfSk7CiAgICB2YXIgbWVyZ2VfMSA9IHJlcXVpcmVfbWVyZ2UoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1lcmdlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWVyZ2VfMS5tZXJnZTsKICAgIH0gfSk7CiAgICB2YXIgbmV2ZXJfMSA9IHJlcXVpcmVfbmV2ZXIoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm5ldmVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV2ZXJfMS5uZXZlcjsKICAgIH0gfSk7CiAgICB2YXIgb2ZfMSA9IHJlcXVpcmVfb2YoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm9mIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gb2ZfMS5vZjsKICAgIH0gfSk7CiAgICB2YXIgb25FcnJvclJlc3VtZU5leHRfMSA9IHJlcXVpcmVfb25FcnJvclJlc3VtZU5leHQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm9uRXJyb3JSZXN1bWVOZXh0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gb25FcnJvclJlc3VtZU5leHRfMS5vbkVycm9yUmVzdW1lTmV4dDsKICAgIH0gfSk7CiAgICB2YXIgcGFpcnNfMSA9IHJlcXVpcmVfcGFpcnMoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInBhaXJzIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcGFpcnNfMS5wYWlyczsKICAgIH0gfSk7CiAgICB2YXIgcGFydGl0aW9uXzEgPSByZXF1aXJlX3BhcnRpdGlvbigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicGFydGl0aW9uIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcGFydGl0aW9uXzEucGFydGl0aW9uOwogICAgfSB9KTsKICAgIHZhciByYWNlXzEgPSByZXF1aXJlX3JhY2UoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJhY2UiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByYWNlXzEucmFjZTsKICAgIH0gfSk7CiAgICB2YXIgcmFuZ2VfMSA9IHJlcXVpcmVfcmFuZ2UoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJhbmdlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmFuZ2VfMS5yYW5nZTsKICAgIH0gfSk7CiAgICB2YXIgdGhyb3dFcnJvcl8xID0gcmVxdWlyZV90aHJvd0Vycm9yKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ0aHJvd0Vycm9yIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhyb3dFcnJvcl8xLnRocm93RXJyb3I7CiAgICB9IH0pOwogICAgdmFyIHRpbWVyXzEgPSByZXF1aXJlX3RpbWVyKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ0aW1lciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRpbWVyXzEudGltZXI7CiAgICB9IH0pOwogICAgdmFyIHVzaW5nXzEgPSByZXF1aXJlX3VzaW5nKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ1c2luZyIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHVzaW5nXzEudXNpbmc7CiAgICB9IH0pOwogICAgdmFyIHppcF8xID0gcmVxdWlyZV96aXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInppcCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHppcF8xLnppcDsKICAgIH0gfSk7CiAgICB2YXIgc2NoZWR1bGVkXzEgPSByZXF1aXJlX3NjaGVkdWxlZCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2NoZWR1bGVkIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc2NoZWR1bGVkXzEuc2NoZWR1bGVkOwogICAgfSB9KTsKICAgIHZhciBlbXB0eV8yID0gcmVxdWlyZV9lbXB0eSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiRU1QVFkiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlbXB0eV8yLkVNUFRZOwogICAgfSB9KTsKICAgIHZhciBuZXZlcl8yID0gcmVxdWlyZV9uZXZlcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiTkVWRVIiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBuZXZlcl8yLk5FVkVSOwogICAgfSB9KTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3R5cGVzMigpLCBleHBvcnRzMik7CiAgICB2YXIgY29uZmlnXzEgPSByZXF1aXJlX2NvbmZpZygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiY29uZmlnIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29uZmlnXzEuY29uZmlnOwogICAgfSB9KTsKICAgIHZhciBhdWRpdF8xID0gcmVxdWlyZV9hdWRpdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiYXVkaXQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhdWRpdF8xLmF1ZGl0OwogICAgfSB9KTsKICAgIHZhciBhdWRpdFRpbWVfMSA9IHJlcXVpcmVfYXVkaXRUaW1lKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJhdWRpdFRpbWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhdWRpdFRpbWVfMS5hdWRpdFRpbWU7CiAgICB9IH0pOwogICAgdmFyIGJ1ZmZlcl8xID0gcmVxdWlyZV9idWZmZXIoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImJ1ZmZlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGJ1ZmZlcl8xLmJ1ZmZlcjsKICAgIH0gfSk7CiAgICB2YXIgYnVmZmVyQ291bnRfMSA9IHJlcXVpcmVfYnVmZmVyQ291bnQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImJ1ZmZlckNvdW50IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnVmZmVyQ291bnRfMS5idWZmZXJDb3VudDsKICAgIH0gfSk7CiAgICB2YXIgYnVmZmVyVGltZV8xID0gcmVxdWlyZV9idWZmZXJUaW1lKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJidWZmZXJUaW1lIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnVmZmVyVGltZV8xLmJ1ZmZlclRpbWU7CiAgICB9IH0pOwogICAgdmFyIGJ1ZmZlclRvZ2dsZV8xID0gcmVxdWlyZV9idWZmZXJUb2dnbGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImJ1ZmZlclRvZ2dsZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGJ1ZmZlclRvZ2dsZV8xLmJ1ZmZlclRvZ2dsZTsKICAgIH0gfSk7CiAgICB2YXIgYnVmZmVyV2hlbl8xID0gcmVxdWlyZV9idWZmZXJXaGVuKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJidWZmZXJXaGVuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnVmZmVyV2hlbl8xLmJ1ZmZlcldoZW47CiAgICB9IH0pOwogICAgdmFyIGNhdGNoRXJyb3JfMSA9IHJlcXVpcmVfY2F0Y2hFcnJvcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiY2F0Y2hFcnJvciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNhdGNoRXJyb3JfMS5jYXRjaEVycm9yOwogICAgfSB9KTsKICAgIHZhciBjb21iaW5lQWxsXzEgPSByZXF1aXJlX2NvbWJpbmVBbGwoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImNvbWJpbmVBbGwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb21iaW5lQWxsXzEuY29tYmluZUFsbDsKICAgIH0gfSk7CiAgICB2YXIgY29tYmluZUxhdGVzdEFsbF8xID0gcmVxdWlyZV9jb21iaW5lTGF0ZXN0QWxsKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJjb21iaW5lTGF0ZXN0QWxsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29tYmluZUxhdGVzdEFsbF8xLmNvbWJpbmVMYXRlc3RBbGw7CiAgICB9IH0pOwogICAgdmFyIGNvbWJpbmVMYXRlc3RXaXRoXzEgPSByZXF1aXJlX2NvbWJpbmVMYXRlc3RXaXRoKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJjb21iaW5lTGF0ZXN0V2l0aCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3RXaXRoXzEuY29tYmluZUxhdGVzdFdpdGg7CiAgICB9IH0pOwogICAgdmFyIGNvbmNhdEFsbF8xID0gcmVxdWlyZV9jb25jYXRBbGwoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImNvbmNhdEFsbCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbmNhdEFsbF8xLmNvbmNhdEFsbDsKICAgIH0gfSk7CiAgICB2YXIgY29uY2F0TWFwXzEgPSByZXF1aXJlX2NvbmNhdE1hcCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiY29uY2F0TWFwIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29uY2F0TWFwXzEuY29uY2F0TWFwOwogICAgfSB9KTsKICAgIHZhciBjb25jYXRNYXBUb18xID0gcmVxdWlyZV9jb25jYXRNYXBUbygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiY29uY2F0TWFwVG8iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb25jYXRNYXBUb18xLmNvbmNhdE1hcFRvOwogICAgfSB9KTsKICAgIHZhciBjb25jYXRXaXRoXzEgPSByZXF1aXJlX2NvbmNhdFdpdGgoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImNvbmNhdFdpdGgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb25jYXRXaXRoXzEuY29uY2F0V2l0aDsKICAgIH0gfSk7CiAgICB2YXIgY29ubmVjdF8xID0gcmVxdWlyZV9jb25uZWN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJjb25uZWN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29ubmVjdF8xLmNvbm5lY3Q7CiAgICB9IH0pOwogICAgdmFyIGNvdW50XzEgPSByZXF1aXJlX2NvdW50KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJjb3VudCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvdW50XzEuY291bnQ7CiAgICB9IH0pOwogICAgdmFyIGRlYm91bmNlXzEgPSByZXF1aXJlX2RlYm91bmNlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJkZWJvdW5jZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGRlYm91bmNlXzEuZGVib3VuY2U7CiAgICB9IH0pOwogICAgdmFyIGRlYm91bmNlVGltZV8xID0gcmVxdWlyZV9kZWJvdW5jZVRpbWUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRlYm91bmNlVGltZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGRlYm91bmNlVGltZV8xLmRlYm91bmNlVGltZTsKICAgIH0gfSk7CiAgICB2YXIgZGVmYXVsdElmRW1wdHlfMSA9IHJlcXVpcmVfZGVmYXVsdElmRW1wdHkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRlZmF1bHRJZkVtcHR5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVmYXVsdElmRW1wdHlfMS5kZWZhdWx0SWZFbXB0eTsKICAgIH0gfSk7CiAgICB2YXIgZGVsYXlfMSA9IHJlcXVpcmVfZGVsYXkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRlbGF5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVsYXlfMS5kZWxheTsKICAgIH0gfSk7CiAgICB2YXIgZGVsYXlXaGVuXzEgPSByZXF1aXJlX2RlbGF5V2hlbigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZGVsYXlXaGVuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVsYXlXaGVuXzEuZGVsYXlXaGVuOwogICAgfSB9KTsKICAgIHZhciBkZW1hdGVyaWFsaXplXzEgPSByZXF1aXJlX2RlbWF0ZXJpYWxpemUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRlbWF0ZXJpYWxpemUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkZW1hdGVyaWFsaXplXzEuZGVtYXRlcmlhbGl6ZTsKICAgIH0gfSk7CiAgICB2YXIgZGlzdGluY3RfMSA9IHJlcXVpcmVfZGlzdGluY3QoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRpc3RpbmN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGlzdGluY3RfMS5kaXN0aW5jdDsKICAgIH0gfSk7CiAgICB2YXIgZGlzdGluY3RVbnRpbENoYW5nZWRfMSA9IHJlcXVpcmVfZGlzdGluY3RVbnRpbENoYW5nZWQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRpc3RpbmN0VW50aWxDaGFuZ2VkIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGlzdGluY3RVbnRpbENoYW5nZWRfMS5kaXN0aW5jdFVudGlsQ2hhbmdlZDsKICAgIH0gfSk7CiAgICB2YXIgZGlzdGluY3RVbnRpbEtleUNoYW5nZWRfMSA9IHJlcXVpcmVfZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGlzdGluY3RVbnRpbEtleUNoYW5nZWRfMS5kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZDsKICAgIH0gfSk7CiAgICB2YXIgZWxlbWVudEF0XzEgPSByZXF1aXJlX2VsZW1lbnRBdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZWxlbWVudEF0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZWxlbWVudEF0XzEuZWxlbWVudEF0OwogICAgfSB9KTsKICAgIHZhciBlbmRXaXRoXzEgPSByZXF1aXJlX2VuZFdpdGgoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImVuZFdpdGgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlbmRXaXRoXzEuZW5kV2l0aDsKICAgIH0gfSk7CiAgICB2YXIgZXZlcnlfMSA9IHJlcXVpcmVfZXZlcnkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImV2ZXJ5IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZlcnlfMS5ldmVyeTsKICAgIH0gfSk7CiAgICB2YXIgZXhoYXVzdF8xID0gcmVxdWlyZV9leGhhdXN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJleGhhdXN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXhoYXVzdF8xLmV4aGF1c3Q7CiAgICB9IH0pOwogICAgdmFyIGV4aGF1c3RBbGxfMSA9IHJlcXVpcmVfZXhoYXVzdEFsbCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZXhoYXVzdEFsbCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV4aGF1c3RBbGxfMS5leGhhdXN0QWxsOwogICAgfSB9KTsKICAgIHZhciBleGhhdXN0TWFwXzEgPSByZXF1aXJlX2V4aGF1c3RNYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImV4aGF1c3RNYXAiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBleGhhdXN0TWFwXzEuZXhoYXVzdE1hcDsKICAgIH0gfSk7CiAgICB2YXIgZXhwYW5kXzEgPSByZXF1aXJlX2V4cGFuZCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZXhwYW5kIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXhwYW5kXzEuZXhwYW5kOwogICAgfSB9KTsKICAgIHZhciBmaWx0ZXJfMSA9IHJlcXVpcmVfZmlsdGVyKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmaWx0ZXIiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBmaWx0ZXJfMS5maWx0ZXI7CiAgICB9IH0pOwogICAgdmFyIGZpbmFsaXplXzEgPSByZXF1aXJlX2ZpbmFsaXplKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmaW5hbGl6ZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZpbmFsaXplXzEuZmluYWxpemU7CiAgICB9IH0pOwogICAgdmFyIGZpbmRfMSA9IHJlcXVpcmVfZmluZCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZmluZCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZpbmRfMS5maW5kOwogICAgfSB9KTsKICAgIHZhciBmaW5kSW5kZXhfMSA9IHJlcXVpcmVfZmluZEluZGV4KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmaW5kSW5kZXgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBmaW5kSW5kZXhfMS5maW5kSW5kZXg7CiAgICB9IH0pOwogICAgdmFyIGZpcnN0XzEgPSByZXF1aXJlX2ZpcnN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJmaXJzdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZpcnN0XzEuZmlyc3Q7CiAgICB9IH0pOwogICAgdmFyIGdyb3VwQnlfMSA9IHJlcXVpcmVfZ3JvdXBCeSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiZ3JvdXBCeSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGdyb3VwQnlfMS5ncm91cEJ5OwogICAgfSB9KTsKICAgIHZhciBpZ25vcmVFbGVtZW50c18xID0gcmVxdWlyZV9pZ25vcmVFbGVtZW50cygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiaWdub3JlRWxlbWVudHMiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpZ25vcmVFbGVtZW50c18xLmlnbm9yZUVsZW1lbnRzOwogICAgfSB9KTsKICAgIHZhciBpc0VtcHR5XzEgPSByZXF1aXJlX2lzRW1wdHkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImlzRW1wdHkiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpc0VtcHR5XzEuaXNFbXB0eTsKICAgIH0gfSk7CiAgICB2YXIgbGFzdF8xID0gcmVxdWlyZV9sYXN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJsYXN0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbGFzdF8xLmxhc3Q7CiAgICB9IH0pOwogICAgdmFyIG1hcF8xID0gcmVxdWlyZV9tYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1hcCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG1hcF8xLm1hcDsKICAgIH0gfSk7CiAgICB2YXIgbWFwVG9fMSA9IHJlcXVpcmVfbWFwVG8oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1hcFRvIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWFwVG9fMS5tYXBUbzsKICAgIH0gfSk7CiAgICB2YXIgbWF0ZXJpYWxpemVfMSA9IHJlcXVpcmVfbWF0ZXJpYWxpemUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1hdGVyaWFsaXplIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWF0ZXJpYWxpemVfMS5tYXRlcmlhbGl6ZTsKICAgIH0gfSk7CiAgICB2YXIgbWF4XzEgPSByZXF1aXJlX21heCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAibWF4IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWF4XzEubWF4OwogICAgfSB9KTsKICAgIHZhciBtZXJnZUFsbF8xID0gcmVxdWlyZV9tZXJnZUFsbCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAibWVyZ2VBbGwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBtZXJnZUFsbF8xLm1lcmdlQWxsOwogICAgfSB9KTsKICAgIHZhciBmbGF0TWFwXzEgPSByZXF1aXJlX2ZsYXRNYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgImZsYXRNYXAiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBmbGF0TWFwXzEuZmxhdE1hcDsKICAgIH0gfSk7CiAgICB2YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmVfbWVyZ2VNYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1lcmdlTWFwIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWVyZ2VNYXBfMS5tZXJnZU1hcDsKICAgIH0gfSk7CiAgICB2YXIgbWVyZ2VNYXBUb18xID0gcmVxdWlyZV9tZXJnZU1hcFRvKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJtZXJnZU1hcFRvIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWVyZ2VNYXBUb18xLm1lcmdlTWFwVG87CiAgICB9IH0pOwogICAgdmFyIG1lcmdlU2Nhbl8xID0gcmVxdWlyZV9tZXJnZVNjYW4oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm1lcmdlU2NhbiIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG1lcmdlU2Nhbl8xLm1lcmdlU2NhbjsKICAgIH0gfSk7CiAgICB2YXIgbWVyZ2VXaXRoXzEgPSByZXF1aXJlX21lcmdlV2l0aCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAibWVyZ2VXaXRoIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbWVyZ2VXaXRoXzEubWVyZ2VXaXRoOwogICAgfSB9KTsKICAgIHZhciBtaW5fMSA9IHJlcXVpcmVfbWluKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJtaW4iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBtaW5fMS5taW47CiAgICB9IH0pOwogICAgdmFyIG11bHRpY2FzdF8xID0gcmVxdWlyZV9tdWx0aWNhc3QoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIm11bHRpY2FzdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG11bHRpY2FzdF8xLm11bHRpY2FzdDsKICAgIH0gfSk7CiAgICB2YXIgb2JzZXJ2ZU9uXzEgPSByZXF1aXJlX29ic2VydmVPbigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAib2JzZXJ2ZU9uIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gb2JzZXJ2ZU9uXzEub2JzZXJ2ZU9uOwogICAgfSB9KTsKICAgIHZhciBvbkVycm9yUmVzdW1lTmV4dFdpdGhfMSA9IHJlcXVpcmVfb25FcnJvclJlc3VtZU5leHRXaXRoKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJvbkVycm9yUmVzdW1lTmV4dFdpdGgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBvbkVycm9yUmVzdW1lTmV4dFdpdGhfMS5vbkVycm9yUmVzdW1lTmV4dFdpdGg7CiAgICB9IH0pOwogICAgdmFyIHBhaXJ3aXNlXzEgPSByZXF1aXJlX3BhaXJ3aXNlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJwYWlyd2lzZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHBhaXJ3aXNlXzEucGFpcndpc2U7CiAgICB9IH0pOwogICAgdmFyIHBsdWNrXzEgPSByZXF1aXJlX3BsdWNrKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJwbHVjayIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHBsdWNrXzEucGx1Y2s7CiAgICB9IH0pOwogICAgdmFyIHB1Ymxpc2hfMSA9IHJlcXVpcmVfcHVibGlzaCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicHVibGlzaCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHB1Ymxpc2hfMS5wdWJsaXNoOwogICAgfSB9KTsKICAgIHZhciBwdWJsaXNoQmVoYXZpb3JfMSA9IHJlcXVpcmVfcHVibGlzaEJlaGF2aW9yKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJwdWJsaXNoQmVoYXZpb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBwdWJsaXNoQmVoYXZpb3JfMS5wdWJsaXNoQmVoYXZpb3I7CiAgICB9IH0pOwogICAgdmFyIHB1Ymxpc2hMYXN0XzEgPSByZXF1aXJlX3B1Ymxpc2hMYXN0KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJwdWJsaXNoTGFzdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHB1Ymxpc2hMYXN0XzEucHVibGlzaExhc3Q7CiAgICB9IH0pOwogICAgdmFyIHB1Ymxpc2hSZXBsYXlfMSA9IHJlcXVpcmVfcHVibGlzaFJlcGxheSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicHVibGlzaFJlcGxheSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHB1Ymxpc2hSZXBsYXlfMS5wdWJsaXNoUmVwbGF5OwogICAgfSB9KTsKICAgIHZhciByYWNlV2l0aF8xID0gcmVxdWlyZV9yYWNlV2l0aCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicmFjZVdpdGgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByYWNlV2l0aF8xLnJhY2VXaXRoOwogICAgfSB9KTsKICAgIHZhciByZWR1Y2VfMSA9IHJlcXVpcmVfcmVkdWNlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJyZWR1Y2UiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZWR1Y2VfMS5yZWR1Y2U7CiAgICB9IH0pOwogICAgdmFyIHJlcGVhdF8xID0gcmVxdWlyZV9yZXBlYXQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlcGVhdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHJlcGVhdF8xLnJlcGVhdDsKICAgIH0gfSk7CiAgICB2YXIgcmVwZWF0V2hlbl8xID0gcmVxdWlyZV9yZXBlYXRXaGVuKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJyZXBlYXRXaGVuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVwZWF0V2hlbl8xLnJlcGVhdFdoZW47CiAgICB9IH0pOwogICAgdmFyIHJldHJ5XzEgPSByZXF1aXJlX3JldHJ5KCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJyZXRyeSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHJldHJ5XzEucmV0cnk7CiAgICB9IH0pOwogICAgdmFyIHJldHJ5V2hlbl8xID0gcmVxdWlyZV9yZXRyeVdoZW4oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJldHJ5V2hlbiIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHJldHJ5V2hlbl8xLnJldHJ5V2hlbjsKICAgIH0gfSk7CiAgICB2YXIgcmVmQ291bnRfMSA9IHJlcXVpcmVfcmVmQ291bnQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlZkNvdW50IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVmQ291bnRfMS5yZWZDb3VudDsKICAgIH0gfSk7CiAgICB2YXIgc2FtcGxlXzEgPSByZXF1aXJlX3NhbXBsZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2FtcGxlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc2FtcGxlXzEuc2FtcGxlOwogICAgfSB9KTsKICAgIHZhciBzYW1wbGVUaW1lXzEgPSByZXF1aXJlX3NhbXBsZVRpbWUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInNhbXBsZVRpbWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzYW1wbGVUaW1lXzEuc2FtcGxlVGltZTsKICAgIH0gfSk7CiAgICB2YXIgc2Nhbl8xID0gcmVxdWlyZV9zY2FuKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzY2FuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc2Nhbl8xLnNjYW47CiAgICB9IH0pOwogICAgdmFyIHNlcXVlbmNlRXF1YWxfMSA9IHJlcXVpcmVfc2VxdWVuY2VFcXVhbCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2VxdWVuY2VFcXVhbCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNlcXVlbmNlRXF1YWxfMS5zZXF1ZW5jZUVxdWFsOwogICAgfSB9KTsKICAgIHZhciBzaGFyZV8xID0gcmVxdWlyZV9zaGFyZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2hhcmUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzaGFyZV8xLnNoYXJlOwogICAgfSB9KTsKICAgIHZhciBzaGFyZVJlcGxheV8xID0gcmVxdWlyZV9zaGFyZVJlcGxheSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2hhcmVSZXBsYXkiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzaGFyZVJlcGxheV8xLnNoYXJlUmVwbGF5OwogICAgfSB9KTsKICAgIHZhciBzaW5nbGVfMSA9IHJlcXVpcmVfc2luZ2xlKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzaW5nbGUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzaW5nbGVfMS5zaW5nbGU7CiAgICB9IH0pOwogICAgdmFyIHNraXBfMSA9IHJlcXVpcmVfc2tpcCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2tpcCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNraXBfMS5za2lwOwogICAgfSB9KTsKICAgIHZhciBza2lwTGFzdF8xID0gcmVxdWlyZV9za2lwTGFzdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic2tpcExhc3QiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBza2lwTGFzdF8xLnNraXBMYXN0OwogICAgfSB9KTsKICAgIHZhciBza2lwVW50aWxfMSA9IHJlcXVpcmVfc2tpcFVudGlsKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJza2lwVW50aWwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBza2lwVW50aWxfMS5za2lwVW50aWw7CiAgICB9IH0pOwogICAgdmFyIHNraXBXaGlsZV8xID0gcmVxdWlyZV9za2lwV2hpbGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInNraXBXaGlsZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNraXBXaGlsZV8xLnNraXBXaGlsZTsKICAgIH0gfSk7CiAgICB2YXIgc3RhcnRXaXRoXzEgPSByZXF1aXJlX3N0YXJ0V2l0aCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic3RhcnRXaXRoIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3RhcnRXaXRoXzEuc3RhcnRXaXRoOwogICAgfSB9KTsKICAgIHZhciBzdWJzY3JpYmVPbl8xID0gcmVxdWlyZV9zdWJzY3JpYmVPbigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAic3Vic2NyaWJlT24iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVPbl8xLnN1YnNjcmliZU9uOwogICAgfSB9KTsKICAgIHZhciBzd2l0Y2hBbGxfMSA9IHJlcXVpcmVfc3dpdGNoQWxsKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzd2l0Y2hBbGwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzd2l0Y2hBbGxfMS5zd2l0Y2hBbGw7CiAgICB9IH0pOwogICAgdmFyIHN3aXRjaE1hcF8xID0gcmVxdWlyZV9zd2l0Y2hNYXAoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInN3aXRjaE1hcCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHN3aXRjaE1hcF8xLnN3aXRjaE1hcDsKICAgIH0gfSk7CiAgICB2YXIgc3dpdGNoTWFwVG9fMSA9IHJlcXVpcmVfc3dpdGNoTWFwVG8oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInN3aXRjaE1hcFRvIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3dpdGNoTWFwVG9fMS5zd2l0Y2hNYXBUbzsKICAgIH0gfSk7CiAgICB2YXIgc3dpdGNoU2Nhbl8xID0gcmVxdWlyZV9zd2l0Y2hTY2FuKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzd2l0Y2hTY2FuIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3dpdGNoU2Nhbl8xLnN3aXRjaFNjYW47CiAgICB9IH0pOwogICAgdmFyIHRha2VfMSA9IHJlcXVpcmVfdGFrZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGFrZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRha2VfMS50YWtlOwogICAgfSB9KTsKICAgIHZhciB0YWtlTGFzdF8xID0gcmVxdWlyZV90YWtlTGFzdCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGFrZUxhc3QiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0YWtlTGFzdF8xLnRha2VMYXN0OwogICAgfSB9KTsKICAgIHZhciB0YWtlVW50aWxfMSA9IHJlcXVpcmVfdGFrZVVudGlsKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ0YWtlVW50aWwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0YWtlVW50aWxfMS50YWtlVW50aWw7CiAgICB9IH0pOwogICAgdmFyIHRha2VXaGlsZV8xID0gcmVxdWlyZV90YWtlV2hpbGUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInRha2VXaGlsZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRha2VXaGlsZV8xLnRha2VXaGlsZTsKICAgIH0gfSk7CiAgICB2YXIgdGFwXzEgPSByZXF1aXJlX3RhcCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGFwIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGFwXzEudGFwOwogICAgfSB9KTsKICAgIHZhciB0aHJvdHRsZV8xID0gcmVxdWlyZV90aHJvdHRsZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGhyb3R0bGUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aHJvdHRsZV8xLnRocm90dGxlOwogICAgfSB9KTsKICAgIHZhciB0aHJvdHRsZVRpbWVfMSA9IHJlcXVpcmVfdGhyb3R0bGVUaW1lKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ0aHJvdHRsZVRpbWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aHJvdHRsZVRpbWVfMS50aHJvdHRsZVRpbWU7CiAgICB9IH0pOwogICAgdmFyIHRocm93SWZFbXB0eV8xID0gcmVxdWlyZV90aHJvd0lmRW1wdHkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInRocm93SWZFbXB0eSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRocm93SWZFbXB0eV8xLnRocm93SWZFbXB0eTsKICAgIH0gfSk7CiAgICB2YXIgdGltZUludGVydmFsXzEgPSByZXF1aXJlX3RpbWVJbnRlcnZhbCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGltZUludGVydmFsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGltZUludGVydmFsXzEudGltZUludGVydmFsOwogICAgfSB9KTsKICAgIHZhciB0aW1lb3V0XzIgPSByZXF1aXJlX3RpbWVvdXQoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInRpbWVvdXQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aW1lb3V0XzIudGltZW91dDsKICAgIH0gfSk7CiAgICB2YXIgdGltZW91dFdpdGhfMSA9IHJlcXVpcmVfdGltZW91dFdpdGgoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInRpbWVvdXRXaXRoIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGltZW91dFdpdGhfMS50aW1lb3V0V2l0aDsKICAgIH0gfSk7CiAgICB2YXIgdGltZXN0YW1wXzEgPSByZXF1aXJlX3RpbWVzdGFtcCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAidGltZXN0YW1wIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGltZXN0YW1wXzEudGltZXN0YW1wOwogICAgfSB9KTsKICAgIHZhciB0b0FycmF5XzEgPSByZXF1aXJlX3RvQXJyYXkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInRvQXJyYXkiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0b0FycmF5XzEudG9BcnJheTsKICAgIH0gfSk7CiAgICB2YXIgd2luZG93XzEgPSByZXF1aXJlX3dpbmRvdygpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAid2luZG93IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gd2luZG93XzEud2luZG93OwogICAgfSB9KTsKICAgIHZhciB3aW5kb3dDb3VudF8xID0gcmVxdWlyZV93aW5kb3dDb3VudCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAid2luZG93Q291bnQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3aW5kb3dDb3VudF8xLndpbmRvd0NvdW50OwogICAgfSB9KTsKICAgIHZhciB3aW5kb3dUaW1lXzEgPSByZXF1aXJlX3dpbmRvd1RpbWUoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIndpbmRvd1RpbWUiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3aW5kb3dUaW1lXzEud2luZG93VGltZTsKICAgIH0gfSk7CiAgICB2YXIgd2luZG93VG9nZ2xlXzEgPSByZXF1aXJlX3dpbmRvd1RvZ2dsZSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAid2luZG93VG9nZ2xlIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gd2luZG93VG9nZ2xlXzEud2luZG93VG9nZ2xlOwogICAgfSB9KTsKICAgIHZhciB3aW5kb3dXaGVuXzEgPSByZXF1aXJlX3dpbmRvd1doZW4oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIndpbmRvd1doZW4iLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3aW5kb3dXaGVuXzEud2luZG93V2hlbjsKICAgIH0gfSk7CiAgICB2YXIgd2l0aExhdGVzdEZyb21fMSA9IHJlcXVpcmVfd2l0aExhdGVzdEZyb20oKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIndpdGhMYXRlc3RGcm9tIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gd2l0aExhdGVzdEZyb21fMS53aXRoTGF0ZXN0RnJvbTsKICAgIH0gfSk7CiAgICB2YXIgemlwQWxsXzEgPSByZXF1aXJlX3ppcEFsbCgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiemlwQWxsIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gemlwQWxsXzEuemlwQWxsOwogICAgfSB9KTsKICAgIHZhciB6aXBXaXRoXzEgPSByZXF1aXJlX3ppcFdpdGgoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInppcFdpdGgiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB6aXBXaXRoXzEuemlwV2l0aDsKICAgIH0gfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2V4Y2VwdGlvbi5qcwp2YXIgcmVxdWlyZV9leGNlcHRpb24gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvZXhjZXB0aW9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5QYXRoSXNGaWxlRXhjZXB0aW9uID0gZXhwb3J0czIuUGF0aElzRGlyZWN0b3J5RXhjZXB0aW9uID0gZXhwb3J0czIuRmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbiA9IGV4cG9ydHMyLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24gPSBleHBvcnRzMi5Vbmtub3duRXhjZXB0aW9uID0gZXhwb3J0czIuQmFzZUV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIHZhciBCYXNlRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAiIikgewogICAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuQmFzZUV4Y2VwdGlvbiA9IEJhc2VFeGNlcHRpb247CiAgICB2YXIgVW5rbm93bkV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHsKICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlVua25vd25FeGNlcHRpb24gPSBVbmtub3duRXhjZXB0aW9uOwogICAgdmFyIEZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihwYXRoKSB7CiAgICAgICAgc3VwZXIoYFBhdGggIiR7cGF0aH0iIGRvZXMgbm90IGV4aXN0LmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbiA9IEZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb247CiAgICB2YXIgRmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKHBhdGgpIHsKICAgICAgICBzdXBlcihgUGF0aCAiJHtwYXRofSIgYWxyZWFkeSBleGlzdC5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb24gPSBGaWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uOwogICAgdmFyIFBhdGhJc0RpcmVjdG9yeUV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKHBhdGgpIHsKICAgICAgICBzdXBlcihgUGF0aCAiJHtwYXRofSIgaXMgYSBkaXJlY3RvcnkuYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5QYXRoSXNEaXJlY3RvcnlFeGNlcHRpb24gPSBQYXRoSXNEaXJlY3RvcnlFeGNlcHRpb247CiAgICB2YXIgUGF0aElzRmlsZUV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKHBhdGgpIHsKICAgICAgICBzdXBlcihgUGF0aCAiJHtwYXRofSIgaXMgYSBmaWxlLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuUGF0aElzRmlsZUV4Y2VwdGlvbiA9IFBhdGhJc0ZpbGVFeGNlcHRpb247CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2xpdGVyYWxzLmpzCnZhciByZXF1aXJlX2xpdGVyYWxzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2xpdGVyYWxzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5vbmVMaW5lID0gb25lTGluZTsKICAgIGV4cG9ydHMyLmluZGVudEJ5ID0gaW5kZW50Qnk7CiAgICBleHBvcnRzMi5zdHJpcEluZGVudCA9IHN0cmlwSW5kZW50OwogICAgZXhwb3J0czIuc3RyaXBJbmRlbnRzID0gc3RyaXBJbmRlbnRzOwogICAgZXhwb3J0czIudHJpbU5ld2xpbmVzID0gdHJpbU5ld2xpbmVzOwogICAgZnVuY3Rpb24gb25lTGluZShzdHJpbmdzMywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IGVuZFJlc3VsdCA9IFN0cmluZy5yYXcoc3RyaW5nczMsIC4uLnZhbHVlcyk7CiAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZSgvKD86XHI/XG4oPzpccyopKSsvZ20sICIgIikudHJpbSgpOwogICAgfQogICAgZnVuY3Rpb24gaW5kZW50QnkoaW5kZW50YXRpb25zKSB7CiAgICAgIGxldCBpID0gIiI7CiAgICAgIHdoaWxlIChpbmRlbnRhdGlvbnMtLSkgewogICAgICAgIGkgKz0gIiAiOwogICAgICB9CiAgICAgIHJldHVybiAoc3RyaW5nczMsIC4uLnZhbHVlcykgPT4gewogICAgICAgIHJldHVybiBpICsgc3RyaXBJbmRlbnQoc3RyaW5nczMsIC4uLnZhbHVlcykucmVwbGFjZSgvXG4vZywgIlxuIiArIGkpOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RyaXBJbmRlbnQoc3RyaW5nczMsIC4uLnZhbHVlcykgewogICAgICBjb25zdCBlbmRSZXN1bHQgPSBTdHJpbmcucmF3KHN0cmluZ3MzLCAuLi52YWx1ZXMpOwogICAgICBjb25zdCBtYXRjaCA9IGVuZFJlc3VsdC5tYXRjaCgvXlsgXHRdKig/PVxTKS9nbSk7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbmRSZXN1bHQ7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5taW4oLi4ubWF0Y2gubWFwKChlbCkgPT4gZWwubGVuZ3RoKSk7CiAgICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoIl5bIFxcdF17IiArIGluZGVudCArICJ9IiwgImdtIik7CiAgICAgIHJldHVybiAoaW5kZW50ID4gMCA/IGVuZFJlc3VsdC5yZXBsYWNlKHJlZ2V4cCwgIiIpIDogZW5kUmVzdWx0KS50cmltKCk7CiAgICB9CiAgICBmdW5jdGlvbiBzdHJpcEluZGVudHMoc3RyaW5nczMsIC4uLnZhbHVlcykgewogICAgICByZXR1cm4gU3RyaW5nLnJhdyhzdHJpbmdzMywgLi4udmFsdWVzKS5zcGxpdCgiXG4iKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKCJcbiIpLnRyaW0oKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRyaW1OZXdsaW5lcyhzdHJpbmdzMywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IGVuZFJlc3VsdCA9IFN0cmluZy5yYXcoc3RyaW5nczMsIC4uLnZhbHVlcyk7CiAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZSgvXig/OlxyP1xuKSsvLCAiIikucmVwbGFjZSgvKD86XHI/XG4oPzpccyopKSQvLCAiIik7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL3N0cmluZ3MuanMKdmFyIHJlcXVpcmVfc3RyaW5ncyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy91dGlscy9zdHJpbmdzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5kZWNhbWVsaXplID0gZGVjYW1lbGl6ZTsKICAgIGV4cG9ydHMyLmRhc2hlcml6ZSA9IGRhc2hlcml6ZTsKICAgIGV4cG9ydHMyLmNhbWVsaXplID0gY2FtZWxpemU7CiAgICBleHBvcnRzMi5jbGFzc2lmeSA9IGNsYXNzaWZ5OwogICAgZXhwb3J0czIudW5kZXJzY29yZSA9IHVuZGVyc2NvcmU7CiAgICBleHBvcnRzMi5jYXBpdGFsaXplID0gY2FwaXRhbGl6ZTsKICAgIGV4cG9ydHMyLmxldmVuc2h0ZWluID0gbGV2ZW5zaHRlaW47CiAgICB2YXIgU1RSSU5HX0RBU0hFUklaRV9SRUdFWFAgPSAvWyBfXS9nOwogICAgdmFyIFNUUklOR19ERUNBTUVMSVpFX1JFR0VYUCA9IC8oW2EtelxkXSkoW0EtWl0pL2c7CiAgICB2YXIgU1RSSU5HX0NBTUVMSVpFX1JFR0VYUCA9IC8oLXxffFwufFxzKSsoLik/L2c7CiAgICB2YXIgU1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzEgPSAvKFthLXpcZF0pKFtBLVpdKykvZzsKICAgIHZhciBTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMiA9IC8tfFxzKy9nOwogICAgZnVuY3Rpb24gZGVjYW1lbGl6ZShzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19ERUNBTUVMSVpFX1JFR0VYUCwgIiQxXyQyIikudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRhc2hlcml6ZShzdHIpIHsKICAgICAgcmV0dXJuIGRlY2FtZWxpemUoc3RyKS5yZXBsYWNlKFNUUklOR19EQVNIRVJJWkVfUkVHRVhQLCAiLSIpOwogICAgfQogICAgZnVuY3Rpb24gY2FtZWxpemUoc3RyKSB7CiAgICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfQ0FNRUxJWkVfUkVHRVhQLCAoX21hdGNoLCBfc2VwYXJhdG9yLCBjaHIpID0+IHsKICAgICAgICByZXR1cm4gY2hyID8gY2hyLnRvVXBwZXJDYXNlKCkgOiAiIjsKICAgICAgfSkucmVwbGFjZSgvXihbQS1aXSkvLCAobWF0Y2gpID0+IG1hdGNoLnRvTG93ZXJDYXNlKCkpOwogICAgfQogICAgZnVuY3Rpb24gY2xhc3NpZnkoc3RyKSB7CiAgICAgIHJldHVybiBzdHIuc3BsaXQoIi4iKS5tYXAoKHBhcnQpID0+IGNhcGl0YWxpemUoY2FtZWxpemUocGFydCkpKS5qb2luKCIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHVuZGVyc2NvcmUoc3RyKSB7CiAgICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMSwgIiQxXyQyIikucmVwbGFjZShTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMiwgIl8iKS50b0xvd2VyQ2FzZSgpOwogICAgfQogICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTsKICAgIH0KICAgIGZ1bmN0aW9uIGxldmVuc2h0ZWluKGEsIGIpIHsKICAgICAgaWYgKGEubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gYi5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKGIubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gYS5sZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgbWF0cml4ID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXRyaXhbaV0gPSBbaV07CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gYS5sZW5ndGg7IGorKykgewogICAgICAgIG1hdHJpeFswXVtqXSA9IGo7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYi5sZW5ndGg7IGkrKykgewogICAgICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChiLmNoYXJBdChpIC0gMSkgPT0gYS5jaGFyQXQoaiAtIDEpKSB7CiAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMV1baiAtIDFdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gTWF0aC5taW4oCiAgICAgICAgICAgICAgbWF0cml4W2kgLSAxXVtqIC0gMV0gKyAxLAogICAgICAgICAgICAgIC8vIHN1YnN0aXR1dGlvbgogICAgICAgICAgICAgIG1hdHJpeFtpXVtqIC0gMV0gKyAxLAogICAgICAgICAgICAgIC8vIGluc2VydGlvbgogICAgICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXRyaXhbYi5sZW5ndGhdW2EubGVuZ3RoXTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvb2JqZWN0LmpzCnZhciByZXF1aXJlX29iamVjdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy91dGlscy9vYmplY3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRlZXBDb3B5ID0gZGVlcENvcHk7CiAgICB2YXIgY29weVN5bWJvbCA9IFN5bWJvbCgpOwogICAgZnVuY3Rpb24gZGVlcENvcHkodmFsdWUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgobykgPT4gZGVlcENvcHkobykpOwogICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICBjb25zdCB2YWx1ZUNhc3RlZCA9IHZhbHVlOwogICAgICAgIGlmICh2YWx1ZUNhc3RlZFtjb3B5U3ltYm9sXSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlQ2FzdGVkW2NvcHlTeW1ib2xdOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWVDYXN0ZWRbInRvSlNPTiJdKSB7CiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZUNhc3RlZFsidG9KU09OIl0oKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZUNhc3RlZCkpOwogICAgICAgIHZhbHVlQ2FzdGVkW2NvcHlTeW1ib2xdID0gY29weTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZUNhc3RlZCkpIHsKICAgICAgICAgIGNvcHlba2V5XSA9IGRlZXBDb3B5KHZhbHVlQ2FzdGVkW2tleV0pOwogICAgICAgIH0KICAgICAgICBkZWxldGUgdmFsdWVDYXN0ZWRbY29weVN5bWJvbF07CiAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcwp2YXIgcmVxdWlyZV9iYXNlNjQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LmpzIihleHBvcnRzMikgewogICAgdmFyIGludFRvQ2hhck1hcCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIi5zcGxpdCgiIik7CiAgICBleHBvcnRzMi5lbmNvZGUgPSBmdW5jdGlvbihudW1iZXIpIHsKICAgICAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiAiICsgbnVtYmVyKTsKICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMKdmFyIHJlcXVpcmVfYmFzZTY0X3ZscSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iYXNlNjQtdmxxLmpzIihleHBvcnRzMikgewogICAgdmFyIGJhc2U2NCA9IHJlcXVpcmVfYmFzZTY0KCk7CiAgICB2YXIgVkxRX0JBU0VfU0hJRlQgPSA1OwogICAgdmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDsKICAgIHZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxOwogICAgdmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7CiAgICBmdW5jdGlvbiB0b1ZMUVNpZ25lZChhVmFsdWUpIHsKICAgICAgcmV0dXJuIGFWYWx1ZSA8IDAgPyAoLWFWYWx1ZSA8PCAxKSArIDEgOiAoYVZhbHVlIDw8IDEpICsgMDsKICAgIH0KICAgIGV4cG9ydHMyLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7CiAgICAgIGxldCBlbmNvZGVkID0gIiI7CiAgICAgIGxldCBkaWdpdDsKICAgICAgbGV0IHZscSA9IHRvVkxRU2lnbmVkKGFWYWx1ZSk7CiAgICAgIGRvIHsKICAgICAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7CiAgICAgICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7CiAgICAgICAgaWYgKHZscSA+IDApIHsKICAgICAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUOwogICAgICAgIH0KICAgICAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpOwogICAgICB9IHdoaWxlICh2bHEgPiAwKTsKICAgICAgcmV0dXJuIGVuY29kZWQ7CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi91dGlsLmpzCnZhciByZXF1aXJlX3V0aWwyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3V0aWwuanMiKGV4cG9ydHMyKSB7CiAgICBmdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7CiAgICAgIGlmIChhTmFtZSBpbiBhQXJncykgewogICAgICAgIHJldHVybiBhQXJnc1thTmFtZV07CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgewogICAgICAgIHJldHVybiBhRGVmYXVsdFZhbHVlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcignIicgKyBhTmFtZSArICciIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7CiAgICB9CiAgICBleHBvcnRzMi5nZXRBcmcgPSBnZXRBcmc7CiAgICB2YXIgdXJsUmVnZXhwID0gL14oPzooW1x3K1wtLl0rKTopP1wvXC8oPzooXHcrOlx3KylAKT8oW1x3Li1dKikoPzo6KFxkKykpPyguKikkLzsKICAgIHZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXCwuKyQvOwogICAgZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkgewogICAgICBjb25zdCBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTsKICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgc2NoZW1lOiBtYXRjaFsxXSwKICAgICAgICBhdXRoOiBtYXRjaFsyXSwKICAgICAgICBob3N0OiBtYXRjaFszXSwKICAgICAgICBwb3J0OiBtYXRjaFs0XSwKICAgICAgICBwYXRoOiBtYXRjaFs1XQogICAgICB9OwogICAgfQogICAgZXhwb3J0czIudXJsUGFyc2UgPSB1cmxQYXJzZTsKICAgIGZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHsKICAgICAgbGV0IHVybDMgPSAiIjsKICAgICAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7CiAgICAgICAgdXJsMyArPSBhUGFyc2VkVXJsLnNjaGVtZSArICI6IjsKICAgICAgfQogICAgICB1cmwzICs9ICIvLyI7CiAgICAgIGlmIChhUGFyc2VkVXJsLmF1dGgpIHsKICAgICAgICB1cmwzICs9IGFQYXJzZWRVcmwuYXV0aCArICJAIjsKICAgICAgfQogICAgICBpZiAoYVBhcnNlZFVybC5ob3N0KSB7CiAgICAgICAgdXJsMyArPSBhUGFyc2VkVXJsLmhvc3Q7CiAgICAgIH0KICAgICAgaWYgKGFQYXJzZWRVcmwucG9ydCkgewogICAgICAgIHVybDMgKz0gIjoiICsgYVBhcnNlZFVybC5wb3J0OwogICAgICB9CiAgICAgIGlmIChhUGFyc2VkVXJsLnBhdGgpIHsKICAgICAgICB1cmwzICs9IGFQYXJzZWRVcmwucGF0aDsKICAgICAgfQogICAgICByZXR1cm4gdXJsMzsKICAgIH0KICAgIGV4cG9ydHMyLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7CiAgICB2YXIgTUFYX0NBQ0hFRF9JTlBVVFMgPSAzMjsKICAgIGZ1bmN0aW9uIGxydU1lbW9pemUoZikgewogICAgICBjb25zdCBjYWNoZSA9IFtdOwogICAgICByZXR1cm4gZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoY2FjaGVbaV0uaW5wdXQgPT09IGlucHV0KSB7CiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBjYWNoZVswXTsKICAgICAgICAgICAgY2FjaGVbMF0gPSBjYWNoZVtpXTsKICAgICAgICAgICAgY2FjaGVbaV0gPSB0ZW1wOwogICAgICAgICAgICByZXR1cm4gY2FjaGVbMF0ucmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHQgPSBmKGlucHV0KTsKICAgICAgICBjYWNoZS51bnNoaWZ0KHsKICAgICAgICAgIGlucHV0LAogICAgICAgICAgcmVzdWx0CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGNhY2hlLmxlbmd0aCA+IE1BWF9DQUNIRURfSU5QVVRTKSB7CiAgICAgICAgICBjYWNoZS5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KICAgIHZhciBub3JtYWxpemUgPSBscnVNZW1vaXplKGZ1bmN0aW9uIG5vcm1hbGl6ZTIoYVBhdGgpIHsKICAgICAgbGV0IHBhdGggPSBhUGF0aDsKICAgICAgY29uc3QgdXJsMyA9IHVybFBhcnNlKGFQYXRoKTsKICAgICAgaWYgKHVybDMpIHsKICAgICAgICBpZiAoIXVybDMucGF0aCkgewogICAgICAgICAgcmV0dXJuIGFQYXRoOwogICAgICAgIH0KICAgICAgICBwYXRoID0gdXJsMy5wYXRoOwogICAgICB9CiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSBleHBvcnRzMi5pc0Fic29sdXRlKHBhdGgpOwogICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICBsZXQgc3RhcnQgPSAwOwogICAgICBsZXQgaSA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgc3RhcnQgPSBpOwogICAgICAgIGkgPSBwYXRoLmluZGV4T2YoIi8iLCBzdGFydCk7CiAgICAgICAgaWYgKGkgPT09IC0xKSB7CiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguc2xpY2Uoc3RhcnQpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJ0cy5wdXNoKHBhdGguc2xpY2Uoc3RhcnQsIGkpKTsKICAgICAgICAgIHdoaWxlIChpIDwgcGF0aC5sZW5ndGggJiYgcGF0aFtpXSA9PT0gIi8iKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IHVwID0gMDsKICAgICAgZm9yIChpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgaWYgKHBhcnQgPT09ICIuIikgewogICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpOwogICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gIi4uIikgewogICAgICAgICAgdXArKzsKICAgICAgICB9IGVsc2UgaWYgKHVwID4gMCkgewogICAgICAgICAgaWYgKHBhcnQgPT09ICIiKSB7CiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApOwogICAgICAgICAgICB1cCA9IDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7CiAgICAgICAgICAgIHVwLS07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHBhdGggPSBwYXJ0cy5qb2luKCIvIik7CiAgICAgIGlmIChwYXRoID09PSAiIikgewogICAgICAgIHBhdGggPSBpc0Fic29sdXRlID8gIi8iIDogIi4iOwogICAgICB9CiAgICAgIGlmICh1cmwzKSB7CiAgICAgICAgdXJsMy5wYXRoID0gcGF0aDsKICAgICAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsMyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhdGg7CiAgICB9KTsKICAgIGV4cG9ydHMyLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTsKICAgIGZ1bmN0aW9uIGpvaW4yKGFSb290LCBhUGF0aCkgewogICAgICBpZiAoYVJvb3QgPT09ICIiKSB7CiAgICAgICAgYVJvb3QgPSAiLiI7CiAgICAgIH0KICAgICAgaWYgKGFQYXRoID09PSAiIikgewogICAgICAgIGFQYXRoID0gIi4iOwogICAgICB9CiAgICAgIGNvbnN0IGFQYXRoVXJsID0gdXJsUGFyc2UoYVBhdGgpOwogICAgICBjb25zdCBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTsKICAgICAgaWYgKGFSb290VXJsKSB7CiAgICAgICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICIvIjsKICAgICAgfQogICAgICBpZiAoYVBhdGhVcmwgJiYgIWFQYXRoVXJsLnNjaGVtZSkgewogICAgICAgIGlmIChhUm9vdFVybCkgewogICAgICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVBhdGhVcmwpOwogICAgICB9CiAgICAgIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkgewogICAgICAgIHJldHVybiBhUGF0aDsKICAgICAgfQogICAgICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHsKICAgICAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7CiAgICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTsKICAgICAgfQogICAgICBjb25zdCBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICIvIiA/IGFQYXRoIDogbm9ybWFsaXplKGFSb290LnJlcGxhY2UoL1wvKyQvLCAiIikgKyAiLyIgKyBhUGF0aCk7CiAgICAgIGlmIChhUm9vdFVybCkgewogICAgICAgIGFSb290VXJsLnBhdGggPSBqb2luZWQ7CiAgICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTsKICAgICAgfQogICAgICByZXR1cm4gam9pbmVkOwogICAgfQogICAgZXhwb3J0czIuam9pbiA9IGpvaW4yOwogICAgZXhwb3J0czIuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKGFQYXRoKSB7CiAgICAgIHJldHVybiBhUGF0aC5jaGFyQXQoMCkgPT09ICIvIiB8fCB1cmxSZWdleHAudGVzdChhUGF0aCk7CiAgICB9OwogICAgZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7CiAgICAgIGlmIChhUm9vdCA9PT0gIiIpIHsKICAgICAgICBhUm9vdCA9ICIuIjsKICAgICAgfQogICAgICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1wvJC8sICIiKTsKICAgICAgbGV0IGxldmVsID0gMDsKICAgICAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAiLyIpICE9PSAwKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBhUm9vdC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgIHJldHVybiBhUGF0aDsKICAgICAgICB9CiAgICAgICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7CiAgICAgICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXC9dKzpcLyk/XC8qJC8pKSB7CiAgICAgICAgICByZXR1cm4gYVBhdGg7CiAgICAgICAgfQogICAgICAgICsrbGV2ZWw7CiAgICAgIH0KICAgICAgcmV0dXJuIEFycmF5KGxldmVsICsgMSkuam9pbigiLi4vIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7CiAgICB9CiAgICBleHBvcnRzMi5yZWxhdGl2ZSA9IHJlbGF0aXZlOwogICAgdmFyIHN1cHBvcnRzTnVsbFByb3RvID0gZnVuY3Rpb24oKSB7CiAgICAgIGNvbnN0IG9iaiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gISgiX19wcm90b19fIiBpbiBvYmopOwogICAgfSgpOwogICAgZnVuY3Rpb24gaWRlbnRpdHkocykgewogICAgICByZXR1cm4gczsKICAgIH0KICAgIGZ1bmN0aW9uIHRvU2V0U3RyaW5nKGFTdHIpIHsKICAgICAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHsKICAgICAgICByZXR1cm4gIiQiICsgYVN0cjsKICAgICAgfQogICAgICByZXR1cm4gYVN0cjsKICAgIH0KICAgIGV4cG9ydHMyLnRvU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IHRvU2V0U3RyaW5nOwogICAgZnVuY3Rpb24gZnJvbVNldFN0cmluZyhhU3RyKSB7CiAgICAgIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7CiAgICAgICAgcmV0dXJuIGFTdHIuc2xpY2UoMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFTdHI7CiAgICB9CiAgICBleHBvcnRzMi5mcm9tU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IGZyb21TZXRTdHJpbmc7CiAgICBmdW5jdGlvbiBpc1Byb3RvU3RyaW5nKHMpIHsKICAgICAgaWYgKCFzKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGxlbmd0aCA9IHMubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoIDwgOSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAocy5jaGFyQ29kZUF0KGxlbmd0aCAtIDEpICE9PSA5NSB8fCBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMikgIT09IDk1IHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSAzKSAhPT0gMTExIHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSA0KSAhPT0gMTE2IHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSA2KSAhPT0gMTE0IHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSA3KSAhPT0gMTEyIHx8IHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgfHwgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMTA7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKHMuY2hhckNvZGVBdChpKSAhPT0gMzYpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlT3JpZ2luYWwpIHsKICAgICAgbGV0IGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7CiAgICAgIGlmIChjbXAgIT09IDApIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTsKICAgICAgaWYgKGNtcCAhPT0gMCkgewogICAgICAgIHJldHVybiBjbXA7CiAgICAgIH0KICAgICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjsKICAgICAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7CiAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgfQogICAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47CiAgICAgIGlmIChjbXAgIT09IDApIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lOwogICAgICBpZiAoY21wICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgfQogICAgICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpOwogICAgfQogICAgZXhwb3J0czIuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9uczsKICAgIGZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHsKICAgICAgbGV0IGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lOwogICAgICBpZiAoY21wICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgfQogICAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47CiAgICAgIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7CiAgICAgIGlmIChjbXAgIT09IDApIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTsKICAgICAgaWYgKGNtcCAhPT0gMCkgewogICAgICAgIHJldHVybiBjbXA7CiAgICAgIH0KICAgICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjsKICAgICAgaWYgKGNtcCAhPT0gMCkgewogICAgICAgIHJldHVybiBjbXA7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7CiAgICBmdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7CiAgICAgIGlmIChhU3RyMSA9PT0gYVN0cjIpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAoYVN0cjEgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gMTsKICAgICAgfQogICAgICBpZiAoYVN0cjIgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgaWYgKGFTdHIxID4gYVN0cjIpIHsKICAgICAgICByZXR1cm4gMTsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIHsKICAgICAgbGV0IGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lOwogICAgICBpZiAoY21wICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgfQogICAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47CiAgICAgIGlmIChjbXAgIT09IDApIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7CiAgICAgIGlmIChjbXAgIT09IDApIHsKICAgICAgICByZXR1cm4gY21wOwogICAgICB9CiAgICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTsKICAgICAgaWYgKGNtcCAhPT0gMCkgewogICAgICAgIHJldHVybiBjbXA7CiAgICAgIH0KICAgICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjsKICAgICAgaWYgKGNtcCAhPT0gMCkgewogICAgICAgIHJldHVybiBjbXA7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTsKICAgIH0KICAgIGV4cG9ydHMyLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQ7CiAgICBmdW5jdGlvbiBwYXJzZVNvdXJjZU1hcElucHV0KHN0cikgewogICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIucmVwbGFjZSgvXlwpXX0nW15cbl0qXG4vLCAiIikpOwogICAgfQogICAgZXhwb3J0czIucGFyc2VTb3VyY2VNYXBJbnB1dCA9IHBhcnNlU291cmNlTWFwSW5wdXQ7CiAgICBmdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7CiAgICAgIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAiIjsKICAgICAgaWYgKHNvdXJjZVJvb3QpIHsKICAgICAgICBpZiAoc291cmNlUm9vdFtzb3VyY2VSb290Lmxlbmd0aCAtIDFdICE9PSAiLyIgJiYgc291cmNlVVJMWzBdICE9PSAiLyIpIHsKICAgICAgICAgIHNvdXJjZVJvb3QgKz0gIi8iOwogICAgICAgIH0KICAgICAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMOwogICAgICB9CiAgICAgIGlmIChzb3VyY2VNYXBVUkwpIHsKICAgICAgICBjb25zdCBwYXJzZWQgPSB1cmxQYXJzZShzb3VyY2VNYXBVUkwpOwogICAgICAgIGlmICghcGFyc2VkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkIik7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJzZWQucGF0aCkgewogICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc291cmNlVVJMID0gam9pbjIodXJsR2VuZXJhdGUocGFyc2VkKSwgc291cmNlVVJMKTsKICAgICAgfQogICAgICByZXR1cm4gbm9ybWFsaXplKHNvdXJjZVVSTCk7CiAgICB9CiAgICBleHBvcnRzMi5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzCnZhciByZXF1aXJlX2FycmF5X3NldCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9hcnJheS1zZXQuanMiKGV4cG9ydHMyKSB7CiAgICB2YXIgQXJyYXlTZXQgPSBjbGFzcyBfQXJyYXlTZXQgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9hcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3NldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFN0YXRpYyBtZXRob2QgZm9yIGNyZWF0aW5nIEFycmF5U2V0IGluc3RhbmNlcyBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LgogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHsKICAgICAgICBjb25zdCBzZXQgPSBuZXcgX0FycmF5U2V0KCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gaG93IG1hbnkgdW5pcXVlIGl0ZW1zIGFyZSBpbiB0aGlzIEFycmF5U2V0LiBJZiBkdXBsaWNhdGVzIGhhdmUgYmVlbgogICAgICAgKiBhZGRlZCwgdGhhbiB0aG9zZSBkbyBub3QgY291bnQgdG93YXJkcyB0aGUgc2l6ZS4KICAgICAgICoKICAgICAgICogQHJldHVybnMgTnVtYmVyCiAgICAgICAqLwogICAgICBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zZXQuc2l6ZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBTdHJpbmcgYVN0cgogICAgICAgKi8KICAgICAgYWRkKGFTdHIsIGFBbGxvd0R1cGxpY2F0ZXMpIHsKICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHRoaXMuaGFzKGFTdHIpOwogICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDsKICAgICAgICBpZiAoIWlzRHVwbGljYXRlIHx8IGFBbGxvd0R1cGxpY2F0ZXMpIHsKICAgICAgICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7CiAgICAgICAgfQogICAgICAgIGlmICghaXNEdXBsaWNhdGUpIHsKICAgICAgICAgIHRoaXMuX3NldC5zZXQoYVN0ciwgaWR4KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBTdHJpbmcgYVN0cgogICAgICAgKi8KICAgICAgaGFzKGFTdHIpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2V0LmhhcyhhU3RyKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHN0cmluZyBpbiB0aGUgYXJyYXk/CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBTdHJpbmcgYVN0cgogICAgICAgKi8KICAgICAgaW5kZXhPZihhU3RyKSB7CiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5fc2V0LmdldChhU3RyKTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIHJldHVybiBpZHg7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcignIicgKyBhU3RyICsgJyIgaXMgbm90IGluIHRoZSBzZXQuJyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4PwogICAgICAgKgogICAgICAgKiBAcGFyYW0gTnVtYmVyIGFJZHgKICAgICAgICovCiAgICAgIGF0KGFJZHgpIHsKICAgICAgICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBlbGVtZW50IGluZGV4ZWQgYnkgIiArIGFJZHgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlcwogICAgICAgKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZAogICAgICAgKiBmb3Igc3RvcmluZyB0aGUgbWVtYmVycyBzbyB0aGF0IG5vIG9uZSBjYW4gbWVzcyB3aXRoIGludGVybmFsIHN0YXRlLgogICAgICAgKi8KICAgICAgdG9BcnJheSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkFycmF5U2V0ID0gQXJyYXlTZXQ7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL21hcHBpbmctbGlzdC5qcwp2YXIgcmVxdWlyZV9tYXBwaW5nX2xpc3QgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIihleHBvcnRzMikgewogICAgdmFyIHV0aWwgPSByZXF1aXJlX3V0aWwyKCk7CiAgICBmdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikgewogICAgICBjb25zdCBsaW5lQSA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmU7CiAgICAgIGNvbnN0IGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTsKICAgICAgY29uc3QgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjsKICAgICAgY29uc3QgY29sdW1uQiA9IG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjsKICAgICAgcmV0dXJuIGxpbmVCID4gbGluZUEgfHwgbGluZUIgPT0gbGluZUEgJiYgY29sdW1uQiA+PSBjb2x1bW5BIHx8IHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwOwogICAgfQogICAgdmFyIE1hcHBpbmdMaXN0ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9hcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fbGFzdCA9IHsgZ2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMCB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIHRocm91Z2ggaW50ZXJuYWwgaXRlbXMuIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyB0aGF0CiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuCiAgICAgICAqCiAgICAgICAqIE5PVEU6IFRoZSBvcmRlciBvZiB0aGUgbWFwcGluZ3MgaXMgTk9UIGd1YXJhbnRlZWQuCiAgICAgICAqLwogICAgICB1bnNvcnRlZEZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykgewogICAgICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmcKICAgICAgICovCiAgICAgIGFkZChhTWFwcGluZykgewogICAgICAgIGlmIChnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKHRoaXMuX2xhc3QsIGFNYXBwaW5nKSkgewogICAgICAgICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nOwogICAgICAgICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBmbGF0LCBzb3J0ZWQgYXJyYXkgb2YgbWFwcGluZ3MuIFRoZSBtYXBwaW5ncyBhcmUgc29ydGVkIGJ5CiAgICAgICAqIGdlbmVyYXRlZCBwb3NpdGlvbi4KICAgICAgICoKICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgcmV0dXJucyBpbnRlcm5hbCBkYXRhIHdpdGhvdXQgY29weWluZywgZm9yCiAgICAgICAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhcwogICAgICAgKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93bgogICAgICAgKiBjb3B5LgogICAgICAgKi8KICAgICAgdG9BcnJheSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3NvcnRlZCkgewogICAgICAgICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKTsKICAgICAgICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9hcnJheTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzCnZhciByZXF1aXJlX3NvdXJjZV9tYXBfZ2VuZXJhdG9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzIihleHBvcnRzMikgewogICAgdmFyIGJhc2U2NFZMUSA9IHJlcXVpcmVfYmFzZTY0X3ZscSgpOwogICAgdmFyIHV0aWwgPSByZXF1aXJlX3V0aWwyKCk7CiAgICB2YXIgQXJyYXlTZXQgPSByZXF1aXJlX2FycmF5X3NldCgpLkFycmF5U2V0OwogICAgdmFyIE1hcHBpbmdMaXN0ID0gcmVxdWlyZV9tYXBwaW5nX2xpc3QoKS5NYXBwaW5nTGlzdDsKICAgIHZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSBjbGFzcyBfU291cmNlTWFwR2VuZXJhdG9yIHsKICAgICAgY29uc3RydWN0b3IoYUFyZ3MpIHsKICAgICAgICBpZiAoIWFBcmdzKSB7CiAgICAgICAgICBhQXJncyA9IHt9OwogICAgICAgIH0KICAgICAgICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICJmaWxlIiwgbnVsbCk7CiAgICAgICAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAic291cmNlUm9vdCIsIG51bGwpOwogICAgICAgIHRoaXMuX3NraXBWYWxpZGF0aW9uID0gdXRpbC5nZXRBcmcoYUFyZ3MsICJza2lwVmFsaWRhdGlvbiIsIGZhbHNlKTsKICAgICAgICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7CiAgICAgICAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTsKICAgICAgICB0aGlzLl9tYXBwaW5ncyA9IG5ldyBNYXBwaW5nTGlzdCgpOwogICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXIKICAgICAgICoKICAgICAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwLgogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7CiAgICAgICAgY29uc3Qgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290OwogICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBfU291cmNlTWFwR2VuZXJhdG9yKHsKICAgICAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLAogICAgICAgICAgc291cmNlUm9vdAogICAgICAgIH0pOwogICAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbihtYXBwaW5nKSB7CiAgICAgICAgICBjb25zdCBuZXdNYXBwaW5nID0gewogICAgICAgICAgICBnZW5lcmF0ZWQ6IHsKICAgICAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsCiAgICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbgogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHsKICAgICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTsKICAgICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkgewogICAgICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBuZXdNYXBwaW5nLnNvdXJjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHsKICAgICAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSwKICAgICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBnZW5lcmF0b3IuYWRkTWFwcGluZyhuZXdNYXBwaW5nKTsKICAgICAgICB9KTsKICAgICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZUZpbGUpIHsKICAgICAgICAgIGxldCBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7CiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWdlbmVyYXRvci5fc291cmNlcy5oYXMoc291cmNlUmVsYXRpdmUpKSB7CiAgICAgICAgICAgIGdlbmVyYXRvci5fc291cmNlcy5hZGQoc291cmNlUmVsYXRpdmUpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpOwogICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICBnZW5lcmF0b3Iuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZ2VuZXJhdG9yOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZAogICAgICAgKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gZm9yIHRoaXMgc291cmNlIG1hcCBiZWluZyBjcmVhdGVkLiBUaGUgbWFwcGluZwogICAgICAgKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgKgogICAgICAgKiAgIC0gZ2VuZXJhdGVkOiBBbiBvYmplY3Qgd2l0aCB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuCiAgICAgICAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuCiAgICAgICAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLgogICAgICAgKiAgIC0gbmFtZTogQW4gb3B0aW9uYWwgb3JpZ2luYWwgdG9rZW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLgogICAgICAgKi8KICAgICAgYWRkTWFwcGluZyhhQXJncykgewogICAgICAgIGNvbnN0IGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAiZ2VuZXJhdGVkIik7CiAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgIm9yaWdpbmFsIiwgbnVsbCk7CiAgICAgICAgbGV0IHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAic291cmNlIiwgbnVsbCk7CiAgICAgICAgbGV0IG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgIm5hbWUiLCBudWxsKTsKICAgICAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7CiAgICAgICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CiAgICAgICAgICBzb3VyY2UgPSBTdHJpbmcoc291cmNlKTsKICAgICAgICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMoc291cmNlKSkgewogICAgICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBuYW1lID0gU3RyaW5nKG5hbWUpOwogICAgICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHsKICAgICAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9tYXBwaW5ncy5hZGQoewogICAgICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsCiAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sCiAgICAgICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSwKICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbiwKICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgIG5hbWUKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4KICAgICAgICovCiAgICAgIHNldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7CiAgICAgICAgbGV0IHNvdXJjZSA9IGFTb3VyY2VGaWxlOwogICAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHsKICAgICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHsKICAgICAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7CiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykgewogICAgICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldOwogICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZQogICAgICAgKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpcwogICAgICAgKiByZXdyaXR0ZW4gdXNpbmcgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYXAuIE5vdGU6IFRoZSByZXNvbHV0aW9uIGZvciB0aGUKICAgICAgICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkLgogICAgICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuCiAgICAgICAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLgogICAgICAgKiBAcGFyYW0gYVNvdXJjZU1hcFBhdGggT3B0aW9uYWwuIFRoZSBkaXJuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgbWFwCiAgICAgICAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLgogICAgICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWUKICAgICAgICogICAgICAgIGRpcmVjdG9yeSwgYW5kIHRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQgY29udGFpbnMgcmVsYXRpdmUgc291cmNlCiAgICAgICAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlbgogICAgICAgKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci4KICAgICAgICovCiAgICAgIGFwcGx5U291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lciwgYVNvdXJjZUZpbGUsIGFTb3VyY2VNYXBQYXRoKSB7CiAgICAgICAgbGV0IHNvdXJjZUZpbGUgPSBhU291cmNlRmlsZTsKICAgICAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICAgIGBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgb3IgdGhlIHNvdXJjZSBtYXAncyAiZmlsZSIgcHJvcGVydHkuIEJvdGggd2VyZSBvbWl0dGVkLmAKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIHNvdXJjZUZpbGUgPSBhU291cmNlTWFwQ29uc3VtZXIuZmlsZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7CiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkgewogICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld1NvdXJjZXMgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCkubGVuZ3RoID4gMCA/IG5ldyBBcnJheVNldCgpIDogdGhpcy5fc291cmNlczsKICAgICAgICBjb25zdCBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpOwogICAgICAgIHRoaXMuX21hcHBpbmdzLnVuc29ydGVkRm9yRWFjaChmdW5jdGlvbihtYXBwaW5nKSB7CiAgICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkgewogICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGFTb3VyY2VNYXBDb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHsKICAgICAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSwKICAgICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gb3JpZ2luYWwuc291cmNlOwogICAgICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgbWFwcGluZy5zb3VyY2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7CiAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjsKICAgICAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc291cmNlID0gbWFwcGluZy5zb3VyY2U7CiAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHsKICAgICAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG5hbWUgPSBtYXBwaW5nLm5hbWU7CiAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHsKICAgICAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0sIHRoaXMpOwogICAgICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzOwogICAgICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7CiAgICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbihzcmNGaWxlKSB7CiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc3JjRmlsZSk7CiAgICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgc3JjRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc3JjRmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkgewogICAgICAgICAgICAgIHNyY0ZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNyY0ZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzcmNGaWxlLCBjb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6CiAgICAgICAqCiAgICAgICAqICAgMS4gSnVzdCB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uLgogICAgICAgKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLgogICAgICAgKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWUKICAgICAgICogICAgICB0b2tlbi4KICAgICAgICoKICAgICAgICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzCiAgICAgICAqIGluIHRvIG9uZSBvZiB0aGVzZSBjYXRlZ29yaWVzLgogICAgICAgKi8KICAgICAgX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsIGFOYW1lKSB7CiAgICAgICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICJudW1iZXIiICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICAib3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCB0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoYUdlbmVyYXRlZCAmJiAibGluZSIgaW4gYUdlbmVyYXRlZCAmJiAiY29sdW1uIiBpbiBhR2VuZXJhdGVkICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMCAmJiAhYU9yaWdpbmFsICYmICFhU291cmNlICYmICFhTmFtZSkgewogICAgICAgIH0gZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAibGluZSIgaW4gYUdlbmVyYXRlZCAmJiAiY29sdW1uIiBpbiBhR2VuZXJhdGVkICYmIGFPcmlnaW5hbCAmJiAibGluZSIgaW4gYU9yaWdpbmFsICYmICJjb2x1bW4iIGluIGFPcmlnaW5hbCAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMCAmJiBhU291cmNlKSB7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXBwaW5nOiAiICsgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsCiAgICAgICAgICAgIHNvdXJjZTogYVNvdXJjZSwKICAgICAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCwKICAgICAgICAgICAgbmFtZTogYU5hbWUKICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZSB0aGUgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gdG8gdGhlIHN0cmVhbSBvZiBiYXNlIDY0IFZMUXMKICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVNYXBwaW5ncygpIHsKICAgICAgICBsZXQgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwOwogICAgICAgIGxldCBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxOwogICAgICAgIGxldCBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDsKICAgICAgICBsZXQgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwOwogICAgICAgIGxldCBwcmV2aW91c05hbWUgPSAwOwogICAgICAgIGxldCBwcmV2aW91c1NvdXJjZSA9IDA7CiAgICAgICAgbGV0IHJlc3VsdCA9ICIiOwogICAgICAgIGxldCBuZXh0OwogICAgICAgIGxldCBtYXBwaW5nOwogICAgICAgIGxldCBuYW1lSWR4OwogICAgICAgIGxldCBzb3VyY2VJZHg7CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07CiAgICAgICAgICBuZXh0ID0gIiI7CiAgICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHsKICAgICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwOwogICAgICAgICAgICB3aGlsZSAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHsKICAgICAgICAgICAgICBuZXh0ICs9ICI7IjsKICAgICAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZExpbmUrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkgewogICAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgKz0gIiwiOwogICAgICAgICAgfQogICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pOwogICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjsKICAgICAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHNvdXJjZUlkeCA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihtYXBwaW5nLnNvdXJjZSk7CiAgICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShzb3VyY2VJZHggLSBwcmV2aW91c1NvdXJjZSk7CiAgICAgICAgICAgIHByZXZpb3VzU291cmNlID0gc291cmNlSWR4OwogICAgICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpOwogICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTsKICAgICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gLSBwcmV2aW91c09yaWdpbmFsQ29sdW1uKTsKICAgICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47CiAgICAgICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7CiAgICAgICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpOwogICAgICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCArPSBuZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIF9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkgewogICAgICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhU291cmNlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUoYVNvdXJjZVJvb3QsIHNvdXJjZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KSA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldIDogbnVsbDsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRXh0ZXJuYWxpemUgdGhlIHNvdXJjZSBtYXAuCiAgICAgICAqLwogICAgICB0b0pTT04oKSB7CiAgICAgICAgY29uc3QgbWFwID0gewogICAgICAgICAgdmVyc2lvbjogdGhpcy5fdmVyc2lvbiwKICAgICAgICAgIHNvdXJjZXM6IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLAogICAgICAgICAgbmFtZXM6IHRoaXMuX25hbWVzLnRvQXJyYXkoKSwKICAgICAgICAgIG1hcHBpbmdzOiB0aGlzLl9zZXJpYWxpemVNYXBwaW5ncygpCiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5fZmlsZSAhPSBudWxsKSB7CiAgICAgICAgICBtYXAuZmlsZSA9IHRoaXMuX2ZpbGU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHsKICAgICAgICAgIG1hcC5zb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykgewogICAgICAgICAgbWFwLnNvdXJjZXNDb250ZW50ID0gdGhpcy5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChtYXAuc291cmNlcywgbWFwLnNvdXJjZVJvb3QpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLgogICAgICAgKi8KICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpOwogICAgICB9CiAgICB9OwogICAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7CiAgICBleHBvcnRzMi5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2JpbmFyeS1zZWFyY2guanMKdmFyIHJlcXVpcmVfYmluYXJ5X3NlYXJjaCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iaW5hcnktc2VhcmNoLmpzIihleHBvcnRzMikgewogICAgZXhwb3J0czIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxOwogICAgZXhwb3J0czIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyOwogICAgZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykgewogICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKChhSGlnaCAtIGFMb3cpIC8gMikgKyBhTG93OwogICAgICBjb25zdCBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7CiAgICAgIGlmIChjbXAgPT09IDApIHsKICAgICAgICByZXR1cm4gbWlkOwogICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKICAgICAgICBpZiAoYUhpZ2ggLSBtaWQgPiAxKSB7CiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFCaWFzID09IGV4cG9ydHMyLkxFQVNUX1VQUEVSX0JPVU5EKSB7CiAgICAgICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1pZDsKICAgICAgfQogICAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHsKICAgICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKGFMb3csIG1pZCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpOwogICAgICB9CiAgICAgIGlmIChhQmlhcyA9PSBleHBvcnRzMi5MRUFTVF9VUFBFUl9CT1VORCkgewogICAgICAgIHJldHVybiBtaWQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93OwogICAgfQogICAgZXhwb3J0czIuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7CiAgICAgIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGxldCBpbmRleCA9IHJlY3Vyc2l2ZVNlYXJjaCgKICAgICAgICAtMSwKICAgICAgICBhSGF5c3RhY2subGVuZ3RoLAogICAgICAgIGFOZWVkbGUsCiAgICAgICAgYUhheXN0YWNrLAogICAgICAgIGFDb21wYXJlLAogICAgICAgIGFCaWFzIHx8IGV4cG9ydHMyLkdSRUFURVNUX0xPV0VSX0JPVU5ECiAgICAgICk7CiAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7CiAgICAgICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC0taW5kZXg7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZGV4OwogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvcmVhZC13YXNtLmpzCnZhciByZXF1aXJlX3JlYWRfd2FzbSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9yZWFkLXdhc20uanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICB2YXIgaXNCcm93c2VyRW52aXJvbm1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHRoaXMgPT09IHdpbmRvdzsKICAgIH0uY2FsbCgpOwogICAgaWYgKGlzQnJvd3NlckVudmlyb25tZW50KSB7CiAgICAgIGxldCBtYXBwaW5nc1dhc20gPSBudWxsOwogICAgICBtb2R1bGUyLmV4cG9ydHMgPSBmdW5jdGlvbiByZWFkV2FzbSgpIHsKICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmdzV2FzbSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHJldHVybiBmZXRjaChtYXBwaW5nc1dhc20pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1hcHBpbmdzV2FzbSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1hcHBpbmdzV2FzbSk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IG11c3QgcHJvdmlkZSB0aGUgc3RyaW5nIFVSTCBvciBBcnJheUJ1ZmZlciBjb250ZW50cyBvZiBsaWIvbWFwcGluZ3Mud2FzbSBieSBjYWxsaW5nIFNvdXJjZU1hcENvbnN1bWVyLmluaXRpYWxpemUoeyAnbGliL21hcHBpbmdzLndhc20nOiAuLi4gfSkgYmVmb3JlIHVzaW5nIFNvdXJjZU1hcENvbnN1bWVyIik7CiAgICAgIH07CiAgICAgIG1vZHVsZTIuZXhwb3J0cy5pbml0aWFsaXplID0gKGlucHV0KSA9PiBtYXBwaW5nc1dhc20gPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsKICAgICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgbW9kdWxlMi5leHBvcnRzID0gZnVuY3Rpb24gcmVhZFdhc20oKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGNvbnN0IHdhc21QYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgIm1hcHBpbmdzLndhc20iKTsKICAgICAgICAgIGZzLnJlYWRGaWxlKHdhc21QYXRoLCBudWxsLCAoZXJyb3IsIGRhdGEpID0+IHsKICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmJ1ZmZlcik7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgbW9kdWxlMi5leHBvcnRzLmluaXRpYWxpemUgPSAoXykgPT4gewogICAgICAgIGNvbnNvbGUuZGVidWcoIlNvdXJjZU1hcENvbnN1bWVyLmluaXRpYWxpemUgaXMgYSBuby1vcCB3aGVuIHJ1bm5pbmcgaW4gbm9kZS5qcyIpOwogICAgICB9OwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi93YXNtLmpzCnZhciByZXF1aXJlX3dhc20gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvd2FzbS5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgIHZhciByZWFkV2FzbSA9IHJlcXVpcmVfcmVhZF93YXNtKCk7CiAgICBmdW5jdGlvbiBNYXBwaW5nKCkgewogICAgICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwOwogICAgICB0aGlzLmdlbmVyYXRlZENvbHVtbiA9IDA7CiAgICAgIHRoaXMubGFzdEdlbmVyYXRlZENvbHVtbiA9IG51bGw7CiAgICAgIHRoaXMuc291cmNlID0gbnVsbDsKICAgICAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsOwogICAgICB0aGlzLm9yaWdpbmFsQ29sdW1uID0gbnVsbDsKICAgICAgdGhpcy5uYW1lID0gbnVsbDsKICAgIH0KICAgIHZhciBjYWNoZWRXYXNtID0gbnVsbDsKICAgIG1vZHVsZTIuZXhwb3J0cyA9IGZ1bmN0aW9uIHdhc20oKSB7CiAgICAgIGlmIChjYWNoZWRXYXNtKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZFdhc207CiAgICAgIH0KICAgICAgY29uc3QgY2FsbGJhY2tTdGFjayA9IFtdOwogICAgICBjYWNoZWRXYXNtID0gcmVhZFdhc20oKS50aGVuKChidWZmZXIpID0+IHsKICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnVmZmVyLCB7CiAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgbWFwcGluZ19jYWxsYmFjayhnZW5lcmF0ZWRMaW5lLCBnZW5lcmF0ZWRDb2x1bW4sIGhhc0xhc3RHZW5lcmF0ZWRDb2x1bW4sIGxhc3RHZW5lcmF0ZWRDb2x1bW4sIGhhc09yaWdpbmFsLCBzb3VyY2UsIG9yaWdpbmFsTGluZSwgb3JpZ2luYWxDb2x1bW4sIGhhc05hbWUsIG5hbWUpIHsKICAgICAgICAgICAgICBjb25zdCBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTsKICAgICAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBnZW5lcmF0ZWRMaW5lICsgMTsKICAgICAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IGdlbmVyYXRlZENvbHVtbjsKICAgICAgICAgICAgICBpZiAoaGFzTGFzdEdlbmVyYXRlZENvbHVtbikgewogICAgICAgICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbGFzdEdlbmVyYXRlZENvbHVtbiAtIDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChoYXNPcmlnaW5hbCkgewogICAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsTGluZSArIDE7CiAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWxDb2x1bW47CiAgICAgICAgICAgICAgICBpZiAoaGFzTmFtZSkgewogICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYWxsYmFja1N0YWNrW2NhbGxiYWNrU3RhY2subGVuZ3RoIC0gMV0obWFwcGluZyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXJ0X2FsbF9nZW5lcmF0ZWRfbG9jYXRpb25zX2ZvcigpIHsKICAgICAgICAgICAgICBjb25zb2xlLnRpbWUoImFsbF9nZW5lcmF0ZWRfbG9jYXRpb25zX2ZvciIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbmRfYWxsX2dlbmVyYXRlZF9sb2NhdGlvbnNfZm9yKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgiYWxsX2dlbmVyYXRlZF9sb2NhdGlvbnNfZm9yIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXJ0X2NvbXB1dGVfY29sdW1uX3NwYW5zKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZSgiY29tcHV0ZV9jb2x1bW5fc3BhbnMiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kX2NvbXB1dGVfY29sdW1uX3NwYW5zKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgiY29tcHV0ZV9jb2x1bW5fc3BhbnMiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhcnRfZ2VuZXJhdGVkX2xvY2F0aW9uX2ZvcigpIHsKICAgICAgICAgICAgICBjb25zb2xlLnRpbWUoImdlbmVyYXRlZF9sb2NhdGlvbl9mb3IiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kX2dlbmVyYXRlZF9sb2NhdGlvbl9mb3IoKSB7CiAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCJnZW5lcmF0ZWRfbG9jYXRpb25fZm9yIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXJ0X29yaWdpbmFsX2xvY2F0aW9uX2ZvcigpIHsKICAgICAgICAgICAgICBjb25zb2xlLnRpbWUoIm9yaWdpbmFsX2xvY2F0aW9uX2ZvciIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbmRfb3JpZ2luYWxfbG9jYXRpb25fZm9yKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgib3JpZ2luYWxfbG9jYXRpb25fZm9yIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXJ0X3BhcnNlX21hcHBpbmdzKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZSgicGFyc2VfbWFwcGluZ3MiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kX3BhcnNlX21hcHBpbmdzKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgicGFyc2VfbWFwcGluZ3MiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhcnRfc29ydF9ieV9nZW5lcmF0ZWRfbG9jYXRpb24oKSB7CiAgICAgICAgICAgICAgY29uc29sZS50aW1lKCJzb3J0X2J5X2dlbmVyYXRlZF9sb2NhdGlvbiIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbmRfc29ydF9ieV9nZW5lcmF0ZWRfbG9jYXRpb24oKSB7CiAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCJzb3J0X2J5X2dlbmVyYXRlZF9sb2NhdGlvbiIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGFydF9zb3J0X2J5X29yaWdpbmFsX2xvY2F0aW9uKCkgewogICAgICAgICAgICAgIGNvbnNvbGUudGltZSgic29ydF9ieV9vcmlnaW5hbF9sb2NhdGlvbiIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbmRfc29ydF9ieV9vcmlnaW5hbF9sb2NhdGlvbigpIHsKICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoInNvcnRfYnlfb3JpZ2luYWxfbG9jYXRpb24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KS50aGVuKChXYXNtKSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGV4cG9ydHM6IFdhc20uaW5zdGFuY2UuZXhwb3J0cywKICAgICAgICAgIHdpdGhNYXBwaW5nQ2FsbGJhY2s6IChtYXBwaW5nQ2FsbGJhY2ssIGYpID0+IHsKICAgICAgICAgICAgY2FsbGJhY2tTdGFjay5wdXNoKG1hcHBpbmdDYWxsYmFjayk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZigpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGNhbGxiYWNrU3RhY2sucG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9KS50aGVuKG51bGwsIChlKSA9PiB7CiAgICAgICAgY2FjaGVkV2FzbSA9IG51bGw7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfSk7CiAgICAgIHJldHVybiBjYWNoZWRXYXNtOwogICAgfTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcwp2YXIgcmVxdWlyZV9zb3VyY2VfbWFwX2NvbnN1bWVyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3NvdXJjZS1tYXAtbnBtLTAuNy40LWJjOGQwMThhYjYtYTBmN2M5Yjc5Ny56aXAvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAtY29uc3VtZXIuanMiKGV4cG9ydHMyKSB7CiAgICB2YXIgdXRpbCA9IHJlcXVpcmVfdXRpbDIoKTsKICAgIHZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlX2JpbmFyeV9zZWFyY2goKTsKICAgIHZhciBBcnJheVNldCA9IHJlcXVpcmVfYXJyYXlfc2V0KCkuQXJyYXlTZXQ7CiAgICB2YXIgYmFzZTY0VkxRID0gcmVxdWlyZV9iYXNlNjRfdmxxKCk7CiAgICB2YXIgcmVhZFdhc20gPSByZXF1aXJlX3JlYWRfd2FzbSgpOwogICAgdmFyIHdhc20gPSByZXF1aXJlX3dhc20oKTsKICAgIHZhciBJTlRFUk5BTCA9IFN5bWJvbCgic21jSW50ZXJuYWwiKTsKICAgIHZhciBTb3VyY2VNYXBDb25zdW1lciA9IGNsYXNzIF9Tb3VyY2VNYXBDb25zdW1lciB7CiAgICAgIGNvbnN0cnVjdG9yKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHsKICAgICAgICBpZiAoYVNvdXJjZU1hcCA9PSBJTlRFUk5BTCkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9mYWN0b3J5KGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpOwogICAgICB9CiAgICAgIHN0YXRpYyBpbml0aWFsaXplKG9wdHMpIHsKICAgICAgICByZWFkV2FzbS5pbml0aWFsaXplKG9wdHNbImxpYi9tYXBwaW5ncy53YXNtIl0pOwogICAgICB9CiAgICAgIHN0YXRpYyBmcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHsKICAgICAgICByZXR1cm4gX2ZhY3RvcnlCU00oYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbnN0cnVjdCBhIG5ldyBgU291cmNlTWFwQ29uc3VtZXJgIGZyb20gYHJhd1NvdXJjZU1hcGAgYW5kIGBzb3VyY2VNYXBVcmxgCiAgICAgICAqIChzZWUgdGhlIGBTb3VyY2VNYXBDb25zdW1lcmAgY29uc3RydWN0b3IgZm9yIGRldGFpbHMuIFRoZW4sIGludm9rZSB0aGUgYGFzeW5jCiAgICAgICAqIGZ1bmN0aW9uIGYoU291cmNlTWFwQ29uc3VtZXIpIC0+IFRgIHdpdGggdGhlIG5ld2x5IGNvbnN0cnVjdGVkIGNvbnN1bWVyLCB3YWl0CiAgICAgICAqIGZvciBgZmAgdG8gY29tcGxldGUsIGNhbGwgYGRlc3Ryb3lgIG9uIHRoZSBjb25zdW1lciwgYW5kIHJldHVybiBgZmAncyByZXR1cm4KICAgICAgICogdmFsdWUuCiAgICAgICAqCiAgICAgICAqIFlvdSBtdXN0IG5vdCB1c2UgdGhlIGNvbnN1bWVyIGFmdGVyIGBmYCBjb21wbGV0ZXMhCiAgICAgICAqCiAgICAgICAqIEJ5IHVzaW5nIGB3aXRoYCwgeW91IGRvIG5vdCBoYXZlIHRvIHJlbWVtYmVyIHRvIG1hbnVhbGx5IGNhbGwgYGRlc3Ryb3lgIG9uCiAgICAgICAqIHRoZSBjb25zdW1lciwgc2luY2UgaXQgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSBvbmNlIGBmYCBjb21wbGV0ZXMuCiAgICAgICAqCiAgICAgICAqIGBgYGpzCiAgICAgICAqIGNvbnN0IHhTcXVhcmVkID0gYXdhaXQgU291cmNlTWFwQ29uc3VtZXIud2l0aCgKICAgICAgICogICBteVJhd1NvdXJjZU1hcCwKICAgICAgICogICBudWxsLAogICAgICAgKiAgIGFzeW5jIGZ1bmN0aW9uIChjb25zdW1lcikgewogICAgICAgKiAgICAgLy8gVXNlIGBjb25zdW1lcmAgaW5zaWRlIGhlcmUgYW5kIGRvbid0IHdvcnJ5IGFib3V0IHJlbWVtYmVyaW5nCiAgICAgICAqICAgICAvLyB0byBjYWxsIGBkZXN0cm95YC4KICAgICAgICoKICAgICAgICogICAgIGNvbnN0IHggPSBhd2FpdCB3aGF0ZXZlcihjb25zdW1lcik7CiAgICAgICAqICAgICByZXR1cm4geCAqIHg7CiAgICAgICAqICAgfQogICAgICAgKiApOwogICAgICAgKgogICAgICAgKiAvLyBZb3UgbWF5IG5vdCB1c2UgdGhhdCBgY29uc3VtZXJgIGFueW1vcmUgb3V0IGhlcmU7IGl0IGhhcwogICAgICAgKiAvLyBiZWVuIGRlc3Ryb3llZC4gQnV0IHlvdSBjYW4gdXNlIGB4U3F1YXJlZGAuCiAgICAgICAqIGNvbnNvbGUubG9nKHhTcXVhcmVkKTsKICAgICAgICogYGBgCiAgICAgICAqLwogICAgICBzdGF0aWMgYXN5bmMgd2l0aChyYXdTb3VyY2VNYXAsIHNvdXJjZU1hcFVybCwgZikgewogICAgICAgIGNvbnN0IGNvbnN1bWVyID0gYXdhaXQgbmV3IF9Tb3VyY2VNYXBDb25zdW1lcihyYXdTb3VyY2VNYXAsIHNvdXJjZU1hcFVybCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBhd2FpdCBmKGNvbnN1bWVyKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgY29uc3VtZXIuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseQogICAgICAgKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQKICAgICAgICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS4KICAgICAgICovCiAgICAgIF9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IF9wYXJzZU1hcHBpbmdzIik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGEKICAgICAgICogZ2VuZXJhdGVkIGxpbmUvY29sdW1uIGluIHRoaXMgc291cmNlIG1hcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFjawogICAgICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggZWFjaCBtYXBwaW5nLgogICAgICAgKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0CiAgICAgICAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnkKICAgICAgICogICAgICAgIHRpbWUgdGhhdCBgYUNhbGxiYWNrYCBpcyBjYWxsZWQuCiAgICAgICAqIEBwYXJhbSBhT3JkZXIKICAgICAgICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvcgogICAgICAgKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSYC4gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdG8KICAgICAgICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uCiAgICAgICAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG8KICAgICAgICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgLgogICAgICAgKi8KICAgICAgZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGVhY2hNYXBwaW5nIik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsCiAgICAgICAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3MKICAgICAgICogY29ycmVzcG9uZGluZyB0byBhIGVpdGhlciB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciBvciB0aGUgbmV4dAogICAgICAgKiBjbG9zZXN0IGxpbmUgdGhhdCBoYXMgYW55IG1hcHBpbmdzLiBPdGhlcndpc2UsIHJldHVybnMgYWxsIG1hcHBpbmdzCiAgICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yCiAgICAgICAqIG9yIHRoZSBuZXh0IGNsb3Nlc3QgY29sdW1uIHRoYXQgaGFzIGFueSBvZmZzZXRzLgogICAgICAgKgogICAgICAgKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgICAqCiAgICAgICAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLgogICAgICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC4KICAgICAgICogICAtIGNvbHVtbjogT3B0aW9uYWwuIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICAgICAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuCiAgICAgICAqCiAgICAgICAqIGFuZCBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHJldHVybmVkLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgKgogICAgICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlCiAgICAgICAqICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuCiAgICAgICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLgogICAgICAgKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLgogICAgICAgKi8KICAgICAgYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciIpOwogICAgICB9CiAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGRlc3Ryb3kiKTsKICAgICAgfQogICAgfTsKICAgIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7CiAgICBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVIgPSAxOwogICAgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVIgPSAyOwogICAgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxOwogICAgU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyOwogICAgZXhwb3J0czIuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjsKICAgIHZhciBCYXNpY1NvdXJjZU1hcENvbnN1bWVyID0gY2xhc3MgX0Jhc2ljU291cmNlTWFwQ29uc3VtZXIgZXh0ZW5kcyBTb3VyY2VNYXBDb25zdW1lciB7CiAgICAgIGNvbnN0cnVjdG9yKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHsKICAgICAgICByZXR1cm4gc3VwZXIoSU5URVJOQUwpLnRoZW4oKHRoYXQpID0+IHsKICAgICAgICAgIGxldCBzb3VyY2VNYXAgPSBhU291cmNlTWFwOwogICAgICAgICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAic3RyaW5nIikgewogICAgICAgICAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAidmVyc2lvbiIpOwogICAgICAgICAgbGV0IHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICJzb3VyY2VzIik7CiAgICAgICAgICBjb25zdCBuYW1lcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgIm5hbWVzIiwgW10pOwogICAgICAgICAgbGV0IHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICJzb3VyY2VSb290IiwgbnVsbCk7CiAgICAgICAgICBjb25zdCBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgInNvdXJjZXNDb250ZW50IiwgbnVsbCk7CiAgICAgICAgICBjb25zdCBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgIm1hcHBpbmdzIik7CiAgICAgICAgICBjb25zdCBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAiZmlsZSIsIG51bGwpOwogICAgICAgICAgaWYgKHZlcnNpb24gIT0gdGhhdC5fdmVyc2lvbikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHZlcnNpb246ICIgKyB2ZXJzaW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzb3VyY2VSb290KSB7CiAgICAgICAgICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTsKICAgICAgICAgIH0KICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzLm1hcChTdHJpbmcpLm1hcCh1dGlsLm5vcm1hbGl6ZSkubWFwKGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSkgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSkgOiBzb3VyY2U7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoYXQuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLm1hcChTdHJpbmcpLCB0cnVlKTsKICAgICAgICAgIHRoYXQuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7CiAgICAgICAgICB0aGF0Ll9hYnNvbHV0ZVNvdXJjZXMgPSB0aGF0Ll9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGF0LnNvdXJjZVJvb3QgPSBzb3VyY2VSb290OwogICAgICAgICAgdGhhdC5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50OwogICAgICAgICAgdGhhdC5fbWFwcGluZ3MgPSBtYXBwaW5nczsKICAgICAgICAgIHRoYXQuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7CiAgICAgICAgICB0aGF0LmZpbGUgPSBmaWxlOwogICAgICAgICAgdGhhdC5fY29tcHV0ZWRDb2x1bW5TcGFucyA9IGZhbHNlOwogICAgICAgICAgdGhhdC5fbWFwcGluZ3NQdHIgPSAwOwogICAgICAgICAgdGhhdC5fd2FzbSA9IG51bGw7CiAgICAgICAgICByZXR1cm4gd2FzbSgpLnRoZW4oKHcpID0+IHsKICAgICAgICAgICAgdGhhdC5fd2FzbSA9IHc7CiAgICAgICAgICAgIHJldHVybiB0aGF0OwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdAogICAgICAgKiBmb3VuZC4KICAgICAgICovCiAgICAgIF9maW5kU291cmNlSW5kZXgoYVNvdXJjZSkgewogICAgICAgIGxldCByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7CiAgICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLmluZGV4T2YocmVsYXRpdmVTb3VyY2UpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgaWYgKHRoaXMuX2Fic29sdXRlU291cmNlc1tpXSA9PSBhU291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgZnJvbSBhIFNvdXJjZU1hcEdlbmVyYXRvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwCiAgICAgICAqICAgICAgICBUaGUgc291cmNlIG1hcCB0aGF0IHdpbGwgYmUgY29uc3VtZWQuCiAgICAgICAqIEBwYXJhbSBTdHJpbmcgYVNvdXJjZU1hcFVSTAogICAgICAgKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKQogICAgICAgKiBAcmV0dXJucyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfQmFzaWNTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICAgIGdldCBzb3VyY2VzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMuc2xpY2UoKTsKICAgICAgfQogICAgICBfZ2V0TWFwcGluZ3NQdHIoKSB7CiAgICAgICAgaWYgKHRoaXMuX21hcHBpbmdzUHRyID09PSAwKSB7CiAgICAgICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NQdHI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHkKICAgICAgICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kCiAgICAgICAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuCiAgICAgICAqLwogICAgICBfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkgewogICAgICAgIGNvbnN0IHNpemUgPSBhU3RyLmxlbmd0aDsKICAgICAgICBjb25zdCBtYXBwaW5nc0J1ZlB0ciA9IHRoaXMuX3dhc20uZXhwb3J0cy5hbGxvY2F0ZV9tYXBwaW5ncyhzaXplKTsKICAgICAgICBjb25zdCBtYXBwaW5nc0J1ZiA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3dhc20uZXhwb3J0cy5tZW1vcnkuYnVmZmVyLCBtYXBwaW5nc0J1ZlB0ciwgc2l6ZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgIG1hcHBpbmdzQnVmW2ldID0gYVN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXBwaW5nc1B0ciA9IHRoaXMuX3dhc20uZXhwb3J0cy5wYXJzZV9tYXBwaW5ncyhtYXBwaW5nc0J1ZlB0cik7CiAgICAgICAgaWYgKCFtYXBwaW5nc1B0cikgewogICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl93YXNtLmV4cG9ydHMuZ2V0X2xhc3RfZXJyb3IoKTsKICAgICAgICAgIGxldCBtc2cgPSBgRXJyb3IgcGFyc2luZyBtYXBwaW5ncyAoY29kZSAke2Vycm9yfSk6IGA7CiAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtc2cgKz0gInRoZSBtYXBwaW5ncyBjb250YWluZWQgYSBuZWdhdGl2ZSBsaW5lLCBjb2x1bW4sIHNvdXJjZSBpbmRleCwgb3IgbmFtZSBpbmRleCI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICBtc2cgKz0gInRoZSBtYXBwaW5ncyBjb250YWluZWQgYSBudW1iZXIgbGFyZ2VyIHRoYW4gMioqMzIiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgbXNnICs9ICJyZWFjaGVkIEVPRiB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIHBhcnNpbmcgYSBWTFEiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgbXNnICs9ICJpbnZhbGlkIGJhc2UgNjQgY2hhcmFjdGVyIHdoaWxlIHBhcnNpbmcgYSBWTFEiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIG1zZyArPSAidW5rbm93biBlcnJvciBjb2RlIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tYXBwaW5nc1B0ciA9IG1hcHBpbmdzUHRyOwogICAgICB9CiAgICAgIGVhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikgewogICAgICAgIGNvbnN0IGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsOwogICAgICAgIGNvbnN0IG9yZGVyID0gYU9yZGVyIHx8IFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjsKICAgICAgICBjb25zdCBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290OwogICAgICAgIHRoaXMuX3dhc20ud2l0aE1hcHBpbmdDYWxsYmFjaygKICAgICAgICAgIChtYXBwaW5nKSA9PiB7CiAgICAgICAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdGhpcy5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7CiAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7CiAgICAgICAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYUNhbGxiYWNrLmNhbGwoY29udGV4dCwgbWFwcGluZyk7CiAgICAgICAgICB9LAogICAgICAgICAgKCkgPT4gewogICAgICAgICAgICBzd2l0Y2ggKG9yZGVyKSB7CiAgICAgICAgICAgICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI6CiAgICAgICAgICAgICAgICB0aGlzLl93YXNtLmV4cG9ydHMuYnlfZ2VuZXJhdGVkX2xvY2F0aW9uKHRoaXMuX2dldE1hcHBpbmdzUHRyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUjoKICAgICAgICAgICAgICAgIHRoaXMuX3dhc20uZXhwb3J0cy5ieV9vcmlnaW5hbF9sb2NhdGlvbih0aGlzLl9nZXRNYXBwaW5nc1B0cigpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgfQogICAgICBhbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHsKICAgICAgICBsZXQgc291cmNlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICJzb3VyY2UiKTsKICAgICAgICBjb25zdCBvcmlnaW5hbExpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgImxpbmUiKTsKICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IGFBcmdzLmNvbHVtbiB8fCAwOwogICAgICAgIHNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChzb3VyY2UpOwogICAgICAgIGlmIChzb3VyY2UgPCAwKSB7CiAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIGlmIChvcmlnaW5hbExpbmUgPCAxKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxpbmUgbnVtYmVycyBtdXN0IGJlID49IDEiKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbmFsQ29sdW1uIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2x1bW4gbnVtYmVycyBtdXN0IGJlID49IDAiKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBbXTsKICAgICAgICB0aGlzLl93YXNtLndpdGhNYXBwaW5nQ2FsbGJhY2soCiAgICAgICAgICAobSkgPT4gewogICAgICAgICAgICBsZXQgbGFzdENvbHVtbiA9IG0ubGFzdEdlbmVyYXRlZENvbHVtbjsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXB1dGVkQ29sdW1uU3BhbnMgJiYgbGFzdENvbHVtbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGxhc3RDb2x1bW4gPSBJbmZpbml0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBsaW5lOiBtLmdlbmVyYXRlZExpbmUsCiAgICAgICAgICAgICAgY29sdW1uOiBtLmdlbmVyYXRlZENvbHVtbiwKICAgICAgICAgICAgICBsYXN0Q29sdW1uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fd2FzbS5leHBvcnRzLmFsbF9nZW5lcmF0ZWRfbG9jYXRpb25zX2ZvcigKICAgICAgICAgICAgICB0aGlzLl9nZXRNYXBwaW5nc1B0cigpLAogICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICBvcmlnaW5hbExpbmUgLSAxLAogICAgICAgICAgICAgICJjb2x1bW4iIGluIGFBcmdzLAogICAgICAgICAgICAgIG9yaWdpbmFsQ29sdW1uCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gbWFwcGluZ3M7CiAgICAgIH0KICAgICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAodGhpcy5fbWFwcGluZ3NQdHIgIT09IDApIHsKICAgICAgICAgIHRoaXMuX3dhc20uZXhwb3J0cy5mcmVlX21hcHBpbmdzKHRoaXMuX21hcHBpbmdzUHRyKTsKICAgICAgICAgIHRoaXMuX21hcHBpbmdzUHRyID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbXB1dGUgdGhlIGxhc3QgY29sdW1uIGZvciBlYWNoIGdlbmVyYXRlZCBtYXBwaW5nLiBUaGUgbGFzdCBjb2x1bW4gaXMKICAgICAgICogaW5jbHVzaXZlLgogICAgICAgKi8KICAgICAgY29tcHV0ZUNvbHVtblNwYW5zKCkgewogICAgICAgIGlmICh0aGlzLl9jb21wdXRlZENvbHVtblNwYW5zKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX3dhc20uZXhwb3J0cy5jb21wdXRlX2NvbHVtbl9zcGFucyh0aGlzLl9nZXRNYXBwaW5nc1B0cigpKTsKICAgICAgICB0aGlzLl9jb21wdXRlZENvbHVtblNwYW5zID0gdHJ1ZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkCiAgICAgICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdAogICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgICoKICAgICAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlcgogICAgICAgKiAgICAgaXMgMS1iYXNlZC4KICAgICAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uCiAgICAgICAqICAgICBudW1iZXIgaXMgMC1iYXNlZC4KICAgICAgICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yCiAgICAgICAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlCiAgICAgICAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlCiAgICAgICAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC4KICAgICAgICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuCiAgICAgICAqCiAgICAgICAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgICAqCiAgICAgICAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC4KICAgICAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlCiAgICAgICAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLgogICAgICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlCiAgICAgICAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuCiAgICAgICAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC4KICAgICAgICovCiAgICAgIG9yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHsKICAgICAgICBjb25zdCBuZWVkbGUgPSB7CiAgICAgICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgImxpbmUiKSwKICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICJjb2x1bW4iKQogICAgICAgIH07CiAgICAgICAgaWYgKG5lZWRsZS5nZW5lcmF0ZWRMaW5lIDwgMSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJMaW5lIG51bWJlcnMgbXVzdCBiZSA+PSAxIik7CiAgICAgICAgfQogICAgICAgIGlmIChuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2x1bW4gbnVtYmVycyBtdXN0IGJlID49IDAiKTsKICAgICAgICB9CiAgICAgICAgbGV0IGJpYXMgPSB1dGlsLmdldEFyZyhhQXJncywgImJpYXMiLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCk7CiAgICAgICAgaWYgKGJpYXMgPT0gbnVsbCkgewogICAgICAgICAgYmlhcyA9IFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EOwogICAgICAgIH0KICAgICAgICBsZXQgbWFwcGluZzsKICAgICAgICB0aGlzLl93YXNtLndpdGhNYXBwaW5nQ2FsbGJhY2soKG0pID0+IG1hcHBpbmcgPSBtLCAoKSA9PiB7CiAgICAgICAgICB0aGlzLl93YXNtLmV4cG9ydHMub3JpZ2luYWxfbG9jYXRpb25fZm9yKAogICAgICAgICAgICB0aGlzLl9nZXRNYXBwaW5nc1B0cigpLAogICAgICAgICAgICBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtIDEsCiAgICAgICAgICAgIG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4sCiAgICAgICAgICAgIGJpYXMKICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG1hcHBpbmcpIHsKICAgICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7CiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAic291cmNlIiwgbnVsbCk7CiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7CiAgICAgICAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHRoaXMuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuYW1lID0gdXRpbC5nZXRBcmcobWFwcGluZywgIm5hbWUiLCBudWxsKTsKICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgIm9yaWdpbmFsTGluZSIsIG51bGwpLAogICAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgIm9yaWdpbmFsQ29sdW1uIiwgbnVsbCksCiAgICAgICAgICAgICAgbmFtZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgc291cmNlOiBudWxsLAogICAgICAgICAgbGluZTogbnVsbCwKICAgICAgICAgIGNvbHVtbjogbnVsbCwKICAgICAgICAgIG5hbWU6IG51bGwKICAgICAgICB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2UKICAgICAgICogbWFwLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAqLwogICAgICBoYXNDb250ZW50c09mQWxsU291cmNlcygpIHsKICAgICAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24oc2MpIHsKICAgICAgICAgIHJldHVybiBzYyA9PSBudWxsOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGUKICAgICAgICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpcwogICAgICAgKiBhdmFpbGFibGUuCiAgICAgICAqLwogICAgICBzb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHsKICAgICAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTsKICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdOwogICAgICAgIH0KICAgICAgICBsZXQgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlOwogICAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkgewogICAgICAgICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpOwogICAgICAgIH0KICAgICAgICBsZXQgdXJsMzsKICAgICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwgJiYgKHVybDMgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7CiAgICAgICAgICBjb25zdCBmaWxlVXJpQWJzUGF0aCA9IHJlbGF0aXZlU291cmNlLnJlcGxhY2UoL15maWxlOlwvXC8vLCAiIik7CiAgICAgICAgICBpZiAodXJsMy5zY2hlbWUgPT0gImZpbGUiICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgoIXVybDMucGF0aCB8fCB1cmwzLnBhdGggPT0gIi8iKSAmJiB0aGlzLl9zb3VyY2VzLmhhcygiLyIgKyByZWxhdGl2ZVNvdXJjZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKCIvIiArIHJlbGF0aXZlU291cmNlKV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChudWxsT25NaXNzaW5nKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCciJyArIHJlbGF0aXZlU291cmNlICsgJyIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsCiAgICAgICAqIGxpbmUsIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aAogICAgICAgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgICAqCiAgICAgICAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLgogICAgICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIKICAgICAgICogICAgIGlzIDEtYmFzZWQuCiAgICAgICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgY29sdW1uCiAgICAgICAqICAgICBudW1iZXIgaXMgMC1iYXNlZC4KICAgICAgICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yCiAgICAgICAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlCiAgICAgICAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlCiAgICAgICAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC4KICAgICAgICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuCiAgICAgICAqCiAgICAgICAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgICAqCiAgICAgICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGUKICAgICAgICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuCiAgICAgICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLgogICAgICAgKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC4KICAgICAgICovCiAgICAgIGdlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7CiAgICAgICAgbGV0IHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAic291cmNlIik7CiAgICAgICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7CiAgICAgICAgaWYgKHNvdXJjZSA8IDApIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGxpbmU6IG51bGwsCiAgICAgICAgICAgIGNvbHVtbjogbnVsbCwKICAgICAgICAgICAgbGFzdENvbHVtbjogbnVsbAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbmVlZGxlID0gewogICAgICAgICAgc291cmNlLAogICAgICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgImxpbmUiKSwKICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgImNvbHVtbiIpCiAgICAgICAgfTsKICAgICAgICBpZiAobmVlZGxlLm9yaWdpbmFsTGluZSA8IDEpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTGluZSBudW1iZXJzIG11c3QgYmUgPj0gMSIpOwogICAgICAgIH0KICAgICAgICBpZiAobmVlZGxlLm9yaWdpbmFsQ29sdW1uIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb2x1bW4gbnVtYmVycyBtdXN0IGJlID49IDAiKTsKICAgICAgICB9CiAgICAgICAgbGV0IGJpYXMgPSB1dGlsLmdldEFyZyhhQXJncywgImJpYXMiLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCk7CiAgICAgICAgaWYgKGJpYXMgPT0gbnVsbCkgewogICAgICAgICAgYmlhcyA9IFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EOwogICAgICAgIH0KICAgICAgICBsZXQgbWFwcGluZzsKICAgICAgICB0aGlzLl93YXNtLndpdGhNYXBwaW5nQ2FsbGJhY2soKG0pID0+IG1hcHBpbmcgPSBtLCAoKSA9PiB7CiAgICAgICAgICB0aGlzLl93YXNtLmV4cG9ydHMuZ2VuZXJhdGVkX2xvY2F0aW9uX2ZvcigKICAgICAgICAgICAgdGhpcy5fZ2V0TWFwcGluZ3NQdHIoKSwKICAgICAgICAgICAgbmVlZGxlLnNvdXJjZSwKICAgICAgICAgICAgbmVlZGxlLm9yaWdpbmFsTGluZSAtIDEsCiAgICAgICAgICAgIG5lZWRsZS5vcmlnaW5hbENvbHVtbiwKICAgICAgICAgICAgYmlhcwogICAgICAgICAgKTsKICAgICAgICB9KTsKICAgICAgICBpZiAobWFwcGluZykgewogICAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBuZWVkbGUuc291cmNlKSB7CiAgICAgICAgICAgIGxldCBsYXN0Q29sdW1uID0gbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uOwogICAgICAgICAgICBpZiAodGhpcy5fY29tcHV0ZWRDb2x1bW5TcGFucyAmJiBsYXN0Q29sdW1uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgbGFzdENvbHVtbiA9IEluZmluaXR5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgImdlbmVyYXRlZExpbmUiLCBudWxsKSwKICAgICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICJnZW5lcmF0ZWRDb2x1bW4iLCBudWxsKSwKICAgICAgICAgICAgICBsYXN0Q29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsaW5lOiBudWxsLAogICAgICAgICAgY29sdW1uOiBudWxsLAogICAgICAgICAgbGFzdENvbHVtbjogbnVsbAogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyOwogICAgZXhwb3J0czIuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7CiAgICB2YXIgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gY2xhc3MgZXh0ZW5kcyBTb3VyY2VNYXBDb25zdW1lciB7CiAgICAgIGNvbnN0cnVjdG9yKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHsKICAgICAgICByZXR1cm4gc3VwZXIoSU5URVJOQUwpLnRoZW4oKHRoYXQpID0+IHsKICAgICAgICAgIGxldCBzb3VyY2VNYXAgPSBhU291cmNlTWFwOwogICAgICAgICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAic3RyaW5nIikgewogICAgICAgICAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAidmVyc2lvbiIpOwogICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICJzZWN0aW9ucyIpOwogICAgICAgICAgaWYgKHZlcnNpb24gIT0gdGhhdC5fdmVyc2lvbikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHZlcnNpb246ICIgKyB2ZXJzaW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoYXQuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTsKICAgICAgICAgIHRoYXQuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7CiAgICAgICAgICB0aGF0Ll9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsOwogICAgICAgICAgdGhhdC5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsOwogICAgICAgICAgdGhhdC5fX2dlbmVyYXRlZE1hcHBpbmdzVW5zb3J0ZWQgPSBudWxsOwogICAgICAgICAgdGhhdC5fX29yaWdpbmFsTWFwcGluZ3NVbnNvcnRlZCA9IG51bGw7CiAgICAgICAgICBsZXQgbGFzdE9mZnNldCA9IHsKICAgICAgICAgICAgbGluZTogLTEsCiAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzZWN0aW9ucy5tYXAoKHMpID0+IHsKICAgICAgICAgICAgaWYgKHMudXJsKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHV0aWwuZ2V0QXJnKHMsICJvZmZzZXQiKTsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0TGluZSA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgImxpbmUiKTsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAiY29sdW1uIik7CiAgICAgICAgICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8IG9mZnNldExpbmUgPT09IGxhc3RPZmZzZXQubGluZSAmJiBvZmZzZXRDb2x1bW4gPCBsYXN0T2Zmc2V0LmNvbHVtbikgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2VjdGlvbiBvZmZzZXRzIG11c3QgYmUgb3JkZXJlZCBhbmQgbm9uLW92ZXJsYXBwaW5nLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgIGNvbnN0IGNvbnMgPSBuZXcgU291cmNlTWFwQ29uc3VtZXIodXRpbC5nZXRBcmcocywgIm1hcCIpLCBhU291cmNlTWFwVVJMKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnMudGhlbigoY29uc3VtZXIpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZ2VuZXJhdGVkT2Zmc2V0OiB7CiAgICAgICAgICAgICAgICAgIC8vIFRoZSBvZmZzZXQgZmllbGRzIGFyZSAwLWJhc2VkLCBidXQgd2UgdXNlIDEtYmFzZWQgaW5kaWNlcyB3aGVuCiAgICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLgogICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRMaW5lOiBvZmZzZXRMaW5lICsgMSwKICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBvZmZzZXRDb2x1bW4gKyAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29uc3VtZXIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pKS50aGVuKChzKSA9PiB7CiAgICAgICAgICAgIHRoYXQuX3NlY3Rpb25zID0gczsKICAgICAgICAgICAgcmV0dXJuIHRoYXQ7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZQogICAgICAvLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgIm1hcHBpbmdzIiBhdHRyaWJ1dGUuIFRoZXkKICAgICAgLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kCiAgICAgIC8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgZ2V0dGVycyByZXNwZWN0aXZlbHksIGFuZCB3ZSBvbmx5IHBhcnNlIHRoZSBtYXBwaW5ncwogICAgICAvLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2gKICAgICAgLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nCiAgICAgIC8vIHRoZW0gaXMgZXhwZW5zaXZlLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgaWYgd2UgbXVzdC4KICAgICAgLy8KICAgICAgLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybToKICAgICAgLy8KICAgICAgLy8gICAgIHsKICAgICAgLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwKICAgICAgLy8gICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsCiAgICAgIC8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXMKICAgICAgLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLAogICAgICAvLyAgICAgICBvcmlnaW5hbExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXQKICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLAogICAgICAvLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0CiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLAogICAgICAvLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mCiAgICAgIC8vICAgICAgICAgICAgIGNvZGUuCiAgICAgIC8vICAgICB9CiAgICAgIC8vCiAgICAgIC8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmUKICAgICAgLy8gYG51bGxgLgogICAgICAvLwogICAgICAvLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLgogICAgICAvLwogICAgICAvLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy4KICAgICAgZ2V0IF9nZW5lcmF0ZWRNYXBwaW5ncygpIHsKICAgICAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykgewogICAgICAgICAgdGhpcy5fc29ydEdlbmVyYXRlZE1hcHBpbmdzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7CiAgICAgIH0KICAgICAgZ2V0IF9vcmlnaW5hbE1hcHBpbmdzKCkgewogICAgICAgIGlmICghdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MpIHsKICAgICAgICAgIHRoaXMuX3NvcnRPcmlnaW5hbE1hcHBpbmdzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nczsKICAgICAgfQogICAgICBnZXQgX2dlbmVyYXRlZE1hcHBpbmdzVW5zb3J0ZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NVbnNvcnRlZCkgewogICAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc1Vuc29ydGVkOwogICAgICB9CiAgICAgIGdldCBfb3JpZ2luYWxNYXBwaW5nc1Vuc29ydGVkKCkgewogICAgICAgIGlmICghdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NVbnNvcnRlZCkgewogICAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzVW5zb3J0ZWQ7CiAgICAgIH0KICAgICAgX3NvcnRHZW5lcmF0ZWRNYXBwaW5ncygpIHsKICAgICAgICBjb25zdCBtYXBwaW5ncyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzVW5zb3J0ZWQ7CiAgICAgICAgbWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTsKICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBtYXBwaW5nczsKICAgICAgfQogICAgICBfc29ydE9yaWdpbmFsTWFwcGluZ3MoKSB7CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzVW5zb3J0ZWQ7CiAgICAgICAgbWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTsKICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG1hcHBpbmdzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLgogICAgICAgKi8KICAgICAgZ2V0IHNvdXJjZXMoKSB7CiAgICAgICAgY29uc3Qgc291cmNlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3VyY2VzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQKICAgICAgICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0CiAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgKgogICAgICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyCiAgICAgICAqICAgICBpcyAxLWJhc2VkLgogICAgICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW4KICAgICAgICogICAgIG51bWJlciBpcyAwLWJhc2VkLgogICAgICAgKgogICAgICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgKgogICAgICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuCiAgICAgICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZQogICAgICAgKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC4KICAgICAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZQogICAgICAgKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLgogICAgICAgKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuCiAgICAgICAqLwogICAgICBvcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7CiAgICAgICAgY29uc3QgbmVlZGxlID0gewogICAgICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICJsaW5lIiksCiAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAiY29sdW1uIikKICAgICAgICB9OwogICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2goCiAgICAgICAgICBuZWVkbGUsCiAgICAgICAgICB0aGlzLl9zZWN0aW9ucywKICAgICAgICAgIGZ1bmN0aW9uKGFOZWVkbGUsIHNlY3Rpb24yKSB7CiAgICAgICAgICAgIGNvbnN0IGNtcCA9IGFOZWVkbGUuZ2VuZXJhdGVkTGluZSAtIHNlY3Rpb24yLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lOwogICAgICAgICAgICBpZiAoY21wKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYU5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLSBzZWN0aW9uMi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uOwogICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07CiAgICAgICAgaWYgKCFzZWN0aW9uKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzb3VyY2U6IG51bGwsCiAgICAgICAgICAgIGxpbmU6IG51bGwsCiAgICAgICAgICAgIGNvbHVtbjogbnVsbCwKICAgICAgICAgICAgbmFtZTogbnVsbAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7CiAgICAgICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksCiAgICAgICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLSAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxIDogMCksCiAgICAgICAgICBiaWFzOiBhQXJncy5iaWFzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZQogICAgICAgKiBtYXAsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICovCiAgICAgIGhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbihzKSB7CiAgICAgICAgICByZXR1cm4gcy5jb25zdW1lci5oYXNDb250ZW50c09mQWxsU291cmNlcygpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGUKICAgICAgICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpcwogICAgICAgKiBhdmFpbGFibGUuCiAgICAgICAqLwogICAgICBzb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07CiAgICAgICAgICBjb25zdCBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpOwogICAgICAgICAgaWYgKGNvbnRlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChudWxsT25NaXNzaW5nKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCciJyArIGFTb3VyY2UgKyAnIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSwKICAgICAgICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoCiAgICAgICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgICoKICAgICAgICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICAgICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlcgogICAgICAgKiAgICAgaXMgMS1iYXNlZC4KICAgICAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW4KICAgICAgICogICAgIG51bWJlciBpcyAwLWJhc2VkLgogICAgICAgKgogICAgICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgKgogICAgICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlCiAgICAgICAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLgogICAgICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4KICAgICAgICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuCiAgICAgICAqLwogICAgICBnZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTsKICAgICAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICJzb3VyY2UiKSkgPT09IC0xKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUG9zaXRpb24gPSBzZWN0aW9uLmNvbnN1bWVyLmdlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKTsKICAgICAgICAgIGlmIChnZW5lcmF0ZWRQb3NpdGlvbikgewogICAgICAgICAgICBjb25zdCByZXQgPSB7CiAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksCiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gKyAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gZ2VuZXJhdGVkUG9zaXRpb24ubGluZSA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDEgOiAwKQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgbGluZTogbnVsbCwKICAgICAgICAgIGNvbHVtbjogbnVsbAogICAgICAgIH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHkKICAgICAgICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kCiAgICAgICAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuCiAgICAgICAqLwogICAgICBfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkgewogICAgICAgIGNvbnN0IGdlbmVyYXRlZE1hcHBpbmdzID0gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzVW5zb3J0ZWQgPSBbXTsKICAgICAgICBjb25zdCBvcmlnaW5hbE1hcHBpbmdzID0gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NVbnNvcnRlZCA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTsKICAgICAgICAgIGNvbnN0IHNlY3Rpb25NYXBwaW5ncyA9IFtdOwogICAgICAgICAgc2VjdGlvbi5jb25zdW1lci5lYWNoTWFwcGluZygobSkgPT4gc2VjdGlvbk1hcHBpbmdzLnB1c2gobSkpOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IHNlY3Rpb25NYXBwaW5nc1tqXTsKICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIG51bGwsIHRoaXMuX3NvdXJjZU1hcFVSTCk7CiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpOwogICAgICAgICAgICBsZXQgbmFtZSA9IG51bGw7CiAgICAgICAgICAgIGlmIChtYXBwaW5nLm5hbWUpIHsKICAgICAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobWFwcGluZy5uYW1lKTsKICAgICAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkTWFwcGluZyA9IHsKICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICsgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSwKICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICsgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDEgOiAwKSwKICAgICAgICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLAogICAgICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLAogICAgICAgICAgICAgIG5hbWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZ2VuZXJhdGVkTWFwcGluZ3MucHVzaChhZGp1c3RlZE1hcHBpbmcpOwogICAgICAgICAgICBpZiAodHlwZW9mIGFkanVzdGVkTWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7CiAgICAgICAgY29uc3QgY29udGV4dCA9IGFDb250ZXh0IHx8IG51bGw7CiAgICAgICAgY29uc3Qgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOwogICAgICAgIGxldCBtYXBwaW5nczsKICAgICAgICBzd2l0Y2ggKG9yZGVyKSB7CiAgICAgICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjoKICAgICAgICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOgogICAgICAgICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG9yZGVyIG9mIGl0ZXJhdGlvbi4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDsKICAgICAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24obWFwcGluZykgewogICAgICAgICAgbGV0IHNvdXJjZSA9IG51bGw7CiAgICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7CiAgICAgICAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSwKICAgICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiwKICAgICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSwKICAgICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sCiAgICAgICAgICAgIG5hbWU6IG1hcHBpbmcubmFtZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpCiAgICAgICAgICB9OwogICAgICAgIH0sIHRoaXMpLmZvckVhY2goYUNhbGxiYWNrLCBjb250ZXh0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsICJuZWVkbGUiIG1hcHBpbmcgdGhhdAogICAgICAgKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gImhheXN0YWNrIiBvZiBtYXBwaW5ncy4KICAgICAgICovCiAgICAgIF9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSwgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykgewogICAgICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgIiArIGFOZWVkbGVbYUxpbmVOYW1lXSk7CiAgICAgICAgfQogICAgICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgIiArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJpbmFyeVNlYXJjaC5zZWFyY2goYU5lZWRsZSwgYU1hcHBpbmdzLCBhQ29tcGFyYXRvciwgYUJpYXMpOwogICAgICB9CiAgICAgIGFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykgewogICAgICAgIGNvbnN0IGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgImxpbmUiKTsKICAgICAgICBjb25zdCBuZWVkbGUgPSB7CiAgICAgICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAic291cmNlIiksCiAgICAgICAgICBvcmlnaW5hbExpbmU6IGxpbmUsCiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICJjb2x1bW4iLCAwKQogICAgICAgIH07CiAgICAgICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTsKICAgICAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgaWYgKG5lZWRsZS5vcmlnaW5hbExpbmUgPCAxKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxpbmUgbnVtYmVycyBtdXN0IGJlID49IDEiKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5lZWRsZS5vcmlnaW5hbENvbHVtbiA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ29sdW1uIG51bWJlcnMgbXVzdCBiZSA+PSAwIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hcHBpbmdzID0gW107CiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoCiAgICAgICAgICBuZWVkbGUsCiAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLAogICAgICAgICAgIm9yaWdpbmFsTGluZSIsCiAgICAgICAgICAib3JpZ2luYWxDb2x1bW4iLAogICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucywKICAgICAgICAgIGJpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORAogICAgICAgICk7CiAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgIGxldCBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07CiAgICAgICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB2b2lkIDApIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7CiAgICAgICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHsKICAgICAgICAgICAgICBsZXQgbGFzdENvbHVtbiA9IG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbjsKICAgICAgICAgICAgICBpZiAodGhpcy5fY29tcHV0ZWRDb2x1bW5TcGFucyAmJiBsYXN0Q29sdW1uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsYXN0Q29sdW1uID0gSW5maW5pdHk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgImdlbmVyYXRlZExpbmUiLCBudWxsKSwKICAgICAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgImdlbmVyYXRlZENvbHVtbiIsIG51bGwpLAogICAgICAgICAgICAgICAgbGFzdENvbHVtbgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47CiAgICAgICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHsKICAgICAgICAgICAgICBsZXQgbGFzdENvbHVtbiA9IG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbjsKICAgICAgICAgICAgICBpZiAodGhpcy5fY29tcHV0ZWRDb2x1bW5TcGFucyAmJiBsYXN0Q29sdW1uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsYXN0Q29sdW1uID0gSW5maW5pdHk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgImdlbmVyYXRlZExpbmUiLCBudWxsKSwKICAgICAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgImdlbmVyYXRlZENvbHVtbiIsIG51bGwpLAogICAgICAgICAgICAgICAgbGFzdENvbHVtbgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXBwaW5nczsKICAgICAgfQogICAgICBkZXN0cm95KCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIgPSBJbmRleGVkU291cmNlTWFwQ29uc3VtZXI7CiAgICBmdW5jdGlvbiBfZmFjdG9yeShhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7CiAgICAgIGxldCBzb3VyY2VNYXAgPSBhU291cmNlTWFwOwogICAgICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICJzdHJpbmciKSB7CiAgICAgICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnN1bWVyID0gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGwgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkgOiBuZXcgQmFzaWNTb3VyY2VNYXBDb25zdW1lcihzb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbnN1bWVyKTsKICAgIH0KICAgIGZ1bmN0aW9uIF9mYWN0b3J5QlNNKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHsKICAgICAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMKdmFyIHJlcXVpcmVfc291cmNlX25vZGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvc291cmNlLW1hcC1ucG0tMC43LjQtYmM4ZDAxOGFiNi1hMGY3YzliNzk3LnppcC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMiKGV4cG9ydHMyKSB7CiAgICB2YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZV9zb3VyY2VfbWFwX2dlbmVyYXRvcigpLlNvdXJjZU1hcEdlbmVyYXRvcjsKICAgIHZhciB1dGlsID0gcmVxdWlyZV91dGlsMigpOwogICAgdmFyIFJFR0VYX05FV0xJTkUgPSAvKFxyP1xuKS87CiAgICB2YXIgTkVXTElORV9DT0RFID0gMTA7CiAgICB2YXIgaXNTb3VyY2VOb2RlID0gIiQkJGlzU291cmNlTm9kZSQkJCI7CiAgICB2YXIgU291cmNlTm9kZSA9IGNsYXNzIF9Tb3VyY2VOb2RlIHsKICAgICAgY29uc3RydWN0b3IoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7CiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgIHRoaXMuc291cmNlQ29udGVudHMgPSB7fTsKICAgICAgICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lOwogICAgICAgIHRoaXMuY29sdW1uID0gYUNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGFDb2x1bW47CiAgICAgICAgdGhpcy5zb3VyY2UgPSBhU291cmNlID09IG51bGwgPyBudWxsIDogYVNvdXJjZTsKICAgICAgICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lOwogICAgICAgIHRoaXNbaXNTb3VyY2VOb2RlXSA9IHRydWU7CiAgICAgICAgaWYgKGFDaHVua3MgIT0gbnVsbCkgdGhpcy5hZGQoYUNodW5rcyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICogQHBhcmFtIGFSZWxhdGl2ZVBhdGggT3B0aW9uYWwuIFRoZSBwYXRoIHRoYXQgcmVsYXRpdmUgc291cmNlcyBpbiB0aGUKICAgICAgICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by4KICAgICAgICovCiAgICAgIHN0YXRpYyBmcm9tU3RyaW5nV2l0aFNvdXJjZU1hcChhR2VuZXJhdGVkQ29kZSwgYVNvdXJjZU1hcENvbnN1bWVyLCBhUmVsYXRpdmVQYXRoKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBfU291cmNlTm9kZSgpOwogICAgICAgIGNvbnN0IHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7CiAgICAgICAgbGV0IHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwOwogICAgICAgIGNvbnN0IHNoaWZ0TmV4dExpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50cyA9IGdldE5leHRMaW5lKCk7CiAgICAgICAgICBjb25zdCBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCAiIjsKICAgICAgICAgIHJldHVybiBsaW5lQ29udGVudHMgKyBuZXdMaW5lOwogICAgICAgICAgZnVuY3Rpb24gZ2V0TmV4dExpbmUoKSB7CiAgICAgICAgICAgIHJldHVybiByZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoID8gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleCsrXSA6IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGxldCBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwOwogICAgICAgIGxldCBsYXN0TWFwcGluZyA9IG51bGw7CiAgICAgICAgbGV0IG5leHRMaW5lOwogICAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbihtYXBwaW5nKSB7CiAgICAgICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7CiAgICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpOwogICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7CiAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAiIjsKICAgICAgICAgICAgICBjb25zdCBjb2RlID0gbmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gbGFzdEdlbmVyYXRlZENvbHVtbik7CiAgICAgICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLSBsYXN0R2VuZXJhdGVkQ29sdW1uKTsKICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47CiAgICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTsKICAgICAgICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHsKICAgICAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTsKICAgICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHsKICAgICAgICAgICAgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAiIjsKICAgICAgICAgICAgbm9kZS5hZGQobmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSk7CiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKTsKICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uOwogICAgICAgICAgfQogICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nOwogICAgICAgIH0sIHRoaXMpOwogICAgICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAobGFzdE1hcHBpbmcpIHsKICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpOwogICAgICAgICAgfQogICAgICAgICAgbm9kZS5hZGQocmVtYWluaW5nTGluZXMuc3BsaWNlKHJlbWFpbmluZ0xpbmVzSW5kZXgpLmpvaW4oIiIpKTsKICAgICAgICB9CiAgICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbihzb3VyY2VGaWxlKSB7CiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7CiAgICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHsKICAgICAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIHNvdXJjZUZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICBmdW5jdGlvbiBhZGRNYXBwaW5nV2l0aENvZGUobWFwcGluZywgY29kZSkgewogICAgICAgICAgaWYgKG1hcHBpbmcgPT09IG51bGwgfHwgbWFwcGluZy5zb3VyY2UgPT09IHZvaWQgMCkgewogICAgICAgICAgICBub2RlLmFkZChjb2RlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGggPyB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgbWFwcGluZy5zb3VyY2UpIDogbWFwcGluZy5zb3VyY2U7CiAgICAgICAgICAgIG5vZGUuYWRkKG5ldyBfU291cmNlTm9kZSgKICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSwKICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLAogICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICBjb2RlLAogICAgICAgICAgICAgIG1hcHBpbmcubmFtZQogICAgICAgICAgICApKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGlzIHNvdXJjZSBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2YKICAgICAgICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuCiAgICAgICAqLwogICAgICBhZGQoYUNodW5rKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkgewogICAgICAgICAgYUNodW5rLmZvckVhY2goZnVuY3Rpb24oY2h1bmspIHsKICAgICAgICAgICAgdGhpcy5hZGQoY2h1bmspOwogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSAic3RyaW5nIikgewogICAgICAgICAgaWYgKGFDaHVuaykgewogICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290ICIgKyBhQ2h1bmsKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2YKICAgICAgICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuCiAgICAgICAqLwogICAgICBwcmVwZW5kKGFDaHVuaykgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSBhQ2h1bmsubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgdGhpcy5wcmVwZW5kKGFDaHVua1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSAic3RyaW5nIikgewogICAgICAgICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAgICJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCAiICsgYUNodW5rCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICAvKioKICAgICAgICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIEpTIHNuaXBwZXRzIGluIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLiBUaGUKICAgICAgICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdAogICAgICAgKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi4KICAgICAgICovCiAgICAgIHdhbGsoYUZuKSB7CiAgICAgICAgbGV0IGNodW5rOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBjaHVuayA9IHRoaXMuY2hpbGRyZW5baV07CiAgICAgICAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkgewogICAgICAgICAgICBjaHVuay53YWxrKGFGbik7CiAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rICE9PSAiIikgewogICAgICAgICAgICBhRm4oY2h1bmssIHsKICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLAogICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSwKICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLAogICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlbgogICAgICAgKiBlYWNoIG9mIGB0aGlzLmNoaWxkcmVuYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci4KICAgICAgICovCiAgICAgIGpvaW4oYVNlcCkgewogICAgICAgIGxldCBuZXdDaGlsZHJlbjsKICAgICAgICBsZXQgaTsKICAgICAgICBjb25zdCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICBpZiAobGVuID4gMCkgewogICAgICAgICAgbmV3Q2hpbGRyZW4gPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTsKICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChhU2VwKTsKICAgICAgICAgIH0KICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7CiAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWwKICAgICAgICogZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kIG9mIGEgc291cmNlIG5vZGUsIGV0Yy4KICAgICAgICoKICAgICAgICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuCiAgICAgICAqIEBwYXJhbSBhUmVwbGFjZW1lbnQgVGhlIHRoaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm4gd2l0aC4KICAgICAgICovCiAgICAgIHJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KSB7CiAgICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICAgIGlmIChsYXN0Q2hpbGRbaXNTb3VyY2VOb2RlXSkgewogICAgICAgICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPSBsYXN0Q2hpbGQucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKCIiLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IKICAgICAgICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZQogICAgICAgKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlCiAgICAgICAqLwogICAgICBzZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkgewogICAgICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBTb3VyY2VOb2Rlcy4gVGhlIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoCiAgICAgICAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uCiAgICAgICAqLwogICAgICB3YWxrU291cmNlQ29udGVudHMoYUZuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHsKICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUuIFdhbGtzIG92ZXIgdGhlIHRyZWUKICAgICAgICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy4KICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgICB0aGlzLndhbGsoZnVuY3Rpb24oY2h1bmspIHsKICAgICAgICAgIHN0ciArPSBjaHVuazsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc3RyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZSBhbG9uZyB3aXRoIGEgc291cmNlCiAgICAgICAqIG1hcC4KICAgICAgICovCiAgICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykgewogICAgICAgIGNvbnN0IGdlbmVyYXRlZCA9IHsKICAgICAgICAgIGNvZGU6ICIiLAogICAgICAgICAgbGluZTogMSwKICAgICAgICAgIGNvbHVtbjogMAogICAgICAgIH07CiAgICAgICAgY29uc3QgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncyk7CiAgICAgICAgbGV0IHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTsKICAgICAgICBsZXQgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDsKICAgICAgICBsZXQgbGFzdE9yaWdpbmFsTGluZSA9IG51bGw7CiAgICAgICAgbGV0IGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7CiAgICAgICAgbGV0IGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsOwogICAgICAgIHRoaXMud2FsayhmdW5jdGlvbihjaHVuaywgb3JpZ2luYWwpIHsKICAgICAgICAgIGdlbmVyYXRlZC5jb2RlICs9IGNodW5rOwogICAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lICE9PSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAobGFzdE9yaWdpbmFsU291cmNlICE9PSBvcmlnaW5hbC5zb3VyY2UgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZSB8fCBsYXN0T3JpZ2luYWxDb2x1bW4gIT09IG9yaWdpbmFsLmNvbHVtbiB8fCBsYXN0T3JpZ2luYWxOYW1lICE9PSBvcmlnaW5hbC5uYW1lKSB7CiAgICAgICAgICAgICAgbWFwLmFkZE1hcHBpbmcoewogICAgICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsCiAgICAgICAgICAgICAgICBvcmlnaW5hbDogewogICAgICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLAogICAgICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtbgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdlbmVyYXRlZDogewogICAgICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSwKICAgICAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTsKICAgICAgICAgICAgbGFzdE9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7CiAgICAgICAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjsKICAgICAgICAgICAgbGFzdE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsLm5hbWU7CiAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7CiAgICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHsKICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHsKICAgICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLAogICAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDsKICAgICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuZ3RoID0gY2h1bmsubGVuZ3RoOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICAgIGlmIChjaHVuay5jaGFyQ29kZUF0KGlkeCkgPT09IE5FV0xJTkVfQ09ERSkgewogICAgICAgICAgICAgIGdlbmVyYXRlZC5saW5lKys7CiAgICAgICAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDsKICAgICAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHsKICAgICAgICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHsKICAgICAgICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsCiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSwKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtbgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHsKICAgICAgICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSwKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4KICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMud2Fsa1NvdXJjZUNvbnRlbnRzKGZ1bmN0aW9uKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHsKICAgICAgICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7IGNvZGU6IGdlbmVyYXRlZC5jb2RlLCBtYXAgfTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL3NvdXJjZS1tYXAuanMKdmFyIHJlcXVpcmVfc291cmNlX21hcCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9zb3VyY2UtbWFwLW5wbS0wLjcuNC1iYzhkMDE4YWI2LWEwZjdjOWI3OTcuemlwL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL3NvdXJjZS1tYXAuanMiKGV4cG9ydHMyKSB7CiAgICBleHBvcnRzMi5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlX3NvdXJjZV9tYXBfZ2VuZXJhdG9yKCkuU291cmNlTWFwR2VuZXJhdG9yOwogICAgZXhwb3J0czIuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlX3NvdXJjZV9tYXBfY29uc3VtZXIoKS5Tb3VyY2VNYXBDb25zdW1lcjsKICAgIGV4cG9ydHMyLlNvdXJjZU5vZGUgPSByZXF1aXJlX3NvdXJjZV9ub2RlKCkuU291cmNlTm9kZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvdGVtcGxhdGUuanMKdmFyIHJlcXVpcmVfdGVtcGxhdGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvdGVtcGxhdGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRlbXBsYXRlUGFyc2VyID0gdGVtcGxhdGVQYXJzZXI7CiAgICBleHBvcnRzMi50ZW1wbGF0ZSA9IHRlbXBsYXRlMzsKICAgIHZhciBzb3VyY2VfbWFwXzEgPSByZXF1aXJlX3NvdXJjZV9tYXAoKTsKICAgIHZhciBrSW50ZXJwb2xhdGVSZSA9IC88JT0oW1xzXFNdKz8pJT4vZzsKICAgIHZhciBrQ29tbWVudFJlID0gLzwlIyhbXHNcU10rPyklPi9nOwogICAgdmFyIGtFc2NhcGVSZSA9IC88JS0oW1xzXFNdKz8pJT4vZzsKICAgIHZhciBrRXZhbHVhdGVSZSA9IC88JShbXHNcU10rPyklPi9nOwogICAgdmFyIGtIdG1sRXNjYXBlcyA9IHsKICAgICAgIiYiOiAiJmFtcDsiLAogICAgICAiPCI6ICImbHQ7IiwKICAgICAgIj4iOiAiJmd0OyIsCiAgICAgICciJzogIiZxdW90OyIsCiAgICAgICInIjogIiYjMzk7IiwKICAgICAgImAiOiAiJiM5NjsiCiAgICB9OwogICAgdmFyIHJlVW5lc2NhcGVkSHRtbCA9IG5ldyBSZWdFeHAoYFske09iamVjdC5rZXlzKGtIdG1sRXNjYXBlcykuam9pbigiIil9XWAsICJnIik7CiAgICBmdW5jdGlvbiBfcG9zaXRpb25Gb3IoY29udGVudCwgb2Zmc2V0KSB7CiAgICAgIGxldCBsaW5lID0gMTsKICAgICAgbGV0IGNvbHVtbiA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2Zmc2V0IC0gMTsgaSsrKSB7CiAgICAgICAgaWYgKGNvbnRlbnRbaV0gPT0gIlxuIikgewogICAgICAgICAgbGluZSsrOwogICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29sdW1uKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbGluZSwKICAgICAgICBjb2x1bW4KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlUGFyc2VyKHNvdXJjZVRleHQsIGZpbGVOYW1lKSB7CiAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICAgIGNvbnN0IHJlRXhwcmVzc2lvbnMgPSBba0VzY2FwZVJlLCBrQ29tbWVudFJlLCBrSW50ZXJwb2xhdGVSZSwga0V2YWx1YXRlUmVdOwogICAgICBjb25zdCByZURlbGltaXRlcnMgPSBSZWdFeHAocmVFeHByZXNzaW9ucy5tYXAoKHgpID0+IHguc291cmNlKS5qb2luKCJ8IikgKyAifCQiLCAiZyIpOwogICAgICBjb25zdCBwYXJzZWQgPSBzb3VyY2VUZXh0LnNwbGl0KHJlRGVsaW1pdGVycyk7CiAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICBsZXQgc3RhcnQgPSBfcG9zaXRpb25Gb3Ioc291cmNlVGV4dCwgb2Zmc2V0KTsKICAgICAgbGV0IGVuZDsKICAgICAgY29uc3QgaW5jcmVtZW50ID0gcmVFeHByZXNzaW9ucy5sZW5ndGggKyAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkgKz0gaW5jcmVtZW50KSB7CiAgICAgICAgY29uc3QgW2NvbnRlbnQsIGVzY2FwZTIsIGNvbW1lbnQsIGludGVycG9sYXRlLCBldmFsdWF0ZV0gPSBwYXJzZWQuc2xpY2UoaSwgaSArIGluY3JlbWVudCk7CiAgICAgICAgaWYgKGNvbnRlbnQpIHsKICAgICAgICAgIGVuZCA9IF9wb3NpdGlvbkZvcihzb3VyY2VUZXh0LCBvZmZzZXQgKyBjb250ZW50Lmxlbmd0aCk7CiAgICAgICAgICBvZmZzZXQgKz0gY29udGVudC5sZW5ndGg7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsga2luZDogImNvbnRlbnQiLCBjb250ZW50LCBzdGFydCwgZW5kIH0pOwogICAgICAgICAgc3RhcnQgPSBlbmQ7CiAgICAgICAgfQogICAgICAgIGlmIChlc2NhcGUyKSB7CiAgICAgICAgICBlbmQgPSBfcG9zaXRpb25Gb3Ioc291cmNlVGV4dCwgb2Zmc2V0ICsgZXNjYXBlMi5sZW5ndGggKyA1KTsKICAgICAgICAgIG9mZnNldCArPSBlc2NhcGUyLmxlbmd0aCArIDU7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsga2luZDogImVzY2FwZSIsIGV4cHJlc3Npb246IGVzY2FwZTIsIHN0YXJ0LCBlbmQgfSk7CiAgICAgICAgICBzdGFydCA9IGVuZDsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbW1lbnQpIHsKICAgICAgICAgIGVuZCA9IF9wb3NpdGlvbkZvcihzb3VyY2VUZXh0LCBvZmZzZXQgKyBjb21tZW50Lmxlbmd0aCArIDUpOwogICAgICAgICAgb2Zmc2V0ICs9IGNvbW1lbnQubGVuZ3RoICsgNTsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goeyBraW5kOiAiY29tbWVudCIsIHRleHQ6IGNvbW1lbnQsIHN0YXJ0LCBlbmQgfSk7CiAgICAgICAgICBzdGFydCA9IGVuZDsKICAgICAgICB9CiAgICAgICAgaWYgKGludGVycG9sYXRlKSB7CiAgICAgICAgICBlbmQgPSBfcG9zaXRpb25Gb3Ioc291cmNlVGV4dCwgb2Zmc2V0ICsgaW50ZXJwb2xhdGUubGVuZ3RoICsgNSk7CiAgICAgICAgICBvZmZzZXQgKz0gaW50ZXJwb2xhdGUubGVuZ3RoICsgNTsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goewogICAgICAgICAgICBraW5kOiAiaW50ZXJwb2xhdGUiLAogICAgICAgICAgICBleHByZXNzaW9uOiBpbnRlcnBvbGF0ZSwKICAgICAgICAgICAgc3RhcnQsCiAgICAgICAgICAgIGVuZAogICAgICAgICAgfSk7CiAgICAgICAgICBzdGFydCA9IGVuZDsKICAgICAgICB9CiAgICAgICAgaWYgKGV2YWx1YXRlKSB7CiAgICAgICAgICBlbmQgPSBfcG9zaXRpb25Gb3Ioc291cmNlVGV4dCwgb2Zmc2V0ICsgZXZhbHVhdGUubGVuZ3RoICsgNSk7CiAgICAgICAgICBvZmZzZXQgKz0gZXZhbHVhdGUubGVuZ3RoICsgNTsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goeyBraW5kOiAiZXZhbHVhdGUiLCBleHByZXNzaW9uOiBldmFsdWF0ZSwgc3RhcnQsIGVuZCB9KTsKICAgICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGZpbGVOYW1lLAogICAgICAgIGNvbnRlbnQ6IHNvdXJjZVRleHQsCiAgICAgICAgY2hpbGRyZW4KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlRmFzdChhc3QsIG9wdGlvbnMpIHsKICAgICAgY29uc3QgbW9kdWxlMyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tb2R1bGUgPyAibW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IiA6ICIiOwogICAgICBjb25zdCByZUh0bWxFc2NhcGUgPSByZVVuZXNjYXBlZEh0bWwuc291cmNlLnJlcGxhY2UoL1snXS9nLCAiXFxcXFxcJyIpOwogICAgICByZXR1cm4gYAogICAgcmV0dXJuICR7bW9kdWxlM30gZnVuY3Rpb24ob2JqKSB7CiAgICAgIG9iaiB8fCAob2JqID0ge30pOwogICAgICBsZXQgX190OwogICAgICBsZXQgX19wID0gJyc7CiAgICAgIGNvbnN0IF9fZXNjYXBlcyA9ICR7SlNPTi5zdHJpbmdpZnkoa0h0bWxFc2NhcGVzKX07CiAgICAgIGNvbnN0IF9fZXNjYXBlc3JlID0gbmV3IFJlZ0V4cCgnJHtyZUh0bWxFc2NhcGV9JywgJ2cnKTsKCiAgICAgIGNvbnN0IF9fZSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcyA/IHMucmVwbGFjZShfX2VzY2FwZXNyZSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiBfX2VzY2FwZXNba2V5XTsgfSkgOiAnJzsKICAgICAgfTsKICAgICAgd2l0aCAob2JqKSB7CiAgICAgICAgJHthc3QuY2hpbGRyZW4ubWFwKChub2RlKSA9PiB7CiAgICAgICAgc3dpdGNoIChub2RlLmtpbmQpIHsKICAgICAgICAgIGNhc2UgImNvbnRlbnQiOgogICAgICAgICAgICByZXR1cm4gYF9fcCArPSAke0pTT04uc3RyaW5naWZ5KG5vZGUuY29udGVudCl9O2A7CiAgICAgICAgICBjYXNlICJpbnRlcnBvbGF0ZSI6CiAgICAgICAgICAgIHJldHVybiBgX19wICs9ICgoX190ID0gKCR7bm9kZS5leHByZXNzaW9ufSkpID09IG51bGwpID8gJycgOiBfX3Q7YDsKICAgICAgICAgIGNhc2UgImVzY2FwZSI6CiAgICAgICAgICAgIHJldHVybiBgX19wICs9IF9fZSgke25vZGUuZXhwcmVzc2lvbn0pO2A7CiAgICAgICAgICBjYXNlICJldmFsdWF0ZSI6CiAgICAgICAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb247CiAgICAgICAgfQogICAgICB9KS5qb2luKCJcbiIpfQogICAgICB9CgogICAgICByZXR1cm4gX19wOwogICAgfTsKICBgOwogICAgfQogICAgZnVuY3Rpb24gdGVtcGxhdGVXaXRoU291cmNlTWFwKGFzdCwgb3B0aW9ucykgewogICAgICBjb25zdCBzb3VyY2VVcmwgPSBhc3QuZmlsZU5hbWU7CiAgICAgIGNvbnN0IG1vZHVsZTMgPSBvcHRpb25zICYmIG9wdGlvbnMubW9kdWxlID8gIm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSIgOiAiIjsKICAgICAgY29uc3QgcmVIdG1sRXNjYXBlID0gcmVVbmVzY2FwZWRIdG1sLnNvdXJjZS5yZXBsYWNlKC9bJ10vZywgIlxcXFxcXCciKTsKICAgICAgY29uc3QgcHJlYW1ibGUgPSBuZXcgc291cmNlX21hcF8xLlNvdXJjZU5vZGUoMSwgMCwgc291cmNlVXJsLCAiIikuYWRkKG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZSgxLCAwLCBzb3VyY2VVcmwsIFsKICAgICAgICBgcmV0dXJuICR7bW9kdWxlM30gZnVuY3Rpb24ob2JqKSB7CmAsCiAgICAgICAgIiAgb2JqIHx8IChvYmogPSB7fSk7XG4iLAogICAgICAgICIgIGxldCBfX3Q7XG4iLAogICAgICAgICcgIGxldCBfX3AgPSAiIjtcbicsCiAgICAgICAgYCAgY29uc3QgX19lc2NhcGVzID0gJHtKU09OLnN0cmluZ2lmeShrSHRtbEVzY2FwZXMpfTsKYCwKICAgICAgICBgICBjb25zdCBfX2VzY2FwZXNyZSA9IG5ldyBSZWdFeHAoJyR7cmVIdG1sRXNjYXBlfScsICdnJyk7CmAsCiAgICAgICAgYApgLAogICAgICAgIGAgIGNvbnN0IF9fZSA9IGZ1bmN0aW9uKHMpIHsgYCwKICAgICAgICBgICAgIHJldHVybiBzID8gcy5yZXBsYWNlKF9fZXNjYXBlc3JlLCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIF9fZXNjYXBlc1trZXldOyB9KSA6ICcnO2AsCiAgICAgICAgYCAgfTsKYCwKICAgICAgICBgICB3aXRoIChvYmopIHsKYAogICAgICBdKSk7CiAgICAgIGNvbnN0IGVuZCA9IGFzdC5jaGlsZHJlbi5sZW5ndGggPyBhc3QuY2hpbGRyZW5bYXN0LmNoaWxkcmVuLmxlbmd0aCAtIDFdLmVuZCA6IHsgbGluZTogMCwgY29sdW1uOiAwIH07CiAgICAgIGNvbnN0IG5vZGVzID0gYXN0LmNoaWxkcmVuLnJlZHVjZSgoY2h1bmssIG5vZGUpID0+IHsKICAgICAgICBsZXQgY29kZTIgPSAiIjsKICAgICAgICBzd2l0Y2ggKG5vZGUua2luZCkgewogICAgICAgICAgY2FzZSAiY29udGVudCI6CiAgICAgICAgICAgIGNvZGUyID0gWwogICAgICAgICAgICAgIG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZShub2RlLnN0YXJ0LmxpbmUsIG5vZGUuc3RhcnQuY29sdW1uLCBzb3VyY2VVcmwsICJfX3AgPSBfX3AiKSwKICAgICAgICAgICAgICAuLi5ub2RlLmNvbnRlbnQuc3BsaXQoIlxuIikubWFwKChsaW5lLCBpLCBhcnIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc291cmNlX21hcF8xLlNvdXJjZU5vZGUobm9kZS5zdGFydC5saW5lICsgaSwgaSA9PSAwID8gbm9kZS5zdGFydC5jb2x1bW4gOiAwLCBzb3VyY2VVcmwsICJcbiAgICArICIgKyBKU09OLnN0cmluZ2lmeShsaW5lICsgKGkgPT0gYXJyLmxlbmd0aCAtIDEgPyAiIiA6ICJcbiIpKSk7CiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgbmV3IHNvdXJjZV9tYXBfMS5Tb3VyY2VOb2RlKG5vZGUuZW5kLmxpbmUsIG5vZGUuZW5kLmNvbHVtbiwgc291cmNlVXJsLCAiO1xuIikKICAgICAgICAgICAgXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJpbnRlcnBvbGF0ZSI6CiAgICAgICAgICAgIGNvZGUyID0gWwogICAgICAgICAgICAgIG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZShub2RlLnN0YXJ0LmxpbmUsIG5vZGUuc3RhcnQuY29sdW1uLCBzb3VyY2VVcmwsICJfX3AgKz0gKChfX3QgPSAiKSwKICAgICAgICAgICAgICAuLi5ub2RlLmV4cHJlc3Npb24uc3BsaXQoIlxuIikubWFwKChsaW5lLCBpLCBhcnIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc291cmNlX21hcF8xLlNvdXJjZU5vZGUobm9kZS5zdGFydC5saW5lICsgaSwgaSA9PSAwID8gbm9kZS5zdGFydC5jb2x1bW4gOiAwLCBzb3VyY2VVcmwsIGxpbmUgKyAoaSA9PSBhcnIubGVuZ3RoIC0gMSA/ICIiIDogIlxuIikpOwogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZShub2RlLmVuZC5saW5lLCBub2RlLmVuZC5jb2x1bW4sIHNvdXJjZVVybCwgJykgPT0gbnVsbCA/ICIiIDogX190KTtcbicpCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZXNjYXBlIjoKICAgICAgICAgICAgY29kZTIgPSBbCiAgICAgICAgICAgICAgbmV3IHNvdXJjZV9tYXBfMS5Tb3VyY2VOb2RlKG5vZGUuc3RhcnQubGluZSwgbm9kZS5zdGFydC5jb2x1bW4sIHNvdXJjZVVybCwgIl9fcCArPSBfX2UoIiksCiAgICAgICAgICAgICAgLi4ubm9kZS5leHByZXNzaW9uLnNwbGl0KCJcbiIpLm1hcCgobGluZSwgaSwgYXJyKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNvdXJjZV9tYXBfMS5Tb3VyY2VOb2RlKG5vZGUuc3RhcnQubGluZSArIGksIGkgPT0gMCA/IG5vZGUuc3RhcnQuY29sdW1uIDogMCwgc291cmNlVXJsLCBsaW5lICsgKGkgPT0gYXJyLmxlbmd0aCAtIDEgPyAiIiA6ICJcbiIpKTsKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICBuZXcgc291cmNlX21hcF8xLlNvdXJjZU5vZGUobm9kZS5lbmQubGluZSwgbm9kZS5lbmQuY29sdW1uLCBzb3VyY2VVcmwsICIpO1xuIikKICAgICAgICAgICAgXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJldmFsdWF0ZSI6CiAgICAgICAgICAgIGNvZGUyID0gWwogICAgICAgICAgICAgIC4uLm5vZGUuZXhwcmVzc2lvbi5zcGxpdCgiXG4iKS5tYXAoKGxpbmUsIGksIGFycikgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZShub2RlLnN0YXJ0LmxpbmUgKyBpLCBpID09IDAgPyBub2RlLnN0YXJ0LmNvbHVtbiA6IDAsIHNvdXJjZVVybCwgbGluZSArIChpID09IGFyci5sZW5ndGggLSAxID8gIiIgOiAiXG4iKSk7CiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgbmV3IHNvdXJjZV9tYXBfMS5Tb3VyY2VOb2RlKG5vZGUuZW5kLmxpbmUsIG5vZGUuZW5kLmNvbHVtbiwgc291cmNlVXJsLCAiXG4iKQogICAgICAgICAgICBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNodW5rLmFkZChuZXcgc291cmNlX21hcF8xLlNvdXJjZU5vZGUobm9kZS5zdGFydC5saW5lLCBub2RlLnN0YXJ0LmNvbHVtbiwgc291cmNlVXJsLCBjb2RlMikpOwogICAgICB9LCBwcmVhbWJsZSkuYWRkKG5ldyBzb3VyY2VfbWFwXzEuU291cmNlTm9kZShlbmQubGluZSwgZW5kLmNvbHVtbiwgc291cmNlVXJsLCBbIiAgfTtcbiIsICJcbiIsICIgIHJldHVybiBfX3A7XG4iLCAifVxuIl0pKTsKICAgICAgY29uc3QgY29kZSA9IG5vZGVzLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7CiAgICAgICAgZmlsZTogc291cmNlVXJsLAogICAgICAgIHNvdXJjZVJvb3Q6IG9wdGlvbnMgJiYgb3B0aW9ucy5zb3VyY2VSb290IHx8ICIuIgogICAgICB9KTsKICAgICAgY29kZS5tYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VVcmwsIGFzdC5jb250ZW50KTsKICAgICAgcmV0dXJuIGNvZGUuY29kZSArICJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIiArIEJ1ZmZlci5mcm9tKGNvZGUubWFwLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCJiYXNlNjQiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlMyhjb250ZW50LCBvcHRpb25zKSB7CiAgICAgIGNvbnN0IHNvdXJjZVVybCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zb3VyY2VVUkwgfHwgImVqcyI7CiAgICAgIGNvbnN0IGFzdCA9IHRlbXBsYXRlUGFyc2VyKGNvbnRlbnQsIHNvdXJjZVVybCk7CiAgICAgIGxldCBzb3VyY2U7CiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc291cmNlTWFwKSB7CiAgICAgICAgc291cmNlID0gdGVtcGxhdGVXaXRoU291cmNlTWFwKGFzdCwgb3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc291cmNlID0gdGVtcGxhdGVGYXN0KGFzdCwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgY29uc3QgZm4gPSBGdW5jdGlvbigibW9kdWxlIiwgc291cmNlKTsKICAgICAgY29uc3QgbW9kdWxlMyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tb2R1bGUgPyBvcHRpb25zLm1vZHVsZSA9PT0gdHJ1ZSA/IHsgZXhwb3J0czoge30gfSA6IG9wdGlvbnMubW9kdWxlIDogbnVsbDsKICAgICAgY29uc3QgcmVzdWx0ID0gZm4obW9kdWxlMyk7CiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL3BhcnRpYWxseS1vcmRlcmVkLXNldC5qcwp2YXIgcmVxdWlyZV9wYXJ0aWFsbHlfb3JkZXJlZF9zZXQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvcGFydGlhbGx5LW9yZGVyZWQtc2V0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5QYXJ0aWFsbHlPcmRlcmVkU2V0ID0gZXhwb3J0czIuQ2lyY3VsYXJEZXBlbmRlbmN5Rm91bmRFeGNlcHRpb24gPSBleHBvcnRzMi5EZXBlbmRlbmN5Tm90Rm91bmRFeGNlcHRpb24gPSB2b2lkIDA7CiAgICB2YXIgZXhjZXB0aW9uXzEgPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIERlcGVuZGVuY3lOb3RGb3VuZEV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgZXhjZXB0aW9uXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCJPbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBpcyBub3QgcGFydCBvZiB0aGUgc2V0LiIpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRGVwZW5kZW5jeU5vdEZvdW5kRXhjZXB0aW9uID0gRGVwZW5kZW5jeU5vdEZvdW5kRXhjZXB0aW9uOwogICAgdmFyIENpcmN1bGFyRGVwZW5kZW5jeUZvdW5kRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBleGNlcHRpb25fMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoIkNpcmN1bGFyIGRlcGVuZGVuY2llcyBmb3VuZC4iKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNpcmN1bGFyRGVwZW5kZW5jeUZvdW5kRXhjZXB0aW9uID0gQ2lyY3VsYXJEZXBlbmRlbmN5Rm91bmRFeGNlcHRpb247CiAgICB2YXIgUGFydGlhbGx5T3JkZXJlZFNldCA9IGNsYXNzIHsKICAgICAgX2l0ZW1zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgX2NoZWNrQ2lyY3VsYXJEZXBlbmRlbmNpZXMoaXRlbSwgZGVwcykgewogICAgICAgIGlmIChkZXBzLmhhcyhpdGVtKSkgewogICAgICAgICAgdGhyb3cgbmV3IENpcmN1bGFyRGVwZW5kZW5jeUZvdW5kRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGRlcHMuZm9yRWFjaCgoZGVwKSA9PiB0aGlzLl9jaGVja0NpcmN1bGFyRGVwZW5kZW5jaWVzKGl0ZW0sIHRoaXMuX2l0ZW1zLmdldChkZXApIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKTsKICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICB0aGlzLl9pdGVtcy5jbGVhcigpOwogICAgICB9CiAgICAgIGhhcyhpdGVtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmhhcyhpdGVtKTsKICAgICAgfQogICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMuc2l6ZTsKICAgICAgfQogICAgICBmb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IHggb2YgdGhpcykgewogICAgICAgICAgY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIHgsIHgsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBbdix2XSBwYWlycyBmb3IgZXZlcnkgdmFsdWUgYHZgIGluIHRoZSBzZXQuCiAgICAgICAqLwogICAgICAqZW50cmllcygpIHsKICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcykgewogICAgICAgICAgeWllbGQgW2l0ZW0sIGl0ZW1dOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGVzcGl0ZSBpdHMgbmFtZSwgcmV0dXJucyBhbiBpdGVyYWJsZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBzZXQsCiAgICAgICAqLwogICAgICBrZXlzKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIG9mIHZhbHVlcyBpbiB0aGUgc2V0LgogICAgICAgKi8KICAgICAgdmFsdWVzKCkgewogICAgICAgIHJldHVybiB0aGlzW1N5bWJvbC5pdGVyYXRvcl0oKTsKICAgICAgfQogICAgICBhZGQoaXRlbSwgZGVwcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBzKSkgewogICAgICAgICAgZGVwcyA9IG5ldyBTZXQoZGVwcyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pdGVtcy5oYXMoaXRlbSkpIHsKICAgICAgICAgIGNvbnN0IGl0ZW1EZXBzID0gdGhpcy5faXRlbXMuZ2V0KGl0ZW0pIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgICBsZXQgZXF1YWwgPSB0cnVlOwogICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykgewogICAgICAgICAgICBpZiAoIWl0ZW1EZXBzLmhhcyhkZXApKSB7CiAgICAgICAgICAgICAgZXF1YWwgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGl0ZW1EZXBzKSB7CiAgICAgICAgICAgICAgaWYgKCFkZXBzLmhhcyhkZXApKSB7CiAgICAgICAgICAgICAgICBlcXVhbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZXF1YWwpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9pdGVtcy5kZWxldGUoaXRlbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHsKICAgICAgICAgIGlmICghdGhpcy5faXRlbXMuaGFzKGRlcCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERlcGVuZGVuY3lOb3RGb3VuZEV4Y2VwdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jaGVja0NpcmN1bGFyRGVwZW5kZW5jaWVzKGl0ZW0sIGRlcHMpOwogICAgICAgIHRoaXMuX2l0ZW1zLnNldChpdGVtLCBuZXcgU2V0KGRlcHMpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBkZWxldGUoaXRlbSkgewogICAgICAgIGlmICghdGhpcy5faXRlbXMuaGFzKGl0ZW0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2l0ZW1zLmZvckVhY2goKHZhbHVlKSA9PiB2YWx1ZS5kZWxldGUoaXRlbSkpOwogICAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5kZWxldGUoaXRlbSk7CiAgICAgIH0KICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgTWFwKHRoaXMuX2l0ZW1zKTsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb3B5LmVudHJpZXMoKSkgewogICAgICAgICAgY29weS5zZXQoa2V5LCBuZXcgU2V0KHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjb3B5LnNpemUgPiAwKSB7CiAgICAgICAgICBjb25zdCBydW4gPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgW2l0ZW0sIGRlcHNdIG9mIGNvcHkuZW50cmllcygpKSB7CiAgICAgICAgICAgIGlmIChkZXBzLnNpemUgPT0gMCkgewogICAgICAgICAgICAgIHJ1bi5wdXNoKGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcnVuKSB7CiAgICAgICAgICAgIGNvcHkuZm9yRWFjaCgocykgPT4gcy5kZWxldGUoaXRlbSkpOwogICAgICAgICAgICBjb3B5LmRlbGV0ZShpdGVtKTsKICAgICAgICAgICAgeWllbGQgaXRlbTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChydW4ubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IENpcmN1bGFyRGVwZW5kZW5jeUZvdW5kRXhjZXB0aW9uKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkgewogICAgICAgIHJldHVybiAiU2V0IjsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlBhcnRpYWxseU9yZGVyZWRTZXQgPSBQYXJ0aWFsbHlPcmRlcmVkU2V0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy91dGlscy9wcmlvcml0eS1xdWV1ZS5qcwp2YXIgcmVxdWlyZV9wcmlvcml0eV9xdWV1ZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy91dGlscy9wcmlvcml0eS1xdWV1ZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuUHJpb3JpdHlRdWV1ZSA9IHZvaWQgMDsKICAgIHZhciBQcmlvcml0eVF1ZXVlID0gY2xhc3MgewogICAgICBfY29tcGFyYXRvcjsKICAgICAgX2l0ZW1zID0gbmV3IEFycmF5KCk7CiAgICAgIGNvbnN0cnVjdG9yKF9jb21wYXJhdG9yKSB7CiAgICAgICAgdGhpcy5fY29tcGFyYXRvciA9IF9jb21wYXJhdG9yOwogICAgICB9CiAgICAgIGNsZWFyKCkgewogICAgICAgIHRoaXMuX2l0ZW1zID0gbmV3IEFycmF5KCk7CiAgICAgIH0KICAgICAgcHVzaChpdGVtKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pdGVtcy5maW5kSW5kZXgoKGV4aXN0aW5nKSA9PiB0aGlzLl9jb21wYXJhdG9yKGl0ZW0sIGV4aXN0aW5nKSA8PSAwKTsKICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9pdGVtcy5zcGxpY2UoaW5kZXgsIDAsIGl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICBwb3AoKSB7CiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNwbGljZSgwLCAxKVswXTsKICAgICAgfQogICAgICBwZWVrKCkgewogICAgICAgIGlmICh0aGlzLl9pdGVtcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1swXTsKICAgICAgfQogICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMubGVuZ3RoOwogICAgICB9CiAgICAgIHRvQXJyYXkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Qcmlvcml0eVF1ZXVlID0gUHJpb3JpdHlRdWV1ZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvbGFuZy5qcwp2YXIgcmVxdWlyZV9sYW5nID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2xhbmcuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzUHJvbWlzZSA9IGlzUHJvbWlzZTsKICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShvYmopIHsKICAgICAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmoudGhlbiA9PT0gImZ1bmN0aW9uIjsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvaW5kZXguanMKdmFyIHJlcXVpcmVfdXRpbHMzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTsKICAgICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtW2tdOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwogICAgfSA6IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIG9bazJdID0gbVtrXTsKICAgIH0pOwogICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc2V0TW9kdWxlRGVmYXVsdCB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIHYpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sICJkZWZhdWx0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTsKICAgIH0gOiBmdW5jdGlvbihvLCB2KSB7CiAgICAgIG9bImRlZmF1bHQiXSA9IHY7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2ltcG9ydFN0YXIgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24obzIpIHsKICAgICAgICAgIHZhciBhciA9IFtdOwogICAgICAgICAgZm9yICh2YXIgayBpbiBvMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMiwgaykpIGFyW2FyLmxlbmd0aF0gPSBrOwogICAgICAgICAgcmV0dXJuIGFyOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIG93bktleXMobyk7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihtb2QpIHsKICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICAgIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09ICJkZWZhdWx0IikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTsKICAgICAgICB9CiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfSgpOwogICAgdmFyIF9fZXhwb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXhwb3J0U3RhciB8fCBmdW5jdGlvbihtLCBleHBvcnRzMykgewogICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzMywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzMywgbSwgcCk7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zdHJpbmdzID0gZXhwb3J0czIudGFncyA9IHZvaWQgMDsKICAgIHZhciB0YWdzID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfbGl0ZXJhbHMoKSk7CiAgICBleHBvcnRzMi50YWdzID0gdGFnczsKICAgIHZhciBzdHJpbmdzMyA9IF9faW1wb3J0U3RhcihyZXF1aXJlX3N0cmluZ3MoKSk7CiAgICBleHBvcnRzMi5zdHJpbmdzID0gc3RyaW5nczM7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9vYmplY3QoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfdGVtcGxhdGUoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfcGFydGlhbGx5X29yZGVyZWRfc2V0KCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3ByaW9yaXR5X3F1ZXVlKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2xhbmcoKSwgZXhwb3J0czIpOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS92aXNpdG9yLmpzCnZhciByZXF1aXJlX3Zpc2l0b3IgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvdmlzaXRvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudmlzaXRKc29uID0gdmlzaXRKc29uOwogICAgZXhwb3J0czIudmlzaXRKc29uU2NoZW1hID0gdmlzaXRKc29uU2NoZW1hOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgcG9pbnRlcl8xID0gcmVxdWlyZV9wb2ludGVyKCk7CiAgICBmdW5jdGlvbiBfZ2V0T2JqZWN0U3ViU2NoZW1hKHNjaGVtYSwga2V5KSB7CiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hICE9PSAib2JqZWN0IiB8fCBzY2hlbWEgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9CiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXMgPT0gIm9iamVjdCIgfHwgc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpIHsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0aWVzID09ICJvYmplY3QiICYmIHR5cGVvZiBzY2hlbWEucHJvcGVydGllc1trZXldID09ICJvYmplY3QiKSB7CiAgICAgICAgICByZXR1cm4gc2NoZW1hLnByb3BlcnRpZXNba2V5XTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBzY2hlbWEuaXRlbXMgPT0gIm9iamVjdCIgfHwgc2NoZW1hLnR5cGUgPT0gImFycmF5IikgewogICAgICAgIHJldHVybiB0eXBlb2Ygc2NoZW1hLml0ZW1zID09ICJvYmplY3QiID8gc2NoZW1hLml0ZW1zIDogdm9pZCAwOwogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBmdW5jdGlvbiBfdmlzaXRKc29uUmVjdXJzaXZlKGpzb24sIHZpc2l0b3IsIHB0ciwgc2NoZW1hLCByZWZSZXNvbHZlciwgY29udGV4dCwgcm9vdCkgewogICAgICBpZiAoc2NoZW1hID09PSB0cnVlIHx8IHNjaGVtYSA9PT0gZmFsc2UpIHsKICAgICAgICBzY2hlbWEgPSB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuaGFzT3duUHJvcGVydHkoIiRyZWYiKSAmJiB0eXBlb2Ygc2NoZW1hWyIkcmVmIl0gPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAocmVmUmVzb2x2ZXIpIHsKICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVmUmVzb2x2ZXIoc2NoZW1hWyIkcmVmIl0sIGNvbnRleHQpOwogICAgICAgICAgc2NoZW1hID0gcmVzb2x2ZWQuc2NoZW1hOwogICAgICAgICAgY29udGV4dCA9IHJlc29sdmVkLmNvbnRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdmlzaXRvcihqc29uLCBwdHIsIHNjaGVtYSwgcm9vdCk7CiAgICAgIHJldHVybiAoKDAsIHJ4anNfMS5pc09ic2VydmFibGUpKHZhbHVlKSA/IHZhbHVlIDogKDAsIHJ4anNfMS5vZikodmFsdWUpKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgodmFsdWUyKSA9PiB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuY29uY2F0KSgoMCwgcnhqc18xLmZyb20pKHZhbHVlMikucGlwZSgoMCwgcnhqc18xLm1lcmdlTWFwKSgoaXRlbSwgaSkgPT4gewogICAgICAgICAgICByZXR1cm4gX3Zpc2l0SnNvblJlY3Vyc2l2ZShpdGVtLCB2aXNpdG9yLCAoMCwgcG9pbnRlcl8xLmpvaW5Kc29uUG9pbnRlcikocHRyLCAiIiArIGkpLCBfZ2V0T2JqZWN0U3ViU2NoZW1hKHNjaGVtYSwgIiIgKyBpKSwgcmVmUmVzb2x2ZXIsIGNvbnRleHQsIHJvb3QgfHwgdmFsdWUyKS5waXBlKCgwLCByeGpzXzEudGFwKSgoeCkgPT4gdmFsdWUyW2ldID0geCkpOwogICAgICAgICAgfSksICgwLCByeGpzXzEuaWdub3JlRWxlbWVudHMpKCkpLCAoMCwgcnhqc18xLm9mKSh2YWx1ZTIpKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTIgPT0gIm9iamVjdCIgJiYgdmFsdWUyICE9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5jb25jYXQpKCgwLCByeGpzXzEuZnJvbSkoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUyKSkucGlwZSgoMCwgcnhqc18xLm1lcmdlTWFwKSgoa2V5KSA9PiB7CiAgICAgICAgICAgIHJldHVybiBfdmlzaXRKc29uUmVjdXJzaXZlKHZhbHVlMltrZXldLCB2aXNpdG9yLCAoMCwgcG9pbnRlcl8xLmpvaW5Kc29uUG9pbnRlcikocHRyLCBrZXkpLCBfZ2V0T2JqZWN0U3ViU2NoZW1hKHNjaGVtYSwga2V5KSwgcmVmUmVzb2x2ZXIsIGNvbnRleHQsIHJvb3QgfHwgdmFsdWUyKS5waXBlKCgwLCByeGpzXzEudGFwKSgoeCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlMiwga2V5KTsKICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLndyaXRhYmxlICYmIHZhbHVlMltrZXldICE9PSB4KSB7CiAgICAgICAgICAgICAgICB2YWx1ZTJba2V5XSA9IHg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9KSwgKDAsIHJ4anNfMS5pZ25vcmVFbGVtZW50cykoKSksICgwLCByeGpzXzEub2YpKHZhbHVlMikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5vZikodmFsdWUyKTsKICAgICAgICB9CiAgICAgIH0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZpc2l0SnNvbihqc29uLCB2aXNpdG9yLCBzY2hlbWEsIHJlZlJlc29sdmVyLCBjb250ZXh0KSB7CiAgICAgIHJldHVybiBfdmlzaXRKc29uUmVjdXJzaXZlKGpzb24sIHZpc2l0b3IsICgwLCBwb2ludGVyXzEuYnVpbGRKc29uUG9pbnRlcikoW10pLCBzY2hlbWEsIHJlZlJlc29sdmVyLCBjb250ZXh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHZpc2l0SnNvblNjaGVtYShzY2hlbWEsIHZpc2l0b3IpIHsKICAgICAgaWYgKHNjaGVtYSA9PT0gZmFsc2UgfHwgc2NoZW1hID09PSB0cnVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGtleXdvcmRzID0gewogICAgICAgIGFkZGl0aW9uYWxJdGVtczogdHJ1ZSwKICAgICAgICBpdGVtczogdHJ1ZSwKICAgICAgICBjb250YWluczogdHJ1ZSwKICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSwKICAgICAgICBwcm9wZXJ0eU5hbWVzOiB0cnVlLAogICAgICAgIG5vdDogdHJ1ZQogICAgICB9OwogICAgICBjb25zdCBhcnJheUtleXdvcmRzID0gewogICAgICAgIGl0ZW1zOiB0cnVlLAogICAgICAgIGFsbE9mOiB0cnVlLAogICAgICAgIGFueU9mOiB0cnVlLAogICAgICAgIG9uZU9mOiB0cnVlCiAgICAgIH07CiAgICAgIGNvbnN0IHByb3BzS2V5d29yZHMgPSB7CiAgICAgICAgZGVmaW5pdGlvbnM6IHRydWUsCiAgICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgICBwYXR0ZXJuUHJvcGVydGllczogdHJ1ZSwKICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSwKICAgICAgICBkZXBlbmRlbmNpZXM6IHRydWUsCiAgICAgICAgaXRlbXM6IHRydWUKICAgICAgfTsKICAgICAgZnVuY3Rpb24gX3RyYXZlcnNlKHNjaGVtYTIsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHsKICAgICAgICBpZiAoc2NoZW1hMiAmJiB0eXBlb2Ygc2NoZW1hMiA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheShzY2hlbWEyKSkgewogICAgICAgICAgdmlzaXRvcihzY2hlbWEyLCBqc29uUHRyLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTsKICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYTIpKSB7CiAgICAgICAgICAgIGNvbnN0IHNjaCA9IHNjaGVtYTJba2V5XTsKICAgICAgICAgICAgaWYgKGtleSBpbiBwcm9wc0tleXdvcmRzKSB7CiAgICAgICAgICAgICAgaWYgKHNjaCAmJiB0eXBlb2Ygc2NoID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoc2NoKSkgewogICAgICAgICAgICAgICAgICBfdHJhdmVyc2Uoc2NoW3Byb3BdLCAoMCwgcG9pbnRlcl8xLmpvaW5Kc29uUG9pbnRlcikoanNvblB0ciwga2V5LCBwcm9wKSwgcm9vdFNjaGVtYSwgc2NoZW1hMiwgcHJvcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBrZXl3b3JkcykgewogICAgICAgICAgICAgIF90cmF2ZXJzZShzY2gsICgwLCBwb2ludGVyXzEuam9pbkpzb25Qb2ludGVyKShqc29uUHRyLCBrZXkpLCByb290U2NoZW1hLCBzY2hlbWEyLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBhcnJheUtleXdvcmRzKSB7CiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoKSkgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2gubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgX3RyYXZlcnNlKHNjaFtpXSwgKDAsIHBvaW50ZXJfMS5qb2luSnNvblBvaW50ZXIpKGpzb25QdHIsIGtleSwgIiIgKyBpKSwgcm9vdFNjaGVtYSwgc2NoLCAiIiArIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNjaCkpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgX3RyYXZlcnNlKHNjaFtpXSwgKDAsIHBvaW50ZXJfMS5qb2luSnNvblBvaW50ZXIpKGpzb25QdHIsIGtleSwgIiIgKyBpKSwgcm9vdFNjaGVtYSwgc2NoLCAiIiArIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBfdHJhdmVyc2Uoc2NoZW1hLCAoMCwgcG9pbnRlcl8xLmJ1aWxkSnNvblBvaW50ZXIpKFtdKSwgc2NoZW1hKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvcmVnaXN0cnkuanMKdmFyIHJlcXVpcmVfcmVnaXN0cnkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvcmVnaXN0cnkuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19jcmVhdGVCaW5kaW5nID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgICBpZiAoIWRlc2MgfHwgKCJnZXQiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG1ba107CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7CiAgICB9IDogZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgb1trMl0gPSBtW2tdOwogICAgfSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zZXRNb2R1bGVEZWZhdWx0IHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgdikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgImRlZmF1bHQiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pOwogICAgfSA6IGZ1bmN0aW9uKG8sIHYpIHsKICAgICAgb1siZGVmYXVsdCJdID0gdjsKICAgIH0pOwogICAgdmFyIF9faW1wb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9faW1wb3J0U3RhciB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykgewogICAgICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbihvMikgewogICAgICAgICAgdmFyIGFyID0gW107CiAgICAgICAgICBmb3IgKHZhciBrIGluIG8yKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8yLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7CiAgICAgICAgICByZXR1cm4gYXI7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gb3duS2V5cyhvKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZCkgewogICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmIChtb2QgIT0gbnVsbCkgewogICAgICAgICAgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pOwogICAgICAgIH0KICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9KCk7CiAgICB2YXIgX19pbXBvcnREZWZhdWx0ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19pbXBvcnREZWZhdWx0IHx8IGZ1bmN0aW9uKG1vZCkgewogICAgICByZXR1cm4gbW9kICYmIG1vZC5fX2VzTW9kdWxlID8gbW9kIDogeyAiZGVmYXVsdCI6IG1vZCB9OwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQ29yZVNjaGVtYVJlZ2lzdHJ5ID0gZXhwb3J0czIuU2NoZW1hVmFsaWRhdGlvbkV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIHZhciBhanZfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlX2FqdigpKTsKICAgIHZhciBhanZfZm9ybWF0c18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmVfZGlzdCgpKTsKICAgIHZhciBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoImh0dHAiKSk7CiAgICB2YXIgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZSgiaHR0cHMiKSk7CiAgICB2YXIgcnhqc18xID0gcmVxdWlyZV9janMoKTsKICAgIHZhciBVcmwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZSgidXJsIikpOwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciB1dGlsc18xID0gcmVxdWlyZV91dGlsczMoKTsKICAgIHZhciB1dGlsc18yID0gcmVxdWlyZV91dGlscygpOwogICAgdmFyIHV0aWxpdHlfMSA9IHJlcXVpcmVfdXRpbGl0eSgpOwogICAgdmFyIHZpc2l0b3JfMSA9IHJlcXVpcmVfdmlzaXRvcigpOwogICAgdmFyIFNjaGVtYVZhbGlkYXRpb25FeGNlcHRpb24gPSBjbGFzcyBfU2NoZW1hVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGV4Y2VwdGlvbl8xLkJhc2VFeGNlcHRpb24gewogICAgICBlcnJvcnM7CiAgICAgIGNvbnN0cnVjdG9yKGVycm9ycywgYmFzZU1lc3NhZ2UgPSAiU2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvcnM6IikgewogICAgICAgIGlmICghZXJyb3JzIHx8IGVycm9ycy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHN1cGVyKCJTY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQuIik7CiAgICAgICAgICB0aGlzLmVycm9ycyA9IFtdOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXNzYWdlcyA9IF9TY2hlbWFWYWxpZGF0aW9uRXhjZXB0aW9uLmNyZWF0ZU1lc3NhZ2VzKGVycm9ycyk7CiAgICAgICAgc3VwZXIoYCR7YmFzZU1lc3NhZ2V9CiAgJHttZXNzYWdlcy5qb2luKCJcbiAgIil9YCk7CiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZU1lc3NhZ2VzKGVycm9ycykgewogICAgICAgIGlmICghZXJyb3JzIHx8IGVycm9ycy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBlcnJvcnMubWFwKChlcnIpID0+IHsKICAgICAgICAgIGxldCBtZXNzYWdlID0gYERhdGEgcGF0aCAke0pTT04uc3RyaW5naWZ5KGVyci5pbnN0YW5jZVBhdGgpfSAke2Vyci5tZXNzYWdlfWA7CiAgICAgICAgICBpZiAoZXJyLnBhcmFtcykgewogICAgICAgICAgICBzd2l0Y2ggKGVyci5rZXl3b3JkKSB7CiAgICAgICAgICAgICAgY2FzZSAiYWRkaXRpb25hbFByb3BlcnRpZXMiOgogICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgKCR7ZXJyLnBhcmFtcy5hZGRpdGlvbmFsUHJvcGVydHl9KWA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJlbnVtIjoKICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYC4gQWxsb3dlZCB2YWx1ZXMgYXJlOiAke2Vyci5wYXJhbXMuYWxsb3dlZFZhbHVlcz8ubWFwKCh2KSA9PiBgIiR7dn0iYCkuam9pbigiLCAiKX1gOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtZXNzYWdlICsgIi4iOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBtZXNzYWdlczsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlNjaGVtYVZhbGlkYXRpb25FeGNlcHRpb24gPSBTY2hlbWFWYWxpZGF0aW9uRXhjZXB0aW9uOwogICAgdmFyIENvcmVTY2hlbWFSZWdpc3RyeSA9IGNsYXNzIF9Db3JlU2NoZW1hUmVnaXN0cnkgewogICAgICBfYWp2OwogICAgICBfdXJpQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBfdXJpSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICBfcHJlID0gbmV3IHV0aWxzXzEuUGFydGlhbGx5T3JkZXJlZFNldCgpOwogICAgICBfcG9zdCA9IG5ldyB1dGlsc18xLlBhcnRpYWxseU9yZGVyZWRTZXQoKTsKICAgICAgX2N1cnJlbnRDb21waWxhdGlvblNjaGVtYUluZm87CiAgICAgIF9zbWFydERlZmF1bHRLZXl3b3JkID0gZmFsc2U7CiAgICAgIF9wcm9tcHRQcm92aWRlcjsKICAgICAgX3NvdXJjZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIGNvbnN0cnVjdG9yKGZvcm1hdHMgPSBbXSkgewogICAgICAgIHRoaXMuX2FqdiA9IG5ldyBhanZfMS5kZWZhdWx0KHsKICAgICAgICAgIHN0cmljdDogZmFsc2UsCiAgICAgICAgICBsb2FkU2NoZW1hOiAodXJpKSA9PiB0aGlzLl9mZXRjaCh1cmkpLAogICAgICAgICAgcGFzc0NvbnRleHQ6IHRydWUKICAgICAgICB9KTsKICAgICAgICAoMCwgYWp2X2Zvcm1hdHNfMS5kZWZhdWx0KSh0aGlzLl9hanYpOwogICAgICAgIGZvciAoY29uc3QgZm9ybWF0IG9mIGZvcm1hdHMpIHsKICAgICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIF9mZXRjaCh1cmkpIHsKICAgICAgICBjb25zdCBtYXliZVNjaGVtYSA9IHRoaXMuX3VyaUNhY2hlLmdldCh1cmkpOwogICAgICAgIGlmIChtYXliZVNjaGVtYSkgewogICAgICAgICAgcmV0dXJuIG1heWJlU2NoZW1hOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fdXJpSGFuZGxlcnMpIHsKICAgICAgICAgIGxldCBoYW5kbGVyUmVzdWx0ID0gaGFuZGxlcih1cmkpOwogICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IG51bGwgfHwgaGFuZGxlclJlc3VsdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCgwLCByeGpzXzEuaXNPYnNlcnZhYmxlKShoYW5kbGVyUmVzdWx0KSkgewogICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gKDAsIHJ4anNfMS5sYXN0VmFsdWVGcm9tKShoYW5kbGVyUmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgaGFuZGxlclJlc3VsdDsKICAgICAgICAgIHRoaXMuX3VyaUNhY2hlLnNldCh1cmksIHZhbHVlKTsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGNvbnN0IHVybDMgPSBuZXcgVXJsLlVSTCh1cmkpOwogICAgICAgICAgY29uc3QgY2xpZW50ID0gdXJsMy5wcm90b2NvbCA9PT0gImh0dHBzOiIgPyBodHRwcyA6IGh0dHA7CiAgICAgICAgICBjbGllbnQuZ2V0KHVybDMsIChyZXMpID0+IHsKICAgICAgICAgICAgaWYgKCFyZXMuc3RhdHVzQ29kZSB8fCByZXMuc3RhdHVzQ29kZSA+PSAzMDApIHsKICAgICAgICAgICAgICByZXMucmVzdW1lKCk7CiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQuIFN0YXR1cyBDb2RlOiAke3Jlcy5zdGF0dXNDb2RlfWApKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXMuc2V0RW5jb2RpbmcoInV0ZjgiKTsKICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOwogICAgICAgICAgICAgIHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gewogICAgICAgICAgICAgICAgZGF0YSArPSBjaHVuazsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICAgICAgICB0aGlzLl91cmlDYWNoZS5zZXQodXJpLCBqc29uKTsKICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCBhIHRyYW5zZm9ybWF0aW9uIHN0ZXAgYmVmb3JlIHRoZSB2YWxpZGF0aW9uIG9mIGFueSBKc29uLgogICAgICAgKiBAcGFyYW0ge0pzb25WaXNpdG9yfSB2aXNpdG9yIFRoZSB2aXNpdG9yIHRvIHRyYW5zZm9ybSBldmVyeSB2YWx1ZS4KICAgICAgICogQHBhcmFtIHtKc29uVmlzaXRvcltdfSBkZXBzIEEgbGlzdCBvZiBvdGhlciB2aXNpdG9ycyB0byBydW4gYmVmb3JlLgogICAgICAgKi8KICAgICAgYWRkUHJlVHJhbnNmb3JtKHZpc2l0b3IsIGRlcHMpIHsKICAgICAgICB0aGlzLl9wcmUuYWRkKHZpc2l0b3IsIGRlcHMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYSB0cmFuc2Zvcm1hdGlvbiBzdGVwIGFmdGVyIHRoZSB2YWxpZGF0aW9uIG9mIGFueSBKc29uLiBUaGUgSlNPTiB3aWxsIG5vdCBiZSB2YWxpZGF0ZWQKICAgICAgICogYWZ0ZXIgdGhlIFBPU1QsIHNvIGlmIHRyYW5zZm9ybWF0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgU2NoZW1hIGl0IHdpbGwgbm90IHJlc3VsdAogICAgICAgKiBpbiBhbiBlcnJvci4KICAgICAgICogQHBhcmFtIHtKc29uVmlzaXRvcn0gdmlzaXRvciBUaGUgdmlzaXRvciB0byB0cmFuc2Zvcm0gZXZlcnkgdmFsdWUuCiAgICAgICAqIEBwYXJhbSB7SnNvblZpc2l0b3JbXX0gZGVwcyBBIGxpc3Qgb2Ygb3RoZXIgdmlzaXRvcnMgdG8gcnVuIGJlZm9yZS4KICAgICAgICovCiAgICAgIGFkZFBvc3RUcmFuc2Zvcm0odmlzaXRvciwgZGVwcykgewogICAgICAgIHRoaXMuX3Bvc3QuYWRkKHZpc2l0b3IsIGRlcHMpOwogICAgICB9CiAgICAgIF9yZXNvbHZlcihyZWYsIHZhbGlkYXRlKSB7CiAgICAgICAgaWYgKCF2YWxpZGF0ZSB8fCAhcmVmKSB7CiAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNjaGVtYSA9IHZhbGlkYXRlLnNjaGVtYUVudi5yb290LnNjaGVtYTsKICAgICAgICBjb25zdCBpZCA9IHR5cGVvZiBzY2hlbWEgPT09ICJvYmplY3QiID8gc2NoZW1hLiRpZCA6IG51bGw7CiAgICAgICAgbGV0IGZ1bGxSZWZlcmVuY2UgPSByZWY7CiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGZ1bGxSZWZlcmVuY2UgPSBVcmwucmVzb2x2ZShpZCwgcmVmKTsKICAgICAgICAgIGlmIChyZWYuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgICAgICAgIGZ1bGxSZWZlcmVuY2UgPSBpZCArIGZ1bGxSZWZlcmVuY2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gdGhpcy5fYWp2LmdldFNjaGVtYShmdWxsUmVmZXJlbmNlKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgY29udGV4dDogcmVzb2x2ZWRTY2hlbWE/LnNjaGVtYUVudi52YWxpZGF0ZSwKICAgICAgICAgIHNjaGVtYTogcmVzb2x2ZWRTY2hlbWE/LnNjaGVtYQogICAgICAgIH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZsYXR0ZW4gdGhlIFNjaGVtYSwgcmVzb2x2aW5nIGFuZCByZXBsYWNpbmcgYWxsIHRoZSByZWZzLiBNYWtlcyBpdCBpbnRvIGEgc3luY2hyb25vdXMgc2NoZW1hCiAgICAgICAqIHRoYXQgaXMgYWxzbyBlYXNpZXIgdG8gdHJhdmVyc2UuIERvZXMgbm90IGNhY2hlIHRoZSByZXN1bHQuCiAgICAgICAqCiAgICAgICAqIFByb2R1Y2luZyBhIGZsYXR0ZW4gc2NoZW1hIGRvY3VtZW50IGRvZXMgbm90IGluIGFsbCBjYXNlcyBwcm9kdWNlIGEgc2NoZW1hIHdpdGggaWRlbnRpY2FsIGJlaGF2aW9yIHRvIHRoZSBvcmlnaW5hbC4KICAgICAgICogU2VlOiBodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDE5LTA5L2pzb24tc2NoZW1hLWNvcmUuaHRtbCNyZmMuYXBwZW5kaXguQi4yCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBVUkkgdG8gZmxhdHRlbi4KICAgICAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBvZiB0aGUgZmxhdHRlbmVkIHNjaGVtYSBvYmplY3QuCiAgICAgICAqIEBwcml2YXRlIHNpbmNlIDExLjIgd2l0aG91dCByZXBsYWNlbWVudC4KICAgICAgICovCiAgICAgIGFzeW5jIFx1MDI3NWZsYXR0ZW4oc2NoZW1hKSB7CiAgICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWEpOwogICAgICAgIHRoaXMuX2N1cnJlbnRDb21waWxhdGlvblNjaGVtYUluZm8gPSB2b2lkIDA7CiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBhd2FpdCB0aGlzLl9hanYuY29tcGlsZUFzeW5jKHNjaGVtYSk7CiAgICAgICAgY29uc3Qgc2VsZjIgPSB0aGlzOwogICAgICAgIGZ1bmN0aW9uIHZpc2l0b3IoY3VycmVudCwgcG9pbnRlciwgcGFyZW50U2NoZW1hLCBpbmRleCkgewogICAgICAgICAgaWYgKGN1cnJlbnQgJiYgcGFyZW50U2NoZW1hICYmIGluZGV4ICYmICgwLCB1dGlsc18yLmlzSnNvbk9iamVjdCkoY3VycmVudCkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsICIkcmVmIikgJiYgdHlwZW9mIGN1cnJlbnRbIiRyZWYiXSA9PSAic3RyaW5nIikgewogICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHNlbGYyLl9yZXNvbHZlcihjdXJyZW50WyIkcmVmIl0sIHZhbGlkYXRlKTsKICAgICAgICAgICAgaWYgKHJlc29sdmVkLnNjaGVtYSkgewogICAgICAgICAgICAgIHBhcmVudFNjaGVtYVtpbmRleF0gPSByZXNvbHZlZC5zY2hlbWE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc2NoZW1hQ29weSA9ICgwLCB1dGlsc18xLmRlZXBDb3B5KSh2YWxpZGF0ZS5zY2hlbWEpOwogICAgICAgICgwLCB2aXNpdG9yXzEudmlzaXRKc29uU2NoZW1hKShzY2hlbWFDb3B5LCB2aXNpdG9yKTsKICAgICAgICByZXR1cm4gc2NoZW1hQ29weTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ29tcGlsZSBhbmQgcmV0dXJuIGEgdmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIFNjaGVtYS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHNjaGVtYSBUaGUgc2NoZW1hIHRvIHZhbGlkYXRlLiBJZiBhIHN0cmluZywgd2lsbCBmZXRjaCB0aGUgc2NoZW1hIGJlZm9yZSBjb21waWxpbmcgaXQKICAgICAgICogKHVzaW5nIHNjaGVtYSBhcyBhIFVSSSkuCiAgICAgICAqLwogICAgICBhc3luYyBjb21waWxlKHNjaGVtYSkgewogICAgICAgIGNvbnN0IHZhbGlkYXRlID0gYXdhaXQgdGhpcy5fY29tcGlsZShzY2hlbWEpOwogICAgICAgIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHZhbGlkYXRlKHZhbHVlLCBvcHRpb25zKTsKICAgICAgfQogICAgICBhc3luYyBfY29tcGlsZShzY2hlbWEpIHsKICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICByZXR1cm4gYXN5bmMgKGRhdGEpID0+ICh7IHN1Y2Nlc3M6IHNjaGVtYSwgZGF0YSB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2NoZW1hSW5mbyA9IHsKICAgICAgICAgIHNtYXJ0RGVmYXVsdFJlY29yZDogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICAgICAgICAgIHByb21wdERlZmluaXRpb25zOiBbXQogICAgICAgIH07CiAgICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWEpOwogICAgICAgIGxldCB2YWxpZGF0b3I7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuX2N1cnJlbnRDb21waWxhdGlvblNjaGVtYUluZm8gPSBzY2hlbWFJbmZvOwogICAgICAgICAgdmFsaWRhdG9yID0gdGhpcy5fYWp2LmNvbXBpbGUoc2NoZW1hKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgYWp2XzEuZGVmYXVsdC5NaXNzaW5nUmVmRXJyb3IpKSB7CiAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICB9CiAgICAgICAgICB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLl9hanYuY29tcGlsZUFzeW5jKHNjaGVtYSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMuX2N1cnJlbnRDb21waWxhdGlvblNjaGVtYUluZm8gPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhc3luYyAoZGF0YSwgb3B0aW9ucykgPT4gewogICAgICAgICAgY29uc3QgdmFsaWRhdGlvbk9wdGlvbnMgPSB7CiAgICAgICAgICAgIHdpdGhQcm9tcHRzOiB0cnVlLAogICAgICAgICAgICBhcHBseVBvc3RUcmFuc2Zvcm1zOiB0cnVlLAogICAgICAgICAgICBhcHBseVByZVRyYW5zZm9ybXM6IHRydWUsCiAgICAgICAgICAgIC4uLm9wdGlvbnMKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uQ29udGV4dCA9IHsKICAgICAgICAgICAgcHJvbXB0RmllbGRzV2l0aFZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICAgICAgaWYgKHZhbGlkYXRpb25PcHRpb25zLmFwcGx5UHJlVHJhbnNmb3JtcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IHZpc2l0b3Igb2YgdGhpcy5fcHJlLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0ICgwLCByeGpzXzEubGFzdFZhbHVlRnJvbSkoKDAsIHZpc2l0b3JfMS52aXNpdEpzb24pKGRhdGEsIHZpc2l0b3IsIHNjaGVtYSwgdGhpcy5fcmVzb2x2ZXIuYmluZCh0aGlzKSwgdmFsaWRhdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHRoaXMuX2FwcGx5U21hcnREZWZhdWx0cyhkYXRhLCBzY2hlbWFJbmZvLnNtYXJ0RGVmYXVsdFJlY29yZCk7CiAgICAgICAgICBpZiAodmFsaWRhdGlvbk9wdGlvbnMud2l0aFByb21wdHMpIHsKICAgICAgICAgICAgY29uc3QgdmlzaXRvciA9ICh2YWx1ZSwgcG9pbnRlcikgPT4gewogICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5wcm9tcHRGaWVsZHNXaXRoVmFsdWUuYWRkKHBvaW50ZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgIGF3YWl0ICgwLCByeGpzXzEubGFzdFZhbHVlRnJvbSkoKDAsIHZpc2l0b3JfMS52aXNpdEpzb24pKGRhdGEsIHZpc2l0b3IsIHNjaGVtYSwgdGhpcy5fcmVzb2x2ZXIuYmluZCh0aGlzKSwgdmFsaWRhdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSBzY2hlbWFJbmZvLnByb21wdERlZmluaXRpb25zLmZpbHRlcigoZGVmKSA9PiAhdmFsaWRhdGlvbkNvbnRleHQucHJvbXB0RmllbGRzV2l0aFZhbHVlLmhhcyhkZWYuaWQpKTsKICAgICAgICAgICAgaWYgKGRlZmluaXRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9hcHBseVByb21wdHMoZGF0YSwgZGVmaW5pdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdmFsaWRhdG9yLmNhbGwodmFsaWRhdGlvbkNvbnRleHQsIGRhdGEpOwogICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBzdWNjZXNzLCBlcnJvcnM6IHZhbGlkYXRvci5lcnJvcnMgPz8gW10gfTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgYWp2XzEuZGVmYXVsdC5WYWxpZGF0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBzdWNjZXNzOiBmYWxzZSwgZXJyb3JzOiBlcnJvci5lcnJvcnMgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWxpZGF0aW9uT3B0aW9ucy5hcHBseVBvc3RUcmFuc2Zvcm1zKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgdmlzaXRvciBvZiB0aGlzLl9wb3N0LnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0ICgwLCByeGpzXzEubGFzdFZhbHVlRnJvbSkoKDAsIHZpc2l0b3JfMS52aXNpdEpzb24pKGRhdGEsIHZpc2l0b3IsIHNjaGVtYSwgdGhpcy5fcmVzb2x2ZXIuYmluZCh0aGlzKSwgdmFsaWRhdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IGRhdGEsIHN1Y2Nlc3M6IHRydWUgfTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGFkZEZvcm1hdChmb3JtYXQpIHsKICAgICAgICB0aGlzLl9hanYuYWRkRm9ybWF0KGZvcm1hdC5uYW1lLCBmb3JtYXQuZm9ybWF0dGVyKTsKICAgICAgfQogICAgICBhZGRTbWFydERlZmF1bHRQcm92aWRlcihzb3VyY2UsIHByb3ZpZGVyKSB7CiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZU1hcC5oYXMoc291cmNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNvdXJjZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3NvdXJjZU1hcC5zZXQoc291cmNlLCBwcm92aWRlcik7CiAgICAgICAgaWYgKCF0aGlzLl9zbWFydERlZmF1bHRLZXl3b3JkKSB7CiAgICAgICAgICB0aGlzLl9zbWFydERlZmF1bHRLZXl3b3JkID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2Fqdi5hZGRLZXl3b3JkKHsKICAgICAgICAgICAga2V5d29yZDogIiRkZWZhdWx0IiwKICAgICAgICAgICAgZXJyb3JzOiBmYWxzZSwKICAgICAgICAgICAgdmFsaWQ6IHRydWUsCiAgICAgICAgICAgIGNvbXBpbGU6IChzY2hlbWEsIF9wYXJlbnRTY2hlbWEsIGl0KSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgY29tcGlsYXRpb25TY2hlbUluZm8gPSB0aGlzLl9jdXJyZW50Q29tcGlsYXRpb25TY2hlbWFJbmZvOwogICAgICAgICAgICAgIGlmIChjb21waWxhdGlvblNjaGVtSW5mbyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgcGF0aEFycmF5ID0gdGhpcy5ub3JtYWxpemVEYXRhUGF0aEFycihpdCk7CiAgICAgICAgICAgICAgY29tcGlsYXRpb25TY2hlbUluZm8uc21hcnREZWZhdWx0UmVjb3JkLnNldChKU09OLnN0cmluZ2lmeShwYXRoQXJyYXkpLCBzY2hlbWEpOwogICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0cnVlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXRhU2NoZW1hOiB7CiAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgICAgIiRzb3VyY2UiOiB7IHR5cGU6ICJzdHJpbmciIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLAogICAgICAgICAgICAgIHJlcXVpcmVkOiBbIiRzb3VyY2UiXQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVnaXN0ZXJVcmlIYW5kbGVyKGhhbmRsZXIpIHsKICAgICAgICB0aGlzLl91cmlIYW5kbGVycy5hZGQoaGFuZGxlcik7CiAgICAgIH0KICAgICAgdXNlUHJvbXB0UHJvdmlkZXIocHJvdmlkZXIpIHsKICAgICAgICBjb25zdCBpc1NldHVwID0gISF0aGlzLl9wcm9tcHRQcm92aWRlcjsKICAgICAgICB0aGlzLl9wcm9tcHRQcm92aWRlciA9IHByb3ZpZGVyOwogICAgICAgIGlmIChpc1NldHVwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2Fqdi5hZGRLZXl3b3JkKHsKICAgICAgICAgIGtleXdvcmQ6ICJ4LXByb21wdCIsCiAgICAgICAgICBlcnJvcnM6IGZhbHNlLAogICAgICAgICAgdmFsaWQ6IHRydWUsCiAgICAgICAgICBjb21waWxlOiAoc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGl0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGF0aW9uU2NoZW1JbmZvID0gdGhpcy5fY3VycmVudENvbXBpbGF0aW9uU2NoZW1hSW5mbzsKICAgICAgICAgICAgaWYgKCFjb21waWxhdGlvblNjaGVtSW5mbykgewogICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHBhdGggPSAiLyIgKyB0aGlzLm5vcm1hbGl6ZURhdGFQYXRoQXJyKGl0KS5qb2luKCIvIik7CiAgICAgICAgICAgIGxldCB0eXBlOwogICAgICAgICAgICBsZXQgaXRlbXM7CiAgICAgICAgICAgIGxldCBtZXNzYWdlOwogICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgIG1lc3NhZ2UgPSBzY2hlbWE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWVzc2FnZSA9IHNjaGVtYS5tZXNzYWdlOwogICAgICAgICAgICAgIHR5cGUgPSBzY2hlbWEudHlwZTsKICAgICAgICAgICAgICBpdGVtcyA9IHNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVR5cGVzID0gKDAsIHV0aWxpdHlfMS5nZXRUeXBlc09mU2NoZW1hKShwYXJlbnRTY2hlbWEpOwogICAgICAgICAgICBpZiAoIXR5cGUpIHsKICAgICAgICAgICAgICBpZiAocHJvcGVydHlUeXBlcy5zaXplID09PSAxICYmIHByb3BlcnR5VHlwZXMuaGFzKCJib29sZWFuIikpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSAiY29uZmlybWF0aW9uIjsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50U2NoZW1hLmVudW0pKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gImxpc3QiOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlUeXBlcy5zaXplID09PSAxICYmIHByb3BlcnR5VHlwZXMuaGFzKCJhcnJheSIpICYmIHBhcmVudFNjaGVtYS5pdGVtcyAmJiBBcnJheS5pc0FycmF5KHBhcmVudFNjaGVtYS5pdGVtcy5lbnVtKSkgewogICAgICAgICAgICAgICAgdHlwZSA9ICJsaXN0IjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHlwZSA9ICJpbnB1dCI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtdWx0aXNlbGVjdDsKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJsaXN0IikgewogICAgICAgICAgICAgIG11bHRpc2VsZWN0ID0gc2NoZW1hLm11bHRpc2VsZWN0ID09PSB2b2lkIDAgPyBwcm9wZXJ0eVR5cGVzLnNpemUgPT09IDEgJiYgcHJvcGVydHlUeXBlcy5oYXMoImFycmF5IikgOiBzY2hlbWEubXVsdGlzZWxlY3Q7CiAgICAgICAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IG11bHRpc2VsZWN0ID8gcGFyZW50U2NoZW1hLml0ZW1zICYmIHBhcmVudFNjaGVtYS5pdGVtcy5lbnVtIDogcGFyZW50U2NoZW1hLmVudW07CiAgICAgICAgICAgICAgaWYgKCFpdGVtcyAmJiBBcnJheS5pc0FycmF5KGVudW1WYWx1ZXMpKSB7CiAgICAgICAgICAgICAgICBpdGVtcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBlbnVtVmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHZhbHVlLnRvU3RyaW5nKCksIHZhbHVlIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB7CiAgICAgICAgICAgICAgaWQ6IHBhdGgsCiAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgIHJhdzogc2NoZW1hLAogICAgICAgICAgICAgIGl0ZW1zLAogICAgICAgICAgICAgIG11bHRpc2VsZWN0LAogICAgICAgICAgICAgIHByb3BlcnR5VHlwZXMsCiAgICAgICAgICAgICAgZGVmYXVsdDogdHlwZW9mIHBhcmVudFNjaGVtYS5kZWZhdWx0ID09ICJvYmplY3QiICYmIHBhcmVudFNjaGVtYS5kZWZhdWx0ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHBhcmVudFNjaGVtYS5kZWZhdWx0KSA/IHZvaWQgMCA6IHBhcmVudFNjaGVtYS5kZWZhdWx0LAogICAgICAgICAgICAgIGFzeW5jIHZhbGlkYXRvcihkYXRhKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpdC5zZWxmLnZhbGlkYXRlKHBhcmVudFNjaGVtYSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LnNlbGYuZXJyb3JzPy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuc2VsZi5lcnJvcnNbMF0ubWVzc2FnZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSBlOwogICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWxpZGF0aW9uRXJyb3IuZXJyb3JzKSAmJiB2YWxpZGF0aW9uRXJyb3IuZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3IuZXJyb3JzWzBdLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbXBpbGF0aW9uU2NoZW1JbmZvLnByb21wdERlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLnByb21wdEZpZWxkc1dpdGhWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5wcm9tcHRGaWVsZHNXaXRoVmFsdWUuYWRkKHBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICBtZXRhU2NoZW1hOiB7CiAgICAgICAgICAgIG9uZU9mOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAidHlwZSI6IHsgdHlwZTogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiB7IHR5cGU6ICJzdHJpbmciIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbIm1lc3NhZ2UiXQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGFzeW5jIF9hcHBseVByb21wdHMoZGF0YSwgcHJvbXB0cykgewogICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fcHJvbXB0UHJvdmlkZXI7CiAgICAgICAgaWYgKCFwcm92aWRlcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgKDAsIHJ4anNfMS5sYXN0VmFsdWVGcm9tKSgoMCwgcnhqc18xLmZyb20pKHByb3ZpZGVyKHByb21wdHMpKSk7CiAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIGFuc3dlcnMpIHsKICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudHMgPSBwYXRoLnNwbGl0KCIvIikuc2xpY2UoMSk7CiAgICAgICAgICBfQ29yZVNjaGVtYVJlZ2lzdHJ5Ll9zZXQoZGF0YSwgcGF0aEZyYWdtZW50cywgYW5zd2Vyc1twYXRoXSwgbnVsbCwgdm9pZCAwLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIF9zZXQoZGF0YSwgZnJhZ21lbnRzLCB2YWx1ZSwgcGFyZW50ID0gbnVsbCwgcGFyZW50UHJvcGVydHksIGZvcmNlKSB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZyYWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZnJhZ21lbnRzW2luZGV4XTsKICAgICAgICAgIGlmICgvXmlcZCskLy50ZXN0KGZyYWdtZW50KSkgewogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgZGF0YUluZGV4ID0gMDsgZGF0YUluZGV4IDwgZGF0YS5sZW5ndGg7IGRhdGFJbmRleCsrKSB7CiAgICAgICAgICAgICAgX0NvcmVTY2hlbWFSZWdpc3RyeS5fc2V0KGRhdGFbZGF0YUluZGV4XSwgZnJhZ21lbnRzLnNsaWNlKGluZGV4ICsgMSksIHZhbHVlLCBkYXRhLCBgJHtkYXRhSW5kZXh9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkYXRhICYmIHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnRQcm9wZXJ0eSkgewogICAgICAgICAgICBkYXRhID0gcGFyZW50W3BhcmVudFByb3BlcnR5XSA9IHt9OwogICAgICAgICAgfQogICAgICAgICAgcGFyZW50ID0gZGF0YTsKICAgICAgICAgIHBhcmVudFByb3BlcnR5ID0gZnJhZ21lbnQ7CiAgICAgICAgICBkYXRhID0gZGF0YVtmcmFnbWVudF07CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50UHJvcGVydHkgJiYgKGZvcmNlIHx8IHBhcmVudFtwYXJlbnRQcm9wZXJ0eV0gPT09IHZvaWQgMCkpIHsKICAgICAgICAgIHBhcmVudFtwYXJlbnRQcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgX2FwcGx5U21hcnREZWZhdWx0cyhkYXRhLCBzbWFydERlZmF1bHRzKSB7CiAgICAgICAgZm9yIChjb25zdCBbcG9pbnRlciwgc2NoZW1hXSBvZiBzbWFydERlZmF1bHRzLmVudHJpZXMoKSkgewogICAgICAgICAgY29uc3QgZnJhZ21lbnRzID0gSlNPTi5wYXJzZShwb2ludGVyKTsKICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3NvdXJjZU1hcC5nZXQoc2NoZW1hLiRzb3VyY2UpOwogICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2Uoc2NoZW1hKTsKICAgICAgICAgIGlmICgoMCwgcnhqc18xLmlzT2JzZXJ2YWJsZSkodmFsdWUpKSB7CiAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgKDAsIHJ4anNfMS5sYXN0VmFsdWVGcm9tKSh2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBfQ29yZVNjaGVtYVJlZ2lzdHJ5Ll9zZXQoZGF0YSwgZnJhZ21lbnRzLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHVzZVhEZXByZWNhdGVkUHJvdmlkZXIob25Vc2FnZSkgewogICAgICAgIHRoaXMuX2Fqdi5hZGRLZXl3b3JkKHsKICAgICAgICAgIGtleXdvcmQ6ICJ4LWRlcHJlY2F0ZWQiLAogICAgICAgICAgdmFsaWRhdGU6IChzY2hlbWEsIF9kYXRhLCBfcGFyZW50U2NoZW1hLCBkYXRhQ3h0KSA9PiB7CiAgICAgICAgICAgIGlmIChzY2hlbWEpIHsKICAgICAgICAgICAgICBvblVzYWdlKGBPcHRpb24gIiR7ZGF0YUN4dD8ucGFyZW50RGF0YVByb3BlcnR5fSIgaXMgZGVwcmVjYXRlZCR7dHlwZW9mIHNjaGVtYSA9PSAic3RyaW5nIiA/ICI6ICIgKyBzY2hlbWEgOiAiLiJ9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgZXJyb3JzOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIG5vcm1hbGl6ZURhdGFQYXRoQXJyKGl0KSB7CiAgICAgICAgcmV0dXJuIGl0LmRhdGFQYXRoQXJyLnNsaWNlKDEsIGl0LmRhdGFMZXZlbCArIDEpLm1hcCgocCkgPT4gdHlwZW9mIHAgPT09ICJudW1iZXIiID8gcCA6IHAuc3RyLnJlcGxhY2UoLyIvZywgIiIpKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNvcmVTY2hlbWFSZWdpc3RyeSA9IENvcmVTY2hlbWFSZWdpc3RyeTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvc2NoZW1hLmpzCnZhciByZXF1aXJlX3NjaGVtYSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9zY2hlbWEuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmlzSnNvblNjaGVtYSA9IGlzSnNvblNjaGVtYTsKICAgIGV4cG9ydHMyLm1lcmdlU2NoZW1hcyA9IG1lcmdlU2NoZW1hczsKICAgIHZhciB1dGlsc18xID0gcmVxdWlyZV91dGlscygpOwogICAgZnVuY3Rpb24gaXNKc29uU2NoZW1hKHZhbHVlKSB7CiAgICAgIHJldHVybiAoMCwgdXRpbHNfMS5pc0pzb25PYmplY3QpKHZhbHVlKSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBtZXJnZVNjaGVtYXMoLi4uc2NoZW1hcykgewogICAgICByZXR1cm4gc2NoZW1hcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHsKICAgICAgICBpZiAoY3VyciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICByZXR1cm4gcHJldjsKICAgICAgICB9CiAgICAgICAgaWYgKHByZXYgPT09IGZhbHNlIHx8IGN1cnIgPT09IGZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmIChwcmV2ID09PSB0cnVlKSB7CiAgICAgICAgICByZXR1cm4gY3VycjsKICAgICAgICB9IGVsc2UgaWYgKGN1cnIgPT09IHRydWUpIHsKICAgICAgICAgIHJldHVybiBwcmV2OwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwcmV2LmFsbE9mKSkgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3Vyci5hbGxPZikpIHsKICAgICAgICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWxsT2Y6IFsuLi5wcmV2LmFsbE9mLCAuLi5jdXJyLmFsbE9mXSB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWxsT2Y6IFsuLi5wcmV2LmFsbE9mLCBjdXJyXSB9OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXJyLmFsbE9mKSkgewogICAgICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWxsT2Y6IFtwcmV2LCAuLi5jdXJyLmFsbE9mXSB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4geyAuLi5wcmV2LCBhbGxPZjogW3ByZXYsIGN1cnJdIH07CiAgICAgICAgfQogICAgICB9LCB0cnVlKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvaW5kZXguanMKdmFyIHJlcXVpcmVfc2NoZW1hMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2NyZWF0ZUJpbmRpbmcgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7CiAgICAgIGlmICghZGVzYyB8fCAoImdldCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbVtrXTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTsKICAgIH0gOiBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBvW2syXSA9IG1ba107CiAgICB9KTsKICAgIHZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCB2KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7CiAgICB9IDogZnVuY3Rpb24obywgdikgewogICAgICBvWyJkZWZhdWx0Il0gPSB2OwogICAgfSk7CiAgICB2YXIgX19pbXBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19pbXBvcnRTdGFyIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8yKSB7CiAgICAgICAgICB2YXIgYXIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGsgaW4gbzIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzIsIGspKSBhclthci5sZW5ndGhdID0gazsKICAgICAgICAgIHJldHVybiBhcjsKICAgICAgICB9OwogICAgICAgIHJldHVybiBvd25LZXlzKG8pOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24obW9kKSB7CiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSAiZGVmYXVsdCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7CiAgICAgICAgfQogICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0oKTsKICAgIHZhciBfX2V4cG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4cG9ydFN0YXIgfHwgZnVuY3Rpb24obSwgZXhwb3J0czMpIHsKICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0czMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0czMsIG0sIHApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIudHJhbnNmb3JtcyA9IHZvaWQgMDsKICAgIHZhciB0cmFuc2Zvcm1zID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfdHJhbnNmb3JtcygpKTsKICAgIGV4cG9ydHMyLnRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfaW50ZXJmYWNlKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3BvaW50ZXIoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfcmVnaXN0cnkoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfc2NoZW1hKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3Zpc2l0b3IoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfdXRpbGl0eSgpLCBleHBvcnRzMik7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vaW5kZXguanMKdmFyIHJlcXVpcmVfanNvbiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTsKICAgICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtW2tdOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwogICAgfSA6IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIG9bazJdID0gbVtrXTsKICAgIH0pOwogICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc2V0TW9kdWxlRGVmYXVsdCB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIHYpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sICJkZWZhdWx0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTsKICAgIH0gOiBmdW5jdGlvbihvLCB2KSB7CiAgICAgIG9bImRlZmF1bHQiXSA9IHY7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2ltcG9ydFN0YXIgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24obzIpIHsKICAgICAgICAgIHZhciBhciA9IFtdOwogICAgICAgICAgZm9yICh2YXIgayBpbiBvMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMiwgaykpIGFyW2FyLmxlbmd0aF0gPSBrOwogICAgICAgICAgcmV0dXJuIGFyOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIG93bktleXMobyk7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihtb2QpIHsKICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICAgIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09ICJkZWZhdWx0IikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTsKICAgICAgICB9CiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfSgpOwogICAgdmFyIF9fZXhwb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXhwb3J0U3RhciB8fCBmdW5jdGlvbihtLCBleHBvcnRzMykgewogICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzMywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzMywgbSwgcCk7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5zY2hlbWEgPSB2b2lkIDA7CiAgICB2YXIgc2NoZW1hID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfc2NoZW1hMigpKTsKICAgIGV4cG9ydHMyLnNjaGVtYSA9IHNjaGVtYTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3V0aWxzKCksIGV4cG9ydHMyKTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2xvZ2dlci5qcwp2YXIgcmVxdWlyZV9sb2dnZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2xvZ2dlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuTG9nZ2VyID0gdm9pZCAwOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgTG9nZ2VyID0gY2xhc3MgZXh0ZW5kcyByeGpzXzEuT2JzZXJ2YWJsZSB7CiAgICAgIG5hbWU7CiAgICAgIHBhcmVudDsKICAgICAgX3N1YmplY3QgPSBuZXcgcnhqc18xLlN1YmplY3QoKTsKICAgICAgX21ldGFkYXRhOwogICAgICBfb2JzID0gcnhqc18xLkVNUFRZOwogICAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgZ2V0IF9vYnNlcnZhYmxlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9vYnM7CiAgICAgIH0KICAgICAgc2V0IF9vYnNlcnZhYmxlKHYpIHsKICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb2JzID0gdjsKICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsKICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsKICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fc3ViamVjdC5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgKGVycm9yKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkgewogICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9zdWJqZWN0LmVycm9yKGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihuYW1lLCBwYXJlbnQgPSBudWxsKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgIGNvbnN0IHBhdGggPSBbXTsKICAgICAgICBsZXQgcCA9IHBhcmVudDsKICAgICAgICB3aGlsZSAocCkgewogICAgICAgICAgcGF0aC5wdXNoKHAubmFtZSk7CiAgICAgICAgICBwID0gcC5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuX21ldGFkYXRhID0geyBuYW1lLCBwYXRoIH07CiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZSA9IHRoaXMuX3N1YmplY3QuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Ll9zdWJqZWN0KSB7CiAgICAgICAgICB0aGlzLnBhcmVudC5fc3ViamVjdC5zdWJzY3JpYmUodm9pZCAwLCB2b2lkIDAsICgpID0+IHRoaXMuY29tcGxldGUoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjcmVhdGVDaGlsZDogKG5hbWUpID0+IHRoaXMuY3JlYXRlQ2hpbGQobmFtZSksCiAgICAgICAgICBsb2c6IChsZXZlbCwgbWVzc2FnZSwgbWV0YWRhdGEpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSk7CiAgICAgICAgICB9LAogICAgICAgICAgZGVidWc6IChtZXNzYWdlLCBtZXRhZGF0YSkgPT4gdGhpcy5kZWJ1ZyhtZXNzYWdlLCBtZXRhZGF0YSksCiAgICAgICAgICBpbmZvOiAobWVzc2FnZSwgbWV0YWRhdGEpID0+IHRoaXMuaW5mbyhtZXNzYWdlLCBtZXRhZGF0YSksCiAgICAgICAgICB3YXJuOiAobWVzc2FnZSwgbWV0YWRhdGEpID0+IHRoaXMud2FybihtZXNzYWdlLCBtZXRhZGF0YSksCiAgICAgICAgICBlcnJvcjogKG1lc3NhZ2UsIG1ldGFkYXRhKSA9PiB0aGlzLmVycm9yKG1lc3NhZ2UsIG1ldGFkYXRhKSwKICAgICAgICAgIGZhdGFsOiAobWVzc2FnZSwgbWV0YWRhdGEpID0+IHRoaXMuZmF0YWwobWVzc2FnZSwgbWV0YWRhdGEpCiAgICAgICAgfTsKICAgICAgfQogICAgICBjcmVhdGVDaGlsZChuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKG5hbWUsIHRoaXMpOwogICAgICB9CiAgICAgIGNvbXBsZXRlKCkgewogICAgICAgIHRoaXMuX3N1YmplY3QuY29tcGxldGUoKTsKICAgICAgfQogICAgICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGFkYXRhID0ge30pIHsKICAgICAgICBjb25zdCBlbnRyeSA9IE9iamVjdC5hc3NpZ24oe30sIG1ldGFkYXRhLCB0aGlzLl9tZXRhZGF0YSwgewogICAgICAgICAgbGV2ZWwsCiAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgdGltZXN0YW1wOiArRGF0ZS5ub3coKQogICAgICAgIH0pOwogICAgICAgIHRoaXMuX3N1YmplY3QubmV4dChlbnRyeSk7CiAgICAgIH0KICAgICAgbmV4dChlbnRyeSkgewogICAgICAgIHRoaXMuX3N1YmplY3QubmV4dChlbnRyeSk7CiAgICAgIH0KICAgICAgZGVidWcobWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLmxvZygiZGVidWciLCBtZXNzYWdlLCBtZXRhZGF0YSk7CiAgICAgIH0KICAgICAgaW5mbyhtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9nKCJpbmZvIiwgbWVzc2FnZSwgbWV0YWRhdGEpOwogICAgICB9CiAgICAgIHdhcm4obWVzc2FnZSwgbWV0YWRhdGEgPSB7fSkgewogICAgICAgIHJldHVybiB0aGlzLmxvZygid2FybiIsIG1lc3NhZ2UsIG1ldGFkYXRhKTsKICAgICAgfQogICAgICBlcnJvcihtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9nKCJlcnJvciIsIG1lc3NhZ2UsIG1ldGFkYXRhKTsKICAgICAgfQogICAgICBmYXRhbChtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9nKCJmYXRhbCIsIG1lc3NhZ2UsIG1ldGFkYXRhKTsKICAgICAgfQogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gYDxMb2dnZXIoJHt0aGlzLm5hbWV9KT5gOwogICAgICB9CiAgICAgIGxpZnQob3BlcmF0b3IpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb2JzZXJ2YWJsZS5saWZ0KG9wZXJhdG9yKTsKICAgICAgfQogICAgICBzdWJzY3JpYmUoX29ic2VydmVyT3JOZXh0LCBfZXJyb3IsIF9jb21wbGV0ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9vYnNlcnZhYmxlLnN1YnNjcmliZS5hcHBseSgKICAgICAgICAgIHRoaXMuX29ic2VydmFibGUsCiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zCiAgICAgICAgICBhcmd1bWVudHMKICAgICAgICApOwogICAgICB9CiAgICAgIGZvckVhY2gobmV4dCwgcHJvbWlzZUN0b3IgPSBQcm9taXNlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX29ic2VydmFibGUuZm9yRWFjaChuZXh0LCBwcm9taXNlQ3Rvcik7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Mb2dnZXIgPSBMb2dnZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci9pbmRlbnQuanMKdmFyIHJlcXVpcmVfaW5kZW50ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci9pbmRlbnQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkluZGVudExvZ2dlciA9IHZvaWQgMDsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGxvZ2dlcl8xID0gcmVxdWlyZV9sb2dnZXIoKTsKICAgIHZhciBpbmRlbnRhdGlvbk1hcCA9IHt9OwogICAgdmFyIEluZGVudExvZ2dlciA9IGNsYXNzIGV4dGVuZHMgbG9nZ2VyXzEuTG9nZ2VyIHsKICAgICAgY29uc3RydWN0b3IobmFtZSwgcGFyZW50ID0gbnVsbCwgaW5kZW50YXRpb24gPSAiICAiKSB7CiAgICAgICAgc3VwZXIobmFtZSwgcGFyZW50KTsKICAgICAgICBpbmRlbnRhdGlvbk1hcFtpbmRlbnRhdGlvbl0gPSBpbmRlbnRhdGlvbk1hcFtpbmRlbnRhdGlvbl0gfHwgWyIiXTsKICAgICAgICBjb25zdCBpbmRlbnRNYXAgPSBpbmRlbnRhdGlvbk1hcFtpbmRlbnRhdGlvbl07CiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZSA9IHRoaXMuX29ic2VydmFibGUucGlwZSgoMCwgcnhqc18xLm1hcCkoKGVudHJ5KSA9PiB7CiAgICAgICAgICBjb25zdCBsID0gZW50cnkucGF0aC5maWx0ZXIoKHgpID0+ICEheCkubGVuZ3RoOwogICAgICAgICAgaWYgKGwgPj0gaW5kZW50TWFwLmxlbmd0aCkgewogICAgICAgICAgICBsZXQgY3VycmVudCA9IGluZGVudE1hcFtpbmRlbnRNYXAubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHdoaWxlIChsID49IGluZGVudE1hcC5sZW5ndGgpIHsKICAgICAgICAgICAgICBjdXJyZW50ICs9IGluZGVudGF0aW9uOwogICAgICAgICAgICAgIGluZGVudE1hcC5wdXNoKGN1cnJlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbnRyeS5tZXNzYWdlID0gaW5kZW50TWFwW2xdICsgZW50cnkubWVzc2FnZS5zcGxpdCgvXG4vKS5qb2luKCJcbiIgKyBpbmRlbnRNYXBbbF0pOwogICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgIH0pKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkluZGVudExvZ2dlciA9IEluZGVudExvZ2dlcjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2xldmVsLmpzCnZhciByZXF1aXJlX2xldmVsID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci9sZXZlbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuTGV2ZWxDYXBMb2dnZXIgPSBleHBvcnRzMi5MZXZlbFRyYW5zZm9ybUxvZ2dlciA9IHZvaWQgMDsKICAgIHZhciBsb2dnZXJfMSA9IHJlcXVpcmVfbG9nZ2VyKCk7CiAgICB2YXIgTGV2ZWxUcmFuc2Zvcm1Mb2dnZXIgPSBjbGFzcyBfTGV2ZWxUcmFuc2Zvcm1Mb2dnZXIgZXh0ZW5kcyBsb2dnZXJfMS5Mb2dnZXIgewogICAgICBuYW1lOwogICAgICBwYXJlbnQ7CiAgICAgIGxldmVsVHJhbnNmb3JtOwogICAgICBjb25zdHJ1Y3RvcihuYW1lLCBwYXJlbnQgPSBudWxsLCBsZXZlbFRyYW5zZm9ybSkgewogICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICB0aGlzLmxldmVsVHJhbnNmb3JtID0gbGV2ZWxUcmFuc2Zvcm07CiAgICAgIH0KICAgICAgbG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhZGF0YSA9IHt9KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmxvZyh0aGlzLmxldmVsVHJhbnNmb3JtKGxldmVsKSwgbWVzc2FnZSwgbWV0YWRhdGEpOwogICAgICB9CiAgICAgIGNyZWF0ZUNoaWxkKG5hbWUpIHsKICAgICAgICByZXR1cm4gbmV3IF9MZXZlbFRyYW5zZm9ybUxvZ2dlcihuYW1lLCB0aGlzLCB0aGlzLmxldmVsVHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkxldmVsVHJhbnNmb3JtTG9nZ2VyID0gTGV2ZWxUcmFuc2Zvcm1Mb2dnZXI7CiAgICB2YXIgTGV2ZWxDYXBMb2dnZXIgPSBjbGFzcyBfTGV2ZWxDYXBMb2dnZXIgZXh0ZW5kcyBMZXZlbFRyYW5zZm9ybUxvZ2dlciB7CiAgICAgIG5hbWU7CiAgICAgIHBhcmVudDsKICAgICAgbGV2ZWxDYXA7CiAgICAgIHN0YXRpYyBsZXZlbE1hcCA9IHsKICAgICAgICBkZWJ1ZzogeyBkZWJ1ZzogImRlYnVnIiwgaW5mbzogImRlYnVnIiwgd2FybjogImRlYnVnIiwgZXJyb3I6ICJkZWJ1ZyIsIGZhdGFsOiAiZGVidWciIH0sCiAgICAgICAgaW5mbzogeyBkZWJ1ZzogImRlYnVnIiwgaW5mbzogImluZm8iLCB3YXJuOiAiaW5mbyIsIGVycm9yOiAiaW5mbyIsIGZhdGFsOiAiaW5mbyIgfSwKICAgICAgICB3YXJuOiB7IGRlYnVnOiAiZGVidWciLCBpbmZvOiAiaW5mbyIsIHdhcm46ICJ3YXJuIiwgZXJyb3I6ICJ3YXJuIiwgZmF0YWw6ICJ3YXJuIiB9LAogICAgICAgIGVycm9yOiB7IGRlYnVnOiAiZGVidWciLCBpbmZvOiAiaW5mbyIsIHdhcm46ICJ3YXJuIiwgZXJyb3I6ICJlcnJvciIsIGZhdGFsOiAiZXJyb3IiIH0sCiAgICAgICAgZmF0YWw6IHsgZGVidWc6ICJkZWJ1ZyIsIGluZm86ICJpbmZvIiwgd2FybjogIndhcm4iLCBlcnJvcjogImVycm9yIiwgZmF0YWw6ICJmYXRhbCIgfQogICAgICB9OwogICAgICBjb25zdHJ1Y3RvcihuYW1lLCBwYXJlbnQgPSBudWxsLCBsZXZlbENhcCkgewogICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCwgKGxldmVsKSA9PiB7CiAgICAgICAgICByZXR1cm4gX0xldmVsQ2FwTG9nZ2VyLmxldmVsTWFwW2xldmVsQ2FwXVtsZXZlbF0gfHwgbGV2ZWw7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICB0aGlzLmxldmVsQ2FwID0gbGV2ZWxDYXA7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5MZXZlbENhcExvZ2dlciA9IExldmVsQ2FwTG9nZ2VyOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9sb2dnZXIvbnVsbC1sb2dnZXIuanMKdmFyIHJlcXVpcmVfbnVsbF9sb2dnZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL251bGwtbG9nZ2VyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5OdWxsTG9nZ2VyID0gdm9pZCAwOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgbG9nZ2VyXzEgPSByZXF1aXJlX2xvZ2dlcigpOwogICAgdmFyIE51bGxMb2dnZXIgPSBjbGFzcyBfTnVsbExvZ2dlciBleHRlbmRzIGxvZ2dlcl8xLkxvZ2dlciB7CiAgICAgIGNvbnN0cnVjdG9yKHBhcmVudCA9IG51bGwpIHsKICAgICAgICBzdXBlcigiIiwgcGFyZW50KTsKICAgICAgICB0aGlzLl9vYnNlcnZhYmxlID0gcnhqc18xLkVNUFRZOwogICAgICB9CiAgICAgIGFzQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjcmVhdGVDaGlsZDogKCkgPT4gbmV3IF9OdWxsTG9nZ2VyKHRoaXMpLAogICAgICAgICAgbG9nKCkgewogICAgICAgICAgfSwKICAgICAgICAgIGRlYnVnKCkgewogICAgICAgICAgfSwKICAgICAgICAgIGluZm8oKSB7CiAgICAgICAgICB9LAogICAgICAgICAgd2FybigpIHsKICAgICAgICAgIH0sCiAgICAgICAgICBlcnJvcigpIHsKICAgICAgICAgIH0sCiAgICAgICAgICBmYXRhbCgpIHsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuTnVsbExvZ2dlciA9IE51bGxMb2dnZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci90cmFuc2Zvcm0tbG9nZ2VyLmpzCnZhciByZXF1aXJlX3RyYW5zZm9ybV9sb2dnZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL3RyYW5zZm9ybS1sb2dnZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlRyYW5zZm9ybUxvZ2dlciA9IHZvaWQgMDsKICAgIHZhciBsb2dnZXJfMSA9IHJlcXVpcmVfbG9nZ2VyKCk7CiAgICB2YXIgVHJhbnNmb3JtTG9nZ2VyID0gY2xhc3MgZXh0ZW5kcyBsb2dnZXJfMS5Mb2dnZXIgewogICAgICBjb25zdHJ1Y3RvcihuYW1lLCB0cmFuc2Zvcm0sIHBhcmVudCA9IG51bGwpIHsKICAgICAgICBzdXBlcihuYW1lLCBwYXJlbnQpOwogICAgICAgIHRoaXMuX29ic2VydmFibGUgPSB0cmFuc2Zvcm0odGhpcy5fb2JzZXJ2YWJsZSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5UcmFuc2Zvcm1Mb2dnZXIgPSBUcmFuc2Zvcm1Mb2dnZXI7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci9pbmRleC5qcwp2YXIgcmVxdWlyZV9sb2dnZXIyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2NyZWF0ZUJpbmRpbmcgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7CiAgICAgIGlmICghZGVzYyB8fCAoImdldCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbVtrXTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTsKICAgIH0gOiBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBvW2syXSA9IG1ba107CiAgICB9KTsKICAgIHZhciBfX2V4cG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4cG9ydFN0YXIgfHwgZnVuY3Rpb24obSwgZXhwb3J0czMpIHsKICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0czMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0czMsIG0sIHApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfaW5kZW50KCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2xldmVsKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2xvZ2dlcigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9udWxsX2xvZ2dlcigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV90cmFuc2Zvcm1fbG9nZ2VyKCksIGV4cG9ydHMyKTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2RlZmluaXRpb25zLmpzCnZhciByZXF1aXJlX2RlZmluaXRpb25zID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9kZWZpbml0aW9ucy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuVGFyZ2V0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBleHBvcnRzMi5Qcm9qZWN0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSB2b2lkIDA7CiAgICB2YXIgRGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBjbGFzcyB7CiAgICAgIF9saXN0ZW5lcjsKICAgICAgX21hcDsKICAgICAgY29uc3RydWN0b3IoaW5pdGlhbCwgX2xpc3RlbmVyKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuZXIgPSBfbGlzdGVuZXI7CiAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcChpbml0aWFsICYmIE9iamVjdC5lbnRyaWVzKGluaXRpYWwpKTsKICAgICAgfQogICAgICBkZWxldGUoa2V5KSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fbWFwLmRlbGV0ZShrZXkpOwogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgIHRoaXMuX2xpc3RlbmVyPy4oa2V5LCB2b2lkIDAsIHRoaXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIHNldChrZXksIHZhbHVlKSB7CiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0gdmFsdWUgIT09IHRoaXMuZ2V0KGtleSk7CiAgICAgICAgaWYgKHVwZGF0ZWRWYWx1ZSkgewogICAgICAgICAgdGhpcy5fbWFwLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgIHRoaXMuX2xpc3RlbmVyPy4oa2V5LCB2YWx1ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykgewogICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBjYWxsYmFja2ZuKHZhbHVlLCBrZXksIHRoaXMpLCB0aGlzQXJnKTsKICAgICAgfQogICAgICBnZXQoa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoa2V5KTsKICAgICAgfQogICAgICBoYXMoa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5oYXMoa2V5KTsKICAgICAgfQogICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgICAgIH0KICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21hcFtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgICAgIH0KICAgICAgZW50cmllcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsKICAgICAgfQogICAgICBrZXlzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tYXAua2V5cygpOwogICAgICB9CiAgICAgIHZhbHVlcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gaXNKc29uVmFsdWUodmFsdWUpIHsKICAgICAgY29uc3QgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgY2FzZSAiYm9vbGVhbiI6CiAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZpc2l0ZWQuYWRkKHZhbHVlKTsKICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gIm9iamVjdCIgJiYgdmlzaXRlZC5oYXMocHJvcGVydHkpKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc0pzb25WYWx1ZShwcm9wZXJ0eSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHZhciBQcm9qZWN0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBjbGFzcyBleHRlbmRzIERlZmluaXRpb25Db2xsZWN0aW9uIHsKICAgICAgY29uc3RydWN0b3IoaW5pdGlhbCwgbGlzdGVuZXIpIHsKICAgICAgICBzdXBlcihpbml0aWFsLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgICAgYWRkKGRlZmluaXRpb24pIHsKICAgICAgICBpZiAodGhpcy5oYXMoZGVmaW5pdGlvbi5uYW1lKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQcm9qZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMuIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShkZWZpbml0aW9uLm5hbWUpOwogICAgICAgIGNvbnN0IHByb2plY3QgPSB7CiAgICAgICAgICByb290OiBkZWZpbml0aW9uLnJvb3QsCiAgICAgICAgICBwcmVmaXg6IGRlZmluaXRpb24ucHJlZml4LAogICAgICAgICAgc291cmNlUm9vdDogZGVmaW5pdGlvbi5zb3VyY2VSb290LAogICAgICAgICAgdGFyZ2V0czogbmV3IFRhcmdldERlZmluaXRpb25Db2xsZWN0aW9uKCksCiAgICAgICAgICBleHRlbnNpb25zOiB7fQogICAgICAgIH07CiAgICAgICAgaWYgKGRlZmluaXRpb24udGFyZ2V0cykgewogICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9uLnRhcmdldHMpKSB7CiAgICAgICAgICAgIGlmICh0YXJnZXQpIHsKICAgICAgICAgICAgICBwcm9qZWN0LnRhcmdldHMuc2V0KG5hbWUsIHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb24pKSB7CiAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgY2FzZSAibmFtZSI6CiAgICAgICAgICAgIGNhc2UgInJvb3QiOgogICAgICAgICAgICBjYXNlICJzb3VyY2VSb290IjoKICAgICAgICAgICAgY2FzZSAicHJlZml4IjoKICAgICAgICAgICAgY2FzZSAidGFyZ2V0cyI6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKGlzSnNvblZhbHVlKHZhbHVlKSkgewogICAgICAgICAgICAgICAgcHJvamVjdC5leHRlbnNpb25zW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCIke25hbWV9IiBtdXN0IGJlIGEgSlNPTiB2YWx1ZS5gKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cGVyLnNldChkZWZpbml0aW9uLm5hbWUsIHByb2plY3QpOwogICAgICAgIHJldHVybiBwcm9qZWN0OwogICAgICB9CiAgICAgIHNldChuYW1lLCB2YWx1ZSkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShuYW1lKTsKICAgICAgICBzdXBlci5zZXQobmFtZSwgdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIF92YWxpZGF0ZU5hbWUobmFtZSkgewogICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIgfHwgIS9eKD86QFx3W1x3Li1dKlwvKT9cd1tcdy4tXSokLy50ZXN0KG5hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlByb2plY3QgbmFtZSBtdXN0IGJlIGEgdmFsaWQgbnBtIHBhY2thZ2UgbmFtZS4iKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Qcm9qZWN0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBQcm9qZWN0RGVmaW5pdGlvbkNvbGxlY3Rpb247CiAgICB2YXIgVGFyZ2V0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBjbGFzcyBleHRlbmRzIERlZmluaXRpb25Db2xsZWN0aW9uIHsKICAgICAgY29uc3RydWN0b3IoaW5pdGlhbCwgbGlzdGVuZXIpIHsKICAgICAgICBzdXBlcihpbml0aWFsLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgICAgYWRkKGRlZmluaXRpb24pIHsKICAgICAgICBpZiAodGhpcy5oYXMoZGVmaW5pdGlvbi5uYW1lKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXJnZXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4iKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdmFsaWRhdGVOYW1lKGRlZmluaXRpb24ubmFtZSk7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgYnVpbGRlcjogZGVmaW5pdGlvbi5idWlsZGVyLAogICAgICAgICAgb3B0aW9uczogZGVmaW5pdGlvbi5vcHRpb25zLAogICAgICAgICAgY29uZmlndXJhdGlvbnM6IGRlZmluaXRpb24uY29uZmlndXJhdGlvbnMsCiAgICAgICAgICBkZWZhdWx0Q29uZmlndXJhdGlvbjogZGVmaW5pdGlvbi5kZWZhdWx0Q29uZmlndXJhdGlvbgogICAgICAgIH07CiAgICAgICAgc3VwZXIuc2V0KGRlZmluaXRpb24ubmFtZSwgdGFyZ2V0KTsKICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CiAgICAgIHNldChuYW1lLCB2YWx1ZSkgewogICAgICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShuYW1lKTsKICAgICAgICBzdXBlci5zZXQobmFtZSwgdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIF92YWxpZGF0ZU5hbWUobmFtZSkgewogICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRhcmdldCBuYW1lIG11c3QgYmUgYSBzdHJpbmcuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuVGFyZ2V0RGVmaW5pdGlvbkNvbGxlY3Rpb24gPSBUYXJnZXREZWZpbml0aW9uQ29sbGVjdGlvbjsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9wYXRoLmpzCnZhciByZXF1aXJlX3BhdGggPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9wYXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5wYXRoID0gZXhwb3J0czIuTm9ybWFsaXplZFJvb3QgPSBleHBvcnRzMi5Ob3JtYWxpemVkU2VwID0gZXhwb3J0czIuUGF0aENhbm5vdEJlRnJhZ21lbnRFeGNlcHRpb24gPSBleHBvcnRzMi5QYXRoTXVzdEJlQWJzb2x1dGVFeGNlcHRpb24gPSBleHBvcnRzMi5JbnZhbGlkUGF0aEV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIGV4cG9ydHMyLnNwbGl0ID0gc3BsaXQ7CiAgICBleHBvcnRzMi5leHRuYW1lID0gZXh0bmFtZTsKICAgIGV4cG9ydHMyLmJhc2VuYW1lID0gYmFzZW5hbWU7CiAgICBleHBvcnRzMi5kaXJuYW1lID0gZGlybmFtZTsKICAgIGV4cG9ydHMyLmpvaW4gPSBqb2luMjsKICAgIGV4cG9ydHMyLmlzQWJzb2x1dGUgPSBpc0Fic29sdXRlOwogICAgZXhwb3J0czIucmVsYXRpdmUgPSByZWxhdGl2ZTsKICAgIGV4cG9ydHMyLnJlc29sdmUgPSByZXNvbHZlOwogICAgZXhwb3J0czIuZnJhZ21lbnQgPSBmcmFnbWVudDsKICAgIGV4cG9ydHMyLnJlc2V0Tm9ybWFsaXplQ2FjaGUgPSByZXNldE5vcm1hbGl6ZUNhY2hlOwogICAgZXhwb3J0czIubm9ybWFsaXplID0gbm9ybWFsaXplOwogICAgZXhwb3J0czIubm9DYWNoZU5vcm1hbGl6ZSA9IG5vQ2FjaGVOb3JtYWxpemU7CiAgICBleHBvcnRzMi5hc1dpbmRvd3NQYXRoID0gYXNXaW5kb3dzUGF0aDsKICAgIGV4cG9ydHMyLmFzUG9zaXhQYXRoID0gYXNQb3NpeFBhdGg7CiAgICBleHBvcnRzMi5nZXRTeXN0ZW1QYXRoID0gZ2V0U3lzdGVtUGF0aDsKICAgIHZhciBleGNlcHRpb25fMSA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgSW52YWxpZFBhdGhFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGV4Y2VwdGlvbl8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihwYXRoMikgewogICAgICAgIHN1cGVyKGBQYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aDIpfSBpcyBpbnZhbGlkLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuSW52YWxpZFBhdGhFeGNlcHRpb24gPSBJbnZhbGlkUGF0aEV4Y2VwdGlvbjsKICAgIHZhciBQYXRoTXVzdEJlQWJzb2x1dGVFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGV4Y2VwdGlvbl8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihwYXRoMikgewogICAgICAgIHN1cGVyKGBQYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aDIpfSBtdXN0IGJlIGFic29sdXRlLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuUGF0aE11c3RCZUFic29sdXRlRXhjZXB0aW9uID0gUGF0aE11c3RCZUFic29sdXRlRXhjZXB0aW9uOwogICAgdmFyIFBhdGhDYW5ub3RCZUZyYWdtZW50RXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBleGNlcHRpb25fMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IocGF0aDIpIHsKICAgICAgICBzdXBlcihgUGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgyKX0gY2Fubm90IGJlIG1hZGUgYSBmcmFnbWVudC5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlBhdGhDYW5ub3RCZUZyYWdtZW50RXhjZXB0aW9uID0gUGF0aENhbm5vdEJlRnJhZ21lbnRFeGNlcHRpb247CiAgICBleHBvcnRzMi5Ob3JtYWxpemVkU2VwID0gIi8iOwogICAgZXhwb3J0czIuTm9ybWFsaXplZFJvb3QgPSBleHBvcnRzMi5Ob3JtYWxpemVkU2VwOwogICAgZnVuY3Rpb24gc3BsaXQocGF0aDIpIHsKICAgICAgY29uc3QgZnJhZ21lbnRzID0gcGF0aDIuc3BsaXQoZXhwb3J0czIuTm9ybWFsaXplZFNlcCkubWFwKCh4KSA9PiBmcmFnbWVudCh4KSk7CiAgICAgIGlmIChmcmFnbWVudHNbZnJhZ21lbnRzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGZyYWdtZW50cy5wb3AoKTsKICAgICAgfQogICAgICByZXR1cm4gZnJhZ21lbnRzOwogICAgfQogICAgZnVuY3Rpb24gZXh0bmFtZShwYXRoMikgewogICAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUocGF0aDIpOwogICAgICBjb25zdCBpID0gYmFzZS5sYXN0SW5kZXhPZigiLiIpOwogICAgICBpZiAoaSA8IDEpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGJhc2Uuc2xpY2UoaSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgyKSB7CiAgICAgIGNvbnN0IGkgPSBwYXRoMi5sYXN0SW5kZXhPZihleHBvcnRzMi5Ob3JtYWxpemVkU2VwKTsKICAgICAgaWYgKGkgPT0gLTEpIHsKICAgICAgICByZXR1cm4gZnJhZ21lbnQocGF0aDIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmcmFnbWVudChwYXRoMi5zbGljZShwYXRoMi5sYXN0SW5kZXhPZihleHBvcnRzMi5Ob3JtYWxpemVkU2VwKSArIDEpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZGlybmFtZShwYXRoMikgewogICAgICBjb25zdCBpbmRleCA9IHBhdGgyLmxhc3RJbmRleE9mKGV4cG9ydHMyLk5vcm1hbGl6ZWRTZXApOwogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICAgIGNvbnN0IGVuZEluZGV4ID0gaW5kZXggPT09IDAgPyAxIDogaW5kZXg7CiAgICAgIHJldHVybiBub3JtYWxpemUocGF0aDIuc2xpY2UoMCwgZW5kSW5kZXgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGpvaW4yKHAxLCAuLi5vdGhlcnMpIHsKICAgICAgaWYgKG90aGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSgocDEgPyBwMSArIGV4cG9ydHMyLk5vcm1hbGl6ZWRTZXAgOiAiIikgKyBvdGhlcnMuam9pbihleHBvcnRzMi5Ob3JtYWxpemVkU2VwKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHAxOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpc0Fic29sdXRlKHApIHsKICAgICAgcmV0dXJuIHAuc3RhcnRzV2l0aChleHBvcnRzMi5Ob3JtYWxpemVkU2VwKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7CiAgICAgIGlmICghaXNBYnNvbHV0ZShmcm9tKSkgewogICAgICAgIHRocm93IG5ldyBQYXRoTXVzdEJlQWJzb2x1dGVFeGNlcHRpb24oZnJvbSk7CiAgICAgIH0KICAgICAgaWYgKCFpc0Fic29sdXRlKHRvKSkgewogICAgICAgIHRocm93IG5ldyBQYXRoTXVzdEJlQWJzb2x1dGVFeGNlcHRpb24odG8pOwogICAgICB9CiAgICAgIGxldCBwOwogICAgICBpZiAoZnJvbSA9PSB0bykgewogICAgICAgIHAgPSAiIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBzcGxpdEZyb20gPSBzcGxpdChmcm9tKTsKICAgICAgICBjb25zdCBzcGxpdFRvID0gc3BsaXQodG8pOwogICAgICAgIHdoaWxlIChzcGxpdEZyb20ubGVuZ3RoID4gMCAmJiBzcGxpdFRvLmxlbmd0aCA+IDAgJiYgc3BsaXRGcm9tWzBdID09IHNwbGl0VG9bMF0pIHsKICAgICAgICAgIHNwbGl0RnJvbS5zaGlmdCgpOwogICAgICAgICAgc3BsaXRUby5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoc3BsaXRGcm9tLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBwID0gc3BsaXRUby5qb2luKGV4cG9ydHMyLk5vcm1hbGl6ZWRTZXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwID0gc3BsaXRGcm9tLm1hcCgoKSA9PiAiLi4iKS5jb25jYXQoc3BsaXRUbykuam9pbihleHBvcnRzMi5Ob3JtYWxpemVkU2VwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vcm1hbGl6ZShwKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc29sdmUocDEsIHAyKSB7CiAgICAgIGlmIChpc0Fic29sdXRlKHAyKSkgewogICAgICAgIHJldHVybiBwMjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gam9pbjIocDEsIHAyKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZnJhZ21lbnQocGF0aDIpIHsKICAgICAgaWYgKHBhdGgyLmluZGV4T2YoZXhwb3J0czIuTm9ybWFsaXplZFNlcCkgIT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgUGF0aENhbm5vdEJlRnJhZ21lbnRFeGNlcHRpb24ocGF0aDIpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoMjsKICAgIH0KICAgIHZhciBub3JtYWxpemVkQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gcmVzZXROb3JtYWxpemVDYWNoZSgpIHsKICAgICAgbm9ybWFsaXplZENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShwYXRoMikgewogICAgICBsZXQgbWF5YmVQYXRoID0gbm9ybWFsaXplZENhY2hlLmdldChwYXRoMik7CiAgICAgIGlmICghbWF5YmVQYXRoKSB7CiAgICAgICAgbWF5YmVQYXRoID0gbm9DYWNoZU5vcm1hbGl6ZShwYXRoMik7CiAgICAgICAgbm9ybWFsaXplZENhY2hlLnNldChwYXRoMiwgbWF5YmVQYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gbWF5YmVQYXRoOwogICAgfQogICAgZnVuY3Rpb24gbm9DYWNoZU5vcm1hbGl6ZShwYXRoMikgewogICAgICBpZiAocGF0aDIgPT0gIiIgfHwgcGF0aDIgPT0gIi4iKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9IGVsc2UgaWYgKHBhdGgyID09IGV4cG9ydHMyLk5vcm1hbGl6ZWRSb290KSB7CiAgICAgICAgcmV0dXJuIGV4cG9ydHMyLk5vcm1hbGl6ZWRSb290OwogICAgICB9CiAgICAgIGNvbnN0IG9yaWdpbmFsID0gcGF0aDI7CiAgICAgIGlmIChwYXRoMi5tYXRjaCgvXltBLVpdOlsvXFxdL2kpKSB7CiAgICAgICAgcGF0aDIgPSAiXFwiICsgcGF0aDJbMF0udG9VcHBlckNhc2UoKSArICJcXCIgKyBwYXRoMi5zbGljZSgzKTsKICAgICAgfQogICAgICBjb25zdCBwID0gcGF0aDIuc3BsaXQoL1svXFxdL2cpOwogICAgICBsZXQgcmVsYXRpdmUyID0gZmFsc2U7CiAgICAgIGxldCBpID0gMTsKICAgICAgaWYgKHBbMF0gIT0gIiIpIHsKICAgICAgICBwLnVuc2hpZnQoIi4iKTsKICAgICAgICByZWxhdGl2ZTIgPSB0cnVlOwogICAgICB9CiAgICAgIHdoaWxlIChpIDwgcC5sZW5ndGgpIHsKICAgICAgICBpZiAocFtpXSA9PSAiLiIpIHsKICAgICAgICAgIHAuc3BsaWNlKGksIDEpOwogICAgICAgIH0gZWxzZSBpZiAocFtpXSA9PSAiLi4iKSB7CiAgICAgICAgICBpZiAoaSA8IDIgJiYgIXJlbGF0aXZlMikgewogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhdGhFeGNlcHRpb24ob3JpZ2luYWwpOwogICAgICAgICAgfSBlbHNlIGlmIChpID49IDIgJiYgcFtpIC0gMV0gIT0gIi4uIikgewogICAgICAgICAgICBwLnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgIGktLTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHBbaV0gPT0gIiIpIHsKICAgICAgICAgIHAuc3BsaWNlKGksIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHBbMF0gPT0gIiIgPyBleHBvcnRzMi5Ob3JtYWxpemVkU2VwIDogIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHBbMF0gPT0gIi4iKSB7CiAgICAgICAgICBwLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwLmpvaW4oZXhwb3J0czIuTm9ybWFsaXplZFNlcCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBwYXRoID0gKHN0cmluZ3MzLCAuLi52YWx1ZXMpID0+IHsKICAgICAgcmV0dXJuIG5vcm1hbGl6ZShTdHJpbmcucmF3KHN0cmluZ3MzLCAuLi52YWx1ZXMpKTsKICAgIH07CiAgICBleHBvcnRzMi5wYXRoID0gcGF0aDsKICAgIGZ1bmN0aW9uIGFzV2luZG93c1BhdGgocGF0aDIpIHsKICAgICAgY29uc3QgZHJpdmUgPSBwYXRoMi5tYXRjaCgvXlwvKFx3KSg/OlwvKC4qKSk/JC8pOwogICAgICBpZiAoZHJpdmUpIHsKICAgICAgICBjb25zdCBzdWJQYXRoID0gZHJpdmVbMl0gPyBkcml2ZVsyXS5yZXBsYWNlKC9cLy9nLCAiXFwiKSA6ICIiOwogICAgICAgIHJldHVybiBgJHtkcml2ZVsxXX06XFwke3N1YlBhdGh9YDsKICAgICAgfQogICAgICByZXR1cm4gcGF0aDIucmVwbGFjZSgvXC8vZywgIlxcIik7CiAgICB9CiAgICBmdW5jdGlvbiBhc1Bvc2l4UGF0aChwYXRoMikgewogICAgICByZXR1cm4gcGF0aDI7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTeXN0ZW1QYXRoKHBhdGgyKSB7CiAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtLnN0YXJ0c1dpdGgoIndpbjMyIikpIHsKICAgICAgICByZXR1cm4gYXNXaW5kb3dzUGF0aChwYXRoMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGFzUG9zaXhQYXRoKHBhdGgyKTsKICAgICAgfQogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvYnVmZmVyLmpzCnZhciByZXF1aXJlX2J1ZmZlcjIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L2J1ZmZlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuc3RyaW5nVG9GaWxlQnVmZmVyID0gc3RyaW5nVG9GaWxlQnVmZmVyOwogICAgZXhwb3J0czIuZmlsZUJ1ZmZlclRvU3RyaW5nID0gZmlsZUJ1ZmZlclRvU3RyaW5nOwogICAgdmFyIG5vZGVfdXRpbF8xID0gcmVxdWlyZSgibm9kZTp1dGlsIik7CiAgICBmdW5jdGlvbiBzdHJpbmdUb0ZpbGVCdWZmZXIoc3RyKSB7CiAgICAgIHJldHVybiBuZXcgbm9kZV91dGlsXzEuVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKS5idWZmZXI7CiAgICB9CiAgICBmdW5jdGlvbiBmaWxlQnVmZmVyVG9TdHJpbmcoZmlsZUJ1ZmZlcikgewogICAgICBpZiAoZmlsZUJ1ZmZlci50b1N0cmluZy5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZmlsZUJ1ZmZlci50b1N0cmluZygidXRmLTgiKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IG5vZGVfdXRpbF8xLlRleHREZWNvZGVyKCJ1dGYtOCIpLmRlY29kZShuZXcgVWludDhBcnJheShmaWxlQnVmZmVyKSk7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9pbnRlcmZhY2UuanMKdmFyIHJlcXVpcmVfaW50ZXJmYWNlMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvaW50ZXJmYWNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5Ib3N0V2F0Y2hFdmVudFR5cGUgPSB2b2lkIDA7CiAgICB2YXIgSG9zdFdhdGNoRXZlbnRUeXBlOwogICAgKGZ1bmN0aW9uKEhvc3RXYXRjaEV2ZW50VHlwZTIpIHsKICAgICAgSG9zdFdhdGNoRXZlbnRUeXBlMltIb3N0V2F0Y2hFdmVudFR5cGUyWyJDaGFuZ2VkIl0gPSAwXSA9ICJDaGFuZ2VkIjsKICAgICAgSG9zdFdhdGNoRXZlbnRUeXBlMltIb3N0V2F0Y2hFdmVudFR5cGUyWyJDcmVhdGVkIl0gPSAxXSA9ICJDcmVhdGVkIjsKICAgICAgSG9zdFdhdGNoRXZlbnRUeXBlMltIb3N0V2F0Y2hFdmVudFR5cGUyWyJEZWxldGVkIl0gPSAyXSA9ICJEZWxldGVkIjsKICAgICAgSG9zdFdhdGNoRXZlbnRUeXBlMltIb3N0V2F0Y2hFdmVudFR5cGUyWyJSZW5hbWVkIl0gPSAzXSA9ICJSZW5hbWVkIjsKICAgIH0pKEhvc3RXYXRjaEV2ZW50VHlwZSB8fCAoZXhwb3J0czIuSG9zdFdhdGNoRXZlbnRUeXBlID0gSG9zdFdhdGNoRXZlbnRUeXBlID0ge30pKTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L21lbW9yeS5qcwp2YXIgcmVxdWlyZV9tZW1vcnkgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L21lbW9yeS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuU2ltcGxlTWVtb3J5SG9zdCA9IHZvaWQgMDsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBwYXRoXzEgPSByZXF1aXJlX3BhdGgoKTsKICAgIHZhciBpbnRlcmZhY2VfMSA9IHJlcXVpcmVfaW50ZXJmYWNlMigpOwogICAgdmFyIFNpbXBsZU1lbW9yeUhvc3QgPSBjbGFzcyB7CiAgICAgIF9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIF93YXRjaGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIF9uZXdEaXJTdGF0cygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaW5zcGVjdCgpIHsKICAgICAgICAgICAgcmV0dXJuICI8RGlyZWN0b3J5PiI7CiAgICAgICAgICB9LAogICAgICAgICAgaXNGaWxlKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9LAogICAgICAgICAgaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIHNpemU6IDAsCiAgICAgICAgICBhdGltZTogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksCiAgICAgICAgICBjdGltZTogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksCiAgICAgICAgICBtdGltZTogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksCiAgICAgICAgICBiaXJ0aHRpbWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgY29udGVudDogbnVsbAogICAgICAgIH07CiAgICAgIH0KICAgICAgX25ld0ZpbGVTdGF0cyhjb250ZW50LCBvbGRTdGF0cykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpbnNwZWN0KCkgewogICAgICAgICAgICByZXR1cm4gYDxGaWxlIHNpemUoJHtjb250ZW50LmJ5dGVMZW5ndGh9KT5gOwogICAgICAgICAgfSwKICAgICAgICAgIGlzRmlsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzaXplOiBjb250ZW50LmJ5dGVMZW5ndGgsCiAgICAgICAgICBhdGltZTogb2xkU3RhdHMgPyBvbGRTdGF0cy5hdGltZSA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgY3RpbWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgbXRpbWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgYmlydGh0aW1lOiBvbGRTdGF0cyA/IG9sZFN0YXRzLmJpcnRodGltZSA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgY29udGVudAogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fY2FjaGUuc2V0KCgwLCBwYXRoXzEubm9ybWFsaXplKSgiLyIpLCB0aGlzLl9uZXdEaXJTdGF0cygpKTsKICAgICAgfQogICAgICBfdG9BYnNvbHV0ZShwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCBwYXRoXzEuaXNBYnNvbHV0ZSkocGF0aCkgPyBwYXRoIDogKDAsIHBhdGhfMS5ub3JtYWxpemUpKCIvIiArIHBhdGgpOwogICAgICB9CiAgICAgIF91cGRhdGVXYXRjaGVycyhwYXRoLCB0eXBlKSB7CiAgICAgICAgY29uc3QgdGltZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIGxldCBjdXJyZW50UGF0aCA9IHBhdGg7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgaWYgKHRoaXMuX3dhdGNoZXJzLnNpemUgPT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXliZVdhdGNoZXIgPSB0aGlzLl93YXRjaGVycy5nZXQoY3VycmVudFBhdGgpOwogICAgICAgIGlmIChtYXliZVdhdGNoZXIpIHsKICAgICAgICAgIG1heWJlV2F0Y2hlci5mb3JFYWNoKCh3YXRjaGVyKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IFtvcHRpb25zLCBzdWJqZWN0XSA9IHdhdGNoZXI7CiAgICAgICAgICAgIHN1YmplY3QubmV4dCh7IHBhdGgsIHRpbWUsIHR5cGUgfSk7CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wZXJzaXN0ZW50ICYmIHR5cGUgPT0gaW50ZXJmYWNlXzEuSG9zdFdhdGNoRXZlbnRUeXBlLkRlbGV0ZWQpIHsKICAgICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMuZGVsZXRlKGN1cnJlbnRQYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGRvIHsKICAgICAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50ICE9PSBudWxsID8gcGFyZW50IDogY3VycmVudFBhdGg7CiAgICAgICAgICBwYXJlbnQgPSAoMCwgcGF0aF8xLmRpcm5hbWUpKGN1cnJlbnRQYXRoKTsKICAgICAgICAgIGNvbnN0IG1heWJlV2F0Y2hlcjIgPSB0aGlzLl93YXRjaGVycy5nZXQoY3VycmVudFBhdGgpOwogICAgICAgICAgaWYgKG1heWJlV2F0Y2hlcjIpIHsKICAgICAgICAgICAgbWF5YmVXYXRjaGVyMi5mb3JFYWNoKCh3YXRjaGVyKSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgW29wdGlvbnMsIHN1YmplY3RdID0gd2F0Y2hlcjsKICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVjdXJzaXZlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1YmplY3QubmV4dCh7IHBhdGgsIHRpbWUsIHR5cGUgfSk7CiAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBlcnNpc3RlbnQgJiYgdHlwZSA9PSBpbnRlcmZhY2VfMS5Ib3N0V2F0Y2hFdmVudFR5cGUuRGVsZXRlZCkgewogICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMuZGVsZXRlKGN1cnJlbnRQYXRoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKHBhcmVudCAhPSBjdXJyZW50UGF0aCk7CiAgICAgIH0KICAgICAgZ2V0IGNhcGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4geyBzeW5jaHJvbm91czogdHJ1ZSB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBMaXN0IG9mIHByb3RlY3RlZCBtZXRob2RzIHRoYXQgZ2l2ZSBkaXJlY3QgYWNjZXNzIG91dHNpZGUgdGhlIG9ic2VydmFibGVzIHRvIHRoZSBjYWNoZQogICAgICAgKiBhbmQgaW50ZXJuYWwgc3RhdGVzLgogICAgICAgKi8KICAgICAgX3dyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICBwYXRoID0gdGhpcy5fdG9BYnNvbHV0ZShwYXRoKTsKICAgICAgICBjb25zdCBvbGQgPSB0aGlzLl9jYWNoZS5nZXQocGF0aCk7CiAgICAgICAgaWYgKG9sZCAmJiBvbGQuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLlBhdGhJc0RpcmVjdG9yeUV4Y2VwdGlvbihwYXRoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZnJhZ21lbnRzID0gKDAsIHBhdGhfMS5zcGxpdCkocGF0aCk7CiAgICAgICAgbGV0IGN1cnIgPSAoMCwgcGF0aF8xLm5vcm1hbGl6ZSkoIi8iKTsKICAgICAgICBmb3IgKGNvbnN0IGZyIG9mIGZyYWdtZW50cykgewogICAgICAgICAgY3VyciA9ICgwLCBwYXRoXzEuam9pbikoY3VyciwgZnIpOwogICAgICAgICAgY29uc3QgbWF5YmVTdGF0cyA9IHRoaXMuX2NhY2hlLmdldChmcik7CiAgICAgICAgICBpZiAobWF5YmVTdGF0cykgewogICAgICAgICAgICBpZiAobWF5YmVTdGF0cy5pc0ZpbGUoKSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5QYXRoSXNGaWxlRXhjZXB0aW9uKGN1cnIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9jYWNoZS5zZXQoY3VyciwgdGhpcy5fbmV3RGlyU3RhdHMoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5fbmV3RmlsZVN0YXRzKGNvbnRlbnQsIG9sZCk7CiAgICAgICAgdGhpcy5fY2FjaGUuc2V0KHBhdGgsIHN0YXRzKTsKICAgICAgICB0aGlzLl91cGRhdGVXYXRjaGVycyhwYXRoLCBvbGQgPyBpbnRlcmZhY2VfMS5Ib3N0V2F0Y2hFdmVudFR5cGUuQ2hhbmdlZCA6IGludGVyZmFjZV8xLkhvc3RXYXRjaEV2ZW50VHlwZS5DcmVhdGVkKTsKICAgICAgfQogICAgICBfcmVhZChwYXRoKSB7CiAgICAgICAgcGF0aCA9IHRoaXMuX3RvQWJzb2x1dGUocGF0aCk7CiAgICAgICAgY29uc3QgbWF5YmVTdGF0cyA9IHRoaXMuX2NhY2hlLmdldChwYXRoKTsKICAgICAgICBpZiAoIW1heWJlU3RhdHMpIHsKICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHBhdGgpOwogICAgICAgIH0gZWxzZSBpZiAobWF5YmVTdGF0cy5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuUGF0aElzRGlyZWN0b3J5RXhjZXB0aW9uKHBhdGgpOwogICAgICAgIH0gZWxzZSBpZiAoIW1heWJlU3RhdHMuY29udGVudCkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLlBhdGhJc0RpcmVjdG9yeUV4Y2VwdGlvbihwYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG1heWJlU3RhdHMuY29udGVudDsKICAgICAgICB9CiAgICAgIH0KICAgICAgX2RlbGV0ZShwYXRoKSB7CiAgICAgICAgcGF0aCA9IHRoaXMuX3RvQWJzb2x1dGUocGF0aCk7CiAgICAgICAgaWYgKHRoaXMuX2lzRGlyZWN0b3J5KHBhdGgpKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtjYWNoZVBhdGhdIG9mIHRoaXMuX2NhY2hlLmVudHJpZXMoKSkgewogICAgICAgICAgICBpZiAoY2FjaGVQYXRoLnN0YXJ0c1dpdGgocGF0aCArIHBhdGhfMS5Ob3JtYWxpemVkU2VwKSB8fCBjYWNoZVBhdGggPT09IHBhdGgpIHsKICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5kZWxldGUoY2FjaGVQYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9jYWNoZS5kZWxldGUocGF0aCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VwZGF0ZVdhdGNoZXJzKHBhdGgsIGludGVyZmFjZV8xLkhvc3RXYXRjaEV2ZW50VHlwZS5EZWxldGVkKTsKICAgICAgfQogICAgICBfcmVuYW1lKGZyb20sIHRvKSB7CiAgICAgICAgZnJvbSA9IHRoaXMuX3RvQWJzb2x1dGUoZnJvbSk7CiAgICAgICAgdG8gPSB0aGlzLl90b0Fic29sdXRlKHRvKTsKICAgICAgICBpZiAoIXRoaXMuX2NhY2hlLmhhcyhmcm9tKSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24oZnJvbSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jYWNoZS5oYXModG8pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbih0byk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0RpcmVjdG9yeShmcm9tKSkgewogICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuX2NhY2hlLmtleXMoKSkgewogICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGZyb20gKyBwYXRoXzEuTm9ybWFsaXplZFNlcCkpIHsKICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY2FjaGUuZ2V0KHBhdGgpOwogICAgICAgICAgICAgIGlmIChjb250ZW50KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5zZXQoKDAsIHBhdGhfMS5qb2luKSh0bywgcGF0aF8xLk5vcm1hbGl6ZWRTZXAsIHBhdGguc2xpY2UoZnJvbS5sZW5ndGgpKSwgY29udGVudCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9jYWNoZS5nZXQoZnJvbSk7CiAgICAgICAgICBpZiAoY29udGVudCkgewogICAgICAgICAgICBjb25zdCBmcmFnbWVudHMgPSAoMCwgcGF0aF8xLnNwbGl0KSh0byk7CiAgICAgICAgICAgIGNvbnN0IG5ld0RpcmVjdG9yaWVzID0gW107CiAgICAgICAgICAgIGxldCBjdXJyID0gKDAsIHBhdGhfMS5ub3JtYWxpemUpKCIvIik7CiAgICAgICAgICAgIGZvciAoY29uc3QgZnIgb2YgZnJhZ21lbnRzKSB7CiAgICAgICAgICAgICAgY3VyciA9ICgwLCBwYXRoXzEuam9pbikoY3VyciwgZnIpOwogICAgICAgICAgICAgIGNvbnN0IG1heWJlU3RhdHMgPSB0aGlzLl9jYWNoZS5nZXQoZnIpOwogICAgICAgICAgICAgIGlmIChtYXliZVN0YXRzKSB7CiAgICAgICAgICAgICAgICBpZiAobWF5YmVTdGF0cy5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuUGF0aElzRmlsZUV4Y2VwdGlvbihjdXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV3RGlyZWN0b3JpZXMucHVzaChjdXJyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCBuZXdEaXJlY3Rvcnkgb2YgbmV3RGlyZWN0b3JpZXMpIHsKICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5zZXQobmV3RGlyZWN0b3J5LCB0aGlzLl9uZXdEaXJTdGF0cygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jYWNoZS5kZWxldGUoZnJvbSk7CiAgICAgICAgICAgIHRoaXMuX2NhY2hlLnNldCh0bywgY29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VwZGF0ZVdhdGNoZXJzKGZyb20sIGludGVyZmFjZV8xLkhvc3RXYXRjaEV2ZW50VHlwZS5SZW5hbWVkKTsKICAgICAgfQogICAgICBfbGlzdChwYXRoKSB7CiAgICAgICAgcGF0aCA9IHRoaXMuX3RvQWJzb2x1dGUocGF0aCk7CiAgICAgICAgaWYgKHRoaXMuX2lzRmlsZShwYXRoKSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLlBhdGhJc0ZpbGVFeGNlcHRpb24ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZyYWdtZW50cyA9ICgwLCBwYXRoXzEuc3BsaXQpKHBhdGgpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgaWYgKHBhdGggIT09IHBhdGhfMS5Ob3JtYWxpemVkUm9vdCkgewogICAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX2NhY2hlLmtleXMoKSkgewogICAgICAgICAgICBpZiAocC5zdGFydHNXaXRoKHBhdGggKyBwYXRoXzEuTm9ybWFsaXplZFNlcCkpIHsKICAgICAgICAgICAgICByZXN1bHQuYWRkKCgwLCBwYXRoXzEuc3BsaXQpKHApW2ZyYWdtZW50cy5sZW5ndGhdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fY2FjaGUua2V5cygpKSB7CiAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgocGF0aF8xLk5vcm1hbGl6ZWRTZXApICYmIHAgIT09IHBhdGhfMS5Ob3JtYWxpemVkUm9vdCkgewogICAgICAgICAgICAgIHJlc3VsdC5hZGQoKDAsIHBhdGhfMS5zcGxpdCkocClbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBbLi4ucmVzdWx0XTsKICAgICAgfQogICAgICBfZXhpc3RzKHBhdGgpIHsKICAgICAgICByZXR1cm4gISF0aGlzLl9jYWNoZS5nZXQodGhpcy5fdG9BYnNvbHV0ZShwYXRoKSk7CiAgICAgIH0KICAgICAgX2lzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICBjb25zdCBtYXliZVN0YXRzID0gdGhpcy5fY2FjaGUuZ2V0KHRoaXMuX3RvQWJzb2x1dGUocGF0aCkpOwogICAgICAgIHJldHVybiBtYXliZVN0YXRzID8gbWF5YmVTdGF0cy5pc0RpcmVjdG9yeSgpIDogZmFsc2U7CiAgICAgIH0KICAgICAgX2lzRmlsZShwYXRoKSB7CiAgICAgICAgY29uc3QgbWF5YmVTdGF0cyA9IHRoaXMuX2NhY2hlLmdldCh0aGlzLl90b0Fic29sdXRlKHBhdGgpKTsKICAgICAgICByZXR1cm4gbWF5YmVTdGF0cyA/IG1heWJlU3RhdHMuaXNGaWxlKCkgOiBmYWxzZTsKICAgICAgfQogICAgICBfc3RhdChwYXRoKSB7CiAgICAgICAgY29uc3QgbWF5YmVTdGF0cyA9IHRoaXMuX2NhY2hlLmdldCh0aGlzLl90b0Fic29sdXRlKHBhdGgpKTsKICAgICAgICBpZiAoIW1heWJlU3RhdHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbWF5YmVTdGF0czsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3dhdGNoKHBhdGgsIG9wdGlvbnMpIHsKICAgICAgICBwYXRoID0gdGhpcy5fdG9BYnNvbHV0ZShwYXRoKTsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IHJ4anNfMS5TdWJqZWN0KCk7CiAgICAgICAgbGV0IG1heWJlV2F0Y2hlckFycmF5ID0gdGhpcy5fd2F0Y2hlcnMuZ2V0KHBhdGgpOwogICAgICAgIGlmICghbWF5YmVXYXRjaGVyQXJyYXkpIHsKICAgICAgICAgIG1heWJlV2F0Y2hlckFycmF5ID0gW107CiAgICAgICAgICB0aGlzLl93YXRjaGVycy5zZXQocGF0aCwgbWF5YmVXYXRjaGVyQXJyYXkpOwogICAgICAgIH0KICAgICAgICBtYXliZVdhdGNoZXJBcnJheS5wdXNoKFtvcHRpb25zIHx8IHt9LCBzdWJqZWN0XSk7CiAgICAgICAgcmV0dXJuIHN1YmplY3QuYXNPYnNlcnZhYmxlKCk7CiAgICAgIH0KICAgICAgd3JpdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgdGhpcy5fd3JpdGUocGF0aCwgY29udGVudCk7CiAgICAgICAgICBvYnMubmV4dCgpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgcmV0dXJuIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzKSA9PiB7CiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcmVhZChwYXRoKTsKICAgICAgICAgIG9icy5uZXh0KGNvbnRlbnQpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIHRoaXMuX2RlbGV0ZShwYXRoKTsKICAgICAgICAgIG9icy5uZXh0KCk7CiAgICAgICAgICBvYnMuY29tcGxldGUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZW5hbWUoZnJvbSwgdG8pIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIHRoaXMuX3JlbmFtZShmcm9tLCB0byk7CiAgICAgICAgICBvYnMubmV4dCgpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbGlzdChwYXRoKSB7CiAgICAgICAgcmV0dXJuIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzKSA9PiB7CiAgICAgICAgICBvYnMubmV4dCh0aGlzLl9saXN0KHBhdGgpKTsKICAgICAgICAgIG9icy5jb21wbGV0ZSgpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzKSA9PiB7CiAgICAgICAgICBvYnMubmV4dCh0aGlzLl9leGlzdHMocGF0aCkpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaXNEaXJlY3RvcnkocGF0aCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgb2JzLm5leHQodGhpcy5faXNEaXJlY3RvcnkocGF0aCkpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaXNGaWxlKHBhdGgpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIG9icy5uZXh0KHRoaXMuX2lzRmlsZShwYXRoKSk7CiAgICAgICAgICBvYnMuY29tcGxldGUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCBzdGF0LgogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIG9icy5uZXh0KHRoaXMuX3N0YXQocGF0aCkpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgd2F0Y2gocGF0aCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiB0aGlzLl93YXRjaChwYXRoLCBvcHRpb25zKTsKICAgICAgfQogICAgICByZXNldCgpIHsKICAgICAgICB0aGlzLl9jYWNoZS5jbGVhcigpOwogICAgICAgIHRoaXMuX3dhdGNoZXJzLmNsZWFyKCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5TaW1wbGVNZW1vcnlIb3N0ID0gU2ltcGxlTWVtb3J5SG9zdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3N5bmMuanMKdmFyIHJlcXVpcmVfc3luYyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3Qvc3luYy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuU3luY0RlbGVnYXRlSG9zdCA9IGV4cG9ydHMyLlN5bmNocm9ub3VzRGVsZWdhdGVFeHBlY3RlZEV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIHZhciBleGNlcHRpb25fMSA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgU3luY2hyb25vdXNEZWxlZ2F0ZUV4cGVjdGVkRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBleGNlcHRpb25fMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoYEV4cGVjdGVkIGEgc3luY2hyb25vdXMgZGVsZWdhdGUgYnV0IGdvdCBhbiBhc3luY2hyb25vdXMgb25lLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuU3luY2hyb25vdXNEZWxlZ2F0ZUV4cGVjdGVkRXhjZXB0aW9uID0gU3luY2hyb25vdXNEZWxlZ2F0ZUV4cGVjdGVkRXhjZXB0aW9uOwogICAgdmFyIFN5bmNEZWxlZ2F0ZUhvc3QgPSBjbGFzcyB7CiAgICAgIF9kZWxlZ2F0ZTsKICAgICAgY29uc3RydWN0b3IoX2RlbGVnYXRlKSB7CiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7CiAgICAgICAgaWYgKCFfZGVsZWdhdGUuY2FwYWJpbGl0aWVzLnN5bmNocm9ub3VzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgU3luY2hyb25vdXNEZWxlZ2F0ZUV4cGVjdGVkRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9kb1N5bmNDYWxsKG9ic2VydmFibGUpIHsKICAgICAgICBsZXQgY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdCA9IHZvaWQgMDsKICAgICAgICBsZXQgZXJyb3JSZXN1bHQgPSB2b2lkIDA7CiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHgpID0+IHJlc3VsdCA9IHgsIChlcnIpID0+IGVycm9yUmVzdWx0ID0gZXJyLCAoKSA9PiBjb21wbGV0ZWQgPSB0cnVlKTsKICAgICAgICBpZiAoZXJyb3JSZXN1bHQgIT09IHZvaWQgMCkgewogICAgICAgICAgdGhyb3cgZXJyb3JSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmICghY29tcGxldGVkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgU3luY2hyb25vdXNEZWxlZ2F0ZUV4cGVjdGVkRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgZ2V0IGNhcGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY2FwYWJpbGl0aWVzOwogICAgICB9CiAgICAgIGdldCBkZWxlZ2F0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7CiAgICAgIH0KICAgICAgd3JpdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLl9kb1N5bmNDYWxsKHRoaXMuX2RlbGVnYXRlLndyaXRlKHBhdGgsIGNvbnRlbnQpKTsKICAgICAgfQogICAgICByZWFkKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9TeW5jQ2FsbCh0aGlzLl9kZWxlZ2F0ZS5yZWFkKHBhdGgpKTsKICAgICAgfQogICAgICBkZWxldGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9kb1N5bmNDYWxsKHRoaXMuX2RlbGVnYXRlLmRlbGV0ZShwYXRoKSk7CiAgICAgIH0KICAgICAgcmVuYW1lKGZyb20sIHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RvU3luY0NhbGwodGhpcy5fZGVsZWdhdGUucmVuYW1lKGZyb20sIHRvKSk7CiAgICAgIH0KICAgICAgbGlzdChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RvU3luY0NhbGwodGhpcy5fZGVsZWdhdGUubGlzdChwYXRoKSk7CiAgICAgIH0KICAgICAgZXhpc3RzKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9TeW5jQ2FsbCh0aGlzLl9kZWxlZ2F0ZS5leGlzdHMocGF0aCkpOwogICAgICB9CiAgICAgIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9TeW5jQ2FsbCh0aGlzLl9kZWxlZ2F0ZS5pc0RpcmVjdG9yeShwYXRoKSk7CiAgICAgIH0KICAgICAgaXNGaWxlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9TeW5jQ2FsbCh0aGlzLl9kZWxlZ2F0ZS5pc0ZpbGUocGF0aCkpOwogICAgICB9CiAgICAgIC8vIFNvbWUgaG9zdHMgbWF5IG5vdCBzdXBwb3J0IHN0YXQuCiAgICAgIHN0YXQocGF0aCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlbGVnYXRlLnN0YXQocGF0aCk7CiAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2RvU3luY0NhbGwocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdhdGNoKHBhdGgsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUud2F0Y2gocGF0aCwgb3B0aW9ucyk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5TeW5jRGVsZWdhdGVIb3N0ID0gU3luY0RlbGVnYXRlSG9zdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3Rlc3QuanMKdmFyIHJlcXVpcmVfdGVzdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvdGVzdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuVGVzdEhvc3QgPSB2b2lkIDA7CiAgICB2YXIgcGF0aF8xID0gcmVxdWlyZV9wYXRoKCk7CiAgICB2YXIgYnVmZmVyXzEgPSByZXF1aXJlX2J1ZmZlcjIoKTsKICAgIHZhciBtZW1vcnlfMSA9IHJlcXVpcmVfbWVtb3J5KCk7CiAgICB2YXIgc3luY18xID0gcmVxdWlyZV9zeW5jKCk7CiAgICB2YXIgVGVzdEhvc3QgPSBjbGFzcyBfVGVzdEhvc3QgZXh0ZW5kcyBtZW1vcnlfMS5TaW1wbGVNZW1vcnlIb3N0IHsKICAgICAgX3JlY29yZHMgPSBbXTsKICAgICAgX3N5bmMgPSBudWxsOwogICAgICBjb25zdHJ1Y3RvcihtYXAgPSB7fSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtYXApKSB7CiAgICAgICAgICB0aGlzLl93cml0ZSgoMCwgcGF0aF8xLm5vcm1hbGl6ZSkoZmlsZVBhdGgpLCAoMCwgYnVmZmVyXzEuc3RyaW5nVG9GaWxlQnVmZmVyKShtYXBbZmlsZVBhdGhdKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldCByZWNvcmRzKCkgewogICAgICAgIHJldHVybiBbLi4udGhpcy5fcmVjb3Jkc107CiAgICAgIH0KICAgICAgY2xlYXJSZWNvcmRzKCkgewogICAgICAgIHRoaXMuX3JlY29yZHMgPSBbXTsKICAgICAgfQogICAgICBnZXQgZmlsZXMoKSB7CiAgICAgICAgY29uc3Qgc3luYyA9IHRoaXMuc3luYzsKICAgICAgICBmdW5jdGlvbiBfdmlzaXQocCkgewogICAgICAgICAgcmV0dXJuIHN5bmMubGlzdChwKS5tYXAoKGZyYWdtZW50KSA9PiAoMCwgcGF0aF8xLmpvaW4pKHAsIGZyYWdtZW50KSkucmVkdWNlKChmaWxlcywgcGF0aCkgPT4gewogICAgICAgICAgICBpZiAoc3luYy5pc0RpcmVjdG9yeShwYXRoKSkgewogICAgICAgICAgICAgIHJldHVybiBmaWxlcy5jb25jYXQoX3Zpc2l0KHBhdGgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gZmlsZXMuY29uY2F0KHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdmlzaXQoKDAsIHBhdGhfMS5ub3JtYWxpemUpKCIvIikpOwogICAgICB9CiAgICAgIGdldCBzeW5jKCkgewogICAgICAgIGlmICghdGhpcy5fc3luYykgewogICAgICAgICAgdGhpcy5fc3luYyA9IG5ldyBzeW5jXzEuU3luY0RlbGVnYXRlSG9zdCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3N5bmM7CiAgICAgIH0KICAgICAgY2xvbmUoKSB7CiAgICAgICAgY29uc3QgbmV3SG9zdCA9IG5ldyBfVGVzdEhvc3QoKTsKICAgICAgICBuZXdIb3N0Ll9jYWNoZSA9IG5ldyBNYXAodGhpcy5fY2FjaGUpOwogICAgICAgIHJldHVybiBuZXdIb3N0OwogICAgICB9CiAgICAgIC8vIE92ZXJyaWRlIHBhcmVudHMgZnVuY3Rpb25zIHRvIGtlZXAgYSByZWNvcmQgb2YgYWxsIG9wZXJhdG9ycyB0aGF0IHdlcmUgZG9uZS4KICAgICAgX3dyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICB0aGlzLl9yZWNvcmRzLnB1c2goeyBraW5kOiAid3JpdGUiLCBwYXRoIH0pOwogICAgICAgIHJldHVybiBzdXBlci5fd3JpdGUocGF0aCwgY29udGVudCk7CiAgICAgIH0KICAgICAgX3JlYWQocGF0aCkgewogICAgICAgIHRoaXMuX3JlY29yZHMucHVzaCh7IGtpbmQ6ICJyZWFkIiwgcGF0aCB9KTsKICAgICAgICByZXR1cm4gc3VwZXIuX3JlYWQocGF0aCk7CiAgICAgIH0KICAgICAgX2RlbGV0ZShwYXRoKSB7CiAgICAgICAgdGhpcy5fcmVjb3Jkcy5wdXNoKHsga2luZDogImRlbGV0ZSIsIHBhdGggfSk7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9kZWxldGUocGF0aCk7CiAgICAgIH0KICAgICAgX3JlbmFtZShmcm9tLCB0bykgewogICAgICAgIHRoaXMuX3JlY29yZHMucHVzaCh7IGtpbmQ6ICJyZW5hbWUiLCBmcm9tLCB0byB9KTsKICAgICAgICByZXR1cm4gc3VwZXIuX3JlbmFtZShmcm9tLCB0byk7CiAgICAgIH0KICAgICAgX2xpc3QocGF0aCkgewogICAgICAgIHRoaXMuX3JlY29yZHMucHVzaCh7IGtpbmQ6ICJsaXN0IiwgcGF0aCB9KTsKICAgICAgICByZXR1cm4gc3VwZXIuX2xpc3QocGF0aCk7CiAgICAgIH0KICAgICAgX2V4aXN0cyhwYXRoKSB7CiAgICAgICAgdGhpcy5fcmVjb3Jkcy5wdXNoKHsga2luZDogImV4aXN0cyIsIHBhdGggfSk7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9leGlzdHMocGF0aCk7CiAgICAgIH0KICAgICAgX2lzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICB0aGlzLl9yZWNvcmRzLnB1c2goeyBraW5kOiAiaXNEaXJlY3RvcnkiLCBwYXRoIH0pOwogICAgICAgIHJldHVybiBzdXBlci5faXNEaXJlY3RvcnkocGF0aCk7CiAgICAgIH0KICAgICAgX2lzRmlsZShwYXRoKSB7CiAgICAgICAgdGhpcy5fcmVjb3Jkcy5wdXNoKHsga2luZDogImlzRmlsZSIsIHBhdGggfSk7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9pc0ZpbGUocGF0aCk7CiAgICAgIH0KICAgICAgX3N0YXQocGF0aCkgewogICAgICAgIHRoaXMuX3JlY29yZHMucHVzaCh7IGtpbmQ6ICJzdGF0IiwgcGF0aCB9KTsKICAgICAgICByZXR1cm4gc3VwZXIuX3N0YXQocGF0aCk7CiAgICAgIH0KICAgICAgX3dhdGNoKHBhdGgsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9yZWNvcmRzLnB1c2goeyBraW5kOiAid2F0Y2giLCBwYXRoIH0pOwogICAgICAgIHJldHVybiBzdXBlci5fd2F0Y2gocGF0aCwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgJHdyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuX3dyaXRlKCgwLCBwYXRoXzEubm9ybWFsaXplKShwYXRoKSwgKDAsIGJ1ZmZlcl8xLnN0cmluZ1RvRmlsZUJ1ZmZlcikoY29udGVudCkpOwogICAgICB9CiAgICAgICRyZWFkKHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIGJ1ZmZlcl8xLmZpbGVCdWZmZXJUb1N0cmluZykoc3VwZXIuX3JlYWQoKDAsIHBhdGhfMS5ub3JtYWxpemUpKHBhdGgpKSk7CiAgICAgIH0KICAgICAgJGxpc3QocGF0aCkgewogICAgICAgIHJldHVybiBzdXBlci5fbGlzdCgoMCwgcGF0aF8xLm5vcm1hbGl6ZSkocGF0aCkpOwogICAgICB9CiAgICAgICRleGlzdHMocGF0aCkgewogICAgICAgIHJldHVybiBzdXBlci5fZXhpc3RzKCgwLCBwYXRoXzEubm9ybWFsaXplKShwYXRoKSk7CiAgICAgIH0KICAgICAgJGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICByZXR1cm4gc3VwZXIuX2lzRGlyZWN0b3J5KCgwLCBwYXRoXzEubm9ybWFsaXplKShwYXRoKSk7CiAgICAgIH0KICAgICAgJGlzRmlsZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9pc0ZpbGUoKDAsIHBhdGhfMS5ub3JtYWxpemUpKHBhdGgpKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlRlc3RIb3N0ID0gVGVzdEhvc3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9yZXNvbHZlci5qcwp2YXIgcmVxdWlyZV9yZXNvbHZlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvcmVzb2x2ZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlJlc29sdmVySG9zdCA9IHZvaWQgMDsKICAgIHZhciBSZXNvbHZlckhvc3QgPSBjbGFzcyB7CiAgICAgIF9kZWxlZ2F0ZTsKICAgICAgY29uc3RydWN0b3IoX2RlbGVnYXRlKSB7CiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7CiAgICAgIH0KICAgICAgZ2V0IGNhcGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY2FwYWJpbGl0aWVzOwogICAgICB9CiAgICAgIHdyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUud3JpdGUodGhpcy5fcmVzb2x2ZShwYXRoKSwgY29udGVudCk7CiAgICAgIH0KICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnJlYWQodGhpcy5fcmVzb2x2ZShwYXRoKSk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZGVsZXRlKHRoaXMuX3Jlc29sdmUocGF0aCkpOwogICAgICB9CiAgICAgIHJlbmFtZShmcm9tLCB0bykgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5yZW5hbWUodGhpcy5fcmVzb2x2ZShmcm9tKSwgdGhpcy5fcmVzb2x2ZSh0bykpOwogICAgICB9CiAgICAgIGxpc3QocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5saXN0KHRoaXMuX3Jlc29sdmUocGF0aCkpOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmV4aXN0cyh0aGlzLl9yZXNvbHZlKHBhdGgpKTsKICAgICAgfQogICAgICBpc0RpcmVjdG9yeShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlzRGlyZWN0b3J5KHRoaXMuX3Jlc29sdmUocGF0aCkpOwogICAgICB9CiAgICAgIGlzRmlsZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlzRmlsZSh0aGlzLl9yZXNvbHZlKHBhdGgpKTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCBzdGF0LgogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc3RhdCh0aGlzLl9yZXNvbHZlKHBhdGgpKTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCB3YXRjaGluZy4KICAgICAgd2F0Y2gocGF0aCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS53YXRjaCh0aGlzLl9yZXNvbHZlKHBhdGgpLCBvcHRpb25zKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlJlc29sdmVySG9zdCA9IFJlc29sdmVySG9zdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L2FsaWFzLmpzCnZhciByZXF1aXJlX2FsaWFzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9hbGlhcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuQWxpYXNIb3N0ID0gdm9pZCAwOwogICAgdmFyIHBhdGhfMSA9IHJlcXVpcmVfcGF0aCgpOwogICAgdmFyIHJlc29sdmVyXzEgPSByZXF1aXJlX3Jlc29sdmVyKCk7CiAgICB2YXIgQWxpYXNIb3N0ID0gY2xhc3MgZXh0ZW5kcyByZXNvbHZlcl8xLlJlc29sdmVySG9zdCB7CiAgICAgIF9hbGlhc2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgX3Jlc29sdmUocGF0aCkgewogICAgICAgIGxldCBtYXliZUFsaWFzID0gdGhpcy5fYWxpYXNlcy5nZXQocGF0aCk7CiAgICAgICAgY29uc3Qgc3AgPSAoMCwgcGF0aF8xLnNwbGl0KShwYXRoKTsKICAgICAgICBjb25zdCByZW1haW5pbmcgPSBbXTsKICAgICAgICB3aGlsZSAoIW1heWJlQWxpYXMgJiYgc3AubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgcCA9ICgwLCBwYXRoXzEuam9pbikocGF0aF8xLk5vcm1hbGl6ZWRSb290LCAuLi5zcCk7CiAgICAgICAgICBtYXliZUFsaWFzID0gdGhpcy5fYWxpYXNlcy5nZXQocCk7CiAgICAgICAgICBpZiAobWF5YmVBbGlhcykgewogICAgICAgICAgICBtYXliZUFsaWFzID0gKDAsIHBhdGhfMS5qb2luKShtYXliZUFsaWFzLCAuLi5yZW1haW5pbmcpOwogICAgICAgICAgfQogICAgICAgICAgcmVtYWluaW5nLnVuc2hpZnQoc3AucG9wKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF5YmVBbGlhcyB8fCBwYXRoOwogICAgICB9CiAgICAgIGdldCBhbGlhc2VzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hbGlhc2VzOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuQWxpYXNIb3N0ID0gQWxpYXNIb3N0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvY3JlYXRlLmpzCnZhciByZXF1aXJlX2NyZWF0ZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvY3JlYXRlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5jcmVhdGVTeW5jSG9zdCA9IGNyZWF0ZVN5bmNIb3N0OwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICBmdW5jdGlvbiB3cmFwQWN0aW9uKGFjdGlvbikgewogICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGFjdGlvbigpKTsKICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlU3luY0hvc3QoaGFuZGxlcikgewogICAgICByZXR1cm4gbmV3IGNsYXNzIHsKICAgICAgICBnZXQgY2FwYWJpbGl0aWVzKCkgewogICAgICAgICAgcmV0dXJuIHsgc3luY2hyb25vdXM6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgICByZXR1cm4gd3JhcEFjdGlvbigoKSA9PiBoYW5kbGVyLnJlYWQocGF0aCkpOwogICAgICAgIH0KICAgICAgICBsaXN0KHBhdGgpIHsKICAgICAgICAgIHJldHVybiB3cmFwQWN0aW9uKCgpID0+IGhhbmRsZXIubGlzdChwYXRoKSk7CiAgICAgICAgfQogICAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgICByZXR1cm4gd3JhcEFjdGlvbigoKSA9PiBoYW5kbGVyLmV4aXN0cyhwYXRoKSk7CiAgICAgICAgfQogICAgICAgIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICAgIHJldHVybiB3cmFwQWN0aW9uKCgpID0+IGhhbmRsZXIuaXNEaXJlY3RvcnkocGF0aCkpOwogICAgICAgIH0KICAgICAgICBpc0ZpbGUocGF0aCkgewogICAgICAgICAgcmV0dXJuIHdyYXBBY3Rpb24oKCkgPT4gaGFuZGxlci5pc0ZpbGUocGF0aCkpOwogICAgICAgIH0KICAgICAgICBzdGF0KHBhdGgpIHsKICAgICAgICAgIHJldHVybiB3cmFwQWN0aW9uKCgpID0+IGhhbmRsZXIuc3RhdChwYXRoKSk7CiAgICAgICAgfQogICAgICAgIHdyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICAgIHJldHVybiB3cmFwQWN0aW9uKCgpID0+IGhhbmRsZXIud3JpdGUocGF0aCwgY29udGVudCkpOwogICAgICAgIH0KICAgICAgICBkZWxldGUocGF0aCkgewogICAgICAgICAgcmV0dXJuIHdyYXBBY3Rpb24oKCkgPT4gaGFuZGxlci5kZWxldGUocGF0aCkpOwogICAgICAgIH0KICAgICAgICByZW5hbWUoZnJvbSwgdG8pIHsKICAgICAgICAgIHJldHVybiB3cmFwQWN0aW9uKCgpID0+IGhhbmRsZXIucmVuYW1lKGZyb20sIHRvKSk7CiAgICAgICAgfQogICAgICAgIHdhdGNoKCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9KCk7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9lbXB0eS5qcwp2YXIgcmVxdWlyZV9lbXB0eTIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L2VtcHR5LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5FbXB0eSA9IHZvaWQgMDsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBFbXB0eSA9IGNsYXNzIHsKICAgICAgY2FwYWJpbGl0aWVzID0gewogICAgICAgIHN5bmNocm9ub3VzOiB0cnVlCiAgICAgIH07CiAgICAgIHJlYWQocGF0aCkgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLnRocm93RXJyb3IpKG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHBhdGgpKTsKICAgICAgfQogICAgICBsaXN0KHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5vZikoW10pOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEub2YpKGZhbHNlKTsKICAgICAgfQogICAgICBpc0RpcmVjdG9yeShwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEub2YpKGZhbHNlKTsKICAgICAgfQogICAgICBpc0ZpbGUocGF0aCkgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLm9mKShmYWxzZSk7CiAgICAgIH0KICAgICAgc3RhdChwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEub2YpKG51bGwpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRW1wdHkgPSBFbXB0eTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvcGljb21hdGNoLW5wbS00LjAuMi1lOTM1MTZkZGYyLWNlNjE3YjhkYTMuemlwL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL2NvbnN0YW50cy5qcwp2YXIgcmVxdWlyZV9jb25zdGFudHMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcGljb21hdGNoLW5wbS00LjAuMi1lOTM1MTZkZGYyLWNlNjE3YjhkYTMuemlwL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL2NvbnN0YW50cy5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBXSU5fU0xBU0ggPSAiXFxcXC8iOwogICAgdmFyIFdJTl9OT19TTEFTSCA9IGBbXiR7V0lOX1NMQVNIfV1gOwogICAgdmFyIERPVF9MSVRFUkFMID0gIlxcLiI7CiAgICB2YXIgUExVU19MSVRFUkFMID0gIlxcKyI7CiAgICB2YXIgUU1BUktfTElURVJBTCA9ICJcXD8iOwogICAgdmFyIFNMQVNIX0xJVEVSQUwgPSAiXFwvIjsKICAgIHZhciBPTkVfQ0hBUiA9ICIoPz0uKSI7CiAgICB2YXIgUU1BUksgPSAiW14vXSI7CiAgICB2YXIgRU5EX0FOQ0hPUiA9IGAoPzoke1NMQVNIX0xJVEVSQUx9fCQpYDsKICAgIHZhciBTVEFSVF9BTkNIT1IgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9KWA7CiAgICB2YXIgRE9UU19TTEFTSCA9IGAke0RPVF9MSVRFUkFMfXsxLDJ9JHtFTkRfQU5DSE9SfWA7CiAgICB2YXIgTk9fRE9UID0gYCg/ISR7RE9UX0xJVEVSQUx9KWA7CiAgICB2YXIgTk9fRE9UUyA9IGAoPyEke1NUQVJUX0FOQ0hPUn0ke0RPVFNfU0xBU0h9KWA7CiAgICB2YXIgTk9fRE9UX1NMQVNIID0gYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0ke0VORF9BTkNIT1J9KWA7CiAgICB2YXIgTk9fRE9UU19TTEFTSCA9IGAoPyEke0RPVFNfU0xBU0h9KWA7CiAgICB2YXIgUU1BUktfTk9fRE9UID0gYFteLiR7U0xBU0hfTElURVJBTH1dYDsKICAgIHZhciBTVEFSID0gYCR7UU1BUkt9Kj9gOwogICAgdmFyIFNFUCA9ICIvIjsKICAgIHZhciBQT1NJWF9DSEFSUyA9IHsKICAgICAgRE9UX0xJVEVSQUwsCiAgICAgIFBMVVNfTElURVJBTCwKICAgICAgUU1BUktfTElURVJBTCwKICAgICAgU0xBU0hfTElURVJBTCwKICAgICAgT05FX0NIQVIsCiAgICAgIFFNQVJLLAogICAgICBFTkRfQU5DSE9SLAogICAgICBET1RTX1NMQVNILAogICAgICBOT19ET1QsCiAgICAgIE5PX0RPVFMsCiAgICAgIE5PX0RPVF9TTEFTSCwKICAgICAgTk9fRE9UU19TTEFTSCwKICAgICAgUU1BUktfTk9fRE9ULAogICAgICBTVEFSLAogICAgICBTVEFSVF9BTkNIT1IsCiAgICAgIFNFUAogICAgfTsKICAgIHZhciBXSU5ET1dTX0NIQVJTID0gewogICAgICAuLi5QT1NJWF9DSEFSUywKICAgICAgU0xBU0hfTElURVJBTDogYFske1dJTl9TTEFTSH1dYCwKICAgICAgUU1BUks6IFdJTl9OT19TTEFTSCwKICAgICAgU1RBUjogYCR7V0lOX05PX1NMQVNIfSo/YCwKICAgICAgRE9UU19TTEFTSDogYCR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKWAsCiAgICAgIE5PX0RPVDogYCg/ISR7RE9UX0xJVEVSQUx9KWAsCiAgICAgIE5PX0RPVFM6IGAoPyEoPzpefFske1dJTl9TTEFTSH1dKSR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLAogICAgICBOT19ET1RfU0xBU0g6IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9KD86WyR7V0lOX1NMQVNIfV18JCkpYCwKICAgICAgTk9fRE9UU19TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLAogICAgICBRTUFSS19OT19ET1Q6IGBbXi4ke1dJTl9TTEFTSH1dYCwKICAgICAgU1RBUlRfQU5DSE9SOiBgKD86XnxbJHtXSU5fU0xBU0h9XSlgLAogICAgICBFTkRfQU5DSE9SOiBgKD86WyR7V0lOX1NMQVNIfV18JClgLAogICAgICBTRVA6ICJcXCIKICAgIH07CiAgICB2YXIgUE9TSVhfUkVHRVhfU09VUkNFID0gewogICAgICBhbG51bTogImEtekEtWjAtOSIsCiAgICAgIGFscGhhOiAiYS16QS1aIiwKICAgICAgYXNjaWk6ICJcXHgwMC1cXHg3RiIsCiAgICAgIGJsYW5rOiAiIFxcdCIsCiAgICAgIGNudHJsOiAiXFx4MDAtXFx4MUZcXHg3RiIsCiAgICAgIGRpZ2l0OiAiMC05IiwKICAgICAgZ3JhcGg6ICJcXHgyMS1cXHg3RSIsCiAgICAgIGxvd2VyOiAiYS16IiwKICAgICAgcHJpbnQ6ICJcXHgyMC1cXHg3RSAiLAogICAgICBwdW5jdDogIlxcLSFcIiMkJSYnKClcXCorLC4vOjs8PT4/QFtcXF1eX2B7fH1+IiwKICAgICAgc3BhY2U6ICIgXFx0XFxyXFxuXFx2XFxmIiwKICAgICAgdXBwZXI6ICJBLVoiLAogICAgICB3b3JkOiAiQS1aYS16MC05XyIsCiAgICAgIHhkaWdpdDogIkEtRmEtZjAtOSIKICAgIH07CiAgICBtb2R1bGUyLmV4cG9ydHMgPSB7CiAgICAgIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCwKICAgICAgUE9TSVhfUkVHRVhfU09VUkNFLAogICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zCiAgICAgIFJFR0VYX0JBQ0tTTEFTSDogL1xcKD8hWyorP14ke30ofClbXF1dKS9nLAogICAgICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUzogL15bXkAhW1xdLiwkKis/Xnt9KCl8XFwvXSsvLAogICAgICBSRUdFWF9TUEVDSUFMX0NIQVJTOiAvWy0qKz8uXiR7fSh8KVtcXV0vLAogICAgICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUY6IC8oXFw/KSgoXFcpKFwzKikpL2csCiAgICAgIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMOiAvKFstKis/Ll4ke30ofClbXF1dKS9nLAogICAgICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNIOiAvKD86XFsuKj9bXlxcXVxdfFxcKD89LikpL2csCiAgICAgIC8vIFJlcGxhY2UgZ2xvYnMgd2l0aCBlcXVpdmFsZW50IHBhdHRlcm5zIHRvIHJlZHVjZSBwYXJzaW5nIHRpbWUuCiAgICAgIFJFUExBQ0VNRU5UUzogewogICAgICAgICIqKioiOiAiKiIsCiAgICAgICAgIioqLyoqIjogIioqIiwKICAgICAgICAiKiovKiovKioiOiAiKioiCiAgICAgIH0sCiAgICAgIC8vIERpZ2l0cwogICAgICBDSEFSXzA6IDQ4LAogICAgICAvKiAwICovCiAgICAgIENIQVJfOTogNTcsCiAgICAgIC8qIDkgKi8KICAgICAgLy8gQWxwaGFiZXQgY2hhcnMuCiAgICAgIENIQVJfVVBQRVJDQVNFX0E6IDY1LAogICAgICAvKiBBICovCiAgICAgIENIQVJfTE9XRVJDQVNFX0E6IDk3LAogICAgICAvKiBhICovCiAgICAgIENIQVJfVVBQRVJDQVNFX1o6IDkwLAogICAgICAvKiBaICovCiAgICAgIENIQVJfTE9XRVJDQVNFX1o6IDEyMiwKICAgICAgLyogeiAqLwogICAgICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6IDQwLAogICAgICAvKiAoICovCiAgICAgIENIQVJfUklHSFRfUEFSRU5USEVTRVM6IDQxLAogICAgICAvKiApICovCiAgICAgIENIQVJfQVNURVJJU0s6IDQyLAogICAgICAvKiAqICovCiAgICAgIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLgogICAgICBDSEFSX0FNUEVSU0FORDogMzgsCiAgICAgIC8qICYgKi8KICAgICAgQ0hBUl9BVDogNjQsCiAgICAgIC8qIEAgKi8KICAgICAgQ0hBUl9CQUNLV0FSRF9TTEFTSDogOTIsCiAgICAgIC8qIFwgKi8KICAgICAgQ0hBUl9DQVJSSUFHRV9SRVRVUk46IDEzLAogICAgICAvKiBcciAqLwogICAgICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiA5NCwKICAgICAgLyogXiAqLwogICAgICBDSEFSX0NPTE9OOiA1OCwKICAgICAgLyogOiAqLwogICAgICBDSEFSX0NPTU1BOiA0NCwKICAgICAgLyogLCAqLwogICAgICBDSEFSX0RPVDogNDYsCiAgICAgIC8qIC4gKi8KICAgICAgQ0hBUl9ET1VCTEVfUVVPVEU6IDM0LAogICAgICAvKiAiICovCiAgICAgIENIQVJfRVFVQUw6IDYxLAogICAgICAvKiA9ICovCiAgICAgIENIQVJfRVhDTEFNQVRJT05fTUFSSzogMzMsCiAgICAgIC8qICEgKi8KICAgICAgQ0hBUl9GT1JNX0ZFRUQ6IDEyLAogICAgICAvKiBcZiAqLwogICAgICBDSEFSX0ZPUldBUkRfU0xBU0g6IDQ3LAogICAgICAvKiAvICovCiAgICAgIENIQVJfR1JBVkVfQUNDRU5UOiA5NiwKICAgICAgLyogYCAqLwogICAgICBDSEFSX0hBU0g6IDM1LAogICAgICAvKiAjICovCiAgICAgIENIQVJfSFlQSEVOX01JTlVTOiA0NSwKICAgICAgLyogLSAqLwogICAgICBDSEFSX0xFRlRfQU5HTEVfQlJBQ0tFVDogNjAsCiAgICAgIC8qIDwgKi8KICAgICAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAxMjMsCiAgICAgIC8qIHsgKi8KICAgICAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiA5MSwKICAgICAgLyogWyAqLwogICAgICBDSEFSX0xJTkVfRkVFRDogMTAsCiAgICAgIC8qIFxuICovCiAgICAgIENIQVJfTk9fQlJFQUtfU1BBQ0U6IDE2MCwKICAgICAgLyogXHUwMEEwICovCiAgICAgIENIQVJfUEVSQ0VOVDogMzcsCiAgICAgIC8qICUgKi8KICAgICAgQ0hBUl9QTFVTOiA0MywKICAgICAgLyogKyAqLwogICAgICBDSEFSX1FVRVNUSU9OX01BUks6IDYzLAogICAgICAvKiA/ICovCiAgICAgIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogNjIsCiAgICAgIC8qID4gKi8KICAgICAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogMTI1LAogICAgICAvKiB9ICovCiAgICAgIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6IDkzLAogICAgICAvKiBdICovCiAgICAgIENIQVJfU0VNSUNPTE9OOiA1OSwKICAgICAgLyogOyAqLwogICAgICBDSEFSX1NJTkdMRV9RVU9URTogMzksCiAgICAgIC8qICcgKi8KICAgICAgQ0hBUl9TUEFDRTogMzIsCiAgICAgIC8qICAgKi8KICAgICAgQ0hBUl9UQUI6IDksCiAgICAgIC8qIFx0ICovCiAgICAgIENIQVJfVU5ERVJTQ09SRTogOTUsCiAgICAgIC8qIF8gKi8KICAgICAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAxMjQsCiAgICAgIC8qIHwgKi8KICAgICAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6IDY1Mjc5LAogICAgICAvKiBcdUZFRkYgKi8KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTCiAgICAgICAqLwogICAgICBleHRnbG9iQ2hhcnMoY2hhcnMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgIiEiOiB7IHR5cGU6ICJuZWdhdGUiLCBvcGVuOiAiKD86KD8hKD86IiwgY2xvc2U6IGApKSR7Y2hhcnMuU1RBUn0pYCB9LAogICAgICAgICAgIj8iOiB7IHR5cGU6ICJxbWFyayIsIG9wZW46ICIoPzoiLCBjbG9zZTogIik/IiB9LAogICAgICAgICAgIisiOiB7IHR5cGU6ICJwbHVzIiwgb3BlbjogIig/OiIsIGNsb3NlOiAiKSsiIH0sCiAgICAgICAgICAiKiI6IHsgdHlwZTogInN0YXIiLCBvcGVuOiAiKD86IiwgY2xvc2U6ICIpKiIgfSwKICAgICAgICAgICJAIjogeyB0eXBlOiAiYXQiLCBvcGVuOiAiKD86IiwgY2xvc2U6ICIpIiB9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBHTE9CX0NIQVJTCiAgICAgICAqLwogICAgICBnbG9iQ2hhcnMod2luMzIpIHsKICAgICAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3BpY29tYXRjaC1ucG0tNC4wLjItZTkzNTE2ZGRmMi1jZTYxN2I4ZGEzLnppcC9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi91dGlscy5qcwp2YXIgcmVxdWlyZV91dGlsczQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcGljb21hdGNoLW5wbS00LjAuMi1lOTM1MTZkZGYyLWNlNjE3YjhkYTMuemlwL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIHsKICAgICAgUkVHRVhfQkFDS1NMQVNILAogICAgICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNILAogICAgICBSRUdFWF9TUEVDSUFMX0NIQVJTLAogICAgICBSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTAogICAgfSA9IHJlcXVpcmVfY29uc3RhbnRzKCk7CiAgICBleHBvcnRzMi5pc09iamVjdCA9ICh2YWwpID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSh2YWwpOwogICAgZXhwb3J0czIuaGFzUmVnZXhDaGFycyA9IChzdHIpID0+IFJFR0VYX1NQRUNJQUxfQ0hBUlMudGVzdChzdHIpOwogICAgZXhwb3J0czIuaXNSZWdleENoYXIgPSAoc3RyKSA9PiBzdHIubGVuZ3RoID09PSAxICYmIGV4cG9ydHMyLmhhc1JlZ2V4Q2hhcnMoc3RyKTsKICAgIGV4cG9ydHMyLmVzY2FwZVJlZ2V4ID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUwsICJcXCQxIik7CiAgICBleHBvcnRzMi50b1Bvc2l4U2xhc2hlcyA9IChzdHIpID0+IHN0ci5yZXBsYWNlKFJFR0VYX0JBQ0tTTEFTSCwgIi8iKTsKICAgIGV4cG9ydHMyLmlzV2luZG93cyA9ICgpID0+IHsKICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIG5hdmlnYXRvci5wbGF0Zm9ybSkgewogICAgICAgIGNvbnN0IHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmV0dXJuIHBsYXRmb3JtID09PSAid2luMzIiIHx8IHBsYXRmb3JtID09PSAid2luZG93cyI7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiBwcm9jZXNzLnBsYXRmb3JtKSB7CiAgICAgICAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICJ3aW4zMiI7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIGV4cG9ydHMyLnJlbW92ZUJhY2tzbGFzaGVzID0gKHN0cikgPT4gewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSCwgKG1hdGNoKSA9PiB7CiAgICAgICAgcmV0dXJuIG1hdGNoID09PSAiXFwiID8gIiIgOiBtYXRjaDsKICAgICAgfSk7CiAgICB9OwogICAgZXhwb3J0czIuZXNjYXBlTGFzdCA9IChpbnB1dCwgY2hhciwgbGFzdElkeCkgPT4gewogICAgICBjb25zdCBpZHggPSBpbnB1dC5sYXN0SW5kZXhPZihjaGFyLCBsYXN0SWR4KTsKICAgICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBpbnB1dDsKICAgICAgaWYgKGlucHV0W2lkeCAtIDFdID09PSAiXFwiKSByZXR1cm4gZXhwb3J0czIuZXNjYXBlTGFzdChpbnB1dCwgY2hhciwgaWR4IC0gMSk7CiAgICAgIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBpZHgpfVxcJHtpbnB1dC5zbGljZShpZHgpfWA7CiAgICB9OwogICAgZXhwb3J0czIucmVtb3ZlUHJlZml4ID0gKGlucHV0LCBzdGF0ZSA9IHt9KSA9PiB7CiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dDsKICAgICAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDIpOwogICAgICAgIHN0YXRlLnByZWZpeCA9ICIuLyI7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH07CiAgICBleHBvcnRzMi53cmFwT3V0cHV0ID0gKGlucHV0LCBzdGF0ZSA9IHt9LCBvcHRpb25zID0ge30pID0+IHsKICAgICAgY29uc3QgcHJlcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAiIiA6ICJeIjsKICAgICAgY29uc3QgYXBwZW5kID0gb3B0aW9ucy5jb250YWlucyA/ICIiIDogIiQiOwogICAgICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gOwogICAgICBpZiAoc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkgewogICAgICAgIG91dHB1dCA9IGAoPzpeKD8hJHtvdXRwdXR9KS4qJClgOwogICAgICB9CiAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9OwogICAgZXhwb3J0czIuYmFzZW5hbWUgPSAocGF0aCwgeyB3aW5kb3dzIH0gPSB7fSkgPT4gewogICAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdCh3aW5kb3dzID8gL1tcXC9dLyA6ICIvIik7CiAgICAgIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07CiAgICAgIGlmIChsYXN0ID09PSAiIikgewogICAgICAgIHJldHVybiBzZWdzW3NlZ3MubGVuZ3RoIC0gMl07CiAgICAgIH0KICAgICAgcmV0dXJuIGxhc3Q7CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9waWNvbWF0Y2gtbnBtLTQuMC4yLWU5MzUxNmRkZjItY2U2MTdiOGRhMy56aXAvbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvc2Nhbi5qcwp2YXIgcmVxdWlyZV9zY2FuMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9waWNvbWF0Y2gtbnBtLTQuMC4yLWU5MzUxNmRkZjItY2U2MTdiOGRhMy56aXAvbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvc2Nhbi5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciB1dGlscyA9IHJlcXVpcmVfdXRpbHM0KCk7CiAgICB2YXIgewogICAgICBDSEFSX0FTVEVSSVNLLAogICAgICAvKiAqICovCiAgICAgIENIQVJfQVQsCiAgICAgIC8qIEAgKi8KICAgICAgQ0hBUl9CQUNLV0FSRF9TTEFTSCwKICAgICAgLyogXCAqLwogICAgICBDSEFSX0NPTU1BLAogICAgICAvKiAsICovCiAgICAgIENIQVJfRE9ULAogICAgICAvKiAuICovCiAgICAgIENIQVJfRVhDTEFNQVRJT05fTUFSSywKICAgICAgLyogISAqLwogICAgICBDSEFSX0ZPUldBUkRfU0xBU0gsCiAgICAgIC8qIC8gKi8KICAgICAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFLAogICAgICAvKiB7ICovCiAgICAgIENIQVJfTEVGVF9QQVJFTlRIRVNFUywKICAgICAgLyogKCAqLwogICAgICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsCiAgICAgIC8qIFsgKi8KICAgICAgQ0hBUl9QTFVTLAogICAgICAvKiArICovCiAgICAgIENIQVJfUVVFU1RJT05fTUFSSywKICAgICAgLyogPyAqLwogICAgICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLAogICAgICAvKiB9ICovCiAgICAgIENIQVJfUklHSFRfUEFSRU5USEVTRVMsCiAgICAgIC8qICkgKi8KICAgICAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVAogICAgICAvKiBdICovCiAgICB9ID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgIHZhciBpc1BhdGhTZXBhcmF0b3IgPSAoY29kZSkgPT4gewogICAgICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7CiAgICB9OwogICAgdmFyIGRlcHRoID0gKHRva2VuKSA9PiB7CiAgICAgIGlmICh0b2tlbi5pc1ByZWZpeCAhPT0gdHJ1ZSkgewogICAgICAgIHRva2VuLmRlcHRoID0gdG9rZW4uaXNHbG9ic3RhciA/IEluZmluaXR5IDogMTsKICAgICAgfQogICAgfTsKICAgIHZhciBzY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiB7CiAgICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9OwogICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSAxOwogICAgICBjb25zdCBzY2FuVG9FbmQgPSBvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMuc2NhblRvRW5kID09PSB0cnVlOwogICAgICBjb25zdCBzbGFzaGVzID0gW107CiAgICAgIGNvbnN0IHRva2VucyA9IFtdOwogICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICBsZXQgc3RyID0gaW5wdXQ7CiAgICAgIGxldCBpbmRleCA9IC0xOwogICAgICBsZXQgc3RhcnQgPSAwOwogICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgbGV0IGlzQnJhY2UgPSBmYWxzZTsKICAgICAgbGV0IGlzQnJhY2tldCA9IGZhbHNlOwogICAgICBsZXQgaXNHbG9iID0gZmFsc2U7CiAgICAgIGxldCBpc0V4dGdsb2IgPSBmYWxzZTsKICAgICAgbGV0IGlzR2xvYnN0YXIgPSBmYWxzZTsKICAgICAgbGV0IGJyYWNlRXNjYXBlZCA9IGZhbHNlOwogICAgICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTsKICAgICAgbGV0IG5lZ2F0ZWQgPSBmYWxzZTsKICAgICAgbGV0IG5lZ2F0ZWRFeHRnbG9iID0gZmFsc2U7CiAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlOwogICAgICBsZXQgYnJhY2VzID0gMDsKICAgICAgbGV0IHByZXY7CiAgICAgIGxldCBjb2RlOwogICAgICBsZXQgdG9rZW4gPSB7IHZhbHVlOiAiIiwgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTsKICAgICAgY29uc3QgZW9zID0gKCkgPT4gaW5kZXggPj0gbGVuZ3RoOwogICAgICBjb25zdCBwZWVrID0gKCkgPT4gc3RyLmNoYXJDb2RlQXQoaW5kZXggKyAxKTsKICAgICAgY29uc3QgYWR2YW5jZSA9ICgpID0+IHsKICAgICAgICBwcmV2ID0gY29kZTsKICAgICAgICByZXR1cm4gc3RyLmNoYXJDb2RlQXQoKytpbmRleCk7CiAgICAgIH07CiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgewogICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7CiAgICAgICAgbGV0IG5leHQ7CiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlOwogICAgICAgICAgY29kZSA9IGFkdmFuY2UoKTsKICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHsKICAgICAgICAgICAgYnJhY2VFc2NhcGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYnJhY2VFc2NhcGVkID09PSB0cnVlIHx8IGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkgewogICAgICAgICAgYnJhY2VzKys7CiAgICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7CiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7CiAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHsKICAgICAgICAgICAgICBicmFjZXMrKzsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRE9UICYmIChjb2RlID0gYWR2YW5jZSgpKSA9PT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7CiAgICAgICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTsKICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChicmFjZUVzY2FwZWQgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9DT01NQSkgewogICAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlOwogICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UpIHsKICAgICAgICAgICAgICBicmFjZXMtLTsKICAgICAgICAgICAgICBpZiAoYnJhY2VzID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmFjZUVzY2FwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICBzbGFzaGVzLnB1c2goaW5kZXgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgdG9rZW4gPSB7IHZhbHVlOiAiIiwgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTsKICAgICAgICAgIGlmIChmaW5pc2hlZCA9PT0gdHJ1ZSkgY29udGludWU7CiAgICAgICAgICBpZiAocHJldiA9PT0gQ0hBUl9ET1QgJiYgaW5kZXggPT09IHN0YXJ0ICsgMSkgewogICAgICAgICAgICBzdGFydCArPSAyOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5ub2V4dCAhPT0gdHJ1ZSkgewogICAgICAgICAgY29uc3QgaXNFeHRnbG9iQ2hhciA9IGNvZGUgPT09IENIQVJfUExVUyB8fCBjb2RlID09PSBDSEFSX0FUIHx8IGNvZGUgPT09IENIQVJfQVNURVJJU0sgfHwgY29kZSA9PT0gQ0hBUl9RVUVTVElPTl9NQVJLIHx8IGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSzsKICAgICAgICAgIGlmIChpc0V4dGdsb2JDaGFyID09PSB0cnVlICYmIHBlZWsoKSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7CiAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICAgIGlzRXh0Z2xvYiA9IHRva2VuLmlzRXh0Z2xvYiA9IHRydWU7CiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHsKICAgICAgICAgICAgICBuZWdhdGVkRXh0Z2xvYiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHsKICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpOwogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7CiAgICAgICAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9BU1RFUklTSykgewogICAgICAgICAgaWYgKHByZXYgPT09IENIQVJfQVNURVJJU0spIGlzR2xvYnN0YXIgPSB0b2tlbi5pc0dsb2JzdGFyID0gdHJ1ZTsKICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUkspIHsKICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHsKICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHsKICAgICAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTsKICAgICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5leHQgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHsKICAgICAgICAgICAgICBpc0JyYWNrZXQgPSB0b2tlbi5pc0JyYWNrZXQgPSB0cnVlOwogICAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHsKICAgICAgICAgIG5lZ2F0ZWQgPSB0b2tlbi5uZWdhdGVkID0gdHJ1ZTsKICAgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdHMubm9wYXJlbiAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHsKICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7CiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHsKICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7CiAgICAgICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHsKICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNHbG9iID09PSB0cnVlKSB7CiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRzLm5vZXh0ID09PSB0cnVlKSB7CiAgICAgICAgaXNFeHRnbG9iID0gZmFsc2U7CiAgICAgICAgaXNHbG9iID0gZmFsc2U7CiAgICAgIH0KICAgICAgbGV0IGJhc2UgPSBzdHI7CiAgICAgIGxldCBwcmVmaXggPSAiIjsKICAgICAgbGV0IGdsb2IgPSAiIjsKICAgICAgaWYgKHN0YXJ0ID4gMCkgewogICAgICAgIHByZWZpeCA9IHN0ci5zbGljZSgwLCBzdGFydCk7CiAgICAgICAgc3RyID0gc3RyLnNsaWNlKHN0YXJ0KTsKICAgICAgICBsYXN0SW5kZXggLT0gc3RhcnQ7CiAgICAgIH0KICAgICAgaWYgKGJhc2UgJiYgaXNHbG9iID09PSB0cnVlICYmIGxhc3RJbmRleCA+IDApIHsKICAgICAgICBiYXNlID0gc3RyLnNsaWNlKDAsIGxhc3RJbmRleCk7CiAgICAgICAgZ2xvYiA9IHN0ci5zbGljZShsYXN0SW5kZXgpOwogICAgICB9IGVsc2UgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkgewogICAgICAgIGJhc2UgPSAiIjsKICAgICAgICBnbG9iID0gc3RyOwogICAgICB9IGVsc2UgewogICAgICAgIGJhc2UgPSBzdHI7CiAgICAgIH0KICAgICAgaWYgKGJhc2UgJiYgYmFzZSAhPT0gIiIgJiYgYmFzZSAhPT0gIi8iICYmIGJhc2UgIT09IHN0cikgewogICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoYmFzZS5jaGFyQ29kZUF0KGJhc2UubGVuZ3RoIC0gMSkpKSB7CiAgICAgICAgICBiYXNlID0gYmFzZS5zbGljZSgwLCAtMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7CiAgICAgICAgaWYgKGdsb2IpIGdsb2IgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhnbG9iKTsKICAgICAgICBpZiAoYmFzZSAmJiBiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgYmFzZSA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGJhc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzdGF0ZSA9IHsKICAgICAgICBwcmVmaXgsCiAgICAgICAgaW5wdXQsCiAgICAgICAgc3RhcnQsCiAgICAgICAgYmFzZSwKICAgICAgICBnbG9iLAogICAgICAgIGlzQnJhY2UsCiAgICAgICAgaXNCcmFja2V0LAogICAgICAgIGlzR2xvYiwKICAgICAgICBpc0V4dGdsb2IsCiAgICAgICAgaXNHbG9ic3RhciwKICAgICAgICBuZWdhdGVkLAogICAgICAgIG5lZ2F0ZWRFeHRnbG9iCiAgICAgIH07CiAgICAgIGlmIChvcHRzLnRva2VucyA9PT0gdHJ1ZSkgewogICAgICAgIHN0YXRlLm1heERlcHRoID0gMDsKICAgICAgICBpZiAoIWlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgIH0KICAgICAgICBzdGF0ZS50b2tlbnMgPSB0b2tlbnM7CiAgICAgIH0KICAgICAgaWYgKG9wdHMucGFydHMgPT09IHRydWUgfHwgb3B0cy50b2tlbnMgPT09IHRydWUpIHsKICAgICAgICBsZXQgcHJldkluZGV4OwogICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykgewogICAgICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDsKICAgICAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpOwogICAgICAgICAgaWYgKG9wdHMudG9rZW5zKSB7CiAgICAgICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHsKICAgICAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7CiAgICAgICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7CiAgICAgICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gIiIpIHsKICAgICAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2SW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICBpZiAocHJldkluZGV4ICYmIHByZXZJbmRleCArIDEgPCBpbnB1dC5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuc2xpY2UocHJldkluZGV4ICsgMSk7CiAgICAgICAgICBwYXJ0cy5wdXNoKHZhbHVlKTsKICAgICAgICAgIGlmIChvcHRzLnRva2VucykgewogICAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIGRlcHRoKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0pOwogICAgICAgICAgICBzdGF0ZS5tYXhEZXB0aCArPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmRlcHRoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlczsKICAgICAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0ZTsKICAgIH07CiAgICBtb2R1bGUyLmV4cG9ydHMgPSBzY2FuOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9waWNvbWF0Y2gtbnBtLTQuMC4yLWU5MzUxNmRkZjItY2U2MTdiOGRhMy56aXAvbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMKdmFyIHJlcXVpcmVfcGFyc2UgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcGljb21hdGNoLW5wbS00LjAuMi1lOTM1MTZkZGYyLWNlNjE3YjhkYTMuemlwL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3BhcnNlLmpzIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbnN0YW50cyA9IHJlcXVpcmVfY29uc3RhbnRzKCk7CiAgICB2YXIgdXRpbHMgPSByZXF1aXJlX3V0aWxzNCgpOwogICAgdmFyIHsKICAgICAgTUFYX0xFTkdUSCwKICAgICAgUE9TSVhfUkVHRVhfU09VUkNFLAogICAgICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUywKICAgICAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLAogICAgICBSRVBMQUNFTUVOVFMKICAgIH0gPSBjb25zdGFudHM7CiAgICB2YXIgZXhwYW5kUmFuZ2UgPSAoYXJncywgb3B0aW9ucykgPT4gewogICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwYW5kUmFuZ2UgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gb3B0aW9ucy5leHBhbmRSYW5nZSguLi5hcmdzLCBvcHRpb25zKTsKICAgICAgfQogICAgICBhcmdzLnNvcnQoKTsKICAgICAgY29uc3QgdmFsdWUgPSBgWyR7YXJncy5qb2luKCItIil9XWA7CiAgICAgIHRyeSB7CiAgICAgICAgbmV3IFJlZ0V4cCh2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3MubWFwKCh2KSA9PiB1dGlscy5lc2NhcGVSZWdleCh2KSkuam9pbigiLi4iKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgdmFyIHN5bnRheEVycm9yID0gKHR5cGUsIGNoYXIpID0+IHsKICAgICAgcmV0dXJuIGBNaXNzaW5nICR7dHlwZX06ICIke2NoYXJ9IiAtIHVzZSAiXFxcXCR7Y2hhcn0iIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc2A7CiAgICB9OwogICAgdmFyIHBhcnNlID0gKGlucHV0LCBvcHRpb25zKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmciKTsKICAgICAgfQogICAgICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7CiAgICAgIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTsKICAgICAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAibnVtYmVyIiA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7CiAgICAgIGxldCBsZW4gPSBpbnB1dC5sZW5ndGg7CiAgICAgIGlmIChsZW4gPiBtYXgpIHsKICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApOwogICAgICB9CiAgICAgIGNvbnN0IGJvcyA9IHsgdHlwZTogImJvcyIsIHZhbHVlOiAiIiwgb3V0cHV0OiBvcHRzLnByZXBlbmQgfHwgIiIgfTsKICAgICAgY29uc3QgdG9rZW5zID0gW2Jvc107CiAgICAgIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAiIiA6ICI/OiI7CiAgICAgIGNvbnN0IFBMQVRGT1JNX0NIQVJTID0gY29uc3RhbnRzLmdsb2JDaGFycyhvcHRzLndpbmRvd3MpOwogICAgICBjb25zdCBFWFRHTE9CX0NIQVJTID0gY29uc3RhbnRzLmV4dGdsb2JDaGFycyhQTEFURk9STV9DSEFSUyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBET1RfTElURVJBTCwKICAgICAgICBQTFVTX0xJVEVSQUwsCiAgICAgICAgU0xBU0hfTElURVJBTCwKICAgICAgICBPTkVfQ0hBUiwKICAgICAgICBET1RTX1NMQVNILAogICAgICAgIE5PX0RPVCwKICAgICAgICBOT19ET1RfU0xBU0gsCiAgICAgICAgTk9fRE9UU19TTEFTSCwKICAgICAgICBRTUFSSywKICAgICAgICBRTUFSS19OT19ET1QsCiAgICAgICAgU1RBUiwKICAgICAgICBTVEFSVF9BTkNIT1IKICAgICAgfSA9IFBMQVRGT1JNX0NIQVJTOwogICAgICBjb25zdCBnbG9ic3RhciA9IChvcHRzMikgPT4gewogICAgICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMyLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgOwogICAgICB9OwogICAgICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gIiIgOiBOT19ET1Q7CiAgICAgIGNvbnN0IHFtYXJrTm9Eb3QgPSBvcHRzLmRvdCA/IFFNQVJLIDogUU1BUktfTk9fRE9UOwogICAgICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/IGdsb2JzdGFyKG9wdHMpIDogU1RBUjsKICAgICAgaWYgKG9wdHMuY2FwdHVyZSkgewogICAgICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDsKICAgICAgfQogICAgICBpZiAodHlwZW9mIG9wdHMubm9leHQgPT09ICJib29sZWFuIikgewogICAgICAgIG9wdHMubm9leHRnbG9iID0gb3B0cy5ub2V4dDsKICAgICAgfQogICAgICBjb25zdCBzdGF0ZSA9IHsKICAgICAgICBpbnB1dCwKICAgICAgICBpbmRleDogLTEsCiAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgZG90OiBvcHRzLmRvdCA9PT0gdHJ1ZSwKICAgICAgICBjb25zdW1lZDogIiIsCiAgICAgICAgb3V0cHV0OiAiIiwKICAgICAgICBwcmVmaXg6ICIiLAogICAgICAgIGJhY2t0cmFjazogZmFsc2UsCiAgICAgICAgbmVnYXRlZDogZmFsc2UsCiAgICAgICAgYnJhY2tldHM6IDAsCiAgICAgICAgYnJhY2VzOiAwLAogICAgICAgIHBhcmVuczogMCwKICAgICAgICBxdW90ZXM6IDAsCiAgICAgICAgZ2xvYnN0YXI6IGZhbHNlLAogICAgICAgIHRva2VucwogICAgICB9OwogICAgICBpbnB1dCA9IHV0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpOwogICAgICBsZW4gPSBpbnB1dC5sZW5ndGg7CiAgICAgIGNvbnN0IGV4dGdsb2JzID0gW107CiAgICAgIGNvbnN0IGJyYWNlcyA9IFtdOwogICAgICBjb25zdCBzdGFjayA9IFtdOwogICAgICBsZXQgcHJldiA9IGJvczsKICAgICAgbGV0IHZhbHVlOwogICAgICBjb25zdCBlb3MgPSAoKSA9PiBzdGF0ZS5pbmRleCA9PT0gbGVuIC0gMTsKICAgICAgY29uc3QgcGVlayA9IHN0YXRlLnBlZWsgPSAobiA9IDEpID0+IGlucHV0W3N0YXRlLmluZGV4ICsgbl07CiAgICAgIGNvbnN0IGFkdmFuY2UgPSBzdGF0ZS5hZHZhbmNlID0gKCkgPT4gaW5wdXRbKytzdGF0ZS5pbmRleF0gfHwgIiI7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9ICgpID0+IGlucHV0LnNsaWNlKHN0YXRlLmluZGV4ICsgMSk7CiAgICAgIGNvbnN0IGNvbnN1bWUgPSAodmFsdWUyID0gIiIsIG51bSA9IDApID0+IHsKICAgICAgICBzdGF0ZS5jb25zdW1lZCArPSB2YWx1ZTI7CiAgICAgICAgc3RhdGUuaW5kZXggKz0gbnVtOwogICAgICB9OwogICAgICBjb25zdCBhcHBlbmQgPSAodG9rZW4pID0+IHsKICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTsKICAgICAgICBjb25zdW1lKHRva2VuLnZhbHVlKTsKICAgICAgfTsKICAgICAgY29uc3QgbmVnYXRlID0gKCkgPT4gewogICAgICAgIGxldCBjb3VudCA9IDE7CiAgICAgICAgd2hpbGUgKHBlZWsoKSA9PT0gIiEiICYmIChwZWVrKDIpICE9PSAiKCIgfHwgcGVlaygzKSA9PT0gIj8iKSkgewogICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgc3RhdGUuc3RhcnQrKzsKICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQogICAgICAgIGlmIChjb3VudCAlIDIgPT09IDApIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUubmVnYXRlZCA9IHRydWU7CiAgICAgICAgc3RhdGUuc3RhcnQrKzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfTsKICAgICAgY29uc3QgaW5jcmVtZW50ID0gKHR5cGUpID0+IHsKICAgICAgICBzdGF0ZVt0eXBlXSsrOwogICAgICAgIHN0YWNrLnB1c2godHlwZSk7CiAgICAgIH07CiAgICAgIGNvbnN0IGRlY3JlbWVudCA9ICh0eXBlKSA9PiB7CiAgICAgICAgc3RhdGVbdHlwZV0tLTsKICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgfTsKICAgICAgY29uc3QgcHVzaCA9ICh0b2spID0+IHsKICAgICAgICBpZiAocHJldi50eXBlID09PSAiZ2xvYnN0YXIiKSB7CiAgICAgICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAodG9rLnR5cGUgPT09ICJjb21tYSIgfHwgdG9rLnR5cGUgPT09ICJicmFjZSIpOwogICAgICAgICAgY29uc3QgaXNFeHRnbG9iID0gdG9rLmV4dGdsb2IgPT09IHRydWUgfHwgZXh0Z2xvYnMubGVuZ3RoICYmICh0b2sudHlwZSA9PT0gInBpcGUiIHx8IHRvay50eXBlID09PSAicGFyZW4iKTsKICAgICAgICAgIGlmICh0b2sudHlwZSAhPT0gInNsYXNoIiAmJiB0b2sudHlwZSAhPT0gInBhcmVuIiAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTsKICAgICAgICAgICAgcHJldi50eXBlID0gInN0YXIiOwogICAgICAgICAgICBwcmV2LnZhbHVlID0gIioiOwogICAgICAgICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGV4dGdsb2JzLmxlbmd0aCAmJiB0b2sudHlwZSAhPT0gInBhcmVuIikgewogICAgICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uaW5uZXIgKz0gdG9rLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rLnZhbHVlIHx8IHRvay5vdXRwdXQpIGFwcGVuZCh0b2spOwogICAgICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gInRleHQiICYmIHRvay50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgIHByZXYub3V0cHV0ID0gKHByZXYub3V0cHV0IHx8IHByZXYudmFsdWUpICsgdG9rLnZhbHVlOwogICAgICAgICAgcHJldi52YWx1ZSArPSB0b2sudmFsdWU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRvay5wcmV2ID0gcHJldjsKICAgICAgICB0b2tlbnMucHVzaCh0b2spOwogICAgICAgIHByZXYgPSB0b2s7CiAgICAgIH07CiAgICAgIGNvbnN0IGV4dGdsb2JPcGVuID0gKHR5cGUsIHZhbHVlMikgPT4gewogICAgICAgIGNvbnN0IHRva2VuID0geyAuLi5FWFRHTE9CX0NIQVJTW3ZhbHVlMl0sIGNvbmRpdGlvbnM6IDEsIGlubmVyOiAiIiB9OwogICAgICAgIHRva2VuLnByZXYgPSBwcmV2OwogICAgICAgIHRva2VuLnBhcmVucyA9IHN0YXRlLnBhcmVuczsKICAgICAgICB0b2tlbi5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQ7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMuY2FwdHVyZSA/ICIoIiA6ICIiKSArIHRva2VuLm9wZW47CiAgICAgICAgaW5jcmVtZW50KCJwYXJlbnMiKTsKICAgICAgICBwdXNoKHsgdHlwZSwgdmFsdWU6IHZhbHVlMiwgb3V0cHV0OiBzdGF0ZS5vdXRwdXQgPyAiIiA6IE9ORV9DSEFSIH0pOwogICAgICAgIHB1c2goeyB0eXBlOiAicGFyZW4iLCBleHRnbG9iOiB0cnVlLCB2YWx1ZTogYWR2YW5jZSgpLCBvdXRwdXQgfSk7CiAgICAgICAgZXh0Z2xvYnMucHVzaCh0b2tlbik7CiAgICAgIH07CiAgICAgIGNvbnN0IGV4dGdsb2JDbG9zZSA9ICh0b2tlbikgPT4gewogICAgICAgIGxldCBvdXRwdXQgPSB0b2tlbi5jbG9zZSArIChvcHRzLmNhcHR1cmUgPyAiKSIgOiAiIik7CiAgICAgICAgbGV0IHJlc3Q7CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJuZWdhdGUiKSB7CiAgICAgICAgICBsZXQgZXh0Z2xvYlN0YXIgPSBzdGFyOwogICAgICAgICAgaWYgKHRva2VuLmlubmVyICYmIHRva2VuLmlubmVyLmxlbmd0aCA+IDEgJiYgdG9rZW4uaW5uZXIuaW5jbHVkZXMoIi8iKSkgewogICAgICAgICAgICBleHRnbG9iU3RhciA9IGdsb2JzdGFyKG9wdHMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGV4dGdsb2JTdGFyICE9PSBzdGFyIHx8IGVvcygpIHx8IC9eXCkrJC8udGVzdChyZW1haW5pbmcoKSkpIHsKICAgICAgICAgICAgb3V0cHV0ID0gdG9rZW4uY2xvc2UgPSBgKSQpKSR7ZXh0Z2xvYlN0YXJ9YDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi5pbm5lci5pbmNsdWRlcygiKiIpICYmIChyZXN0ID0gcmVtYWluaW5nKCkpICYmIC9eXC5bXlxcLy5dKyQvLnRlc3QocmVzdCkpIHsKICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHBhcnNlKHJlc3QsIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KS5vdXRwdXQ7CiAgICAgICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkke2V4cHJlc3Npb259KSR7ZXh0Z2xvYlN0YXJ9KWA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAiYm9zIikgewogICAgICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1c2goeyB0eXBlOiAicGFyZW4iLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0IH0pOwogICAgICAgIGRlY3JlbWVudCgicGFyZW5zIik7CiAgICAgIH07CiAgICAgIGlmIChvcHRzLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgIS8oXlsqIV18Wy8oKVtcXXt9Il0pLy50ZXN0KGlucHV0KSkgewogICAgICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlOwogICAgICAgIGxldCBvdXRwdXQgPSBpbnB1dC5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRiwgKG0sIGVzYywgY2hhcnMsIGZpcnN0LCByZXN0LCBpbmRleCkgPT4gewogICAgICAgICAgaWYgKGZpcnN0ID09PSAiXFwiKSB7CiAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZmlyc3QgPT09ICI/IikgewogICAgICAgICAgICBpZiAoZXNjKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdCA9PT0gIi4iKSB7CiAgICAgICAgICAgIHJldHVybiBET1RfTElURVJBTC5yZXBlYXQoY2hhcnMubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdCA9PT0gIioiKSB7CiAgICAgICAgICAgIGlmIChlc2MpIHsKICAgICAgICAgICAgICByZXR1cm4gZXNjICsgZmlyc3QgKyAocmVzdCA/IHN0YXIgOiAiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0YXI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZXNjID8gbSA6IGBcXCR7bX1gOwogICAgICAgIH0pOwogICAgICAgIGlmIChiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHsKICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcL2csICIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC9cXCsvZywgKG0pID0+IHsKICAgICAgICAgICAgICByZXR1cm4gbS5sZW5ndGggJSAyID09PSAwID8gIlxcXFwiIDogbSA/ICJcXCIgOiAiIjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChvdXRwdXQgPT09IGlucHV0ICYmIG9wdHMuY29udGFpbnMgPT09IHRydWUpIHsKICAgICAgICAgIHN0YXRlLm91dHB1dCA9IGlucHV0OwogICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy53cmFwT3V0cHV0KG91dHB1dCwgc3RhdGUsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgfQogICAgICB3aGlsZSAoIWVvcygpKSB7CiAgICAgICAgdmFsdWUgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKHZhbHVlID09PSAiXDAiKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID09PSAiXFwiKSB7CiAgICAgICAgICBjb25zdCBuZXh0ID0gcGVlaygpOwogICAgICAgICAgaWYgKG5leHQgPT09ICIvIiAmJiBvcHRzLmJhc2ggIT09IHRydWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobmV4dCA9PT0gIi4iIHx8IG5leHQgPT09ICI7IikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbmV4dCkgewogICAgICAgICAgICB2YWx1ZSArPSAiXFwiOwogICAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXFwrLy5leGVjKHJlbWFpbmluZygpKTsKICAgICAgICAgIGxldCBzbGFzaGVzID0gMDsKICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgIHNsYXNoZXMgPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgICAgICAgIHN0YXRlLmluZGV4ICs9IHNsYXNoZXM7CiAgICAgICAgICAgIGlmIChzbGFzaGVzICUgMiAhPT0gMCkgewogICAgICAgICAgICAgIHZhbHVlICs9ICJcXCI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7CiAgICAgICAgICAgIHZhbHVlID0gYWR2YW5jZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7CiAgICAgICAgICAgIHB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID4gMCAmJiAodmFsdWUgIT09ICJdIiB8fCBwcmV2LnZhbHVlID09PSAiWyIgfHwgcHJldi52YWx1ZSA9PT0gIlteIikpIHsKICAgICAgICAgIGlmIChvcHRzLnBvc2l4ICE9PSBmYWxzZSAmJiB2YWx1ZSA9PT0gIjoiKSB7CiAgICAgICAgICAgIGNvbnN0IGlubmVyID0gcHJldi52YWx1ZS5zbGljZSgxKTsKICAgICAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCJbIikpIHsKICAgICAgICAgICAgICBwcmV2LnBvc2l4ID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoIjoiKSkgewogICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gcHJldi52YWx1ZS5sYXN0SW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgY29uc3QgcHJlID0gcHJldi52YWx1ZS5zbGljZSgwLCBpZHgpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzdDIgPSBwcmV2LnZhbHVlLnNsaWNlKGlkeCArIDIpOwogICAgICAgICAgICAgICAgY29uc3QgcG9zaXggPSBQT1NJWF9SRUdFWF9TT1VSQ0VbcmVzdDJdOwogICAgICAgICAgICAgICAgaWYgKHBvc2l4KSB7CiAgICAgICAgICAgICAgICAgIHByZXYudmFsdWUgPSBwcmUgKyBwb3NpeDsKICAgICAgICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICAgICAgICBpZiAoIWJvcy5vdXRwdXQgJiYgdG9rZW5zLmluZGV4T2YocHJldikgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBib3Mub3V0cHV0ID0gT05FX0NIQVI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmFsdWUgPT09ICJbIiAmJiBwZWVrKCkgIT09ICI6IiB8fCB2YWx1ZSA9PT0gIi0iICYmIHBlZWsoKSA9PT0gIl0iKSB7CiAgICAgICAgICAgIHZhbHVlID0gYFxcJHt2YWx1ZX1gOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZhbHVlID09PSAiXSIgJiYgKHByZXYudmFsdWUgPT09ICJbIiB8fCBwcmV2LnZhbHVlID09PSAiW14iKSkgewogICAgICAgICAgICB2YWx1ZSA9IGBcXCR7dmFsdWV9YDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcHRzLnBvc2l4ID09PSB0cnVlICYmIHZhbHVlID09PSAiISIgJiYgcHJldi52YWx1ZSA9PT0gIlsiKSB7CiAgICAgICAgICAgIHZhbHVlID0gIl4iOwogICAgICAgICAgfQogICAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTsKICAgICAgICAgIGFwcGVuZCh7IHZhbHVlIH0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5xdW90ZXMgPT09IDEgJiYgdmFsdWUgIT09ICciJykgewogICAgICAgICAgdmFsdWUgPSB1dGlscy5lc2NhcGVSZWdleCh2YWx1ZSk7CiAgICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlOwogICAgICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID09PSAnIicpIHsKICAgICAgICAgIHN0YXRlLnF1b3RlcyA9IHN0YXRlLnF1b3RlcyA9PT0gMSA/IDAgOiAxOwogICAgICAgICAgaWYgKG9wdHMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICIoIikgewogICAgICAgICAgaW5jcmVtZW50KCJwYXJlbnMiKTsKICAgICAgICAgIHB1c2goeyB0eXBlOiAicGFyZW4iLCB2YWx1ZSB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICIpIikgewogICAgICAgICAgaWYgKHN0YXRlLnBhcmVucyA9PT0gMCAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcigib3BlbmluZyIsICIoIikpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZXh0Z2xvYiA9IGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdOwogICAgICAgICAgaWYgKGV4dGdsb2IgJiYgc3RhdGUucGFyZW5zID09PSBleHRnbG9iLnBhcmVucyArIDEpIHsKICAgICAgICAgICAgZXh0Z2xvYkNsb3NlKGV4dGdsb2JzLnBvcCgpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBwdXNoKHsgdHlwZTogInBhcmVuIiwgdmFsdWUsIG91dHB1dDogc3RhdGUucGFyZW5zID8gIikiIDogIlxcKSIgfSk7CiAgICAgICAgICBkZWNyZW1lbnQoInBhcmVucyIpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIlsiKSB7CiAgICAgICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgIXJlbWFpbmluZygpLmluY2x1ZGVzKCJdIikpIHsKICAgICAgICAgICAgaWYgKG9wdHMubm9icmFja2V0ICE9PSB0cnVlICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoImNsb3NpbmciLCAiXSIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWx1ZSA9IGBcXCR7dmFsdWV9YDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluY3JlbWVudCgiYnJhY2tldHMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHB1c2goeyB0eXBlOiAiYnJhY2tldCIsIHZhbHVlIH0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIl0iKSB7CiAgICAgICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgcHJldiAmJiBwcmV2LnR5cGUgPT09ICJicmFja2V0IiAmJiBwcmV2LnZhbHVlLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSwgb3V0cHV0OiBgXFwke3ZhbHVlfWAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7CiAgICAgICAgICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCJvcGVuaW5nIiwgIlsiKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWUsIG91dHB1dDogYFxcJHt2YWx1ZX1gIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGRlY3JlbWVudCgiYnJhY2tldHMiKTsKICAgICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHByZXYudmFsdWUuc2xpY2UoMSk7CiAgICAgICAgICBpZiAocHJldi5wb3NpeCAhPT0gdHJ1ZSAmJiBwcmV2VmFsdWVbMF0gPT09ICJeIiAmJiAhcHJldlZhbHVlLmluY2x1ZGVzKCIvIikpIHsKICAgICAgICAgICAgdmFsdWUgPSBgLyR7dmFsdWV9YDsKICAgICAgICAgIH0KICAgICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7CiAgICAgICAgICBhcHBlbmQoeyB2YWx1ZSB9KTsKICAgICAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gZmFsc2UgfHwgdXRpbHMuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZXNjYXBlZCA9IHV0aWxzLmVzY2FwZVJlZ2V4KHByZXYudmFsdWUpOwogICAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2LnZhbHVlLmxlbmd0aCk7CiAgICAgICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IHRydWUpIHsKICAgICAgICAgICAgc3RhdGUub3V0cHV0ICs9IGVzY2FwZWQ7CiAgICAgICAgICAgIHByZXYudmFsdWUgPSBlc2NhcGVkOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHByZXYudmFsdWUgPSBgKCR7Y2FwdHVyZX0ke2VzY2FwZWR9fCR7cHJldi52YWx1ZX0pYDsKICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2LnZhbHVlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gInsiICYmIG9wdHMubm9icmFjZSAhPT0gdHJ1ZSkgewogICAgICAgICAgaW5jcmVtZW50KCJicmFjZXMiKTsKICAgICAgICAgIGNvbnN0IG9wZW4gPSB7CiAgICAgICAgICAgIHR5cGU6ICJicmFjZSIsCiAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICBvdXRwdXQ6ICIoIiwKICAgICAgICAgICAgb3V0cHV0SW5kZXg6IHN0YXRlLm91dHB1dC5sZW5ndGgsCiAgICAgICAgICAgIHRva2Vuc0luZGV4OiBzdGF0ZS50b2tlbnMubGVuZ3RoCiAgICAgICAgICB9OwogICAgICAgICAgYnJhY2VzLnB1c2gob3Blbik7CiAgICAgICAgICBwdXNoKG9wZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIn0iKSB7CiAgICAgICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAob3B0cy5ub2JyYWNlID09PSB0cnVlIHx8ICFicmFjZSkgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSwgb3V0cHV0OiB2YWx1ZSB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgb3V0cHV0ID0gIikiOwogICAgICAgICAgaWYgKGJyYWNlLmRvdHMgPT09IHRydWUpIHsKICAgICAgICAgICAgY29uc3QgYXJyID0gdG9rZW5zLnNsaWNlKCk7CiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7CiAgICAgICAgICAgICAgaWYgKGFycltpXS50eXBlID09PSAiYnJhY2UiKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGFycltpXS50eXBlICE9PSAiZG90cyIpIHsKICAgICAgICAgICAgICAgIHJhbmdlLnVuc2hpZnQoYXJyW2ldLnZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0cHV0ID0gZXhwYW5kUmFuZ2UocmFuZ2UsIG9wdHMpOwogICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJyYWNlLmNvbW1hICE9PSB0cnVlICYmIGJyYWNlLmRvdHMgIT09IHRydWUpIHsKICAgICAgICAgICAgY29uc3Qgb3V0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIGJyYWNlLm91dHB1dEluZGV4KTsKICAgICAgICAgICAgY29uc3QgdG9rcyA9IHN0YXRlLnRva2Vucy5zbGljZShicmFjZS50b2tlbnNJbmRleCk7CiAgICAgICAgICAgIGJyYWNlLnZhbHVlID0gYnJhY2Uub3V0cHV0ID0gIlxceyI7CiAgICAgICAgICAgIHZhbHVlID0gb3V0cHV0ID0gIlxcfSI7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCA9IG91dDsKICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRva3MpIHsKICAgICAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdC5vdXRwdXQgfHwgdC52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHVzaCh7IHR5cGU6ICJicmFjZSIsIHZhbHVlLCBvdXRwdXQgfSk7CiAgICAgICAgICBkZWNyZW1lbnQoImJyYWNlcyIpOwogICAgICAgICAgYnJhY2VzLnBvcCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gInwiKSB7CiAgICAgICAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5jb25kaXRpb25zKys7CiAgICAgICAgICB9CiAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICIsIikgewogICAgICAgICAgbGV0IG91dHB1dCA9IHZhbHVlOwogICAgICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdOwogICAgICAgICAgaWYgKGJyYWNlICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAiYnJhY2VzIikgewogICAgICAgICAgICBicmFjZS5jb21tYSA9IHRydWU7CiAgICAgICAgICAgIG91dHB1dCA9ICJ8IjsKICAgICAgICAgIH0KICAgICAgICAgIHB1c2goeyB0eXBlOiAiY29tbWEiLCB2YWx1ZSwgb3V0cHV0IH0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIi8iKSB7CiAgICAgICAgICBpZiAocHJldi50eXBlID09PSAiZG90IiAmJiBzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgKyAxKSB7CiAgICAgICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhdGUuaW5kZXggKyAxOwogICAgICAgICAgICBzdGF0ZS5jb25zdW1lZCA9ICIiOwogICAgICAgICAgICBzdGF0ZS5vdXRwdXQgPSAiIjsKICAgICAgICAgICAgdG9rZW5zLnBvcCgpOwogICAgICAgICAgICBwcmV2ID0gYm9zOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHB1c2goeyB0eXBlOiAic2xhc2giLCB2YWx1ZSwgb3V0cHV0OiBTTEFTSF9MSVRFUkFMIH0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIi4iKSB7CiAgICAgICAgICBpZiAoc3RhdGUuYnJhY2VzID4gMCAmJiBwcmV2LnR5cGUgPT09ICJkb3QiKSB7CiAgICAgICAgICAgIGlmIChwcmV2LnZhbHVlID09PSAiLiIpIHByZXYub3V0cHV0ID0gRE9UX0xJVEVSQUw7CiAgICAgICAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgcHJldi50eXBlID0gImRvdHMiOwogICAgICAgICAgICBwcmV2Lm91dHB1dCArPSB2YWx1ZTsKICAgICAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTsKICAgICAgICAgICAgYnJhY2UuZG90cyA9IHRydWU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmJyYWNlcyArIHN0YXRlLnBhcmVucyA9PT0gMCAmJiBwcmV2LnR5cGUgIT09ICJib3MiICYmIHByZXYudHlwZSAhPT0gInNsYXNoIikgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBwdXNoKHsgdHlwZTogImRvdCIsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIj8iKSB7CiAgICAgICAgICBjb25zdCBpc0dyb3VwID0gcHJldiAmJiBwcmV2LnZhbHVlID09PSAiKCI7CiAgICAgICAgICBpZiAoIWlzR3JvdXAgJiYgb3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAiKCIgJiYgcGVlaygyKSAhPT0gIj8iKSB7CiAgICAgICAgICAgIGV4dGdsb2JPcGVuKCJxbWFyayIsIHZhbHVlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICJwYXJlbiIpIHsKICAgICAgICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTsKICAgICAgICAgICAgbGV0IG91dHB1dCA9IHZhbHVlOwogICAgICAgICAgICBpZiAocHJldi52YWx1ZSA9PT0gIigiICYmICEvWyE9PDpdLy50ZXN0KG5leHQpIHx8IG5leHQgPT09ICI8IiAmJiAhLzwoWyE9XXxcdys+KS8udGVzdChyZW1haW5pbmcoKSkpIHsKICAgICAgICAgICAgICBvdXRwdXQgPSBgXFwke3ZhbHVlfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWUsIG91dHB1dCB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0cy5kb3QgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gInNsYXNoIiB8fCBwcmV2LnR5cGUgPT09ICJib3MiKSkgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInFtYXJrIiwgdmFsdWUsIG91dHB1dDogUU1BUktfTk9fRE9UIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHB1c2goeyB0eXBlOiAicW1hcmsiLCB2YWx1ZSwgb3V0cHV0OiBRTUFSSyB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICIhIikgewogICAgICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gIigiKSB7CiAgICAgICAgICAgIGlmIChwZWVrKDIpICE9PSAiPyIgfHwgIS9bIT08Ol0vLnRlc3QocGVlaygzKSkpIHsKICAgICAgICAgICAgICBleHRnbG9iT3BlbigibmVnYXRlIiwgdmFsdWUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBzdGF0ZS5pbmRleCA9PT0gMCkgewogICAgICAgICAgICBuZWdhdGUoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA9PT0gIisiKSB7CiAgICAgICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAiKCIgJiYgcGVlaygyKSAhPT0gIj8iKSB7CiAgICAgICAgICAgIGV4dGdsb2JPcGVuKCJwbHVzIiwgdmFsdWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYudmFsdWUgPT09ICIoIiB8fCBvcHRzLnJlZ2V4ID09PSBmYWxzZSkgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogInBsdXMiLCB2YWx1ZSwgb3V0cHV0OiBQTFVTX0xJVEVSQUwgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gImJyYWNrZXQiIHx8IHByZXYudHlwZSA9PT0gInBhcmVuIiB8fCBwcmV2LnR5cGUgPT09ICJicmFjZSIpIHx8IHN0YXRlLnBhcmVucyA+IDApIHsKICAgICAgICAgICAgcHVzaCh7IHR5cGU6ICJwbHVzIiwgdmFsdWUgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgcHVzaCh7IHR5cGU6ICJwbHVzIiwgdmFsdWU6IFBMVVNfTElURVJBTCB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICJAIikgewogICAgICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gIigiICYmIHBlZWsoMikgIT09ICI/IikgewogICAgICAgICAgICBwdXNoKHsgdHlwZTogImF0IiwgZXh0Z2xvYjogdHJ1ZSwgdmFsdWUsIG91dHB1dDogIiIgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgcHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWUgfSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9PSAiKiIpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gIiQiIHx8IHZhbHVlID09PSAiXiIpIHsKICAgICAgICAgICAgdmFsdWUgPSBgXFwke3ZhbHVlfWA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBtYXRjaCA9IFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLmV4ZWMocmVtYWluaW5nKCkpOwogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhbHVlICs9IG1hdGNoWzBdOwogICAgICAgICAgICBzdGF0ZS5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBwdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZSB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAiZ2xvYnN0YXIiIHx8IHByZXYuc3RhciA9PT0gdHJ1ZSkpIHsKICAgICAgICAgIHByZXYudHlwZSA9ICJzdGFyIjsKICAgICAgICAgIHByZXYuc3RhciA9IHRydWU7CiAgICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlOwogICAgICAgICAgcHJldi5vdXRwdXQgPSBzdGFyOwogICAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTsKICAgICAgICAgIGNvbnN1bWUodmFsdWUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCByZXN0ID0gcmVtYWluaW5nKCk7CiAgICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIC9eXChbXj9dLy50ZXN0KHJlc3QpKSB7CiAgICAgICAgICBleHRnbG9iT3Blbigic3RhciIsIHZhbHVlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJldi50eXBlID09PSAic3RhciIpIHsKICAgICAgICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHsKICAgICAgICAgICAgY29uc3VtZSh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcHJpb3IgPSBwcmV2LnByZXY7CiAgICAgICAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5wcmV2OwogICAgICAgICAgY29uc3QgaXNTdGFydCA9IHByaW9yLnR5cGUgPT09ICJzbGFzaCIgfHwgcHJpb3IudHlwZSA9PT0gImJvcyI7CiAgICAgICAgICBjb25zdCBhZnRlclN0YXIgPSBiZWZvcmUgJiYgKGJlZm9yZS50eXBlID09PSAic3RhciIgfHwgYmVmb3JlLnR5cGUgPT09ICJnbG9ic3RhciIpOwogICAgICAgICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSAmJiAoIWlzU3RhcnQgfHwgcmVzdFswXSAmJiByZXN0WzBdICE9PSAiLyIpKSB7CiAgICAgICAgICAgIHB1c2goeyB0eXBlOiAic3RhciIsIHZhbHVlLCBvdXRwdXQ6ICIiIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmIChwcmlvci50eXBlID09PSAiY29tbWEiIHx8IHByaW9yLnR5cGUgPT09ICJicmFjZSIpOwogICAgICAgICAgY29uc3QgaXNFeHRnbG9iID0gZXh0Z2xvYnMubGVuZ3RoICYmIChwcmlvci50eXBlID09PSAicGlwZSIgfHwgcHJpb3IudHlwZSA9PT0gInBhcmVuIik7CiAgICAgICAgICBpZiAoIWlzU3RhcnQgJiYgcHJpb3IudHlwZSAhPT0gInBhcmVuIiAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7CiAgICAgICAgICAgIHB1c2goeyB0eXBlOiAic3RhciIsIHZhbHVlLCBvdXRwdXQ6ICIiIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChyZXN0LnNsaWNlKDAsIDMpID09PSAiLyoqIikgewogICAgICAgICAgICBjb25zdCBhZnRlciA9IGlucHV0W3N0YXRlLmluZGV4ICsgNF07CiAgICAgICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoMyk7CiAgICAgICAgICAgIGNvbnN1bWUoIi8qKiIsIDMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICJib3MiICYmIGVvcygpKSB7CiAgICAgICAgICAgIHByZXYudHlwZSA9ICJnbG9ic3RhciI7CiAgICAgICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7CiAgICAgICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0OwogICAgICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7CiAgICAgICAgICAgIGNvbnN1bWUodmFsdWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwcmlvci50eXBlID09PSAic2xhc2giICYmIHByaW9yLnByZXYudHlwZSAhPT0gImJvcyIgJiYgIWFmdGVyU3RhciAmJiBlb3MoKSkgewogICAgICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTsKICAgICAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7CiAgICAgICAgICAgIHByZXYudHlwZSA9ICJnbG9ic3RhciI7CiAgICAgICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cykgKyAob3B0cy5zdHJpY3RTbGFzaGVzID8gIikiIDogInwkKSIpOwogICAgICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlOwogICAgICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDsKICAgICAgICAgICAgY29uc3VtZSh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICJzbGFzaCIgJiYgcHJpb3IucHJldi50eXBlICE9PSAiYm9zIiAmJiByZXN0WzBdID09PSAiLyIpIHsKICAgICAgICAgICAgY29uc3QgZW5kID0gcmVzdFsxXSAhPT0gdm9pZCAwID8gInwkIiA6ICIiOwogICAgICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTsKICAgICAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7CiAgICAgICAgICAgIHByZXYudHlwZSA9ICJnbG9ic3RhciI7CiAgICAgICAgICAgIHByZXYub3V0cHV0ID0gYCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfXwke1NMQVNIX0xJVEVSQUx9JHtlbmR9KWA7CiAgICAgICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDsKICAgICAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlOwogICAgICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTsKICAgICAgICAgICAgcHVzaCh7IHR5cGU6ICJzbGFzaCIsIHZhbHVlOiAiLyIsIG91dHB1dDogIiIgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICJib3MiICYmIHJlc3RbMF0gPT09ICIvIikgewogICAgICAgICAgICBwcmV2LnR5cGUgPSAiZ2xvYnN0YXIiOwogICAgICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlOwogICAgICAgICAgICBwcmV2Lm91dHB1dCA9IGAoPzpefCR7U0xBU0hfTElURVJBTH18JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KWA7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0OwogICAgICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7CiAgICAgICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpOwogICAgICAgICAgICBwdXNoKHsgdHlwZTogInNsYXNoIiwgdmFsdWU6ICIvIiwgb3V0cHV0OiAiIiB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7CiAgICAgICAgICBwcmV2LnR5cGUgPSAiZ2xvYnN0YXIiOwogICAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKTsKICAgICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7CiAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7CiAgICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7CiAgICAgICAgICBjb25zdW1lKHZhbHVlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB0b2tlbiA9IHsgdHlwZTogInN0YXIiLCB2YWx1ZSwgb3V0cHV0OiBzdGFyIH07CiAgICAgICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSkgewogICAgICAgICAgdG9rZW4ub3V0cHV0ID0gIi4qPyI7CiAgICAgICAgICBpZiAocHJldi50eXBlID09PSAiYm9zIiB8fCBwcmV2LnR5cGUgPT09ICJzbGFzaCIpIHsKICAgICAgICAgICAgdG9rZW4ub3V0cHV0ID0gbm9kb3QgKyB0b2tlbi5vdXRwdXQ7CiAgICAgICAgICB9CiAgICAgICAgICBwdXNoKHRva2VuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAiYnJhY2tldCIgfHwgcHJldi50eXBlID09PSAicGFyZW4iKSAmJiBvcHRzLnJlZ2V4ID09PSB0cnVlKSB7CiAgICAgICAgICB0b2tlbi5vdXRwdXQgPSB2YWx1ZTsKICAgICAgICAgIHB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgfHwgcHJldi50eXBlID09PSAic2xhc2giIHx8IHByZXYudHlwZSA9PT0gImRvdCIpIHsKICAgICAgICAgIGlmIChwcmV2LnR5cGUgPT09ICJkb3QiKSB7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RfU0xBU0g7CiAgICAgICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5kb3QgPT09IHRydWUpIHsKICAgICAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7CiAgICAgICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gbm9kb3Q7CiAgICAgICAgICAgIHByZXYub3V0cHV0ICs9IG5vZG90OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBlZWsoKSAhPT0gIioiKSB7CiAgICAgICAgICAgIHN0YXRlLm91dHB1dCArPSBPTkVfQ0hBUjsKICAgICAgICAgICAgcHJldi5vdXRwdXQgKz0gT05FX0NIQVI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1c2godG9rZW4pOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZS5icmFja2V0cyA+IDApIHsKICAgICAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCJjbG9zaW5nIiwgIl0iKSk7CiAgICAgICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICJbIik7CiAgICAgICAgZGVjcmVtZW50KCJicmFja2V0cyIpOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7CiAgICAgICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcigiY2xvc2luZyIsICIpIikpOwogICAgICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAiKCIpOwogICAgICAgIGRlY3JlbWVudCgicGFyZW5zIik7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlLmJyYWNlcyA+IDApIHsKICAgICAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCJjbG9zaW5nIiwgIn0iKSk7CiAgICAgICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICJ7Iik7CiAgICAgICAgZGVjcmVtZW50KCJicmFjZXMiKTsKICAgICAgfQogICAgICBpZiAob3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICJzdGFyIiB8fCBwcmV2LnR5cGUgPT09ICJicmFja2V0IikpIHsKICAgICAgICBwdXNoKHsgdHlwZTogIm1heWJlX3NsYXNoIiwgdmFsdWU6ICIiLCBvdXRwdXQ6IGAke1NMQVNIX0xJVEVSQUx9P2AgfSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmJhY2t0cmFjayA9PT0gdHJ1ZSkgewogICAgICAgIHN0YXRlLm91dHB1dCA9ICIiOwogICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygc3RhdGUudG9rZW5zKSB7CiAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTsKICAgICAgICAgIGlmICh0b2tlbi5zdWZmaXgpIHsKICAgICAgICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLnN1ZmZpeDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXRlOwogICAgfTsKICAgIHBhcnNlLmZhc3RwYXRocyA9IChpbnB1dCwgb3B0aW9ucykgPT4gewogICAgICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07CiAgICAgIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gIm51bWJlciIgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIOwogICAgICBjb25zdCBsZW4gPSBpbnB1dC5sZW5ndGg7CiAgICAgIGlmIChsZW4gPiBtYXgpIHsKICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApOwogICAgICB9CiAgICAgIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDsKICAgICAgY29uc3QgewogICAgICAgIERPVF9MSVRFUkFMLAogICAgICAgIFNMQVNIX0xJVEVSQUwsCiAgICAgICAgT05FX0NIQVIsCiAgICAgICAgRE9UU19TTEFTSCwKICAgICAgICBOT19ET1QsCiAgICAgICAgTk9fRE9UUywKICAgICAgICBOT19ET1RTX1NMQVNILAogICAgICAgIFNUQVIsCiAgICAgICAgU1RBUlRfQU5DSE9SCiAgICAgIH0gPSBjb25zdGFudHMuZ2xvYkNoYXJzKG9wdHMud2luZG93cyk7CiAgICAgIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyBOT19ET1RTIDogTk9fRE9UOwogICAgICBjb25zdCBzbGFzaERvdCA9IG9wdHMuZG90ID8gTk9fRE9UU19TTEFTSCA6IE5PX0RPVDsKICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICIiIDogIj86IjsKICAgICAgY29uc3Qgc3RhdGUgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBwcmVmaXg6ICIiIH07CiAgICAgIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gIi4qPyIgOiBTVEFSOwogICAgICBpZiAob3B0cy5jYXB0dXJlKSB7CiAgICAgICAgc3RhciA9IGAoJHtzdGFyfSlgOwogICAgICB9CiAgICAgIGNvbnN0IGdsb2JzdGFyID0gKG9wdHMyKSA9PiB7CiAgICAgICAgaWYgKG9wdHMyLm5vZ2xvYnN0YXIgPT09IHRydWUpIHJldHVybiBzdGFyOwogICAgICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMyLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgOwogICAgICB9OwogICAgICBjb25zdCBjcmVhdGUgPSAoc3RyKSA9PiB7CiAgICAgICAgc3dpdGNoIChzdHIpIHsKICAgICAgICAgIGNhc2UgIioiOgogICAgICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDsKICAgICAgICAgIGNhc2UgIi4qIjoKICAgICAgICAgICAgcmV0dXJuIGAke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7CiAgICAgICAgICBjYXNlICIqLioiOgogICAgICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDsKICAgICAgICAgIGNhc2UgIiovKiI6CiAgICAgICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtTTEFTSF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzbGFzaERvdH0ke3N0YXJ9YDsKICAgICAgICAgIGNhc2UgIioqIjoKICAgICAgICAgICAgcmV0dXJuIG5vZG90ICsgZ2xvYnN0YXIob3B0cyk7CiAgICAgICAgICBjYXNlICIqKi8qIjoKICAgICAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke09ORV9DSEFSfSR7c3Rhcn1gOwogICAgICAgICAgY2FzZSAiKiovKi4qIjoKICAgICAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gOwogICAgICAgICAgY2FzZSAiKiovLioiOgogICAgICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7CiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL14oLio/KVwuKFx3KykkLy5leGVjKHN0cik7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHJldHVybjsKICAgICAgICAgICAgY29uc3Qgc291cmNlMiA9IGNyZWF0ZShtYXRjaFsxXSk7CiAgICAgICAgICAgIGlmICghc291cmNlMikgcmV0dXJuOwogICAgICAgICAgICByZXR1cm4gc291cmNlMiArIERPVF9MSVRFUkFMICsgbWF0Y2hbMl07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBjb25zdCBvdXRwdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTsKICAgICAgbGV0IHNvdXJjZSA9IGNyZWF0ZShvdXRwdXQpOwogICAgICBpZiAoc291cmNlICYmIG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSkgewogICAgICAgIHNvdXJjZSArPSBgJHtTTEFTSF9MSVRFUkFMfT9gOwogICAgICB9CiAgICAgIHJldHVybiBzb3VyY2U7CiAgICB9OwogICAgbW9kdWxlMi5leHBvcnRzID0gcGFyc2U7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3BpY29tYXRjaC1ucG0tNC4wLjItZTkzNTE2ZGRmMi1jZTYxN2I4ZGEzLnppcC9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9waWNvbWF0Y2guanMKdmFyIHJlcXVpcmVfcGljb21hdGNoID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL3BpY29tYXRjaC1ucG0tNC4wLjItZTkzNTE2ZGRmMi1jZTYxN2I4ZGEzLnppcC9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9waWNvbWF0Y2guanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgc2NhbiA9IHJlcXVpcmVfc2NhbjIoKTsKICAgIHZhciBwYXJzZSA9IHJlcXVpcmVfcGFyc2UoKTsKICAgIHZhciB1dGlscyA9IHJlcXVpcmVfdXRpbHM0KCk7CiAgICB2YXIgY29uc3RhbnRzID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgIHZhciBpc09iamVjdCA9ICh2YWwpID0+IHZhbCAmJiB0eXBlb2YgdmFsID09PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSh2YWwpOwogICAgdmFyIHBpY29tYXRjaCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7CiAgICAgICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoKGlucHV0KSA9PiBwaWNvbWF0Y2goaW5wdXQsIG9wdGlvbnMsIHJldHVyblN0YXRlKSk7CiAgICAgICAgY29uc3QgYXJyYXlNYXRjaGVyID0gKHN0cikgPT4gewogICAgICAgICAgZm9yIChjb25zdCBpc01hdGNoIG9mIGZucykgewogICAgICAgICAgICBjb25zdCBzdGF0ZTIgPSBpc01hdGNoKHN0cik7CiAgICAgICAgICAgIGlmIChzdGF0ZTIpIHJldHVybiBzdGF0ZTI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gYXJyYXlNYXRjaGVyOwogICAgICB9CiAgICAgIGNvbnN0IGlzU3RhdGUgPSBpc09iamVjdChnbG9iKSAmJiBnbG9iLnRva2VucyAmJiBnbG9iLmlucHV0OwogICAgICBpZiAoZ2xvYiA9PT0gIiIgfHwgdHlwZW9mIGdsb2IgIT09ICJzdHJpbmciICYmICFpc1N0YXRlKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgcGF0dGVybiB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTsKICAgICAgfQogICAgICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTsKICAgICAgY29uc3QgcG9zaXggPSBvcHRzLndpbmRvd3M7CiAgICAgIGNvbnN0IHJlZ2V4ID0gaXNTdGF0ZSA/IHBpY29tYXRjaC5jb21waWxlUmUoZ2xvYiwgb3B0aW9ucykgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMsIGZhbHNlLCB0cnVlKTsKICAgICAgY29uc3Qgc3RhdGUgPSByZWdleC5zdGF0ZTsKICAgICAgZGVsZXRlIHJlZ2V4LnN0YXRlOwogICAgICBsZXQgaXNJZ25vcmVkID0gKCkgPT4gZmFsc2U7CiAgICAgIGlmIChvcHRzLmlnbm9yZSkgewogICAgICAgIGNvbnN0IGlnbm9yZU9wdHMgPSB7IC4uLm9wdGlvbnMsIGlnbm9yZTogbnVsbCwgb25NYXRjaDogbnVsbCwgb25SZXN1bHQ6IG51bGwgfTsKICAgICAgICBpc0lnbm9yZWQgPSBwaWNvbWF0Y2gob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTsKICAgICAgfQogICAgICBjb25zdCBtYXRjaGVyID0gKGlucHV0LCByZXR1cm5PYmplY3QgPSBmYWxzZSkgPT4gewogICAgICAgIGNvbnN0IHsgaXNNYXRjaCwgbWF0Y2gsIG91dHB1dCB9ID0gcGljb21hdGNoLnRlc3QoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0pOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgZ2xvYiwgc3RhdGUsIHJlZ2V4LCBwb3NpeCwgaW5wdXQsIG91dHB1dCwgbWF0Y2gsIGlzTWF0Y2ggfTsKICAgICAgICBpZiAodHlwZW9mIG9wdHMub25SZXN1bHQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIG9wdHMub25SZXN1bHQocmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTWF0Y2ggPT09IGZhbHNlKSB7CiAgICAgICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaXNJZ25vcmVkKGlucHV0KSkgewogICAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uSWdub3JlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIG9wdHMub25JZ25vcmUocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbk1hdGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBvcHRzLm9uTWF0Y2gocmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IHRydWU7CiAgICAgIH07CiAgICAgIGlmIChyZXR1cm5TdGF0ZSkgewogICAgICAgIG1hdGNoZXIuc3RhdGUgPSBzdGF0ZTsKICAgICAgfQogICAgICByZXR1cm4gbWF0Y2hlcjsKICAgIH07CiAgICBwaWNvbWF0Y2gudGVzdCA9IChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSA9IHt9KSA9PiB7CiAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYSBzdHJpbmciKTsKICAgICAgfQogICAgICBpZiAoaW5wdXQgPT09ICIiKSB7CiAgICAgICAgcmV0dXJuIHsgaXNNYXRjaDogZmFsc2UsIG91dHB1dDogIiIgfTsKICAgICAgfQogICAgICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTsKICAgICAgY29uc3QgZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgKHBvc2l4ID8gdXRpbHMudG9Qb3NpeFNsYXNoZXMgOiBudWxsKTsKICAgICAgbGV0IG1hdGNoID0gaW5wdXQgPT09IGdsb2I7CiAgICAgIGxldCBvdXRwdXQgPSBtYXRjaCAmJiBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7CiAgICAgIGlmIChtYXRjaCA9PT0gZmFsc2UpIHsKICAgICAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7CiAgICAgICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7CiAgICAgIH0KICAgICAgaWYgKG1hdGNoID09PSBmYWxzZSB8fCBvcHRzLmNhcHR1cmUgPT09IHRydWUpIHsKICAgICAgICBpZiAob3B0cy5tYXRjaEJhc2UgPT09IHRydWUgfHwgb3B0cy5iYXNlbmFtZSA9PT0gdHJ1ZSkgewogICAgICAgICAgbWF0Y2ggPSBwaWNvbWF0Y2gubWF0Y2hCYXNlKGlucHV0LCByZWdleCwgb3B0aW9ucywgcG9zaXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMob3V0cHV0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgaXNNYXRjaDogQm9vbGVhbihtYXRjaCksIG1hdGNoLCBvdXRwdXQgfTsKICAgIH07CiAgICBwaWNvbWF0Y2gubWF0Y2hCYXNlID0gKGlucHV0LCBnbG9iLCBvcHRpb25zKSA9PiB7CiAgICAgIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMpOwogICAgICByZXR1cm4gcmVnZXgudGVzdCh1dGlscy5iYXNlbmFtZShpbnB1dCkpOwogICAgfTsKICAgIHBpY29tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTsKICAgIHBpY29tYXRjaC5wYXJzZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSByZXR1cm4gcGF0dGVybi5tYXAoKHApID0+IHBpY29tYXRjaC5wYXJzZShwLCBvcHRpb25zKSk7CiAgICAgIHJldHVybiBwYXJzZShwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGZhc3RwYXRoczogZmFsc2UgfSk7CiAgICB9OwogICAgcGljb21hdGNoLnNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHNjYW4oaW5wdXQsIG9wdGlvbnMpOwogICAgcGljb21hdGNoLmNvbXBpbGVSZSA9IChzdGF0ZSwgb3B0aW9ucywgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHsKICAgICAgaWYgKHJldHVybk91dHB1dCA9PT0gdHJ1ZSkgewogICAgICAgIHJldHVybiBzdGF0ZS5vdXRwdXQ7CiAgICAgIH0KICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307CiAgICAgIGNvbnN0IHByZXBlbmQgPSBvcHRzLmNvbnRhaW5zID8gIiIgOiAiXiI7CiAgICAgIGNvbnN0IGFwcGVuZCA9IG9wdHMuY29udGFpbnMgPyAiIiA6ICIkIjsKICAgICAgbGV0IHNvdXJjZSA9IGAke3ByZXBlbmR9KD86JHtzdGF0ZS5vdXRwdXR9KSR7YXBwZW5kfWA7CiAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7CiAgICAgICAgc291cmNlID0gYF4oPyEke3NvdXJjZX0pLiokYDsKICAgICAgfQogICAgICBjb25zdCByZWdleCA9IHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZSwgb3B0aW9ucyk7CiAgICAgIGlmIChyZXR1cm5TdGF0ZSA9PT0gdHJ1ZSkgewogICAgICAgIHJlZ2V4LnN0YXRlID0gc3RhdGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlZ2V4OwogICAgfTsKICAgIHBpY29tYXRjaC5tYWtlUmUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSwgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHsKICAgICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBub24tZW1wdHkgc3RyaW5nIik7CiAgICAgIH0KICAgICAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9OwogICAgICBpZiAob3B0aW9ucy5mYXN0cGF0aHMgIT09IGZhbHNlICYmIChpbnB1dFswXSA9PT0gIi4iIHx8IGlucHV0WzBdID09PSAiKiIpKSB7CiAgICAgICAgcGFyc2VkLm91dHB1dCA9IHBhcnNlLmZhc3RwYXRocyhpbnB1dCwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKCFwYXJzZWQub3V0cHV0KSB7CiAgICAgICAgcGFyc2VkID0gcGFyc2UoaW5wdXQsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIHJldHVybiBwaWNvbWF0Y2guY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7CiAgICB9OwogICAgcGljb21hdGNoLnRvUmVnZXggPSAoc291cmNlLCBvcHRpb25zKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCBvcHRzLmZsYWdzIHx8IChvcHRzLm5vY2FzZSA/ICJpIiA6ICIiKSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHRocm93IGVycjsKICAgICAgICByZXR1cm4gLyReLzsKICAgICAgfQogICAgfTsKICAgIHBpY29tYXRjaC5jb25zdGFudHMgPSBjb25zdGFudHM7CiAgICBtb2R1bGUyLmV4cG9ydHMgPSBwaWNvbWF0Y2g7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL3BpY29tYXRjaC1ucG0tNC4wLjItZTkzNTE2ZGRmMi1jZTYxN2I4ZGEzLnppcC9ub2RlX21vZHVsZXMvcGljb21hdGNoL2luZGV4LmpzCnZhciByZXF1aXJlX3BpY29tYXRjaDIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvcGljb21hdGNoLW5wbS00LjAuMi1lOTM1MTZkZGYyLWNlNjE3YjhkYTMuemlwL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgcGljbyA9IHJlcXVpcmVfcGljb21hdGNoKCk7CiAgICB2YXIgdXRpbHMgPSByZXF1aXJlX3V0aWxzNCgpOwogICAgZnVuY3Rpb24gcGljb21hdGNoKGdsb2IsIG9wdGlvbnMsIHJldHVyblN0YXRlID0gZmFsc2UpIHsKICAgICAgaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnMud2luZG93cyA9PT0gbnVsbCB8fCBvcHRpb25zLndpbmRvd3MgPT09IHZvaWQgMCkpIHsKICAgICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCB3aW5kb3dzOiB1dGlscy5pc1dpbmRvd3MoKSB9OwogICAgICB9CiAgICAgIHJldHVybiBwaWNvKGdsb2IsIG9wdGlvbnMsIHJldHVyblN0YXRlKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24ocGljb21hdGNoLCBwaWNvKTsKICAgIG1vZHVsZTIuZXhwb3J0cyA9IHBpY29tYXRjaDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3BhdHRlcm4uanMKdmFyIHJlcXVpcmVfcGF0dGVybjIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3BhdHRlcm4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlBhdHRlcm5NYXRjaGluZ0hvc3QgPSB2b2lkIDA7CiAgICB2YXIgcGljb21hdGNoXzEgPSByZXF1aXJlX3BpY29tYXRjaDIoKTsKICAgIHZhciByZXNvbHZlcl8xID0gcmVxdWlyZV9yZXNvbHZlcigpOwogICAgdmFyIFBhdHRlcm5NYXRjaGluZ0hvc3QgPSBjbGFzcyBleHRlbmRzIHJlc29sdmVyXzEuUmVzb2x2ZXJIb3N0IHsKICAgICAgX3BhdHRlcm5zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgYWRkUGF0dGVybihwYXR0ZXJuLCByZXBsYWNlbWVudEZuKSB7CiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHBhdHRlcm4pID8gcGF0dGVybiA6IFtwYXR0ZXJuXTsKICAgICAgICBmb3IgKGNvbnN0IGdsb2Igb2YgcGF0dGVybnMpIHsKICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSAoMCwgcGljb21hdGNoXzEucGFyc2UpKGdsb2IpOwogICAgICAgICAgdGhpcy5fcGF0dGVybnMuc2V0KG5ldyBSZWdFeHAoYF4ke291dHB1dH0kYCksIHJlcGxhY2VtZW50Rm4pOwogICAgICAgIH0KICAgICAgfQogICAgICBfcmVzb2x2ZShwYXRoKSB7CiAgICAgICAgbGV0IG5ld1BhdGggPSBwYXRoOwogICAgICAgIHRoaXMuX3BhdHRlcm5zLmZvckVhY2goKGZuLCByZSkgPT4gewogICAgICAgICAgaWYgKHJlLnRlc3QocGF0aCkpIHsKICAgICAgICAgICAgbmV3UGF0aCA9IGZuKG5ld1BhdGgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXdQYXRoOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuUGF0dGVybk1hdGNoaW5nSG9zdCA9IFBhdHRlcm5NYXRjaGluZ0hvc3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9yZWNvcmQuanMKdmFyIHJlcXVpcmVfcmVjb3JkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9yZWNvcmQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkNvcmRIb3N0ID0gdm9pZCAwOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgZXhjZXB0aW9uXzEgPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIG1lbW9yeV8xID0gcmVxdWlyZV9tZW1vcnkoKTsKICAgIHZhciBDb3JkSG9zdCA9IGNsYXNzIF9Db3JkSG9zdCBleHRlbmRzIG1lbW9yeV8xLlNpbXBsZU1lbW9yeUhvc3QgewogICAgICBfYmFjazsKICAgICAgX2ZpbGVzVG9DcmVhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICBfZmlsZXNUb1JlbmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIF9maWxlc1RvUmVuYW1lUmV2ZXJ0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgX2ZpbGVzVG9EZWxldGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICBfZmlsZXNUb092ZXJ3cml0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIGNvbnN0cnVjdG9yKF9iYWNrKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9iYWNrID0gX2JhY2s7CiAgICAgIH0KICAgICAgZ2V0IGJhY2tlbmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2s7CiAgICAgIH0KICAgICAgZ2V0IGNhcGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc3luY2hyb25vdXM6IHRoaXMuX2JhY2suY2FwYWJpbGl0aWVzLnN5bmNocm9ub3VzCiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgY29weSBvZiB0aGlzIGhvc3QsIGluY2x1ZGluZyBhbGwgYWN0aW9ucyBtYWRlLgogICAgICAgKiBAcmV0dXJucyB7Q29yZEhvc3R9IFRoZSBjYXJib24gY29weS4KICAgICAgICovCiAgICAgIGNsb25lKCkgewogICAgICAgIGNvbnN0IGRvbGx5ID0gbmV3IF9Db3JkSG9zdCh0aGlzLl9iYWNrKTsKICAgICAgICBkb2xseS5fY2FjaGUgPSBuZXcgTWFwKHRoaXMuX2NhY2hlKTsKICAgICAgICBkb2xseS5fZmlsZXNUb0NyZWF0ZSA9IG5ldyBTZXQodGhpcy5fZmlsZXNUb0NyZWF0ZSk7CiAgICAgICAgZG9sbHkuX2ZpbGVzVG9SZW5hbWUgPSBuZXcgTWFwKHRoaXMuX2ZpbGVzVG9SZW5hbWUpOwogICAgICAgIGRvbGx5Ll9maWxlc1RvUmVuYW1lUmV2ZXJ0ID0gbmV3IE1hcCh0aGlzLl9maWxlc1RvUmVuYW1lUmV2ZXJ0KTsKICAgICAgICBkb2xseS5fZmlsZXNUb0RlbGV0ZSA9IG5ldyBTZXQodGhpcy5fZmlsZXNUb0RlbGV0ZSk7CiAgICAgICAgZG9sbHkuX2ZpbGVzVG9PdmVyd3JpdGUgPSBuZXcgU2V0KHRoaXMuX2ZpbGVzVG9PdmVyd3JpdGUpOwogICAgICAgIHJldHVybiBkb2xseTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ29tbWl0IHRoZSBjaGFuZ2VzIHJlY29yZGVkIHRvIGEgSG9zdC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBob3N0IGRvZXMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUKICAgICAgICogYXMgdGhlIGhvc3QgdGhhdCB3YXMgdXNlZCBmb3IgYmFja2VuZCAoY291bGQgYmUgdGhlIHNhbWUgaG9zdCkuCiAgICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRvIGNyZWF0ZS9kZWxldGUvcmVuYW1lL292ZXJ3cml0ZSBmaWxlcyB0by4KICAgICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgdG8gc2tpcCBleGlzdGVuY2UgY2hlY2tzIHdoZW4gY3JlYXRpbmcvb3ZlcndyaXRpbmcuIFRoaXMgaXMKICAgICAgICogICBmYXN0ZXIgYnV0IG1pZ2h0IGxlYWQgdG8gaW5jb3JyZWN0IHN0YXRlcy4gQmVjYXVzZSBIb3N0cyBuYXRpdmVseSBkb24ndCBzdXBwb3J0IGNyZWF0aW9uCiAgICAgICAqICAgdmVyc3VzIG92ZXJ3cml0aW5nIChpdCdzIG9ubHkgd3JpdGluZyksIHdlIGNoZWNrIGZvciBleGlzdGVuY2UgYmVmb3JlIGNvbXBsZXRpbmcgYSByZXF1ZXN0LgogICAgICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIHdoZW4gZG9uZSwgb3IgZXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJlZC4KICAgICAgICovCiAgICAgIGNvbW1pdChob3N0LCBmb3JjZSA9IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuZnJvbSkodGhpcy5yZWNvcmRzKCkpLnBpcGUoKDAsIHJ4anNfMS5jb25jYXRNYXApKChyZWNvcmQpID0+IHsKICAgICAgICAgIHN3aXRjaCAocmVjb3JkLmtpbmQpIHsKICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICByZXR1cm4gaG9zdC5kZWxldGUocmVjb3JkLnBhdGgpOwogICAgICAgICAgICBjYXNlICJyZW5hbWUiOgogICAgICAgICAgICAgIHJldHVybiBob3N0LnJlbmFtZShyZWNvcmQuZnJvbSwgcmVjb3JkLnRvKTsKICAgICAgICAgICAgY2FzZSAiY3JlYXRlIjoKICAgICAgICAgICAgICByZXR1cm4gaG9zdC5leGlzdHMocmVjb3JkLnBhdGgpLnBpcGUoKDAsIHJ4anNfMS5zd2l0Y2hNYXApKChleGlzdHMpID0+IHsKICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJiYgIWZvcmNlKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLnRocm93RXJyb3IpKG5ldyBleGNlcHRpb25fMS5GaWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uKHJlY29yZC5wYXRoKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICByZXR1cm4gaG9zdC53cml0ZShyZWNvcmQucGF0aCwgcmVjb3JkLmNvbnRlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgY2FzZSAib3ZlcndyaXRlIjoKICAgICAgICAgICAgICByZXR1cm4gaG9zdC5leGlzdHMocmVjb3JkLnBhdGgpLnBpcGUoKDAsIHJ4anNfMS5zd2l0Y2hNYXApKChleGlzdHMpID0+IHsKICAgICAgICAgICAgICAgIGlmICghZXhpc3RzICYmICFmb3JjZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS50aHJvd0Vycm9yKShuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihyZWNvcmQucGF0aCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Qud3JpdGUocmVjb3JkLnBhdGgsIHJlY29yZC5jb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgfSksICgwLCByeGpzXzEucmVkdWNlKSgoKSA9PiB7CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHJlY29yZHMoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIC4uLlsuLi50aGlzLl9maWxlc1RvRGVsZXRlLnZhbHVlcygpXS5tYXAoKHBhdGgpID0+ICh7CiAgICAgICAgICAgIGtpbmQ6ICJkZWxldGUiLAogICAgICAgICAgICBwYXRoCiAgICAgICAgICB9KSksCiAgICAgICAgICAuLi5bLi4udGhpcy5fZmlsZXNUb1JlbmFtZS5lbnRyaWVzKCldLm1hcCgoW2Zyb20sIHRvXSkgPT4gKHsKICAgICAgICAgICAga2luZDogInJlbmFtZSIsCiAgICAgICAgICAgIGZyb20sCiAgICAgICAgICAgIHRvCiAgICAgICAgICB9KSksCiAgICAgICAgICAuLi5bLi4udGhpcy5fZmlsZXNUb0NyZWF0ZS52YWx1ZXMoKV0ubWFwKChwYXRoKSA9PiAoewogICAgICAgICAgICBraW5kOiAiY3JlYXRlIiwKICAgICAgICAgICAgcGF0aCwKICAgICAgICAgICAgY29udGVudDogdGhpcy5fcmVhZChwYXRoKQogICAgICAgICAgfSkpLAogICAgICAgICAgLi4uWy4uLnRoaXMuX2ZpbGVzVG9PdmVyd3JpdGUudmFsdWVzKCldLm1hcCgocGF0aCkgPT4gKHsKICAgICAgICAgICAga2luZDogIm92ZXJ3cml0ZSIsCiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuX3JlYWQocGF0aCkKICAgICAgICAgIH0pKQogICAgICAgIF07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNwZWNpYWxpemVkIHZlcnNpb24gb2Yge0BsaW5rIENvcmRIb3N0I3dyaXRlfSB3aGljaCBmb3JjZXMgdGhlIGNyZWF0aW9uIG9mIGEgZmlsZSB3aGV0aGVyIGl0CiAgICAgICAqIGV4aXN0cyBvciBub3QuCiAgICAgICAqIEBwYXJhbSB7fSBwYXRoCiAgICAgICAqIEBwYXJhbSB7RmlsZUJ1ZmZlcn0gY29udGVudAogICAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTx2b2lkPn0KICAgICAgICovCiAgICAgIGNyZWF0ZShwYXRoLCBjb250ZW50KSB7CiAgICAgICAgaWYgKHN1cGVyLl9leGlzdHMocGF0aCkpIHsKICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5GaWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uKHBhdGgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fZmlsZXNUb0RlbGV0ZS5oYXMocGF0aCkpIHsKICAgICAgICAgIHRoaXMuX2ZpbGVzVG9EZWxldGUuZGVsZXRlKHBhdGgpOwogICAgICAgICAgdGhpcy5fZmlsZXNUb092ZXJ3cml0ZS5hZGQocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2ZpbGVzVG9DcmVhdGUuYWRkKHBhdGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwZXIud3JpdGUocGF0aCwgY29udGVudCk7CiAgICAgIH0KICAgICAgb3ZlcndyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0RpcmVjdG9yeShwYXRoKS5waXBlKCgwLCByeGpzXzEuc3dpdGNoTWFwKSgoaXNEaXIpID0+IHsKICAgICAgICAgIGlmIChpc0RpcikgewogICAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS50aHJvd0Vycm9yKShuZXcgZXhjZXB0aW9uXzEuUGF0aElzRGlyZWN0b3J5RXhjZXB0aW9uKHBhdGgpKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmV4aXN0cyhwYXRoKTsKICAgICAgICB9KSwgKDAsIHJ4anNfMS5zd2l0Y2hNYXApKChleGlzdHMpID0+IHsKICAgICAgICAgIGlmICghZXhpc3RzKSB7CiAgICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLnRocm93RXJyb3IpKG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHBhdGgpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fZmlsZXNUb0NyZWF0ZS5oYXMocGF0aCkpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb092ZXJ3cml0ZS5hZGQocGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3VwZXIud3JpdGUocGF0aCwgY29udGVudCk7CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHdyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMocGF0aCkucGlwZSgoMCwgcnhqc18xLnN3aXRjaE1hcCkoKGV4aXN0cykgPT4gewogICAgICAgICAgaWYgKGV4aXN0cykgewogICAgICAgICAgICBpZiAodGhpcy53aWxsUmVuYW1lKHBhdGgpIHx8IHRoaXMud2lsbERlbGV0ZShwYXRoKSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShwYXRoLCBjb250ZW50KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vdmVyd3JpdGUocGF0aCwgY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShwYXRoLCBjb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgaWYgKHRoaXMuX2V4aXN0cyhwYXRoKSkgewogICAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWQocGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9iYWNrLnJlYWQocGF0aCk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICBpZiAodGhpcy5fZXhpc3RzKHBhdGgpKSB7CiAgICAgICAgICBpZiAodGhpcy5fZmlsZXNUb0NyZWF0ZS5oYXMocGF0aCkpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb0NyZWF0ZS5kZWxldGUocGF0aCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2ZpbGVzVG9PdmVyd3JpdGUuaGFzKHBhdGgpKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbGVzVG9PdmVyd3JpdGUuZGVsZXRlKHBhdGgpOwogICAgICAgICAgICB0aGlzLl9maWxlc1RvRGVsZXRlLmFkZChwYXRoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG1heWJlT3JpZ2luID0gdGhpcy5fZmlsZXNUb1JlbmFtZVJldmVydC5nZXQocGF0aCk7CiAgICAgICAgICAgIGlmIChtYXliZU9yaWdpbikgewogICAgICAgICAgICAgIHRoaXMuX2ZpbGVzVG9SZW5hbWVSZXZlcnQuZGVsZXRlKHBhdGgpOwogICAgICAgICAgICAgIHRoaXMuX2ZpbGVzVG9SZW5hbWUuZGVsZXRlKG1heWJlT3JpZ2luKTsKICAgICAgICAgICAgICB0aGlzLl9maWxlc1RvRGVsZXRlLmFkZChtYXliZU9yaWdpbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEudGhyb3dFcnJvcikobmV3IGV4Y2VwdGlvbl8xLlVua25vd25FeGNlcHRpb24oYFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gUGF0aDogJHtKU09OLnN0cmluZ2lmeShwYXRoKX0uYCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3VwZXIuZGVsZXRlKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fYmFjay5leGlzdHMocGF0aCkucGlwZSgoMCwgcnhqc18xLnN3aXRjaE1hcCkoKGV4aXN0cykgPT4gewogICAgICAgICAgICBpZiAoZXhpc3RzKSB7CiAgICAgICAgICAgICAgdGhpcy5fZmlsZXNUb0RlbGV0ZS5hZGQocGF0aCk7CiAgICAgICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEub2YpKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEudGhyb3dFcnJvcikobmV3IGV4Y2VwdGlvbl8xLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24ocGF0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlbmFtZShmcm9tLCB0bykgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLmNvbmNhdCkodGhpcy5leGlzdHModG8pLCB0aGlzLmV4aXN0cyhmcm9tKSkucGlwZSgoMCwgcnhqc18xLnRvQXJyYXkpKCksICgwLCByeGpzXzEuc3dpdGNoTWFwKSgoW2V4aXN0VG8sIGV4aXN0RnJvbV0pID0+IHsKICAgICAgICAgIGlmICghZXhpc3RGcm9tKSB7CiAgICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLnRocm93RXJyb3IpKG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKGZyb20pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmcm9tID09PSB0bykgewogICAgICAgICAgICByZXR1cm4gcnhqc18xLkVNUFRZOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGV4aXN0VG8pIHsKICAgICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEudGhyb3dFcnJvcikobmV3IGV4Y2VwdGlvbl8xLkZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb24odG8pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9maWxlc1RvQ3JlYXRlLmhhcyhmcm9tKSkgewogICAgICAgICAgICB0aGlzLl9maWxlc1RvQ3JlYXRlLmRlbGV0ZShmcm9tKTsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb0NyZWF0ZS5hZGQodG8pOwogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVuYW1lKGZyb20sIHRvKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9maWxlc1RvT3ZlcndyaXRlLmhhcyhmcm9tKSkgewogICAgICAgICAgICB0aGlzLl9maWxlc1RvT3ZlcndyaXRlLmRlbGV0ZShmcm9tKTsKICAgICAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuY29uY2F0KSh0aGlzLnJlbmFtZShmcm9tLCB0byksIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgoeCkgPT4gewogICAgICAgICAgICAgIHRoaXMuX2ZpbGVzVG9PdmVyd3JpdGUuYWRkKHRvKTsKICAgICAgICAgICAgICB4LmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9maWxlc1RvRGVsZXRlLmhhcyh0bykpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb0RlbGV0ZS5kZWxldGUodG8pOwogICAgICAgICAgICB0aGlzLl9maWxlc1RvRGVsZXRlLmFkZChmcm9tKTsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb092ZXJ3cml0ZS5hZGQodG8pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGZyb20pLnBpcGUoKDAsIHJ4anNfMS5tYXApKChjb250ZW50KSA9PiB0aGlzLl93cml0ZSh0bywgY29udGVudCkpKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG1heWJlVG8xID0gdGhpcy5fZmlsZXNUb1JlbmFtZVJldmVydC5nZXQoZnJvbSk7CiAgICAgICAgICBpZiAobWF5YmVUbzEpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNUb1JlbmFtZS5kZWxldGUobWF5YmVUbzEpOwogICAgICAgICAgICB0aGlzLl9maWxlc1RvUmVuYW1lUmV2ZXJ0LmRlbGV0ZShmcm9tKTsKICAgICAgICAgICAgZnJvbSA9IG1heWJlVG8xOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZmlsZXNUb1JlbmFtZS5zZXQoZnJvbSwgdG8pOwogICAgICAgICAgdGhpcy5fZmlsZXNUb1JlbmFtZVJldmVydC5zZXQodG8sIGZyb20pOwogICAgICAgICAgaWYgKHRoaXMuX2V4aXN0cyhmcm9tKSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVuYW1lKGZyb20sIHRvKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYWNrLnJlYWQoZnJvbSkucGlwZSgoMCwgcnhqc18xLnN3aXRjaE1hcCkoKGNvbnRlbnQpID0+IHN1cGVyLndyaXRlKHRvLCBjb250ZW50KSkpOwogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfQogICAgICBsaXN0KHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5jb25jYXQpKHN1cGVyLmxpc3QocGF0aCksIHRoaXMuX2JhY2subGlzdChwYXRoKSkucGlwZSgoMCwgcnhqc18xLnJlZHVjZSkoKGxpc3QsIGN1cnIpID0+IHsKICAgICAgICAgIGN1cnIuZm9yRWFjaCgoZWxlbSkgPT4gbGlzdC5hZGQoZWxlbSkpOwogICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgfSwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSksICgwLCByeGpzXzEubWFwKSgoc2V0KSA9PiBbLi4uc2V0XSkpOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXN0cyhwYXRoKSA/ICgwLCByeGpzXzEub2YpKHRydWUpIDogdGhpcy53aWxsRGVsZXRlKHBhdGgpIHx8IHRoaXMud2lsbFJlbmFtZShwYXRoKSA/ICgwLCByeGpzXzEub2YpKGZhbHNlKSA6IHRoaXMuX2JhY2suZXhpc3RzKHBhdGgpOwogICAgICB9CiAgICAgIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZXhpc3RzKHBhdGgpID8gc3VwZXIuaXNEaXJlY3RvcnkocGF0aCkgOiB0aGlzLl9iYWNrLmlzRGlyZWN0b3J5KHBhdGgpOwogICAgICB9CiAgICAgIGlzRmlsZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXN0cyhwYXRoKSA/IHN1cGVyLmlzRmlsZShwYXRoKSA6IHRoaXMud2lsbERlbGV0ZShwYXRoKSB8fCB0aGlzLndpbGxSZW5hbWUocGF0aCkgPyAoMCwgcnhqc18xLm9mKShmYWxzZSkgOiB0aGlzLl9iYWNrLmlzRmlsZShwYXRoKTsKICAgICAgfQogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZXhpc3RzKHBhdGgpID8gc3VwZXIuc3RhdChwYXRoKSA6IHRoaXMud2lsbERlbGV0ZShwYXRoKSB8fCB0aGlzLndpbGxSZW5hbWUocGF0aCkgPyAoMCwgcnhqc18xLm9mKShudWxsKSA6IHRoaXMuX2JhY2suc3RhdChwYXRoKTsKICAgICAgfQogICAgICB3YXRjaChwYXRoLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgd2lsbENyZWF0ZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzVG9DcmVhdGUuaGFzKHBhdGgpOwogICAgICB9CiAgICAgIHdpbGxPdmVyd3JpdGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlc1RvT3ZlcndyaXRlLmhhcyhwYXRoKTsKICAgICAgfQogICAgICB3aWxsRGVsZXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXNUb0RlbGV0ZS5oYXMocGF0aCk7CiAgICAgIH0KICAgICAgd2lsbFJlbmFtZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzVG9SZW5hbWUuaGFzKHBhdGgpOwogICAgICB9CiAgICAgIHdpbGxSZW5hbWVUbyhwYXRoLCB0bykgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlc1RvUmVuYW1lLmdldChwYXRoKSA9PT0gdG87CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Db3JkSG9zdCA9IENvcmRIb3N0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3Qvc2FmZS5qcwp2YXIgcmVxdWlyZV9zYWZlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9zYWZlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5TYWZlUmVhZG9ubHlIb3N0ID0gdm9pZCAwOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgU2FmZVJlYWRvbmx5SG9zdCA9IGNsYXNzIHsKICAgICAgX2RlbGVnYXRlOwogICAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHsKICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTsKICAgICAgfQogICAgICBnZXQgY2FwYWJpbGl0aWVzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jYXBhYmlsaXRpZXM7CiAgICAgIH0KICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnJlYWQocGF0aCk7CiAgICAgIH0KICAgICAgbGlzdChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmxpc3QocGF0aCkucGlwZSgoMCwgcnhqc18xLmNhdGNoRXJyb3IpKCgpID0+ICgwLCByeGpzXzEub2YpKFtdKSkpOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmV4aXN0cyhwYXRoKTsKICAgICAgfQogICAgICBpc0RpcmVjdG9yeShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlzRGlyZWN0b3J5KHBhdGgpLnBpcGUoKDAsIHJ4anNfMS5jYXRjaEVycm9yKSgoKSA9PiAoMCwgcnhqc18xLm9mKShmYWxzZSkpKTsKICAgICAgfQogICAgICBpc0ZpbGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5pc0ZpbGUocGF0aCkucGlwZSgoMCwgcnhqc18xLmNhdGNoRXJyb3IpKCgpID0+ICgwLCByeGpzXzEub2YpKGZhbHNlKSkpOwogICAgICB9CiAgICAgIC8vIFNvbWUgaG9zdHMgbWF5IG5vdCBzdXBwb3J0IHN0YXRzLgogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICBjb25zdCBtYXliZVN0YXQgPSB0aGlzLl9kZWxlZ2F0ZS5zdGF0KHBhdGgpOwogICAgICAgIHJldHVybiBtYXliZVN0YXQgJiYgbWF5YmVTdGF0LnBpcGUoKDAsIHJ4anNfMS5jYXRjaEVycm9yKSgoKSA9PiAoMCwgcnhqc18xLm9mKShudWxsKSkpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuU2FmZVJlYWRvbmx5SG9zdCA9IFNhZmVSZWFkb25seUhvc3Q7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9zY29wZWQuanMKdmFyIHJlcXVpcmVfc2NvcGVkID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9zY29wZWQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlNjb3BlZEhvc3QgPSB2b2lkIDA7CiAgICB2YXIgcGF0aF8xID0gcmVxdWlyZV9wYXRoKCk7CiAgICB2YXIgcmVzb2x2ZXJfMSA9IHJlcXVpcmVfcmVzb2x2ZXIoKTsKICAgIHZhciBTY29wZWRIb3N0ID0gY2xhc3MgZXh0ZW5kcyByZXNvbHZlcl8xLlJlc29sdmVySG9zdCB7CiAgICAgIF9yb290OwogICAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgX3Jvb3QgPSBwYXRoXzEuTm9ybWFsaXplZFJvb3QpIHsKICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7CiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290OwogICAgICB9CiAgICAgIF9yZXNvbHZlKHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIHBhdGhfMS5qb2luKSh0aGlzLl9yb290LCBwYXRoKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlNjb3BlZEhvc3QgPSBTY29wZWRIb3N0OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvaW5kZXguanMKdmFyIHJlcXVpcmVfaG9zdCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19jcmVhdGVCaW5kaW5nID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgICBpZiAoIWRlc2MgfHwgKCJnZXQiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG1ba107CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7CiAgICB9IDogZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgb1trMl0gPSBtW2tdOwogICAgfSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19zZXRNb2R1bGVEZWZhdWx0IHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgdikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgImRlZmF1bHQiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pOwogICAgfSA6IGZ1bmN0aW9uKG8sIHYpIHsKICAgICAgb1siZGVmYXVsdCJdID0gdjsKICAgIH0pOwogICAgdmFyIF9faW1wb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9faW1wb3J0U3RhciB8fCAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykgewogICAgICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbihvMikgewogICAgICAgICAgdmFyIGFyID0gW107CiAgICAgICAgICBmb3IgKHZhciBrIGluIG8yKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8yLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7CiAgICAgICAgICByZXR1cm4gYXI7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gb3duS2V5cyhvKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZCkgewogICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmIChtb2QgIT0gbnVsbCkgewogICAgICAgICAgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gImRlZmF1bHQiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pOwogICAgICAgIH0KICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9KCk7CiAgICB2YXIgX19leHBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHBvcnRTdGFyIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMzKSB7CiAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09ICJkZWZhdWx0IiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMzLCBtLCBwKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnRlc3QgPSB2b2lkIDA7CiAgICB2YXIgdGVzdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlX3Rlc3QoKSk7CiAgICBleHBvcnRzMi50ZXN0ID0gdGVzdDsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2FsaWFzKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2J1ZmZlcjIoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfY3JlYXRlKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2VtcHR5MigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9pbnRlcmZhY2UyKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX21lbW9yeSgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9wYXR0ZXJuMigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9yZWNvcmQoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfc2FmZSgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9zY29wZWQoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfc3luYygpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9yZXNvbHZlcigpLCBleHBvcnRzMik7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaW5kZXguanMKdmFyIHJlcXVpcmVfdmlydHVhbF9mcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTsKICAgICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtW2tdOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwogICAgfSA6IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIG9bazJdID0gbVtrXTsKICAgIH0pOwogICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fc2V0TW9kdWxlRGVmYXVsdCB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIHYpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sICJkZWZhdWx0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTsKICAgIH0gOiBmdW5jdGlvbihvLCB2KSB7CiAgICAgIG9bImRlZmF1bHQiXSA9IHY7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2ltcG9ydFN0YXIgfHwgLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24obzIpIHsKICAgICAgICAgIHZhciBhciA9IFtdOwogICAgICAgICAgZm9yICh2YXIgayBpbiBvMikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMiwgaykpIGFyW2FyLmxlbmd0aF0gPSBrOwogICAgICAgICAgcmV0dXJuIGFyOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIG93bktleXMobyk7CiAgICAgIH07CiAgICAgIHJldHVybiBmdW5jdGlvbihtb2QpIHsKICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICAgIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09ICJkZWZhdWx0IikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTsKICAgICAgICB9CiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfSgpOwogICAgdmFyIF9fZXhwb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXhwb3J0U3RhciB8fCBmdW5jdGlvbihtLCBleHBvcnRzMykgewogICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzMywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzMywgbSwgcCk7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi52aXJ0dWFsRnMgPSB2b2lkIDA7CiAgICB2YXIgdmlydHVhbEZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfaG9zdCgpKTsKICAgIGV4cG9ydHMyLnZpcnR1YWxGcyA9IHZpcnR1YWxGczsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3BhdGgoKSwgZXhwb3J0czIpOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvaG9zdC5qcwp2YXIgcmVxdWlyZV9ob3N0MiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvaG9zdC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY3JlYXRlV29ya3NwYWNlSG9zdCA9IGNyZWF0ZVdvcmtzcGFjZUhvc3Q7CiAgICB2YXIgcnhqc18xID0gcmVxdWlyZV9janMoKTsKICAgIHZhciB2aXJ0dWFsX2ZzXzEgPSByZXF1aXJlX3ZpcnR1YWxfZnMoKTsKICAgIGZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZUhvc3QoaG9zdCkgewogICAgICBjb25zdCB3b3Jrc3BhY2VIb3N0ID0gewogICAgICAgIGFzeW5jIHJlYWRGaWxlKHBhdGgpIHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCAoMCwgcnhqc18xLmxhc3RWYWx1ZUZyb20pKGhvc3QucmVhZCgoMCwgdmlydHVhbF9mc18xLm5vcm1hbGl6ZSkocGF0aCkpKTsKICAgICAgICAgIHJldHVybiB2aXJ0dWFsX2ZzXzEudmlydHVhbEZzLmZpbGVCdWZmZXJUb1N0cmluZyhkYXRhKTsKICAgICAgICB9LAogICAgICAgIGFzeW5jIHdyaXRlRmlsZShwYXRoLCBkYXRhKSB7CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5sYXN0VmFsdWVGcm9tKShob3N0LndyaXRlKCgwLCB2aXJ0dWFsX2ZzXzEubm9ybWFsaXplKShwYXRoKSwgdmlydHVhbF9mc18xLnZpcnR1YWxGcy5zdHJpbmdUb0ZpbGVCdWZmZXIoZGF0YSkpKTsKICAgICAgICB9LAogICAgICAgIGFzeW5jIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBhd2FpdCAoMCwgcnhqc18xLmxhc3RWYWx1ZUZyb20pKGhvc3QuaXNEaXJlY3RvcnkoKDAsIHZpcnR1YWxfZnNfMS5ub3JtYWxpemUpKHBhdGgpKSk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgYXN5bmMgaXNGaWxlKHBhdGgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBhd2FpdCAoMCwgcnhqc18xLmxhc3RWYWx1ZUZyb20pKGhvc3QuaXNGaWxlKCgwLCB2aXJ0dWFsX2ZzXzEubm9ybWFsaXplKShwYXRoKSkpOwogICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiB3b3Jrc3BhY2VIb3N0OwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9qc29uYy1wYXJzZXItcGF0Y2gtZDIwZjY3MTgzNi00NWQxYWU2MjM2LnppcC9ub2RlX21vZHVsZXMvanNvbmMtcGFyc2VyL2xpYi91bWQvaW1wbC9zY2FubmVyLmpzCnZhciByZXF1aXJlX3NjYW5uZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvanNvbmMtcGFyc2VyLXBhdGNoLWQyMGY2NzE4MzYtNDVkMWFlNjIzNi56aXAvbm9kZV9tb2R1bGVzL2pzb25jLXBhcnNlci9saWIvdW1kL2ltcGwvc2Nhbm5lci5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgIChmdW5jdGlvbihmYWN0b3J5KSB7CiAgICAgIGlmICh0eXBlb2YgbW9kdWxlMiA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZTIuZXhwb3J0cyA9PT0gIm9iamVjdCIpIHsKICAgICAgICB2YXIgdiA9IGZhY3RvcnkocmVxdWlyZSwgZXhwb3J0czIpOwogICAgICAgIGlmICh2ICE9PSB2b2lkIDApIG1vZHVsZTIuZXhwb3J0cyA9IHY7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgZGVmaW5lKFsicmVxdWlyZSIsICJleHBvcnRzIl0sIGZhY3RvcnkpOwogICAgICB9CiAgICB9KShmdW5jdGlvbihyZXF1aXJlMiwgZXhwb3J0czMpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgICAgZXhwb3J0czMuY3JlYXRlU2Nhbm5lciA9IHZvaWQgMDsKICAgICAgZnVuY3Rpb24gY3JlYXRlU2Nhbm5lcih0ZXh0LCBpZ25vcmVUcml2aWEgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IGxlbiA9IHRleHQubGVuZ3RoOwogICAgICAgIGxldCBwb3MgPSAwLCB2YWx1ZSA9ICIiLCB0b2tlbk9mZnNldCA9IDAsIHRva2VuID0gMTYsIGxpbmVOdW1iZXIgPSAwLCBsaW5lU3RhcnRPZmZzZXQgPSAwLCB0b2tlbkxpbmVTdGFydE9mZnNldCA9IDAsIHByZXZUb2tlbkxpbmVTdGFydE9mZnNldCA9IDAsIHNjYW5FcnJvciA9IDA7CiAgICAgICAgZnVuY3Rpb24gc2NhbkhleERpZ2l0cyhjb3VudCwgZXhhY3QpIHsKICAgICAgICAgIGxldCBkaWdpdHMgPSAwOwogICAgICAgICAgbGV0IHZhbHVlMiA9IDA7CiAgICAgICAgICB3aGlsZSAoZGlnaXRzIDwgY291bnQgfHwgIWV4YWN0KSB7CiAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgICBpZiAoY2ggPj0gNDggJiYgY2ggPD0gNTcpIHsKICAgICAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgKiAxNiArIGNoIC0gNDg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gNjUgJiYgY2ggPD0gNzApIHsKICAgICAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgKiAxNiArIGNoIC0gNjUgKyAxMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSA5NyAmJiBjaCA8PSAxMDIpIHsKICAgICAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgKiAxNiArIGNoIC0gOTcgKyAxMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgZGlnaXRzKys7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGlnaXRzIDwgY291bnQpIHsKICAgICAgICAgICAgdmFsdWUyID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdmFsdWUyOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzZXRQb3NpdGlvbihuZXdQb3NpdGlvbikgewogICAgICAgICAgcG9zID0gbmV3UG9zaXRpb247CiAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgdG9rZW5PZmZzZXQgPSAwOwogICAgICAgICAgdG9rZW4gPSAxNjsKICAgICAgICAgIHNjYW5FcnJvciA9IDA7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNjYW5OdW1iZXIoKSB7CiAgICAgICAgICBsZXQgc3RhcnQgPSBwb3M7CiAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDQ4KSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHdoaWxlIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiBpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDQ2KSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgaXNEaWdpdCh0ZXh0LmNoYXJDb2RlQXQocG9zKSkpIHsKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgdGV4dC5sZW5ndGggJiYgaXNEaWdpdCh0ZXh0LmNoYXJDb2RlQXQocG9zKSkpIHsKICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzY2FuRXJyb3IgPSAzOwogICAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGV0IGVuZCA9IHBvczsKICAgICAgICAgIGlmIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiAodGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDY5IHx8IHRleHQuY2hhckNvZGVBdChwb3MpID09PSAxMDEpKSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDQzIHx8IHRleHQuY2hhckNvZGVBdChwb3MpID09PSA0NSkgewogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiBpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIHdoaWxlIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiBpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVuZCA9IHBvczsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzY2FuRXJyb3IgPSAzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNjYW5TdHJpbmcoKSB7CiAgICAgICAgICBsZXQgcmVzdWx0ID0gIiIsIHN0YXJ0ID0gcG9zOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaWYgKHBvcyA+PSBsZW4pIHsKICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICAgICAgICAgICAgc2NhbkVycm9yID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgICBpZiAoY2ggPT09IDM0KSB7CiAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOwogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaCA9PT0gOTIpIHsKICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgaWYgKHBvcyA+PSBsZW4pIHsKICAgICAgICAgICAgICAgIHNjYW5FcnJvciA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgY2gyID0gdGV4dC5jaGFyQ29kZUF0KHBvcysrKTsKICAgICAgICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICciJzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlxcIjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIi8iOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTg6CiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXGIiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTAyOgogICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlxmIjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDExMDoKICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJcbiI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMTQ6CiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXHIiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTE2OgogICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIgkiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTE3OgogICAgICAgICAgICAgICAgICBjb25zdCBjaDMgPSBzY2FuSGV4RGlnaXRzKDQsIHRydWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2gzID49IDApIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaDMpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjYW5FcnJvciA9IDQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBzY2FuRXJyb3IgPSA1OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydCA9IHBvczsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPj0gMCAmJiBjaCA8PSAzMSkgewogICAgICAgICAgICAgIGlmIChpc0xpbmVCcmVhayhjaCkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgICAgICAgICAgICAgIHNjYW5FcnJvciA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2NhbkVycm9yID0gNjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzY2FuTmV4dCgpIHsKICAgICAgICAgIHZhbHVlID0gIiI7CiAgICAgICAgICBzY2FuRXJyb3IgPSAwOwogICAgICAgICAgdG9rZW5PZmZzZXQgPSBwb3M7CiAgICAgICAgICBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lTnVtYmVyOwogICAgICAgICAgcHJldlRva2VuTGluZVN0YXJ0T2Zmc2V0ID0gdG9rZW5MaW5lU3RhcnRPZmZzZXQ7CiAgICAgICAgICBpZiAocG9zID49IGxlbikgewogICAgICAgICAgICB0b2tlbk9mZnNldCA9IGxlbjsKICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTc7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgY29kZSA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgaWYgKGlzV2hpdGVTcGFjZShjb2RlKSkgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgICBjb2RlID0gdGV4dC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgIH0gd2hpbGUgKGlzV2hpdGVTcGFjZShjb2RlKSk7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDE1OwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTGluZUJyZWFrKGNvZGUpKSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICB2YWx1ZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpOwogICAgICAgICAgICBpZiAoY29kZSA9PT0gMTMgJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDEwKSB7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgdmFsdWUgKz0gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaW5lTnVtYmVyKys7CiAgICAgICAgICAgIHRva2VuTGluZVN0YXJ0T2Zmc2V0ID0gcG9zOwogICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNDsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICAvLyB0b2tlbnM6IFtde306LAogICAgICAgICAgICBjYXNlIDEyMzoKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxOwogICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAyOwogICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDM7CiAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gNDsKICAgICAgICAgICAgY2FzZSA1ODoKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSA2OwogICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDU7CiAgICAgICAgICAgIC8vIHN0cmluZ3MKICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICB2YWx1ZSA9IHNjYW5TdHJpbmcoKTsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxMDsKICAgICAgICAgICAgLy8gY29tbWVudHMKICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHBvcyAtIDE7CiAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gNDcpIHsKICAgICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbikgewogICAgICAgICAgICAgICAgICBpZiAoaXNMaW5lQnJlYWsodGV4dC5jaGFyQ29kZUF0KHBvcykpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQocG9zICsgMSkgPT09IDQyKSB7CiAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVMZW5ndGggPSBsZW4gLSAxOwogICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRDbG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBzYWZlTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gdGV4dC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gNDIgJiYgdGV4dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSA0NykgewogICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRDbG9zZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgICAgICBpZiAoaXNMaW5lQnJlYWsoY2gpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAxMyAmJiB0ZXh0LmNoYXJDb2RlQXQocG9zKSA9PT0gMTApIHsKICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyKys7CiAgICAgICAgICAgICAgICAgICAgdG9rZW5MaW5lU3RhcnRPZmZzZXQgPSBwb3M7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tbWVudENsb3NlZCkgewogICAgICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICAgICAgc2NhbkVycm9yID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxMzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNjsKICAgICAgICAgICAgLy8gbnVtYmVycwogICAgICAgICAgICBjYXNlIDQ1OgogICAgICAgICAgICAgIHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgaWYgKHBvcyA9PT0gbGVuIHx8ICFpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmb3VuZCBhIG1pbnVzLCBmb2xsb3dlZCBieSBhIG51bWJlciBzbwogICAgICAgICAgICAvLyB3ZSBmYWxsIHRocm91Z2ggdG8gcHJvY2VlZCB3aXRoIHNjYW5uaW5nCiAgICAgICAgICAgIC8vIG51bWJlcnMKICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgY2FzZSA1NDoKICAgICAgICAgICAgY2FzZSA1NToKICAgICAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgY2FzZSA1NzoKICAgICAgICAgICAgICB2YWx1ZSArPSBzY2FuTnVtYmVyKCk7CiAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTE7CiAgICAgICAgICAgIC8vIGxpdGVyYWxzIGFuZCB1bmtub3duIHN5bWJvbHMKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGVuICYmIGlzVW5rbm93bkNvbnRlbnRDaGFyYWN0ZXIoY29kZSkpIHsKICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgICAgY29kZSA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodG9rZW5PZmZzZXQgIT09IHBvcykgewogICAgICAgICAgICAgICAgdmFsdWUgPSB0ZXh0LnN1YnN0cmluZyh0b2tlbk9mZnNldCwgcG9zKTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAidHJ1ZSI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gODsKICAgICAgICAgICAgICAgICAgY2FzZSAiZmFsc2UiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDk7CiAgICAgICAgICAgICAgICAgIGNhc2UgIm51bGwiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duQ29udGVudENoYXJhY3Rlcihjb2RlKSB7CiAgICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGlzTGluZUJyZWFrKGNvZGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgY2FzZSA5MzoKICAgICAgICAgICAgY2FzZSAxMjM6CiAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgIGNhc2UgNTg6CiAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNjYW5OZXh0Tm9uVHJpdmlhKCkgewogICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgcmVzdWx0ID0gc2Nhbk5leHQoKTsKICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCA+PSAxMiAmJiByZXN1bHQgPD0gMTUpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNldFBvc2l0aW9uLAogICAgICAgICAgZ2V0UG9zaXRpb246ICgpID0+IHBvcywKICAgICAgICAgIHNjYW46IGlnbm9yZVRyaXZpYSA/IHNjYW5OZXh0Tm9uVHJpdmlhIDogc2Nhbk5leHQsCiAgICAgICAgICBnZXRUb2tlbjogKCkgPT4gdG9rZW4sCiAgICAgICAgICBnZXRUb2tlblZhbHVlOiAoKSA9PiB2YWx1ZSwKICAgICAgICAgIGdldFRva2VuT2Zmc2V0OiAoKSA9PiB0b2tlbk9mZnNldCwKICAgICAgICAgIGdldFRva2VuTGVuZ3RoOiAoKSA9PiBwb3MgLSB0b2tlbk9mZnNldCwKICAgICAgICAgIGdldFRva2VuU3RhcnRMaW5lOiAoKSA9PiBsaW5lU3RhcnRPZmZzZXQsCiAgICAgICAgICBnZXRUb2tlblN0YXJ0Q2hhcmFjdGVyOiAoKSA9PiB0b2tlbk9mZnNldCAtIHByZXZUb2tlbkxpbmVTdGFydE9mZnNldCwKICAgICAgICAgIGdldFRva2VuRXJyb3I6ICgpID0+IHNjYW5FcnJvcgogICAgICAgIH07CiAgICAgIH0KICAgICAgZXhwb3J0czMuY3JlYXRlU2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXI7CiAgICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkgewogICAgICAgIHJldHVybiBjaCA9PT0gMzIgfHwgY2ggPT09IDk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaXNMaW5lQnJlYWsoY2gpIHsKICAgICAgICByZXR1cm4gY2ggPT09IDEwIHx8IGNoID09PSAxMzsKICAgICAgfQogICAgICBmdW5jdGlvbiBpc0RpZ2l0KGNoKSB7CiAgICAgICAgcmV0dXJuIGNoID49IDQ4ICYmIGNoIDw9IDU3OwogICAgICB9CiAgICAgIHZhciBDaGFyYWN0ZXJDb2RlczsKICAgICAgKGZ1bmN0aW9uKENoYXJhY3RlckNvZGVzMikgewogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImxpbmVGZWVkIl0gPSAxMF0gPSAibGluZUZlZWQiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImNhcnJpYWdlUmV0dXJuIl0gPSAxM10gPSAiY2FycmlhZ2VSZXR1cm4iOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInNwYWNlIl0gPSAzMl0gPSAic3BhY2UiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl8wIl0gPSA0OF0gPSAiXzAiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl8xIl0gPSA0OV0gPSAiXzEiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl8yIl0gPSA1MF0gPSAiXzIiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl8zIl0gPSA1MV0gPSAiXzMiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl80Il0gPSA1Ml0gPSAiXzQiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl81Il0gPSA1M10gPSAiXzUiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl82Il0gPSA1NF0gPSAiXzYiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl83Il0gPSA1NV0gPSAiXzciOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl84Il0gPSA1Nl0gPSAiXzgiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIl85Il0gPSA1N10gPSAiXzkiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImEiXSA9IDk3XSA9ICJhIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJiIl0gPSA5OF0gPSAiYiI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiYyJdID0gOTldID0gImMiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImQiXSA9IDEwMF0gPSAiZCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiZSJdID0gMTAxXSA9ICJlIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJmIl0gPSAxMDJdID0gImYiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImciXSA9IDEwM10gPSAiZyI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiaCJdID0gMTA0XSA9ICJoIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJpIl0gPSAxMDVdID0gImkiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImoiXSA9IDEwNl0gPSAiaiI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiayJdID0gMTA3XSA9ICJrIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJsIl0gPSAxMDhdID0gImwiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIm0iXSA9IDEwOV0gPSAibSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsibiJdID0gMTEwXSA9ICJuIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJvIl0gPSAxMTFdID0gIm8iOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInAiXSA9IDExMl0gPSAicCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsicSJdID0gMTEzXSA9ICJxIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJyIl0gPSAxMTRdID0gInIiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInMiXSA9IDExNV0gPSAicyI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsidCJdID0gMTE2XSA9ICJ0IjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJ1Il0gPSAxMTddID0gInUiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInYiXSA9IDExOF0gPSAidiI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsidyJdID0gMTE5XSA9ICJ3IjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJ4Il0gPSAxMjBdID0gIngiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInkiXSA9IDEyMV0gPSAieSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsieiJdID0gMTIyXSA9ICJ6IjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJBIl0gPSA2NV0gPSAiQSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiQiJdID0gNjZdID0gIkIiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIkMiXSA9IDY3XSA9ICJDIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJEIl0gPSA2OF0gPSAiRCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiRSJdID0gNjldID0gIkUiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIkYiXSA9IDcwXSA9ICJGIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJHIl0gPSA3MV0gPSAiRyI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiSCJdID0gNzJdID0gIkgiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIkkiXSA9IDczXSA9ICJJIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJKIl0gPSA3NF0gPSAiSiI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiSyJdID0gNzVdID0gIksiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIkwiXSA9IDc2XSA9ICJMIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJNIl0gPSA3N10gPSAiTSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiTiJdID0gNzhdID0gIk4iOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIk8iXSA9IDc5XSA9ICJPIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJQIl0gPSA4MF0gPSAiUCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiUSJdID0gODFdID0gIlEiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIlIiXSA9IDgyXSA9ICJSIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJTIl0gPSA4M10gPSAiUyI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiVCJdID0gODRdID0gIlQiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIlUiXSA9IDg1XSA9ICJVIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJWIl0gPSA4Nl0gPSAiViI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiVyJdID0gODddID0gIlciOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbIlgiXSA9IDg4XSA9ICJYIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJZIl0gPSA4OV0gPSAiWSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiWiJdID0gOTBdID0gIloiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImFzdGVyaXNrIl0gPSA0Ml0gPSAiYXN0ZXJpc2siOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImJhY2tzbGFzaCJdID0gOTJdID0gImJhY2tzbGFzaCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiY2xvc2VCcmFjZSJdID0gMTI1XSA9ICJjbG9zZUJyYWNlIjsKICAgICAgICBDaGFyYWN0ZXJDb2RlczJbQ2hhcmFjdGVyQ29kZXMyWyJjbG9zZUJyYWNrZXQiXSA9IDkzXSA9ICJjbG9zZUJyYWNrZXQiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImNvbG9uIl0gPSA1OF0gPSAiY29sb24iOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImNvbW1hIl0gPSA0NF0gPSAiY29tbWEiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImRvdCJdID0gNDZdID0gImRvdCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsiZG91YmxlUXVvdGUiXSA9IDM0XSA9ICJkb3VibGVRdW90ZSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsibWludXMiXSA9IDQ1XSA9ICJtaW51cyI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsib3BlbkJyYWNlIl0gPSAxMjNdID0gIm9wZW5CcmFjZSI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsib3BlbkJyYWNrZXQiXSA9IDkxXSA9ICJvcGVuQnJhY2tldCI7CiAgICAgICAgQ2hhcmFjdGVyQ29kZXMyW0NoYXJhY3RlckNvZGVzMlsicGx1cyJdID0gNDNdID0gInBsdXMiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInNsYXNoIl0gPSA0N10gPSAic2xhc2giOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbImZvcm1GZWVkIl0gPSAxMl0gPSAiZm9ybUZlZWQiOwogICAgICAgIENoYXJhY3RlckNvZGVzMltDaGFyYWN0ZXJDb2RlczJbInRhYiJdID0gOV0gPSAidGFiIjsKICAgICAgfSkoQ2hhcmFjdGVyQ29kZXMgfHwgKENoYXJhY3RlckNvZGVzID0ge30pKTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9qc29uYy1wYXJzZXItcGF0Y2gtZDIwZjY3MTgzNi00NWQxYWU2MjM2LnppcC9ub2RlX21vZHVsZXMvanNvbmMtcGFyc2VyL2xpYi91bWQvaW1wbC9zdHJpbmctaW50ZXJuLmpzCnZhciByZXF1aXJlX3N0cmluZ19pbnRlcm4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvanNvbmMtcGFyc2VyLXBhdGNoLWQyMGY2NzE4MzYtNDVkMWFlNjIzNi56aXAvbm9kZV9tb2R1bGVzL2pzb25jLXBhcnNlci9saWIvdW1kL2ltcGwvc3RyaW5nLWludGVybi5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgIChmdW5jdGlvbihmYWN0b3J5KSB7CiAgICAgIGlmICh0eXBlb2YgbW9kdWxlMiA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZTIuZXhwb3J0cyA9PT0gIm9iamVjdCIpIHsKICAgICAgICB2YXIgdiA9IGZhY3RvcnkocmVxdWlyZSwgZXhwb3J0czIpOwogICAgICAgIGlmICh2ICE9PSB2b2lkIDApIG1vZHVsZTIuZXhwb3J0cyA9IHY7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgZGVmaW5lKFsicmVxdWlyZSIsICJleHBvcnRzIl0sIGZhY3RvcnkpOwogICAgICB9CiAgICB9KShmdW5jdGlvbihyZXF1aXJlMiwgZXhwb3J0czMpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgICAgZXhwb3J0czMuc3VwcG9ydGVkRW9scyA9IGV4cG9ydHMzLmNhY2hlZEJyZWFrTGluZXNXaXRoU3BhY2VzID0gZXhwb3J0czMuY2FjaGVkU3BhY2VzID0gdm9pZCAwOwogICAgICBleHBvcnRzMy5jYWNoZWRTcGFjZXMgPSBuZXcgQXJyYXkoMjApLmZpbGwoMCkubWFwKChfLCBpbmRleCkgPT4gewogICAgICAgIHJldHVybiAiICIucmVwZWF0KGluZGV4KTsKICAgICAgfSk7CiAgICAgIGNvbnN0IG1heENhY2hlZFZhbHVlcyA9IDIwMDsKICAgICAgZXhwb3J0czMuY2FjaGVkQnJlYWtMaW5lc1dpdGhTcGFjZXMgPSB7CiAgICAgICAgIiAiOiB7CiAgICAgICAgICAiXG4iOiBuZXcgQXJyYXkobWF4Q2FjaGVkVmFsdWVzKS5maWxsKDApLm1hcCgoXywgaW5kZXgpID0+IHsKICAgICAgICAgICAgcmV0dXJuICJcbiIgKyAiICIucmVwZWF0KGluZGV4KTsKICAgICAgICAgIH0pLAogICAgICAgICAgIlxyIjogbmV3IEFycmF5KG1heENhY2hlZFZhbHVlcykuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiB7CiAgICAgICAgICAgIHJldHVybiAiXHIiICsgIiAiLnJlcGVhdChpbmRleCk7CiAgICAgICAgICB9KSwKICAgICAgICAgICJcclxuIjogbmV3IEFycmF5KG1heENhY2hlZFZhbHVlcykuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiIgKyAiICIucmVwZWF0KGluZGV4KTsKICAgICAgICAgIH0pCiAgICAgICAgfSwKICAgICAgICAiCSI6IHsKICAgICAgICAgICJcbiI6IG5ldyBBcnJheShtYXhDYWNoZWRWYWx1ZXMpLmZpbGwoMCkubWFwKChfLCBpbmRleCkgPT4gewogICAgICAgICAgICByZXR1cm4gIlxuIiArICIJIi5yZXBlYXQoaW5kZXgpOwogICAgICAgICAgfSksCiAgICAgICAgICAiXHIiOiBuZXcgQXJyYXkobWF4Q2FjaGVkVmFsdWVzKS5maWxsKDApLm1hcCgoXywgaW5kZXgpID0+IHsKICAgICAgICAgICAgcmV0dXJuICJcciIgKyAiCSIucmVwZWF0KGluZGV4KTsKICAgICAgICAgIH0pLAogICAgICAgICAgIlxyXG4iOiBuZXcgQXJyYXkobWF4Q2FjaGVkVmFsdWVzKS5maWxsKDApLm1hcCgoXywgaW5kZXgpID0+IHsKICAgICAgICAgICAgcmV0dXJuICJcclxuIiArICIJIi5yZXBlYXQoaW5kZXgpOwogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgIH07CiAgICAgIGV4cG9ydHMzLnN1cHBvcnRlZEVvbHMgPSBbIlxuIiwgIlxyIiwgIlxyXG4iXTsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9qc29uYy1wYXJzZXItcGF0Y2gtZDIwZjY3MTgzNi00NWQxYWU2MjM2LnppcC9ub2RlX21vZHVsZXMvanNvbmMtcGFyc2VyL2xpYi91bWQvaW1wbC9mb3JtYXQuanMKdmFyIHJlcXVpcmVfZm9ybWF0MyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9qc29uYy1wYXJzZXItcGF0Y2gtZDIwZjY3MTgzNi00NWQxYWU2MjM2LnppcC9ub2RlX21vZHVsZXMvanNvbmMtcGFyc2VyL2xpYi91bWQvaW1wbC9mb3JtYXQuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICB2YXIgc2Nhbm5lcl8xID0gcmVxdWlyZV9zY2FubmVyKCk7CiAgICB2YXIgc3RyaW5nX2ludGVybl8xID0gcmVxdWlyZV9zdHJpbmdfaW50ZXJuKCk7CiAgICAoZnVuY3Rpb24oZmFjdG9yeSkgewogICAgICBpZiAodHlwZW9mIG1vZHVsZTIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUyLmV4cG9ydHMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgdmFyIHYgPSBmYWN0b3J5KHJlcXVpcmUsIGV4cG9ydHMyKTsKICAgICAgICBpZiAodiAhPT0gdm9pZCAwKSBtb2R1bGUyLmV4cG9ydHMgPSB2OwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbInJlcXVpcmUiLCAiZXhwb3J0cyIsICIuL3NjYW5uZXIiLCAiLi9zdHJpbmctaW50ZXJuIl0sIGZhY3RvcnkpOwogICAgICB9CiAgICB9KShmdW5jdGlvbihyZXF1aXJlMiwgZXhwb3J0czMpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgICAgZXhwb3J0czMuaXNFT0wgPSBleHBvcnRzMy5mb3JtYXQgPSB2b2lkIDA7CiAgICAgIGZ1bmN0aW9uIGZvcm1hdChkb2N1bWVudFRleHQsIHJhbmdlLCBvcHRpb25zKSB7CiAgICAgICAgbGV0IGluaXRpYWxJbmRlbnRMZXZlbDsKICAgICAgICBsZXQgZm9ybWF0VGV4dDsKICAgICAgICBsZXQgZm9ybWF0VGV4dFN0YXJ0OwogICAgICAgIGxldCByYW5nZVN0YXJ0OwogICAgICAgIGxldCByYW5nZUVuZDsKICAgICAgICBpZiAocmFuZ2UpIHsKICAgICAgICAgIHJhbmdlU3RhcnQgPSByYW5nZS5vZmZzZXQ7CiAgICAgICAgICByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZS5sZW5ndGg7CiAgICAgICAgICBmb3JtYXRUZXh0U3RhcnQgPSByYW5nZVN0YXJ0OwogICAgICAgICAgd2hpbGUgKGZvcm1hdFRleHRTdGFydCA+IDAgJiYgIWlzRU9MKGRvY3VtZW50VGV4dCwgZm9ybWF0VGV4dFN0YXJ0IC0gMSkpIHsKICAgICAgICAgICAgZm9ybWF0VGV4dFN0YXJ0LS07CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gcmFuZ2VFbmQ7CiAgICAgICAgICB3aGlsZSAoZW5kT2Zmc2V0IDwgZG9jdW1lbnRUZXh0Lmxlbmd0aCAmJiAhaXNFT0woZG9jdW1lbnRUZXh0LCBlbmRPZmZzZXQpKSB7CiAgICAgICAgICAgIGVuZE9mZnNldCsrOwogICAgICAgICAgfQogICAgICAgICAgZm9ybWF0VGV4dCA9IGRvY3VtZW50VGV4dC5zdWJzdHJpbmcoZm9ybWF0VGV4dFN0YXJ0LCBlbmRPZmZzZXQpOwogICAgICAgICAgaW5pdGlhbEluZGVudExldmVsID0gY29tcHV0ZUluZGVudExldmVsKGZvcm1hdFRleHQsIG9wdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3JtYXRUZXh0ID0gZG9jdW1lbnRUZXh0OwogICAgICAgICAgaW5pdGlhbEluZGVudExldmVsID0gMDsKICAgICAgICAgIGZvcm1hdFRleHRTdGFydCA9IDA7CiAgICAgICAgICByYW5nZVN0YXJ0ID0gMDsKICAgICAgICAgIHJhbmdlRW5kID0gZG9jdW1lbnRUZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc3QgZW9sID0gZ2V0RU9MKG9wdGlvbnMsIGRvY3VtZW50VGV4dCk7CiAgICAgICAgY29uc3QgZW9sRmFzdFBhdGhTdXBwb3J0ZWQgPSBzdHJpbmdfaW50ZXJuXzEuc3VwcG9ydGVkRW9scy5pbmNsdWRlcyhlb2wpOwogICAgICAgIGxldCBudW1iZXJMaW5lQnJlYWtzID0gMDsKICAgICAgICBsZXQgaW5kZW50TGV2ZWwgPSAwOwogICAgICAgIGxldCBpbmRlbnRWYWx1ZTsKICAgICAgICBpZiAob3B0aW9ucy5pbnNlcnRTcGFjZXMpIHsKICAgICAgICAgIGluZGVudFZhbHVlID0gc3RyaW5nX2ludGVybl8xLmNhY2hlZFNwYWNlc1tvcHRpb25zLnRhYlNpemUgfHwgNF0gPz8gcmVwZWF0KHN0cmluZ19pbnRlcm5fMS5jYWNoZWRTcGFjZXNbMV0sIG9wdGlvbnMudGFiU2l6ZSB8fCA0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kZW50VmFsdWUgPSAiCSI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGluZGVudFR5cGUgPSBpbmRlbnRWYWx1ZSA9PT0gIgkiID8gIgkiIDogIiAiOwogICAgICAgIGxldCBzY2FubmVyID0gKDAsIHNjYW5uZXJfMS5jcmVhdGVTY2FubmVyKShmb3JtYXRUZXh0LCBmYWxzZSk7CiAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgZnVuY3Rpb24gbmV3TGluZXNBbmRJbmRlbnQoKSB7CiAgICAgICAgICBpZiAobnVtYmVyTGluZUJyZWFrcyA+IDEpIHsKICAgICAgICAgICAgcmV0dXJuIHJlcGVhdChlb2wsIG51bWJlckxpbmVCcmVha3MpICsgcmVwZWF0KGluZGVudFZhbHVlLCBpbml0aWFsSW5kZW50TGV2ZWwgKyBpbmRlbnRMZXZlbCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBhbW91bnRPZlNwYWNlcyA9IGluZGVudFZhbHVlLmxlbmd0aCAqIChpbml0aWFsSW5kZW50TGV2ZWwgKyBpbmRlbnRMZXZlbCk7CiAgICAgICAgICBpZiAoIWVvbEZhc3RQYXRoU3VwcG9ydGVkIHx8IGFtb3VudE9mU3BhY2VzID4gc3RyaW5nX2ludGVybl8xLmNhY2hlZEJyZWFrTGluZXNXaXRoU3BhY2VzW2luZGVudFR5cGVdW2VvbF0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBlb2wgKyByZXBlYXQoaW5kZW50VmFsdWUsIGluaXRpYWxJbmRlbnRMZXZlbCArIGluZGVudExldmVsKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhbW91bnRPZlNwYWNlcyA8PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBlb2w7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3RyaW5nX2ludGVybl8xLmNhY2hlZEJyZWFrTGluZXNXaXRoU3BhY2VzW2luZGVudFR5cGVdW2VvbF1bYW1vdW50T2ZTcGFjZXNdOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzY2FuTmV4dCgpIHsKICAgICAgICAgIGxldCB0b2tlbiA9IHNjYW5uZXIuc2NhbigpOwogICAgICAgICAgbnVtYmVyTGluZUJyZWFrcyA9IDA7CiAgICAgICAgICB3aGlsZSAodG9rZW4gPT09IDE1IHx8IHRva2VuID09PSAxNCkgewogICAgICAgICAgICBpZiAodG9rZW4gPT09IDE0ICYmIG9wdGlvbnMua2VlcExpbmVzKSB7CiAgICAgICAgICAgICAgbnVtYmVyTGluZUJyZWFrcyArPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAxNCkgewogICAgICAgICAgICAgIG51bWJlckxpbmVCcmVha3MgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRva2VuID0gc2Nhbm5lci5zY2FuKCk7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNFcnJvciA9IHRva2VuID09PSAxNiB8fCBzY2FubmVyLmdldFRva2VuRXJyb3IoKSAhPT0gMDsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CiAgICAgICAgY29uc3QgZWRpdE9wZXJhdGlvbnMgPSBbXTsKICAgICAgICBmdW5jdGlvbiBhZGRFZGl0KHRleHQsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpIHsKICAgICAgICAgIGlmICghaGFzRXJyb3IgJiYgKCFyYW5nZSB8fCBzdGFydE9mZnNldCA8IHJhbmdlRW5kICYmIGVuZE9mZnNldCA+IHJhbmdlU3RhcnQpICYmIGRvY3VtZW50VGV4dC5zdWJzdHJpbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCkgIT09IHRleHQpIHsKICAgICAgICAgICAgZWRpdE9wZXJhdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgb2Zmc2V0OiBzdGFydE9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGg6IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LAogICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBmaXJzdFRva2VuID0gc2Nhbk5leHQoKTsKICAgICAgICBpZiAob3B0aW9ucy5rZWVwTGluZXMgJiYgbnVtYmVyTGluZUJyZWFrcyA+IDApIHsKICAgICAgICAgIGFkZEVkaXQocmVwZWF0KGVvbCwgbnVtYmVyTGluZUJyZWFrcyksIDAsIDApOwogICAgICAgIH0KICAgICAgICBpZiAoZmlyc3RUb2tlbiAhPT0gMTcpIHsKICAgICAgICAgIGxldCBmaXJzdFRva2VuU3RhcnQgPSBzY2FubmVyLmdldFRva2VuT2Zmc2V0KCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgICBsZXQgaW5pdGlhbEluZGVudCA9IGluZGVudFZhbHVlLmxlbmd0aCAqIGluaXRpYWxJbmRlbnRMZXZlbCA8IDIwICYmIG9wdGlvbnMuaW5zZXJ0U3BhY2VzID8gc3RyaW5nX2ludGVybl8xLmNhY2hlZFNwYWNlc1tpbmRlbnRWYWx1ZS5sZW5ndGggKiBpbml0aWFsSW5kZW50TGV2ZWxdIDogcmVwZWF0KGluZGVudFZhbHVlLCBpbml0aWFsSW5kZW50TGV2ZWwpOwogICAgICAgICAgYWRkRWRpdChpbml0aWFsSW5kZW50LCBmb3JtYXRUZXh0U3RhcnQsIGZpcnN0VG9rZW5TdGFydCk7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChmaXJzdFRva2VuICE9PSAxNykgewogICAgICAgICAgbGV0IGZpcnN0VG9rZW5FbmQgPSBzY2FubmVyLmdldFRva2VuT2Zmc2V0KCkgKyBzY2FubmVyLmdldFRva2VuTGVuZ3RoKCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgICBsZXQgc2Vjb25kVG9rZW4gPSBzY2FuTmV4dCgpOwogICAgICAgICAgbGV0IHJlcGxhY2VDb250ZW50ID0gIiI7CiAgICAgICAgICBsZXQgbmVlZHNMaW5lQnJlYWsgPSBmYWxzZTsKICAgICAgICAgIHdoaWxlIChudW1iZXJMaW5lQnJlYWtzID09PSAwICYmIChzZWNvbmRUb2tlbiA9PT0gMTIgfHwgc2Vjb25kVG9rZW4gPT09IDEzKSkgewogICAgICAgICAgICBsZXQgY29tbWVudFRva2VuU3RhcnQgPSBzY2FubmVyLmdldFRva2VuT2Zmc2V0KCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgICAgIGFkZEVkaXQoCiAgICAgICAgICAgICAgc3RyaW5nX2ludGVybl8xLmNhY2hlZFNwYWNlc1sxXSwKICAgICAgICAgICAgICBmaXJzdFRva2VuRW5kLAogICAgICAgICAgICAgIGNvbW1lbnRUb2tlblN0YXJ0CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZpcnN0VG9rZW5FbmQgPSBzY2FubmVyLmdldFRva2VuT2Zmc2V0KCkgKyBzY2FubmVyLmdldFRva2VuTGVuZ3RoKCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgICAgIG5lZWRzTGluZUJyZWFrID0gc2Vjb25kVG9rZW4gPT09IDEyOwogICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5lZWRzTGluZUJyZWFrID8gbmV3TGluZXNBbmRJbmRlbnQoKSA6ICIiOwogICAgICAgICAgICBzZWNvbmRUb2tlbiA9IHNjYW5OZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2Vjb25kVG9rZW4gPT09IDIpIHsKICAgICAgICAgICAgaWYgKGZpcnN0VG9rZW4gIT09IDEpIHsKICAgICAgICAgICAgICBpbmRlbnRMZXZlbC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmtlZXBMaW5lcyAmJiBudW1iZXJMaW5lQnJlYWtzID4gMCB8fCAhb3B0aW9ucy5rZWVwTGluZXMgJiYgZmlyc3RUb2tlbiAhPT0gMSkgewogICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gbmV3TGluZXNBbmRJbmRlbnQoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtlZXBMaW5lcykgewogICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gc3RyaW5nX2ludGVybl8xLmNhY2hlZFNwYWNlc1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRUb2tlbiA9PT0gNCkgewogICAgICAgICAgICBpZiAoZmlyc3RUb2tlbiAhPT0gMykgewogICAgICAgICAgICAgIGluZGVudExldmVsLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMua2VlcExpbmVzICYmIG51bWJlckxpbmVCcmVha3MgPiAwIHx8ICFvcHRpb25zLmtlZXBMaW5lcyAmJiBmaXJzdFRva2VuICE9PSAzKSB7CiAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lc0FuZEluZGVudCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua2VlcExpbmVzKSB7CiAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBzdHJpbmdfaW50ZXJuXzEuY2FjaGVkU3BhY2VzWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzd2l0Y2ggKGZpcnN0VG9rZW4pIHsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgaW5kZW50TGV2ZWwrKzsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmtlZXBMaW5lcyAmJiBudW1iZXJMaW5lQnJlYWtzID4gMCB8fCAhb3B0aW9ucy5rZWVwTGluZXMpIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lc0FuZEluZGVudCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBzdHJpbmdfaW50ZXJuXzEuY2FjaGVkU3BhY2VzWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMua2VlcExpbmVzICYmIG51bWJlckxpbmVCcmVha3MgPiAwIHx8ICFvcHRpb25zLmtlZXBMaW5lcykgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5ld0xpbmVzQW5kSW5kZW50KCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IHN0cmluZ19pbnRlcm5fMS5jYWNoZWRTcGFjZXNbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lc0FuZEluZGVudCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIGlmIChudW1iZXJMaW5lQnJlYWtzID4gMCkgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5ld0xpbmVzQW5kSW5kZW50KCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZWVkc0xpbmVCcmVhaykgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IHN0cmluZ19pbnRlcm5fMS5jYWNoZWRTcGFjZXNbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwTGluZXMgJiYgbnVtYmVyTGluZUJyZWFrcyA+IDApIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lc0FuZEluZGVudCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmVlZHNMaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBzdHJpbmdfaW50ZXJuXzEuY2FjaGVkU3BhY2VzWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmtlZXBMaW5lcyAmJiBudW1iZXJMaW5lQnJlYWtzID4gMCkgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5ld0xpbmVzQW5kSW5kZW50KCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZFRva2VuID09PSA2ICYmICFuZWVkc0xpbmVCcmVhaykgewogICAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMua2VlcExpbmVzICYmIG51bWJlckxpbmVCcmVha3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gbmV3TGluZXNBbmRJbmRlbnQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmICgoc2Vjb25kVG9rZW4gPT09IDEyIHx8IHNlY29uZFRva2VuID09PSAxMykgJiYgIW5lZWRzTGluZUJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBzdHJpbmdfaW50ZXJuXzEuY2FjaGVkU3BhY2VzWzFdOwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZFRva2VuICE9PSA1ICYmIHNlY29uZFRva2VuICE9PSAxNykgewogICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChudW1iZXJMaW5lQnJlYWtzID4gMCAmJiAoc2Vjb25kVG9rZW4gPT09IDEyIHx8IHNlY29uZFRva2VuID09PSAxMykpIHsKICAgICAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5ld0xpbmVzQW5kSW5kZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzZWNvbmRUb2tlbiA9PT0gMTcpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMua2VlcExpbmVzICYmIG51bWJlckxpbmVCcmVha3MgPiAwKSB7CiAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lc0FuZEluZGVudCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gb3B0aW9ucy5pbnNlcnRGaW5hbE5ld2xpbmUgPyBlb2wgOiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc2Vjb25kVG9rZW5TdGFydCA9IHNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKSArIGZvcm1hdFRleHRTdGFydDsKICAgICAgICAgIGFkZEVkaXQocmVwbGFjZUNvbnRlbnQsIGZpcnN0VG9rZW5FbmQsIHNlY29uZFRva2VuU3RhcnQpOwogICAgICAgICAgZmlyc3RUb2tlbiA9IHNlY29uZFRva2VuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZWRpdE9wZXJhdGlvbnM7CiAgICAgIH0KICAgICAgZXhwb3J0czMuZm9ybWF0ID0gZm9ybWF0OwogICAgICBmdW5jdGlvbiByZXBlYXQocywgY291bnQpIHsKICAgICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICByZXN1bHQgKz0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBmdW5jdGlvbiBjb21wdXRlSW5kZW50TGV2ZWwoY29udGVudCwgb3B0aW9ucykgewogICAgICAgIGxldCBpID0gMDsKICAgICAgICBsZXQgbkNoYXJzID0gMDsKICAgICAgICBjb25zdCB0YWJTaXplID0gb3B0aW9ucy50YWJTaXplIHx8IDQ7CiAgICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCkgewogICAgICAgICAgbGV0IGNoID0gY29udGVudC5jaGFyQXQoaSk7CiAgICAgICAgICBpZiAoY2ggPT09IHN0cmluZ19pbnRlcm5fMS5jYWNoZWRTcGFjZXNbMV0pIHsKICAgICAgICAgICAgbkNoYXJzKys7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAiCSIpIHsKICAgICAgICAgICAgbkNoYXJzICs9IHRhYlNpemU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobkNoYXJzIC8gdGFiU2l6ZSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2V0RU9MKG9wdGlvbnMsIHRleHQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNoID0gdGV4dC5jaGFyQXQoaSk7CiAgICAgICAgICBpZiAoY2ggPT09ICJcciIpIHsKICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAiXG4iKSB7CiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gIlxyIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICJcbiIpIHsKICAgICAgICAgICAgcmV0dXJuICJcbiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuZW9sIHx8ICJcbiI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaXNFT0wodGV4dCwgb2Zmc2V0KSB7CiAgICAgICAgcmV0dXJuICJcclxuIi5pbmRleE9mKHRleHQuY2hhckF0KG9mZnNldCkpICE9PSAtMTsKICAgICAgfQogICAgICBleHBvcnRzMy5pc0VPTCA9IGlzRU9MOwogICAgfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2pzb25jLXBhcnNlci1wYXRjaC1kMjBmNjcxODM2LTQ1ZDFhZTYyMzYuemlwL25vZGVfbW9kdWxlcy9qc29uYy1wYXJzZXIvbGliL3VtZC9pbXBsL3BhcnNlci5qcwp2YXIgcmVxdWlyZV9wYXJzZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvanNvbmMtcGFyc2VyLXBhdGNoLWQyMGY2NzE4MzYtNDVkMWFlNjIzNi56aXAvbm9kZV9tb2R1bGVzL2pzb25jLXBhcnNlci9saWIvdW1kL2ltcGwvcGFyc2VyLmpzIihleHBvcnRzMiwgbW9kdWxlMikgewogICAgdmFyIHNjYW5uZXJfMSA9IHJlcXVpcmVfc2Nhbm5lcigpOwogICAgKGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgICAgaWYgKHR5cGVvZiBtb2R1bGUyID09PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlMi5leHBvcnRzID09PSAib2JqZWN0IikgewogICAgICAgIHZhciB2ID0gZmFjdG9yeShyZXF1aXJlLCBleHBvcnRzMik7CiAgICAgICAgaWYgKHYgIT09IHZvaWQgMCkgbW9kdWxlMi5leHBvcnRzID0gdjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIHsKICAgICAgICBkZWZpbmUoWyJyZXF1aXJlIiwgImV4cG9ydHMiLCAiLi9zY2FubmVyIl0sIGZhY3RvcnkpOwogICAgICB9CiAgICB9KShmdW5jdGlvbihyZXF1aXJlMiwgZXhwb3J0czMpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgICAgZXhwb3J0czMuZ2V0Tm9kZVR5cGUgPSBleHBvcnRzMy5zdHJpcENvbW1lbnRzID0gZXhwb3J0czMudmlzaXQgPSBleHBvcnRzMy5maW5kTm9kZUF0T2Zmc2V0ID0gZXhwb3J0czMuY29udGFpbnMgPSBleHBvcnRzMy5nZXROb2RlVmFsdWUgPSBleHBvcnRzMy5nZXROb2RlUGF0aCA9IGV4cG9ydHMzLmZpbmROb2RlQXRMb2NhdGlvbiA9IGV4cG9ydHMzLnBhcnNlVHJlZSA9IGV4cG9ydHMzLnBhcnNlID0gZXhwb3J0czMuZ2V0TG9jYXRpb24gPSB2b2lkIDA7CiAgICAgIHZhciBQYXJzZU9wdGlvbnM7CiAgICAgIChmdW5jdGlvbihQYXJzZU9wdGlvbnMyKSB7CiAgICAgICAgUGFyc2VPcHRpb25zMi5ERUZBVUxUID0gewogICAgICAgICAgYWxsb3dUcmFpbGluZ0NvbW1hOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0pKFBhcnNlT3B0aW9ucyB8fCAoUGFyc2VPcHRpb25zID0ge30pKTsKICAgICAgZnVuY3Rpb24gZ2V0TG9jYXRpb24odGV4dCwgcG9zaXRpb24pIHsKICAgICAgICBjb25zdCBzZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGVhcmx5UmV0dXJuRXhjZXB0aW9uID0gbmV3IE9iamVjdCgpOwogICAgICAgIGxldCBwcmV2aW91c05vZGUgPSB2b2lkIDA7CiAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlSW5zdCA9IHsKICAgICAgICAgIHZhbHVlOiB7fSwKICAgICAgICAgIG9mZnNldDogMCwKICAgICAgICAgIGxlbmd0aDogMCwKICAgICAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICAgICAgcGFyZW50OiB2b2lkIDAKICAgICAgICB9OwogICAgICAgIGxldCBpc0F0UHJvcGVydHlLZXkgPSBmYWxzZTsKICAgICAgICBmdW5jdGlvbiBzZXRQcmV2aW91c05vZGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoLCB0eXBlKSB7CiAgICAgICAgICBwcmV2aW91c05vZGVJbnN0LnZhbHVlID0gdmFsdWU7CiAgICAgICAgICBwcmV2aW91c05vZGVJbnN0Lm9mZnNldCA9IG9mZnNldDsKICAgICAgICAgIHByZXZpb3VzTm9kZUluc3QubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgcHJldmlvdXNOb2RlSW5zdC50eXBlID0gdHlwZTsKICAgICAgICAgIHByZXZpb3VzTm9kZUluc3QuY29sb25PZmZzZXQgPSB2b2lkIDA7CiAgICAgICAgICBwcmV2aW91c05vZGUgPSBwcmV2aW91c05vZGVJbnN0OwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgdmlzaXQodGV4dCwgewogICAgICAgICAgICBvbk9iamVjdEJlZ2luOiAob2Zmc2V0LCBsZW5ndGgpID0+IHsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0gb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlYXJseVJldHVybkV4Y2VwdGlvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gdm9pZCAwOwogICAgICAgICAgICAgIGlzQXRQcm9wZXJ0eUtleSA9IHBvc2l0aW9uID4gb2Zmc2V0OwogICAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goIiIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbk9iamVjdFByb3BlcnR5OiAobmFtZSwgb2Zmc2V0LCBsZW5ndGgpID0+IHsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBvZmZzZXQpIHsKICAgICAgICAgICAgICAgIHRocm93IGVhcmx5UmV0dXJuRXhjZXB0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZXRQcmV2aW91c05vZGUobmFtZSwgb2Zmc2V0LCBsZW5ndGgsICJwcm9wZXJ0eSIpOwogICAgICAgICAgICAgIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdID0gbmFtZTsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0gb2Zmc2V0ICsgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlYXJseVJldHVybkV4Y2VwdGlvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uT2JqZWN0RW5kOiAob2Zmc2V0LCBsZW5ndGgpID0+IHsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0gb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlYXJseVJldHVybkV4Y2VwdGlvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gdm9pZCAwOwogICAgICAgICAgICAgIHNlZ21lbnRzLnBvcCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkFycmF5QmVnaW46IChvZmZzZXQsIGxlbmd0aCkgPT4gewogICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSBvZmZzZXQpIHsKICAgICAgICAgICAgICAgIHRocm93IGVhcmx5UmV0dXJuRXhjZXB0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSB2b2lkIDA7CiAgICAgICAgICAgICAgc2VnbWVudHMucHVzaCgwKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25BcnJheUVuZDogKG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IG9mZnNldCkgewogICAgICAgICAgICAgICAgdGhyb3cgZWFybHlSZXR1cm5FeGNlcHRpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IHZvaWQgMDsKICAgICAgICAgICAgICBzZWdtZW50cy5wb3AoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25MaXRlcmFsVmFsdWU6ICh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpID0+IHsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBvZmZzZXQpIHsKICAgICAgICAgICAgICAgIHRocm93IGVhcmx5UmV0dXJuRXhjZXB0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZXRQcmV2aW91c05vZGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoLCBnZXROb2RlVHlwZSh2YWx1ZSkpOwogICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSBvZmZzZXQgKyBsZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IGVhcmx5UmV0dXJuRXhjZXB0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25TZXBhcmF0b3I6IChzZXAsIG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IG9mZnNldCkgewogICAgICAgICAgICAgICAgdGhyb3cgZWFybHlSZXR1cm5FeGNlcHRpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZXAgPT09ICI6IiAmJiBwcmV2aW91c05vZGUgJiYgcHJldmlvdXNOb2RlLnR5cGUgPT09ICJwcm9wZXJ0eSIpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzTm9kZS5jb2xvbk9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgIGlzQXRQcm9wZXJ0eUtleSA9IGZhbHNlOwogICAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gdm9pZCAwOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VwID09PSAiLCIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gPSBsYXN0ICsgMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlzQXRQcm9wZXJ0eUtleSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSB2b2lkIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAoZSAhPT0gZWFybHlSZXR1cm5FeGNlcHRpb24pIHsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhdGg6IHNlZ21lbnRzLAogICAgICAgICAgcHJldmlvdXNOb2RlLAogICAgICAgICAgaXNBdFByb3BlcnR5S2V5LAogICAgICAgICAgbWF0Y2hlczogKHBhdHRlcm4pID0+IHsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgayA8IHBhdHRlcm4ubGVuZ3RoICYmIGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmIChwYXR0ZXJuW2tdID09PSBzZWdtZW50c1tpXSB8fCBwYXR0ZXJuW2tdID09PSAiKiIpIHsKICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm5ba10gIT09ICIqKiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGsgPT09IHBhdHRlcm4ubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgICAgZXhwb3J0czMuZ2V0TG9jYXRpb24gPSBnZXRMb2NhdGlvbjsKICAgICAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZXJyb3JzID0gW10sIG9wdGlvbnMgPSBQYXJzZU9wdGlvbnMuREVGQVVMVCkgewogICAgICAgIGxldCBjdXJyZW50UHJvcGVydHkgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50UGFyZW50ID0gW107CiAgICAgICAgY29uc3QgcHJldmlvdXNQYXJlbnRzID0gW107CiAgICAgICAgZnVuY3Rpb24gb25WYWx1ZSh2YWx1ZSkgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFBhcmVudCkpIHsKICAgICAgICAgICAgY3VycmVudFBhcmVudC5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3BlcnR5ICE9PSBudWxsKSB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnRbY3VycmVudFByb3BlcnR5XSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB2aXNpdG9yID0gewogICAgICAgICAgb25PYmplY3RCZWdpbjogKCkgPT4gewogICAgICAgICAgICBjb25zdCBvYmplY3QgPSB7fTsKICAgICAgICAgICAgb25WYWx1ZShvYmplY3QpOwogICAgICAgICAgICBwcmV2aW91c1BhcmVudHMucHVzaChjdXJyZW50UGFyZW50KTsKICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IG9iamVjdDsKICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gbnVsbDsKICAgICAgICAgIH0sCiAgICAgICAgICBvbk9iamVjdFByb3BlcnR5OiAobmFtZSkgPT4gewogICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSBuYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIG9uT2JqZWN0RW5kOiAoKSA9PiB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwcmV2aW91c1BhcmVudHMucG9wKCk7CiAgICAgICAgICB9LAogICAgICAgICAgb25BcnJheUJlZ2luOiAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgICAgICAgIG9uVmFsdWUoYXJyYXkpOwogICAgICAgICAgICBwcmV2aW91c1BhcmVudHMucHVzaChjdXJyZW50UGFyZW50KTsKICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IGFycmF5OwogICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSBudWxsOwogICAgICAgICAgfSwKICAgICAgICAgIG9uQXJyYXlFbmQ6ICgpID0+IHsKICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHByZXZpb3VzUGFyZW50cy5wb3AoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkxpdGVyYWxWYWx1ZTogb25WYWx1ZSwKICAgICAgICAgIG9uRXJyb3I6IChlcnJvciwgb2Zmc2V0LCBsZW5ndGgpID0+IHsKICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBlcnJvciwgb2Zmc2V0LCBsZW5ndGggfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2aXNpdCh0ZXh0LCB2aXNpdG9yLCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gY3VycmVudFBhcmVudFswXTsKICAgICAgfQogICAgICBleHBvcnRzMy5wYXJzZSA9IHBhcnNlOwogICAgICBmdW5jdGlvbiBwYXJzZVRyZWUodGV4dCwgZXJyb3JzID0gW10sIG9wdGlvbnMgPSBQYXJzZU9wdGlvbnMuREVGQVVMVCkgewogICAgICAgIGxldCBjdXJyZW50UGFyZW50ID0gewogICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgIG9mZnNldDogLTEsCiAgICAgICAgICBsZW5ndGg6IC0xLAogICAgICAgICAgY2hpbGRyZW46IFtdLAogICAgICAgICAgcGFyZW50OiB2b2lkIDAKICAgICAgICB9OwogICAgICAgIGZ1bmN0aW9uIGVuc3VyZVByb3BlcnR5Q29tcGxldGUoZW5kT2Zmc2V0KSB7CiAgICAgICAgICBpZiAoY3VycmVudFBhcmVudC50eXBlID09PSAicHJvcGVydHkiKSB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQubGVuZ3RoID0gZW5kT2Zmc2V0IC0gY3VycmVudFBhcmVudC5vZmZzZXQ7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50UGFyZW50LnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25WYWx1ZSh2YWx1ZU5vZGUpIHsKICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRyZW4ucHVzaCh2YWx1ZU5vZGUpOwogICAgICAgICAgcmV0dXJuIHZhbHVlTm9kZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmlzaXRvciA9IHsKICAgICAgICAgIG9uT2JqZWN0QmVnaW46IChvZmZzZXQpID0+IHsKICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IG9uVmFsdWUoewogICAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGg6IC0xLAogICAgICAgICAgICAgIHBhcmVudDogY3VycmVudFBhcmVudCwKICAgICAgICAgICAgICBjaGlsZHJlbjogW10KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgb25PYmplY3RQcm9wZXJ0eTogKG5hbWUsIG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBvblZhbHVlKHsKICAgICAgICAgICAgICB0eXBlOiAicHJvcGVydHkiLAogICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGg6IC0xLAogICAgICAgICAgICAgIHBhcmVudDogY3VycmVudFBhcmVudCwKICAgICAgICAgICAgICBjaGlsZHJlbjogW10KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICAgICAgdmFsdWU6IG5hbWUsCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgICAgICBwYXJlbnQ6IGN1cnJlbnRQYXJlbnQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgb25PYmplY3RFbmQ6IChvZmZzZXQsIGxlbmd0aCkgPT4gewogICAgICAgICAgICBlbnN1cmVQcm9wZXJ0eUNvbXBsZXRlKG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQubGVuZ3RoID0gb2Zmc2V0ICsgbGVuZ3RoIC0gY3VycmVudFBhcmVudC5vZmZzZXQ7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50UGFyZW50LnBhcmVudDsKICAgICAgICAgICAgZW5zdXJlUHJvcGVydHlDb21wbGV0ZShvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uQXJyYXlCZWdpbjogKG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBvblZhbHVlKHsKICAgICAgICAgICAgICB0eXBlOiAiYXJyYXkiLAogICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGg6IC0xLAogICAgICAgICAgICAgIHBhcmVudDogY3VycmVudFBhcmVudCwKICAgICAgICAgICAgICBjaGlsZHJlbjogW10KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgb25BcnJheUVuZDogKG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQubGVuZ3RoID0gb2Zmc2V0ICsgbGVuZ3RoIC0gY3VycmVudFBhcmVudC5vZmZzZXQ7CiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50UGFyZW50LnBhcmVudDsKICAgICAgICAgICAgZW5zdXJlUHJvcGVydHlDb21wbGV0ZShvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uTGl0ZXJhbFZhbHVlOiAodmFsdWUsIG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgIG9uVmFsdWUoewogICAgICAgICAgICAgIHR5cGU6IGdldE5vZGVUeXBlKHZhbHVlKSwKICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgbGVuZ3RoLAogICAgICAgICAgICAgIHBhcmVudDogY3VycmVudFBhcmVudCwKICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZW5zdXJlUHJvcGVydHlDb21wbGV0ZShvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uU2VwYXJhdG9yOiAoc2VwLCBvZmZzZXQsIGxlbmd0aCkgPT4gewogICAgICAgICAgICBpZiAoY3VycmVudFBhcmVudC50eXBlID09PSAicHJvcGVydHkiKSB7CiAgICAgICAgICAgICAgaWYgKHNlcCA9PT0gIjoiKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50LmNvbG9uT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VwID09PSAiLCIpIHsKICAgICAgICAgICAgICAgIGVuc3VyZVByb3BlcnR5Q29tcGxldGUob2Zmc2V0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBvbkVycm9yOiAoZXJyb3IsIG9mZnNldCwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgZXJyb3IsIG9mZnNldCwgbGVuZ3RoIH0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmlzaXQodGV4dCwgdmlzaXRvciwgb3B0aW9ucyk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gY3VycmVudFBhcmVudC5jaGlsZHJlblswXTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBkZWxldGUgcmVzdWx0LnBhcmVudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBleHBvcnRzMy5wYXJzZVRyZWUgPSBwYXJzZVRyZWU7CiAgICAgIGZ1bmN0aW9uIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBwYXRoKSB7CiAgICAgICAgaWYgKCFyb290KSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBsZXQgbm9kZSA9IHJvb3Q7CiAgICAgICAgZm9yIChsZXQgc2VnbWVudCBvZiBwYXRoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHNlZ21lbnQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgIT09ICJvYmplY3QiIHx8ICFBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5vZGUgb2Ygbm9kZS5jaGlsZHJlbikgewogICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5Tm9kZS5jaGlsZHJlbikgJiYgcHJvcGVydHlOb2RlLmNoaWxkcmVuWzBdLnZhbHVlID09PSBzZWdtZW50ICYmIHByb3BlcnR5Tm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgIG5vZGUgPSBwcm9wZXJ0eU5vZGUuY2hpbGRyZW5bMV07CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudDsKICAgICAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gImFycmF5IiB8fCBpbmRleCA8IDAgfHwgIUFycmF5LmlzQXJyYXkobm9kZS5jaGlsZHJlbikgfHwgaW5kZXggPj0gbm9kZS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuW2luZGV4XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgICAgZXhwb3J0czMuZmluZE5vZGVBdExvY2F0aW9uID0gZmluZE5vZGVBdExvY2F0aW9uOwogICAgICBmdW5jdGlvbiBnZXROb2RlUGF0aChub2RlKSB7CiAgICAgICAgaWYgKCFub2RlLnBhcmVudCB8fCAhbm9kZS5wYXJlbnQuY2hpbGRyZW4pIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGF0aCA9IGdldE5vZGVQYXRoKG5vZGUucGFyZW50KTsKICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZSA9PT0gInByb3BlcnR5IikgewogICAgICAgICAgY29uc3Qga2V5ID0gbm9kZS5wYXJlbnQuY2hpbGRyZW5bMF0udmFsdWU7CiAgICAgICAgICBwYXRoLnB1c2goa2V5KTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUucGFyZW50LnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gbm9kZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKTsKICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgcGF0aC5wdXNoKGluZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgICAgZXhwb3J0czMuZ2V0Tm9kZVBhdGggPSBnZXROb2RlUGF0aDsKICAgICAgZnVuY3Rpb24gZ2V0Tm9kZVZhbHVlKG5vZGUpIHsKICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoZ2V0Tm9kZVZhbHVlKTsKICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgIGNvbnN0IG9iaiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBmb3IgKGxldCBwcm9wIG9mIG5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSBwcm9wLmNoaWxkcmVuWzFdOwogICAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHsKICAgICAgICAgICAgICAgIG9ialtwcm9wLmNoaWxkcmVuWzBdLnZhbHVlXSA9IGdldE5vZGVWYWx1ZSh2YWx1ZU5vZGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgY2FzZSAibnVsbCI6CiAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV4cG9ydHMzLmdldE5vZGVWYWx1ZSA9IGdldE5vZGVWYWx1ZTsKICAgICAgZnVuY3Rpb24gY29udGFpbnMobm9kZSwgb2Zmc2V0LCBpbmNsdWRlUmlnaHRCb3VuZCA9IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIG9mZnNldCA+PSBub2RlLm9mZnNldCAmJiBvZmZzZXQgPCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoIHx8IGluY2x1ZGVSaWdodEJvdW5kICYmIG9mZnNldCA9PT0gbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aDsKICAgICAgfQogICAgICBleHBvcnRzMy5jb250YWlucyA9IGNvbnRhaW5zOwogICAgICBmdW5jdGlvbiBmaW5kTm9kZUF0T2Zmc2V0KG5vZGUsIG9mZnNldCwgaW5jbHVkZVJpZ2h0Qm91bmQgPSBmYWxzZSkgewogICAgICAgIGlmIChjb250YWlucyhub2RlLCBvZmZzZXQsIGluY2x1ZGVSaWdodEJvdW5kKSkgewogICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2ldLm9mZnNldCA8PSBvZmZzZXQ7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBmaW5kTm9kZUF0T2Zmc2V0KGNoaWxkcmVuW2ldLCBvZmZzZXQsIGluY2x1ZGVSaWdodEJvdW5kKTsKICAgICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgICBleHBvcnRzMy5maW5kTm9kZUF0T2Zmc2V0ID0gZmluZE5vZGVBdE9mZnNldDsKICAgICAgZnVuY3Rpb24gdmlzaXQodGV4dCwgdmlzaXRvciwgb3B0aW9ucyA9IFBhcnNlT3B0aW9ucy5ERUZBVUxUKSB7CiAgICAgICAgY29uc3QgX3NjYW5uZXIgPSAoMCwgc2Nhbm5lcl8xLmNyZWF0ZVNjYW5uZXIpKHRleHQsIGZhbHNlKTsKICAgICAgICBjb25zdCBfanNvblBhdGggPSBbXTsKICAgICAgICBsZXQgc3VwcHJlc3NlZENhbGxiYWNrcyA9IDA7CiAgICAgICAgZnVuY3Rpb24gdG9Ob0FyZ1Zpc2l0KHZpc2l0RnVuY3Rpb24pIHsKICAgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uID8gKCkgPT4gc3VwcHJlc3NlZENhbGxiYWNrcyA9PT0gMCAmJiB2aXNpdEZ1bmN0aW9uKAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0TGluZSgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkKICAgICAgICAgICkgOiAoKSA9PiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB0b09uZUFyZ1Zpc2l0KHZpc2l0RnVuY3Rpb24pIHsKICAgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uID8gKGFyZykgPT4gc3VwcHJlc3NlZENhbGxiYWNrcyA9PT0gMCAmJiB2aXNpdEZ1bmN0aW9uKAogICAgICAgICAgICBhcmcsCiAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuT2Zmc2V0KCksCiAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuTGVuZ3RoKCksCiAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuU3RhcnRMaW5lKCksCiAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKQogICAgICAgICAgKSA6ICgpID0+IHRydWU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHRvT25lQXJnVmlzaXRXaXRoUGF0aCh2aXNpdEZ1bmN0aW9uKSB7CiAgICAgICAgICByZXR1cm4gdmlzaXRGdW5jdGlvbiA/IChhcmcpID0+IHN1cHByZXNzZWRDYWxsYmFja3MgPT09IDAgJiYgdmlzaXRGdW5jdGlvbigKICAgICAgICAgICAgYXJnLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0TGluZSgpLAogICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCksCiAgICAgICAgICAgICgpID0+IF9qc29uUGF0aC5zbGljZSgpCiAgICAgICAgICApIDogKCkgPT4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdG9CZWdpblZpc2l0KHZpc2l0RnVuY3Rpb24pIHsKICAgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uID8gKCkgPT4gewogICAgICAgICAgICBpZiAoc3VwcHJlc3NlZENhbGxiYWNrcyA+IDApIHsKICAgICAgICAgICAgICBzdXBwcmVzc2VkQ2FsbGJhY2tzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGV0IGNiUmV0dXJuID0gdmlzaXRGdW5jdGlvbigKICAgICAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuT2Zmc2V0KCksCiAgICAgICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpLAogICAgICAgICAgICAgICAgX3NjYW5uZXIuZ2V0VG9rZW5TdGFydExpbmUoKSwKICAgICAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICgpID0+IF9qc29uUGF0aC5zbGljZSgpCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoY2JSZXR1cm4gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBzdXBwcmVzc2VkQ2FsbGJhY2tzID0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gOiAoKSA9PiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB0b0VuZFZpc2l0KHZpc2l0RnVuY3Rpb24pIHsKICAgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uID8gKCkgPT4gewogICAgICAgICAgICBpZiAoc3VwcHJlc3NlZENhbGxiYWNrcyA+IDApIHsKICAgICAgICAgICAgICBzdXBwcmVzc2VkQ2FsbGJhY2tzLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN1cHByZXNzZWRDYWxsYmFja3MgPT09IDApIHsKICAgICAgICAgICAgICB2aXNpdEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgX3NjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKSwKICAgICAgICAgICAgICAgIF9zY2FubmVyLmdldFRva2VuTGVuZ3RoKCksCiAgICAgICAgICAgICAgICBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0TGluZSgpLAogICAgICAgICAgICAgICAgX3NjYW5uZXIuZ2V0VG9rZW5TdGFydENoYXJhY3RlcigpCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSA6ICgpID0+IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9uT2JqZWN0QmVnaW4gPSB0b0JlZ2luVmlzaXQodmlzaXRvci5vbk9iamVjdEJlZ2luKSwgb25PYmplY3RQcm9wZXJ0eSA9IHRvT25lQXJnVmlzaXRXaXRoUGF0aCh2aXNpdG9yLm9uT2JqZWN0UHJvcGVydHkpLCBvbk9iamVjdEVuZCA9IHRvRW5kVmlzaXQodmlzaXRvci5vbk9iamVjdEVuZCksIG9uQXJyYXlCZWdpbiA9IHRvQmVnaW5WaXNpdCh2aXNpdG9yLm9uQXJyYXlCZWdpbiksIG9uQXJyYXlFbmQgPSB0b0VuZFZpc2l0KHZpc2l0b3Iub25BcnJheUVuZCksIG9uTGl0ZXJhbFZhbHVlID0gdG9PbmVBcmdWaXNpdFdpdGhQYXRoKHZpc2l0b3Iub25MaXRlcmFsVmFsdWUpLCBvblNlcGFyYXRvciA9IHRvT25lQXJnVmlzaXQodmlzaXRvci5vblNlcGFyYXRvciksIG9uQ29tbWVudCA9IHRvTm9BcmdWaXNpdCh2aXNpdG9yLm9uQ29tbWVudCksIG9uRXJyb3IgPSB0b09uZUFyZ1Zpc2l0KHZpc2l0b3Iub25FcnJvcik7CiAgICAgICAgY29uc3QgZGlzYWxsb3dDb21tZW50cyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNhbGxvd0NvbW1lbnRzOwogICAgICAgIGNvbnN0IGFsbG93VHJhaWxpbmdDb21tYSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd1RyYWlsaW5nQ29tbWE7CiAgICAgICAgZnVuY3Rpb24gc2Nhbk5leHQoKSB7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBjb25zdCB0b2tlbiA9IF9zY2FubmVyLnNjYW4oKTsKICAgICAgICAgICAgc3dpdGNoIChfc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkpIHsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigKICAgICAgICAgICAgICAgICAgMTQKICAgICAgICAgICAgICAgICAgLyogUGFyc2VFcnJvckNvZGUuSW52YWxpZFVuaWNvZGUgKi8KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigKICAgICAgICAgICAgICAgICAgMTUKICAgICAgICAgICAgICAgICAgLyogUGFyc2VFcnJvckNvZGUuSW52YWxpZEVzY2FwZUNoYXJhY3RlciAqLwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKAogICAgICAgICAgICAgICAgICAxMwogICAgICAgICAgICAgICAgICAvKiBQYXJzZUVycm9yQ29kZS5VbmV4cGVjdGVkRW5kT2ZOdW1iZXIgKi8KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBpZiAoIWRpc2FsbG93Q29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZUVycm9yQ29kZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50ICovCiAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigKICAgICAgICAgICAgICAgICAgMTIKICAgICAgICAgICAgICAgICAgLyogUGFyc2VFcnJvckNvZGUuVW5leHBlY3RlZEVuZE9mU3RyaW5nICovCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgICAgIDE2CiAgICAgICAgICAgICAgICAgIC8qIFBhcnNlRXJyb3JDb2RlLkludmFsaWRDaGFyYWN0ZXIgKi8KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgaWYgKGRpc2FsbG93Q29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZUVycm9yQ29kZS5JbnZhbGlkQ29tbWVudFRva2VuICovCiAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBvbkNvbW1lbnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigKICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAvKiBQYXJzZUVycm9yQ29kZS5JbnZhbGlkU3ltYm9sICovCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvciwgc2tpcFVudGlsQWZ0ZXIgPSBbXSwgc2tpcFVudGlsID0gW10pIHsKICAgICAgICAgIG9uRXJyb3IoZXJyb3IpOwogICAgICAgICAgaWYgKHNraXBVbnRpbEFmdGVyLmxlbmd0aCArIHNraXBVbnRpbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxldCB0b2tlbiA9IF9zY2FubmVyLmdldFRva2VuKCk7CiAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPT0gMTcpIHsKICAgICAgICAgICAgICBpZiAoc2tpcFVudGlsQWZ0ZXIuaW5kZXhPZih0b2tlbikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBzY2FuTmV4dCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChza2lwVW50aWwuaW5kZXhPZih0b2tlbikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdG9rZW4gPSBzY2FuTmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHBhcnNlU3RyaW5nKGlzVmFsdWUpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gX3NjYW5uZXIuZ2V0VG9rZW5WYWx1ZSgpOwogICAgICAgICAgaWYgKGlzVmFsdWUpIHsKICAgICAgICAgICAgb25MaXRlcmFsVmFsdWUodmFsdWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb25PYmplY3RQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgIF9qc29uUGF0aC5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcGFyc2VMaXRlcmFsKCkgewogICAgICAgICAgc3dpdGNoIChfc2Nhbm5lci5nZXRUb2tlbigpKSB7CiAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgY29uc3QgdG9rZW5WYWx1ZSA9IF9zY2FubmVyLmdldFRva2VuVmFsdWUoKTsKICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIodG9rZW5WYWx1ZSk7CiAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgLyogUGFyc2VFcnJvckNvZGUuSW52YWxpZE51bWJlckZvcm1hdCAqLwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgb25MaXRlcmFsVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgb25MaXRlcmFsVmFsdWUobnVsbCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICBvbkxpdGVyYWxWYWx1ZSh0cnVlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgIG9uTGl0ZXJhbFZhbHVlKGZhbHNlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBzY2FuTmV4dCgpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHBhcnNlUHJvcGVydHkoKSB7CiAgICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gMTApIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgLyogU3ludGF4S2luZC5Db21tYVRva2VuICovCiAgICAgICAgICAgICAgXQogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJzZVN0cmluZyhmYWxzZSk7CiAgICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gNikgewogICAgICAgICAgICBvblNlcGFyYXRvcigiOiIpOwogICAgICAgICAgICBzY2FuTmV4dCgpOwogICAgICAgICAgICBpZiAoIXBhcnNlVmFsdWUoKSkgewogICAgICAgICAgICAgIGhhbmRsZUVycm9yKAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgIC8qIFN5bnRheEtpbmQuQ29tbWFUb2tlbiAqLwogICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhhbmRsZUVycm9yKAogICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgIC8qIFN5bnRheEtpbmQuQ29tbWFUb2tlbiAqLwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIF9qc29uUGF0aC5wb3AoKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXJzZU9iamVjdCgpIHsKICAgICAgICAgIG9uT2JqZWN0QmVnaW4oKTsKICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgICBsZXQgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICAgICAgd2hpbGUgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDIgJiYgX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gMTcpIHsKICAgICAgICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgPT09IDUpIHsKICAgICAgICAgICAgICBpZiAoIW5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG9uU2VwYXJhdG9yKCIsIik7CiAgICAgICAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gMiAmJiBhbGxvd1RyYWlsaW5nQ29tbWEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoNiwgW10sIFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXBhcnNlUHJvcGVydHkoKSkgewogICAgICAgICAgICAgIGhhbmRsZUVycm9yKAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgIC8qIFN5bnRheEtpbmQuQ29tbWFUb2tlbiAqLwogICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvbk9iamVjdEVuZCgpOwogICAgICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDIpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAvKiBTeW50YXhLaW5kLkNsb3NlQnJhY2VUb2tlbiAqLwogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgW10KICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcGFyc2VBcnJheSgpIHsKICAgICAgICAgIG9uQXJyYXlCZWdpbigpOwogICAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICAgIGxldCBpc0ZpcnN0RWxlbWVudCA9IHRydWU7CiAgICAgICAgICBsZXQgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICAgICAgd2hpbGUgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDQgJiYgX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gMTcpIHsKICAgICAgICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgPT09IDUpIHsKICAgICAgICAgICAgICBpZiAoIW5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG9uU2VwYXJhdG9yKCIsIik7CiAgICAgICAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gNCAmJiBhbGxvd1RyYWlsaW5nQ29tbWEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoNiwgW10sIFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNGaXJzdEVsZW1lbnQpIHsKICAgICAgICAgICAgICBfanNvblBhdGgucHVzaCgwKTsKICAgICAgICAgICAgICBpc0ZpcnN0RWxlbWVudCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9qc29uUGF0aFtfanNvblBhdGgubGVuZ3RoIC0gMV0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXBhcnNlVmFsdWUoKSkgewogICAgICAgICAgICAgIGhhbmRsZUVycm9yKAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIG9uQXJyYXlFbmQoKTsKICAgICAgICAgIGlmICghaXNGaXJzdEVsZW1lbnQpIHsKICAgICAgICAgICAgX2pzb25QYXRoLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDQpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoCiAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA0CiAgICAgICAgICAgICAgICAvKiBTeW50YXhLaW5kLkNsb3NlQnJhY2tldFRva2VuICovCiAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICBbXQogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXJzZVZhbHVlKCkgewogICAgICAgICAgc3dpdGNoIChfc2Nhbm5lci5nZXRUb2tlbigpKSB7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VBcnJheSgpOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KCk7CiAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKHRydWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiBwYXJzZUxpdGVyYWwoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gMTcpIHsKICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93RW1wdHlDb250ZW50KSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaGFuZGxlRXJyb3IoNCwgW10sIFtdKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJzZVZhbHVlKCkpIHsKICAgICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbXSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChfc2Nhbm5lci5nZXRUb2tlbigpICE9PSAxNykgewogICAgICAgICAgaGFuZGxlRXJyb3IoOSwgW10sIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZXhwb3J0czMudmlzaXQgPSB2aXNpdDsKICAgICAgZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0LCByZXBsYWNlQ2gpIHsKICAgICAgICBsZXQgX3NjYW5uZXIgPSAoMCwgc2Nhbm5lcl8xLmNyZWF0ZVNjYW5uZXIpKHRleHQpLCBwYXJ0cyA9IFtdLCBraW5kLCBvZmZzZXQgPSAwLCBwb3M7CiAgICAgICAgZG8gewogICAgICAgICAgcG9zID0gX3NjYW5uZXIuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgIGtpbmQgPSBfc2Nhbm5lci5zY2FuKCk7CiAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBwb3MpIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGV4dC5zdWJzdHJpbmcob2Zmc2V0LCBwb3MpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJlcGxhY2VDaCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKF9zY2FubmVyLmdldFRva2VuVmFsdWUoKS5yZXBsYWNlKC9bXlxyXG5dL2csIHJlcGxhY2VDaCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBvZmZzZXQgPSBfc2Nhbm5lci5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGtpbmQgIT09IDE3KTsKICAgICAgICByZXR1cm4gcGFydHMuam9pbigiIik7CiAgICAgIH0KICAgICAgZXhwb3J0czMuc3RyaXBDb21tZW50cyA9IHN0cmlwQ29tbWVudHM7CiAgICAgIGZ1bmN0aW9uIGdldE5vZGVUeXBlKHZhbHVlKSB7CiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwogICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgY2FzZSAib2JqZWN0IjogewogICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV4cG9ydHMzLmdldE5vZGVUeXBlID0gZ2V0Tm9kZVR5cGU7CiAgICB9KTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvanNvbmMtcGFyc2VyLXBhdGNoLWQyMGY2NzE4MzYtNDVkMWFlNjIzNi56aXAvbm9kZV9tb2R1bGVzL2pzb25jLXBhcnNlci9saWIvdW1kL2ltcGwvZWRpdC5qcwp2YXIgcmVxdWlyZV9lZGl0ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL2pzb25jLXBhcnNlci1wYXRjaC1kMjBmNjcxODM2LTQ1ZDFhZTYyMzYuemlwL25vZGVfbW9kdWxlcy9qc29uYy1wYXJzZXIvbGliL3VtZC9pbXBsL2VkaXQuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICB2YXIgZm9ybWF0XzEgPSByZXF1aXJlX2Zvcm1hdDMoKTsKICAgIHZhciBwYXJzZXJfMSA9IHJlcXVpcmVfcGFyc2VyKCk7CiAgICAoZnVuY3Rpb24oZmFjdG9yeSkgewogICAgICBpZiAodHlwZW9mIG1vZHVsZTIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUyLmV4cG9ydHMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgdmFyIHYgPSBmYWN0b3J5KHJlcXVpcmUsIGV4cG9ydHMyKTsKICAgICAgICBpZiAodiAhPT0gdm9pZCAwKSBtb2R1bGUyLmV4cG9ydHMgPSB2OwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbInJlcXVpcmUiLCAiZXhwb3J0cyIsICIuL2Zvcm1hdCIsICIuL3BhcnNlciJdLCBmYWN0b3J5KTsKICAgICAgfQogICAgfSkoZnVuY3Rpb24ocmVxdWlyZTIsIGV4cG9ydHMzKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICAgIGV4cG9ydHMzLmlzV1MgPSBleHBvcnRzMy5hcHBseUVkaXQgPSBleHBvcnRzMy5zZXRQcm9wZXJ0eSA9IGV4cG9ydHMzLnJlbW92ZVByb3BlcnR5ID0gdm9pZCAwOwogICAgICBmdW5jdGlvbiByZW1vdmVQcm9wZXJ0eSh0ZXh0LCBwYXRoLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5KHRleHQsIHBhdGgsIHZvaWQgMCwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgZXhwb3J0czMucmVtb3ZlUHJvcGVydHkgPSByZW1vdmVQcm9wZXJ0eTsKICAgICAgZnVuY3Rpb24gc2V0UHJvcGVydHkodGV4dCwgb3JpZ2luYWxQYXRoLCB2YWx1ZSwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHBhdGggPSBvcmlnaW5hbFBhdGguc2xpY2UoKTsKICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICBjb25zdCByb290ID0gKDAsIHBhcnNlcl8xLnBhcnNlVHJlZSkodGV4dCwgZXJyb3JzKTsKICAgICAgICBsZXQgcGFyZW50ID0gdm9pZCAwOwogICAgICAgIGxldCBsYXN0U2VnbWVudCA9IHZvaWQgMDsKICAgICAgICB3aGlsZSAocGF0aC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBsYXN0U2VnbWVudCA9IHBhdGgucG9wKCk7CiAgICAgICAgICBwYXJlbnQgPSAoMCwgcGFyc2VyXzEuZmluZE5vZGVBdExvY2F0aW9uKShyb290LCBwYXRoKTsKICAgICAgICAgIGlmIChwYXJlbnQgPT09IHZvaWQgMCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdFNlZ21lbnQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgdmFsdWUgPSB7IFtsYXN0U2VnbWVudF06IHZhbHVlIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBkZWxldGUgaW4gZW1wdHkgZG9jdW1lbnQiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB3aXRoRm9ybWF0dGluZygKICAgICAgICAgICAgdGV4dCwKICAgICAgICAgICAgewogICAgICAgICAgICAgIG9mZnNldDogcm9vdCA/IHJvb3Qub2Zmc2V0IDogMCwKICAgICAgICAgICAgICBsZW5ndGg6IHJvb3QgPyByb290Lmxlbmd0aCA6IDAsCiAgICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkodmFsdWUpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudHlwZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIGxhc3RTZWdtZW50ID09PSAic3RyaW5nIiAmJiBBcnJheS5pc0FycmF5KHBhcmVudC5jaGlsZHJlbikpIHsKICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gKDAsIHBhcnNlcl8xLmZpbmROb2RlQXRMb2NhdGlvbikocGFyZW50LCBbbGFzdFNlZ21lbnRdKTsKICAgICAgICAgIGlmIChleGlzdGluZyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgaWYgKCFleGlzdGluZy5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIEFTVCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eUluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZXhpc3RpbmcucGFyZW50KTsKICAgICAgICAgICAgICBsZXQgcmVtb3ZlQmVnaW47CiAgICAgICAgICAgICAgbGV0IHJlbW92ZUVuZCA9IGV4aXN0aW5nLnBhcmVudC5vZmZzZXQgKyBleGlzdGluZy5wYXJlbnQubGVuZ3RoOwogICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzID0gcGFyZW50LmNoaWxkcmVuW3Byb3BlcnR5SW5kZXggLSAxXTsKICAgICAgICAgICAgICAgIHJlbW92ZUJlZ2luID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZW1vdmVCZWdpbiA9IHBhcmVudC5vZmZzZXQgKyAxOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFyZW50LmNoaWxkcmVuWzFdOwogICAgICAgICAgICAgICAgICByZW1vdmVFbmQgPSBuZXh0Lm9mZnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHdpdGhGb3JtYXR0aW5nKAogICAgICAgICAgICAgICAgdGV4dCwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgb2Zmc2V0OiByZW1vdmVCZWdpbiwKICAgICAgICAgICAgICAgICAgbGVuZ3RoOiByZW1vdmVFbmQgLSByZW1vdmVCZWdpbiwKICAgICAgICAgICAgICAgICAgY29udGVudDogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gd2l0aEZvcm1hdHRpbmcoCiAgICAgICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBvZmZzZXQ6IGV4aXN0aW5nLm9mZnNldCwKICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBleGlzdGluZy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHZhbHVlKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IGAke0pTT04uc3RyaW5naWZ5KGxhc3RTZWdtZW50KX06ICR7SlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgdmFsdWUKICAgICAgICAgICAgKX1gOwogICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZ2V0SW5zZXJ0aW9uSW5kZXggPyBvcHRpb25zLmdldEluc2VydGlvbkluZGV4KAogICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5tYXAoKHApID0+IHAuY2hpbGRyZW5bMF0udmFsdWUpCiAgICAgICAgICAgICkgOiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgICAgICBsZXQgZWRpdDsKICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgICAgIGxldCBwcmV2aW91cyA9IHBhcmVudC5jaGlsZHJlbltpbmRleCAtIDFdOwogICAgICAgICAgICAgIGVkaXQgPSB7CiAgICAgICAgICAgICAgICBvZmZzZXQ6IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxlbmd0aDogMCwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIsIiArIG5ld1Byb3BlcnR5CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgZWRpdCA9IHsgb2Zmc2V0OiBwYXJlbnQub2Zmc2V0ICsgMSwgbGVuZ3RoOiAwLCBjb250ZW50OiBuZXdQcm9wZXJ0eSB9OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVkaXQgPSB7CiAgICAgICAgICAgICAgICBvZmZzZXQ6IHBhcmVudC5vZmZzZXQgKyAxLAogICAgICAgICAgICAgICAgbGVuZ3RoOiAwLAogICAgICAgICAgICAgICAgY29udGVudDogbmV3UHJvcGVydHkgKyAiLCIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB3aXRoRm9ybWF0dGluZyh0ZXh0LCBlZGl0LCBvcHRpb25zKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC50eXBlID09PSAiYXJyYXkiICYmIHR5cGVvZiBsYXN0U2VnbWVudCA9PT0gIm51bWJlciIgJiYgQXJyYXkuaXNBcnJheShwYXJlbnQuY2hpbGRyZW4pKSB7CiAgICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IGxhc3RTZWdtZW50OwogICAgICAgICAgaWYgKGluc2VydEluZGV4ID09PSAtMSkgewogICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IGAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gOwogICAgICAgICAgICBsZXQgZWRpdDsKICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBlZGl0ID0geyBvZmZzZXQ6IHBhcmVudC5vZmZzZXQgKyAxLCBsZW5ndGg6IDAsIGNvbnRlbnQ6IG5ld1Byb3BlcnR5IH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXJlbnQuY2hpbGRyZW5bcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgIGVkaXQgPSB7CiAgICAgICAgICAgICAgICBvZmZzZXQ6IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxlbmd0aDogMCwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIsIiArIG5ld1Byb3BlcnR5CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gd2l0aEZvcm1hdHRpbmcodGV4dCwgZWRpdCwgb3B0aW9ucyk7CiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB2b2lkIDAgJiYgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IHJlbW92YWxJbmRleCA9IGxhc3RTZWdtZW50OwogICAgICAgICAgICBjb25zdCB0b1JlbW92ZSA9IHBhcmVudC5jaGlsZHJlbltyZW1vdmFsSW5kZXhdOwogICAgICAgICAgICBsZXQgZWRpdDsKICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICBlZGl0ID0gewogICAgICAgICAgICAgICAgb2Zmc2V0OiBwYXJlbnQub2Zmc2V0ICsgMSwKICAgICAgICAgICAgICAgIGxlbmd0aDogcGFyZW50Lmxlbmd0aCAtIDIsCiAgICAgICAgICAgICAgICBjb250ZW50OiAiIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEgPT09IHJlbW92YWxJbmRleCkgewogICAgICAgICAgICAgIGxldCBwcmV2aW91cyA9IHBhcmVudC5jaGlsZHJlbltyZW1vdmFsSW5kZXggLSAxXTsKICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoOwogICAgICAgICAgICAgIGxldCBwYXJlbnRFbmRPZmZzZXQgPSBwYXJlbnQub2Zmc2V0ICsgcGFyZW50Lmxlbmd0aDsKICAgICAgICAgICAgICBlZGl0ID0geyBvZmZzZXQsIGxlbmd0aDogcGFyZW50RW5kT2Zmc2V0IC0gMiAtIG9mZnNldCwgY29udGVudDogIiIgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlZGl0ID0gewogICAgICAgICAgICAgICAgb2Zmc2V0OiB0b1JlbW92ZS5vZmZzZXQsCiAgICAgICAgICAgICAgICBsZW5ndGg6IHBhcmVudC5jaGlsZHJlbltyZW1vdmFsSW5kZXggKyAxXS5vZmZzZXQgLSB0b1JlbW92ZS5vZmZzZXQsCiAgICAgICAgICAgICAgICBjb250ZW50OiAiIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHdpdGhGb3JtYXR0aW5nKHRleHQsIGVkaXQsIG9wdGlvbnMpOwogICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBlZGl0OwogICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IGAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMuaXNBcnJheUluc2VydGlvbiAmJiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gbGFzdFNlZ21lbnQpIHsKICAgICAgICAgICAgICBjb25zdCB0b01vZGlmeSA9IHBhcmVudC5jaGlsZHJlbltsYXN0U2VnbWVudF07CiAgICAgICAgICAgICAgZWRpdCA9IHsKICAgICAgICAgICAgICAgIG9mZnNldDogdG9Nb2RpZnkub2Zmc2V0LAogICAgICAgICAgICAgICAgbGVuZ3RoOiB0b01vZGlmeS5sZW5ndGgsCiAgICAgICAgICAgICAgICBjb250ZW50OiBuZXdQcm9wZXJ0eQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBsYXN0U2VnbWVudCA9PT0gMCkgewogICAgICAgICAgICAgIGVkaXQgPSB7CiAgICAgICAgICAgICAgICBvZmZzZXQ6IHBhcmVudC5vZmZzZXQgKyAxLAogICAgICAgICAgICAgICAgbGVuZ3RoOiAwLAogICAgICAgICAgICAgICAgY29udGVudDogcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCA/IG5ld1Byb3BlcnR5IDogbmV3UHJvcGVydHkgKyAiLCIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGFzdFNlZ21lbnQgPiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID8gcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IGxhc3RTZWdtZW50OwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFyZW50LmNoaWxkcmVuW2luZGV4IC0gMV07CiAgICAgICAgICAgICAgZWRpdCA9IHsKICAgICAgICAgICAgICAgIG9mZnNldDogcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoLAogICAgICAgICAgICAgICAgbGVuZ3RoOiAwLAogICAgICAgICAgICAgICAgY29udGVudDogIiwiICsgbmV3UHJvcGVydHkKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB3aXRoRm9ybWF0dGluZyh0ZXh0LCBlZGl0LCBvcHRpb25zKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICBgQ2FuIG5vdCAke3ZhbHVlID09PSB2b2lkIDAgPyAicmVtb3ZlIiA6IG9wdGlvbnMuaXNBcnJheUluc2VydGlvbiA/ICJpbnNlcnQiIDogIm1vZGlmeSJ9IEFycmF5IGluZGV4ICR7aW5zZXJ0SW5kZXh9IGFzIGxlbmd0aCBpcyBub3Qgc3VmZmljaWVudGAKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICBgQ2FuIG5vdCBhZGQgJHt0eXBlb2YgbGFzdFNlZ21lbnQgIT09ICJudW1iZXIiID8gImluZGV4IiA6ICJwcm9wZXJ0eSJ9IHRvIHBhcmVudCBvZiB0eXBlICR7cGFyZW50LnR5cGV9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZXhwb3J0czMuc2V0UHJvcGVydHkgPSBzZXRQcm9wZXJ0eTsKICAgICAgZnVuY3Rpb24gd2l0aEZvcm1hdHRpbmcodGV4dCwgZWRpdCwgb3B0aW9ucykgewogICAgICAgIGlmICghb3B0aW9ucy5mb3JtYXR0aW5nT3B0aW9ucykgewogICAgICAgICAgcmV0dXJuIFtlZGl0XTsKICAgICAgICB9CiAgICAgICAgbGV0IG5ld1RleHQgPSBhcHBseUVkaXQodGV4dCwgZWRpdCk7CiAgICAgICAgbGV0IGJlZ2luID0gZWRpdC5vZmZzZXQ7CiAgICAgICAgbGV0IGVuZCA9IGVkaXQub2Zmc2V0ICsgZWRpdC5jb250ZW50Lmxlbmd0aDsKICAgICAgICBpZiAoZWRpdC5sZW5ndGggPT09IDAgfHwgZWRpdC5jb250ZW50Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgd2hpbGUgKGJlZ2luID4gMCAmJiAhKDAsIGZvcm1hdF8xLmlzRU9MKShuZXdUZXh0LCBiZWdpbiAtIDEpKSB7CiAgICAgICAgICAgIGJlZ2luLS07CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoZW5kIDwgbmV3VGV4dC5sZW5ndGggJiYgISgwLCBmb3JtYXRfMS5pc0VPTCkobmV3VGV4dCwgZW5kKSkgewogICAgICAgICAgICBlbmQrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZWRpdHMgPSAoMCwgZm9ybWF0XzEuZm9ybWF0KSgKICAgICAgICAgIG5ld1RleHQsCiAgICAgICAgICB7IG9mZnNldDogYmVnaW4sIGxlbmd0aDogZW5kIC0gYmVnaW4gfSwKICAgICAgICAgIHsgLi4ub3B0aW9ucy5mb3JtYXR0aW5nT3B0aW9ucywga2VlcExpbmVzOiBmYWxzZSB9CiAgICAgICAgKTsKICAgICAgICBmb3IgKGxldCBpID0gZWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIGNvbnN0IGVkaXQyID0gZWRpdHNbaV07CiAgICAgICAgICBuZXdUZXh0ID0gYXBwbHlFZGl0KG5ld1RleHQsIGVkaXQyKTsKICAgICAgICAgIGJlZ2luID0gTWF0aC5taW4oYmVnaW4sIGVkaXQyLm9mZnNldCk7CiAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVkaXQyLm9mZnNldCArIGVkaXQyLmxlbmd0aCk7CiAgICAgICAgICBlbmQgKz0gZWRpdDIuY29udGVudC5sZW5ndGggLSBlZGl0Mi5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVkaXRMZW5ndGggPSB0ZXh0Lmxlbmd0aCAtIChuZXdUZXh0Lmxlbmd0aCAtIGVuZCkgLSBiZWdpbjsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgewogICAgICAgICAgICBvZmZzZXQ6IGJlZ2luLAogICAgICAgICAgICBsZW5ndGg6IGVkaXRMZW5ndGgsCiAgICAgICAgICAgIGNvbnRlbnQ6IG5ld1RleHQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpCiAgICAgICAgICB9CiAgICAgICAgXTsKICAgICAgfQogICAgICBmdW5jdGlvbiBhcHBseUVkaXQodGV4dCwgZWRpdCkgewogICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBlZGl0Lm9mZnNldCkgKyBlZGl0LmNvbnRlbnQgKyB0ZXh0LnN1YnN0cmluZyhlZGl0Lm9mZnNldCArIGVkaXQubGVuZ3RoKTsKICAgICAgfQogICAgICBleHBvcnRzMy5hcHBseUVkaXQgPSBhcHBseUVkaXQ7CiAgICAgIGZ1bmN0aW9uIGlzV1ModGV4dCwgb2Zmc2V0KSB7CiAgICAgICAgcmV0dXJuICJcclxuIAkiLmluZGV4T2YodGV4dC5jaGFyQXQob2Zmc2V0KSkgIT09IC0xOwogICAgICB9CiAgICAgIGV4cG9ydHMzLmlzV1MgPSBpc1dTOwogICAgfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL2pzb25jLXBhcnNlci1wYXRjaC1kMjBmNjcxODM2LTQ1ZDFhZTYyMzYuemlwL25vZGVfbW9kdWxlcy9qc29uYy1wYXJzZXIvbGliL3VtZC9tYWluLmpzCnZhciByZXF1aXJlX21haW4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvanNvbmMtcGFyc2VyLXBhdGNoLWQyMGY2NzE4MzYtNDVkMWFlNjIzNi56aXAvbm9kZV9tb2R1bGVzL2pzb25jLXBhcnNlci9saWIvdW1kL21haW4uanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICB2YXIgZm9ybWF0dGVyID0gcmVxdWlyZV9mb3JtYXQzKCk7CiAgICB2YXIgZWRpdCA9IHJlcXVpcmVfZWRpdCgpOwogICAgdmFyIHNjYW5uZXIgPSByZXF1aXJlX3NjYW5uZXIoKTsKICAgIHZhciBwYXJzZXIgPSByZXF1aXJlX3BhcnNlcigpOwogICAgKGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgICAgaWYgKHR5cGVvZiBtb2R1bGUyID09PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlMi5leHBvcnRzID09PSAib2JqZWN0IikgewogICAgICAgIHZhciB2ID0gZmFjdG9yeShyZXF1aXJlLCBleHBvcnRzMik7CiAgICAgICAgaWYgKHYgIT09IHZvaWQgMCkgbW9kdWxlMi5leHBvcnRzID0gdjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIHsKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgInJlcXVpcmUiLAogICAgICAgICAgImV4cG9ydHMiLAogICAgICAgICAgIi4vaW1wbC9mb3JtYXQiLAogICAgICAgICAgIi4vaW1wbC9lZGl0IiwKICAgICAgICAgICIuL2ltcGwvc2Nhbm5lciIsCiAgICAgICAgICAiLi9pbXBsL3BhcnNlciIKICAgICAgICBdLCBmYWN0b3J5KTsKICAgICAgfQogICAgfSkoZnVuY3Rpb24ocmVxdWlyZTIsIGV4cG9ydHMzKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICAgIGV4cG9ydHMzLmFwcGx5RWRpdHMgPSBleHBvcnRzMy5tb2RpZnkgPSBleHBvcnRzMy5mb3JtYXQgPSBleHBvcnRzMy5wcmludFBhcnNlRXJyb3JDb2RlID0gZXhwb3J0czMuUGFyc2VFcnJvckNvZGUgPSBleHBvcnRzMy5zdHJpcENvbW1lbnRzID0gZXhwb3J0czMudmlzaXQgPSBleHBvcnRzMy5nZXROb2RlVmFsdWUgPSBleHBvcnRzMy5nZXROb2RlUGF0aCA9IGV4cG9ydHMzLmZpbmROb2RlQXRPZmZzZXQgPSBleHBvcnRzMy5maW5kTm9kZUF0TG9jYXRpb24gPSBleHBvcnRzMy5wYXJzZVRyZWUgPSBleHBvcnRzMy5wYXJzZSA9IGV4cG9ydHMzLmdldExvY2F0aW9uID0gZXhwb3J0czMuU3ludGF4S2luZCA9IGV4cG9ydHMzLlNjYW5FcnJvciA9IGV4cG9ydHMzLmNyZWF0ZVNjYW5uZXIgPSB2b2lkIDA7CiAgICAgIGV4cG9ydHMzLmNyZWF0ZVNjYW5uZXIgPSBzY2FubmVyLmNyZWF0ZVNjYW5uZXI7CiAgICAgIHZhciBTY2FuRXJyb3I7CiAgICAgIChmdW5jdGlvbihTY2FuRXJyb3IyKSB7CiAgICAgICAgU2NhbkVycm9yMltTY2FuRXJyb3IyWyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICBTY2FuRXJyb3IyW1NjYW5FcnJvcjJbIlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiXSA9IDFdID0gIlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiOwogICAgICAgIFNjYW5FcnJvcjJbU2NhbkVycm9yMlsiVW5leHBlY3RlZEVuZE9mU3RyaW5nIl0gPSAyXSA9ICJVbmV4cGVjdGVkRW5kT2ZTdHJpbmciOwogICAgICAgIFNjYW5FcnJvcjJbU2NhbkVycm9yMlsiVW5leHBlY3RlZEVuZE9mTnVtYmVyIl0gPSAzXSA9ICJVbmV4cGVjdGVkRW5kT2ZOdW1iZXIiOwogICAgICAgIFNjYW5FcnJvcjJbU2NhbkVycm9yMlsiSW52YWxpZFVuaWNvZGUiXSA9IDRdID0gIkludmFsaWRVbmljb2RlIjsKICAgICAgICBTY2FuRXJyb3IyW1NjYW5FcnJvcjJbIkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiXSA9IDVdID0gIkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiOwogICAgICAgIFNjYW5FcnJvcjJbU2NhbkVycm9yMlsiSW52YWxpZENoYXJhY3RlciJdID0gNl0gPSAiSW52YWxpZENoYXJhY3RlciI7CiAgICAgIH0pKFNjYW5FcnJvciB8fCAoZXhwb3J0czMuU2NhbkVycm9yID0gU2NhbkVycm9yID0ge30pKTsKICAgICAgdmFyIFN5bnRheEtpbmQ7CiAgICAgIChmdW5jdGlvbihTeW50YXhLaW5kMikgewogICAgICAgIFN5bnRheEtpbmQyW1N5bnRheEtpbmQyWyJPcGVuQnJhY2VUb2tlbiJdID0gMV0gPSAiT3BlbkJyYWNlVG9rZW4iOwogICAgICAgIFN5bnRheEtpbmQyW1N5bnRheEtpbmQyWyJDbG9zZUJyYWNlVG9rZW4iXSA9IDJdID0gIkNsb3NlQnJhY2VUb2tlbiI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIk9wZW5CcmFja2V0VG9rZW4iXSA9IDNdID0gIk9wZW5CcmFja2V0VG9rZW4iOwogICAgICAgIFN5bnRheEtpbmQyW1N5bnRheEtpbmQyWyJDbG9zZUJyYWNrZXRUb2tlbiJdID0gNF0gPSAiQ2xvc2VCcmFja2V0VG9rZW4iOwogICAgICAgIFN5bnRheEtpbmQyW1N5bnRheEtpbmQyWyJDb21tYVRva2VuIl0gPSA1XSA9ICJDb21tYVRva2VuIjsKICAgICAgICBTeW50YXhLaW5kMltTeW50YXhLaW5kMlsiQ29sb25Ub2tlbiJdID0gNl0gPSAiQ29sb25Ub2tlbiI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIk51bGxLZXl3b3JkIl0gPSA3XSA9ICJOdWxsS2V5d29yZCI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIlRydWVLZXl3b3JkIl0gPSA4XSA9ICJUcnVlS2V5d29yZCI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIkZhbHNlS2V5d29yZCJdID0gOV0gPSAiRmFsc2VLZXl3b3JkIjsKICAgICAgICBTeW50YXhLaW5kMltTeW50YXhLaW5kMlsiU3RyaW5nTGl0ZXJhbCJdID0gMTBdID0gIlN0cmluZ0xpdGVyYWwiOwogICAgICAgIFN5bnRheEtpbmQyW1N5bnRheEtpbmQyWyJOdW1lcmljTGl0ZXJhbCJdID0gMTFdID0gIk51bWVyaWNMaXRlcmFsIjsKICAgICAgICBTeW50YXhLaW5kMltTeW50YXhLaW5kMlsiTGluZUNvbW1lbnRUcml2aWEiXSA9IDEyXSA9ICJMaW5lQ29tbWVudFRyaXZpYSI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIkJsb2NrQ29tbWVudFRyaXZpYSJdID0gMTNdID0gIkJsb2NrQ29tbWVudFRyaXZpYSI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIkxpbmVCcmVha1RyaXZpYSJdID0gMTRdID0gIkxpbmVCcmVha1RyaXZpYSI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIlRyaXZpYSJdID0gMTVdID0gIlRyaXZpYSI7CiAgICAgICAgU3ludGF4S2luZDJbU3ludGF4S2luZDJbIlVua25vd24iXSA9IDE2XSA9ICJVbmtub3duIjsKICAgICAgICBTeW50YXhLaW5kMltTeW50YXhLaW5kMlsiRU9GIl0gPSAxN10gPSAiRU9GIjsKICAgICAgfSkoU3ludGF4S2luZCB8fCAoZXhwb3J0czMuU3ludGF4S2luZCA9IFN5bnRheEtpbmQgPSB7fSkpOwogICAgICBleHBvcnRzMy5nZXRMb2NhdGlvbiA9IHBhcnNlci5nZXRMb2NhdGlvbjsKICAgICAgZXhwb3J0czMucGFyc2UgPSBwYXJzZXIucGFyc2U7CiAgICAgIGV4cG9ydHMzLnBhcnNlVHJlZSA9IHBhcnNlci5wYXJzZVRyZWU7CiAgICAgIGV4cG9ydHMzLmZpbmROb2RlQXRMb2NhdGlvbiA9IHBhcnNlci5maW5kTm9kZUF0TG9jYXRpb247CiAgICAgIGV4cG9ydHMzLmZpbmROb2RlQXRPZmZzZXQgPSBwYXJzZXIuZmluZE5vZGVBdE9mZnNldDsKICAgICAgZXhwb3J0czMuZ2V0Tm9kZVBhdGggPSBwYXJzZXIuZ2V0Tm9kZVBhdGg7CiAgICAgIGV4cG9ydHMzLmdldE5vZGVWYWx1ZSA9IHBhcnNlci5nZXROb2RlVmFsdWU7CiAgICAgIGV4cG9ydHMzLnZpc2l0ID0gcGFyc2VyLnZpc2l0OwogICAgICBleHBvcnRzMy5zdHJpcENvbW1lbnRzID0gcGFyc2VyLnN0cmlwQ29tbWVudHM7CiAgICAgIHZhciBQYXJzZUVycm9yQ29kZTsKICAgICAgKGZ1bmN0aW9uKFBhcnNlRXJyb3JDb2RlMikgewogICAgICAgIFBhcnNlRXJyb3JDb2RlMltQYXJzZUVycm9yQ29kZTJbIkludmFsaWRTeW1ib2wiXSA9IDFdID0gIkludmFsaWRTeW1ib2wiOwogICAgICAgIFBhcnNlRXJyb3JDb2RlMltQYXJzZUVycm9yQ29kZTJbIkludmFsaWROdW1iZXJGb3JtYXQiXSA9IDJdID0gIkludmFsaWROdW1iZXJGb3JtYXQiOwogICAgICAgIFBhcnNlRXJyb3JDb2RlMltQYXJzZUVycm9yQ29kZTJbIlByb3BlcnR5TmFtZUV4cGVjdGVkIl0gPSAzXSA9ICJQcm9wZXJ0eU5hbWVFeHBlY3RlZCI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiVmFsdWVFeHBlY3RlZCJdID0gNF0gPSAiVmFsdWVFeHBlY3RlZCI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiQ29sb25FeHBlY3RlZCJdID0gNV0gPSAiQ29sb25FeHBlY3RlZCI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiQ29tbWFFeHBlY3RlZCJdID0gNl0gPSAiQ29tbWFFeHBlY3RlZCI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiQ2xvc2VCcmFjZUV4cGVjdGVkIl0gPSA3XSA9ICJDbG9zZUJyYWNlRXhwZWN0ZWQiOwogICAgICAgIFBhcnNlRXJyb3JDb2RlMltQYXJzZUVycm9yQ29kZTJbIkNsb3NlQnJhY2tldEV4cGVjdGVkIl0gPSA4XSA9ICJDbG9zZUJyYWNrZXRFeHBlY3RlZCI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiRW5kT2ZGaWxlRXhwZWN0ZWQiXSA9IDldID0gIkVuZE9mRmlsZUV4cGVjdGVkIjsKICAgICAgICBQYXJzZUVycm9yQ29kZTJbUGFyc2VFcnJvckNvZGUyWyJJbnZhbGlkQ29tbWVudFRva2VuIl0gPSAxMF0gPSAiSW52YWxpZENvbW1lbnRUb2tlbiI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiVW5leHBlY3RlZEVuZE9mQ29tbWVudCJdID0gMTFdID0gIlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiOwogICAgICAgIFBhcnNlRXJyb3JDb2RlMltQYXJzZUVycm9yQ29kZTJbIlVuZXhwZWN0ZWRFbmRPZlN0cmluZyJdID0gMTJdID0gIlVuZXhwZWN0ZWRFbmRPZlN0cmluZyI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiVW5leHBlY3RlZEVuZE9mTnVtYmVyIl0gPSAxM10gPSAiVW5leHBlY3RlZEVuZE9mTnVtYmVyIjsKICAgICAgICBQYXJzZUVycm9yQ29kZTJbUGFyc2VFcnJvckNvZGUyWyJJbnZhbGlkVW5pY29kZSJdID0gMTRdID0gIkludmFsaWRVbmljb2RlIjsKICAgICAgICBQYXJzZUVycm9yQ29kZTJbUGFyc2VFcnJvckNvZGUyWyJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIl0gPSAxNV0gPSAiSW52YWxpZEVzY2FwZUNoYXJhY3RlciI7CiAgICAgICAgUGFyc2VFcnJvckNvZGUyW1BhcnNlRXJyb3JDb2RlMlsiSW52YWxpZENoYXJhY3RlciJdID0gMTZdID0gIkludmFsaWRDaGFyYWN0ZXIiOwogICAgICB9KShQYXJzZUVycm9yQ29kZSB8fCAoZXhwb3J0czMuUGFyc2VFcnJvckNvZGUgPSBQYXJzZUVycm9yQ29kZSA9IHt9KSk7CiAgICAgIGZ1bmN0aW9uIHByaW50UGFyc2VFcnJvckNvZGUoY29kZSkgewogICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gIkludmFsaWRTeW1ib2wiOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICByZXR1cm4gIkludmFsaWROdW1iZXJGb3JtYXQiOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gIlByb3BlcnR5TmFtZUV4cGVjdGVkIjsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuICJWYWx1ZUV4cGVjdGVkIjsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuICJDb2xvbkV4cGVjdGVkIjsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgcmV0dXJuICJDb21tYUV4cGVjdGVkIjsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmV0dXJuICJDbG9zZUJyYWNlRXhwZWN0ZWQiOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICByZXR1cm4gIkNsb3NlQnJhY2tldEV4cGVjdGVkIjsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgcmV0dXJuICJFbmRPZkZpbGVFeHBlY3RlZCI7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICByZXR1cm4gIkludmFsaWRDb21tZW50VG9rZW4iOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgcmV0dXJuICJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IjsKICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZEVuZE9mU3RyaW5nIjsKICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZEVuZE9mTnVtYmVyIjsKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIHJldHVybiAiSW52YWxpZFVuaWNvZGUiOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIjsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiAiSW52YWxpZENoYXJhY3RlciI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiPHVua25vd24gUGFyc2VFcnJvckNvZGU+IjsKICAgICAgfQogICAgICBleHBvcnRzMy5wcmludFBhcnNlRXJyb3JDb2RlID0gcHJpbnRQYXJzZUVycm9yQ29kZTsKICAgICAgZnVuY3Rpb24gZm9ybWF0KGRvY3VtZW50VGV4dCwgcmFuZ2UsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudFRleHQsIHJhbmdlLCBvcHRpb25zKTsKICAgICAgfQogICAgICBleHBvcnRzMy5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgIGZ1bmN0aW9uIG1vZGlmeSh0ZXh0LCBwYXRoLCB2YWx1ZSwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBlZGl0LnNldFByb3BlcnR5KHRleHQsIHBhdGgsIHZhbHVlLCBvcHRpb25zKTsKICAgICAgfQogICAgICBleHBvcnRzMy5tb2RpZnkgPSBtb2RpZnk7CiAgICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHModGV4dCwgZWRpdHMpIHsKICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBlZGl0cy5zbGljZSgwKS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICBjb25zdCBkaWZmID0gYS5vZmZzZXQgLSBiLm9mZnNldDsKICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRpZmY7CiAgICAgICAgfSk7CiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTsKICAgICAgICAgIGlmIChlLm9mZnNldCArIGUubGVuZ3RoIDw9IGxhc3RNb2RpZmllZE9mZnNldCkgewogICAgICAgICAgICB0ZXh0ID0gZWRpdC5hcHBseUVkaXQodGV4dCwgZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXBwaW5nIGVkaXQiKTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IGUub2Zmc2V0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgfQogICAgICBleHBvcnRzMy5hcHBseUVkaXRzID0gYXBwbHlFZGl0czsKICAgIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvanNvbi9tZXRhZGF0YS5qcwp2YXIgcmVxdWlyZV9tZXRhZGF0YTIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2pzb24vbWV0YWRhdGEuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkpzb25Xb3Jrc3BhY2VNZXRhZGF0YSA9IGV4cG9ydHMyLkpzb25Xb3Jrc3BhY2VTeW1ib2wgPSB2b2lkIDA7CiAgICB2YXIganNvbmNfcGFyc2VyXzEgPSByZXF1aXJlX21haW4oKTsKICAgIGV4cG9ydHMyLkpzb25Xb3Jrc3BhY2VTeW1ib2wgPSBTeW1ib2wuZm9yKCJAYW5ndWxhci9jb3JlOndvcmtzcGFjZS1qc29uIik7CiAgICBmdW5jdGlvbiBlc2NhcGVLZXkoa2V5KSB7CiAgICAgIHJldHVybiBrZXkucmVwbGFjZSgifiIsICJ+MCIpLnJlcGxhY2UoIi8iLCAifjEiKTsKICAgIH0KICAgIHZhciBKc29uV29ya3NwYWNlTWV0YWRhdGEgPSBjbGFzcyB7CiAgICAgIGZpbGVQYXRoOwogICAgICBhc3Q7CiAgICAgIHJhdzsKICAgICAgY2hhbmdlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIGhhc0xlZ2FjeVRhcmdldHNOYW1lID0gdHJ1ZTsKICAgICAgY29uc3RydWN0b3IoZmlsZVBhdGgsIGFzdCwgcmF3KSB7CiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOwogICAgICAgIHRoaXMuYXN0ID0gYXN0OwogICAgICAgIHRoaXMucmF3ID0gcmF3OwogICAgICB9CiAgICAgIGdldCBoYXNDaGFuZ2VzKCkgewogICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXMuc2l6ZSA+IDA7CiAgICAgIH0KICAgICAgZ2V0IGNoYW5nZUNvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXMuc2l6ZTsKICAgICAgfQogICAgICBnZXROb2RlVmFsdWVGcm9tQXN0KHBhdGgpIHsKICAgICAgICBjb25zdCBub2RlID0gKDAsIGpzb25jX3BhcnNlcl8xLmZpbmROb2RlQXRMb2NhdGlvbikodGhpcy5hc3QsIHBhdGgpOwogICAgICAgIHJldHVybiBub2RlICYmICgwLCBqc29uY19wYXJzZXJfMS5nZXROb2RlVmFsdWUpKG5vZGUpOwogICAgICB9CiAgICAgIGZpbmRDaGFuZ2VzRm9yUGF0aChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlcy5nZXQocGF0aCk7CiAgICAgIH0KICAgICAgYWRkQ2hhbmdlKGpzb25QYXRoLCB2YWx1ZSwgdHlwZSkgewogICAgICAgIGxldCBjdXJyZW50UGF0aCA9ICIiOwogICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBqc29uUGF0aC5sZW5ndGggLSAxOyBpbmRleCsrKSB7CiAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoICsgIi8iICsgZXNjYXBlS2V5KGpzb25QYXRoW2luZGV4XSk7CiAgICAgICAgICBpZiAodGhpcy5jaGFuZ2VzLmhhcyhjdXJyZW50UGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBwYXRoS2V5ID0gIi8iICsganNvblBhdGgubWFwKChrKSA9PiBlc2NhcGVLZXkoaykpLmpvaW4oIi8iKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmNoYW5nZXMua2V5cygpKSB7CiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocGF0aEtleSArICIvIikpIHsKICAgICAgICAgICAgdGhpcy5jaGFuZ2VzLmRlbGV0ZShrZXkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmNoYW5nZXMuc2V0KHBhdGhLZXksIHsganNvblBhdGgsIHR5cGUsIHZhbHVlIH0pOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuSnNvbldvcmtzcGFjZU1ldGFkYXRhID0gSnNvbldvcmtzcGFjZU1ldGFkYXRhOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvanNvbi91dGlsaXRpZXMuanMKdmFyIHJlcXVpcmVfdXRpbGl0aWVzID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9qc29uL3V0aWxpdGllcy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuY3JlYXRlVmlydHVhbEFzdE9iamVjdCA9IGNyZWF0ZVZpcnR1YWxBc3RPYmplY3Q7CiAgICB2YXIganNvbl8xID0gcmVxdWlyZV9qc29uKCk7CiAgICBmdW5jdGlvbiBjcmVhdGVWaXJ0dWFsQXN0T2JqZWN0KHJvb3QsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCByZXBvcnRlciA9IChwYXRoLCB0YXJnZXQsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT4gewogICAgICAgIGlmICghb3B0aW9ucy5saXN0ZW5lcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlIHx8IEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKICAgICAgICAgIG9wdGlvbnMubGlzdGVuZXIocGF0aC5zbGljZSgwLCAtMSksIHRhcmdldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9wdGlvbnMubGlzdGVuZXIocGF0aCwgbmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIGNyZWF0ZShBcnJheS5pc0FycmF5KHJvb3QpID8gWy4uLnJvb3RdIDogeyAuLi5yb290IH0sIFtdLCByZXBvcnRlciwgbmV3IFNldChvcHRpb25zLmV4Y2x1ZGUpLCBvcHRpb25zLmluY2x1ZGU/Lmxlbmd0aCA/IG5ldyBTZXQob3B0aW9ucy5pbmNsdWRlKSA6IHZvaWQgMCk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGUob2JqLCBwYXRoLCByZXBvcnRlciwgZXhjbHVkZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBpbmNsdWRlZCkgewogICAgICByZXR1cm4gbmV3IFByb3h5KG9iaiwgewogICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHApIHsKICAgICAgICAgIGlmIChleGNsdWRlZC5oYXMocCkgfHwgaW5jbHVkZWQgJiYgIWluY2x1ZGVkLmhhcyhwKSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcCk7CiAgICAgICAgfSwKICAgICAgICBoYXModGFyZ2V0LCBwKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHAgPT09ICJzeW1ib2wiIHx8IGV4Y2x1ZGVkLmhhcyhwKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHApIHsKICAgICAgICAgIGlmIChleGNsdWRlZC5oYXMocCkgfHwgaW5jbHVkZWQgJiYgIWluY2x1ZGVkLmhhcyhwKSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHApOwogICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAic3ltYm9sIikgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKDAsIGpzb25fMS5pc0pzb25PYmplY3QpKHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gY3JlYXRlKHZhbHVlLCBbLi4ucGF0aCwgcF0sIHJlcG9ydGVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHNldCh0YXJnZXQsIHAsIHZhbHVlKSB7CiAgICAgICAgICBpZiAoZXhjbHVkZWQuaGFzKHApIHx8IGluY2x1ZGVkICYmICFpbmNsdWRlZC5oYXMocCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUHJvcGVydHk/Lih0YXJnZXQsIHApID8/IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAic3ltYm9sIikgewogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKHRhcmdldCwgcCk7CiAgICAgICAgICBpZiAoUmVmbGVjdC5zZXQodGFyZ2V0LCBwLCB2YWx1ZSkpIHsKICAgICAgICAgICAgcmVwb3J0ZXIoWy4uLnBhdGgsIHBdLCB0YXJnZXQsIGV4aXN0aW5nVmFsdWUsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKICAgICAgICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHApIHsKICAgICAgICAgIGlmIChleGNsdWRlZC5oYXMocCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAic3ltYm9sIikgewogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHApOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IGdldEN1cnJlbnRWYWx1ZSh0YXJnZXQsIHApOwogICAgICAgICAgaWYgKFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwKSkgewogICAgICAgICAgICByZXBvcnRlcihbLi4ucGF0aCwgcF0sIHRhcmdldCwgZXhpc3RpbmdWYWx1ZSwgdm9pZCAwKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAogICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcCwgYXR0cmlidXRlcykgewogICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAic3ltYm9sIikgewogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHAsIGF0dHJpYnV0ZXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCiAgICAgICAgb3duS2V5cyh0YXJnZXQpIHsKICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KS5maWx0ZXIoKHApID0+ICFleGNsdWRlZC5oYXMocCkgJiYgKCFpbmNsdWRlZCB8fCBpbmNsdWRlZC5oYXMocCkpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q3VycmVudFZhbHVlKHRhcmdldCwgcHJvcGVydHkpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc0Zpbml0ZSgrcHJvcGVydHkpKSB7CiAgICAgICAgcmV0dXJuIHRhcmdldFsrcHJvcGVydHldOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgJiYgcHJvcGVydHkgaW4gdGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eV07CiAgICAgIH0KICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2pzb24vcmVhZGVyLmpzCnZhciByZXF1aXJlX3JlYWRlciA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvanNvbi9yZWFkZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnJlYWRKc29uV29ya3NwYWNlID0gcmVhZEpzb25Xb3Jrc3BhY2U7CiAgICB2YXIganNvbmNfcGFyc2VyXzEgPSByZXF1aXJlX21haW4oKTsKICAgIHZhciB1dGlsc18xID0gcmVxdWlyZV91dGlscygpOwogICAgdmFyIGRlZmluaXRpb25zXzEgPSByZXF1aXJlX2RlZmluaXRpb25zKCk7CiAgICB2YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmVfbWV0YWRhdGEyKCk7CiAgICB2YXIgdXRpbGl0aWVzXzEgPSByZXF1aXJlX3V0aWxpdGllcygpOwogICAgdmFyIEFOR1VMQVJfV09SS1NQQUNFX0VYVEVOU0lPTlMgPSBPYmplY3QuZnJlZXplKFsiY2xpIiwgIm5ld1Byb2plY3RSb290IiwgInNjaGVtYXRpY3MiXSk7CiAgICB2YXIgQU5HVUxBUl9QUk9KRUNUX0VYVEVOU0lPTlMgPSBPYmplY3QuZnJlZXplKFsiY2xpIiwgInNjaGVtYXRpY3MiLCAicHJvamVjdFR5cGUiLCAiaTE4biJdKTsKICAgIGFzeW5jIGZ1bmN0aW9uIHJlYWRKc29uV29ya3NwYWNlKHBhdGgsIGhvc3QsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCByYXcgPSBhd2FpdCBob3N0LnJlYWRGaWxlKHBhdGgpOwogICAgICBpZiAocmF3ID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byByZWFkIHdvcmtzcGFjZSBmaWxlLiIpOwogICAgICB9CiAgICAgIGNvbnN0IGFzdCA9ICgwLCBqc29uY19wYXJzZXJfMS5wYXJzZVRyZWUpKHJhdywgdm9pZCAwLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSwgZGlzYWxsb3dDb21tZW50czogZmFsc2UgfSk7CiAgICAgIGlmIChhc3Q/LnR5cGUgIT09ICJvYmplY3QiIHx8ICFhc3QuY2hpbGRyZW4pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgd29ya3NwYWNlIGZpbGUgLSBleHBlY3RlZCBKU09OIG9iamVjdC4iKTsKICAgICAgfQogICAgICBjb25zdCB2ZXJzaW9uTm9kZSA9ICgwLCBqc29uY19wYXJzZXJfMS5maW5kTm9kZUF0TG9jYXRpb24pKGFzdCwgWyJ2ZXJzaW9uIl0pOwogICAgICBpZiAoIXZlcnNpb25Ob2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZvcm1hdCAtIHZlcnNpb24gc3BlY2lmaWVyIG5vdCBmb3VuZC4iKTsKICAgICAgfQogICAgICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk5vZGUudmFsdWU7CiAgICAgIGlmICh2ZXJzaW9uICE9PSAxKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm1hdCB2ZXJzaW9uIGRldGVjdGVkIC0gRXhwZWN0ZWQ6WyAxIF0gRm91bmQ6IFsgJHt2ZXJzaW9ufSBdYCk7CiAgICAgIH0KICAgICAgY29uc3QgY29udGV4dCA9IHsKICAgICAgICBob3N0LAogICAgICAgIG1ldGFkYXRhOiBuZXcgbWV0YWRhdGFfMS5Kc29uV29ya3NwYWNlTWV0YWRhdGEocGF0aCwgYXN0LCByYXcpLAogICAgICAgIHRyYWNrQ2hhbmdlczogdHJ1ZSwKICAgICAgICB1bnByZWZpeGVkV29ya3NwYWNlRXh0ZW5zaW9uczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWwogICAgICAgICAgLi4uQU5HVUxBUl9XT1JLU1BBQ0VfRVhURU5TSU9OUywKICAgICAgICAgIC4uLm9wdGlvbnMuYWxsb3dlZFdvcmtzcGFjZUV4dGVuc2lvbnMgPz8gW10KICAgICAgICBdKSwKICAgICAgICB1bnByZWZpeGVkUHJvamVjdEV4dGVuc2lvbnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsKICAgICAgICAgIC4uLkFOR1VMQVJfUFJPSkVDVF9FWFRFTlNJT05TLAogICAgICAgICAgLi4ub3B0aW9ucy5hbGxvd2VkUHJvamVjdEV4dGVuc2lvbnMgPz8gW10KICAgICAgICBdKSwKICAgICAgICBlcnJvcihtZXNzYWdlLCBfbm9kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgICAgIH0sCiAgICAgICAgd2FybihtZXNzYWdlLCBfbm9kZSkgewogICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgY29uc3Qgd29ya3NwYWNlID0gcGFyc2VXb3Jrc3BhY2UoYXN0LCBjb250ZXh0KTsKICAgICAgcmV0dXJuIHdvcmtzcGFjZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlV29ya3NwYWNlKHdvcmtzcGFjZU5vZGUsIGNvbnRleHQpIHsKICAgICAgY29uc3QganNvbk1ldGFkYXRhID0gY29udGV4dC5tZXRhZGF0YTsKICAgICAgbGV0IHByb2plY3RzOwogICAgICBsZXQgZXh0ZW5zaW9uczsKICAgICAgaWYgKCFjb250ZXh0LnRyYWNrQ2hhbmdlcykgewogICAgICAgIGV4dGVuc2lvbnMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgfQogICAgICBjb25zdCB3b3Jrc3BhY2VOb2RlVmFsdWUgPSAoMCwganNvbmNfcGFyc2VyXzEuZ2V0Tm9kZVZhbHVlKSh3b3Jrc3BhY2VOb2RlKTsKICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtzcGFjZU5vZGVWYWx1ZSkpIHsKICAgICAgICBpZiAobmFtZSA9PT0gIiRzY2hlbWEiIHx8IG5hbWUgPT09ICJ2ZXJzaW9uIikgewogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gInByb2plY3RzIikgewogICAgICAgICAgY29uc3Qgbm9kZXMgPSAoMCwganNvbmNfcGFyc2VyXzEuZmluZE5vZGVBdExvY2F0aW9uKSh3b3Jrc3BhY2VOb2RlLCBbInByb2plY3RzIl0pOwogICAgICAgICAgaWYgKCEoMCwgdXRpbHNfMS5pc0pzb25PYmplY3QpKHZhbHVlKSB8fCAhbm9kZXMpIHsKICAgICAgICAgICAgY29udGV4dC5lcnJvcignSW52YWxpZCAicHJvamVjdHMiIGZpZWxkIGZvdW5kOyBleHBlY3RlZCBhbiBvYmplY3QuJywgdmFsdWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHByb2plY3RzID0gcGFyc2VQcm9qZWN0c09iamVjdChub2RlcywgY29udGV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghY29udGV4dC51bnByZWZpeGVkV29ya3NwYWNlRXh0ZW5zaW9ucy5oYXMobmFtZSkgJiYgIS9eW2Etel17MSwzfS0uKi8udGVzdChuYW1lKSkgewogICAgICAgICAgICBjb250ZXh0Lndhcm4oYFdvcmtzcGFjZSBleHRlbnNpb24gd2l0aCBpbnZhbGlkIG5hbWUgKCR7bmFtZX0pIGZvdW5kLmAsIG5hbWUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGV4dGVuc2lvbnMpIHsKICAgICAgICAgICAgZXh0ZW5zaW9uc1tuYW1lXSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgY29sbGVjdGlvbkxpc3RlbmVyOwogICAgICBpZiAoY29udGV4dC50cmFja0NoYW5nZXMpIHsKICAgICAgICBjb2xsZWN0aW9uTGlzdGVuZXIgPSAobmFtZSwgbmV3VmFsdWUpID0+IHsKICAgICAgICAgIGpzb25NZXRhZGF0YS5hZGRDaGFuZ2UoWyJwcm9qZWN0cyIsIG5hbWVdLCBuZXdWYWx1ZSwgInByb2plY3QiKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uID0gbmV3IGRlZmluaXRpb25zXzEuUHJvamVjdERlZmluaXRpb25Db2xsZWN0aW9uKHByb2plY3RzLCBjb2xsZWN0aW9uTGlzdGVuZXIpOwogICAgICByZXR1cm4gewogICAgICAgIFttZXRhZGF0YV8xLkpzb25Xb3Jrc3BhY2VTeW1ib2xdOiBqc29uTWV0YWRhdGEsCiAgICAgICAgcHJvamVjdHM6IHByb2plY3RDb2xsZWN0aW9uLAogICAgICAgIC8vIElmIG5vdCB0cmFja2luZyBjaGFuZ2VzIHRoZSBgZXh0ZW5zaW9uc2AgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZSBwYXJzZWQKICAgICAgICAvLyB2YWx1ZXMuICBPdGhlcndpc2UgdGhlIGV4dGVuc2lvbnMgYXJlIHRyYWNrZWQgdmlhIGEgdmlydHVhbCBBU1Qgb2JqZWN0LgogICAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMgPz8gKDAsIHV0aWxpdGllc18xLmNyZWF0ZVZpcnR1YWxBc3RPYmplY3QpKHdvcmtzcGFjZU5vZGVWYWx1ZSwgewogICAgICAgICAgZXhjbHVkZTogWyIkc2NoZW1hIiwgInZlcnNpb24iLCAicHJvamVjdHMiXSwKICAgICAgICAgIGxpc3RlbmVyKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgICAgIGpzb25NZXRhZGF0YS5hZGRDaGFuZ2UocGF0aCwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVByb2plY3RzT2JqZWN0KHByb2plY3RzTm9kZSwgY29udGV4dCkgewogICAgICBjb25zdCBwcm9qZWN0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoKDAsIGpzb25jX3BhcnNlcl8xLmdldE5vZGVWYWx1ZSkocHJvamVjdHNOb2RlKSkpIHsKICAgICAgICBjb25zdCBub2RlcyA9ICgwLCBqc29uY19wYXJzZXJfMS5maW5kTm9kZUF0TG9jYXRpb24pKHByb2plY3RzTm9kZSwgW25hbWVdKTsKICAgICAgICBpZiAoISgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkodmFsdWUpIHx8ICFub2RlcykgewogICAgICAgICAgY29udGV4dC53YXJuKCJTa2lwcGluZyBpbnZhbGlkIHByb2plY3QgdmFsdWU7IGV4cGVjdGVkIGFuIG9iamVjdC4iLCB2YWx1ZSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvamVjdHNbbmFtZV0gPSBwYXJzZVByb2plY3QobmFtZSwgbm9kZXMsIGNvbnRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9qZWN0czsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUHJvamVjdChwcm9qZWN0TmFtZSwgcHJvamVjdE5vZGUsIGNvbnRleHQpIHsKICAgICAgY29uc3QganNvbk1ldGFkYXRhID0gY29udGV4dC5tZXRhZGF0YTsKICAgICAgbGV0IHRhcmdldHM7CiAgICAgIGxldCBoYXNUYXJnZXRzID0gZmFsc2U7CiAgICAgIGxldCBleHRlbnNpb25zOwogICAgICBsZXQgcHJvcGVydGllczsKICAgICAgaWYgKCFjb250ZXh0LnRyYWNrQ2hhbmdlcykgewogICAgICAgIGV4dGVuc2lvbnMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBwcm9wZXJ0aWVzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgcHJvamVjdE5vZGVWYWx1ZSA9ICgwLCBqc29uY19wYXJzZXJfMS5nZXROb2RlVmFsdWUpKHByb2plY3ROb2RlKTsKICAgICAgaWYgKCEoInJvb3QiIGluIHByb2plY3ROb2RlVmFsdWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICIke3Byb2plY3ROYW1lfSIgaXMgbWlzc2luZyBhIHJlcXVpcmVkIHByb3BlcnR5ICJyb290Ii5gKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdE5vZGVWYWx1ZSkpIHsKICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgIGNhc2UgInRhcmdldHMiOgogICAgICAgICAgY2FzZSAiYXJjaGl0ZWN0IjogewogICAgICAgICAgICBjb25zdCBub2RlcyA9ICgwLCBqc29uY19wYXJzZXJfMS5maW5kTm9kZUF0TG9jYXRpb24pKHByb2plY3ROb2RlLCBbbmFtZV0pOwogICAgICAgICAgICBpZiAoISgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkodmFsdWUpIHx8ICFub2RlcykgewogICAgICAgICAgICAgIGNvbnRleHQuZXJyb3IoYEludmFsaWQgIiR7bmFtZX0iIGZpZWxkIGZvdW5kOyBleHBlY3RlZCBhbiBvYmplY3QuYCwgdmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhhc1RhcmdldHMgPSB0cnVlOwogICAgICAgICAgICB0YXJnZXRzID0gcGFyc2VUYXJnZXRzT2JqZWN0KHByb2plY3ROYW1lLCBub2RlcywgY29udGV4dCk7CiAgICAgICAgICAgIGpzb25NZXRhZGF0YS5oYXNMZWdhY3lUYXJnZXRzTmFtZSA9IG5hbWUgPT09ICJhcmNoaXRlY3QiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgInByZWZpeCI6CiAgICAgICAgICBjYXNlICJyb290IjoKICAgICAgICAgIGNhc2UgInNvdXJjZVJvb3QiOgogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGNvbnRleHQud2FybihgUHJvamVjdCBwcm9wZXJ0eSAiJHtuYW1lfSIgc2hvdWxkIGJlIGEgc3RyaW5nLmAsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydGllcykgewogICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmICghY29udGV4dC51bnByZWZpeGVkUHJvamVjdEV4dGVuc2lvbnMuaGFzKG5hbWUpICYmICEvXlthLXpdezEsM30tLiovLnRlc3QobmFtZSkpIHsKICAgICAgICAgICAgICBjb250ZXh0Lndhcm4oYFByb2plY3QgJyR7cHJvamVjdE5hbWV9JyBjb250YWlucyBleHRlbnNpb24gd2l0aCBpbnZhbGlkIG5hbWUgKCR7bmFtZX0pLmAsIG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleHRlbnNpb25zKSB7CiAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tuYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgY29sbGVjdGlvbkxpc3RlbmVyOwogICAgICBpZiAoY29udGV4dC50cmFja0NoYW5nZXMpIHsKICAgICAgICBjb2xsZWN0aW9uTGlzdGVuZXIgPSAobmFtZSwgbmV3VmFsdWUsIGNvbGxlY3Rpb24pID0+IHsKICAgICAgICAgIGlmIChoYXNUYXJnZXRzKSB7CiAgICAgICAgICAgIGpzb25NZXRhZGF0YS5hZGRDaGFuZ2UoWyJwcm9qZWN0cyIsIHByb2plY3ROYW1lLCAidGFyZ2V0cyIsIG5hbWVdLCBuZXdWYWx1ZSwgInRhcmdldCIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAganNvbk1ldGFkYXRhLmFkZENoYW5nZShbInByb2plY3RzIiwgcHJvamVjdE5hbWUsICJ0YXJnZXRzIl0sIGNvbGxlY3Rpb24sICJ0YXJnZXRjb2xsZWN0aW9uIik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBiYXNlID0gewogICAgICAgIHRhcmdldHM6IG5ldyBkZWZpbml0aW9uc18xLlRhcmdldERlZmluaXRpb25Db2xsZWN0aW9uKHRhcmdldHMsIGNvbGxlY3Rpb25MaXN0ZW5lciksCiAgICAgICAgLy8gSWYgbm90IHRyYWNraW5nIGNoYW5nZXMgdGhlIGBleHRlbnNpb25zYCB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIHBhcnNlZAogICAgICAgIC8vIHZhbHVlcy4gIE90aGVyd2lzZSB0aGUgZXh0ZW5zaW9ucyBhcmUgdHJhY2tlZCB2aWEgYSB2aXJ0dWFsIEFTVCBvYmplY3QuCiAgICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyA/PyAoMCwgdXRpbGl0aWVzXzEuY3JlYXRlVmlydHVhbEFzdE9iamVjdCkocHJvamVjdE5vZGVWYWx1ZSwgewogICAgICAgICAgZXhjbHVkZTogWyJhcmNoaXRlY3QiLCAicHJlZml4IiwgInJvb3QiLCAic291cmNlUm9vdCIsICJ0YXJnZXRzIl0sCiAgICAgICAgICBsaXN0ZW5lcihwYXRoLCB2YWx1ZSkgewogICAgICAgICAgICBqc29uTWV0YWRhdGEuYWRkQ2hhbmdlKFsicHJvamVjdHMiLCBwcm9qZWN0TmFtZSwgLi4ucGF0aF0sIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9OwogICAgICBjb25zdCBiYXNlS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoYmFzZSkpOwogICAgICBjb25zdCBwcm9qZWN0ID0gcHJvcGVydGllcyA/PyAoMCwgdXRpbGl0aWVzXzEuY3JlYXRlVmlydHVhbEFzdE9iamVjdCkocHJvamVjdE5vZGVWYWx1ZSwgewogICAgICAgIGluY2x1ZGU6IFsicHJlZml4IiwgInJvb3QiLCAic291cmNlUm9vdCIsIC4uLmJhc2VLZXlzXSwKICAgICAgICBsaXN0ZW5lcihwYXRoLCB2YWx1ZSkgewogICAgICAgICAgaWYgKCFiYXNlS2V5cy5oYXMocGF0aFswXSkpIHsKICAgICAgICAgICAganNvbk1ldGFkYXRhLmFkZENoYW5nZShbInByb2plY3RzIiwgcHJvamVjdE5hbWUsIC4uLnBhdGhdLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvamVjdCwgYmFzZSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVRhcmdldHNPYmplY3QocHJvamVjdE5hbWUsIHRhcmdldHNOb2RlLCBjb250ZXh0KSB7CiAgICAgIGNvbnN0IGpzb25NZXRhZGF0YSA9IGNvbnRleHQubWV0YWRhdGE7CiAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKCgwLCBqc29uY19wYXJzZXJfMS5nZXROb2RlVmFsdWUpKHRhcmdldHNOb2RlKSkpIHsKICAgICAgICBpZiAoISgwLCB1dGlsc18xLmlzSnNvbk9iamVjdCkodmFsdWUpKSB7CiAgICAgICAgICBjb250ZXh0Lndhcm4oIlNraXBwaW5nIGludmFsaWQgdGFyZ2V0IHZhbHVlOyBleHBlY3RlZCBhbiBvYmplY3QuIiwgdmFsdWUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChjb250ZXh0LnRyYWNrQ2hhbmdlcykgewogICAgICAgICAgdGFyZ2V0c1tuYW1lXSA9ICgwLCB1dGlsaXRpZXNfMS5jcmVhdGVWaXJ0dWFsQXN0T2JqZWN0KSh2YWx1ZSwgewogICAgICAgICAgICBpbmNsdWRlOiBbImJ1aWxkZXIiLCAib3B0aW9ucyIsICJjb25maWd1cmF0aW9ucyIsICJkZWZhdWx0Q29uZmlndXJhdGlvbiJdLAogICAgICAgICAgICBsaXN0ZW5lcihwYXRoLCB2YWx1ZTIpIHsKICAgICAgICAgICAgICBqc29uTWV0YWRhdGEuYWRkQ2hhbmdlKFsicHJvamVjdHMiLCBwcm9qZWN0TmFtZSwgInRhcmdldHMiLCBuYW1lLCAuLi5wYXRoXSwgdmFsdWUyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRhcmdldHNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldHM7CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9qc29uL3dyaXRlci5qcwp2YXIgcmVxdWlyZV93cml0ZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2pzb24vd3JpdGVyLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi53cml0ZUpzb25Xb3Jrc3BhY2UgPSB3cml0ZUpzb25Xb3Jrc3BhY2U7CiAgICB2YXIganNvbmNfcGFyc2VyXzEgPSByZXF1aXJlX21haW4oKTsKICAgIHZhciBub2RlX29zXzEgPSByZXF1aXJlKCJub2RlOm9zIik7CiAgICB2YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmVfbWV0YWRhdGEyKCk7CiAgICBhc3luYyBmdW5jdGlvbiB3cml0ZUpzb25Xb3Jrc3BhY2Uod29ya3NwYWNlLCBob3N0LCBwYXRoLCBvcHRpb25zID0ge30pIHsKICAgICAgY29uc3QgbWV0YWRhdGEgPSB3b3Jrc3BhY2VbbWV0YWRhdGFfMS5Kc29uV29ya3NwYWNlU3ltYm9sXTsKICAgICAgaWYgKG1ldGFkYXRhKSB7CiAgICAgICAgaWYgKCFtZXRhZGF0YS5oYXNDaGFuZ2VzKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRhdGEgPSB1cGRhdGVKc29uV29ya3NwYWNlKG1ldGFkYXRhKTsKICAgICAgICByZXR1cm4gaG9zdC53cml0ZUZpbGUocGF0aCA/PyBtZXRhZGF0YS5maWxlUGF0aCwgZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInBhdGggb3B0aW9uIGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9iaiA9IGNvbnZlcnRKc29uV29ya3NwYWNlKHdvcmtzcGFjZSwgb3B0aW9ucy5zY2hlbWEpOwogICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpOwogICAgICAgIHJldHVybiBob3N0LndyaXRlRmlsZShwYXRoLCBkYXRhKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29udmVydEpzb25Xb3Jrc3BhY2Uod29ya3NwYWNlLCBzY2hlbWEpIHsKICAgICAgY29uc3Qgb2JqID0gewogICAgICAgICRzY2hlbWE6IHNjaGVtYSB8fCAiLi9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvY2xpL2xpYi9jb25maWcvc2NoZW1hLmpzb24iLAogICAgICAgIHZlcnNpb246IDEsCiAgICAgICAgLi4ud29ya3NwYWNlLmV4dGVuc2lvbnMsCiAgICAgICAgLi4uaXNFbXB0eSh3b3Jrc3BhY2UucHJvamVjdHMpID8ge30gOiB7IHByb2plY3RzOiBjb252ZXJ0SnNvblByb2plY3RDb2xsZWN0aW9uKHdvcmtzcGFjZS5wcm9qZWN0cykgfQogICAgICB9OwogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgZnVuY3Rpb24gY29udmVydEpzb25Qcm9qZWN0Q29sbGVjdGlvbihjb2xsZWN0aW9uKSB7CiAgICAgIGNvbnN0IHByb2plY3RzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGZvciAoY29uc3QgW3Byb2plY3ROYW1lLCBwcm9qZWN0XSBvZiBjb2xsZWN0aW9uKSB7CiAgICAgICAgcHJvamVjdHNbcHJvamVjdE5hbWVdID0gY29udmVydEpzb25Qcm9qZWN0KHByb2plY3QpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9qZWN0czsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnZlcnRKc29uUHJvamVjdChwcm9qZWN0KSB7CiAgICAgIGxldCB0YXJnZXRzOwogICAgICBpZiAocHJvamVjdC50YXJnZXRzLnNpemUgPiAwKSB7CiAgICAgICAgdGFyZ2V0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGZvciAoY29uc3QgW3RhcmdldE5hbWUsIHRhcmdldF0gb2YgcHJvamVjdC50YXJnZXRzKSB7CiAgICAgICAgICB0YXJnZXRzW3RhcmdldE5hbWVdID0gY29udmVydEpzb25UYXJnZXQodGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgb2JqID0gewogICAgICAgIC4uLnByb2plY3QuZXh0ZW5zaW9ucywKICAgICAgICByb290OiBwcm9qZWN0LnJvb3QsCiAgICAgICAgLi4ucHJvamVjdC5zb3VyY2VSb290ID09PSB2b2lkIDAgPyB7fSA6IHsgc291cmNlUm9vdDogcHJvamVjdC5zb3VyY2VSb290IH0sCiAgICAgICAgLi4ucHJvamVjdC5wcmVmaXggPT09IHZvaWQgMCA/IHt9IDogeyBwcmVmaXg6IHByb2plY3QucHJlZml4IH0sCiAgICAgICAgLi4udGFyZ2V0cyA9PT0gdm9pZCAwID8ge30gOiB7IGFyY2hpdGVjdDogdGFyZ2V0cyB9CiAgICAgIH07CiAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgICBmdW5jdGlvbiBpc0VtcHR5KG9iaikgewogICAgICByZXR1cm4gb2JqID09PSB2b2lkIDAgfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7CiAgICB9CiAgICBmdW5jdGlvbiBjb252ZXJ0SnNvblRhcmdldCh0YXJnZXQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBidWlsZGVyOiB0YXJnZXQuYnVpbGRlciwKICAgICAgICAuLi5pc0VtcHR5KHRhcmdldC5vcHRpb25zKSA/IHt9IDogeyBvcHRpb25zOiB0YXJnZXQub3B0aW9ucyB9LAogICAgICAgIC4uLmlzRW1wdHkodGFyZ2V0LmNvbmZpZ3VyYXRpb25zKSA/IHt9IDogeyBjb25maWd1cmF0aW9uczogdGFyZ2V0LmNvbmZpZ3VyYXRpb25zIH0sCiAgICAgICAgLi4udGFyZ2V0LmRlZmF1bHRDb25maWd1cmF0aW9uID09PSB2b2lkIDAgPyB7fSA6IHsgZGVmYXVsdENvbmZpZ3VyYXRpb246IHRhcmdldC5kZWZhdWx0Q29uZmlndXJhdGlvbiB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjb252ZXJ0SnNvblRhcmdldENvbGxlY3Rpb24oY29sbGVjdGlvbikgewogICAgICBjb25zdCB0YXJnZXRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGZvciAoY29uc3QgW3Byb2plY3ROYW1lLCB0YXJnZXRdIG9mIGNvbGxlY3Rpb24pIHsKICAgICAgICB0YXJnZXRzW3Byb2plY3ROYW1lXSA9IGNvbnZlcnRKc29uVGFyZ2V0KHRhcmdldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldHM7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSkgewogICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAicHJvamVjdCI6CiAgICAgICAgICByZXR1cm4gY29udmVydEpzb25Qcm9qZWN0KHZhbHVlKTsKICAgICAgICBjYXNlICJwcm9qZWN0Y29sbGVjdGlvbiI6IHsKICAgICAgICAgIGNvbnN0IHByb2plY3RzID0gY29udmVydEpzb25Qcm9qZWN0Q29sbGVjdGlvbih2YWx1ZSk7CiAgICAgICAgICByZXR1cm4gaXNFbXB0eShwcm9qZWN0cykgPyB2b2lkIDAgOiBwcm9qZWN0czsKICAgICAgICB9CiAgICAgICAgY2FzZSAidGFyZ2V0IjoKICAgICAgICAgIHJldHVybiBjb252ZXJ0SnNvblRhcmdldCh2YWx1ZSk7CiAgICAgICAgY2FzZSAidGFyZ2V0Y29sbGVjdGlvbiI6IHsKICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb252ZXJ0SnNvblRhcmdldENvbGxlY3Rpb24odmFsdWUpOwogICAgICAgICAgcmV0dXJuIGlzRW1wdHkodGFyZ2V0cykgPyB2b2lkIDAgOiB0YXJnZXRzOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVKc29uV29ya3NwYWNlKG1ldGFkYXRhKSB7CiAgICAgIGxldCB7IHJhdzogY29udGVudCB9ID0gbWV0YWRhdGE7CiAgICAgIGNvbnN0IHsgY2hhbmdlcywgaGFzTGVnYWN5VGFyZ2V0c05hbWUgfSA9IG1ldGFkYXRhOwogICAgICBmb3IgKGNvbnN0IHsganNvblBhdGgsIHZhbHVlLCB0eXBlIH0gb2YgY2hhbmdlcy52YWx1ZXMoKSkgewogICAgICAgIGlmIChoYXNMZWdhY3lUYXJnZXRzTmFtZSAmJiBqc29uUGF0aFsyXSA9PT0gInRhcmdldHMiKSB7CiAgICAgICAgICBqc29uUGF0aFsyXSA9ICJhcmNoaXRlY3QiOwogICAgICAgIH0KICAgICAgICBjb25zdCBlZGl0cyA9ICgwLCBqc29uY19wYXJzZXJfMS5tb2RpZnkpKGNvbnRlbnQsIGpzb25QYXRoLCBub3JtYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSksIHsKICAgICAgICAgIGZvcm1hdHRpbmdPcHRpb25zOiB7CiAgICAgICAgICAgIGluc2VydFNwYWNlczogdHJ1ZSwKICAgICAgICAgICAgdGFiU2l6ZTogMiwKICAgICAgICAgICAgZW9sOiBnZXRFT0woY29udGVudCkKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBjb250ZW50ID0gKDAsIGpzb25jX3BhcnNlcl8xLmFwcGx5RWRpdHMpKGNvbnRlbnQsIGVkaXRzKTsKICAgICAgfQogICAgICByZXR1cm4gY29udGVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEVPTChjb250ZW50KSB7CiAgICAgIGNvbnN0IENSTEYgPSAiXHJcbiI7CiAgICAgIGNvbnN0IExGID0gIlxuIjsKICAgICAgY29uc3QgbmV3bGluZXMgPSBjb250ZW50Lm1hdGNoKC8oPzpccj9cbikvZyk7CiAgICAgIGlmIChuZXdsaW5lcz8ubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcigobCkgPT4gbCA9PT0gQ1JMRikubGVuZ3RoOwogICAgICAgIGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjsKICAgICAgICByZXR1cm4gY3JsZiA+IGxmID8gQ1JMRiA6IExGOwogICAgICB9CiAgICAgIHJldHVybiBub2RlX29zXzEuRU9MOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvY29yZS5qcwp2YXIgcmVxdWlyZV9jb3JlMyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvY29yZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuV29ya3NwYWNlRm9ybWF0ID0gdm9pZCAwOwogICAgZXhwb3J0czIuX3Rlc3RfYWRkV29ya3NwYWNlRmlsZSA9IF90ZXN0X2FkZFdvcmtzcGFjZUZpbGU7CiAgICBleHBvcnRzMi5fdGVzdF9yZW1vdmVXb3Jrc3BhY2VGaWxlID0gX3Rlc3RfcmVtb3ZlV29ya3NwYWNlRmlsZTsKICAgIGV4cG9ydHMyLnJlYWRXb3Jrc3BhY2UgPSByZWFkV29ya3NwYWNlOwogICAgZXhwb3J0czIud3JpdGVXb3Jrc3BhY2UgPSB3cml0ZVdvcmtzcGFjZTsKICAgIHZhciB2aXJ0dWFsX2ZzXzEgPSByZXF1aXJlX3ZpcnR1YWxfZnMoKTsKICAgIHZhciByZWFkZXJfMSA9IHJlcXVpcmVfcmVhZGVyKCk7CiAgICB2YXIgd3JpdGVyXzEgPSByZXF1aXJlX3dyaXRlcigpOwogICAgdmFyIGZvcm1hdExvb2t1cCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdmFyIFdvcmtzcGFjZUZvcm1hdDsKICAgIChmdW5jdGlvbihXb3Jrc3BhY2VGb3JtYXQyKSB7CiAgICAgIFdvcmtzcGFjZUZvcm1hdDJbV29ya3NwYWNlRm9ybWF0MlsiSlNPTiJdID0gMF0gPSAiSlNPTiI7CiAgICB9KShXb3Jrc3BhY2VGb3JtYXQgfHwgKGV4cG9ydHMyLldvcmtzcGFjZUZvcm1hdCA9IFdvcmtzcGFjZUZvcm1hdCA9IHt9KSk7CiAgICBmdW5jdGlvbiBfdGVzdF9hZGRXb3Jrc3BhY2VGaWxlKG5hbWUsIGZvcm1hdCkgewogICAgICB3b3Jrc3BhY2VGaWxlc1tuYW1lXSA9IGZvcm1hdDsKICAgIH0KICAgIGZ1bmN0aW9uIF90ZXN0X3JlbW92ZVdvcmtzcGFjZUZpbGUobmFtZSkgewogICAgICBkZWxldGUgd29ya3NwYWNlRmlsZXNbbmFtZV07CiAgICB9CiAgICB2YXIgd29ya3NwYWNlRmlsZXMgPSB7CiAgICAgICJhbmd1bGFyLmpzb24iOiBXb3Jrc3BhY2VGb3JtYXQuSlNPTiwKICAgICAgIi5hbmd1bGFyLmpzb24iOiBXb3Jrc3BhY2VGb3JtYXQuSlNPTgogICAgfTsKICAgIGFzeW5jIGZ1bmN0aW9uIHJlYWRXb3Jrc3BhY2UocGF0aCwgaG9zdCwgZm9ybWF0KSB7CiAgICAgIGlmIChhd2FpdCBob3N0LmlzRGlyZWN0b3J5KHBhdGgpKSB7CiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gKDAsIHZpcnR1YWxfZnNfMS5ub3JtYWxpemUpKHBhdGgpOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoY29uc3QgW25hbWUsIG5hbWVGb3JtYXRdIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtzcGFjZUZpbGVzKSkgewogICAgICAgICAgaWYgKGZvcm1hdCAhPT0gdm9pZCAwICYmIGZvcm1hdCAhPT0gbmFtZUZvcm1hdCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9ICgwLCB2aXJ0dWFsX2ZzXzEuZ2V0U3lzdGVtUGF0aCkoKDAsIHZpcnR1YWxfZnNfMS5qb2luKShkaXJlY3RvcnksIG5hbWUpKTsKICAgICAgICAgIGlmIChhd2FpdCBob3N0LmlzRmlsZShwb3RlbnRpYWwpKSB7CiAgICAgICAgICAgIHBhdGggPSBwb3RlbnRpYWw7CiAgICAgICAgICAgIGZvcm1hdCA9IG5hbWVGb3JtYXQ7CiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBhIHdvcmtzcGFjZSBmaWxlIGZvciB3b3Jrc3BhY2UgcGF0aC4gQXJlIHlvdSBtaXNzaW5nIGFuIGBhbmd1bGFyLmpzb25gIG9yIGAuYW5ndWxhci5qc29uYCBmaWxlPyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IGZpbGVuYW1lID0gKDAsIHZpcnR1YWxfZnNfMS5iYXNlbmFtZSkoKDAsIHZpcnR1YWxfZnNfMS5ub3JtYWxpemUpKHBhdGgpKTsKICAgICAgICBpZiAoZmlsZW5hbWUgaW4gd29ya3NwYWNlRmlsZXMpIHsKICAgICAgICAgIGZvcm1hdCA9IHdvcmtzcGFjZUZpbGVzW2ZpbGVuYW1lXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGZvcm1hdCBmb3Igd29ya3NwYWNlIHBhdGguIik7CiAgICAgIH0KICAgICAgbGV0IHdvcmtzcGFjZTsKICAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICBjYXNlIFdvcmtzcGFjZUZvcm1hdC5KU09OOgogICAgICAgICAgd29ya3NwYWNlID0gYXdhaXQgKDAsIHJlYWRlcl8xLnJlYWRKc29uV29ya3NwYWNlKShwYXRoLCBob3N0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHdvcmtzcGFjZSBmb3JtYXQuIik7CiAgICAgIH0KICAgICAgZm9ybWF0TG9va3VwLnNldCh3b3Jrc3BhY2UsIFdvcmtzcGFjZUZvcm1hdC5KU09OKTsKICAgICAgcmV0dXJuIHsgd29ya3NwYWNlIH07CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtzcGFjZSh3b3Jrc3BhY2UsIGhvc3QsIHBhdGgsIGZvcm1hdCkgewogICAgICBpZiAoZm9ybWF0ID09PSB2b2lkIDApIHsKICAgICAgICBmb3JtYXQgPSBmb3JtYXRMb29rdXAuZ2V0KHdvcmtzcGFjZSk7CiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkEgZm9ybWF0IGlzIHJlcXVpcmVkIGZvciBjdXN0b20gd29ya3NwYWNlIG9iamVjdHMuIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgY2FzZSBXb3Jrc3BhY2VGb3JtYXQuSlNPTjoKICAgICAgICAgIHJldHVybiAoMCwgd3JpdGVyXzEud3JpdGVKc29uV29ya3NwYWNlKSh3b3Jrc3BhY2UsIGhvc3QsIHBhdGgpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHdvcmtzcGFjZSBmb3JtYXQuIik7CiAgICAgIH0KICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2luZGV4LmpzCnZhciByZXF1aXJlX3dvcmtzcGFjZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19jcmVhdGVCaW5kaW5nID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgICBpZiAoIWRlc2MgfHwgKCJnZXQiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG1ba107CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7CiAgICB9IDogZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgb1trMl0gPSBtW2tdOwogICAgfSk7CiAgICB2YXIgX19leHBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHBvcnRTdGFyIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMzKSB7CiAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09ICJkZWZhdWx0IiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMzLCBtLCBwKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLndyaXRlV29ya3NwYWNlID0gZXhwb3J0czIucmVhZFdvcmtzcGFjZSA9IGV4cG9ydHMyLldvcmtzcGFjZUZvcm1hdCA9IGV4cG9ydHMyLmNyZWF0ZVdvcmtzcGFjZUhvc3QgPSB2b2lkIDA7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9kZWZpbml0aW9ucygpLCBleHBvcnRzMik7CiAgICB2YXIgaG9zdF8xID0gcmVxdWlyZV9ob3N0MigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiY3JlYXRlV29ya3NwYWNlSG9zdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGhvc3RfMS5jcmVhdGVXb3Jrc3BhY2VIb3N0OwogICAgfSB9KTsKICAgIHZhciBjb3JlXzEgPSByZXF1aXJlX2NvcmUzKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJXb3Jrc3BhY2VGb3JtYXQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb3JlXzEuV29ya3NwYWNlRm9ybWF0OwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlYWRXb3Jrc3BhY2UiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb3JlXzEucmVhZFdvcmtzcGFjZTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJ3cml0ZVdvcmtzcGFjZSIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvcmVfMS53cml0ZVdvcmtzcGFjZTsKICAgIH0gfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2luZGV4LmpzCnZhciByZXF1aXJlX3NyYyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9fX3ZpcnR1YWxfXy9AYW5ndWxhci1kZXZraXQtY29yZS12aXJ0dWFsLWM5NmM2ZTkwMDkvMC9jYWNoZS9AYW5ndWxhci1kZXZraXQtY29yZS1ucG0tMTkuMS41LThjYWRiMzg3NWYtN2Q4MWZkMTA0Ny56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2NyZWF0ZUJpbmRpbmcgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7CiAgICAgIGlmICghZGVzYyB8fCAoImdldCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbVtrXTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTsKICAgIH0gOiBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBvW2syXSA9IG1ba107CiAgICB9KTsKICAgIHZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCB2KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7CiAgICB9IDogZnVuY3Rpb24obywgdikgewogICAgICBvWyJkZWZhdWx0Il0gPSB2OwogICAgfSk7CiAgICB2YXIgX19pbXBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19pbXBvcnRTdGFyIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8yKSB7CiAgICAgICAgICB2YXIgYXIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGsgaW4gbzIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzIsIGspKSBhclthci5sZW5ndGhdID0gazsKICAgICAgICAgIHJldHVybiBhcjsKICAgICAgICB9OwogICAgICAgIHJldHVybiBvd25LZXlzKG8pOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24obW9kKSB7CiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSAiZGVmYXVsdCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7CiAgICAgICAgfQogICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0oKTsKICAgIHZhciBfX2V4cG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4cG9ydFN0YXIgfHwgZnVuY3Rpb24obSwgZXhwb3J0czMpIHsKICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0czMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0czMsIG0sIHApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIud29ya3NwYWNlcyA9IGV4cG9ydHMyLmxvZ2dpbmcgPSBleHBvcnRzMi5qc29uID0gdm9pZCAwOwogICAgdmFyIGpzb24gPSBfX2ltcG9ydFN0YXIocmVxdWlyZV9qc29uKCkpOwogICAgZXhwb3J0czIuanNvbiA9IGpzb247CiAgICB2YXIgbG9nZ2luZyA9IF9faW1wb3J0U3RhcihyZXF1aXJlX2xvZ2dlcjIoKSk7CiAgICBleHBvcnRzMi5sb2dnaW5nID0gbG9nZ2luZzsKICAgIHZhciB3b3Jrc3BhY2VzID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfd29ya3NwYWNlKCkpOwogICAgZXhwb3J0czIud29ya3NwYWNlcyA9IHdvcmtzcGFjZXM7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9leGNlcHRpb24oKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfanNvbigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV91dGlsczMoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfdmlydHVhbF9mcygpLCBleHBvcnRzMik7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2Zvcm1hdHMvaHRtbC1zZWxlY3Rvci5qcwp2YXIgcmVxdWlyZV9odG1sX3NlbGVjdG9yID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2Zvcm1hdHMvaHRtbC1zZWxlY3Rvci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuaHRtbFNlbGVjdG9yRm9ybWF0ID0gdm9pZCAwOwogICAgdmFyIHVuaWNvZGVSYW5nZXMgPSBbCiAgICAgIFsxOTIsIDIxNF0sCiAgICAgIFsyMTYsIDI0Nl0sCiAgICAgIFsyNDgsIDg5M10sCiAgICAgIFs4OTUsIDgxOTFdLAogICAgICBbODIwNCwgODIwNV0sCiAgICAgIFs4MjU1LCA4MjU2XSwKICAgICAgWzgzMDQsIDg1OTFdLAogICAgICBbMTEyNjQsIDEyMjcxXSwKICAgICAgWzEyMjg5LCA1NTI5NV0sCiAgICAgIFs2Mzc0NCwgNjQ5NzVdLAogICAgICBbNjUwMDgsIDY1NTMzXSwKICAgICAgWzY1NTM2LCA5ODMwMzldCiAgICBdOwogICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnROYW1lKG5hbWUpIHsKICAgICAgbGV0IHJlZ2V4ID0gIl5bYS16QS1aXVsiOwogICAgICByZWdleCArPSAiLS4wLTlfYS16QS1aXFx1e0I3fSI7CiAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2YgdW5pY29kZVJhbmdlcykgewogICAgICAgIHJlZ2V4ICs9IGBcXHV7JHtyYW5nZVswXS50b1N0cmluZygxNil9fS1cXHV7JHtyYW5nZVsxXS50b1N0cmluZygxNil9fWA7CiAgICAgIH0KICAgICAgcmVnZXggKz0gIl0qJCI7CiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4LCAidSIpLnRlc3QobmFtZSk7CiAgICB9CiAgICBleHBvcnRzMi5odG1sU2VsZWN0b3JGb3JtYXQgPSB7CiAgICAgIG5hbWU6ICJodG1sLXNlbGVjdG9yIiwKICAgICAgZm9ybWF0dGVyOiB7CiAgICAgICAgYXN5bmM6IGZhbHNlLAogICAgICAgIHZhbGlkYXRlOiAobmFtZSkgPT4gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciICYmIGlzVmFsaWRFbGVtZW50TmFtZShuYW1lKQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9mb3JtYXRzL3BhdGguanMKdmFyIHJlcXVpcmVfcGF0aDIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZm9ybWF0cy9wYXRoLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5wYXRoRm9ybWF0ID0gdm9pZCAwOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICBleHBvcnRzMi5wYXRoRm9ybWF0ID0gewogICAgICBuYW1lOiAicGF0aCIsCiAgICAgIGZvcm1hdHRlcjogewogICAgICAgIGFzeW5jOiBmYWxzZSwKICAgICAgICB2YWxpZGF0ZTogKHBhdGgpID0+IHsKICAgICAgICAgIHJldHVybiBwYXRoID09PSAoMCwgY29yZV8xLm5vcm1hbGl6ZSkocGF0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9mb3JtYXRzL2luZGV4LmpzCnZhciByZXF1aXJlX2Zvcm1hdHMyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2Zvcm1hdHMvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnN0YW5kYXJkRm9ybWF0cyA9IGV4cG9ydHMyLnBhdGhGb3JtYXQgPSBleHBvcnRzMi5odG1sU2VsZWN0b3JGb3JtYXQgPSB2b2lkIDA7CiAgICB2YXIgaHRtbF9zZWxlY3Rvcl8xID0gcmVxdWlyZV9odG1sX3NlbGVjdG9yKCk7CiAgICB2YXIgcGF0aF8xID0gcmVxdWlyZV9wYXRoMigpOwogICAgdmFyIGh0bWxfc2VsZWN0b3JfMiA9IHJlcXVpcmVfaHRtbF9zZWxlY3RvcigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiaHRtbFNlbGVjdG9yRm9ybWF0IiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaHRtbF9zZWxlY3Rvcl8yLmh0bWxTZWxlY3RvckZvcm1hdDsKICAgIH0gfSk7CiAgICB2YXIgcGF0aF8yID0gcmVxdWlyZV9wYXRoMigpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAicGF0aEZvcm1hdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHBhdGhfMi5wYXRoRm9ybWF0OwogICAgfSB9KTsKICAgIGV4cG9ydHMyLnN0YW5kYXJkRm9ybWF0cyA9IFtodG1sX3NlbGVjdG9yXzEuaHRtbFNlbGVjdG9yRm9ybWF0LCBwYXRoXzEucGF0aEZvcm1hdF07CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvaW50ZXJmYWNlLmpzCnZhciByZXF1aXJlX2ludGVyZmFjZTMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9pbnRlcmZhY2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlRyZWUgPSBleHBvcnRzMi5UcmVlU3ltYm9sID0gZXhwb3J0czIuRmlsZVZpc2l0b3JDYW5jZWxUb2tlbiA9IGV4cG9ydHMyLk1lcmdlU3RyYXRlZ3kgPSB2b2lkIDA7CiAgICB2YXIgTWVyZ2VTdHJhdGVneTI7CiAgICAoZnVuY3Rpb24oTWVyZ2VTdHJhdGVneTMpIHsKICAgICAgTWVyZ2VTdHJhdGVneTNbTWVyZ2VTdHJhdGVneTNbIkFsbG93T3ZlcndyaXRlQ29uZmxpY3QiXSA9IDJdID0gIkFsbG93T3ZlcndyaXRlQ29uZmxpY3QiOwogICAgICBNZXJnZVN0cmF0ZWd5M1tNZXJnZVN0cmF0ZWd5M1siQWxsb3dDcmVhdGlvbkNvbmZsaWN0Il0gPSA0XSA9ICJBbGxvd0NyZWF0aW9uQ29uZmxpY3QiOwogICAgICBNZXJnZVN0cmF0ZWd5M1tNZXJnZVN0cmF0ZWd5M1siQWxsb3dEZWxldGVDb25mbGljdCJdID0gOF0gPSAiQWxsb3dEZWxldGVDb25mbGljdCI7CiAgICAgIE1lcmdlU3RyYXRlZ3kzW01lcmdlU3RyYXRlZ3kzWyJEZWZhdWx0Il0gPSAwXSA9ICJEZWZhdWx0IjsKICAgICAgTWVyZ2VTdHJhdGVneTNbTWVyZ2VTdHJhdGVneTNbIkVycm9yIl0gPSAxXSA9ICJFcnJvciI7CiAgICAgIE1lcmdlU3RyYXRlZ3kzW01lcmdlU3RyYXRlZ3kzWyJDb250ZW50T25seSJdID0gMl0gPSAiQ29udGVudE9ubHkiOwogICAgICBNZXJnZVN0cmF0ZWd5M1tNZXJnZVN0cmF0ZWd5M1siT3ZlcndyaXRlIl0gPSAxNF0gPSAiT3ZlcndyaXRlIjsKICAgIH0pKE1lcmdlU3RyYXRlZ3kyIHx8IChleHBvcnRzMi5NZXJnZVN0cmF0ZWd5ID0gTWVyZ2VTdHJhdGVneTIgPSB7fSkpOwogICAgZXhwb3J0czIuRmlsZVZpc2l0b3JDYW5jZWxUb2tlbiA9IFN5bWJvbCgpOwogICAgZXhwb3J0czIuVHJlZVN5bWJvbCA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBnbG9iYWxTeW1ib2wgPSB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvdy53aW5kb3cgPT09IHdpbmRvdyAmJiB3aW5kb3cuU3ltYm9sIHx8IHR5cGVvZiBzZWxmID09ICJvYmplY3QiICYmIHNlbGYuc2VsZiA9PT0gc2VsZiAmJiBzZWxmLlN5bWJvbCB8fCB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbCAmJiBnbG9iYWwuU3ltYm9sOwogICAgICBpZiAoIWdsb2JhbFN5bWJvbCkgewogICAgICAgIHJldHVybiBTeW1ib2woInNjaGVtYXRpYy10cmVlIik7CiAgICAgIH0KICAgICAgaWYgKCFnbG9iYWxTeW1ib2wuc2NoZW1hdGljVHJlZSkgewogICAgICAgIGdsb2JhbFN5bWJvbC5zY2hlbWF0aWNUcmVlID0gU3ltYm9sKCJzY2hlbWF0aWMtdHJlZSIpOwogICAgICB9CiAgICAgIHJldHVybiBnbG9iYWxTeW1ib2wuc2NoZW1hdGljVHJlZTsKICAgIH0oKTsKICAgIGV4cG9ydHMyLlRyZWUgPSBPYmplY3QuZnJlZXplKHsKICAgICAgaXNUcmVlKG1heWJlVHJlZSkgewogICAgICAgIHJldHVybiBleHBvcnRzMi5UcmVlU3ltYm9sIGluIG1heWJlVHJlZTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2V4Y2VwdGlvbi9leGNlcHRpb24uanMKdmFyIHJlcXVpcmVfZXhjZXB0aW9uMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9leGNlcHRpb24vZXhjZXB0aW9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5VbmltcGxlbWVudGVkRXhjZXB0aW9uID0gZXhwb3J0czIuVW5zdWNjZXNzZnVsV29ya2Zsb3dFeGVjdXRpb24gPSBleHBvcnRzMi5NZXJnZUNvbmZsaWN0RXhjZXB0aW9uID0gZXhwb3J0czIuSW52YWxpZFVwZGF0ZVJlY29yZEV4Y2VwdGlvbiA9IGV4cG9ydHMyLkNvbnRlbnRIYXNNdXRhdGVkRXhjZXB0aW9uID0gZXhwb3J0czIuRmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbiA9IGV4cG9ydHMyLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24gPSBleHBvcnRzMi5TY2hlbWF0aWNzRXhjZXB0aW9uID0gdm9pZCAwOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICB2YXIgU2NoZW1hdGljc0V4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgfTsKICAgIGV4cG9ydHMyLlNjaGVtYXRpY3NFeGNlcHRpb24gPSBTY2hlbWF0aWNzRXhjZXB0aW9uOwogICAgdmFyIEZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IocGF0aCkgewogICAgICAgIHN1cGVyKGBQYXRoICIke3BhdGh9IiBkb2VzIG5vdCBleGlzdC5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24gPSBGaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uOwogICAgdmFyIEZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IocGF0aCkgewogICAgICAgIHN1cGVyKGBQYXRoICIke3BhdGh9IiBhbHJlYWR5IGV4aXN0LmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbiA9IEZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb247CiAgICB2YXIgQ29udGVudEhhc011dGF0ZWRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IocGF0aCkgewogICAgICAgIHN1cGVyKGBDb250ZW50IGF0IHBhdGggIiR7cGF0aH0iIGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIGFuIHVwZGF0ZS5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNvbnRlbnRIYXNNdXRhdGVkRXhjZXB0aW9uID0gQ29udGVudEhhc011dGF0ZWRFeGNlcHRpb247CiAgICB2YXIgSW52YWxpZFVwZGF0ZVJlY29yZEV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcihgSW52YWxpZCByZWNvcmQgaW5zdGFuY2UuYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5JbnZhbGlkVXBkYXRlUmVjb3JkRXhjZXB0aW9uID0gSW52YWxpZFVwZGF0ZVJlY29yZEV4Y2VwdGlvbjsKICAgIHZhciBNZXJnZUNvbmZsaWN0RXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKHBhdGgpIHsKICAgICAgICBzdXBlcihgQSBtZXJnZSBjb25mbGljdGVkIG9uIHBhdGggIiR7cGF0aH0iLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuTWVyZ2VDb25mbGljdEV4Y2VwdGlvbiA9IE1lcmdlQ29uZmxpY3RFeGNlcHRpb247CiAgICB2YXIgVW5zdWNjZXNzZnVsV29ya2Zsb3dFeGVjdXRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoIldvcmtmbG93IGRpZCBub3QgZXhlY3V0ZSBzdWNjZXNzZnVsbHkuIik7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5VbnN1Y2Nlc3NmdWxXb3JrZmxvd0V4ZWN1dGlvbiA9IFVuc3VjY2Vzc2Z1bFdvcmtmbG93RXhlY3V0aW9uOwogICAgdmFyIFVuaW1wbGVtZW50ZWRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoIlRoaXMgZnVuY3Rpb24gaXMgdW5pbXBsZW1lbnRlZC4iKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlVuaW1wbGVtZW50ZWRFeGNlcHRpb24gPSBVbmltcGxlbWVudGVkRXhjZXB0aW9uOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL2RlbGVnYXRlLmpzCnZhciByZXF1aXJlX2RlbGVnYXRlID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvZGVsZWdhdGUuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkRlbGVnYXRlVHJlZSA9IHZvaWQgMDsKICAgIHZhciBpbnRlcmZhY2VfMSA9IHJlcXVpcmVfaW50ZXJmYWNlMygpOwogICAgdmFyIERlbGVnYXRlVHJlZSA9IGNsYXNzIHsKICAgICAgX290aGVyOwogICAgICBjb25zdHJ1Y3Rvcihfb3RoZXIpIHsKICAgICAgICB0aGlzLl9vdGhlciA9IF9vdGhlcjsKICAgICAgfQogICAgICBicmFuY2goKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLmJyYW5jaCgpOwogICAgICB9CiAgICAgIG1lcmdlKG90aGVyLCBzdHJhdGVneSkgewogICAgICAgIHRoaXMuX290aGVyLm1lcmdlKG90aGVyLCBzdHJhdGVneSk7CiAgICAgIH0KICAgICAgZ2V0IHJvb3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLnJvb3Q7CiAgICAgIH0KICAgICAgLy8gUmVhZG9ubHkuCiAgICAgIHJlYWQocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdGhlci5yZWFkKHBhdGgpOwogICAgICB9CiAgICAgIHJlYWRUZXh0KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXIucmVhZFRleHQocGF0aCk7CiAgICAgIH0KICAgICAgcmVhZEpzb24ocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdGhlci5yZWFkSnNvbihwYXRoKTsKICAgICAgfQogICAgICBleGlzdHMocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdGhlci5leGlzdHMocGF0aCk7CiAgICAgIH0KICAgICAgZ2V0KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXIuZ2V0KHBhdGgpOwogICAgICB9CiAgICAgIGdldERpcihwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLmdldERpcihwYXRoKTsKICAgICAgfQogICAgICB2aXNpdCh2aXNpdG9yKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLnZpc2l0KHZpc2l0b3IpOwogICAgICB9CiAgICAgIC8vIENoYW5nZSBjb250ZW50IG9mIGhvc3QgZmlsZXMuCiAgICAgIG92ZXJ3cml0ZShwYXRoLCBjb250ZW50KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLm92ZXJ3cml0ZShwYXRoLCBjb250ZW50KTsKICAgICAgfQogICAgICBiZWdpblVwZGF0ZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLmJlZ2luVXBkYXRlKHBhdGgpOwogICAgICB9CiAgICAgIGNvbW1pdFVwZGF0ZShyZWNvcmQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXIuY29tbWl0VXBkYXRlKHJlY29yZCk7CiAgICAgIH0KICAgICAgLy8gU3RydWN0dXJhbCBtZXRob2RzLgogICAgICBjcmVhdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdGhlci5jcmVhdGUocGF0aCwgY29udGVudCk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXIuZGVsZXRlKHBhdGgpOwogICAgICB9CiAgICAgIHJlbmFtZShmcm9tLCB0bykgewogICAgICAgIHJldHVybiB0aGlzLl9vdGhlci5yZW5hbWUoZnJvbSwgdG8pOwogICAgICB9CiAgICAgIGFwcGx5KGFjdGlvbiwgc3RyYXRlZ3kpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXIuYXBwbHkoYWN0aW9uLCBzdHJhdGVneSk7CiAgICAgIH0KICAgICAgZ2V0IGFjdGlvbnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX290aGVyLmFjdGlvbnM7CiAgICAgIH0KICAgICAgW2ludGVyZmFjZV8xLlRyZWVTeW1ib2xdKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRGVsZWdhdGVUcmVlID0gRGVsZWdhdGVUcmVlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL2VudHJ5LmpzCnZhciByZXF1aXJlX2VudHJ5ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvZW50cnkuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkxhenlGaWxlRW50cnkgPSBleHBvcnRzMi5TaW1wbGVGaWxlRW50cnkgPSB2b2lkIDA7CiAgICB2YXIgU2ltcGxlRmlsZUVudHJ5ID0gY2xhc3MgewogICAgICBfcGF0aDsKICAgICAgX2NvbnRlbnQ7CiAgICAgIGNvbnN0cnVjdG9yKF9wYXRoLCBfY29udGVudCkgewogICAgICAgIHRoaXMuX3BhdGggPSBfcGF0aDsKICAgICAgICB0aGlzLl9jb250ZW50ID0gX2NvbnRlbnQ7CiAgICAgIH0KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGg7CiAgICAgIH0KICAgICAgZ2V0IGNvbnRlbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5TaW1wbGVGaWxlRW50cnkgPSBTaW1wbGVGaWxlRW50cnk7CiAgICB2YXIgTGF6eUZpbGVFbnRyeSA9IGNsYXNzIHsKICAgICAgX3BhdGg7CiAgICAgIF9sb2FkOwogICAgICBfY29udGVudCA9IG51bGw7CiAgICAgIGNvbnN0cnVjdG9yKF9wYXRoLCBfbG9hZCkgewogICAgICAgIHRoaXMuX3BhdGggPSBfcGF0aDsKICAgICAgICB0aGlzLl9sb2FkID0gX2xvYWQ7CiAgICAgIH0KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGg7CiAgICAgIH0KICAgICAgZ2V0IGNvbnRlbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQgfHwgKHRoaXMuX2NvbnRlbnQgPSB0aGlzLl9sb2FkKHRoaXMuX3BhdGgpKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkxhenlGaWxlRW50cnkgPSBMYXp5RmlsZUVudHJ5OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AanJpZGdld2VsbC1zb3VyY2VtYXAtY29kZWMtbnBtLTEuNS4wLWRmZDkxMjZkNzEtNGVkNjEyMzIxNy56aXAvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy9kaXN0L3NvdXJjZW1hcC1jb2RlYy51bWQuanMKdmFyIHJlcXVpcmVfc291cmNlbWFwX2NvZGVjX3VtZCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AanJpZGdld2VsbC1zb3VyY2VtYXAtY29kZWMtbnBtLTEuNS4wLWRmZDkxMjZkNzEtNGVkNjEyMzIxNy56aXAvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy9kaXN0L3NvdXJjZW1hcC1jb2RlYy51bWQuanMiKGV4cG9ydHMyLCBtb2R1bGUyKSB7CiAgICAoZnVuY3Rpb24oZ2xvYmFsMiwgZmFjdG9yeSkgewogICAgICB0eXBlb2YgZXhwb3J0czIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUyICE9PSAidW5kZWZpbmVkIiA/IGZhY3RvcnkoZXhwb3J0czIpIDogdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsiZXhwb3J0cyJdLCBmYWN0b3J5KSA6IChnbG9iYWwyID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsVGhpcyA6IGdsb2JhbDIgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwyLnNvdXJjZW1hcENvZGVjID0ge30pKTsKICAgIH0pKGV4cG9ydHMyLCBmdW5jdGlvbihleHBvcnRzMykgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIGNvbnN0IGNvbW1hID0gIiwiLmNoYXJDb2RlQXQoMCk7CiAgICAgIGNvbnN0IHNlbWljb2xvbiA9ICI7Ii5jaGFyQ29kZUF0KDApOwogICAgICBjb25zdCBjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICAgICAgY29uc3QgaW50VG9DaGFyID0gbmV3IFVpbnQ4QXJyYXkoNjQpOwogICAgICBjb25zdCBjaGFyVG9JbnQgPSBuZXcgVWludDhBcnJheSgxMjgpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYyA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaW50VG9DaGFyW2ldID0gYzsKICAgICAgICBjaGFyVG9JbnRbY10gPSBpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRlY29kZUludGVnZXIocmVhZGVyLCByZWxhdGl2ZSkgewogICAgICAgIGxldCB2YWx1ZSA9IDA7CiAgICAgICAgbGV0IHNoaWZ0ID0gMDsKICAgICAgICBsZXQgaW50ZWdlciA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgY29uc3QgYyA9IHJlYWRlci5uZXh0KCk7CiAgICAgICAgICBpbnRlZ2VyID0gY2hhclRvSW50W2NdOwogICAgICAgICAgdmFsdWUgfD0gKGludGVnZXIgJiAzMSkgPDwgc2hpZnQ7CiAgICAgICAgICBzaGlmdCArPSA1OwogICAgICAgIH0gd2hpbGUgKGludGVnZXIgJiAzMik7CiAgICAgICAgY29uc3Qgc2hvdWxkTmVnYXRlID0gdmFsdWUgJiAxOwogICAgICAgIHZhbHVlID4+Pj0gMTsKICAgICAgICBpZiAoc2hvdWxkTmVnYXRlKSB7CiAgICAgICAgICB2YWx1ZSA9IC0yMTQ3NDgzNjQ4IHwgLXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVsYXRpdmUgKyB2YWx1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBlbmNvZGVJbnRlZ2VyKGJ1aWxkZXIsIG51bSwgcmVsYXRpdmUpIHsKICAgICAgICBsZXQgZGVsdGEgPSBudW0gLSByZWxhdGl2ZTsKICAgICAgICBkZWx0YSA9IGRlbHRhIDwgMCA/IC1kZWx0YSA8PCAxIHwgMSA6IGRlbHRhIDw8IDE7CiAgICAgICAgZG8gewogICAgICAgICAgbGV0IGNsYW1wZWQgPSBkZWx0YSAmIDMxOwogICAgICAgICAgZGVsdGEgPj4+PSA1OwogICAgICAgICAgaWYgKGRlbHRhID4gMCkKICAgICAgICAgICAgY2xhbXBlZCB8PSAzMjsKICAgICAgICAgIGJ1aWxkZXIud3JpdGUoaW50VG9DaGFyW2NsYW1wZWRdKTsKICAgICAgICB9IHdoaWxlIChkZWx0YSA+IDApOwogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaGFzTW9yZVZscShyZWFkZXIsIG1heCkgewogICAgICAgIGlmIChyZWFkZXIucG9zID49IG1heCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gcmVhZGVyLnBlZWsoKSAhPT0gY29tbWE7CiAgICAgIH0KICAgICAgY29uc3QgYnVmTGVuZ3RoID0gMTAyNCAqIDE2OwogICAgICBjb25zdCB0ZCA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gInVuZGVmaW5lZCIgPyAvKiBAX19QVVJFX18gKi8gbmV3IFRleHREZWNvZGVyKCkgOiB0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIiA/IHsKICAgICAgICBkZWNvZGUoYnVmKSB7CiAgICAgICAgICBjb25zdCBvdXQgPSBCdWZmZXIuZnJvbShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpOwogICAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgfSA6IHsKICAgICAgICBkZWNvZGUoYnVmKSB7CiAgICAgICAgICBsZXQgb3V0ID0gIiI7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGNsYXNzIFN0cmluZ1dyaXRlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICB0aGlzLnBvcyA9IDA7CiAgICAgICAgICB0aGlzLm91dCA9ICIiOwogICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheShidWZMZW5ndGgpOwogICAgICAgIH0KICAgICAgICB3cml0ZSh2KSB7CiAgICAgICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gdGhpczsKICAgICAgICAgIGJ1ZmZlclt0aGlzLnBvcysrXSA9IHY7CiAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IGJ1Zkxlbmd0aCkgewogICAgICAgICAgICB0aGlzLm91dCArPSB0ZC5kZWNvZGUoYnVmZmVyKTsKICAgICAgICAgICAgdGhpcy5wb3MgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmbHVzaCgpIHsKICAgICAgICAgIGNvbnN0IHsgYnVmZmVyLCBvdXQsIHBvcyB9ID0gdGhpczsKICAgICAgICAgIHJldHVybiBwb3MgPiAwID8gb3V0ICsgdGQuZGVjb2RlKGJ1ZmZlci5zdWJhcnJheSgwLCBwb3MpKSA6IG91dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xhc3MgU3RyaW5nUmVhZGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHsKICAgICAgICAgIHRoaXMucG9zID0gMDsKICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgICAgIH0KICAgICAgICBuZXh0KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5wb3MrKyk7CiAgICAgICAgfQogICAgICAgIHBlZWsoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLnBvcyk7CiAgICAgICAgfQogICAgICAgIGluZGV4T2YoY2hhcikgewogICAgICAgICAgY29uc3QgeyBidWZmZXIsIHBvcyB9ID0gdGhpczsKICAgICAgICAgIGNvbnN0IGlkeCA9IGJ1ZmZlci5pbmRleE9mKGNoYXIsIHBvcyk7CiAgICAgICAgICByZXR1cm4gaWR4ID09PSAtMSA/IGJ1ZmZlci5sZW5ndGggOiBpZHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IEVNUFRZID0gW107CiAgICAgIGZ1bmN0aW9uIGRlY29kZU9yaWdpbmFsU2NvcGVzKGlucHV0KSB7CiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IGlucHV0OwogICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpOwogICAgICAgIGNvbnN0IHNjb3BlcyA9IFtdOwogICAgICAgIGNvbnN0IHN0YWNrID0gW107CiAgICAgICAgbGV0IGxpbmUgPSAwOwogICAgICAgIGZvciAoOyByZWFkZXIucG9zIDwgbGVuZ3RoOyByZWFkZXIucG9zKyspIHsKICAgICAgICAgIGxpbmUgPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgbGluZSk7CiAgICAgICAgICBjb25zdCBjb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgMCk7CiAgICAgICAgICBpZiAoIWhhc01vcmVWbHEocmVhZGVyLCBsZW5ndGgpKSB7CiAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgbGFzdFsyXSA9IGxpbmU7CiAgICAgICAgICAgIGxhc3RbM10gPSBjb2x1bW47CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qga2luZCA9IGRlY29kZUludGVnZXIocmVhZGVyLCAwKTsKICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IGRlY29kZUludGVnZXIocmVhZGVyLCAwKTsKICAgICAgICAgIGNvbnN0IGhhc05hbWUgPSBmaWVsZHMgJiAxOwogICAgICAgICAgY29uc3Qgc2NvcGUgPSBoYXNOYW1lID8gW2xpbmUsIGNvbHVtbiwgMCwgMCwga2luZCwgZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApXSA6IFtsaW5lLCBjb2x1bW4sIDAsIDAsIGtpbmRdOwogICAgICAgICAgbGV0IHZhcnMgPSBFTVBUWTsKICAgICAgICAgIGlmIChoYXNNb3JlVmxxKHJlYWRlciwgbGVuZ3RoKSkgewogICAgICAgICAgICB2YXJzID0gW107CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBjb25zdCB2YXJzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgMCk7CiAgICAgICAgICAgICAgdmFycy5wdXNoKHZhcnNJbmRleCk7CiAgICAgICAgICAgIH0gd2hpbGUgKGhhc01vcmVWbHEocmVhZGVyLCBsZW5ndGgpKTsKICAgICAgICAgIH0KICAgICAgICAgIHNjb3BlLnZhcnMgPSB2YXJzOwogICAgICAgICAgc2NvcGVzLnB1c2goc2NvcGUpOwogICAgICAgICAgc3RhY2sucHVzaChzY29wZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY29wZXM7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZW5jb2RlT3JpZ2luYWxTY29wZXMoc2NvcGVzKSB7CiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NvcGVzLmxlbmd0aDsgKSB7CiAgICAgICAgICBpID0gX2VuY29kZU9yaWdpbmFsU2NvcGVzKHNjb3BlcywgaSwgd3JpdGVyLCBbMF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGVyLmZsdXNoKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2VuY29kZU9yaWdpbmFsU2NvcGVzKHNjb3BlcywgaW5kZXgsIHdyaXRlciwgc3RhdGUpIHsKICAgICAgICBjb25zdCBzY29wZSA9IHNjb3Blc1tpbmRleF07CiAgICAgICAgY29uc3QgeyAwOiBzdGFydExpbmUsIDE6IHN0YXJ0Q29sdW1uLCAyOiBlbmRMaW5lLCAzOiBlbmRDb2x1bW4sIDQ6IGtpbmQsIHZhcnMgfSA9IHNjb3BlOwogICAgICAgIGlmIChpbmRleCA+IDApCiAgICAgICAgICB3cml0ZXIud3JpdGUoY29tbWEpOwogICAgICAgIHN0YXRlWzBdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHN0YXJ0TGluZSwgc3RhdGVbMF0pOwogICAgICAgIGVuY29kZUludGVnZXIod3JpdGVyLCBzdGFydENvbHVtbiwgMCk7CiAgICAgICAgZW5jb2RlSW50ZWdlcih3cml0ZXIsIGtpbmQsIDApOwogICAgICAgIGNvbnN0IGZpZWxkcyA9IHNjb3BlLmxlbmd0aCA9PT0gNiA/IDEgOiAwOwogICAgICAgIGVuY29kZUludGVnZXIod3JpdGVyLCBmaWVsZHMsIDApOwogICAgICAgIGlmIChzY29wZS5sZW5ndGggPT09IDYpCiAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2NvcGVbNV0sIDApOwogICAgICAgIGZvciAoY29uc3QgdiBvZiB2YXJzKSB7CiAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgdiwgMCk7CiAgICAgICAgfQogICAgICAgIGZvciAoaW5kZXgrKzsgaW5kZXggPCBzY29wZXMubGVuZ3RoOyApIHsKICAgICAgICAgIGNvbnN0IG5leHQgPSBzY29wZXNbaW5kZXhdOwogICAgICAgICAgY29uc3QgeyAwOiBsLCAxOiBjIH0gPSBuZXh0OwogICAgICAgICAgaWYgKGwgPiBlbmRMaW5lIHx8IGwgPT09IGVuZExpbmUgJiYgYyA+PSBlbmRDb2x1bW4pIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleCA9IF9lbmNvZGVPcmlnaW5hbFNjb3BlcyhzY29wZXMsIGluZGV4LCB3cml0ZXIsIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgd3JpdGVyLndyaXRlKGNvbW1hKTsKICAgICAgICBzdGF0ZVswXSA9IGVuY29kZUludGVnZXIod3JpdGVyLCBlbmRMaW5lLCBzdGF0ZVswXSk7CiAgICAgICAgZW5jb2RlSW50ZWdlcih3cml0ZXIsIGVuZENvbHVtbiwgMCk7CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRlY29kZUdlbmVyYXRlZFJhbmdlcyhpbnB1dCkgewogICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBpbnB1dDsKICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGlucHV0KTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgICAgICBjb25zdCBzdGFjayA9IFtdOwogICAgICAgIGxldCBnZW5MaW5lID0gMDsKICAgICAgICBsZXQgZGVmaW5pdGlvblNvdXJjZXNJbmRleCA9IDA7CiAgICAgICAgbGV0IGRlZmluaXRpb25TY29wZUluZGV4ID0gMDsKICAgICAgICBsZXQgY2FsbHNpdGVTb3VyY2VzSW5kZXggPSAwOwogICAgICAgIGxldCBjYWxsc2l0ZUxpbmUgPSAwOwogICAgICAgIGxldCBjYWxsc2l0ZUNvbHVtbiA9IDA7CiAgICAgICAgbGV0IGJpbmRpbmdMaW5lID0gMDsKICAgICAgICBsZXQgYmluZGluZ0NvbHVtbiA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgY29uc3Qgc2VtaSA9IHJlYWRlci5pbmRleE9mKCI7Iik7CiAgICAgICAgICBsZXQgZ2VuQ29sdW1uID0gMDsKICAgICAgICAgIGZvciAoOyByZWFkZXIucG9zIDwgc2VtaTsgcmVhZGVyLnBvcysrKSB7CiAgICAgICAgICAgIGdlbkNvbHVtbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCBnZW5Db2x1bW4pOwogICAgICAgICAgICBpZiAoIWhhc01vcmVWbHEocmVhZGVyLCBzZW1pKSkgewogICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICBsYXN0WzJdID0gZ2VuTGluZTsKICAgICAgICAgICAgICBsYXN0WzNdID0gZ2VuQ29sdW1uOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IGRlY29kZUludGVnZXIocmVhZGVyLCAwKTsKICAgICAgICAgICAgY29uc3QgaGFzRGVmaW5pdGlvbiA9IGZpZWxkcyAmIDE7CiAgICAgICAgICAgIGNvbnN0IGhhc0NhbGxzaXRlID0gZmllbGRzICYgMjsKICAgICAgICAgICAgY29uc3QgaGFzU2NvcGUgPSBmaWVsZHMgJiA0OwogICAgICAgICAgICBsZXQgY2FsbHNpdGUgPSBudWxsOwogICAgICAgICAgICBsZXQgYmluZGluZ3MgPSBFTVBUWTsKICAgICAgICAgICAgbGV0IHJhbmdlOwogICAgICAgICAgICBpZiAoaGFzRGVmaW5pdGlvbikgewogICAgICAgICAgICAgIGNvbnN0IGRlZlNvdXJjZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBkZWZpbml0aW9uU291cmNlc0luZGV4KTsKICAgICAgICAgICAgICBkZWZpbml0aW9uU2NvcGVJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBkZWZpbml0aW9uU291cmNlc0luZGV4ID09PSBkZWZTb3VyY2VzSW5kZXggPyBkZWZpbml0aW9uU2NvcGVJbmRleCA6IDApOwogICAgICAgICAgICAgIGRlZmluaXRpb25Tb3VyY2VzSW5kZXggPSBkZWZTb3VyY2VzSW5kZXg7CiAgICAgICAgICAgICAgcmFuZ2UgPSBbZ2VuTGluZSwgZ2VuQ29sdW1uLCAwLCAwLCBkZWZTb3VyY2VzSW5kZXgsIGRlZmluaXRpb25TY29wZUluZGV4XTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByYW5nZSA9IFtnZW5MaW5lLCBnZW5Db2x1bW4sIDAsIDBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJhbmdlLmlzU2NvcGUgPSAhIWhhc1Njb3BlOwogICAgICAgICAgICBpZiAoaGFzQ2FsbHNpdGUpIHsKICAgICAgICAgICAgICBjb25zdCBwcmV2Q3NpID0gY2FsbHNpdGVTb3VyY2VzSW5kZXg7CiAgICAgICAgICAgICAgY29uc3QgcHJldkxpbmUgPSBjYWxsc2l0ZUxpbmU7CiAgICAgICAgICAgICAgY2FsbHNpdGVTb3VyY2VzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgY2FsbHNpdGVTb3VyY2VzSW5kZXgpOwogICAgICAgICAgICAgIGNvbnN0IHNhbWVTb3VyY2UgPSBwcmV2Q3NpID09PSBjYWxsc2l0ZVNvdXJjZXNJbmRleDsKICAgICAgICAgICAgICBjYWxsc2l0ZUxpbmUgPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc2FtZVNvdXJjZSA/IGNhbGxzaXRlTGluZSA6IDApOwogICAgICAgICAgICAgIGNhbGxzaXRlQ29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNhbWVTb3VyY2UgJiYgcHJldkxpbmUgPT09IGNhbGxzaXRlTGluZSA/IGNhbGxzaXRlQ29sdW1uIDogMCk7CiAgICAgICAgICAgICAgY2FsbHNpdGUgPSBbY2FsbHNpdGVTb3VyY2VzSW5kZXgsIGNhbGxzaXRlTGluZSwgY2FsbHNpdGVDb2x1bW5dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJhbmdlLmNhbGxzaXRlID0gY2FsbHNpdGU7CiAgICAgICAgICAgIGlmIChoYXNNb3JlVmxxKHJlYWRlciwgc2VtaSkpIHsKICAgICAgICAgICAgICBiaW5kaW5ncyA9IFtdOwogICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGJpbmRpbmdMaW5lID0gZ2VuTGluZTsKICAgICAgICAgICAgICAgIGJpbmRpbmdDb2x1bW4gPSBnZW5Db2x1bW47CiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uc0NvdW50ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIDApOwogICAgICAgICAgICAgICAgbGV0IGV4cHJlc3Npb25SYW5nZXM7CiAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbnNDb3VudCA8IC0xKSB7CiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25SYW5nZXMgPSBbW2RlY29kZUludGVnZXIocmVhZGVyLCAwKV1dOwogICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gLTE7IGkgPiBleHByZXNzaW9uc0NvdW50OyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2QmwgPSBiaW5kaW5nTGluZTsKICAgICAgICAgICAgICAgICAgICBiaW5kaW5nTGluZSA9IGRlY29kZUludGVnZXIocmVhZGVyLCBiaW5kaW5nTGluZSk7CiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvbHVtbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCBiaW5kaW5nTGluZSA9PT0gcHJldkJsID8gYmluZGluZ0NvbHVtbiA6IDApOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgMCk7CiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvblJhbmdlcy5wdXNoKFtleHByZXNzaW9uLCBiaW5kaW5nTGluZSwgYmluZGluZ0NvbHVtbl0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBleHByZXNzaW9uUmFuZ2VzID0gW1tleHByZXNzaW9uc0NvdW50XV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiaW5kaW5ncy5wdXNoKGV4cHJlc3Npb25SYW5nZXMpOwogICAgICAgICAgICAgIH0gd2hpbGUgKGhhc01vcmVWbHEocmVhZGVyLCBzZW1pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmFuZ2UuYmluZGluZ3MgPSBiaW5kaW5nczsKICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpOwogICAgICAgICAgICBzdGFjay5wdXNoKHJhbmdlKTsKICAgICAgICAgIH0KICAgICAgICAgIGdlbkxpbmUrKzsKICAgICAgICAgIHJlYWRlci5wb3MgPSBzZW1pICsgMTsKICAgICAgICB9IHdoaWxlIChyZWFkZXIucG9zIDwgbGVuZ3RoKTsKICAgICAgICByZXR1cm4gcmFuZ2VzOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGVuY29kZUdlbmVyYXRlZFJhbmdlcyhyYW5nZXMpIHsKICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyApIHsKICAgICAgICAgIGkgPSBfZW5jb2RlR2VuZXJhdGVkUmFuZ2VzKHJhbmdlcywgaSwgd3JpdGVyLCBbMCwgMCwgMCwgMCwgMCwgMCwgMF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGVyLmZsdXNoKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2VuY29kZUdlbmVyYXRlZFJhbmdlcyhyYW5nZXMsIGluZGV4LCB3cml0ZXIsIHN0YXRlKSB7CiAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZXNbaW5kZXhdOwogICAgICAgIGNvbnN0IHsgMDogc3RhcnRMaW5lLCAxOiBzdGFydENvbHVtbiwgMjogZW5kTGluZSwgMzogZW5kQ29sdW1uLCBpc1Njb3BlLCBjYWxsc2l0ZSwgYmluZGluZ3MgfSA9IHJhbmdlOwogICAgICAgIGlmIChzdGF0ZVswXSA8IHN0YXJ0TGluZSkgewogICAgICAgICAgY2F0Y2h1cExpbmUod3JpdGVyLCBzdGF0ZVswXSwgc3RhcnRMaW5lKTsKICAgICAgICAgIHN0YXRlWzBdID0gc3RhcnRMaW5lOwogICAgICAgICAgc3RhdGVbMV0gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgICB3cml0ZXIud3JpdGUoY29tbWEpOwogICAgICAgIH0KICAgICAgICBzdGF0ZVsxXSA9IGVuY29kZUludGVnZXIod3JpdGVyLCByYW5nZVsxXSwgc3RhdGVbMV0pOwogICAgICAgIGNvbnN0IGZpZWxkcyA9IChyYW5nZS5sZW5ndGggPT09IDYgPyAxIDogMCkgfCAoY2FsbHNpdGUgPyAyIDogMCkgfCAoaXNTY29wZSA/IDQgOiAwKTsKICAgICAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgZmllbGRzLCAwKTsKICAgICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSA2KSB7CiAgICAgICAgICBjb25zdCB7IDQ6IHNvdXJjZXNJbmRleCwgNTogc2NvcGVzSW5kZXggfSA9IHJhbmdlOwogICAgICAgICAgaWYgKHNvdXJjZXNJbmRleCAhPT0gc3RhdGVbMl0pIHsKICAgICAgICAgICAgc3RhdGVbM10gPSAwOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGVbMl0gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc291cmNlc0luZGV4LCBzdGF0ZVsyXSk7CiAgICAgICAgICBzdGF0ZVszXSA9IGVuY29kZUludGVnZXIod3JpdGVyLCBzY29wZXNJbmRleCwgc3RhdGVbM10pOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbHNpdGUpIHsKICAgICAgICAgIGNvbnN0IHsgMDogc291cmNlc0luZGV4LCAxOiBjYWxsTGluZSwgMjogY2FsbENvbHVtbiB9ID0gcmFuZ2UuY2FsbHNpdGU7CiAgICAgICAgICBpZiAoc291cmNlc0luZGV4ICE9PSBzdGF0ZVs0XSkgewogICAgICAgICAgICBzdGF0ZVs1XSA9IDA7CiAgICAgICAgICAgIHN0YXRlWzZdID0gMDsKICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbExpbmUgIT09IHN0YXRlWzVdKSB7CiAgICAgICAgICAgIHN0YXRlWzZdID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlWzRdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNvdXJjZXNJbmRleCwgc3RhdGVbNF0pOwogICAgICAgICAgc3RhdGVbNV0gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgY2FsbExpbmUsIHN0YXRlWzVdKTsKICAgICAgICAgIHN0YXRlWzZdID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIGNhbGxDb2x1bW4sIHN0YXRlWzZdKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYmluZGluZ3MpIHsKICAgICAgICAgICAgaWYgKGJpbmRpbmcubGVuZ3RoID4gMSkKICAgICAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgLWJpbmRpbmcubGVuZ3RoLCAwKTsKICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGJpbmRpbmdbMF1bMF07CiAgICAgICAgICAgIGVuY29kZUludGVnZXIod3JpdGVyLCBleHByZXNzaW9uLCAwKTsKICAgICAgICAgICAgbGV0IGJpbmRpbmdTdGFydExpbmUgPSBzdGFydExpbmU7CiAgICAgICAgICAgIGxldCBiaW5kaW5nU3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBiaW5kaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgZXhwUmFuZ2UgPSBiaW5kaW5nW2ldOwogICAgICAgICAgICAgIGJpbmRpbmdTdGFydExpbmUgPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgZXhwUmFuZ2VbMV0sIGJpbmRpbmdTdGFydExpbmUpOwogICAgICAgICAgICAgIGJpbmRpbmdTdGFydENvbHVtbiA9IGVuY29kZUludGVnZXIod3JpdGVyLCBleHBSYW5nZVsyXSwgYmluZGluZ1N0YXJ0Q29sdW1uKTsKICAgICAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgZXhwUmFuZ2VbMF0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaW5kZXgrKzsgaW5kZXggPCByYW5nZXMubGVuZ3RoOyApIHsKICAgICAgICAgIGNvbnN0IG5leHQgPSByYW5nZXNbaW5kZXhdOwogICAgICAgICAgY29uc3QgeyAwOiBsLCAxOiBjIH0gPSBuZXh0OwogICAgICAgICAgaWYgKGwgPiBlbmRMaW5lIHx8IGwgPT09IGVuZExpbmUgJiYgYyA+PSBlbmRDb2x1bW4pIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleCA9IF9lbmNvZGVHZW5lcmF0ZWRSYW5nZXMocmFuZ2VzLCBpbmRleCwgd3JpdGVyLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZVswXSA8IGVuZExpbmUpIHsKICAgICAgICAgIGNhdGNodXBMaW5lKHdyaXRlciwgc3RhdGVbMF0sIGVuZExpbmUpOwogICAgICAgICAgc3RhdGVbMF0gPSBlbmRMaW5lOwogICAgICAgICAgc3RhdGVbMV0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3cml0ZXIud3JpdGUoY29tbWEpOwogICAgICAgIH0KICAgICAgICBzdGF0ZVsxXSA9IGVuY29kZUludGVnZXIod3JpdGVyLCBlbmRDb2x1bW4sIHN0YXRlWzFdKTsKICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY2F0Y2h1cExpbmUod3JpdGVyLCBsYXN0TGluZSwgbGluZSkgewogICAgICAgIGRvIHsKICAgICAgICAgIHdyaXRlci53cml0ZShzZW1pY29sb24pOwogICAgICAgIH0gd2hpbGUgKCsrbGFzdExpbmUgPCBsaW5lKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkZWNvZGUobWFwcGluZ3MpIHsKICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gbWFwcGluZ3M7CiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtYXBwaW5ncyk7CiAgICAgICAgY29uc3QgZGVjb2RlZCA9IFtdOwogICAgICAgIGxldCBnZW5Db2x1bW4gPSAwOwogICAgICAgIGxldCBzb3VyY2VzSW5kZXggPSAwOwogICAgICAgIGxldCBzb3VyY2VMaW5lID0gMDsKICAgICAgICBsZXQgc291cmNlQ29sdW1uID0gMDsKICAgICAgICBsZXQgbmFtZXNJbmRleCA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgY29uc3Qgc2VtaSA9IHJlYWRlci5pbmRleE9mKCI7Iik7CiAgICAgICAgICBjb25zdCBsaW5lID0gW107CiAgICAgICAgICBsZXQgc29ydGVkID0gdHJ1ZTsKICAgICAgICAgIGxldCBsYXN0Q29sID0gMDsKICAgICAgICAgIGdlbkNvbHVtbiA9IDA7CiAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IHNlbWkpIHsKICAgICAgICAgICAgbGV0IHNlZzsKICAgICAgICAgICAgZ2VuQ29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIGdlbkNvbHVtbik7CiAgICAgICAgICAgIGlmIChnZW5Db2x1bW4gPCBsYXN0Q29sKQogICAgICAgICAgICAgIHNvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICBsYXN0Q29sID0gZ2VuQ29sdW1uOwogICAgICAgICAgICBpZiAoaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpKSB7CiAgICAgICAgICAgICAgc291cmNlc0luZGV4ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZXNJbmRleCk7CiAgICAgICAgICAgICAgc291cmNlTGluZSA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VMaW5lKTsKICAgICAgICAgICAgICBzb3VyY2VDb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlQ29sdW1uKTsKICAgICAgICAgICAgICBpZiAoaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpKSB7CiAgICAgICAgICAgICAgICBuYW1lc0luZGV4ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIG5hbWVzSW5kZXgpOwogICAgICAgICAgICAgICAgc2VnID0gW2dlbkNvbHVtbiwgc291cmNlc0luZGV4LCBzb3VyY2VMaW5lLCBzb3VyY2VDb2x1bW4sIG5hbWVzSW5kZXhdOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWcgPSBbZ2VuQ29sdW1uLCBzb3VyY2VzSW5kZXgsIHNvdXJjZUxpbmUsIHNvdXJjZUNvbHVtbl07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNlZyA9IFtnZW5Db2x1bW5dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpbmUucHVzaChzZWcpOwogICAgICAgICAgICByZWFkZXIucG9zKys7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXNvcnRlZCkKICAgICAgICAgICAgc29ydChsaW5lKTsKICAgICAgICAgIGRlY29kZWQucHVzaChsaW5lKTsKICAgICAgICAgIHJlYWRlci5wb3MgPSBzZW1pICsgMTsKICAgICAgICB9IHdoaWxlIChyZWFkZXIucG9zIDw9IGxlbmd0aCk7CiAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc29ydChsaW5lKSB7CiAgICAgICAgbGluZS5zb3J0KHNvcnRDb21wYXJhdG9yKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzb3J0Q29tcGFyYXRvcihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGVuY29kZShkZWNvZGVkKSB7CiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgIGxldCBzb3VyY2VzSW5kZXggPSAwOwogICAgICAgIGxldCBzb3VyY2VMaW5lID0gMDsKICAgICAgICBsZXQgc291cmNlQ29sdW1uID0gMDsKICAgICAgICBsZXQgbmFtZXNJbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBsaW5lID0gZGVjb2RlZFtpXTsKICAgICAgICAgIGlmIChpID4gMCkKICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlbWljb2xvbik7CiAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgbGV0IGdlbkNvbHVtbiA9IDA7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGxpbmVbal07CiAgICAgICAgICAgIGlmIChqID4gMCkKICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29tbWEpOwogICAgICAgICAgICBnZW5Db2x1bW4gPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFswXSwgZ2VuQ29sdW1uKTsKICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBzb3VyY2VzSW5kZXggPSBlbmNvZGVJbnRlZ2VyKHdyaXRlciwgc2VnbWVudFsxXSwgc291cmNlc0luZGV4KTsKICAgICAgICAgICAgc291cmNlTGluZSA9IGVuY29kZUludGVnZXIod3JpdGVyLCBzZWdtZW50WzJdLCBzb3VyY2VMaW5lKTsKICAgICAgICAgICAgc291cmNlQ29sdW1uID0gZW5jb2RlSW50ZWdlcih3cml0ZXIsIHNlZ21lbnRbM10sIHNvdXJjZUNvbHVtbik7CiAgICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gNCkKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgbmFtZXNJbmRleCA9IGVuY29kZUludGVnZXIod3JpdGVyLCBzZWdtZW50WzRdLCBuYW1lc0luZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdyaXRlci5mbHVzaCgpOwogICAgICB9CiAgICAgIGV4cG9ydHMzLmRlY29kZSA9IGRlY29kZTsKICAgICAgZXhwb3J0czMuZGVjb2RlR2VuZXJhdGVkUmFuZ2VzID0gZGVjb2RlR2VuZXJhdGVkUmFuZ2VzOwogICAgICBleHBvcnRzMy5kZWNvZGVPcmlnaW5hbFNjb3BlcyA9IGRlY29kZU9yaWdpbmFsU2NvcGVzOwogICAgICBleHBvcnRzMy5lbmNvZGUgPSBlbmNvZGU7CiAgICAgIGV4cG9ydHMzLmVuY29kZUdlbmVyYXRlZFJhbmdlcyA9IGVuY29kZUdlbmVyYXRlZFJhbmdlczsKICAgICAgZXhwb3J0czMuZW5jb2RlT3JpZ2luYWxTY29wZXMgPSBlbmNvZGVPcmlnaW5hbFNjb3BlczsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB9KTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvbWFnaWMtc3RyaW5nLW5wbS0wLjMwLjE3LWRhMWI3NTkzYjEtMmY3MWFmMmIwYS56aXAvbm9kZV9tb2R1bGVzL21hZ2ljLXN0cmluZy9kaXN0L21hZ2ljLXN0cmluZy5janMuanMKdmFyIHJlcXVpcmVfbWFnaWNfc3RyaW5nX2NqcyA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9tYWdpYy1zdHJpbmctbnBtLTAuMzAuMTctZGExYjc1OTNiMS0yZjcxYWYyYjBhLnppcC9ub2RlX21vZHVsZXMvbWFnaWMtc3RyaW5nL2Rpc3QvbWFnaWMtc3RyaW5nLmNqcy5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBzb3VyY2VtYXBDb2RlYyA9IHJlcXVpcmVfc291cmNlbWFwX2NvZGVjX3VtZCgpOwogICAgdmFyIEJpdFNldCA9IGNsYXNzIF9CaXRTZXQgewogICAgICBjb25zdHJ1Y3RvcihhcmcpIHsKICAgICAgICB0aGlzLmJpdHMgPSBhcmcgaW5zdGFuY2VvZiBfQml0U2V0ID8gYXJnLmJpdHMuc2xpY2UoKSA6IFtdOwogICAgICB9CiAgICAgIGFkZChuMikgewogICAgICAgIHRoaXMuYml0c1tuMiA+PiA1XSB8PSAxIDw8IChuMiAmIDMxKTsKICAgICAgfQogICAgICBoYXMobjIpIHsKICAgICAgICByZXR1cm4gISEodGhpcy5iaXRzW24yID4+IDVdICYgMSA8PCAobjIgJiAzMSkpOwogICAgICB9CiAgICB9OwogICAgdmFyIENodW5rID0gY2xhc3MgX0NodW5rIHsKICAgICAgY29uc3RydWN0b3Ioc3RhcnQsIGVuZCwgY29udGVudCkgewogICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKICAgICAgICB0aGlzLmVuZCA9IGVuZDsKICAgICAgICB0aGlzLm9yaWdpbmFsID0gY29udGVudDsKICAgICAgICB0aGlzLmludHJvID0gIiI7CiAgICAgICAgdGhpcy5vdXRybyA9ICIiOwogICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgdGhpcy5zdG9yZU5hbWUgPSBmYWxzZTsKICAgICAgICB0aGlzLmVkaXRlZCA9IGZhbHNlOwogICAgICAgIHsKICAgICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsOwogICAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kTGVmdChjb250ZW50KSB7CiAgICAgICAgdGhpcy5vdXRybyArPSBjb250ZW50OwogICAgICB9CiAgICAgIGFwcGVuZFJpZ2h0KGNvbnRlbnQpIHsKICAgICAgICB0aGlzLmludHJvID0gdGhpcy5pbnRybyArIGNvbnRlbnQ7CiAgICAgIH0KICAgICAgY2xvbmUoKSB7CiAgICAgICAgY29uc3QgY2h1bmsgPSBuZXcgX0NodW5rKHRoaXMuc3RhcnQsIHRoaXMuZW5kLCB0aGlzLm9yaWdpbmFsKTsKICAgICAgICBjaHVuay5pbnRybyA9IHRoaXMuaW50cm87CiAgICAgICAgY2h1bmsub3V0cm8gPSB0aGlzLm91dHJvOwogICAgICAgIGNodW5rLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7CiAgICAgICAgY2h1bmsuc3RvcmVOYW1lID0gdGhpcy5zdG9yZU5hbWU7CiAgICAgICAgY2h1bmsuZWRpdGVkID0gdGhpcy5lZGl0ZWQ7CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICAgIGNvbnRhaW5zKGluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQgPCBpbmRleCAmJiBpbmRleCA8IHRoaXMuZW5kOwogICAgICB9CiAgICAgIGVhY2hOZXh0KGZuKSB7CiAgICAgICAgbGV0IGNodW5rID0gdGhpczsKICAgICAgICB3aGlsZSAoY2h1bmspIHsKICAgICAgICAgIGZuKGNodW5rKTsKICAgICAgICAgIGNodW5rID0gY2h1bmsubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWFjaFByZXZpb3VzKGZuKSB7CiAgICAgICAgbGV0IGNodW5rID0gdGhpczsKICAgICAgICB3aGlsZSAoY2h1bmspIHsKICAgICAgICAgIGZuKGNodW5rKTsKICAgICAgICAgIGNodW5rID0gY2h1bmsucHJldmlvdXM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVkaXQoY29udGVudCwgc3RvcmVOYW1lLCBjb250ZW50T25seSkgewogICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgaWYgKCFjb250ZW50T25seSkgewogICAgICAgICAgdGhpcy5pbnRybyA9ICIiOwogICAgICAgICAgdGhpcy5vdXRybyA9ICIiOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3JlTmFtZSA9IHN0b3JlTmFtZTsKICAgICAgICB0aGlzLmVkaXRlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgcHJlcGVuZExlZnQoY29udGVudCkgewogICAgICAgIHRoaXMub3V0cm8gPSBjb250ZW50ICsgdGhpcy5vdXRybzsKICAgICAgfQogICAgICBwcmVwZW5kUmlnaHQoY29udGVudCkgewogICAgICAgIHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybzsKICAgICAgfQogICAgICByZXNldCgpIHsKICAgICAgICB0aGlzLmludHJvID0gIiI7CiAgICAgICAgdGhpcy5vdXRybyA9ICIiOwogICAgICAgIGlmICh0aGlzLmVkaXRlZCkgewogICAgICAgICAgdGhpcy5jb250ZW50ID0gdGhpcy5vcmlnaW5hbDsKICAgICAgICAgIHRoaXMuc3RvcmVOYW1lID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmVkaXRlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBzcGxpdChpbmRleCkgewogICAgICAgIGNvbnN0IHNsaWNlSW5kZXggPSBpbmRleCAtIHRoaXMuc3RhcnQ7CiAgICAgICAgY29uc3Qgb3JpZ2luYWxCZWZvcmUgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKDAsIHNsaWNlSW5kZXgpOwogICAgICAgIGNvbnN0IG9yaWdpbmFsQWZ0ZXIgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKHNsaWNlSW5kZXgpOwogICAgICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbEJlZm9yZTsKICAgICAgICBjb25zdCBuZXdDaHVuayA9IG5ldyBfQ2h1bmsoaW5kZXgsIHRoaXMuZW5kLCBvcmlnaW5hbEFmdGVyKTsKICAgICAgICBuZXdDaHVuay5vdXRybyA9IHRoaXMub3V0cm87CiAgICAgICAgdGhpcy5vdXRybyA9ICIiOwogICAgICAgIHRoaXMuZW5kID0gaW5kZXg7CiAgICAgICAgaWYgKHRoaXMuZWRpdGVkKSB7CiAgICAgICAgICBuZXdDaHVuay5lZGl0KCIiLCBmYWxzZSk7CiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSAiIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5jb250ZW50ID0gb3JpZ2luYWxCZWZvcmU7CiAgICAgICAgfQogICAgICAgIG5ld0NodW5rLm5leHQgPSB0aGlzLm5leHQ7CiAgICAgICAgaWYgKG5ld0NodW5rLm5leHQpIG5ld0NodW5rLm5leHQucHJldmlvdXMgPSBuZXdDaHVuazsKICAgICAgICBuZXdDaHVuay5wcmV2aW91cyA9IHRoaXM7CiAgICAgICAgdGhpcy5uZXh0ID0gbmV3Q2h1bms7CiAgICAgICAgcmV0dXJuIG5ld0NodW5rOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmludHJvICsgdGhpcy5jb250ZW50ICsgdGhpcy5vdXRybzsKICAgICAgfQogICAgICB0cmltRW5kKHJ4KSB7CiAgICAgICAgdGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShyeCwgIiIpOwogICAgICAgIGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHJ4LCAiIik7CiAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoKSB7CiAgICAgICAgICBpZiAodHJpbW1lZCAhPT0gdGhpcy5jb250ZW50KSB7CiAgICAgICAgICAgIHRoaXMuc3BsaXQodGhpcy5zdGFydCArIHRyaW1tZWQubGVuZ3RoKS5lZGl0KCIiLCB2b2lkIDAsIHRydWUpOwogICAgICAgICAgICBpZiAodGhpcy5lZGl0ZWQpIHsKICAgICAgICAgICAgICB0aGlzLmVkaXQodHJpbW1lZCwgdGhpcy5zdG9yZU5hbWUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5lZGl0KCIiLCB2b2lkIDAsIHRydWUpOwogICAgICAgICAgdGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgIiIpOwogICAgICAgICAgaWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdHJpbVN0YXJ0KHJ4KSB7CiAgICAgICAgdGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgIiIpOwogICAgICAgIGlmICh0aGlzLmludHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHJ4LCAiIik7CiAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoKSB7CiAgICAgICAgICBpZiAodHJpbW1lZCAhPT0gdGhpcy5jb250ZW50KSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0NodW5rID0gdGhpcy5zcGxpdCh0aGlzLmVuZCAtIHRyaW1tZWQubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGVkKSB7CiAgICAgICAgICAgICAgbmV3Q2h1bmsuZWRpdCh0cmltbWVkLCB0aGlzLnN0b3JlTmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lZGl0KCIiLCB2b2lkIDAsIHRydWUpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuZWRpdCgiIiwgdm9pZCAwLCB0cnVlKTsKICAgICAgICAgIHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICIiKTsKICAgICAgICAgIGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gZ2V0QnRvYSgpIHsKICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5idG9hID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIChzdHIpID0+IGdsb2JhbFRoaXMuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gKHN0cikgPT4gQnVmZmVyLmZyb20oc3RyLCAidXRmLTgiKS50b1N0cmluZygiYmFzZTY0Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQ6IGB3aW5kb3cuYnRvYWAgb3IgYEJ1ZmZlcmAgc2hvdWxkIGJlIHN1cHBvcnRlZC4iKTsKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICB2YXIgYnRvYSA9IC8qIEBfX1BVUkVfXyAqLyBnZXRCdG9hKCk7CiAgICB2YXIgU291cmNlTWFwID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uID0gMzsKICAgICAgICB0aGlzLmZpbGUgPSBwcm9wZXJ0aWVzLmZpbGU7CiAgICAgICAgdGhpcy5zb3VyY2VzID0gcHJvcGVydGllcy5zb3VyY2VzOwogICAgICAgIHRoaXMuc291cmNlc0NvbnRlbnQgPSBwcm9wZXJ0aWVzLnNvdXJjZXNDb250ZW50OwogICAgICAgIHRoaXMubmFtZXMgPSBwcm9wZXJ0aWVzLm5hbWVzOwogICAgICAgIHRoaXMubWFwcGluZ3MgPSBzb3VyY2VtYXBDb2RlYy5lbmNvZGUocHJvcGVydGllcy5tYXBwaW5ncyk7CiAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzLnhfZ29vZ2xlX2lnbm9yZUxpc3QgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICB0aGlzLnhfZ29vZ2xlX2lnbm9yZUxpc3QgPSBwcm9wZXJ0aWVzLnhfZ29vZ2xlX2lnbm9yZUxpc3Q7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllcy5kZWJ1Z0lkICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgdGhpcy5kZWJ1Z0lkID0gcHJvcGVydGllcy5kZWJ1Z0lkOwogICAgICAgIH0KICAgICAgfQogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7CiAgICAgIH0KICAgICAgdG9VcmwoKSB7CiAgICAgICAgcmV0dXJuICJkYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIiArIGJ0b2EodGhpcy50b1N0cmluZygpKTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGd1ZXNzSW5kZW50KGNvZGUpIHsKICAgICAgY29uc3QgbGluZXMgPSBjb2RlLnNwbGl0KCJcbiIpOwogICAgICBjb25zdCB0YWJiZWQgPSBsaW5lcy5maWx0ZXIoKGxpbmUpID0+IC9eXHQrLy50ZXN0KGxpbmUpKTsKICAgICAgY29uc3Qgc3BhY2VkID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiAvXiB7Mix9Ly50ZXN0KGxpbmUpKTsKICAgICAgaWYgKHRhYmJlZC5sZW5ndGggPT09IDAgJiYgc3BhY2VkLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICh0YWJiZWQubGVuZ3RoID49IHNwYWNlZC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gIgkiOwogICAgICB9CiAgICAgIGNvbnN0IG1pbiA9IHNwYWNlZC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7CiAgICAgICAgY29uc3QgbnVtU3BhY2VzID0gL14gKy8uZXhlYyhjdXJyZW50KVswXS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKG51bVNwYWNlcywgcHJldmlvdXMpOwogICAgICB9LCBJbmZpbml0eSk7CiAgICAgIHJldHVybiBuZXcgQXJyYXkobWluICsgMSkuam9pbigiICIpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKGZyb20sIHRvKSB7CiAgICAgIGNvbnN0IGZyb21QYXJ0cyA9IGZyb20uc3BsaXQoL1svXFxdLyk7CiAgICAgIGNvbnN0IHRvUGFydHMgPSB0by5zcGxpdCgvWy9cXF0vKTsKICAgICAgZnJvbVBhcnRzLnBvcCgpOwogICAgICB3aGlsZSAoZnJvbVBhcnRzWzBdID09PSB0b1BhcnRzWzBdKSB7CiAgICAgICAgZnJvbVBhcnRzLnNoaWZ0KCk7CiAgICAgICAgdG9QYXJ0cy5zaGlmdCgpOwogICAgICB9CiAgICAgIGlmIChmcm9tUGFydHMubGVuZ3RoKSB7CiAgICAgICAgbGV0IGkgPSBmcm9tUGFydHMubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIGZyb21QYXJ0c1tpXSA9ICIuLiI7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyb21QYXJ0cy5jb25jYXQodG9QYXJ0cykuam9pbigiLyIpOwogICAgfQogICAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7CiAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHRoaW5nKSA9PT0gIltvYmplY3QgT2JqZWN0XSI7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRMb2NhdG9yKHNvdXJjZSkgewogICAgICBjb25zdCBvcmlnaW5hbExpbmVzID0gc291cmNlLnNwbGl0KCJcbiIpOwogICAgICBjb25zdCBsaW5lT2Zmc2V0cyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IG9yaWdpbmFsTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHBvcyk7CiAgICAgICAgcG9zICs9IG9yaWdpbmFsTGluZXNbaV0ubGVuZ3RoICsgMTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24gbG9jYXRlKGluZGV4KSB7CiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIGxldCBqID0gbGluZU9mZnNldHMubGVuZ3RoOwogICAgICAgIHdoaWxlIChpIDwgaikgewogICAgICAgICAgY29uc3QgbSA9IGkgKyBqID4+IDE7CiAgICAgICAgICBpZiAoaW5kZXggPCBsaW5lT2Zmc2V0c1ttXSkgewogICAgICAgICAgICBqID0gbTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGkgPSBtICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZSA9IGkgLSAxOwogICAgICAgIGNvbnN0IGNvbHVtbiA9IGluZGV4IC0gbGluZU9mZnNldHNbbGluZV07CiAgICAgICAgcmV0dXJuIHsgbGluZSwgY29sdW1uIH07CiAgICAgIH07CiAgICB9CiAgICB2YXIgd29yZFJlZ2V4ID0gL1x3LzsKICAgIHZhciBNYXBwaW5ncyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoaGlyZXMpIHsKICAgICAgICB0aGlzLmhpcmVzID0gaGlyZXM7CiAgICAgICAgdGhpcy5nZW5lcmF0ZWRDb2RlTGluZSA9IDA7CiAgICAgICAgdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uID0gMDsKICAgICAgICB0aGlzLnJhdyA9IFtdOwogICAgICAgIHRoaXMucmF3U2VnbWVudHMgPSB0aGlzLnJhd1t0aGlzLmdlbmVyYXRlZENvZGVMaW5lXSA9IFtdOwogICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7CiAgICAgIH0KICAgICAgYWRkRWRpdChzb3VyY2VJbmRleCwgY29udGVudCwgbG9jLCBuYW1lSW5kZXgpIHsKICAgICAgICBpZiAoY29udGVudC5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGhNaW51c09uZSA9IGNvbnRlbnQubGVuZ3RoIC0gMTsKICAgICAgICAgIGxldCBjb250ZW50TGluZUVuZCA9IGNvbnRlbnQuaW5kZXhPZigiXG4iLCAwKTsKICAgICAgICAgIGxldCBwcmV2aW91c0NvbnRlbnRMaW5lRW5kID0gLTE7CiAgICAgICAgICB3aGlsZSAoY29udGVudExpbmVFbmQgPj0gMCAmJiBjb250ZW50TGVuZ3RoTWludXNPbmUgPiBjb250ZW50TGluZUVuZCkgewogICAgICAgICAgICBjb25zdCBzZWdtZW50MiA9IFt0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4sIHNvdXJjZUluZGV4LCBsb2MubGluZSwgbG9jLmNvbHVtbl07CiAgICAgICAgICAgIGlmIChuYW1lSW5kZXggPj0gMCkgewogICAgICAgICAgICAgIHNlZ21lbnQyLnB1c2gobmFtZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJhd1NlZ21lbnRzLnB1c2goc2VnbWVudDIpOwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVMaW5lICs9IDE7CiAgICAgICAgICAgIHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdOwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwOwogICAgICAgICAgICBwcmV2aW91c0NvbnRlbnRMaW5lRW5kID0gY29udGVudExpbmVFbmQ7CiAgICAgICAgICAgIGNvbnRlbnRMaW5lRW5kID0gY29udGVudC5pbmRleE9mKCJcbiIsIGNvbnRlbnRMaW5lRW5kICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzZWdtZW50ID0gW3RoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiwgc291cmNlSW5kZXgsIGxvYy5saW5lLCBsb2MuY29sdW1uXTsKICAgICAgICAgIGlmIChuYW1lSW5kZXggPj0gMCkgewogICAgICAgICAgICBzZWdtZW50LnB1c2gobmFtZUluZGV4KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTsKICAgICAgICAgIHRoaXMuYWR2YW5jZShjb250ZW50LnNsaWNlKHByZXZpb3VzQ29udGVudExpbmVFbmQgKyAxKSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMucmF3U2VnbWVudHMucHVzaCh0aGlzLnBlbmRpbmcpOwogICAgICAgICAgdGhpcy5hZHZhbmNlKGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICAgIGFkZFVuZWRpdGVkQ2h1bmsoc291cmNlSW5kZXgsIGNodW5rLCBvcmlnaW5hbCwgbG9jLCBzb3VyY2VtYXBMb2NhdGlvbnMpIHsKICAgICAgICBsZXQgb3JpZ2luYWxDaGFySW5kZXggPSBjaHVuay5zdGFydDsKICAgICAgICBsZXQgZmlyc3QgPSB0cnVlOwogICAgICAgIGxldCBjaGFySW5IaXJlc0JvdW5kYXJ5ID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKG9yaWdpbmFsQ2hhckluZGV4IDwgY2h1bmsuZW5kKSB7CiAgICAgICAgICBpZiAob3JpZ2luYWxbb3JpZ2luYWxDaGFySW5kZXhdID09PSAiXG4iKSB7CiAgICAgICAgICAgIGxvYy5saW5lICs9IDE7CiAgICAgICAgICAgIGxvYy5jb2x1bW4gPSAwOwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVMaW5lICs9IDE7CiAgICAgICAgICAgIHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdOwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwOwogICAgICAgICAgICBmaXJzdCA9IHRydWU7CiAgICAgICAgICAgIGNoYXJJbkhpcmVzQm91bmRhcnkgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhpcmVzIHx8IGZpcnN0IHx8IHNvdXJjZW1hcExvY2F0aW9ucy5oYXMob3JpZ2luYWxDaGFySW5kZXgpKSB7CiAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IFt0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4sIHNvdXJjZUluZGV4LCBsb2MubGluZSwgbG9jLmNvbHVtbl07CiAgICAgICAgICAgICAgaWYgKHRoaXMuaGlyZXMgPT09ICJib3VuZGFyeSIpIHsKICAgICAgICAgICAgICAgIGlmICh3b3JkUmVnZXgudGVzdChvcmlnaW5hbFtvcmlnaW5hbENoYXJJbmRleF0pKSB7CiAgICAgICAgICAgICAgICAgIGlmICghY2hhckluSGlyZXNCb3VuZGFyeSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICBjaGFySW5IaXJlc0JvdW5kYXJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdGhpcy5yYXdTZWdtZW50cy5wdXNoKHNlZ21lbnQpOwogICAgICAgICAgICAgICAgICBjaGFySW5IaXJlc0JvdW5kYXJ5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9jLmNvbHVtbiArPSAxOwogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gKz0gMTsKICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIG9yaWdpbmFsQ2hhckluZGV4ICs9IDE7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7CiAgICAgIH0KICAgICAgYWR2YW5jZShzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuOwogICAgICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KCJcbiIpOwogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICB0aGlzLmdlbmVyYXRlZENvZGVMaW5lKys7CiAgICAgICAgICAgIHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uICs9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIHZhciBuID0gIlxuIjsKICAgIHZhciB3YXJuZWQgPSB7CiAgICAgIGluc2VydExlZnQ6IGZhbHNlLAogICAgICBpbnNlcnRSaWdodDogZmFsc2UsCiAgICAgIHN0b3JlTmFtZTogZmFsc2UKICAgIH07CiAgICB2YXIgTWFnaWNTdHJpbmcgPSBjbGFzcyBfTWFnaWNTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIGNvbnN0IGNodW5rID0gbmV3IENodW5rKDAsIHN0cmluZy5sZW5ndGgsIHN0cmluZyk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgICAgb3JpZ2luYWw6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBzdHJpbmcgfSwKICAgICAgICAgIG91dHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogIiIgfSwKICAgICAgICAgIGludHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogIiIgfSwKICAgICAgICAgIGZpcnN0Q2h1bms6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LAogICAgICAgICAgbGFzdENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSwKICAgICAgICAgIGxhc3RTZWFyY2hlZENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSwKICAgICAgICAgIGJ5U3RhcnQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LAogICAgICAgICAgYnlFbmQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LAogICAgICAgICAgZmlsZW5hbWU6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmZpbGVuYW1lIH0sCiAgICAgICAgICBpbmRlbnRFeGNsdXNpb25SYW5nZXM6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmluZGVudEV4Y2x1c2lvblJhbmdlcyB9LAogICAgICAgICAgc291cmNlbWFwTG9jYXRpb25zOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEJpdFNldCgpIH0sCiAgICAgICAgICBzdG9yZWROYW1lczogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0sCiAgICAgICAgICBpbmRlbnRTdHI6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2b2lkIDAgfSwKICAgICAgICAgIGlnbm9yZUxpc3Q6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmlnbm9yZUxpc3QgfSwKICAgICAgICAgIG9mZnNldDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9wdGlvbnMub2Zmc2V0IHx8IDAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuYnlTdGFydFswXSA9IGNodW5rOwogICAgICAgIHRoaXMuYnlFbmRbc3RyaW5nLmxlbmd0aF0gPSBjaHVuazsKICAgICAgfQogICAgICBhZGRTb3VyY2VtYXBMb2NhdGlvbihjaGFyKSB7CiAgICAgICAgdGhpcy5zb3VyY2VtYXBMb2NhdGlvbnMuYWRkKGNoYXIpOwogICAgICB9CiAgICAgIGFwcGVuZChjb250ZW50KSB7CiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAic3RyaW5nIikgdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cm8gY29udGVudCBtdXN0IGJlIGEgc3RyaW5nIik7CiAgICAgICAgdGhpcy5vdXRybyArPSBjb250ZW50OwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGFwcGVuZExlZnQoaW5kZXgsIGNvbnRlbnQpIHsKICAgICAgICBpbmRleCA9IGluZGV4ICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAic3RyaW5nIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nIik7CiAgICAgICAgdGhpcy5fc3BsaXQoaW5kZXgpOwogICAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5ieUVuZFtpbmRleF07CiAgICAgICAgaWYgKGNodW5rKSB7CiAgICAgICAgICBjaHVuay5hcHBlbmRMZWZ0KGNvbnRlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmludHJvICs9IGNvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGFwcGVuZFJpZ2h0KGluZGV4LCBjb250ZW50KSB7CiAgICAgICAgaW5kZXggPSBpbmRleCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmICh0eXBlb2YgY29udGVudCAhPT0gInN0cmluZyIpIHRocm93IG5ldyBUeXBlRXJyb3IoImluc2VydGVkIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgIHRoaXMuX3NwbGl0KGluZGV4KTsKICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuYnlTdGFydFtpbmRleF07CiAgICAgICAgaWYgKGNodW5rKSB7CiAgICAgICAgICBjaHVuay5hcHBlbmRSaWdodChjb250ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5vdXRybyArPSBjb250ZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBjbG9uZSgpIHsKICAgICAgICBjb25zdCBjbG9uZWQgPSBuZXcgX01hZ2ljU3RyaW5nKHRoaXMub3JpZ2luYWwsIHsgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsIG9mZnNldDogdGhpcy5vZmZzZXQgfSk7CiAgICAgICAgbGV0IG9yaWdpbmFsQ2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7CiAgICAgICAgbGV0IGNsb25lZENodW5rID0gY2xvbmVkLmZpcnN0Q2h1bmsgPSBjbG9uZWQubGFzdFNlYXJjaGVkQ2h1bmsgPSBvcmlnaW5hbENodW5rLmNsb25lKCk7CiAgICAgICAgd2hpbGUgKG9yaWdpbmFsQ2h1bmspIHsKICAgICAgICAgIGNsb25lZC5ieVN0YXJ0W2Nsb25lZENodW5rLnN0YXJ0XSA9IGNsb25lZENodW5rOwogICAgICAgICAgY2xvbmVkLmJ5RW5kW2Nsb25lZENodW5rLmVuZF0gPSBjbG9uZWRDaHVuazsKICAgICAgICAgIGNvbnN0IG5leHRPcmlnaW5hbENodW5rID0gb3JpZ2luYWxDaHVuay5uZXh0OwogICAgICAgICAgY29uc3QgbmV4dENsb25lZENodW5rID0gbmV4dE9yaWdpbmFsQ2h1bmsgJiYgbmV4dE9yaWdpbmFsQ2h1bmsuY2xvbmUoKTsKICAgICAgICAgIGlmIChuZXh0Q2xvbmVkQ2h1bmspIHsKICAgICAgICAgICAgY2xvbmVkQ2h1bmsubmV4dCA9IG5leHRDbG9uZWRDaHVuazsKICAgICAgICAgICAgbmV4dENsb25lZENodW5rLnByZXZpb3VzID0gY2xvbmVkQ2h1bms7CiAgICAgICAgICAgIGNsb25lZENodW5rID0gbmV4dENsb25lZENodW5rOwogICAgICAgICAgfQogICAgICAgICAgb3JpZ2luYWxDaHVuayA9IG5leHRPcmlnaW5hbENodW5rOwogICAgICAgIH0KICAgICAgICBjbG9uZWQubGFzdENodW5rID0gY2xvbmVkQ2h1bms7CiAgICAgICAgaWYgKHRoaXMuaW5kZW50RXhjbHVzaW9uUmFuZ2VzKSB7CiAgICAgICAgICBjbG9uZWQuaW5kZW50RXhjbHVzaW9uUmFuZ2VzID0gdGhpcy5pbmRlbnRFeGNsdXNpb25SYW5nZXMuc2xpY2UoKTsKICAgICAgICB9CiAgICAgICAgY2xvbmVkLnNvdXJjZW1hcExvY2F0aW9ucyA9IG5ldyBCaXRTZXQodGhpcy5zb3VyY2VtYXBMb2NhdGlvbnMpOwogICAgICAgIGNsb25lZC5pbnRybyA9IHRoaXMuaW50cm87CiAgICAgICAgY2xvbmVkLm91dHJvID0gdGhpcy5vdXRybzsKICAgICAgICByZXR1cm4gY2xvbmVkOwogICAgICB9CiAgICAgIGdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgY29uc3Qgc291cmNlSW5kZXggPSAwOwogICAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXModGhpcy5zdG9yZWROYW1lcyk7CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBuZXcgTWFwcGluZ3Mob3B0aW9ucy5oaXJlcyk7CiAgICAgICAgY29uc3QgbG9jYXRlID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKTsKICAgICAgICBpZiAodGhpcy5pbnRybykgewogICAgICAgICAgbWFwcGluZ3MuYWR2YW5jZSh0aGlzLmludHJvKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5maXJzdENodW5rLmVhY2hOZXh0KChjaHVuaykgPT4gewogICAgICAgICAgY29uc3QgbG9jID0gbG9jYXRlKGNodW5rLnN0YXJ0KTsKICAgICAgICAgIGlmIChjaHVuay5pbnRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsuaW50cm8pOwogICAgICAgICAgaWYgKGNodW5rLmVkaXRlZCkgewogICAgICAgICAgICBtYXBwaW5ncy5hZGRFZGl0KAogICAgICAgICAgICAgIHNvdXJjZUluZGV4LAogICAgICAgICAgICAgIGNodW5rLmNvbnRlbnQsCiAgICAgICAgICAgICAgbG9jLAogICAgICAgICAgICAgIGNodW5rLnN0b3JlTmFtZSA/IG5hbWVzLmluZGV4T2YoY2h1bmsub3JpZ2luYWwpIDogLTEKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hcHBpbmdzLmFkZFVuZWRpdGVkQ2h1bmsoc291cmNlSW5kZXgsIGNodW5rLCB0aGlzLm9yaWdpbmFsLCBsb2MsIHRoaXMuc291cmNlbWFwTG9jYXRpb25zKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaHVuay5vdXRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsub3V0cm8pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUgPyBvcHRpb25zLmZpbGUuc3BsaXQoL1svXFxdLykucG9wKCkgOiB2b2lkIDAsCiAgICAgICAgICBzb3VyY2VzOiBbCiAgICAgICAgICAgIG9wdGlvbnMuc291cmNlID8gZ2V0UmVsYXRpdmVQYXRoKG9wdGlvbnMuZmlsZSB8fCAiIiwgb3B0aW9ucy5zb3VyY2UpIDogb3B0aW9ucy5maWxlIHx8ICIiCiAgICAgICAgICBdLAogICAgICAgICAgc291cmNlc0NvbnRlbnQ6IG9wdGlvbnMuaW5jbHVkZUNvbnRlbnQgPyBbdGhpcy5vcmlnaW5hbF0gOiB2b2lkIDAsCiAgICAgICAgICBuYW1lcywKICAgICAgICAgIG1hcHBpbmdzOiBtYXBwaW5ncy5yYXcsCiAgICAgICAgICB4X2dvb2dsZV9pZ25vcmVMaXN0OiB0aGlzLmlnbm9yZUxpc3QgPyBbc291cmNlSW5kZXhdIDogdm9pZCAwCiAgICAgICAgfTsKICAgICAgfQogICAgICBnZW5lcmF0ZU1hcChvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VNYXAodGhpcy5nZW5lcmF0ZURlY29kZWRNYXAob3B0aW9ucykpOwogICAgICB9CiAgICAgIF9lbnN1cmVpbmRlbnRTdHIoKSB7CiAgICAgICAgaWYgKHRoaXMuaW5kZW50U3RyID09PSB2b2lkIDApIHsKICAgICAgICAgIHRoaXMuaW5kZW50U3RyID0gZ3Vlc3NJbmRlbnQodGhpcy5vcmlnaW5hbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9nZXRSYXdJbmRlbnRTdHJpbmcoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlaW5kZW50U3RyKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50U3RyOwogICAgICB9CiAgICAgIGdldEluZGVudFN0cmluZygpIHsKICAgICAgICB0aGlzLl9lbnN1cmVpbmRlbnRTdHIoKTsKICAgICAgICByZXR1cm4gdGhpcy5pbmRlbnRTdHIgPT09IG51bGwgPyAiCSIgOiB0aGlzLmluZGVudFN0cjsKICAgICAgfQogICAgICBpbmRlbnQoaW5kZW50U3RyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcGF0dGVybiA9IC9eW15cclxuXS9nbTsKICAgICAgICBpZiAoaXNPYmplY3QoaW5kZW50U3RyKSkgewogICAgICAgICAgb3B0aW9ucyA9IGluZGVudFN0cjsKICAgICAgICAgIGluZGVudFN0ciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGVudFN0ciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLl9lbnN1cmVpbmRlbnRTdHIoKTsKICAgICAgICAgIGluZGVudFN0ciA9IHRoaXMuaW5kZW50U3RyIHx8ICIJIjsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGVudFN0ciA9PT0gIiIpIHJldHVybiB0aGlzOwogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGNvbnN0IGlzRXhjbHVkZWQgPSB7fTsKICAgICAgICBpZiAob3B0aW9ucy5leGNsdWRlKSB7CiAgICAgICAgICBjb25zdCBleGNsdXNpb25zID0gdHlwZW9mIG9wdGlvbnMuZXhjbHVkZVswXSA9PT0gIm51bWJlciIgPyBbb3B0aW9ucy5leGNsdWRlXSA6IG9wdGlvbnMuZXhjbHVkZTsKICAgICAgICAgIGV4Y2x1c2lvbnMuZm9yRWFjaCgoZXhjbHVzaW9uKSA9PiB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBleGNsdXNpb25bMF07IGkgPCBleGNsdXNpb25bMV07IGkgKz0gMSkgewogICAgICAgICAgICAgIGlzRXhjbHVkZWRbaV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBvcHRpb25zLmluZGVudFN0YXJ0ICE9PSBmYWxzZTsKICAgICAgICBjb25zdCByZXBsYWNlciA9IChtYXRjaCkgPT4gewogICAgICAgICAgaWYgKHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHJldHVybiBgJHtpbmRlbnRTdHJ9JHttYXRjaH1gOwogICAgICAgICAgc2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IHRydWU7CiAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VyKTsKICAgICAgICBsZXQgY2hhckluZGV4ID0gMDsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7CiAgICAgICAgd2hpbGUgKGNodW5rKSB7CiAgICAgICAgICBjb25zdCBlbmQgPSBjaHVuay5lbmQ7CiAgICAgICAgICBpZiAoY2h1bmsuZWRpdGVkKSB7CiAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7CiAgICAgICAgICAgICAgY2h1bmsuY29udGVudCA9IGNodW5rLmNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7CiAgICAgICAgICAgICAgaWYgKGNodW5rLmNvbnRlbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyID0gY2h1bmsuY29udGVudFtjaHVuay5jb250ZW50Lmxlbmd0aCAtIDFdID09PSAiXG4iOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7CiAgICAgICAgICAgIHdoaWxlIChjaGFySW5kZXggPCBlbmQpIHsKICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWRbY2hhckluZGV4XSkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciA9IHRoaXMub3JpZ2luYWxbY2hhckluZGV4XTsKICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9PSAiXHIiICYmIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHsKICAgICAgICAgICAgICAgICAgc2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBpZiAoY2hhckluZGV4ID09PSBjaHVuay5zdGFydCkgewogICAgICAgICAgICAgICAgICAgIGNodW5rLnByZXBlbmRSaWdodChpbmRlbnRTdHIpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NwbGl0Q2h1bmsoY2h1bmssIGNoYXJJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5uZXh0OwogICAgICAgICAgICAgICAgICAgIGNodW5rLnByZXBlbmRSaWdodChpbmRlbnRTdHIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNoYXJJbmRleCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjaGFySW5kZXggPSBjaHVuay5lbmQ7CiAgICAgICAgICBjaHVuayA9IGNodW5rLm5leHQ7CiAgICAgICAgfQogICAgICAgIHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZXIpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGluc2VydCgpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAibWFnaWNTdHJpbmcuaW5zZXJ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIHByZXBlbmRSaWdodCguLi4pIG9yIGFwcGVuZExlZnQoLi4uKSIKICAgICAgICApOwogICAgICB9CiAgICAgIGluc2VydExlZnQoaW5kZXgsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoIXdhcm5lZC5pbnNlcnRMZWZ0KSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgICAgICJtYWdpY1N0cmluZy5pbnNlcnRMZWZ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoLi4uKSBpbnN0ZWFkIgogICAgICAgICAgKTsKICAgICAgICAgIHdhcm5lZC5pbnNlcnRMZWZ0ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kTGVmdChpbmRleCwgY29udGVudCk7CiAgICAgIH0KICAgICAgaW5zZXJ0UmlnaHQoaW5kZXgsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoIXdhcm5lZC5pbnNlcnRSaWdodCkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAibWFnaWNTdHJpbmcuaW5zZXJ0UmlnaHQoLi4uKSBpcyBkZXByZWNhdGVkLiBVc2UgbWFnaWNTdHJpbmcucHJlcGVuZFJpZ2h0KC4uLikgaW5zdGVhZCIKICAgICAgICAgICk7CiAgICAgICAgICB3YXJuZWQuaW5zZXJ0UmlnaHQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5wcmVwZW5kUmlnaHQoaW5kZXgsIGNvbnRlbnQpOwogICAgICB9CiAgICAgIG1vdmUoc3RhcnQsIGVuZCwgaW5kZXgpIHsKICAgICAgICBzdGFydCA9IHN0YXJ0ICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgZW5kID0gZW5kICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgaW5kZXggPSBpbmRleCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmIChpbmRleCA+PSBzdGFydCAmJiBpbmRleCA8PSBlbmQpIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1vdmUgYSBzZWxlY3Rpb24gaW5zaWRlIGl0c2VsZiIpOwogICAgICAgIHRoaXMuX3NwbGl0KHN0YXJ0KTsKICAgICAgICB0aGlzLl9zcGxpdChlbmQpOwogICAgICAgIHRoaXMuX3NwbGl0KGluZGV4KTsKICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuYnlTdGFydFtzdGFydF07CiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMuYnlFbmRbZW5kXTsKICAgICAgICBjb25zdCBvbGRMZWZ0ID0gZmlyc3QucHJldmlvdXM7CiAgICAgICAgY29uc3Qgb2xkUmlnaHQgPSBsYXN0Lm5leHQ7CiAgICAgICAgY29uc3QgbmV3UmlnaHQgPSB0aGlzLmJ5U3RhcnRbaW5kZXhdOwogICAgICAgIGlmICghbmV3UmlnaHQgJiYgbGFzdCA9PT0gdGhpcy5sYXN0Q2h1bmspIHJldHVybiB0aGlzOwogICAgICAgIGNvbnN0IG5ld0xlZnQgPSBuZXdSaWdodCA/IG5ld1JpZ2h0LnByZXZpb3VzIDogdGhpcy5sYXN0Q2h1bms7CiAgICAgICAgaWYgKG9sZExlZnQpIG9sZExlZnQubmV4dCA9IG9sZFJpZ2h0OwogICAgICAgIGlmIChvbGRSaWdodCkgb2xkUmlnaHQucHJldmlvdXMgPSBvbGRMZWZ0OwogICAgICAgIGlmIChuZXdMZWZ0KSBuZXdMZWZ0Lm5leHQgPSBmaXJzdDsKICAgICAgICBpZiAobmV3UmlnaHQpIG5ld1JpZ2h0LnByZXZpb3VzID0gbGFzdDsKICAgICAgICBpZiAoIWZpcnN0LnByZXZpb3VzKSB0aGlzLmZpcnN0Q2h1bmsgPSBsYXN0Lm5leHQ7CiAgICAgICAgaWYgKCFsYXN0Lm5leHQpIHsKICAgICAgICAgIHRoaXMubGFzdENodW5rID0gZmlyc3QucHJldmlvdXM7CiAgICAgICAgICB0aGlzLmxhc3RDaHVuay5uZXh0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZmlyc3QucHJldmlvdXMgPSBuZXdMZWZ0OwogICAgICAgIGxhc3QubmV4dCA9IG5ld1JpZ2h0IHx8IG51bGw7CiAgICAgICAgaWYgKCFuZXdMZWZ0KSB0aGlzLmZpcnN0Q2h1bmsgPSBmaXJzdDsKICAgICAgICBpZiAoIW5ld1JpZ2h0KSB0aGlzLmxhc3RDaHVuayA9IGxhc3Q7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgb3ZlcndyaXRlKHN0YXJ0LCBlbmQsIGNvbnRlbnQsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoc3RhcnQsIGVuZCwgY29udGVudCwgeyAuLi5vcHRpb25zLCBvdmVyd3JpdGU6ICFvcHRpb25zLmNvbnRlbnRPbmx5IH0pOwogICAgICB9CiAgICAgIHVwZGF0ZShzdGFydCwgZW5kLCBjb250ZW50LCBvcHRpb25zKSB7CiAgICAgICAgc3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0OwogICAgICAgIGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmICh0eXBlb2YgY29udGVudCAhPT0gInN0cmluZyIpIHRocm93IG5ldyBUeXBlRXJyb3IoInJlcGxhY2VtZW50IGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgIGlmICh0aGlzLm9yaWdpbmFsLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBpZiAoZW5kID4gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcigiZW5kIGlzIG91dCBvZiBib3VuZHMiKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgIkNhbm5vdCBvdmVyd3JpdGUgYSB6ZXJvLWxlbmd0aCByYW5nZSBcdTIwMTMgdXNlIGFwcGVuZExlZnQgb3IgcHJlcGVuZFJpZ2h0IGluc3RlYWQiCiAgICAgICAgICApOwogICAgICAgIHRoaXMuX3NwbGl0KHN0YXJ0KTsKICAgICAgICB0aGlzLl9zcGxpdChlbmQpOwogICAgICAgIGlmIChvcHRpb25zID09PSB0cnVlKSB7CiAgICAgICAgICBpZiAoIXdhcm5lZC5zdG9yZU5hbWUpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAgICJUaGUgZmluYWwgYXJndW1lbnQgdG8gbWFnaWNTdHJpbmcub3ZlcndyaXRlKC4uLikgc2hvdWxkIGJlIGFuIG9wdGlvbnMgb2JqZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JpY2gtaGFycmlzL21hZ2ljLXN0cmluZyIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2FybmVkLnN0b3JlTmFtZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvcHRpb25zID0geyBzdG9yZU5hbWU6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RvcmVOYW1lID0gb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucy5zdG9yZU5hbWUgOiBmYWxzZTsKICAgICAgICBjb25zdCBvdmVyd3JpdGUgPSBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zLm92ZXJ3cml0ZSA6IGZhbHNlOwogICAgICAgIGlmIChzdG9yZU5hbWUpIHsKICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5vcmlnaW5hbC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnN0b3JlZE5hbWVzLCBvcmlnaW5hbCwgewogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuYnlTdGFydFtzdGFydF07CiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMuYnlFbmRbZW5kXTsKICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgIGxldCBjaHVuayA9IGZpcnN0OwogICAgICAgICAgd2hpbGUgKGNodW5rICE9PSBsYXN0KSB7CiAgICAgICAgICAgIGlmIChjaHVuay5uZXh0ICE9PSB0aGlzLmJ5U3RhcnRbY2h1bmsuZW5kXSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IG92ZXJ3cml0ZSBhY3Jvc3MgYSBzcGxpdCBwb2ludCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNodW5rID0gY2h1bmsubmV4dDsKICAgICAgICAgICAgY2h1bmsuZWRpdCgiIiwgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgZmlyc3QuZWRpdChjb250ZW50LCBzdG9yZU5hbWUsICFvdmVyd3JpdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBuZXdDaHVuayA9IG5ldyBDaHVuayhzdGFydCwgZW5kLCAiIikuZWRpdChjb250ZW50LCBzdG9yZU5hbWUpOwogICAgICAgICAgbGFzdC5uZXh0ID0gbmV3Q2h1bms7CiAgICAgICAgICBuZXdDaHVuay5wcmV2aW91cyA9IGxhc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHByZXBlbmQoY29udGVudCkgewogICAgICAgIGlmICh0eXBlb2YgY29udGVudCAhPT0gInN0cmluZyIpIHRocm93IG5ldyBUeXBlRXJyb3IoIm91dHJvIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgIHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybzsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBwcmVwZW5kTGVmdChpbmRleCwgY29udGVudCkgewogICAgICAgIGluZGV4ID0gaW5kZXggKyB0aGlzLm9mZnNldDsKICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICJzdHJpbmciKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICB0aGlzLl9zcGxpdChpbmRleCk7CiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLmJ5RW5kW2luZGV4XTsKICAgICAgICBpZiAoY2h1bmspIHsKICAgICAgICAgIGNodW5rLnByZXBlbmRMZWZ0KGNvbnRlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmludHJvID0gY29udGVudCArIHRoaXMuaW50cm87CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHByZXBlbmRSaWdodChpbmRleCwgY29udGVudCkgewogICAgICAgIGluZGV4ID0gaW5kZXggKyB0aGlzLm9mZnNldDsKICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICJzdHJpbmciKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICB0aGlzLl9zcGxpdChpbmRleCk7CiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbaW5kZXhdOwogICAgICAgIGlmIChjaHVuaykgewogICAgICAgICAgY2h1bmsucHJlcGVuZFJpZ2h0KGNvbnRlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm91dHJvID0gY29udGVudCArIHRoaXMub3V0cm87CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHJlbW92ZShzdGFydCwgZW5kKSB7CiAgICAgICAgc3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0OwogICAgICAgIGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmICh0aGlzLm9yaWdpbmFsLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0aGlzLm9yaWdpbmFsLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCJDaGFyYWN0ZXIgaXMgb3V0IG9mIGJvdW5kcyIpOwogICAgICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IEVycm9yKCJlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQiKTsKICAgICAgICB0aGlzLl9zcGxpdChzdGFydCk7CiAgICAgICAgdGhpcy5fc3BsaXQoZW5kKTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdOwogICAgICAgIHdoaWxlIChjaHVuaykgewogICAgICAgICAgY2h1bmsuaW50cm8gPSAiIjsKICAgICAgICAgIGNodW5rLm91dHJvID0gIiI7CiAgICAgICAgICBjaHVuay5lZGl0KCIiKTsKICAgICAgICAgIGNodW5rID0gZW5kID4gY2h1bmsuZW5kID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICByZXNldChzdGFydCwgZW5kKSB7CiAgICAgICAgc3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0OwogICAgICAgIGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmICh0aGlzLm9yaWdpbmFsLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0aGlzLm9yaWdpbmFsLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCJDaGFyYWN0ZXIgaXMgb3V0IG9mIGJvdW5kcyIpOwogICAgICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IEVycm9yKCJlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQiKTsKICAgICAgICB0aGlzLl9zcGxpdChzdGFydCk7CiAgICAgICAgdGhpcy5fc3BsaXQoZW5kKTsKICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdOwogICAgICAgIHdoaWxlIChjaHVuaykgewogICAgICAgICAgY2h1bmsucmVzZXQoKTsKICAgICAgICAgIGNodW5rID0gZW5kID4gY2h1bmsuZW5kID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBsYXN0Q2hhcigpIHsKICAgICAgICBpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0aGlzLm91dHJvW3RoaXMub3V0cm8ubGVuZ3RoIC0gMV07CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGNodW5rLm91dHJvLmxlbmd0aCkgcmV0dXJuIGNodW5rLm91dHJvW2NodW5rLm91dHJvLmxlbmd0aCAtIDFdOwogICAgICAgICAgaWYgKGNodW5rLmNvbnRlbnQubGVuZ3RoKSByZXR1cm4gY2h1bmsuY29udGVudFtjaHVuay5jb250ZW50Lmxlbmd0aCAtIDFdOwogICAgICAgICAgaWYgKGNodW5rLmludHJvLmxlbmd0aCkgcmV0dXJuIGNodW5rLmludHJvW2NodW5rLmludHJvLmxlbmd0aCAtIDFdOwogICAgICAgIH0gd2hpbGUgKGNodW5rID0gY2h1bmsucHJldmlvdXMpOwogICAgICAgIGlmICh0aGlzLmludHJvLmxlbmd0aCkgcmV0dXJuIHRoaXMuaW50cm9bdGhpcy5pbnRyby5sZW5ndGggLSAxXTsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgbGFzdExpbmUoKSB7CiAgICAgICAgbGV0IGxpbmVJbmRleCA9IHRoaXMub3V0cm8ubGFzdEluZGV4T2Yobik7CiAgICAgICAgaWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiB0aGlzLm91dHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKTsKICAgICAgICBsZXQgbGluZVN0ciA9IHRoaXMub3V0cm87CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGNodW5rLm91dHJvLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGluZUluZGV4ID0gY2h1bmsub3V0cm8ubGFzdEluZGV4T2Yobik7CiAgICAgICAgICAgIGlmIChsaW5lSW5kZXggIT09IC0xKSByZXR1cm4gY2h1bmsub3V0cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjsKICAgICAgICAgICAgbGluZVN0ciA9IGNodW5rLm91dHJvICsgbGluZVN0cjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaHVuay5jb250ZW50Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGluZUluZGV4ID0gY2h1bmsuY29udGVudC5sYXN0SW5kZXhPZihuKTsKICAgICAgICAgICAgaWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiBjaHVuay5jb250ZW50LnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7CiAgICAgICAgICAgIGxpbmVTdHIgPSBjaHVuay5jb250ZW50ICsgbGluZVN0cjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaHVuay5pbnRyby5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxpbmVJbmRleCA9IGNodW5rLmludHJvLmxhc3RJbmRleE9mKG4pOwogICAgICAgICAgICBpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIGNodW5rLmludHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7CiAgICAgICAgICAgIGxpbmVTdHIgPSBjaHVuay5pbnRybyArIGxpbmVTdHI7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoY2h1bmsgPSBjaHVuay5wcmV2aW91cyk7CiAgICAgICAgbGluZUluZGV4ID0gdGhpcy5pbnRyby5sYXN0SW5kZXhPZihuKTsKICAgICAgICBpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIHRoaXMuaW50cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjsKICAgICAgICByZXR1cm4gdGhpcy5pbnRybyArIGxpbmVTdHI7CiAgICAgIH0KICAgICAgc2xpY2Uoc3RhcnQgPSAwLCBlbmQgPSB0aGlzLm9yaWdpbmFsLmxlbmd0aCAtIHRoaXMub2Zmc2V0KSB7CiAgICAgICAgc3RhcnQgPSBzdGFydCArIHRoaXMub2Zmc2V0OwogICAgICAgIGVuZCA9IGVuZCArIHRoaXMub2Zmc2V0OwogICAgICAgIGlmICh0aGlzLm9yaWdpbmFsLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rOwogICAgICAgIHdoaWxlIChjaHVuayAmJiAoY2h1bmsuc3RhcnQgPiBzdGFydCB8fCBjaHVuay5lbmQgPD0gc3RhcnQpKSB7CiAgICAgICAgICBpZiAoY2h1bmsuc3RhcnQgPCBlbmQgJiYgY2h1bmsuZW5kID49IGVuZCkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgY2h1bmsgPSBjaHVuay5uZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoY2h1bmsgJiYgY2h1bmsuZWRpdGVkICYmIGNodW5rLnN0YXJ0ICE9PSBzdGFydCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSByZXBsYWNlZCBjaGFyYWN0ZXIgJHtzdGFydH0gYXMgc2xpY2Ugc3RhcnQgYW5jaG9yLmApOwogICAgICAgIGNvbnN0IHN0YXJ0Q2h1bmsgPSBjaHVuazsKICAgICAgICB3aGlsZSAoY2h1bmspIHsKICAgICAgICAgIGlmIChjaHVuay5pbnRybyAmJiAoc3RhcnRDaHVuayAhPT0gY2h1bmsgfHwgY2h1bmsuc3RhcnQgPT09IHN0YXJ0KSkgewogICAgICAgICAgICByZXN1bHQgKz0gY2h1bmsuaW50cm87CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjb250YWluc0VuZCA9IGNodW5rLnN0YXJ0IDwgZW5kICYmIGNodW5rLmVuZCA+PSBlbmQ7CiAgICAgICAgICBpZiAoY29udGFpbnNFbmQgJiYgY2h1bmsuZWRpdGVkICYmIGNodW5rLmVuZCAhPT0gZW5kKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyICR7ZW5kfSBhcyBzbGljZSBlbmQgYW5jaG9yLmApOwogICAgICAgICAgY29uc3Qgc2xpY2VTdGFydCA9IHN0YXJ0Q2h1bmsgPT09IGNodW5rID8gc3RhcnQgLSBjaHVuay5zdGFydCA6IDA7CiAgICAgICAgICBjb25zdCBzbGljZUVuZCA9IGNvbnRhaW5zRW5kID8gY2h1bmsuY29udGVudC5sZW5ndGggKyBlbmQgLSBjaHVuay5lbmQgOiBjaHVuay5jb250ZW50Lmxlbmd0aDsKICAgICAgICAgIHJlc3VsdCArPSBjaHVuay5jb250ZW50LnNsaWNlKHNsaWNlU3RhcnQsIHNsaWNlRW5kKTsKICAgICAgICAgIGlmIChjaHVuay5vdXRybyAmJiAoIWNvbnRhaW5zRW5kIHx8IGNodW5rLmVuZCA9PT0gZW5kKSkgewogICAgICAgICAgICByZXN1bHQgKz0gY2h1bmsub3V0cm87CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29udGFpbnNFbmQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaHVuayA9IGNodW5rLm5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgLy8gVE9ETyBkZXByZWNhdGUgdGhpcz8gbm90IHJlYWxseSB2ZXJ5IHVzZWZ1bAogICAgICBzbmlwKHN0YXJ0LCBlbmQpIHsKICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTsKICAgICAgICBjbG9uZS5yZW1vdmUoMCwgc3RhcnQpOwogICAgICAgIGNsb25lLnJlbW92ZShlbmQsIGNsb25lLm9yaWdpbmFsLmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgICB9CiAgICAgIF9zcGxpdChpbmRleCkgewogICAgICAgIGlmICh0aGlzLmJ5U3RhcnRbaW5kZXhdIHx8IHRoaXMuYnlFbmRbaW5kZXhdKSByZXR1cm47CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5sYXN0U2VhcmNoZWRDaHVuazsKICAgICAgICBjb25zdCBzZWFyY2hGb3J3YXJkID0gaW5kZXggPiBjaHVuay5lbmQ7CiAgICAgICAgd2hpbGUgKGNodW5rKSB7CiAgICAgICAgICBpZiAoY2h1bmsuY29udGFpbnMoaW5kZXgpKSByZXR1cm4gdGhpcy5fc3BsaXRDaHVuayhjaHVuaywgaW5kZXgpOwogICAgICAgICAgY2h1bmsgPSBzZWFyY2hGb3J3YXJkID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiB0aGlzLmJ5RW5kW2NodW5rLnN0YXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3NwbGl0Q2h1bmsoY2h1bmssIGluZGV4KSB7CiAgICAgICAgaWYgKGNodW5rLmVkaXRlZCAmJiBjaHVuay5jb250ZW50Lmxlbmd0aCkgewogICAgICAgICAgY29uc3QgbG9jID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKShpbmRleCk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgIGBDYW5ub3Qgc3BsaXQgYSBjaHVuayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZWRpdGVkICgke2xvYy5saW5lfToke2xvYy5jb2x1bW59IFx1MjAxMyAiJHtjaHVuay5vcmlnaW5hbH0iKWAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld0NodW5rID0gY2h1bmsuc3BsaXQoaW5kZXgpOwogICAgICAgIHRoaXMuYnlFbmRbaW5kZXhdID0gY2h1bms7CiAgICAgICAgdGhpcy5ieVN0YXJ0W2luZGV4XSA9IG5ld0NodW5rOwogICAgICAgIHRoaXMuYnlFbmRbbmV3Q2h1bmsuZW5kXSA9IG5ld0NodW5rOwogICAgICAgIGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gbmV3Q2h1bms7CiAgICAgICAgdGhpcy5sYXN0U2VhcmNoZWRDaHVuayA9IGNodW5rOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIGxldCBzdHIgPSB0aGlzLmludHJvOwogICAgICAgIGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuazsKICAgICAgICB3aGlsZSAoY2h1bmspIHsKICAgICAgICAgIHN0ciArPSBjaHVuay50b1N0cmluZygpOwogICAgICAgICAgY2h1bmsgPSBjaHVuay5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyICsgdGhpcy5vdXRybzsKICAgICAgfQogICAgICBpc0VtcHR5KCkgewogICAgICAgIGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuazsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoY2h1bmsuaW50cm8ubGVuZ3RoICYmIGNodW5rLmludHJvLnRyaW0oKSB8fCBjaHVuay5jb250ZW50Lmxlbmd0aCAmJiBjaHVuay5jb250ZW50LnRyaW0oKSB8fCBjaHVuay5vdXRyby5sZW5ndGggJiYgY2h1bmsub3V0cm8udHJpbSgpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSB3aGlsZSAoY2h1bmsgPSBjaHVuay5uZXh0KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZW5ndGgoKSB7CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rOwogICAgICAgIGxldCBsZW5ndGggPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgIGxlbmd0aCArPSBjaHVuay5pbnRyby5sZW5ndGggKyBjaHVuay5jb250ZW50Lmxlbmd0aCArIGNodW5rLm91dHJvLmxlbmd0aDsKICAgICAgICB9IHdoaWxlIChjaHVuayA9IGNodW5rLm5leHQpOwogICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgIH0KICAgICAgdHJpbUxpbmVzKCkgewogICAgICAgIHJldHVybiB0aGlzLnRyaW0oIltcXHJcXG5dIik7CiAgICAgIH0KICAgICAgdHJpbShjaGFyVHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLnRyaW1TdGFydChjaGFyVHlwZSkudHJpbUVuZChjaGFyVHlwZSk7CiAgICAgIH0KICAgICAgdHJpbUVuZEFib3J0ZWQoY2hhclR5cGUpIHsKICAgICAgICBjb25zdCByeCA9IG5ldyBSZWdFeHAoKGNoYXJUeXBlIHx8ICJcXHMiKSArICIrJCIpOwogICAgICAgIHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICIiKTsKICAgICAgICBpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlOwogICAgICAgIGxldCBjaHVuayA9IHRoaXMubGFzdENodW5rOwogICAgICAgIGRvIHsKICAgICAgICAgIGNvbnN0IGVuZCA9IGNodW5rLmVuZDsKICAgICAgICAgIGNvbnN0IGFib3J0ZWQgPSBjaHVuay50cmltRW5kKHJ4KTsKICAgICAgICAgIGlmIChjaHVuay5lbmQgIT09IGVuZCkgewogICAgICAgICAgICBpZiAodGhpcy5sYXN0Q2h1bmsgPT09IGNodW5rKSB7CiAgICAgICAgICAgICAgdGhpcy5sYXN0Q2h1bmsgPSBjaHVuay5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYnlFbmRbY2h1bmsuZW5kXSA9IGNodW5rOwogICAgICAgICAgICB0aGlzLmJ5U3RhcnRbY2h1bmsubmV4dC5zdGFydF0gPSBjaHVuay5uZXh0OwogICAgICAgICAgICB0aGlzLmJ5RW5kW2NodW5rLm5leHQuZW5kXSA9IGNodW5rLm5leHQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgICBjaHVuayA9IGNodW5rLnByZXZpb3VzOwogICAgICAgIH0gd2hpbGUgKGNodW5rKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdHJpbUVuZChjaGFyVHlwZSkgewogICAgICAgIHRoaXMudHJpbUVuZEFib3J0ZWQoY2hhclR5cGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHRyaW1TdGFydEFib3J0ZWQoY2hhclR5cGUpIHsKICAgICAgICBjb25zdCByeCA9IG5ldyBSZWdFeHAoIl4iICsgKGNoYXJUeXBlIHx8ICJcXHMiKSArICIrIik7CiAgICAgICAgdGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgIiIpOwogICAgICAgIGlmICh0aGlzLmludHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rOwogICAgICAgIGRvIHsKICAgICAgICAgIGNvbnN0IGVuZCA9IGNodW5rLmVuZDsKICAgICAgICAgIGNvbnN0IGFib3J0ZWQgPSBjaHVuay50cmltU3RhcnQocngpOwogICAgICAgICAgaWYgKGNodW5rLmVuZCAhPT0gZW5kKSB7CiAgICAgICAgICAgIGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDsKICAgICAgICAgICAgdGhpcy5ieUVuZFtjaHVuay5lbmRdID0gY2h1bms7CiAgICAgICAgICAgIHRoaXMuYnlTdGFydFtjaHVuay5uZXh0LnN0YXJ0XSA9IGNodW5rLm5leHQ7CiAgICAgICAgICAgIHRoaXMuYnlFbmRbY2h1bmsubmV4dC5lbmRdID0gY2h1bmsubmV4dDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGNodW5rID0gY2h1bmsubmV4dDsKICAgICAgICB9IHdoaWxlIChjaHVuayk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRyaW1TdGFydChjaGFyVHlwZSkgewogICAgICAgIHRoaXMudHJpbVN0YXJ0QWJvcnRlZChjaGFyVHlwZSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaGFzQ2hhbmdlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbCAhPT0gdGhpcy50b1N0cmluZygpOwogICAgICB9CiAgICAgIF9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkgewogICAgICAgIGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50KG1hdGNoLCBzdHIpIHsKICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudC5yZXBsYWNlKC9cJChcJHwmfFxkKykvZywgKF8sIGkpID0+IHsKICAgICAgICAgICAgICBpZiAoaSA9PT0gIiQiKSByZXR1cm4gIiQiOwogICAgICAgICAgICAgIGlmIChpID09PSAiJiIpIHJldHVybiBtYXRjaFswXTsKICAgICAgICAgICAgICBjb25zdCBudW0gPSAraTsKICAgICAgICAgICAgICBpZiAobnVtIDwgbWF0Y2gubGVuZ3RoKSByZXR1cm4gbWF0Y2hbK2ldOwogICAgICAgICAgICAgIHJldHVybiBgJCR7aX1gOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudCguLi5tYXRjaCwgbWF0Y2guaW5kZXgsIHN0ciwgbWF0Y2guZ3JvdXBzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbWF0Y2hBbGwocmUsIHN0cikgewogICAgICAgICAgbGV0IG1hdGNoOwogICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgd2hpbGUgKG1hdGNoID0gcmUuZXhlYyhzdHIpKSB7CiAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKICAgICAgICB9CiAgICAgICAgaWYgKHNlYXJjaFZhbHVlLmdsb2JhbCkgewogICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IG1hdGNoQWxsKHNlYXJjaFZhbHVlLCB0aGlzLm9yaWdpbmFsKTsKICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHsKICAgICAgICAgICAgaWYgKG1hdGNoLmluZGV4ICE9IG51bGwpIHsKICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudDIgPSBnZXRSZXBsYWNlbWVudChtYXRjaCwgdGhpcy5vcmlnaW5hbCk7CiAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50MiAhPT0gbWF0Y2hbMF0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3ZlcndyaXRlKG1hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCwgcmVwbGFjZW1lbnQyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMub3JpZ2luYWwubWF0Y2goc2VhcmNoVmFsdWUpOwogICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ICE9IG51bGwpIHsKICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQyID0gZ2V0UmVwbGFjZW1lbnQobWF0Y2gsIHRoaXMub3JpZ2luYWwpOwogICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQyICE9PSBtYXRjaFswXSkgewogICAgICAgICAgICAgIHRoaXMub3ZlcndyaXRlKG1hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCwgcmVwbGFjZW1lbnQyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBfcmVwbGFjZVN0cmluZyhzdHJpbmcsIHJlcGxhY2VtZW50KSB7CiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gdGhpczsKICAgICAgICBjb25zdCBpbmRleCA9IG9yaWdpbmFsLmluZGV4T2Yoc3RyaW5nKTsKICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICB0aGlzLm92ZXJ3cml0ZShpbmRleCwgaW5kZXggKyBzdHJpbmcubGVuZ3RoLCByZXBsYWNlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KSB7CiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hWYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9yZXBsYWNlU3RyaW5nKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7CiAgICAgIH0KICAgICAgX3JlcGxhY2VBbGxTdHJpbmcoc3RyaW5nLCByZXBsYWNlbWVudCkgewogICAgICAgIGNvbnN0IHsgb3JpZ2luYWwgfSA9IHRoaXM7CiAgICAgICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IG9yaWdpbmFsLmluZGV4T2Yoc3RyaW5nKTsgaW5kZXggIT09IC0xOyBpbmRleCA9IG9yaWdpbmFsLmluZGV4T2Yoc3RyaW5nLCBpbmRleCArIHN0cmluZ0xlbmd0aCkpIHsKICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gb3JpZ2luYWwuc2xpY2UoaW5kZXgsIGluZGV4ICsgc3RyaW5nTGVuZ3RoKTsKICAgICAgICAgIGlmIChwcmV2aW91cyAhPT0gcmVwbGFjZW1lbnQpIHRoaXMub3ZlcndyaXRlKGluZGV4LCBpbmRleCArIHN0cmluZ0xlbmd0aCwgcmVwbGFjZW1lbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICByZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkgewogICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVwbGFjZUFsbFN0cmluZyhzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpOwogICAgICAgIH0KICAgICAgICBpZiAoIXNlYXJjaFZhbHVlLmdsb2JhbCkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsIGNhbGxlZCB3aXRoIGEgbm9uLWdsb2JhbCBSZWdFeHAgYXJndW1lbnQiCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcmVwbGFjZVJlZ2V4cChzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpOwogICAgICB9CiAgICB9OwogICAgdmFyIGhhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgdmFyIEJ1bmRsZSA9IGNsYXNzIF9CdW5kbGUgewogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgICAgICB0aGlzLmludHJvID0gb3B0aW9ucy5pbnRybyB8fCAiIjsKICAgICAgICB0aGlzLnNlcGFyYXRvciA9IG9wdGlvbnMuc2VwYXJhdG9yICE9PSB2b2lkIDAgPyBvcHRpb25zLnNlcGFyYXRvciA6ICJcbiI7CiAgICAgICAgdGhpcy5zb3VyY2VzID0gW107CiAgICAgICAgdGhpcy51bmlxdWVTb3VyY2VzID0gW107CiAgICAgICAgdGhpcy51bmlxdWVTb3VyY2VJbmRleEJ5RmlsZW5hbWUgPSB7fTsKICAgICAgfQogICAgICBhZGRTb3VyY2Uoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE1hZ2ljU3RyaW5nKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hZGRTb3VyY2UoewogICAgICAgICAgICBjb250ZW50OiBzb3VyY2UsCiAgICAgICAgICAgIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsCiAgICAgICAgICAgIHNlcGFyYXRvcjogdGhpcy5zZXBhcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzT2JqZWN0KHNvdXJjZSkgfHwgIXNvdXJjZS5jb250ZW50KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICJidW5kbGUuYWRkU291cmNlKCkgdGFrZXMgYW4gb2JqZWN0IHdpdGggYSBgY29udGVudGAgcHJvcGVydHksIHdoaWNoIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBNYWdpY1N0cmluZywgYW5kIGFuIG9wdGlvbmFsIGBmaWxlbmFtZWAiCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBbImZpbGVuYW1lIiwgImlnbm9yZUxpc3QiLCAiaW5kZW50RXhjbHVzaW9uUmFuZ2VzIiwgInNlcGFyYXRvciJdLmZvckVhY2goKG9wdGlvbikgPT4gewogICAgICAgICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwoc291cmNlLCBvcHRpb24pKSBzb3VyY2Vbb3B0aW9uXSA9IHNvdXJjZS5jb250ZW50W29wdGlvbl07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHNvdXJjZS5zZXBhcmF0b3IgPT09IHZvaWQgMCkgewogICAgICAgICAgc291cmNlLnNlcGFyYXRvciA9IHRoaXMuc2VwYXJhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLmZpbGVuYW1lKSB7CiAgICAgICAgICBpZiAoIWhhc093blByb3AuY2FsbCh0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZSwgc291cmNlLmZpbGVuYW1lKSkgewogICAgICAgICAgICB0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdID0gdGhpcy51bmlxdWVTb3VyY2VzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy51bmlxdWVTb3VyY2VzLnB1c2goeyBmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLCBjb250ZW50OiBzb3VyY2UuY29udGVudC5vcmlnaW5hbCB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVNvdXJjZSA9IHRoaXMudW5pcXVlU291cmNlc1t0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdXTsKICAgICAgICAgICAgaWYgKHNvdXJjZS5jb250ZW50Lm9yaWdpbmFsICE9PSB1bmlxdWVTb3VyY2UuY29udGVudCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBzb3VyY2U6IHNhbWUgZmlsZW5hbWUgKCR7c291cmNlLmZpbGVuYW1lfSksIGRpZmZlcmVudCBjb250ZW50c2ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHNvdXJjZSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgYXBwZW5kKHN0ciwgb3B0aW9ucykgewogICAgICAgIHRoaXMuYWRkU291cmNlKHsKICAgICAgICAgIGNvbnRlbnQ6IG5ldyBNYWdpY1N0cmluZyhzdHIpLAogICAgICAgICAgc2VwYXJhdG9yOiBvcHRpb25zICYmIG9wdGlvbnMuc2VwYXJhdG9yIHx8ICIiCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgY2xvbmUoKSB7CiAgICAgICAgY29uc3QgYnVuZGxlID0gbmV3IF9CdW5kbGUoewogICAgICAgICAgaW50cm86IHRoaXMuaW50cm8sCiAgICAgICAgICBzZXBhcmF0b3I6IHRoaXMuc2VwYXJhdG9yCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4gewogICAgICAgICAgYnVuZGxlLmFkZFNvdXJjZSh7CiAgICAgICAgICAgIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsCiAgICAgICAgICAgIGNvbnRlbnQ6IHNvdXJjZS5jb250ZW50LmNsb25lKCksCiAgICAgICAgICAgIHNlcGFyYXRvcjogc291cmNlLnNlcGFyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICAgfQogICAgICBnZW5lcmF0ZURlY29kZWRNYXAob3B0aW9ucyA9IHt9KSB7CiAgICAgICAgY29uc3QgbmFtZXMgPSBbXTsKICAgICAgICBsZXQgeF9nb29nbGVfaWdub3JlTGlzdCA9IHZvaWQgMDsKICAgICAgICB0aGlzLnNvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB7CiAgICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UuY29udGVudC5zdG9yZWROYW1lcykuZm9yRWFjaCgobmFtZSkgPT4gewogICAgICAgICAgICBpZiAoIX5uYW1lcy5pbmRleE9mKG5hbWUpKSBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBuZXcgTWFwcGluZ3Mob3B0aW9ucy5oaXJlcyk7CiAgICAgICAgaWYgKHRoaXMuaW50cm8pIHsKICAgICAgICAgIG1hcHBpbmdzLmFkdmFuY2UodGhpcy5pbnRybyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGkpID0+IHsKICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICBtYXBwaW5ncy5hZHZhbmNlKHRoaXMuc2VwYXJhdG9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gc291cmNlLmZpbGVuYW1lID8gdGhpcy51bmlxdWVTb3VyY2VJbmRleEJ5RmlsZW5hbWVbc291cmNlLmZpbGVuYW1lXSA6IC0xOwogICAgICAgICAgY29uc3QgbWFnaWNTdHJpbmcgPSBzb3VyY2UuY29udGVudDsKICAgICAgICAgIGNvbnN0IGxvY2F0ZSA9IGdldExvY2F0b3IobWFnaWNTdHJpbmcub3JpZ2luYWwpOwogICAgICAgICAgaWYgKG1hZ2ljU3RyaW5nLmludHJvKSB7CiAgICAgICAgICAgIG1hcHBpbmdzLmFkdmFuY2UobWFnaWNTdHJpbmcuaW50cm8pOwogICAgICAgICAgfQogICAgICAgICAgbWFnaWNTdHJpbmcuZmlyc3RDaHVuay5lYWNoTmV4dCgoY2h1bmspID0+IHsKICAgICAgICAgICAgY29uc3QgbG9jID0gbG9jYXRlKGNodW5rLnN0YXJ0KTsKICAgICAgICAgICAgaWYgKGNodW5rLmludHJvLmxlbmd0aCkgbWFwcGluZ3MuYWR2YW5jZShjaHVuay5pbnRybyk7CiAgICAgICAgICAgIGlmIChzb3VyY2UuZmlsZW5hbWUpIHsKICAgICAgICAgICAgICBpZiAoY2h1bmsuZWRpdGVkKSB7CiAgICAgICAgICAgICAgICBtYXBwaW5ncy5hZGRFZGl0KAogICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCwKICAgICAgICAgICAgICAgICAgY2h1bmsuY29udGVudCwKICAgICAgICAgICAgICAgICAgbG9jLAogICAgICAgICAgICAgICAgICBjaHVuay5zdG9yZU5hbWUgPyBuYW1lcy5pbmRleE9mKGNodW5rLm9yaWdpbmFsKSA6IC0xCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtYXBwaW5ncy5hZGRVbmVkaXRlZENodW5rKAogICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCwKICAgICAgICAgICAgICAgICAgY2h1bmssCiAgICAgICAgICAgICAgICAgIG1hZ2ljU3RyaW5nLm9yaWdpbmFsLAogICAgICAgICAgICAgICAgICBsb2MsCiAgICAgICAgICAgICAgICAgIG1hZ2ljU3RyaW5nLnNvdXJjZW1hcExvY2F0aW9ucwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWFwcGluZ3MuYWR2YW5jZShjaHVuay5jb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2h1bmsub3V0cm8ubGVuZ3RoKSBtYXBwaW5ncy5hZHZhbmNlKGNodW5rLm91dHJvKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKG1hZ2ljU3RyaW5nLm91dHJvKSB7CiAgICAgICAgICAgIG1hcHBpbmdzLmFkdmFuY2UobWFnaWNTdHJpbmcub3V0cm8pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNvdXJjZS5pZ25vcmVMaXN0ICYmIHNvdXJjZUluZGV4ICE9PSAtMSkgewogICAgICAgICAgICBpZiAoeF9nb29nbGVfaWdub3JlTGlzdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgeF9nb29nbGVfaWdub3JlTGlzdCA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhfZ29vZ2xlX2lnbm9yZUxpc3QucHVzaChzb3VyY2VJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGZpbGU6IG9wdGlvbnMuZmlsZSA/IG9wdGlvbnMuZmlsZS5zcGxpdCgvWy9cXF0vKS5wb3AoKSA6IHZvaWQgMCwKICAgICAgICAgIHNvdXJjZXM6IHRoaXMudW5pcXVlU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5maWxlID8gZ2V0UmVsYXRpdmVQYXRoKG9wdGlvbnMuZmlsZSwgc291cmNlLmZpbGVuYW1lKSA6IHNvdXJjZS5maWxlbmFtZTsKICAgICAgICAgIH0pLAogICAgICAgICAgc291cmNlc0NvbnRlbnQ6IHRoaXMudW5pcXVlU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbmNsdWRlQ29udGVudCA/IHNvdXJjZS5jb250ZW50IDogbnVsbDsKICAgICAgICAgIH0pLAogICAgICAgICAgbmFtZXMsCiAgICAgICAgICBtYXBwaW5nczogbWFwcGluZ3MucmF3LAogICAgICAgICAgeF9nb29nbGVfaWdub3JlTGlzdAogICAgICAgIH07CiAgICAgIH0KICAgICAgZ2VuZXJhdGVNYXAob3B0aW9ucykgewogICAgICAgIHJldHVybiBuZXcgU291cmNlTWFwKHRoaXMuZ2VuZXJhdGVEZWNvZGVkTWFwKG9wdGlvbnMpKTsKICAgICAgfQogICAgICBnZXRJbmRlbnRTdHJpbmcoKSB7CiAgICAgICAgY29uc3QgaW5kZW50U3RyaW5nQ291bnRzID0ge307CiAgICAgICAgdGhpcy5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4gewogICAgICAgICAgY29uc3QgaW5kZW50U3RyID0gc291cmNlLmNvbnRlbnQuX2dldFJhd0luZGVudFN0cmluZygpOwogICAgICAgICAgaWYgKGluZGVudFN0ciA9PT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgaWYgKCFpbmRlbnRTdHJpbmdDb3VudHNbaW5kZW50U3RyXSkgaW5kZW50U3RyaW5nQ291bnRzW2luZGVudFN0cl0gPSAwOwogICAgICAgICAgaW5kZW50U3RyaW5nQ291bnRzW2luZGVudFN0cl0gKz0gMTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaW5kZW50U3RyaW5nQ291bnRzKS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICByZXR1cm4gaW5kZW50U3RyaW5nQ291bnRzW2FdIC0gaW5kZW50U3RyaW5nQ291bnRzW2JdOwogICAgICAgIH0pWzBdIHx8ICIJIjsKICAgICAgfQogICAgICBpbmRlbnQoaW5kZW50U3RyKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpbmRlbnRTdHIgPSB0aGlzLmdldEluZGVudFN0cmluZygpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZW50U3RyID09PSAiIikgcmV0dXJuIHRoaXM7CiAgICAgICAgbGV0IHRyYWlsaW5nTmV3bGluZSA9ICF0aGlzLmludHJvIHx8IHRoaXMuaW50cm8uc2xpY2UoLTEpID09PSAiXG4iOwogICAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNvdXJjZS5zZXBhcmF0b3IgIT09IHZvaWQgMCA/IHNvdXJjZS5zZXBhcmF0b3IgOiB0aGlzLnNlcGFyYXRvcjsKICAgICAgICAgIGNvbnN0IGluZGVudFN0YXJ0ID0gdHJhaWxpbmdOZXdsaW5lIHx8IGkgPiAwICYmIC9ccj9cbiQvLnRlc3Qoc2VwYXJhdG9yKTsKICAgICAgICAgIHNvdXJjZS5jb250ZW50LmluZGVudChpbmRlbnRTdHIsIHsKICAgICAgICAgICAgZXhjbHVkZTogc291cmNlLmluZGVudEV4Y2x1c2lvblJhbmdlcywKICAgICAgICAgICAgaW5kZW50U3RhcnQKICAgICAgICAgICAgLy86IHRyYWlsaW5nTmV3bGluZSB8fCAvXHI/XG4kLy50ZXN0KCBzZXBhcmF0b3IgKSAgLy90cnVlLy8vXHI/XG4vLnRlc3QoIHNlcGFyYXRvciApCiAgICAgICAgICB9KTsKICAgICAgICAgIHRyYWlsaW5nTmV3bGluZSA9IHNvdXJjZS5jb250ZW50Lmxhc3RDaGFyKCkgPT09ICJcbiI7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMuaW50cm8pIHsKICAgICAgICAgIHRoaXMuaW50cm8gPSBpbmRlbnRTdHIgKyB0aGlzLmludHJvLnJlcGxhY2UoL15bXlxuXS9nbSwgKG1hdGNoLCBpbmRleCkgPT4gewogICAgICAgICAgICByZXR1cm4gaW5kZXggPiAwID8gaW5kZW50U3RyICsgbWF0Y2ggOiBtYXRjaDsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBwcmVwZW5kKHN0cikgewogICAgICAgIHRoaXMuaW50cm8gPSBzdHIgKyB0aGlzLmludHJvOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLnNvdXJjZXMubWFwKChzb3VyY2UsIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNvdXJjZS5zZXBhcmF0b3IgIT09IHZvaWQgMCA/IHNvdXJjZS5zZXBhcmF0b3IgOiB0aGlzLnNlcGFyYXRvcjsKICAgICAgICAgIGNvbnN0IHN0ciA9IChpID4gMCA/IHNlcGFyYXRvciA6ICIiKSArIHNvdXJjZS5jb250ZW50LnRvU3RyaW5nKCk7CiAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0pLmpvaW4oIiIpOwogICAgICAgIHJldHVybiB0aGlzLmludHJvICsgYm9keTsKICAgICAgfQogICAgICBpc0VtcHR5KCkgewogICAgICAgIGlmICh0aGlzLmludHJvLmxlbmd0aCAmJiB0aGlzLmludHJvLnRyaW0oKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICh0aGlzLnNvdXJjZXMuc29tZSgoc291cmNlKSA9PiAhc291cmNlLmNvbnRlbnQuaXNFbXB0eSgpKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxlbmd0aCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzLnJlZHVjZSgKICAgICAgICAgIChsZW5ndGgsIHNvdXJjZSkgPT4gbGVuZ3RoICsgc291cmNlLmNvbnRlbnQubGVuZ3RoKCksCiAgICAgICAgICB0aGlzLmludHJvLmxlbmd0aAogICAgICAgICk7CiAgICAgIH0KICAgICAgdHJpbUxpbmVzKCkgewogICAgICAgIHJldHVybiB0aGlzLnRyaW0oIltcXHJcXG5dIik7CiAgICAgIH0KICAgICAgdHJpbShjaGFyVHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLnRyaW1TdGFydChjaGFyVHlwZSkudHJpbUVuZChjaGFyVHlwZSk7CiAgICAgIH0KICAgICAgdHJpbVN0YXJ0KGNoYXJUeXBlKSB7CiAgICAgICAgY29uc3QgcnggPSBuZXcgUmVnRXhwKCJeIiArIChjaGFyVHlwZSB8fCAiXFxzIikgKyAiKyIpOwogICAgICAgIHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocngsICIiKTsKICAgICAgICBpZiAoIXRoaXMuaW50cm8pIHsKICAgICAgICAgIGxldCBzb3VyY2U7CiAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuc291cmNlc1tpKytdOwogICAgICAgICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IHdoaWxlICghc291cmNlLmNvbnRlbnQudHJpbVN0YXJ0QWJvcnRlZChjaGFyVHlwZSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICB0cmltRW5kKGNoYXJUeXBlKSB7CiAgICAgICAgY29uc3QgcnggPSBuZXcgUmVnRXhwKChjaGFyVHlwZSB8fCAiXFxzIikgKyAiKyQiKTsKICAgICAgICBsZXQgc291cmNlOwogICAgICAgIGxldCBpID0gdGhpcy5zb3VyY2VzLmxlbmd0aCAtIDE7CiAgICAgICAgZG8gewogICAgICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VzW2ktLV07CiAgICAgICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgICAgICB0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAiIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCFzb3VyY2UuY29udGVudC50cmltRW5kQWJvcnRlZChjaGFyVHlwZSkpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9OwogICAgTWFnaWNTdHJpbmcuQnVuZGxlID0gQnVuZGxlOwogICAgTWFnaWNTdHJpbmcuU291cmNlTWFwID0gU291cmNlTWFwOwogICAgTWFnaWNTdHJpbmcuZGVmYXVsdCA9IE1hZ2ljU3RyaW5nOwogICAgbW9kdWxlMi5leHBvcnRzID0gTWFnaWNTdHJpbmc7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvcmVjb3JkZXIuanMKdmFyIHJlcXVpcmVfcmVjb3JkZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9yZWNvcmRlci5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2ltcG9ydERlZmF1bHQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2ltcG9ydERlZmF1bHQgfHwgZnVuY3Rpb24obW9kKSB7CiAgICAgIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7ICJkZWZhdWx0IjogbW9kIH07CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5VcGRhdGVSZWNvcmRlckJhc2UgPSBleHBvcnRzMi5JbmRleE91dE9mQm91bmRFeGNlcHRpb24gPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciBtYWdpY19zdHJpbmdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlX21hZ2ljX3N0cmluZ19janMoKSk7CiAgICB2YXIgZXhjZXB0aW9uXzEgPSByZXF1aXJlX2V4Y2VwdGlvbjIoKTsKICAgIHZhciBJbmRleE91dE9mQm91bmRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoaW5kZXgsIG1pbiwgbWF4ID0gSW5maW5pdHkpIHsKICAgICAgICBzdXBlcihgSW5kZXggJHtpbmRleH0gb3V0c2lkZSBvZiByYW5nZSBbJHttaW59LCAke21heH1dLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuSW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uID0gSW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uOwogICAgdmFyIFVwZGF0ZVJlY29yZGVyQmFzZSA9IGNsYXNzIF9VcGRhdGVSZWNvcmRlckJhc2UgewogICAgICBkYXRhOwogICAgICBib207CiAgICAgIF9wYXRoOwogICAgICBjb250ZW50OwogICAgICBjb25zdHJ1Y3RvcihkYXRhLCBwYXRoLCBlbmNvZGluZyA9ICJ1dGYtOCIsIGJvbSA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICB0aGlzLmJvbSA9IGJvbTsKICAgICAgICBsZXQgdGV4dDsKICAgICAgICB0cnkgewogICAgICAgICAgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywgeyBmYXRhbDogdHJ1ZSwgaWdub3JlQk9NOiBmYWxzZSB9KS5kZWNvZGUoZGF0YSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVjb2RlICIke3BhdGh9IiBhcyAke2VuY29kaW5nfSB0ZXh0LmApOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7CiAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IG1hZ2ljX3N0cmluZ18xLmRlZmF1bHQodGV4dCk7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZUZyb21GaWxlRW50cnkoZW50cnkpIHsKICAgICAgICBjb25zdCBjMCA9IGVudHJ5LmNvbnRlbnQuYnl0ZUxlbmd0aCA+IDAgJiYgZW50cnkuY29udGVudC5yZWFkVUludDgoMCk7CiAgICAgICAgY29uc3QgYzEgPSBlbnRyeS5jb250ZW50LmJ5dGVMZW5ndGggPiAxICYmIGVudHJ5LmNvbnRlbnQucmVhZFVJbnQ4KDEpOwogICAgICAgIGNvbnN0IGMyID0gZW50cnkuY29udGVudC5ieXRlTGVuZ3RoID4gMiAmJiBlbnRyeS5jb250ZW50LnJlYWRVSW50OCgyKTsKICAgICAgICBpZiAoYzAgPT0gMjM5ICYmIGMxID09IDE4NyAmJiBjMiA9PSAxOTEpIHsKICAgICAgICAgIHJldHVybiBuZXcgX1VwZGF0ZVJlY29yZGVyQmFzZShlbnRyeS5jb250ZW50LCBlbnRyeS5wYXRoLCAidXRmLTgiLCB0cnVlKTsKICAgICAgICB9IGVsc2UgaWYgKGMwID09PSAyNTUgJiYgYzEgPT0gMjU0KSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9VcGRhdGVSZWNvcmRlckJhc2UoZW50cnkuY29udGVudCwgZW50cnkucGF0aCwgInV0Zi0xNmxlIiwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChjMCA9PT0gMjU0ICYmIGMxID09IDI1NSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfVXBkYXRlUmVjb3JkZXJCYXNlKGVudHJ5LmNvbnRlbnQsIGVudHJ5LnBhdGgsICJ1dGYtMTZiZSIsIHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IF9VcGRhdGVSZWNvcmRlckJhc2UoZW50cnkuY29udGVudCwgZW50cnkucGF0aCk7CiAgICAgIH0KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGg7CiAgICAgIH0KICAgICAgX2Fzc2VydEluZGV4KGluZGV4KSB7CiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMuY29udGVudC5vcmlnaW5hbC5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRFeGNlcHRpb24oaW5kZXgsIDAsIHRoaXMuY29udGVudC5vcmlnaW5hbC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBUaGVzZSBqdXN0IHJlY29yZCBjaGFuZ2VzLgogICAgICBpbnNlcnRMZWZ0KGluZGV4LCBjb250ZW50KSB7CiAgICAgICAgdGhpcy5fYXNzZXJ0SW5kZXgoaW5kZXgpOwogICAgICAgIHRoaXMuY29udGVudC5hcHBlbmRMZWZ0KGluZGV4LCBjb250ZW50LnRvU3RyaW5nKCkpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGluc2VydFJpZ2h0KGluZGV4LCBjb250ZW50KSB7CiAgICAgICAgdGhpcy5fYXNzZXJ0SW5kZXgoaW5kZXgpOwogICAgICAgIHRoaXMuY29udGVudC5hcHBlbmRSaWdodChpbmRleCwgY29udGVudC50b1N0cmluZygpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICByZW1vdmUoaW5kZXgsIGxlbmd0aCkgewogICAgICAgIHRoaXMuX2Fzc2VydEluZGV4KGluZGV4KTsKICAgICAgICB0aGlzLmNvbnRlbnQucmVtb3ZlKGluZGV4LCBpbmRleCArIGxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgYXBwbHkoY29udGVudCkgewogICAgICAgIGlmICghY29udGVudC5lcXVhbHModGhpcy5kYXRhKSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkNvbnRlbnRIYXNNdXRhdGVkRXhjZXB0aW9uKHRoaXMucGF0aCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5mcm9tKCh0aGlzLmJvbSA/ICJcdUZFRkYiIDogIiIpICsgdGhpcy5jb250ZW50LnRvU3RyaW5nKCksICJ1dGYtOCIpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5VcGRhdGVSZWNvcmRlckJhc2UgPSBVcGRhdGVSZWNvcmRlckJhc2U7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvc2NvcGVkLmpzCnZhciByZXF1aXJlX3Njb3BlZDIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9zY29wZWQuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLlNjb3BlZFRyZWUgPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciBkZWxlZ2F0ZV8xID0gcmVxdWlyZV9kZWxlZ2F0ZSgpOwogICAgdmFyIGludGVyZmFjZV8xID0gcmVxdWlyZV9pbnRlcmZhY2UzKCk7CiAgICB2YXIgU2NvcGVkRmlsZUVudHJ5ID0gY2xhc3MgewogICAgICBfYmFzZTsKICAgICAgc2NvcGU7CiAgICAgIGNvbnN0cnVjdG9yKF9iYXNlLCBzY29wZSkgewogICAgICAgIHRoaXMuX2Jhc2UgPSBfYmFzZTsKICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CiAgICAgIH0KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuICgwLCBjb3JlXzEuam9pbikoY29yZV8xLk5vcm1hbGl6ZWRSb290LCAoMCwgY29yZV8xLnJlbGF0aXZlKSh0aGlzLnNjb3BlLCB0aGlzLl9iYXNlLnBhdGgpKTsKICAgICAgfQogICAgICBnZXQgY29udGVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFzZS5jb250ZW50OwogICAgICB9CiAgICB9OwogICAgdmFyIFNjb3BlZERpckVudHJ5ID0gY2xhc3MgX1Njb3BlZERpckVudHJ5IHsKICAgICAgX2Jhc2U7CiAgICAgIHNjb3BlOwogICAgICBjb25zdHJ1Y3RvcihfYmFzZSwgc2NvcGUpIHsKICAgICAgICB0aGlzLl9iYXNlID0gX2Jhc2U7CiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwogICAgICB9CiAgICAgIGdldCBwYXJlbnQoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9iYXNlLnBhcmVudCB8fCB0aGlzLl9iYXNlLnBhdGggPT0gdGhpcy5zY29wZSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgX1Njb3BlZERpckVudHJ5KHRoaXMuX2Jhc2UucGFyZW50LCB0aGlzLnNjb3BlKTsKICAgICAgfQogICAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gKDAsIGNvcmVfMS5qb2luKShjb3JlXzEuTm9ybWFsaXplZFJvb3QsICgwLCBjb3JlXzEucmVsYXRpdmUpKHRoaXMuc2NvcGUsIHRoaXMuX2Jhc2UucGF0aCkpOwogICAgICB9CiAgICAgIGdldCBzdWJkaXJzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLnN1YmRpcnM7CiAgICAgIH0KICAgICAgZ2V0IHN1YmZpbGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLnN1YmZpbGVzOwogICAgICB9CiAgICAgIGRpcihuYW1lKSB7CiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9iYXNlLmRpcihuYW1lKTsKICAgICAgICByZXR1cm4gZW50cnkgJiYgbmV3IF9TY29wZWREaXJFbnRyeShlbnRyeSwgdGhpcy5zY29wZSk7CiAgICAgIH0KICAgICAgZmlsZShuYW1lKSB7CiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9iYXNlLmZpbGUobmFtZSk7CiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIG5ldyBTY29wZWRGaWxlRW50cnkoZW50cnksIHRoaXMuc2NvcGUpOwogICAgICB9CiAgICAgIHZpc2l0KHZpc2l0b3IpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFzZS52aXNpdCgocGF0aCwgZW50cnkpID0+IHsKICAgICAgICAgIHZpc2l0b3IoKDAsIGNvcmVfMS5qb2luKShjb3JlXzEuTm9ybWFsaXplZFJvb3QsICgwLCBjb3JlXzEucmVsYXRpdmUpKHRoaXMuc2NvcGUsIHBhdGgpKSwgZW50cnkgJiYgbmV3IFNjb3BlZEZpbGVFbnRyeShlbnRyeSwgdGhpcy5zY29wZSkpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgdmFyIFNjb3BlZFRyZWUgPSBjbGFzcyBfU2NvcGVkVHJlZSB7CiAgICAgIF9iYXNlOwogICAgICBfcm9vdDsKICAgICAgY29uc3RydWN0b3IoX2Jhc2UsIHNjb3BlKSB7CiAgICAgICAgdGhpcy5fYmFzZSA9IF9iYXNlOwogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTY29wZSA9ICgwLCBjb3JlXzEubm9ybWFsaXplKSgiLyIgKyBzY29wZSk7CiAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBTY29wZWREaXJFbnRyeSh0aGlzLl9iYXNlLmdldERpcihub3JtYWxpemVkU2NvcGUpLCBub3JtYWxpemVkU2NvcGUpOwogICAgICB9CiAgICAgIGdldCByb290KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yb290OwogICAgICB9CiAgICAgIGJyYW5jaCgpIHsKICAgICAgICByZXR1cm4gbmV3IF9TY29wZWRUcmVlKHRoaXMuX2Jhc2UuYnJhbmNoKCksIHRoaXMuX3Jvb3Quc2NvcGUpOwogICAgICB9CiAgICAgIG1lcmdlKG90aGVyLCBzdHJhdGVneSkgewogICAgICAgIGNvbnN0IHNlbGYyID0gdGhpczsKICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IG5ldyBjbGFzcyBleHRlbmRzIGRlbGVnYXRlXzEuRGVsZWdhdGVUcmVlIHsKICAgICAgICAgIGdldCBhY3Rpb25zKCkgewogICAgICAgICAgICByZXR1cm4gb3RoZXIuYWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gc2VsZjIuX2Z1bGxQYXRoQWN0aW9uKGFjdGlvbikpOwogICAgICAgICAgfQogICAgICAgIH0ob3RoZXIpOwogICAgICAgIHRoaXMuX2Jhc2UubWVyZ2UoZGVsZWdhdGUsIHN0cmF0ZWd5KTsKICAgICAgfQogICAgICAvLyBSZWFkb25seS4KICAgICAgcmVhZChwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2UucmVhZCh0aGlzLl9mdWxsUGF0aChwYXRoKSk7CiAgICAgIH0KICAgICAgcmVhZFRleHQocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLnJlYWRUZXh0KHRoaXMuX2Z1bGxQYXRoKHBhdGgpKTsKICAgICAgfQogICAgICByZWFkSnNvbihwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2UucmVhZEpzb24odGhpcy5fZnVsbFBhdGgocGF0aCkpOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2UuZXhpc3RzKHRoaXMuX2Z1bGxQYXRoKHBhdGgpKTsKICAgICAgfQogICAgICBnZXQocGF0aCkgewogICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fYmFzZS5nZXQodGhpcy5fZnVsbFBhdGgocGF0aCkpOwogICAgICAgIHJldHVybiBlbnRyeSAmJiBuZXcgU2NvcGVkRmlsZUVudHJ5KGVudHJ5LCB0aGlzLl9yb290LnNjb3BlKTsKICAgICAgfQogICAgICBnZXREaXIocGF0aCkgewogICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fYmFzZS5nZXREaXIodGhpcy5fZnVsbFBhdGgocGF0aCkpOwogICAgICAgIHJldHVybiBlbnRyeSAmJiBuZXcgU2NvcGVkRGlyRW50cnkoZW50cnksIHRoaXMuX3Jvb3Quc2NvcGUpOwogICAgICB9CiAgICAgIHZpc2l0KHZpc2l0b3IpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC52aXNpdCh2aXNpdG9yKTsKICAgICAgfQogICAgICAvLyBDaGFuZ2UgY29udGVudCBvZiBob3N0IGZpbGVzLgogICAgICBvdmVyd3JpdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLm92ZXJ3cml0ZSh0aGlzLl9mdWxsUGF0aChwYXRoKSwgY29udGVudCk7CiAgICAgIH0KICAgICAgYmVnaW5VcGRhdGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLmJlZ2luVXBkYXRlKHRoaXMuX2Z1bGxQYXRoKHBhdGgpKTsKICAgICAgfQogICAgICBjb21taXRVcGRhdGUocmVjb3JkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2UuY29tbWl0VXBkYXRlKHJlY29yZCk7CiAgICAgIH0KICAgICAgLy8gU3RydWN0dXJhbCBtZXRob2RzLgogICAgICBjcmVhdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLmNyZWF0ZSh0aGlzLl9mdWxsUGF0aChwYXRoKSwgY29udGVudCk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFzZS5kZWxldGUodGhpcy5fZnVsbFBhdGgocGF0aCkpOwogICAgICB9CiAgICAgIHJlbmFtZShmcm9tLCB0bykgewogICAgICAgIHJldHVybiB0aGlzLl9iYXNlLnJlbmFtZSh0aGlzLl9mdWxsUGF0aChmcm9tKSwgdGhpcy5fZnVsbFBhdGgodG8pKTsKICAgICAgfQogICAgICBhcHBseShhY3Rpb24sIHN0cmF0ZWd5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2UuYXBwbHkodGhpcy5fZnVsbFBhdGhBY3Rpb24oYWN0aW9uKSwgc3RyYXRlZ3kpOwogICAgICB9CiAgICAgIGdldCBhY3Rpb25zKCkgewogICAgICAgIGNvbnN0IHNjb3BlZEFjdGlvbnMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLl9iYXNlLmFjdGlvbnMpIHsKICAgICAgICAgIGlmICghYWN0aW9uLnBhdGguc3RhcnRzV2l0aCh0aGlzLl9yb290LnNjb3BlICsgIi8iKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhY3Rpb24ua2luZCAhPT0gInIiKSB7CiAgICAgICAgICAgIHNjb3BlZEFjdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgLi4uYWN0aW9uLAogICAgICAgICAgICAgIHBhdGg6ICgwLCBjb3JlXzEuam9pbikoY29yZV8xLk5vcm1hbGl6ZWRSb290LCAoMCwgY29yZV8xLnJlbGF0aXZlKSh0aGlzLl9yb290LnNjb3BlLCBhY3Rpb24ucGF0aCkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udG8uc3RhcnRzV2l0aCh0aGlzLl9yb290LnNjb3BlICsgIi8iKSkgewogICAgICAgICAgICBzY29wZWRBY3Rpb25zLnB1c2goewogICAgICAgICAgICAgIC4uLmFjdGlvbiwKICAgICAgICAgICAgICBwYXRoOiAoMCwgY29yZV8xLmpvaW4pKGNvcmVfMS5Ob3JtYWxpemVkUm9vdCwgKDAsIGNvcmVfMS5yZWxhdGl2ZSkodGhpcy5fcm9vdC5zY29wZSwgYWN0aW9uLnBhdGgpKSwKICAgICAgICAgICAgICB0bzogKDAsIGNvcmVfMS5qb2luKShjb3JlXzEuTm9ybWFsaXplZFJvb3QsICgwLCBjb3JlXzEucmVsYXRpdmUpKHRoaXMuX3Jvb3Quc2NvcGUsIGFjdGlvbi50bykpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2NvcGVkQWN0aW9uczsKICAgICAgfQogICAgICBbaW50ZXJmYWNlXzEuVHJlZVN5bWJvbF0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgX2Z1bGxQYXRoKHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIGNvcmVfMS5qb2luKSh0aGlzLl9yb290LnNjb3BlLCAoMCwgY29yZV8xLm5vcm1hbGl6ZSkoIi8iICsgcGF0aCkpOwogICAgICB9CiAgICAgIF9mdWxsUGF0aEFjdGlvbihhY3Rpb24pIHsKICAgICAgICBsZXQgZnVsbFBhdGhBY3Rpb247CiAgICAgICAgaWYgKGFjdGlvbi5raW5kID09PSAiciIpIHsKICAgICAgICAgIGZ1bGxQYXRoQWN0aW9uID0gewogICAgICAgICAgICAuLi5hY3Rpb24sCiAgICAgICAgICAgIHBhdGg6IHRoaXMuX2Z1bGxQYXRoKGFjdGlvbi5wYXRoKSwKICAgICAgICAgICAgdG86IHRoaXMuX2Z1bGxQYXRoKGFjdGlvbi50bykKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZ1bGxQYXRoQWN0aW9uID0gewogICAgICAgICAgICAuLi5hY3Rpb24sCiAgICAgICAgICAgIHBhdGg6IHRoaXMuX2Z1bGxQYXRoKGFjdGlvbi5wYXRoKQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZ1bGxQYXRoQWN0aW9uOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuU2NvcGVkVHJlZSA9IFNjb3BlZFRyZWU7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvaG9zdC10cmVlLmpzCnZhciByZXF1aXJlX2hvc3RfdHJlZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL2hvc3QtdHJlZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuRmlsdGVySG9zdFRyZWUgPSBleHBvcnRzMi5Ib3N0Q3JlYXRlVHJlZSA9IGV4cG9ydHMyLkhvc3RUcmVlID0gZXhwb3J0czIuSG9zdERpckVudHJ5ID0gdm9pZCAwOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICB2YXIganNvbmNfcGFyc2VyXzEgPSByZXF1aXJlX21haW4oKTsKICAgIHZhciBleGNlcHRpb25fMSA9IHJlcXVpcmVfZXhjZXB0aW9uMigpOwogICAgdmFyIGRlbGVnYXRlXzEgPSByZXF1aXJlX2RlbGVnYXRlKCk7CiAgICB2YXIgZW50cnlfMSA9IHJlcXVpcmVfZW50cnkoKTsKICAgIHZhciBpbnRlcmZhY2VfMSA9IHJlcXVpcmVfaW50ZXJmYWNlMygpOwogICAgdmFyIHJlY29yZGVyXzEgPSByZXF1aXJlX3JlY29yZGVyKCk7CiAgICB2YXIgc2NvcGVkXzEgPSByZXF1aXJlX3Njb3BlZDIoKTsKICAgIHZhciBfdW5pcXVlSWQgPSAwOwogICAgdmFyIEhvc3REaXJFbnRyeSA9IGNsYXNzIHsKICAgICAgcGFyZW50OwogICAgICBwYXRoOwogICAgICBfaG9zdDsKICAgICAgX3RyZWU7CiAgICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgcGF0aCwgX2hvc3QsIF90cmVlKSB7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKICAgICAgICB0aGlzLl9ob3N0ID0gX2hvc3Q7CiAgICAgICAgdGhpcy5fdHJlZSA9IF90cmVlOwogICAgICB9CiAgICAgIGdldCBzdWJkaXJzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9ob3N0Lmxpc3QodGhpcy5wYXRoKS5maWx0ZXIoKGZyYWdtZW50KSA9PiB0aGlzLl9ob3N0LmlzRGlyZWN0b3J5KCgwLCBjb3JlXzEuam9pbikodGhpcy5wYXRoLCBmcmFnbWVudCkpKTsKICAgICAgfQogICAgICBnZXQgc3ViZmlsZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QubGlzdCh0aGlzLnBhdGgpLmZpbHRlcigoZnJhZ21lbnQpID0+IHRoaXMuX2hvc3QuaXNGaWxlKCgwLCBjb3JlXzEuam9pbikodGhpcy5wYXRoLCBmcmFnbWVudCkpKTsKICAgICAgfQogICAgICBkaXIobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLl90cmVlLmdldERpcigoMCwgY29yZV8xLmpvaW4pKHRoaXMucGF0aCwgbmFtZSkpOwogICAgICB9CiAgICAgIGZpbGUobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLl90cmVlLmdldCgoMCwgY29yZV8xLmpvaW4pKHRoaXMucGF0aCwgbmFtZSkpOwogICAgICB9CiAgICAgIHZpc2l0KHZpc2l0b3IpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5nZXRTdWJmaWxlc1JlY3Vyc2l2ZWx5KCkuZm9yRWFjaCgoZmlsZSkgPT4gdmlzaXRvcihmaWxlLnBhdGgsIGZpbGUpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAoZSAhPT0gaW50ZXJmYWNlXzEuRmlsZVZpc2l0b3JDYW5jZWxUb2tlbikgewogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBnZXRTdWJmaWxlc1JlY3Vyc2l2ZWx5KCkgewogICAgICAgIGZ1bmN0aW9uIF9yZWN1cnNlKGVudHJ5KSB7CiAgICAgICAgICByZXR1cm4gZW50cnkuc3ViZGlycy5yZWR1Y2UoKGZpbGVzLCBzdWJkaXIpID0+IFsuLi5maWxlcywgLi4uX3JlY3Vyc2UoZW50cnkuZGlyKHN1YmRpcikpXSwgZW50cnkuc3ViZmlsZXMubWFwKChzdWJmaWxlKSA9PiBlbnRyeS5maWxlKHN1YmZpbGUpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVjdXJzZSh0aGlzKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkhvc3REaXJFbnRyeSA9IEhvc3REaXJFbnRyeTsKICAgIHZhciBIb3N0VHJlZSA9IGNsYXNzIF9Ib3N0VHJlZSB7CiAgICAgIF9iYWNrZW5kOwogICAgICBfaWQgPSAtLV91bmlxdWVJZDsKICAgICAgX3JlY29yZDsKICAgICAgX3JlY29yZFN5bmM7CiAgICAgIF9hbmNlc3RyeSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIF9kaXJDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIFtpbnRlcmZhY2VfMS5UcmVlU3ltYm9sXSgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBzdGF0aWMgaXNIb3N0VHJlZSh0cmVlKSB7CiAgICAgICAgaWYgKHRyZWUgaW5zdGFuY2VvZiBfSG9zdFRyZWUpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHRyZWUgPT09ICJvYmplY3QiICYmIHR5cGVvZiB0cmVlLl9hbmNlc3RyeSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoX2JhY2tlbmQgPSBuZXcgY29yZV8xLnZpcnR1YWxGcy5FbXB0eSgpKSB7CiAgICAgICAgdGhpcy5fYmFja2VuZCA9IF9iYWNrZW5kOwogICAgICAgIHRoaXMuX3JlY29yZCA9IG5ldyBjb3JlXzEudmlydHVhbEZzLkNvcmRIb3N0KG5ldyBjb3JlXzEudmlydHVhbEZzLlNhZmVSZWFkb25seUhvc3QoX2JhY2tlbmQpKTsKICAgICAgICB0aGlzLl9yZWNvcmRTeW5jID0gbmV3IGNvcmVfMS52aXJ0dWFsRnMuU3luY0RlbGVnYXRlSG9zdCh0aGlzLl9yZWNvcmQpOwogICAgICB9CiAgICAgIF9ub3JtYWxpemVQYXRoKHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIGNvcmVfMS5ub3JtYWxpemUpKCIvIiArIHBhdGgpOwogICAgICB9CiAgICAgIF93aWxsQ3JlYXRlKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkLndpbGxDcmVhdGUocGF0aCk7CiAgICAgIH0KICAgICAgX3dpbGxPdmVyd3JpdGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZWNvcmQud2lsbE92ZXJ3cml0ZShwYXRoKTsKICAgICAgfQogICAgICBfd2lsbERlbGV0ZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29yZC53aWxsRGVsZXRlKHBhdGgpOwogICAgICB9CiAgICAgIF93aWxsUmVuYW1lKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkLndpbGxSZW5hbWUocGF0aCk7CiAgICAgIH0KICAgICAgYnJhbmNoKCkgewogICAgICAgIGNvbnN0IGJyYW5jaGVkVHJlZSA9IG5ldyBfSG9zdFRyZWUodGhpcy5fYmFja2VuZCk7CiAgICAgICAgYnJhbmNoZWRUcmVlLl9yZWNvcmQgPSB0aGlzLl9yZWNvcmQuY2xvbmUoKTsKICAgICAgICBicmFuY2hlZFRyZWUuX3JlY29yZFN5bmMgPSBuZXcgY29yZV8xLnZpcnR1YWxGcy5TeW5jRGVsZWdhdGVIb3N0KGJyYW5jaGVkVHJlZS5fcmVjb3JkKTsKICAgICAgICBicmFuY2hlZFRyZWUuX2FuY2VzdHJ5ID0gbmV3IFNldCh0aGlzLl9hbmNlc3RyeSkuYWRkKHRoaXMuX2lkKTsKICAgICAgICByZXR1cm4gYnJhbmNoZWRUcmVlOwogICAgICB9CiAgICAgIGlzQW5jZXN0b3JPZih0cmVlKSB7CiAgICAgICAgaWYgKHRyZWUgaW5zdGFuY2VvZiBfSG9zdFRyZWUpIHsKICAgICAgICAgIHJldHVybiB0cmVlLl9hbmNlc3RyeS5oYXModGhpcy5faWQpOwogICAgICAgIH0KICAgICAgICBpZiAodHJlZSBpbnN0YW5jZW9mIGRlbGVnYXRlXzEuRGVsZWdhdGVUcmVlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pc0FuY2VzdG9yT2YodHJlZS5fb3RoZXIpOwogICAgICAgIH0KICAgICAgICBpZiAodHJlZSBpbnN0YW5jZW9mIHNjb3BlZF8xLlNjb3BlZFRyZWUpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmlzQW5jZXN0b3JPZih0cmVlLl9iYXNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIG1lcmdlKG90aGVyLCBzdHJhdGVneSA9IGludGVyZmFjZV8xLk1lcmdlU3RyYXRlZ3kuRGVmYXVsdCkgewogICAgICAgIGlmIChvdGhlciA9PT0gdGhpcykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc0FuY2VzdG9yT2Yob3RoZXIpKSB7CiAgICAgICAgICBzdHJhdGVneSB8PSBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5Lk92ZXJ3cml0ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3JlYXRpb25Db25mbGljdEFsbG93ZWQgPSAoc3RyYXRlZ3kgJiBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkFsbG93Q3JlYXRpb25Db25mbGljdCkgPT0gaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5BbGxvd0NyZWF0aW9uQ29uZmxpY3Q7CiAgICAgICAgY29uc3Qgb3ZlcndyaXRlQ29uZmxpY3RBbGxvd2VkID0gKHN0cmF0ZWd5ICYgaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5BbGxvd092ZXJ3cml0ZUNvbmZsaWN0KSA9PSBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkFsbG93T3ZlcndyaXRlQ29uZmxpY3Q7CiAgICAgICAgY29uc3QgZGVsZXRlQ29uZmxpY3RBbGxvd2VkID0gKHN0cmF0ZWd5ICYgaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5BbGxvd0RlbGV0ZUNvbmZsaWN0KSA9PSBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkFsbG93RGVsZXRlQ29uZmxpY3Q7CiAgICAgICAgb3RoZXIuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHsKICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmtpbmQpIHsKICAgICAgICAgICAgY2FzZSAiYyI6IHsKICAgICAgICAgICAgICBjb25zdCB7IHBhdGgsIGNvbnRlbnQgfSA9IGFjdGlvbjsKICAgICAgICAgICAgICBpZiAodGhpcy5fd2lsbENyZWF0ZShwYXRoKSB8fCB0aGlzLl93aWxsT3ZlcndyaXRlKHBhdGgpIHx8IHRoaXMuZXhpc3RzKHBhdGgpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSB0aGlzLnJlYWQocGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdDb250ZW50ICYmIGNvbnRlbnQuZXF1YWxzKGV4aXN0aW5nQ29udGVudCkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjcmVhdGlvbkNvbmZsaWN0QWxsb3dlZCkgewogICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuTWVyZ2VDb25mbGljdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZC5vdmVyd3JpdGUocGF0aCwgY29udGVudCkuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZC5jcmVhdGUocGF0aCwgY29udGVudCkuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJvIjogewogICAgICAgICAgICAgIGNvbnN0IHsgcGF0aCwgY29udGVudCB9ID0gYWN0aW9uOwogICAgICAgICAgICAgIGlmICh0aGlzLl93aWxsRGVsZXRlKHBhdGgpICYmICFvdmVyd3JpdGVDb25mbGljdEFsbG93ZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5NZXJnZUNvbmZsaWN0RXhjZXB0aW9uKHBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodGhpcy5fd2lsbE92ZXJ3cml0ZShwYXRoKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gdGhpcy5yZWFkKHBhdGgpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudCAmJiBjb250ZW50LmVxdWFscyhleGlzdGluZ0NvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghb3ZlcndyaXRlQ29uZmxpY3RBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5NZXJnZUNvbmZsaWN0RXhjZXB0aW9uKHBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLl9yZWNvcmQud3JpdGUocGF0aCwgY29udGVudCkuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgInIiOiB7CiAgICAgICAgICAgICAgY29uc3QgeyBwYXRoLCB0byB9ID0gYWN0aW9uOwogICAgICAgICAgICAgIGlmICh0aGlzLl93aWxsRGVsZXRlKHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuTWVyZ2VDb25mbGljdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRoaXMuX3dpbGxSZW5hbWUocGF0aCkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZWNvcmQud2lsbFJlbmFtZVRvKHBhdGgsIHRvKSkgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuTWVyZ2VDb25mbGljdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5yZW5hbWUocGF0aCwgdG8pOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkIjogewogICAgICAgICAgICAgIGNvbnN0IHsgcGF0aCB9ID0gYWN0aW9uOwogICAgICAgICAgICAgIGlmICh0aGlzLl93aWxsRGVsZXRlKHBhdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghdGhpcy5leGlzdHMocGF0aCkgJiYgIWRlbGV0ZUNvbmZsaWN0QWxsb3dlZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLk1lcmdlQ29uZmxpY3RFeGNlcHRpb24ocGF0aCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuX3JlY29yZFN5bmMuZGVsZXRlKHBhdGgpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGdldCByb290KCkgewogICAgICAgIHJldHVybiB0aGlzLmdldERpcigiLyIpOwogICAgICB9CiAgICAgIC8vIFJlYWRvbmx5LgogICAgICByZWFkKHBhdGgpIHsKICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0KHBhdGgpOwogICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LmNvbnRlbnQgOiBudWxsOwogICAgICB9CiAgICAgIHJlYWRUZXh0KHBhdGgpIHsKICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkKHBhdGgpOwogICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigidXRmLTgiLCB7IGZhdGFsOiB0cnVlIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoZGF0YSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IgfHwgZS5jb2RlID09PSAiRVJSX0VOQ09ESU5HX0lOVkFMSURfRU5DT0RFRF9EQVRBIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZWNvZGUgIiR7cGF0aH0iIGFzIFVURi04IHRleHQuYCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfQogICAgICByZWFkSnNvbihwYXRoKSB7CiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMucmVhZFRleHQocGF0aCk7CiAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgY29uc3QgcmVzdWx0ID0gKDAsIGpzb25jX3BhcnNlcl8xLnBhcnNlKShjb250ZW50LCBlcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlIH0pOwogICAgICAgIGlmIChlcnJvcnNbMF0pIHsKICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIG9mZnNldCB9ID0gZXJyb3JzWzBdOwogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgIiR7cGF0aH0iIGFzIEpTT04uICR7KDAsIGpzb25jX3BhcnNlcl8xLnByaW50UGFyc2VFcnJvckNvZGUpKGVycm9yKX0gYXQgb2Zmc2V0OiAke29mZnNldH0uYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgZXhpc3RzKHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkU3luYy5pc0ZpbGUodGhpcy5fbm9ybWFsaXplUGF0aChwYXRoKSk7CiAgICAgIH0KICAgICAgZ2V0KHBhdGgpIHsKICAgICAgICBjb25zdCBwID0gdGhpcy5fbm9ybWFsaXplUGF0aChwYXRoKTsKICAgICAgICBpZiAodGhpcy5fcmVjb3JkU3luYy5pc0RpcmVjdG9yeShwKSkgewogICAgICAgICAgdGhyb3cgbmV3IGNvcmVfMS5QYXRoSXNEaXJlY3RvcnlFeGNlcHRpb24ocCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5fcmVjb3JkU3luYy5leGlzdHMocCkpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IGVudHJ5XzEuTGF6eUZpbGVFbnRyeShwLCAoKSA9PiBCdWZmZXIuZnJvbSh0aGlzLl9yZWNvcmRTeW5jLnJlYWQocCkpKTsKICAgICAgfQogICAgICBnZXREaXIocGF0aCkgewogICAgICAgIGNvbnN0IHAgPSB0aGlzLl9ub3JtYWxpemVQYXRoKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9yZWNvcmRTeW5jLmlzRmlsZShwKSkgewogICAgICAgICAgdGhyb3cgbmV3IGNvcmVfMS5QYXRoSXNGaWxlRXhjZXB0aW9uKHApOwogICAgICAgIH0KICAgICAgICBsZXQgbWF5YmVDYWNoZSA9IHRoaXMuX2RpckNhY2hlLmdldChwKTsKICAgICAgICBpZiAoIW1heWJlQ2FjaGUpIHsKICAgICAgICAgIGxldCBwYXJlbnQgPSAoMCwgY29yZV8xLmRpcm5hbWUpKHApOwogICAgICAgICAgaWYgKHAgPT09IHBhcmVudCkgewogICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbWF5YmVDYWNoZSA9IG5ldyBIb3N0RGlyRW50cnkocGFyZW50ICYmIHRoaXMuZ2V0RGlyKHBhcmVudCksIHAsIHRoaXMuX3JlY29yZFN5bmMsIHRoaXMpOwogICAgICAgICAgdGhpcy5fZGlyQ2FjaGUuc2V0KHAsIG1heWJlQ2FjaGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF5YmVDYWNoZTsKICAgICAgfQogICAgICB2aXNpdCh2aXNpdG9yKSB7CiAgICAgICAgdGhpcy5yb290LnZpc2l0KChwYXRoLCBlbnRyeSkgPT4gewogICAgICAgICAgdmlzaXRvcihwYXRoLCBlbnRyeSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy8gQ2hhbmdlIGNvbnRlbnQgb2YgaG9zdCBmaWxlcy4KICAgICAgb3ZlcndyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICBjb25zdCBwID0gdGhpcy5fbm9ybWFsaXplUGF0aChwYXRoKTsKICAgICAgICBpZiAoIXRoaXMuX3JlY29yZFN5bmMuZXhpc3RzKHApKSB7CiAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYyA9IHR5cGVvZiBjb250ZW50ID09ICJzdHJpbmciID8gQnVmZmVyLmZyb20oY29udGVudCkgOiBjb250ZW50OwogICAgICAgIHRoaXMuX3JlY29yZC5vdmVyd3JpdGUocCwgYykuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgICAgYmVnaW5VcGRhdGUocGF0aCkgewogICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQocGF0aCk7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24ocGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmRlcl8xLlVwZGF0ZVJlY29yZGVyQmFzZS5jcmVhdGVGcm9tRmlsZUVudHJ5KGVudHJ5KTsKICAgICAgfQogICAgICBjb21taXRVcGRhdGUocmVjb3JkKSB7CiAgICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIHJlY29yZGVyXzEuVXBkYXRlUmVjb3JkZXJCYXNlKSB7CiAgICAgICAgICBjb25zdCBwYXRoID0gcmVjb3JkLnBhdGg7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0KHBhdGgpOwogICAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuQ29udGVudEhhc011dGF0ZWRFeGNlcHRpb24ocGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gcmVjb3JkLmFwcGx5KGVudHJ5LmNvbnRlbnQpOwogICAgICAgICAgICBpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKGVudHJ5LmNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGUocGF0aCwgbmV3Q29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkludmFsaWRVcGRhdGVSZWNvcmRFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gU3RydWN0dXJhbCBtZXRob2RzLgogICAgICBjcmVhdGUocGF0aCwgY29udGVudCkgewogICAgICAgIGNvbnN0IHAgPSB0aGlzLl9ub3JtYWxpemVQYXRoKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9yZWNvcmRTeW5jLmV4aXN0cyhwKSkgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb24ocCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGMgPSB0eXBlb2YgY29udGVudCA9PSAic3RyaW5nIiA/IEJ1ZmZlci5mcm9tKGNvbnRlbnQpIDogY29udGVudDsKICAgICAgICB0aGlzLl9yZWNvcmQuY3JlYXRlKHAsIGMpLnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIGRlbGV0ZShwYXRoKSB7CiAgICAgICAgdGhpcy5fcmVjb3JkU3luYy5kZWxldGUodGhpcy5fbm9ybWFsaXplUGF0aChwYXRoKSk7CiAgICAgIH0KICAgICAgcmVuYW1lKGZyb20sIHRvKSB7CiAgICAgICAgdGhpcy5fcmVjb3JkU3luYy5yZW5hbWUodGhpcy5fbm9ybWFsaXplUGF0aChmcm9tKSwgdGhpcy5fbm9ybWFsaXplUGF0aCh0bykpOwogICAgICB9CiAgICAgIGFwcGx5KGFjdGlvbiwgc3RyYXRlZ3kpIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuU2NoZW1hdGljc0V4Y2VwdGlvbigiQXBwbHkgbm90IGltcGxlbWVudGVkIG9uIGhvc3QgdHJlZXMuIik7CiAgICAgIH0KICAgICAgKmdlbmVyYXRlQWN0aW9ucygpIHsKICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiB0aGlzLl9yZWNvcmQucmVjb3JkcygpKSB7CiAgICAgICAgICBzd2l0Y2ggKHJlY29yZC5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgImNyZWF0ZSI6CiAgICAgICAgICAgICAgeWllbGQgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLAogICAgICAgICAgICAgICAgcGFyZW50OiAwLAogICAgICAgICAgICAgICAga2luZDogImMiLAogICAgICAgICAgICAgICAgcGF0aDogcmVjb3JkLnBhdGgsCiAgICAgICAgICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShyZWNvcmQuY29udGVudCkKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJvdmVyd3JpdGUiOgogICAgICAgICAgICAgIHlpZWxkIHsKICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCwKICAgICAgICAgICAgICAgIHBhcmVudDogMCwKICAgICAgICAgICAgICAgIGtpbmQ6ICJvIiwKICAgICAgICAgICAgICAgIHBhdGg6IHJlY29yZC5wYXRoLAogICAgICAgICAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20ocmVjb3JkLmNvbnRlbnQpCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAicmVuYW1lIjoKICAgICAgICAgICAgICB5aWVsZCB7CiAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsCiAgICAgICAgICAgICAgICBwYXJlbnQ6IDAsCiAgICAgICAgICAgICAgICBraW5kOiAiciIsCiAgICAgICAgICAgICAgICBwYXRoOiByZWNvcmQuZnJvbSwKICAgICAgICAgICAgICAgIHRvOiByZWNvcmQudG8KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkZWxldGUiOgogICAgICAgICAgICAgIHlpZWxkIHsKICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCwKICAgICAgICAgICAgICAgIHBhcmVudDogMCwKICAgICAgICAgICAgICAgIGtpbmQ6ICJkIiwKICAgICAgICAgICAgICAgIHBhdGg6IHJlY29yZC5wYXRoCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IGFjdGlvbnMoKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5nZW5lcmF0ZUFjdGlvbnMoKSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Ib3N0VHJlZSA9IEhvc3RUcmVlOwogICAgdmFyIEhvc3RDcmVhdGVUcmVlID0gY2xhc3MgZXh0ZW5kcyBIb3N0VHJlZSB7CiAgICAgIGNvbnN0cnVjdG9yKGhvc3QpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGNvbnN0IHRlbXBIb3N0ID0gbmV3IEhvc3RUcmVlKGhvc3QpOwogICAgICAgIHRlbXBIb3N0LnZpc2l0KChwYXRoKSA9PiB7CiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcEhvc3QucmVhZChwYXRoKTsKICAgICAgICAgIGlmIChjb250ZW50KSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlKHBhdGgsIGNvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuSG9zdENyZWF0ZVRyZWUgPSBIb3N0Q3JlYXRlVHJlZTsKICAgIHZhciBGaWx0ZXJIb3N0VHJlZSA9IGNsYXNzIGV4dGVuZHMgSG9zdFRyZWUgewogICAgICBjb25zdHJ1Y3Rvcih0cmVlLCBmaWx0ZXIgPSAoKSA9PiB0cnVlKSB7CiAgICAgICAgY29uc3QgbmV3QmFja2VuZCA9IG5ldyBjb3JlXzEudmlydHVhbEZzLlNpbXBsZU1lbW9yeUhvc3QoKTsKICAgICAgICBjb25zdCBvcmlnaW5hbEJhY2tlbmQgPSB0cmVlLl9iYWNrZW5kOwogICAgICAgIGNvbnN0IHBlbmRpbmdQYXRocyA9IFsiLyJdOwogICAgICAgIHdoaWxlIChwZW5kaW5nUGF0aHMubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBwZW5kaW5nUGF0aHMucG9wKCk7CiAgICAgICAgICBpZiAoY3VycmVudFBhdGggPT09IHZvaWQgMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBpc0RpcmVjdG9yeSA9IGZhbHNlOwogICAgICAgICAgb3JpZ2luYWxCYWNrZW5kLmlzRGlyZWN0b3J5KGN1cnJlbnRQYXRoKS5zdWJzY3JpYmUoKHZhbCkgPT4gaXNEaXJlY3RvcnkgPSB2YWwpOwogICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CiAgICAgICAgICAgIG9yaWdpbmFsQmFja2VuZC5saXN0KGN1cnJlbnRQYXRoKS5zdWJzY3JpYmUoKHZhbCkgPT4gcGVuZGluZ1BhdGhzLnB1c2goLi4udmFsLm1hcCgocCkgPT4gKDAsIGNvcmVfMS5qb2luKShjdXJyZW50UGF0aCwgcCkpKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGlzRmlsZSA9IGZhbHNlOwogICAgICAgICAgb3JpZ2luYWxCYWNrZW5kLmlzRmlsZShjdXJyZW50UGF0aCkuc3Vic2NyaWJlKCh2YWwpID0+IGlzRmlsZSA9IHZhbCk7CiAgICAgICAgICBpZiAoIWlzRmlsZSB8fCAhZmlsdGVyKGN1cnJlbnRQYXRoKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBjb250ZW50ID0gbnVsbDsKICAgICAgICAgIG9yaWdpbmFsQmFja2VuZC5yZWFkKGN1cnJlbnRQYXRoKS5zdWJzY3JpYmUoKHZhbCkgPT4gY29udGVudCA9IHZhbCk7CiAgICAgICAgICBpZiAoY29udGVudCAhPT0gbnVsbCkgewogICAgICAgICAgICBuZXdCYWNrZW5kLndyaXRlKGN1cnJlbnRQYXRoLCBjb250ZW50KS5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3VwZXIobmV3QmFja2VuZCk7CiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdHJlZS5hY3Rpb25zKSB7CiAgICAgICAgICBpZiAoIWZpbHRlcihhY3Rpb24ucGF0aCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgImMiOgogICAgICAgICAgICAgIHRoaXMuY3JlYXRlKGFjdGlvbi5wYXRoLCBhY3Rpb24uY29udGVudCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgIHRoaXMuZGVsZXRlKGFjdGlvbi5wYXRoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibyI6CiAgICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGUoYWN0aW9uLnBhdGgsIGFjdGlvbi5jb250ZW50KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiciI6CiAgICAgICAgICAgICAgdGhpcy5yZW5hbWUoYWN0aW9uLnBhdGgsIGFjdGlvbi50byk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRmlsdGVySG9zdFRyZWUgPSBGaWx0ZXJIb3N0VHJlZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9zdGF0aWMuanMKdmFyIHJlcXVpcmVfc3RhdGljID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvc3RhdGljLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5lbXB0eSA9IGVtcHR5OwogICAgZXhwb3J0czIuYnJhbmNoID0gYnJhbmNoOwogICAgZXhwb3J0czIubWVyZ2UgPSBtZXJnZTsKICAgIGV4cG9ydHMyLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKICAgIHZhciBleGNlcHRpb25fMSA9IHJlcXVpcmVfZXhjZXB0aW9uMigpOwogICAgdmFyIGhvc3RfdHJlZV8xID0gcmVxdWlyZV9ob3N0X3RyZWUoKTsKICAgIHZhciBpbnRlcmZhY2VfMSA9IHJlcXVpcmVfaW50ZXJmYWNlMygpOwogICAgZnVuY3Rpb24gZW1wdHkoKSB7CiAgICAgIHJldHVybiBuZXcgaG9zdF90cmVlXzEuSG9zdFRyZWUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJyYW5jaCh0cmVlKSB7CiAgICAgIHJldHVybiB0cmVlLmJyYW5jaCgpOwogICAgfQogICAgZnVuY3Rpb24gbWVyZ2UodHJlZSwgb3RoZXIsIHN0cmF0ZWd5ID0gaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5EZWZhdWx0KSB7CiAgICAgIHRyZWUubWVyZ2Uob3RoZXIsIHN0cmF0ZWd5KTsKICAgICAgcmV0dXJuIHRyZWU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJ0aXRpb24odHJlZSwgcHJlZGljYXRlKSB7CiAgICAgIGlmICh0cmVlIGluc3RhbmNlb2YgaG9zdF90cmVlXzEuSG9zdFRyZWUpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgbmV3IGhvc3RfdHJlZV8xLkZpbHRlckhvc3RUcmVlKHRyZWUsIHByZWRpY2F0ZSksCiAgICAgICAgICBuZXcgaG9zdF90cmVlXzEuRmlsdGVySG9zdFRyZWUodHJlZSwgKHBhdGgsIGVudHJ5KSA9PiAhcHJlZGljYXRlKHBhdGgsIGVudHJ5KSkKICAgICAgICBdOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5TY2hlbWF0aWNzRXhjZXB0aW9uKCJUcmVlIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgfQogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL251bGwuanMKdmFyIHJlcXVpcmVfbnVsbCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL251bGwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLk51bGxUcmVlID0gZXhwb3J0czIuTnVsbFRyZWVEaXJFbnRyeSA9IGV4cG9ydHMyLkNhbm5vdENyZWF0ZUZpbGVFeGNlcHRpb24gPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciBleGNlcHRpb25fMSA9IHJlcXVpcmVfZXhjZXB0aW9uMigpOwogICAgdmFyIGludGVyZmFjZV8xID0gcmVxdWlyZV9pbnRlcmZhY2UzKCk7CiAgICB2YXIgcmVjb3JkZXJfMSA9IHJlcXVpcmVfcmVjb3JkZXIoKTsKICAgIHZhciBDYW5ub3RDcmVhdGVGaWxlRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKHBhdGgpIHsKICAgICAgICBzdXBlcihgQ2Fubm90IGNyZWF0ZSBmaWxlICIke3BhdGh9Ii5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNhbm5vdENyZWF0ZUZpbGVFeGNlcHRpb24gPSBDYW5ub3RDcmVhdGVGaWxlRXhjZXB0aW9uOwogICAgdmFyIE51bGxUcmVlRGlyRW50cnkgPSBjbGFzcyBfTnVsbFRyZWVEaXJFbnRyeSB7CiAgICAgIHBhdGg7CiAgICAgIGdldCBwYXJlbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGF0aCA9PSAiLyIgPyBudWxsIDogbmV3IF9OdWxsVHJlZURpckVudHJ5KCgwLCBjb3JlXzEuZGlybmFtZSkodGhpcy5wYXRoKSk7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IocGF0aCkgewogICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CiAgICAgIH0KICAgICAgc3ViZGlycyA9IFtdOwogICAgICBzdWJmaWxlcyA9IFtdOwogICAgICBkaXIobmFtZSkgewogICAgICAgIHJldHVybiBuZXcgX051bGxUcmVlRGlyRW50cnkoKDAsIGNvcmVfMS5qb2luKSh0aGlzLnBhdGgsIG5hbWUpKTsKICAgICAgfQogICAgICBmaWxlKF9uYW1lKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmlzaXQoKSB7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5OdWxsVHJlZURpckVudHJ5ID0gTnVsbFRyZWVEaXJFbnRyeTsKICAgIHZhciBOdWxsVHJlZSA9IGNsYXNzIF9OdWxsVHJlZSB7CiAgICAgIFtpbnRlcmZhY2VfMS5UcmVlU3ltYm9sXSgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBicmFuY2goKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfTnVsbFRyZWUoKTsKICAgICAgfQogICAgICBtZXJnZShfb3RoZXIsIF9zdHJhdGVneSkgewogICAgICB9CiAgICAgIHJvb3QgPSBuZXcgTnVsbFRyZWVEaXJFbnRyeSgoMCwgY29yZV8xLm5vcm1hbGl6ZSkoIi8iKSk7CiAgICAgIC8vIFNpbXBsZSByZWFkb25seSBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogICAgICBleGlzdHMoX3BhdGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmVhZChfcGF0aCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJlYWRUZXh0KHBhdGgpIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgfQogICAgICByZWFkSnNvbihwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24ocGF0aCk7CiAgICAgIH0KICAgICAgZ2V0KF9wYXRoKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZ2V0RGlyKHBhdGgpIHsKICAgICAgICByZXR1cm4gbmV3IE51bGxUcmVlRGlyRW50cnkoKDAsIGNvcmVfMS5ub3JtYWxpemUpKCIvIiArIHBhdGgpKTsKICAgICAgfQogICAgICB2aXNpdCgpIHsKICAgICAgfQogICAgICAvLyBDaGFuZ2UgY29udGVudCBvZiBob3N0IGZpbGVzLgogICAgICBiZWdpblVwZGF0ZShwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLkZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24ocGF0aCk7CiAgICAgIH0KICAgICAgY29tbWl0VXBkYXRlKHJlY29yZCkgewogICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHJlY29yZCBpbnN0YW5jZW9mIHJlY29yZGVyXzEuVXBkYXRlUmVjb3JkZXJCYXNlID8gcmVjb3JkLnBhdGggOiAiPHVua25vd24+Iik7CiAgICAgIH0KICAgICAgLy8gQ2hhbmdlIHN0cnVjdHVyZSBvZiB0aGUgaG9zdC4KICAgICAgY29weShwYXRoLCBfdG8pIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgfQogICAgICBkZWxldGUocGF0aCkgewogICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHBhdGgpOwogICAgICB9CiAgICAgIGNyZWF0ZShwYXRoLCBfY29udGVudCkgewogICAgICAgIHRocm93IG5ldyBDYW5ub3RDcmVhdGVGaWxlRXhjZXB0aW9uKHBhdGgpOwogICAgICB9CiAgICAgIHJlbmFtZShwYXRoLCBfdG8pIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgfQogICAgICBvdmVyd3JpdGUocGF0aCwgX2NvbnRlbnQpIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgfQogICAgICBhcHBseShfYWN0aW9uLCBfc3RyYXRlZ3kpIHsKICAgICAgfQogICAgICBnZXQgYWN0aW9ucygpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5OdWxsVHJlZSA9IE51bGxUcmVlOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy9jYWxsLmpzCnZhciByZXF1aXJlX2NhbGwgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvY2FsbC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuSW52YWxpZFNvdXJjZVJlc3VsdEV4Y2VwdGlvbiA9IGV4cG9ydHMyLkludmFsaWRSdWxlUmVzdWx0RXhjZXB0aW9uID0gdm9pZCAwOwogICAgZXhwb3J0czIuY2FsbFNvdXJjZSA9IGNhbGxTb3VyY2U7CiAgICBleHBvcnRzMi5jYWxsUnVsZSA9IGNhbGxSdWxlOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICB2YXIgcnhqc18xID0gcmVxdWlyZV9janMoKTsKICAgIHZhciBpbnRlcmZhY2VfMSA9IHJlcXVpcmVfaW50ZXJmYWNlMygpOwogICAgZnVuY3Rpb24gX2dldFR5cGVPZlJlc3VsdCh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiAidW5kZWZpbmVkIjsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gYEZ1bmN0aW9uKClgOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAib2JqZWN0IikgewogICAgICAgIHJldHVybiBgJHt0eXBlb2YgdmFsdWV9KCR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSlgOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdCkgewogICAgICAgICAgcmV0dXJuIGBPYmplY3QoJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KWA7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvcikgewogICAgICAgICAgcmV0dXJuIGBJbnN0YW5jZSBvZiBjbGFzcyAke3ZhbHVlLmNvbnN0cnVjdG9yLm5hbWV9YDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJVbmtub3duIE9iamVjdCI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgSW52YWxpZFJ1bGVSZXN1bHRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IodmFsdWUpIHsKICAgICAgICBzdXBlcihgSW52YWxpZCBydWxlIHJlc3VsdDogJHtfZ2V0VHlwZU9mUmVzdWx0KHZhbHVlKX0uYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5JbnZhbGlkUnVsZVJlc3VsdEV4Y2VwdGlvbiA9IEludmFsaWRSdWxlUmVzdWx0RXhjZXB0aW9uOwogICAgdmFyIEludmFsaWRTb3VyY2VSZXN1bHRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IodmFsdWUpIHsKICAgICAgICBzdXBlcihgSW52YWxpZCBzb3VyY2UgcmVzdWx0OiAke19nZXRUeXBlT2ZSZXN1bHQodmFsdWUpfS5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkludmFsaWRTb3VyY2VSZXN1bHRFeGNlcHRpb24gPSBJbnZhbGlkU291cmNlUmVzdWx0RXhjZXB0aW9uOwogICAgZnVuY3Rpb24gY2FsbFNvdXJjZShzb3VyY2UsIGNvbnRleHQpIHsKICAgICAgcmV0dXJuICgwLCByeGpzXzEuZGVmZXIpKGFzeW5jICgpID0+IHsKICAgICAgICBsZXQgcmVzdWx0ID0gc291cmNlKGNvbnRleHQpOwogICAgICAgIGlmICgoMCwgcnhqc18xLmlzT2JzZXJ2YWJsZSkocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gYXdhaXQgKDAsIHJ4anNfMS5sYXN0VmFsdWVGcm9tKShyZXN1bHQucGlwZSgoMCwgcnhqc18xLmRlZmF1bHRJZkVtcHR5KSh2b2lkIDApKSk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQgJiYgaW50ZXJmYWNlXzEuVHJlZVN5bWJvbCBpbiByZXN1bHQpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBJbnZhbGlkU291cmNlUmVzdWx0RXhjZXB0aW9uKHJlc3VsdCk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsbFJ1bGUocnVsZSwgaW5wdXQsIGNvbnRleHQpIHsKICAgICAgaWYgKCgwLCByeGpzXzEuaXNPYnNlcnZhYmxlKShpbnB1dCkpIHsKICAgICAgICByZXR1cm4gaW5wdXQucGlwZSgoMCwgcnhqc18xLm1lcmdlTWFwKSgoaW5wdXRUcmVlKSA9PiBjYWxsUnVsZUFzeW5jKHJ1bGUsIGlucHV0VHJlZSwgY29udGV4dCkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5kZWZlcikoKCkgPT4gY2FsbFJ1bGVBc3luYyhydWxlLCBpbnB1dCwgY29udGV4dCkpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBjYWxsUnVsZUFzeW5jKHJ1bGUsIHRyZWUsIGNvbnRleHQpIHsKICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bGUodHJlZSwgY29udGV4dCk7CiAgICAgIHdoaWxlICh0eXBlb2YgcmVzdWx0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0KHRyZWUsIGNvbnRleHQpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybiB0cmVlOwogICAgICB9CiAgICAgIGlmICgoMCwgcnhqc18xLmlzT2JzZXJ2YWJsZSkocmVzdWx0KSkgewogICAgICAgIHJlc3VsdCA9IGF3YWl0ICgwLCByeGpzXzEubGFzdFZhbHVlRnJvbSkocmVzdWx0LnBpcGUoKDAsIHJ4anNfMS5kZWZhdWx0SWZFbXB0eSkodHJlZSkpKTsKICAgICAgfQogICAgICBpZiAocmVzdWx0ICYmIGludGVyZmFjZV8xLlRyZWVTeW1ib2wgaW4gcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICB0aHJvdyBuZXcgSW52YWxpZFJ1bGVSZXN1bHRFeGNlcHRpb24ocmVzdWx0KTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL3NjaGVtYXRpYy5qcwp2YXIgcmVxdWlyZV9zY2hlbWF0aWMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL3NjaGVtYXRpYy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuU2NoZW1hdGljSW1wbCA9IGV4cG9ydHMyLkludmFsaWRTY2hlbWF0aWNzTmFtZUV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIHZhciBjb3JlXzEgPSByZXF1aXJlX3NyYygpOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgY2FsbF8xID0gcmVxdWlyZV9jYWxsKCk7CiAgICB2YXIgc2NvcGVkXzEgPSByZXF1aXJlX3Njb3BlZDIoKTsKICAgIHZhciBJbnZhbGlkU2NoZW1hdGljc05hbWVFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IobmFtZSkgewogICAgICAgIHN1cGVyKGBTY2hlbWF0aWNzIGhhcyBpbnZhbGlkIG5hbWU6ICIke25hbWV9Ii5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkludmFsaWRTY2hlbWF0aWNzTmFtZUV4Y2VwdGlvbiA9IEludmFsaWRTY2hlbWF0aWNzTmFtZUV4Y2VwdGlvbjsKICAgIHZhciBTY2hlbWF0aWNJbXBsID0gY2xhc3MgewogICAgICBfZGVzY3JpcHRpb247CiAgICAgIF9mYWN0b3J5OwogICAgICBfY29sbGVjdGlvbjsKICAgICAgX2VuZ2luZTsKICAgICAgY29uc3RydWN0b3IoX2Rlc2NyaXB0aW9uLCBfZmFjdG9yeSwgX2NvbGxlY3Rpb24sIF9lbmdpbmUpIHsKICAgICAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IF9kZXNjcmlwdGlvbjsKICAgICAgICB0aGlzLl9mYWN0b3J5ID0gX2ZhY3Rvcnk7CiAgICAgICAgdGhpcy5fY29sbGVjdGlvbiA9IF9jb2xsZWN0aW9uOwogICAgICAgIHRoaXMuX2VuZ2luZSA9IF9lbmdpbmU7CiAgICAgICAgaWYgKCFfZGVzY3JpcHRpb24ubmFtZS5tYXRjaCgvXlstQC9fLmEtekEtWjAtOV0rJC8pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFNjaGVtYXRpY3NOYW1lRXhjZXB0aW9uKF9kZXNjcmlwdGlvbi5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IGRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjsKICAgICAgfQogICAgICBnZXQgY29sbGVjdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbjsKICAgICAgfQogICAgICBjYWxsKG9wdGlvbnMsIGhvc3QsIHBhcmVudENvbnRleHQsIGV4ZWN1dGlvbk9wdGlvbnMpIHsKICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fZW5naW5lLmNyZWF0ZUNvbnRleHQodGhpcywgcGFyZW50Q29udGV4dCwgZXhlY3V0aW9uT3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIGhvc3QucGlwZSgoMCwgcnhqc18xLmZpcnN0KSgpLCAoMCwgcnhqc18xLmNvbmNhdE1hcCkoKHRyZWUpID0+IHRoaXMuX2VuZ2luZS50cmFuc2Zvcm1PcHRpb25zKHRoaXMsIG9wdGlvbnMsIGNvbnRleHQpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChvKSA9PiBbdHJlZSwgb10pKSksICgwLCByeGpzXzEuY29uY2F0TWFwKSgoW3RyZWUsIHRyYW5zZm9ybWVkT3B0aW9uc10pID0+IHsKICAgICAgICAgIGxldCBpbnB1dDsKICAgICAgICAgIGxldCBzY29wZWQgPSBmYWxzZTsKICAgICAgICAgIGlmIChleGVjdXRpb25PcHRpb25zICYmIGV4ZWN1dGlvbk9wdGlvbnMuc2NvcGUpIHsKICAgICAgICAgICAgc2NvcGVkID0gdHJ1ZTsKICAgICAgICAgICAgaW5wdXQgPSBuZXcgc2NvcGVkXzEuU2NvcGVkVHJlZSh0cmVlLCBleGVjdXRpb25PcHRpb25zLnNjb3BlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlucHV0ID0gdHJlZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAoMCwgY2FsbF8xLmNhbGxSdWxlKSh0aGlzLl9mYWN0b3J5KHRyYW5zZm9ybWVkT3B0aW9ucyksIGlucHV0LCBjb250ZXh0KS5waXBlKCgwLCByeGpzXzEubWFwKSgob3V0cHV0KSA9PiB7CiAgICAgICAgICAgIGlmIChvdXRwdXQgPT09IGlucHV0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGVkKSB7CiAgICAgICAgICAgICAgdHJlZS5tZXJnZShvdXRwdXQpOwogICAgICAgICAgICAgIHJldHVybiB0cmVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5TY2hlbWF0aWNJbXBsID0gU2NoZW1hdGljSW1wbDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2VuZ2luZS5qcwp2YXIgcmVxdWlyZV9lbmdpbmUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2VuZ2luZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuU2NoZW1hdGljRW5naW5lID0gZXhwb3J0czIuVGFza1NjaGVkdWxlciA9IGV4cG9ydHMyLkNvbGxlY3Rpb25JbXBsID0gZXhwb3J0czIuVW5rbm93blRhc2tEZXBlbmRlbmN5RXhjZXB0aW9uID0gZXhwb3J0czIuVW5yZWdpc3RlcmVkVGFza0V4Y2VwdGlvbiA9IGV4cG9ydHMyLlNjaGVtYXRpY0VuZ2luZUNvbmZsaWN0aW5nRXhjZXB0aW9uID0gZXhwb3J0czIuUHJpdmF0ZVNjaGVtYXRpY0V4Y2VwdGlvbiA9IGV4cG9ydHMyLlVua25vd25TY2hlbWF0aWNFeGNlcHRpb24gPSBleHBvcnRzMi5DaXJjdWxhckNvbGxlY3Rpb25FeGNlcHRpb24gPSBleHBvcnRzMi5Vbmtub3duQ29sbGVjdGlvbkV4Y2VwdGlvbiA9IGV4cG9ydHMyLlVua25vd25VcmxTb3VyY2VQcm90b2NvbCA9IHZvaWQgMDsKICAgIHZhciBjb3JlXzEgPSByZXF1aXJlX3NyYygpOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgaW50ZXJmYWNlXzEgPSByZXF1aXJlX2ludGVyZmFjZTMoKTsKICAgIHZhciBudWxsXzEgPSByZXF1aXJlX251bGwoKTsKICAgIHZhciBzdGF0aWNfMSA9IHJlcXVpcmVfc3RhdGljKCk7CiAgICB2YXIgc2NoZW1hdGljXzEgPSByZXF1aXJlX3NjaGVtYXRpYygpOwogICAgdmFyIFVua25vd25VcmxTb3VyY2VQcm90b2NvbCA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3Rvcih1cmwzKSB7CiAgICAgICAgc3VwZXIoYFVua25vd24gUHJvdG9jb2wgb24gdXJsICIke3VybDN9Ii5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlVua25vd25VcmxTb3VyY2VQcm90b2NvbCA9IFVua25vd25VcmxTb3VyY2VQcm90b2NvbDsKICAgIHZhciBVbmtub3duQ29sbGVjdGlvbkV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihuYW1lKSB7CiAgICAgICAgc3VwZXIoYFVua25vd24gY29sbGVjdGlvbiAiJHtuYW1lfSIuYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Vbmtub3duQ29sbGVjdGlvbkV4Y2VwdGlvbiA9IFVua25vd25Db2xsZWN0aW9uRXhjZXB0aW9uOwogICAgdmFyIENpcmN1bGFyQ29sbGVjdGlvbkV4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihuYW1lKSB7CiAgICAgICAgc3VwZXIoYENpcmN1bGFyIGNvbGxlY3Rpb24gcmVmZXJlbmNlICIke25hbWV9Ii5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkNpcmN1bGFyQ29sbGVjdGlvbkV4Y2VwdGlvbiA9IENpcmN1bGFyQ29sbGVjdGlvbkV4Y2VwdGlvbjsKICAgIHZhciBVbmtub3duU2NoZW1hdGljRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUsIGNvbGxlY3Rpb24pIHsKICAgICAgICBzdXBlcihgU2NoZW1hdGljICIke25hbWV9IiBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAiJHtjb2xsZWN0aW9uLm5hbWV9Ii5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlVua25vd25TY2hlbWF0aWNFeGNlcHRpb24gPSBVbmtub3duU2NoZW1hdGljRXhjZXB0aW9uOwogICAgdmFyIFByaXZhdGVTY2hlbWF0aWNFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IobmFtZSwgY29sbGVjdGlvbikgewogICAgICAgIHN1cGVyKGBTY2hlbWF0aWMgIiR7bmFtZX0iIG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICIke2NvbGxlY3Rpb24ubmFtZX0iLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuUHJpdmF0ZVNjaGVtYXRpY0V4Y2VwdGlvbiA9IFByaXZhdGVTY2hlbWF0aWNFeGNlcHRpb247CiAgICB2YXIgU2NoZW1hdGljRW5naW5lQ29uZmxpY3RpbmdFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoYEEgc2NoZW1hdGljIHdhcyBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBlbmdpbmUgYXMgaXRzIHBhcmVudC5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlNjaGVtYXRpY0VuZ2luZUNvbmZsaWN0aW5nRXhjZXB0aW9uID0gU2NoZW1hdGljRW5naW5lQ29uZmxpY3RpbmdFeGNlcHRpb247CiAgICB2YXIgVW5yZWdpc3RlcmVkVGFza0V4Y2VwdGlvbiA9IGNsYXNzIGV4dGVuZHMgY29yZV8xLkJhc2VFeGNlcHRpb24gewogICAgICBjb25zdHJ1Y3RvcihuYW1lLCBzY2hlbWF0aWMpIHsKICAgICAgICBjb25zdCBhZGRlbmR1bSA9IHNjaGVtYXRpYyA/IGAgaW4gc2NoZW1hdGljICIke3NjaGVtYXRpYy5uYW1lfSJgIDogIiI7CiAgICAgICAgc3VwZXIoYFVucmVnaXN0ZXJlZCB0YXNrICIke25hbWV9IiR7YWRkZW5kdW19LmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuVW5yZWdpc3RlcmVkVGFza0V4Y2VwdGlvbiA9IFVucmVnaXN0ZXJlZFRhc2tFeGNlcHRpb247CiAgICB2YXIgVW5rbm93blRhc2tEZXBlbmRlbmN5RXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKGlkKSB7CiAgICAgICAgc3VwZXIoYFVua25vd24gdGFzayBkZXBlbmRlbmN5IFtJRDogJHtpZC5pZH1dLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuVW5rbm93blRhc2tEZXBlbmRlbmN5RXhjZXB0aW9uID0gVW5rbm93blRhc2tEZXBlbmRlbmN5RXhjZXB0aW9uOwogICAgdmFyIENvbGxlY3Rpb25JbXBsID0gY2xhc3MgewogICAgICBfZGVzY3JpcHRpb247CiAgICAgIF9lbmdpbmU7CiAgICAgIGJhc2VEZXNjcmlwdGlvbnM7CiAgICAgIGNvbnN0cnVjdG9yKF9kZXNjcmlwdGlvbiwgX2VuZ2luZSwgYmFzZURlc2NyaXB0aW9ucykgewogICAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gX2Rlc2NyaXB0aW9uOwogICAgICAgIHRoaXMuX2VuZ2luZSA9IF9lbmdpbmU7CiAgICAgICAgdGhpcy5iYXNlRGVzY3JpcHRpb25zID0gYmFzZURlc2NyaXB0aW9uczsKICAgICAgfQogICAgICBnZXQgZGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uOwogICAgICB9CiAgICAgIGdldCBuYW1lKCkgewogICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uLm5hbWUgfHwgIjx1bmtub3duPiI7CiAgICAgIH0KICAgICAgY3JlYXRlU2NoZW1hdGljKG5hbWUsIGFsbG93UHJpdmF0ZSA9IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2VuZ2luZS5jcmVhdGVTY2hlbWF0aWMobmFtZSwgdGhpcywgYWxsb3dQcml2YXRlKTsKICAgICAgfQogICAgICBsaXN0U2NoZW1hdGljTmFtZXMoaW5jbHVkZUhpZGRlbikgewogICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUubGlzdFNjaGVtYXRpY05hbWVzKHRoaXMsIGluY2x1ZGVIaWRkZW4pOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuQ29sbGVjdGlvbkltcGwgPSBDb2xsZWN0aW9uSW1wbDsKICAgIHZhciBUYXNrU2NoZWR1bGVyID0gY2xhc3MgX1Rhc2tTY2hlZHVsZXIgewogICAgICBfY29udGV4dDsKICAgICAgX3F1ZXVlID0gbmV3IGNvcmVfMS5Qcmlvcml0eVF1ZXVlKCh4LCB5KSA9PiB4LnByaW9yaXR5IC0geS5wcmlvcml0eSk7CiAgICAgIF90YXNrSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgc3RhdGljIF90YXNrSWRDb3VudGVyID0gMTsKICAgICAgY29uc3RydWN0b3IoX2NvbnRleHQpIHsKICAgICAgICB0aGlzLl9jb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgIH0KICAgICAgX2NhbGN1bGF0ZVByaW9yaXR5KGRlcGVuZGVuY2llcykgewogICAgICAgIGlmIChkZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByaW8gPSBbLi4uZGVwZW5kZW5jaWVzXS5yZWR1Y2UoKHByaW8yLCB0YXNrKSA9PiBwcmlvMiArIHRhc2sucHJpb3JpdHksIDEpOwogICAgICAgIHJldHVybiBwcmlvOwogICAgICB9CiAgICAgIF9tYXBEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMpIHsKICAgICAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXNrcyA9IGRlcGVuZGVuY2llcy5tYXAoKGRlcCkgPT4gewogICAgICAgICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tJZHMuZ2V0KGRlcCk7CiAgICAgICAgICBpZiAoIXRhc2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25UYXNrRGVwZW5kZW5jeUV4Y2VwdGlvbihkZXApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXQodGFza3MpOwogICAgICB9CiAgICAgIHNjaGVkdWxlKHRhc2tDb25maWd1cmF0aW9uKSB7CiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5fbWFwRGVwZW5kZW5jaWVzKHRhc2tDb25maWd1cmF0aW9uLmRlcGVuZGVuY2llcyk7CiAgICAgICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLl9jYWxjdWxhdGVQcmlvcml0eShkZXBlbmRlbmNpZXMpOwogICAgICAgIGNvbnN0IHRhc2sgPSB7CiAgICAgICAgICBpZDogX1Rhc2tTY2hlZHVsZXIuX3Rhc2tJZENvdW50ZXIrKywKICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgY29uZmlndXJhdGlvbjogdGFza0NvbmZpZ3VyYXRpb24sCiAgICAgICAgICBjb250ZXh0OiB0aGlzLl9jb250ZXh0CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spOwogICAgICAgIGNvbnN0IGlkID0geyBpZDogdGFzay5pZCB9OwogICAgICAgIHRoaXMuX3Rhc2tJZHMuc2V0KGlkLCB0YXNrKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICAgIH0KICAgICAgZmluYWxpemUoKSB7CiAgICAgICAgY29uc3QgdGFza3MgPSB0aGlzLl9xdWV1ZS50b0FycmF5KCk7CiAgICAgICAgdGhpcy5fcXVldWUuY2xlYXIoKTsKICAgICAgICB0aGlzLl90YXNrSWRzLmNsZWFyKCk7CiAgICAgICAgcmV0dXJuIHRhc2tzOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuVGFza1NjaGVkdWxlciA9IFRhc2tTY2hlZHVsZXI7CiAgICB2YXIgU2NoZW1hdGljRW5naW5lID0gY2xhc3MgewogICAgICBfaG9zdDsKICAgICAgX3dvcmtmbG93OwogICAgICBfY29sbGVjdGlvbkNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgX3NjaGVtYXRpY0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICAgIF90YXNrU2NoZWR1bGVycyA9IG5ldyBBcnJheSgpOwogICAgICBjb25zdHJ1Y3RvcihfaG9zdCwgX3dvcmtmbG93KSB7CiAgICAgICAgdGhpcy5faG9zdCA9IF9ob3N0OwogICAgICAgIHRoaXMuX3dvcmtmbG93ID0gX3dvcmtmbG93OwogICAgICB9CiAgICAgIGdldCB3b3JrZmxvdygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3cgfHwgbnVsbDsKICAgICAgfQogICAgICBnZXQgZGVmYXVsdE1lcmdlU3RyYXRlZ3koKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZGVmYXVsdE1lcmdlU3RyYXRlZ3kgfHwgaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5EZWZhdWx0OwogICAgICB9CiAgICAgIGNyZWF0ZUNvbGxlY3Rpb24obmFtZSwgcmVxdWVzdGVyKSB7CiAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSB0aGlzLl9jb2xsZWN0aW9uQ2FjaGUuZ2V0KG5hbWUpOwogICAgICAgIGlmIChjb2xsZWN0aW9uKSB7CiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKICAgICAgICB9CiAgICAgICAgY29uc3QgW2Rlc2NyaXB0aW9uLCBiYXNlc10gPSB0aGlzLl9jcmVhdGVDb2xsZWN0aW9uRGVzY3JpcHRpb24obmFtZSwgcmVxdWVzdGVyPy5kZXNjcmlwdGlvbik7CiAgICAgICAgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uSW1wbChkZXNjcmlwdGlvbiwgdGhpcywgYmFzZXMpOwogICAgICAgIHRoaXMuX2NvbGxlY3Rpb25DYWNoZS5zZXQobmFtZSwgY29sbGVjdGlvbik7CiAgICAgICAgdGhpcy5fc2NoZW1hdGljQ2FjaGUuc2V0KGNvbGxlY3Rpb24sIC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpOwogICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwogICAgICB9CiAgICAgIF9jcmVhdGVDb2xsZWN0aW9uRGVzY3JpcHRpb24obmFtZSwgcmVxdWVzdGVyLCBwYXJlbnROYW1lcykgewogICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5faG9zdC5jcmVhdGVDb2xsZWN0aW9uRGVzY3JpcHRpb24obmFtZSwgcmVxdWVzdGVyKTsKICAgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkNvbGxlY3Rpb25FeGNlcHRpb24obmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROYW1lcyAmJiBwYXJlbnROYW1lcy5oYXMoZGVzY3JpcHRpb24ubmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBDaXJjdWxhckNvbGxlY3Rpb25FeGNlcHRpb24obmFtZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhc2VzID0gbmV3IEFycmF5KCk7CiAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmV4dGVuZHMpIHsKICAgICAgICAgIHBhcmVudE5hbWVzID0gKHBhcmVudE5hbWVzIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZChkZXNjcmlwdGlvbi5uYW1lKTsKICAgICAgICAgIGZvciAoY29uc3QgYmFzZU5hbWUgb2YgZGVzY3JpcHRpb24uZXh0ZW5kcykgewogICAgICAgICAgICBjb25zdCBbYmFzZSwgYmFzZUJhc2VzXSA9IHRoaXMuX2NyZWF0ZUNvbGxlY3Rpb25EZXNjcmlwdGlvbihiYXNlTmFtZSwgZGVzY3JpcHRpb24sIG5ldyBTZXQocGFyZW50TmFtZXMpKTsKICAgICAgICAgICAgYmFzZXMudW5zaGlmdChiYXNlLCAuLi5iYXNlQmFzZXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gW2Rlc2NyaXB0aW9uLCBiYXNlc107CiAgICAgIH0KICAgICAgY3JlYXRlQ29udGV4dChzY2hlbWF0aWMsIHBhcmVudCwgZXhlY3V0aW9uT3B0aW9ucykgewogICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmVuZ2luZSAmJiBwYXJlbnQuZW5naW5lICE9PSB0aGlzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hdGljRW5naW5lQ29uZmxpY3RpbmdFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICAgICAgbGV0IGludGVyYWN0aXZlID0gdHJ1ZTsKICAgICAgICBpZiAoZXhlY3V0aW9uT3B0aW9ucyAmJiBleGVjdXRpb25PcHRpb25zLmludGVyYWN0aXZlICE9IHZvaWQgMCkgewogICAgICAgICAgaW50ZXJhY3RpdmUgPSBleGVjdXRpb25PcHRpb25zLmludGVyYWN0aXZlOwogICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICYmIHBhcmVudC5pbnRlcmFjdGl2ZSAhPSB2b2lkIDApIHsKICAgICAgICAgIGludGVyYWN0aXZlID0gcGFyZW50LmludGVyYWN0aXZlOwogICAgICAgIH0KICAgICAgICBsZXQgY29udGV4dCA9IHsKICAgICAgICAgIGRlYnVnOiBwYXJlbnQgJiYgcGFyZW50LmRlYnVnIHx8IGZhbHNlLAogICAgICAgICAgZW5naW5lOiB0aGlzLAogICAgICAgICAgbG9nZ2VyOiBwYXJlbnQgJiYgcGFyZW50LmxvZ2dlciAmJiBwYXJlbnQubG9nZ2VyLmNyZWF0ZUNoaWxkKHNjaGVtYXRpYy5kZXNjcmlwdGlvbi5uYW1lKSB8fCBuZXcgY29yZV8xLmxvZ2dpbmcuTnVsbExvZ2dlcigpLAogICAgICAgICAgc2NoZW1hdGljLAogICAgICAgICAgc3RyYXRlZ3k6IHBhcmVudCAmJiBwYXJlbnQuc3RyYXRlZ3kgIT09IHZvaWQgMCA/IHBhcmVudC5zdHJhdGVneSA6IHRoaXMuZGVmYXVsdE1lcmdlU3RyYXRlZ3ksCiAgICAgICAgICBpbnRlcmFjdGl2ZSwKICAgICAgICAgIGFkZFRhc2sKICAgICAgICB9OwogICAgICAgIGNvbnN0IG1heWJlTmV3Q29udGV4dCA9IHRoaXMuX2hvc3QudHJhbnNmb3JtQ29udGV4dChjb250ZXh0KTsKICAgICAgICBpZiAobWF5YmVOZXdDb250ZXh0KSB7CiAgICAgICAgICBjb250ZXh0ID0gbWF5YmVOZXdDb250ZXh0OwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXNrU2NoZWR1bGVyID0gbmV3IFRhc2tTY2hlZHVsZXIoY29udGV4dCk7CiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuX2hvc3Q7CiAgICAgICAgdGhpcy5fdGFza1NjaGVkdWxlcnMucHVzaCh0YXNrU2NoZWR1bGVyKTsKICAgICAgICBmdW5jdGlvbiBhZGRUYXNrKHRhc2ssIGRlcGVuZGVuY2llcykgewogICAgICAgICAgY29uc3QgY29uZmlnID0gdGFzay50b0NvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgIGlmICghaG9zdC5oYXNUYXNrRXhlY3V0b3IoY29uZmlnLm5hbWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBVbnJlZ2lzdGVyZWRUYXNrRXhjZXB0aW9uKGNvbmZpZy5uYW1lLCBzY2hlbWF0aWMuZGVzY3JpcHRpb24pOwogICAgICAgICAgfQogICAgICAgICAgY29uZmlnLmRlcGVuZGVuY2llcyA9IGNvbmZpZy5kZXBlbmRlbmNpZXMgfHwgW107CiAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICAgIGNvbmZpZy5kZXBlbmRlbmNpZXMudW5zaGlmdCguLi5kZXBlbmRlbmNpZXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhc2tTY2hlZHVsZXIuc2NoZWR1bGUoY29uZmlnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICAgIH0KICAgICAgY3JlYXRlU2NoZW1hdGljKG5hbWUsIGNvbGxlY3Rpb24sIGFsbG93UHJpdmF0ZSA9IGZhbHNlKSB7CiAgICAgICAgY29uc3Qgc2NoZW1hdGljTWFwID0gdGhpcy5fc2NoZW1hdGljQ2FjaGUuZ2V0KGNvbGxlY3Rpb24pOwogICAgICAgIGxldCBzY2hlbWF0aWMgPSBzY2hlbWF0aWNNYXA/LmdldChuYW1lKTsKICAgICAgICBpZiAoc2NoZW1hdGljKSB7CiAgICAgICAgICByZXR1cm4gc2NoZW1hdGljOwogICAgICAgIH0KICAgICAgICBsZXQgY29sbGVjdGlvbkRlc2NyaXB0aW9uID0gY29sbGVjdGlvbi5kZXNjcmlwdGlvbjsKICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSB0aGlzLl9ob3N0LmNyZWF0ZVNjaGVtYXRpY0Rlc2NyaXB0aW9uKG5hbWUsIGNvbGxlY3Rpb24uZGVzY3JpcHRpb24pOwogICAgICAgIGlmICghZGVzY3JpcHRpb24pIHsKICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmJhc2VEZXNjcmlwdGlvbnMpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBiYXNlIG9mIGNvbGxlY3Rpb24uYmFzZURlc2NyaXB0aW9ucykgewogICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5faG9zdC5jcmVhdGVTY2hlbWF0aWNEZXNjcmlwdGlvbihuYW1lLCBiYXNlKTsKICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25EZXNjcmlwdGlvbiA9IGJhc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25TY2hlbWF0aWNFeGNlcHRpb24obmFtZSwgY29sbGVjdGlvbi5kZXNjcmlwdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkZXNjcmlwdGlvbi5wcml2YXRlICYmICFhbGxvd1ByaXZhdGUpIHsKICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlU2NoZW1hdGljRXhjZXB0aW9uKG5hbWUsIGNvbGxlY3Rpb24uZGVzY3JpcHRpb24pOwogICAgICAgIH0KICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5faG9zdC5nZXRTY2hlbWF0aWNSdWxlRmFjdG9yeShkZXNjcmlwdGlvbiwgY29sbGVjdGlvbkRlc2NyaXB0aW9uKTsKICAgICAgICBzY2hlbWF0aWMgPSBuZXcgc2NoZW1hdGljXzEuU2NoZW1hdGljSW1wbChkZXNjcmlwdGlvbiwgZmFjdG9yeSwgY29sbGVjdGlvbiwgdGhpcyk7CiAgICAgICAgc2NoZW1hdGljTWFwPy5zZXQobmFtZSwgc2NoZW1hdGljKTsKICAgICAgICByZXR1cm4gc2NoZW1hdGljOwogICAgICB9CiAgICAgIGxpc3RTY2hlbWF0aWNOYW1lcyhjb2xsZWN0aW9uLCBpbmNsdWRlSGlkZGVuKSB7CiAgICAgICAgY29uc3QgbmFtZXMgPSB0aGlzLl9ob3N0Lmxpc3RTY2hlbWF0aWNOYW1lcyhjb2xsZWN0aW9uLmRlc2NyaXB0aW9uLCBpbmNsdWRlSGlkZGVuKTsKICAgICAgICBpZiAoY29sbGVjdGlvbi5iYXNlRGVzY3JpcHRpb25zKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgY29sbGVjdGlvbi5iYXNlRGVzY3JpcHRpb25zKSB7CiAgICAgICAgICAgIG5hbWVzLnB1c2goLi4udGhpcy5faG9zdC5saXN0U2NoZW1hdGljTmFtZXMoYmFzZSwgaW5jbHVkZUhpZGRlbikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQobmFtZXMpXS5zb3J0KCk7CiAgICAgIH0KICAgICAgdHJhbnNmb3JtT3B0aW9ucyhzY2hlbWF0aWMsIG9wdGlvbnMsIGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5faG9zdC50cmFuc2Zvcm1PcHRpb25zKHNjaGVtYXRpYy5kZXNjcmlwdGlvbiwgb3B0aW9ucywgY29udGV4dCk7CiAgICAgIH0KICAgICAgY3JlYXRlU291cmNlRnJvbVVybCh1cmwzLCBjb250ZXh0KSB7CiAgICAgICAgc3dpdGNoICh1cmwzLnByb3RvY29sKSB7CiAgICAgICAgICBjYXNlICJudWxsOiI6CiAgICAgICAgICAgIHJldHVybiAoKSA9PiBuZXcgbnVsbF8xLk51bGxUcmVlKCk7CiAgICAgICAgICBjYXNlICJlbXB0eToiOgogICAgICAgICAgICByZXR1cm4gKCkgPT4gKDAsIHN0YXRpY18xLmVtcHR5KSgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBob3N0U291cmNlID0gdGhpcy5faG9zdC5jcmVhdGVTb3VyY2VGcm9tVXJsKHVybDMsIGNvbnRleHQpOwogICAgICAgIGlmICghaG9zdFNvdXJjZSkgewogICAgICAgICAgdGhyb3cgbmV3IFVua25vd25VcmxTb3VyY2VQcm90b2NvbCh1cmwzLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaG9zdFNvdXJjZTsKICAgICAgfQogICAgICBleGVjdXRlUG9zdFRhc2tzKCkgewogICAgICAgIGNvbnN0IGV4ZWN1dG9ycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgdGFza09ic2VydmFibGUgPSAoMCwgcnhqc18xLmZyb20pKHRoaXMuX3Rhc2tTY2hlZHVsZXJzKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgoc2NoZWR1bGVyKSA9PiBzY2hlZHVsZXIuZmluYWxpemUoKSksICgwLCByeGpzXzEuY29uY2F0TWFwKSgodGFzaykgPT4gewogICAgICAgICAgY29uc3QgeyBuYW1lLCBvcHRpb25zIH0gPSB0YXNrLmNvbmZpZ3VyYXRpb247CiAgICAgICAgICBjb25zdCBleGVjdXRvciA9IGV4ZWN1dG9ycy5nZXQobmFtZSk7CiAgICAgICAgICBpZiAoZXhlY3V0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yKG9wdGlvbnMsIHRhc2suY29udGV4dCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5jcmVhdGVUYXNrRXhlY3V0b3IobmFtZSkucGlwZSgoMCwgcnhqc18xLmNvbmNhdE1hcCkoKGV4ZWN1dG9yMikgPT4gewogICAgICAgICAgICBleGVjdXRvcnMuc2V0KG5hbWUsIGV4ZWN1dG9yMik7CiAgICAgICAgICAgIHJldHVybiBleGVjdXRvcjIob3B0aW9ucywgdGFzay5jb250ZXh0KTsKICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHRhc2tPYnNlcnZhYmxlOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuU2NoZW1hdGljRW5naW5lID0gU2NoZW1hdGljRW5naW5lOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9lbmdpbmUvaW50ZXJmYWNlLmpzCnZhciByZXF1aXJlX2ludGVyZmFjZTQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2ludGVyZmFjZS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9lbmdpbmUvaW5kZXguanMKdmFyIHJlcXVpcmVfZW5naW5lMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9lbmdpbmUvaW5kZXguanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgX19jcmVhdGVCaW5kaW5nID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspOwogICAgICBpZiAoIWRlc2MgfHwgKCJnZXQiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG1ba107CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7CiAgICB9IDogZnVuY3Rpb24obywgbSwgaywgazIpIHsKICAgICAgaWYgKGsyID09PSB2b2lkIDApIGsyID0gazsKICAgICAgb1trMl0gPSBtW2tdOwogICAgfSk7CiAgICB2YXIgX19leHBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19leHBvcnRTdGFyIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMzKSB7CiAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09ICJkZWZhdWx0IiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMzLCBtLCBwKTsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2VuZ2luZSgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9pbnRlcmZhY2U0KCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3NjaGVtYXRpYygpLCBleHBvcnRzMik7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL19fdmlydHVhbF9fL0Bhbmd1bGFyLWRldmtpdC1jb3JlLXZpcnR1YWwtYzk2YzZlOTAwOS8wL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1jb3JlLW5wbS0xOS4xLjUtOGNhZGIzODc1Zi03ZDgxZmQxMDQ3LnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L2NvcmUvbm9kZS9jbGktbG9nZ2VyLmpzCnZhciByZXF1aXJlX2NsaV9sb2dnZXIgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2NsaS1sb2dnZXIuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmNyZWF0ZUNvbnNvbGVMb2dnZXIgPSBjcmVhdGVDb25zb2xlTG9nZ2VyOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgc3JjXzEgPSByZXF1aXJlX3NyYygpOwogICAgZnVuY3Rpb24gY3JlYXRlQ29uc29sZUxvZ2dlcih2ZXJib3NlID0gZmFsc2UsIHN0ZG91dCA9IHByb2Nlc3Muc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLnN0ZGVyciwgY29sb3JzKSB7CiAgICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBzcmNfMS5sb2dnaW5nLkluZGVudExvZ2dlcigiY2xpbmciKTsKICAgICAgbG9nZ2VyLnBpcGUoKDAsIHJ4anNfMS5maWx0ZXIpKChlbnRyeSkgPT4gZW50cnkubGV2ZWwgIT09ICJkZWJ1ZyIgfHwgdmVyYm9zZSkpLnN1YnNjcmliZSgoZW50cnkpID0+IHsKICAgICAgICBjb25zdCBjb2xvciA9IGNvbG9ycyAmJiBjb2xvcnNbZW50cnkubGV2ZWxdOwogICAgICAgIGxldCBvdXRwdXQgPSBzdGRvdXQ7CiAgICAgICAgc3dpdGNoIChlbnRyeS5sZXZlbCkgewogICAgICAgICAgY2FzZSAid2FybiI6CiAgICAgICAgICBjYXNlICJmYXRhbCI6CiAgICAgICAgICBjYXNlICJlcnJvciI6CiAgICAgICAgICAgIG91dHB1dCA9IHN0ZGVycjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IDJlMzsKICAgICAgICBsZXQgbWVzc2FnZSA9IGVudHJ5Lm1lc3NhZ2U7CiAgICAgICAgd2hpbGUgKG1lc3NhZ2UpIHsKICAgICAgICAgIGNvbnN0IGNodW5rID0gbWVzc2FnZS5zbGljZSgwLCBjaHVua1NpemUpOwogICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Uuc2xpY2UoY2h1bmtTaXplKTsKICAgICAgICAgIG91dHB1dC53cml0ZShjb2xvciA/IGNvbG9yKGNodW5rKSA6IGNodW5rKTsKICAgICAgICB9CiAgICAgICAgb3V0cHV0LndyaXRlKCJcbiIpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGxvZ2dlcjsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2hvc3QuanMKdmFyIHJlcXVpcmVfaG9zdDMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2hvc3QuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLk5vZGVKc1N5bmNIb3N0ID0gZXhwb3J0czIuTm9kZUpzQXN5bmNIb3N0ID0gdm9pZCAwOwogICAgdmFyIG5vZGVfZnNfMSA9IHJlcXVpcmUoIm5vZGU6ZnMiKTsKICAgIHZhciBub2RlX3BhdGhfMSA9IHJlcXVpcmUoIm5vZGU6cGF0aCIpOwogICAgdmFyIHJ4anNfMSA9IHJlcXVpcmVfY2pzKCk7CiAgICB2YXIgc3JjXzEgPSByZXF1aXJlX3NyYygpOwogICAgYXN5bmMgZnVuY3Rpb24gZXhpc3RzKHBhdGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBub2RlX2ZzXzEucHJvbWlzZXMuYWNjZXNzKHBhdGgsIG5vZGVfZnNfMS5jb25zdGFudHMuRl9PSyk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgdmFyIEZTV2F0Y2hlcjsKICAgIGZ1bmN0aW9uIGxvYWRGU1dhdGNoZXIoKSB7CiAgICAgIGlmICghRlNXYXRjaGVyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIEZTV2F0Y2hlciA9IHJlcXVpcmUoImNob2tpZGFyIikuRlNXYXRjaGVyOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGlmIChlLmNvZGUgIT09ICJNT0RVTEVfTk9UX0ZPVU5EIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzIG9mIGFuZ3VsYXItZGV2a2l0IHZlcnNpb24gOC4wLCB0aGUgImNob2tpZGFyIiBwYWNrYWdlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyIHRvIHVzZSB3YXRjaCgpIGZlYXR1cmVzLicpOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBOb2RlSnNBc3luY0hvc3QgPSBjbGFzcyB7CiAgICAgIGdldCBjYXBhYmlsaXRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsgc3luY2hyb25vdXM6IGZhbHNlIH07CiAgICAgIH0KICAgICAgd3JpdGUocGF0aCwgY29udGVudCkgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLmZyb20pKG5vZGVfZnNfMS5wcm9taXNlcy5ta2RpcigoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkoKDAsIHNyY18xLmRpcm5hbWUpKHBhdGgpKSwgeyByZWN1cnNpdmU6IHRydWUgfSkpLnBpcGUoKDAsIHJ4anNfMS5tZXJnZU1hcCkoKCkgPT4gbm9kZV9mc18xLnByb21pc2VzLndyaXRlRmlsZSgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkocGF0aCksIG5ldyBVaW50OEFycmF5KGNvbnRlbnQpKSkpOwogICAgICB9CiAgICAgIHJlYWQocGF0aCkgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLmZyb20pKG5vZGVfZnNfMS5wcm9taXNlcy5yZWFkRmlsZSgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkocGF0aCkpKS5waXBlKCgwLCByeGpzXzEubWFwKSgoYnVmZmVyKSA9PiBuZXcgVWludDhBcnJheShidWZmZXIpLmJ1ZmZlcikpOwogICAgICB9CiAgICAgIGRlbGV0ZShwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuZnJvbSkobm9kZV9mc18xLnByb21pc2VzLnJtKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlLCBtYXhSZXRyaWVzOiAzIH0pKTsKICAgICAgfQogICAgICByZW5hbWUoZnJvbSwgdG8pIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5mcm9tKShub2RlX2ZzXzEucHJvbWlzZXMucmVuYW1lKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShmcm9tKSwgKDAsIHNyY18xLmdldFN5c3RlbVBhdGgpKHRvKSkpOwogICAgICB9CiAgICAgIGxpc3QocGF0aCkgewogICAgICAgIHJldHVybiAoMCwgcnhqc18xLmZyb20pKG5vZGVfZnNfMS5wcm9taXNlcy5yZWFkZGlyKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSkpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChuYW1lcykgPT4gbmFtZXMubWFwKChuYW1lKSA9PiAoMCwgc3JjXzEuZnJhZ21lbnQpKG5hbWUpKSkpOwogICAgICB9CiAgICAgIGV4aXN0cyhwYXRoKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuZnJvbSkoZXhpc3RzKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSkpOwogICAgICB9CiAgICAgIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0KHBhdGgpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChzdGF0KSA9PiBzdGF0LmlzRGlyZWN0b3J5KCkpKTsKICAgICAgfQogICAgICBpc0ZpbGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXQocGF0aCkucGlwZSgoMCwgcnhqc18xLm1hcCkoKHN0YXQpID0+IHN0YXQuaXNGaWxlKCkpKTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCBzdGF0LgogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5mcm9tKShub2RlX2ZzXzEucHJvbWlzZXMuc3RhdCgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkocGF0aCkpKTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCB3YXRjaGluZy4KICAgICAgd2F0Y2gocGF0aCwgX29wdGlvbnMpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIGxvYWRGU1dhdGNoZXIoKTsKICAgICAgICAgIGNvbnN0IHdhdGNoZXIgPSBuZXcgRlNXYXRjaGVyKHsgcGVyc2lzdGVudDogdHJ1ZSB9KTsKICAgICAgICAgIHdhdGNoZXIuYWRkKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSk7CiAgICAgICAgICB3YXRjaGVyLm9uKCJjaGFuZ2UiLCAocGF0aDIpID0+IHsKICAgICAgICAgICAgb2JzLm5leHQoewogICAgICAgICAgICAgIHBhdGg6ICgwLCBzcmNfMS5ub3JtYWxpemUpKHBhdGgyKSwKICAgICAgICAgICAgICB0aW1lOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwKICAgICAgICAgICAgICB0eXBlOiBzcmNfMS52aXJ0dWFsRnMuSG9zdFdhdGNoRXZlbnRUeXBlLkNoYW5nZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KS5vbigiYWRkIiwgKHBhdGgyKSA9PiB7CiAgICAgICAgICAgIG9icy5uZXh0KHsKICAgICAgICAgICAgICBwYXRoOiAoMCwgc3JjXzEubm9ybWFsaXplKShwYXRoMiksCiAgICAgICAgICAgICAgdGltZTogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksCiAgICAgICAgICAgICAgdHlwZTogc3JjXzEudmlydHVhbEZzLkhvc3RXYXRjaEV2ZW50VHlwZS5DcmVhdGVkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkub24oInVubGluayIsIChwYXRoMikgPT4gewogICAgICAgICAgICBvYnMubmV4dCh7CiAgICAgICAgICAgICAgcGF0aDogKDAsIHNyY18xLm5vcm1hbGl6ZSkocGF0aDIpLAogICAgICAgICAgICAgIHRpbWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgICAgIHR5cGU6IHNyY18xLnZpcnR1YWxGcy5Ib3N0V2F0Y2hFdmVudFR5cGUuRGVsZXRlZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgdm9pZCB3YXRjaGVyLmNsb3NlKCk7CiAgICAgICAgICB9OwogICAgICAgIH0pLnBpcGUoKDAsIHJ4anNfMS5wdWJsaXNoKSgpLCAoMCwgcnhqc18xLnJlZkNvdW50KSgpKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLk5vZGVKc0FzeW5jSG9zdCA9IE5vZGVKc0FzeW5jSG9zdDsKICAgIHZhciBOb2RlSnNTeW5jSG9zdCA9IGNsYXNzIHsKICAgICAgZ2V0IGNhcGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4geyBzeW5jaHJvbm91czogdHJ1ZSB9OwogICAgICB9CiAgICAgIHdyaXRlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgICgwLCBub2RlX2ZzXzEubWtkaXJTeW5jKSgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkoKDAsIHNyY18xLmRpcm5hbWUpKHBhdGgpKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgICAgICAoMCwgbm9kZV9mc18xLndyaXRlRmlsZVN5bmMpKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSwgbmV3IFVpbnQ4QXJyYXkoY29udGVudCkpOwogICAgICAgICAgb2JzLm5leHQoKTsKICAgICAgICAgIG9icy5jb21wbGV0ZSgpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJlYWQocGF0aCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgY29uc3QgYnVmZmVyID0gKDAsIG5vZGVfZnNfMS5yZWFkRmlsZVN5bmMpKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSk7CiAgICAgICAgICBvYnMubmV4dChuZXcgVWludDhBcnJheShidWZmZXIpLmJ1ZmZlcik7CiAgICAgICAgICBvYnMuY29tcGxldGUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBkZWxldGUocGF0aCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgKDAsIG5vZGVfZnNfMS5ybVN5bmMpKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlLCBtYXhSZXRyaWVzOiAzIH0pOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmVuYW1lKGZyb20sIHRvKSB7CiAgICAgICAgcmV0dXJuIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzKSA9PiB7CiAgICAgICAgICBjb25zdCB0b1N5c3RlbVBhdGggPSAoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkodG8pOwogICAgICAgICAgKDAsIG5vZGVfZnNfMS5ta2RpclN5bmMpKCgwLCBub2RlX3BhdGhfMS5kaXJuYW1lKSh0b1N5c3RlbVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgICAgICgwLCBub2RlX2ZzXzEucmVuYW1lU3luYykoKDAsIHNyY18xLmdldFN5c3RlbVBhdGgpKGZyb20pLCB0b1N5c3RlbVBhdGgpOwogICAgICAgICAgb2JzLm5leHQoKTsKICAgICAgICAgIG9icy5jb21wbGV0ZSgpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGxpc3QocGF0aCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgY29uc3QgbmFtZXMgPSAoMCwgbm9kZV9mc18xLnJlYWRkaXJTeW5jKSgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkocGF0aCkpOwogICAgICAgICAgb2JzLm5leHQobmFtZXMubWFwKChuYW1lKSA9PiAoMCwgc3JjXzEuZnJhZ21lbnQpKG5hbWUpKSk7CiAgICAgICAgICBvYnMuY29tcGxldGUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBleGlzdHMocGF0aCkgewogICAgICAgIHJldHVybiBuZXcgcnhqc18xLk9ic2VydmFibGUoKG9icykgPT4gewogICAgICAgICAgb2JzLm5leHQoKDAsIG5vZGVfZnNfMS5leGlzdHNTeW5jKSgoMCwgc3JjXzEuZ2V0U3lzdGVtUGF0aCkocGF0aCkpKTsKICAgICAgICAgIG9icy5jb21wbGV0ZSgpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlzRGlyZWN0b3J5KHBhdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0KHBhdGgpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChzdGF0KSA9PiBzdGF0LmlzRGlyZWN0b3J5KCkpKTsKICAgICAgfQogICAgICBpc0ZpbGUocGF0aCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXQocGF0aCkucGlwZSgoMCwgcnhqc18xLm1hcCkoKHN0YXQpID0+IHN0YXQuaXNGaWxlKCkpKTsKICAgICAgfQogICAgICAvLyBTb21lIGhvc3RzIG1heSBub3Qgc3VwcG9ydCBzdGF0LgogICAgICBzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gbmV3IHJ4anNfMS5PYnNlcnZhYmxlKChvYnMpID0+IHsKICAgICAgICAgIG9icy5uZXh0KCgwLCBub2RlX2ZzXzEuc3RhdFN5bmMpKCgwLCBzcmNfMS5nZXRTeXN0ZW1QYXRoKShwYXRoKSkpOwogICAgICAgICAgb2JzLmNvbXBsZXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy8gU29tZSBob3N0cyBtYXkgbm90IHN1cHBvcnQgd2F0Y2hpbmcuCiAgICAgIHdhdGNoKHBhdGgsIF9vcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzKSA9PiB7CiAgICAgICAgICBsb2FkRlNXYXRjaGVyKCk7CiAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IEZTV2F0Y2hlcih7IHBlcnNpc3RlbnQ6IGZhbHNlIH0pOwogICAgICAgICAgd2F0Y2hlci5hZGQoKDAsIHNyY18xLmdldFN5c3RlbVBhdGgpKHBhdGgpKTsKICAgICAgICAgIHdhdGNoZXIub24oImNoYW5nZSIsIChwYXRoMikgPT4gewogICAgICAgICAgICBvYnMubmV4dCh7CiAgICAgICAgICAgICAgcGF0aDogKDAsIHNyY18xLm5vcm1hbGl6ZSkocGF0aDIpLAogICAgICAgICAgICAgIHRpbWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLAogICAgICAgICAgICAgIHR5cGU6IHNyY18xLnZpcnR1YWxGcy5Ib3N0V2F0Y2hFdmVudFR5cGUuQ2hhbmdlZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pLm9uKCJhZGQiLCAocGF0aDIpID0+IHsKICAgICAgICAgICAgb2JzLm5leHQoewogICAgICAgICAgICAgIHBhdGg6ICgwLCBzcmNfMS5ub3JtYWxpemUpKHBhdGgyKSwKICAgICAgICAgICAgICB0aW1lOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwKICAgICAgICAgICAgICB0eXBlOiBzcmNfMS52aXJ0dWFsRnMuSG9zdFdhdGNoRXZlbnRUeXBlLkNyZWF0ZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KS5vbigidW5saW5rIiwgKHBhdGgyKSA9PiB7CiAgICAgICAgICAgIG9icy5uZXh0KHsKICAgICAgICAgICAgICBwYXRoOiAoMCwgc3JjXzEubm9ybWFsaXplKShwYXRoMiksCiAgICAgICAgICAgICAgdGltZTogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksCiAgICAgICAgICAgICAgdHlwZTogc3JjXzEudmlydHVhbEZzLkhvc3RXYXRjaEV2ZW50VHlwZS5EZWxldGVkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICB2b2lkIHdhdGNoZXIuY2xvc2UoKTsKICAgICAgICAgIH07CiAgICAgICAgfSkucGlwZSgoMCwgcnhqc18xLnB1Ymxpc2gpKCksICgwLCByeGpzXzEucmVmQ291bnQpKCkpOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuTm9kZUpzU3luY0hvc3QgPSBOb2RlSnNTeW5jSG9zdDsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2luZGV4LmpzCnZhciByZXF1aXJlX25vZGUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vX192aXJ0dWFsX18vQGFuZ3VsYXItZGV2a2l0LWNvcmUtdmlydHVhbC1jOTZjNmU5MDA5LzAvY2FjaGUvQGFuZ3VsYXItZGV2a2l0LWNvcmUtbnBtLTE5LjEuNS04Y2FkYjM4NzVmLTdkODFmZDEwNDcuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTsKICAgICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtW2tdOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwogICAgfSA6IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIG9bazJdID0gbVtrXTsKICAgIH0pOwogICAgdmFyIF9fZXhwb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXhwb3J0U3RhciB8fCBmdW5jdGlvbihtLCBleHBvcnRzMykgewogICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzMywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzMywgbSwgcCk7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9jbGlfbG9nZ2VyKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2hvc3QzKCksIGV4cG9ydHMyKTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9hY3Rpb24uanMKdmFyIHJlcXVpcmVfYWN0aW9uID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvYWN0aW9uLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5BY3Rpb25MaXN0ID0gZXhwb3J0czIuVW5rbm93bkFjdGlvbkV4Y2VwdGlvbiA9IHZvaWQgMDsKICAgIGV4cG9ydHMyLmlzQ29udGVudEFjdGlvbiA9IGlzQ29udGVudEFjdGlvbjsKICAgIHZhciBjb3JlXzEgPSByZXF1aXJlX3NyYygpOwogICAgdmFyIFVua25vd25BY3Rpb25FeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IoYWN0aW9uKSB7CiAgICAgICAgc3VwZXIoYFVua25vd24gYWN0aW9uOiAiJHthY3Rpb24ua2luZH0iLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuVW5rbm93bkFjdGlvbkV4Y2VwdGlvbiA9IFVua25vd25BY3Rpb25FeGNlcHRpb247CiAgICB2YXIgX2lkID0gMTsKICAgIHZhciBBY3Rpb25MaXN0ID0gY2xhc3MgewogICAgICBfYWN0aW9ucyA9IFtdOwogICAgICBfYWN0aW9uKGFjdGlvbikgewogICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaCh7CiAgICAgICAgICAuLi5hY3Rpb24sCiAgICAgICAgICBpZDogX2lkKyssCiAgICAgICAgICBwYXJlbnQ6IHRoaXMuX2FjdGlvbnNbdGhpcy5fYWN0aW9ucy5sZW5ndGggLSAxXT8uaWQgPz8gMAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNyZWF0ZShwYXRoLCBjb250ZW50KSB7CiAgICAgICAgdGhpcy5fYWN0aW9uKHsga2luZDogImMiLCBwYXRoLCBjb250ZW50IH0pOwogICAgICB9CiAgICAgIG92ZXJ3cml0ZShwYXRoLCBjb250ZW50KSB7CiAgICAgICAgdGhpcy5fYWN0aW9uKHsga2luZDogIm8iLCBwYXRoLCBjb250ZW50IH0pOwogICAgICB9CiAgICAgIHJlbmFtZShwYXRoLCB0bykgewogICAgICAgIHRoaXMuX2FjdGlvbih7IGtpbmQ6ICJyIiwgcGF0aCwgdG8gfSk7CiAgICAgIH0KICAgICAgZGVsZXRlKHBhdGgpIHsKICAgICAgICB0aGlzLl9hY3Rpb24oeyBraW5kOiAiZCIsIHBhdGggfSk7CiAgICAgIH0KICAgICAgb3B0aW1pemUoKSB7CiAgICAgICAgY29uc3QgdG9DcmVhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IHRvUmVuYW1lID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICBjb25zdCB0b092ZXJ3cml0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgdG9EZWxldGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuX2FjdGlvbnMpIHsKICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmtpbmQpIHsKICAgICAgICAgICAgY2FzZSAiYyI6CiAgICAgICAgICAgICAgdG9DcmVhdGUuc2V0KGFjdGlvbi5wYXRoLCBhY3Rpb24uY29udGVudCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm8iOgogICAgICAgICAgICAgIGlmICh0b0NyZWF0ZS5oYXMoYWN0aW9uLnBhdGgpKSB7CiAgICAgICAgICAgICAgICB0b0NyZWF0ZS5zZXQoYWN0aW9uLnBhdGgsIGFjdGlvbi5jb250ZW50KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdG9PdmVyd3JpdGUuc2V0KGFjdGlvbi5wYXRoLCBhY3Rpb24uY29udGVudCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkIjoKICAgICAgICAgICAgICB0b0RlbGV0ZS5hZGQoYWN0aW9uLnBhdGgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJyIjogewogICAgICAgICAgICAgIGNvbnN0IG1heWJlQ3JlYXRlID0gdG9DcmVhdGUuZ2V0KGFjdGlvbi5wYXRoKTsKICAgICAgICAgICAgICBjb25zdCBtYXliZU92ZXJ3cml0ZSA9IHRvT3ZlcndyaXRlLmdldChhY3Rpb24ucGF0aCk7CiAgICAgICAgICAgICAgaWYgKG1heWJlQ3JlYXRlKSB7CiAgICAgICAgICAgICAgICB0b0NyZWF0ZS5kZWxldGUoYWN0aW9uLnBhdGgpOwogICAgICAgICAgICAgICAgdG9DcmVhdGUuc2V0KGFjdGlvbi50bywgbWF5YmVDcmVhdGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobWF5YmVPdmVyd3JpdGUpIHsKICAgICAgICAgICAgICAgIHRvT3ZlcndyaXRlLmRlbGV0ZShhY3Rpb24ucGF0aCk7CiAgICAgICAgICAgICAgICB0b092ZXJ3cml0ZS5zZXQoYWN0aW9uLnRvLCBtYXliZU92ZXJ3cml0ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBtYXliZVJlbmFtZSA9IHZvaWQgMDsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtmcm9tLCB0b10gb2YgdG9SZW5hbWUuZW50cmllcygpKSB7CiAgICAgICAgICAgICAgICBpZiAodG8gPT0gYWN0aW9uLnBhdGgpIHsKICAgICAgICAgICAgICAgICAgbWF5YmVSZW5hbWUgPSBmcm9tOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG1heWJlUmVuYW1lKSB7CiAgICAgICAgICAgICAgICB0b1JlbmFtZS5zZXQobWF5YmVSZW5hbWUsIGFjdGlvbi50byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghbWF5YmVDcmVhdGUgJiYgIW1heWJlT3ZlcndyaXRlICYmICFtYXliZVJlbmFtZSkgewogICAgICAgICAgICAgICAgdG9SZW5hbWUuc2V0KGFjdGlvbi5wYXRoLCBhY3Rpb24udG8pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9hY3Rpb25zID0gW107CiAgICAgICAgdG9EZWxldGUuZm9yRWFjaCgoeCkgPT4gewogICAgICAgICAgdGhpcy5kZWxldGUoeCk7CiAgICAgICAgfSk7CiAgICAgICAgdG9SZW5hbWUuZm9yRWFjaCgodG8sIGZyb20pID0+IHsKICAgICAgICAgIHRoaXMucmVuYW1lKGZyb20sIHRvKTsKICAgICAgICB9KTsKICAgICAgICB0b0NyZWF0ZS5mb3JFYWNoKChjb250ZW50LCBwYXRoKSA9PiB7CiAgICAgICAgICB0aGlzLmNyZWF0ZShwYXRoLCBjb250ZW50KTsKICAgICAgICB9KTsKICAgICAgICB0b092ZXJ3cml0ZS5mb3JFYWNoKChjb250ZW50LCBwYXRoKSA9PiB7CiAgICAgICAgICB0aGlzLm92ZXJ3cml0ZShwYXRoLCBjb250ZW50KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBwdXNoKGFjdGlvbikgewogICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICB9CiAgICAgIGdldChpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnNbaV07CiAgICAgIH0KICAgICAgaGFzKGFjdGlvbikgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgYSA9IHRoaXMuX2FjdGlvbnNbaV07CiAgICAgICAgICBpZiAoYS5pZCA9PSBhY3Rpb24uaWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYS5pZCA+IGFjdGlvbi5pZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmaW5kKHByZWRpY2F0ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zLmZpbmQocHJlZGljYXRlKSB8fCBudWxsOwogICAgICB9CiAgICAgIGZvckVhY2goZm4sIHRoaXNBcmcpIHsKICAgICAgICB0aGlzLl9hY3Rpb25zLmZvckVhY2goZm4sIHRoaXNBcmcpOwogICAgICB9CiAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMubGVuZ3RoOwogICAgICB9CiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zW1N5bWJvbC5pdGVyYXRvcl0oKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkFjdGlvbkxpc3QgPSBBY3Rpb25MaXN0OwogICAgZnVuY3Rpb24gaXNDb250ZW50QWN0aW9uKGFjdGlvbikgewogICAgICByZXR1cm4gYWN0aW9uLmtpbmQgPT0gImMiIHx8IGFjdGlvbi5raW5kID09ICJvIjsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvc2luay9zaW5rLmpzCnZhciByZXF1aXJlX3NpbmsgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvc2luay9zaW5rLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5TaW1wbGVTaW5rQmFzZSA9IHZvaWQgMDsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24yKCk7CiAgICB2YXIgYWN0aW9uXzEgPSByZXF1aXJlX2FjdGlvbigpOwogICAgdmFyIE5vb3AgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICB2YXIgU2ltcGxlU2lua0Jhc2UgPSBjbGFzcyB7CiAgICAgIHByZUNvbW1pdEFjdGlvbiA9IE5vb3A7CiAgICAgIHBvc3RDb21taXRBY3Rpb24gPSBOb29wOwogICAgICBwcmVDb21taXQgPSBOb29wOwogICAgICBwb3N0Q29tbWl0ID0gTm9vcDsKICAgICAgX2ZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb24ocGF0aCkgewogICAgICAgIHRocm93IG5ldyBleGNlcHRpb25fMS5GaWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uKHBhdGgpOwogICAgICB9CiAgICAgIF9maWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKHBhdGgpIHsKICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihwYXRoKTsKICAgICAgfQogICAgICBfdmFsaWRhdGVPdmVyd3JpdGVBY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlRmlsZUV4aXN0cyhhY3Rpb24ucGF0aCkucGlwZSgoMCwgcnhqc18xLm1hcCkoKGIpID0+IHsKICAgICAgICAgIGlmICghYikgewogICAgICAgICAgICB0aGlzLl9maWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uKGFjdGlvbi5wYXRoKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgX3ZhbGlkYXRlQ3JlYXRlQWN0aW9uKGFjdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUZpbGVFeGlzdHMoYWN0aW9uLnBhdGgpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChiKSA9PiB7CiAgICAgICAgICBpZiAoYikgewogICAgICAgICAgICB0aGlzLl9maWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uKGFjdGlvbi5wYXRoKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgX3ZhbGlkYXRlUmVuYW1lQWN0aW9uKGFjdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUZpbGVFeGlzdHMoYWN0aW9uLnBhdGgpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChiKSA9PiB7CiAgICAgICAgICBpZiAoIWIpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbihhY3Rpb24ucGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgfSksICgwLCByeGpzXzEubWVyZ2VNYXApKCgpID0+IHRoaXMuX3ZhbGlkYXRlRmlsZUV4aXN0cyhhY3Rpb24udG8pKSwgKDAsIHJ4anNfMS5tYXApKChiKSA9PiB7CiAgICAgICAgICBpZiAoYikgewogICAgICAgICAgICB0aGlzLl9maWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uKGFjdGlvbi50byk7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIF92YWxpZGF0ZURlbGV0ZUFjdGlvbihhY3Rpb24pIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVGaWxlRXhpc3RzKGFjdGlvbi5wYXRoKS5waXBlKCgwLCByeGpzXzEubWFwKSgoYikgPT4gewogICAgICAgICAgaWYgKCFiKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24oYWN0aW9uLnBhdGgpOwogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfQogICAgICB2YWxpZGF0ZVNpbmdsZUFjdGlvbihhY3Rpb24pIHsKICAgICAgICBzd2l0Y2ggKGFjdGlvbi5raW5kKSB7CiAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlT3ZlcndyaXRlQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICBjYXNlICJjIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQ3JlYXRlQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICBjYXNlICJyIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUmVuYW1lQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICBjYXNlICJkIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlRGVsZXRlQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgYWN0aW9uXzEuVW5rbm93bkFjdGlvbkV4Y2VwdGlvbihhY3Rpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBjb21taXRTaW5nbGVBY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuY29uY2F0KSh0aGlzLnZhbGlkYXRlU2luZ2xlQWN0aW9uKGFjdGlvbiksIG5ldyByeGpzXzEuT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgIGxldCBjb21taXR0ZWQgPSBudWxsOwogICAgICAgICAgc3dpdGNoIChhY3Rpb24ua2luZCkgewogICAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgICBjb21taXR0ZWQgPSB0aGlzLl9vdmVyd3JpdGVGaWxlKGFjdGlvbi5wYXRoLCBhY3Rpb24uY29udGVudCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImMiOgogICAgICAgICAgICAgIGNvbW1pdHRlZCA9IHRoaXMuX2NyZWF0ZUZpbGUoYWN0aW9uLnBhdGgsIGFjdGlvbi5jb250ZW50KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiciI6CiAgICAgICAgICAgICAgY29tbWl0dGVkID0gdGhpcy5fcmVuYW1lRmlsZShhY3Rpb24ucGF0aCwgYWN0aW9uLnRvKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZCI6CiAgICAgICAgICAgICAgY29tbWl0dGVkID0gdGhpcy5fZGVsZXRlRmlsZShhY3Rpb24ucGF0aCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29tbWl0dGVkKSB7CiAgICAgICAgICAgIGNvbW1pdHRlZC5zdWJzY3JpYmUob2JzZXJ2ZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9KSkucGlwZSgoMCwgcnhqc18xLmlnbm9yZUVsZW1lbnRzKSgpKTsKICAgICAgfQogICAgICBjb21taXQodHJlZSkgewogICAgICAgIGNvbnN0IGFjdGlvbnMgPSAoMCwgcnhqc18xLmZyb20pKHRyZWUuYWN0aW9ucyk7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuY29uY2F0KSh0aGlzLnByZUNvbW1pdCgpIHx8ICgwLCByeGpzXzEub2YpKG51bGwpLCAoMCwgcnhqc18xLmRlZmVyKSgoKSA9PiBhY3Rpb25zKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgoYWN0aW9uKSA9PiB7CiAgICAgICAgICBjb25zdCBtYXliZUFjdGlvbiA9IHRoaXMucHJlQ29tbWl0QWN0aW9uKGFjdGlvbik7CiAgICAgICAgICBpZiAoKDAsIHJ4anNfMS5pc09ic2VydmFibGUpKG1heWJlQWN0aW9uKSB8fCBpc1Byb21pc2VMaWtlKG1heWJlQWN0aW9uKSkgewogICAgICAgICAgICByZXR1cm4gbWF5YmVBY3Rpb247CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5vZikobWF5YmVBY3Rpb24gfHwgYWN0aW9uKTsKICAgICAgICB9KSwgKDAsIHJ4anNfMS5jb25jYXRNYXApKChhY3Rpb24pID0+IHsKICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLmNvbmNhdCkodGhpcy5jb21taXRTaW5nbGVBY3Rpb24oYWN0aW9uKS5waXBlKCgwLCByeGpzXzEuaWdub3JlRWxlbWVudHMpKCkpLCAoMCwgcnhqc18xLm9mKShhY3Rpb24pKTsKICAgICAgICB9KSwgKDAsIHJ4anNfMS5jb25jYXRNYXApKChhY3Rpb24pID0+IHRoaXMucG9zdENvbW1pdEFjdGlvbihhY3Rpb24pIHx8ICgwLCByeGpzXzEub2YpKG51bGwpKSksICgwLCByeGpzXzEuZGVmZXIpKCgpID0+IHRoaXMuX2RvbmUoKSksICgwLCByeGpzXzEuZGVmZXIpKCgpID0+IHRoaXMucG9zdENvbW1pdCgpIHx8ICgwLCByeGpzXzEub2YpKG51bGwpKSkucGlwZSgoMCwgcnhqc18xLmlnbm9yZUVsZW1lbnRzKSgpLCAoMCwgcnhqc18xLmRlZmF1bHRJZkVtcHR5KSh2b2lkIDApKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLlNpbXBsZVNpbmtCYXNlID0gU2ltcGxlU2lua0Jhc2U7CiAgICBmdW5jdGlvbiBpc1Byb21pc2VMaWtlKHZhbHVlKSB7CiAgICAgIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAiZnVuY3Rpb24iOwogICAgfQogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9zaW5rL2hvc3QuanMKdmFyIHJlcXVpcmVfaG9zdDQgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvc2luay9ob3N0LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5Ib3N0U2luayA9IHZvaWQgMDsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIHNpbmtfMSA9IHJlcXVpcmVfc2luaygpOwogICAgdmFyIEhvc3RTaW5rID0gY2xhc3MgZXh0ZW5kcyBzaW5rXzEuU2ltcGxlU2lua0Jhc2UgewogICAgICBfaG9zdDsKICAgICAgX2ZvcmNlOwogICAgICBfZmlsZXNUb0RlbGV0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIF9maWxlc1RvUmVuYW1lID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgX2ZpbGVzVG9DcmVhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBfZmlsZXNUb1VwZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIGNvbnN0cnVjdG9yKF9ob3N0LCBfZm9yY2UgPSBmYWxzZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5faG9zdCA9IF9ob3N0OwogICAgICAgIHRoaXMuX2ZvcmNlID0gX2ZvcmNlOwogICAgICB9CiAgICAgIF92YWxpZGF0ZUNyZWF0ZUFjdGlvbihhY3Rpb24pIHsKICAgICAgICByZXR1cm4gdGhpcy5fZm9yY2UgPyByeGpzXzEuRU1QVFkgOiBzdXBlci5fdmFsaWRhdGVDcmVhdGVBY3Rpb24oYWN0aW9uKTsKICAgICAgfQogICAgICBfdmFsaWRhdGVGaWxlRXhpc3RzKHApIHsKICAgICAgICBpZiAodGhpcy5fZmlsZXNUb0NyZWF0ZS5oYXMocCkgfHwgdGhpcy5fZmlsZXNUb1VwZGF0ZS5oYXMocCkpIHsKICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLm9mKSh0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzVG9EZWxldGUuaGFzKHApKSB7CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5vZikoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IFtmcm9tLCB0b10gb2YgdGhpcy5fZmlsZXNUb1JlbmFtZS52YWx1ZXMoKSkgewogICAgICAgICAgc3dpdGNoIChwKSB7CiAgICAgICAgICAgIGNhc2UgZnJvbToKICAgICAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5vZikoZmFsc2UpOwogICAgICAgICAgICBjYXNlIHRvOgogICAgICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLm9mKSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZXhpc3RzKHApOwogICAgICB9CiAgICAgIF9vdmVyd3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICB0aGlzLl9maWxlc1RvVXBkYXRlLnNldChwYXRoLCBjb250ZW50KTsKICAgICAgICByZXR1cm4gcnhqc18xLkVNUFRZOwogICAgICB9CiAgICAgIF9jcmVhdGVGaWxlKHBhdGgsIGNvbnRlbnQpIHsKICAgICAgICB0aGlzLl9maWxlc1RvQ3JlYXRlLnNldChwYXRoLCBjb250ZW50KTsKICAgICAgICByZXR1cm4gcnhqc18xLkVNUFRZOwogICAgICB9CiAgICAgIF9yZW5hbWVGaWxlKGZyb20sIHRvKSB7CiAgICAgICAgdGhpcy5fZmlsZXNUb1JlbmFtZS5hZGQoW2Zyb20sIHRvXSk7CiAgICAgICAgcmV0dXJuIHJ4anNfMS5FTVBUWTsKICAgICAgfQogICAgICBfZGVsZXRlRmlsZShwYXRoKSB7CiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzVG9DcmVhdGUuaGFzKHBhdGgpKSB7CiAgICAgICAgICB0aGlzLl9maWxlc1RvQ3JlYXRlLmRlbGV0ZShwYXRoKTsKICAgICAgICAgIHRoaXMuX2ZpbGVzVG9VcGRhdGUuZGVsZXRlKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9maWxlc1RvRGVsZXRlLmFkZChwYXRoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ4anNfMS5FTVBUWTsKICAgICAgfQogICAgICBfZG9uZSgpIHsKICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5jb25jYXQpKCgwLCByeGpzXzEuZnJvbSkoWy4uLnRoaXMuX2ZpbGVzVG9EZWxldGUudmFsdWVzKCldKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgocGF0aCkgPT4gdGhpcy5faG9zdC5kZWxldGUocGF0aCkpKSwgKDAsIHJ4anNfMS5mcm9tKShbLi4udGhpcy5fZmlsZXNUb1JlbmFtZS5lbnRyaWVzKCldKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgoW18sIFtwYXRoLCB0b11dKSA9PiB0aGlzLl9ob3N0LnJlbmFtZShwYXRoLCB0bykpKSwgKDAsIHJ4anNfMS5mcm9tKShbLi4udGhpcy5fZmlsZXNUb0NyZWF0ZS5lbnRyaWVzKCldKS5waXBlKCgwLCByeGpzXzEuY29uY2F0TWFwKSgoW3BhdGgsIGJ1ZmZlcl0pID0+IHRoaXMuX2hvc3Qud3JpdGUocGF0aCwgYnVmZmVyKSkpLCAoMCwgcnhqc18xLmZyb20pKFsuLi50aGlzLl9maWxlc1RvVXBkYXRlLmVudHJpZXMoKV0pLnBpcGUoKDAsIHJ4anNfMS5jb25jYXRNYXApKChbcGF0aCwgYnVmZmVyXSkgPT4gdGhpcy5faG9zdC53cml0ZShwYXRoLCBidWZmZXIpKSkpLnBpcGUoKDAsIHJ4anNfMS5yZWR1Y2UpKCgpID0+IHsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Ib3N0U2luayA9IEhvc3RTaW5rOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9zaW5rL2RyeXJ1bi5qcwp2YXIgcmVxdWlyZV9kcnlydW4gPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvc2luay9kcnlydW4uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLkRyeVJ1blNpbmsgPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciBub2RlXzEgPSByZXF1aXJlX25vZGUoKTsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGhvc3RfMSA9IHJlcXVpcmVfaG9zdDQoKTsKICAgIHZhciBEcnlSdW5TaW5rID0gY2xhc3MgZXh0ZW5kcyBob3N0XzEuSG9zdFNpbmsgewogICAgICBfc3ViamVjdCA9IG5ldyByeGpzXzEuU3ViamVjdCgpOwogICAgICBfZmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvblNldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIF9maWxlQWxyZWFkeUV4aXN0RXhjZXB0aW9uU2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgcmVwb3J0ZXIgPSB0aGlzLl9zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOwogICAgICBjb25zdHJ1Y3Rvcihob3N0LCBmb3JjZSA9IGZhbHNlKSB7CiAgICAgICAgc3VwZXIodHlwZW9mIGhvc3QgPT0gInN0cmluZyIgPyBuZXcgY29yZV8xLnZpcnR1YWxGcy5TY29wZWRIb3N0KG5ldyBub2RlXzEuTm9kZUpzU3luY0hvc3QoKSwgKDAsIGNvcmVfMS5ub3JtYWxpemUpKGhvc3QpKSA6IGhvc3QsIGZvcmNlKTsKICAgICAgfQogICAgICBfZmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvbihwYXRoKSB7CiAgICAgICAgdGhpcy5fZmlsZUFscmVhZHlFeGlzdEV4Y2VwdGlvblNldC5hZGQocGF0aCk7CiAgICAgIH0KICAgICAgX2ZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb24ocGF0aCkgewogICAgICAgIHRoaXMuX2ZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb25TZXQuYWRkKHBhdGgpOwogICAgICB9CiAgICAgIF9kb25lKCkgewogICAgICAgIHRoaXMuX2ZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb25TZXQuZm9yRWFjaCgocGF0aCkgPT4gewogICAgICAgICAgdGhpcy5fc3ViamVjdC5uZXh0KHsKICAgICAgICAgICAga2luZDogImVycm9yIiwKICAgICAgICAgICAgZGVzY3JpcHRpb246ICJhbHJlYWR5RXhpc3QiLAogICAgICAgICAgICBwYXRoCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9maWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uU2V0LmZvckVhY2goKHBhdGgpID0+IHsKICAgICAgICAgIHRoaXMuX3N1YmplY3QubmV4dCh7CiAgICAgICAgICAgIGtpbmQ6ICJlcnJvciIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiZG9lc05vdEV4aXN0IiwKICAgICAgICAgICAgcGF0aAogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fZmlsZXNUb0RlbGV0ZS5mb3JFYWNoKChwYXRoKSA9PiB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtmcm9tXSBvZiB0aGlzLl9maWxlc1RvUmVuYW1lKSB7CiAgICAgICAgICAgIGlmIChmcm9tID09IHBhdGgpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX3N1YmplY3QubmV4dCh7IGtpbmQ6ICJkZWxldGUiLCBwYXRoIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2ZpbGVzVG9SZW5hbWUuZm9yRWFjaCgoW3BhdGgsIHRvXSkgPT4gewogICAgICAgICAgdGhpcy5fc3ViamVjdC5uZXh0KHsga2luZDogInJlbmFtZSIsIHBhdGgsIHRvIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2ZpbGVzVG9DcmVhdGUuZm9yRWFjaCgoY29udGVudCwgcGF0aCkgPT4gewogICAgICAgICAgZm9yIChjb25zdCBbLCB0b10gb2YgdGhpcy5fZmlsZXNUb1JlbmFtZSkgewogICAgICAgICAgICBpZiAodG8gPT0gcGF0aCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuX2ZpbGVBbHJlYWR5RXhpc3RFeGNlcHRpb25TZXQuaGFzKHBhdGgpIHx8IHRoaXMuX2ZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb25TZXQuaGFzKHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX3N1YmplY3QubmV4dCh7IGtpbmQ6ICJjcmVhdGUiLCBwYXRoLCBjb250ZW50IH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2ZpbGVzVG9VcGRhdGUuZm9yRWFjaCgoY29udGVudCwgcGF0aCkgPT4gewogICAgICAgICAgdGhpcy5fc3ViamVjdC5uZXh0KHsga2luZDogInVwZGF0ZSIsIHBhdGgsIGNvbnRlbnQgfSk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fc3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgIHJldHVybiAoMCwgcnhqc18xLm9mKSh2b2lkIDApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuRHJ5UnVuU2luayA9IERyeVJ1blNpbms7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3dvcmtmbG93L2Jhc2UuanMKdmFyIHJlcXVpcmVfYmFzZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy93b3JrZmxvdy9iYXNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5CYXNlV29ya2Zsb3cgPSB2b2lkIDA7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGVuZ2luZV8xID0gcmVxdWlyZV9lbmdpbmUyKCk7CiAgICB2YXIgZXhjZXB0aW9uXzEgPSByZXF1aXJlX2V4Y2VwdGlvbjIoKTsKICAgIHZhciBmb3JtYXRzXzEgPSByZXF1aXJlX2Zvcm1hdHMyKCk7CiAgICB2YXIgZHJ5cnVuXzEgPSByZXF1aXJlX2RyeXJ1bigpOwogICAgdmFyIGhvc3RfMSA9IHJlcXVpcmVfaG9zdDQoKTsKICAgIHZhciBob3N0X3RyZWVfMSA9IHJlcXVpcmVfaG9zdF90cmVlKCk7CiAgICB2YXIgQmFzZVdvcmtmbG93ID0gY2xhc3MgewogICAgICBfZW5naW5lOwogICAgICBfZW5naW5lSG9zdDsKICAgICAgX3JlZ2lzdHJ5OwogICAgICBfaG9zdDsKICAgICAgX3JlcG9ydGVyID0gbmV3IHJ4anNfMS5TdWJqZWN0KCk7CiAgICAgIF9saWZlQ3ljbGUgPSBuZXcgcnhqc18xLlN1YmplY3QoKTsKICAgICAgX2NvbnRleHQ7CiAgICAgIF9mb3JjZTsKICAgICAgX2RyeVJ1bjsKICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgIHRoaXMuX2hvc3QgPSBvcHRpb25zLmhvc3Q7CiAgICAgICAgdGhpcy5fZW5naW5lSG9zdCA9IG9wdGlvbnMuZW5naW5lSG9zdDsKICAgICAgICBpZiAob3B0aW9ucy5yZWdpc3RyeSkgewogICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBjb3JlXzEuc2NoZW1hLkNvcmVTY2hlbWFSZWdpc3RyeShmb3JtYXRzXzEuc3RhbmRhcmRGb3JtYXRzKTsKICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmFkZFBvc3RUcmFuc2Zvcm0oY29yZV8xLnNjaGVtYS50cmFuc2Zvcm1zLmFkZFVuZGVmaW5lZERlZmF1bHRzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZW5naW5lID0gbmV3IGVuZ2luZV8xLlNjaGVtYXRpY0VuZ2luZSh0aGlzLl9lbmdpbmVIb3N0LCB0aGlzKTsKICAgICAgICB0aGlzLl9jb250ZXh0ID0gW107CiAgICAgICAgdGhpcy5fZm9yY2UgPSBvcHRpb25zLmZvcmNlIHx8IGZhbHNlOwogICAgICAgIHRoaXMuX2RyeVJ1biA9IG9wdGlvbnMuZHJ5UnVuIHx8IGZhbHNlOwogICAgICB9CiAgICAgIGdldCBjb250ZXh0KCkgewogICAgICAgIGNvbnN0IG1heWJlQ29udGV4dCA9IHRoaXMuX2NvbnRleHRbdGhpcy5fY29udGV4dC5sZW5ndGggLSAxXTsKICAgICAgICBpZiAoIW1heWJlQ29udGV4dCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZ2V0IGNvbnRleHQgd2hlbiB3b3JrZmxvdyBpcyBub3QgZXhlY3V0aW5nLi4uIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXliZUNvbnRleHQ7CiAgICAgIH0KICAgICAgZ2V0IGVuZ2luZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZW5naW5lOwogICAgICB9CiAgICAgIGdldCBlbmdpbmVIb3N0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmVIb3N0OwogICAgICB9CiAgICAgIGdldCByZWdpc3RyeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnk7CiAgICAgIH0KICAgICAgZ2V0IHJlcG9ydGVyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlci5hc09ic2VydmFibGUoKTsKICAgICAgfQogICAgICBnZXQgbGlmZUN5Y2xlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9saWZlQ3ljbGUuYXNPYnNlcnZhYmxlKCk7CiAgICAgIH0KICAgICAgX2NyZWF0ZVNpbmtzKCkgewogICAgICAgIGxldCBlcnJvciA9IGZhbHNlOwogICAgICAgIGNvbnN0IGRyeVJ1blNpbmsgPSBuZXcgZHJ5cnVuXzEuRHJ5UnVuU2luayh0aGlzLl9ob3N0LCB0aGlzLl9mb3JjZSk7CiAgICAgICAgY29uc3QgZHJ5UnVuU3Vic2NyaWJlciA9IGRyeVJ1blNpbmsucmVwb3J0ZXIuc3Vic2NyaWJlKChldmVudCkgPT4gewogICAgICAgICAgdGhpcy5fcmVwb3J0ZXIubmV4dChldmVudCk7CiAgICAgICAgICBlcnJvciA9IGVycm9yIHx8IGV2ZW50LmtpbmQgPT0gImVycm9yIjsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgZHJ5UnVuU2luaywKICAgICAgICAgIC8vIEFkZCBhIGN1c3RvbSBzaW5rIHRoYXQgY2xlYW4gb3Vyc2VsdmVzIGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvbW1pdCgpIHsKICAgICAgICAgICAgICBkcnlSdW5TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS50aHJvd0Vycm9yKShuZXcgZXhjZXB0aW9uXzEuVW5zdWNjZXNzZnVsV29ya2Zsb3dFeGVjdXRpb24oKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiAoMCwgcnhqc18xLm9mKSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy8gT25seSBhZGQgYSBIb3N0U2luayBpZiB0aGlzIGlzIG5vdCBhIGRyeVJ1bi4KICAgICAgICAgIC4uLiF0aGlzLl9kcnlSdW4gPyBbbmV3IGhvc3RfMS5Ib3N0U2luayh0aGlzLl9ob3N0LCB0aGlzLl9mb3JjZSldIDogW10KICAgICAgICBdOwogICAgICB9CiAgICAgIGV4ZWN1dGUob3B0aW9ucykgewogICAgICAgIGNvbnN0IHBhcmVudENvbnRleHQgPSB0aGlzLl9jb250ZXh0W3RoaXMuX2NvbnRleHQubGVuZ3RoIC0gMV07CiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0KSB7CiAgICAgICAgICB0aGlzLl9saWZlQ3ljbGUubmV4dCh7IGtpbmQ6ICJzdGFydCIgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLl9lbmdpbmUuY3JlYXRlQ29sbGVjdGlvbihvcHRpb25zLmNvbGxlY3Rpb24pOwogICAgICAgIGNvbnN0IGFsbG93UHJpdmF0ZSA9IG9wdGlvbnMuYWxsb3dQcml2YXRlIHx8IHBhcmVudENvbnRleHQgJiYgcGFyZW50Q29udGV4dC5jb2xsZWN0aW9uID09PSBvcHRpb25zLmNvbGxlY3Rpb247CiAgICAgICAgY29uc3Qgc2NoZW1hdGljID0gY29sbGVjdGlvbi5jcmVhdGVTY2hlbWF0aWMob3B0aW9ucy5zY2hlbWF0aWMsIGFsbG93UHJpdmF0ZSk7CiAgICAgICAgY29uc3Qgc2lua3MgPSB0aGlzLl9jcmVhdGVTaW5rcygpOwogICAgICAgIHRoaXMuX2xpZmVDeWNsZS5uZXh0KHsga2luZDogIndvcmtmbG93LXN0YXJ0IiB9KTsKICAgICAgICBjb25zdCBjb250ZXh0ID0gewogICAgICAgICAgLi4ub3B0aW9ucywKICAgICAgICAgIGRlYnVnOiBvcHRpb25zLmRlYnVnIHx8IGZhbHNlLAogICAgICAgICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciB8fCBwYXJlbnRDb250ZXh0ICYmIHBhcmVudENvbnRleHQubG9nZ2VyIHx8IG5ldyBjb3JlXzEubG9nZ2luZy5OdWxsTG9nZ2VyKCksCiAgICAgICAgICBwYXJlbnRDb250ZXh0CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9jb250ZXh0LnB1c2goY29udGV4dCk7CiAgICAgICAgcmV0dXJuIHNjaGVtYXRpYy5jYWxsKG9wdGlvbnMub3B0aW9ucywgKDAsIHJ4anNfMS5vZikobmV3IGhvc3RfdHJlZV8xLkhvc3RUcmVlKHRoaXMuX2hvc3QpKSwgeyBsb2dnZXI6IGNvbnRleHQubG9nZ2VyIH0pLnBpcGUoKDAsIHJ4anNfMS5jb25jYXRNYXApKCh0cmVlKSA9PiB7CiAgICAgICAgICByZXR1cm4gKDAsIHJ4anNfMS5jb25jYXQpKCgwLCByeGpzXzEuZnJvbSkoc2lua3MpLnBpcGUoKDAsIHJ4anNfMS5jb25jYXRNYXApKChzaW5rKSA9PiBzaW5rLmNvbW1pdCh0cmVlKSksICgwLCByeGpzXzEuaWdub3JlRWxlbWVudHMpKCkpLCAoMCwgcnhqc18xLm9mKSh0cmVlKSk7CiAgICAgICAgfSksICgwLCByeGpzXzEuY29uY2F0TWFwKSgoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5fZHJ5UnVuKSB7CiAgICAgICAgICAgIHJldHVybiByeGpzXzEuRU1QVFk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9saWZlQ3ljbGUubmV4dCh7IGtpbmQ6ICJwb3N0LXRhc2tzLXN0YXJ0IiB9KTsKICAgICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUuZXhlY3V0ZVBvc3RUYXNrcygpLnBpcGUoKDAsIHJ4anNfMS50YXApKHsgY29tcGxldGU6ICgpID0+IHRoaXMuX2xpZmVDeWNsZS5uZXh0KHsga2luZDogInBvc3QtdGFza3MtZW5kIiB9KSB9KSwgKDAsIHJ4anNfMS5kZWZhdWx0SWZFbXB0eSkodm9pZCAwKSwgKDAsIHJ4anNfMS5sYXN0KSgpKTsKICAgICAgICB9KSwgKDAsIHJ4anNfMS50YXApKHsKICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2xpZmVDeWNsZS5uZXh0KHsga2luZDogIndvcmtmbG93LWVuZCIgfSk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQucG9wKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZXh0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fbGlmZUN5Y2xlLm5leHQoeyBraW5kOiAiZW5kIiB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkJhc2VXb3JrZmxvdyA9IEJhc2VXb3JrZmxvdzsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvd29ya2Zsb3cvaW50ZXJmYWNlLmpzCnZhciByZXF1aXJlX2ludGVyZmFjZTUgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvd29ya2Zsb3cvaW50ZXJmYWNlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3dvcmtmbG93L2luZGV4LmpzCnZhciByZXF1aXJlX3dvcmtmbG93ID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3dvcmtmbG93L2luZGV4LmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZyA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fY3JlYXRlQmluZGluZyB8fCAoT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTsKICAgICAgaWYgKCFkZXNjIHx8ICgiZ2V0IiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtW2tdOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpOwogICAgfSA6IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7CiAgICAgIGlmIChrMiA9PT0gdm9pZCAwKSBrMiA9IGs7CiAgICAgIG9bazJdID0gbVtrXTsKICAgIH0pOwogICAgdmFyIF9fZXhwb3J0U3RhciA9IGV4cG9ydHMyICYmIGV4cG9ydHMyLl9fZXhwb3J0U3RhciB8fCBmdW5jdGlvbihtLCBleHBvcnRzMykgewogICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzMywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzMywgbSwgcCk7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9iYXNlKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2ludGVyZmFjZTUoKSwgZXhwb3J0czIpOwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy9iYXNlLmpzCnZhciByZXF1aXJlX2Jhc2UyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL2Jhc2UuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnNvdXJjZSA9IHNvdXJjZTsKICAgIGV4cG9ydHMyLmVtcHR5ID0gZW1wdHk7CiAgICBleHBvcnRzMi5jaGFpbiA9IGNoYWluMjsKICAgIGV4cG9ydHMyLmFwcGx5ID0gYXBwbHkzOwogICAgZXhwb3J0czIubWVyZ2VXaXRoID0gbWVyZ2VXaXRoMjsKICAgIGV4cG9ydHMyLm5vb3AgPSBub29wOwogICAgZXhwb3J0czIuZmlsdGVyID0gZmlsdGVyOwogICAgZXhwb3J0czIuYXNTb3VyY2UgPSBhc1NvdXJjZTsKICAgIGV4cG9ydHMyLmJyYW5jaEFuZE1lcmdlID0gYnJhbmNoQW5kTWVyZ2U7CiAgICBleHBvcnRzMi53aGVuID0gd2hlbjsKICAgIGV4cG9ydHMyLnBhcnRpdGlvbkFwcGx5TWVyZ2UgPSBwYXJ0aXRpb25BcHBseU1lcmdlOwogICAgZXhwb3J0czIuZm9yRWFjaCA9IGZvckVhY2g7CiAgICBleHBvcnRzMi5jb21wb3NlRmlsZU9wZXJhdG9ycyA9IGNvbXBvc2VGaWxlT3BlcmF0b3JzOwogICAgZXhwb3J0czIuYXBwbHlUb1N1YnRyZWUgPSBhcHBseVRvU3VidHJlZTsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24yKCk7CiAgICB2YXIgaG9zdF90cmVlXzEgPSByZXF1aXJlX2hvc3RfdHJlZSgpOwogICAgdmFyIGludGVyZmFjZV8xID0gcmVxdWlyZV9pbnRlcmZhY2UzKCk7CiAgICB2YXIgc2NvcGVkXzEgPSByZXF1aXJlX3Njb3BlZDIoKTsKICAgIHZhciBzdGF0aWNfMSA9IHJlcXVpcmVfc3RhdGljKCk7CiAgICB2YXIgY2FsbF8xID0gcmVxdWlyZV9jYWxsKCk7CiAgICBmdW5jdGlvbiBzb3VyY2UodHJlZSkgewogICAgICByZXR1cm4gKCkgPT4gdHJlZTsKICAgIH0KICAgIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgICByZXR1cm4gKCkgPT4gKDAsIHN0YXRpY18xLmVtcHR5KSgpOwogICAgfQogICAgZnVuY3Rpb24gY2hhaW4yKHJ1bGVzKSB7CiAgICAgIHJldHVybiBhc3luYyAoaW5pdGlhbFRyZWUsIGNvbnRleHQpID0+IHsKICAgICAgICBsZXQgaW50ZXJtZWRpYXRlVHJlZTsKICAgICAgICBpZiAoU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gcnVsZXMpIHsKICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcnVsZSBvZiBydWxlcykgewogICAgICAgICAgICBpbnRlcm1lZGlhdGVUcmVlID0gKDAsIGNhbGxfMS5jYWxsUnVsZSkocnVsZSwgaW50ZXJtZWRpYXRlVHJlZSA/PyBpbml0aWFsVHJlZSwgY29udGV4dCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykgewogICAgICAgICAgICBpbnRlcm1lZGlhdGVUcmVlID0gKDAsIGNhbGxfMS5jYWxsUnVsZSkocnVsZSwgaW50ZXJtZWRpYXRlVHJlZSA/PyBpbml0aWFsVHJlZSwgY29udGV4dCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAoKSA9PiBpbnRlcm1lZGlhdGVUcmVlOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYXBwbHkzKHNvdXJjZTIsIHJ1bGVzKSB7CiAgICAgIHJldHVybiAoY29udGV4dCkgPT4gKDAsIGNhbGxfMS5jYWxsUnVsZSkoY2hhaW4yKHJ1bGVzKSwgKDAsIGNhbGxfMS5jYWxsU291cmNlKShzb3VyY2UyLCBjb250ZXh0KSwgY29udGV4dCk7CiAgICB9CiAgICBmdW5jdGlvbiBtZXJnZVdpdGgyKHNvdXJjZTIsIHN0cmF0ZWd5ID0gaW50ZXJmYWNlXzEuTWVyZ2VTdHJhdGVneS5EZWZhdWx0KSB7CiAgICAgIHJldHVybiAodHJlZSwgY29udGV4dCkgPT4gewogICAgICAgIHJldHVybiAoMCwgY2FsbF8xLmNhbGxTb3VyY2UpKHNvdXJjZTIsIGNvbnRleHQpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChzb3VyY2VUcmVlKSA9PiB0cmVlLm1lcmdlKHNvdXJjZVRyZWUsIHN0cmF0ZWd5IHx8IGNvbnRleHQuc3RyYXRlZ3kpKSwgKDAsIHJ4anNfMS5tYXBUbykodHJlZSkpOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbm9vcCgpIHsKICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUpIHsKICAgICAgcmV0dXJuICh0cmVlKSA9PiB7CiAgICAgICAgaWYgKGhvc3RfdHJlZV8xLkhvc3RUcmVlLmlzSG9zdFRyZWUodHJlZSkpIHsKICAgICAgICAgIHJldHVybiBuZXcgaG9zdF90cmVlXzEuRmlsdGVySG9zdFRyZWUodHJlZSwgcHJlZGljYXRlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbl8xLlNjaGVtYXRpY3NFeGNlcHRpb24oIlRyZWUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGFzU291cmNlKHJ1bGUpIHsKICAgICAgcmV0dXJuIChjb250ZXh0KSA9PiAoMCwgY2FsbF8xLmNhbGxSdWxlKShydWxlLCAoMCwgc3RhdGljXzEuZW1wdHkpKCksIGNvbnRleHQpOwogICAgfQogICAgZnVuY3Rpb24gYnJhbmNoQW5kTWVyZ2UocnVsZSwgc3RyYXRlZ3kgPSBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkRlZmF1bHQpIHsKICAgICAgcmV0dXJuICh0cmVlLCBjb250ZXh0KSA9PiB7CiAgICAgICAgcmV0dXJuICgwLCBjYWxsXzEuY2FsbFJ1bGUpKHJ1bGUsIHRyZWUuYnJhbmNoKCksIGNvbnRleHQpLnBpcGUoKDAsIHJ4anNfMS5tYXApKChicmFuY2gpID0+IHRyZWUubWVyZ2UoYnJhbmNoLCBzdHJhdGVneSB8fCBjb250ZXh0LnN0cmF0ZWd5KSksICgwLCByeGpzXzEubWFwVG8pKHRyZWUpKTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHdoZW4ocHJlZGljYXRlLCBvcGVyYXRvcikgewogICAgICByZXR1cm4gKGVudHJ5KSA9PiB7CiAgICAgICAgaWYgKHByZWRpY2F0ZShlbnRyeS5wYXRoLCBlbnRyeSkpIHsKICAgICAgICAgIHJldHVybiBvcGVyYXRvcihlbnRyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwYXJ0aXRpb25BcHBseU1lcmdlKHByZWRpY2F0ZSwgcnVsZVllcywgcnVsZU5vKSB7CiAgICAgIHJldHVybiAodHJlZSwgY29udGV4dCkgPT4gewogICAgICAgIGNvbnN0IFt5ZXMsIG5vXSA9ICgwLCBzdGF0aWNfMS5wYXJ0aXRpb24pKHRyZWUsIHByZWRpY2F0ZSk7CiAgICAgICAgcmV0dXJuICgwLCByeGpzXzEuY29uY2F0KSgoMCwgY2FsbF8xLmNhbGxSdWxlKShydWxlWWVzLCB5ZXMsIGNvbnRleHQpLCAoMCwgY2FsbF8xLmNhbGxSdWxlKShydWxlTm8gfHwgbm9vcCgpLCBubywgY29udGV4dCkpLnBpcGUoKDAsIHJ4anNfMS50b0FycmF5KSgpLCAoMCwgcnhqc18xLm1hcCkoKFt5ZXNUcmVlLCBub1RyZWVdKSA9PiB7CiAgICAgICAgICB5ZXNUcmVlLm1lcmdlKG5vVHJlZSwgY29udGV4dC5zdHJhdGVneSk7CiAgICAgICAgICByZXR1cm4geWVzVHJlZTsKICAgICAgICB9KSk7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBmb3JFYWNoKG9wZXJhdG9yKSB7CiAgICAgIHJldHVybiAodHJlZSkgPT4gewogICAgICAgIHRyZWUudmlzaXQoKHBhdGgsIGVudHJ5KSA9PiB7CiAgICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG5ld0VudHJ5ID0gb3BlcmF0b3IoZW50cnkpOwogICAgICAgICAgaWYgKG5ld0VudHJ5ID09PSBlbnRyeSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobmV3RW50cnkgPT09IG51bGwpIHsKICAgICAgICAgICAgdHJlZS5kZWxldGUocGF0aCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChuZXdFbnRyeS5wYXRoICE9IHBhdGgpIHsKICAgICAgICAgICAgdHJlZS5yZW5hbWUocGF0aCwgbmV3RW50cnkucGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIW5ld0VudHJ5LmNvbnRlbnQuZXF1YWxzKGVudHJ5LmNvbnRlbnQpKSB7CiAgICAgICAgICAgIHRyZWUub3ZlcndyaXRlKG5ld0VudHJ5LnBhdGgsIG5ld0VudHJ5LmNvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY29tcG9zZUZpbGVPcGVyYXRvcnMob3BlcmF0b3JzKSB7CiAgICAgIHJldHVybiAoZW50cnkpID0+IHsKICAgICAgICBsZXQgY3VycmVudCA9IGVudHJ5OwogICAgICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BlcmF0b3JzKSB7CiAgICAgICAgICBjdXJyZW50ID0gb3AoY3VycmVudCk7CiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBhcHBseVRvU3VidHJlZShwYXRoLCBydWxlcykgewogICAgICByZXR1cm4gKHRyZWUsIGNvbnRleHQpID0+IHsKICAgICAgICBjb25zdCBzY29wZWQgPSBuZXcgc2NvcGVkXzEuU2NvcGVkVHJlZSh0cmVlLCBwYXRoKTsKICAgICAgICByZXR1cm4gKDAsIGNhbGxfMS5jYWxsUnVsZSkoY2hhaW4yKHJ1bGVzKSwgc2NvcGVkLCBjb250ZXh0KS5waXBlKCgwLCByeGpzXzEubWFwKSgocmVzdWx0KSA9PiB7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBzY29wZWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRyZWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9uXzEuU2NoZW1hdGljc0V4Y2VwdGlvbignT3JpZ2luYWwgdHJlZSBtdXN0IGJlIHJldHVybmVkIGZyb20gYWxsIHJ1bGVzIHdoZW4gdXNpbmcgImFwcGx5VG9TdWJ0cmVlIi4nKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH07CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL21vdmUuanMKdmFyIHJlcXVpcmVfbW92ZSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy9tb3ZlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5tb3ZlID0gbW92ZTM7CiAgICB2YXIgY29yZV8xID0gcmVxdWlyZV9zcmMoKTsKICAgIHZhciBiYXNlXzEgPSByZXF1aXJlX2Jhc2UyKCk7CiAgICBmdW5jdGlvbiBtb3ZlMyhmcm9tLCB0bykgewogICAgICBpZiAodG8gPT09IHZvaWQgMCkgewogICAgICAgIHRvID0gZnJvbTsKICAgICAgICBmcm9tID0gIi8iOwogICAgICB9CiAgICAgIGNvbnN0IGZyb21QYXRoID0gKDAsIGNvcmVfMS5ub3JtYWxpemUpKCIvIiArIGZyb20pOwogICAgICBjb25zdCB0b1BhdGggPSAoMCwgY29yZV8xLm5vcm1hbGl6ZSkoIi8iICsgdG8pOwogICAgICBpZiAoZnJvbVBhdGggPT09IHRvUGF0aCkgewogICAgICAgIHJldHVybiBiYXNlXzEubm9vcDsKICAgICAgfQogICAgICByZXR1cm4gKHRyZWUpID0+IHsKICAgICAgICBpZiAodHJlZS5leGlzdHMoZnJvbVBhdGgpKSB7CiAgICAgICAgICB0cmVlLnJlbmFtZShmcm9tUGF0aCwgdG9QYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJlZS5nZXREaXIoZnJvbVBhdGgpLnZpc2l0KChwYXRoKSA9PiB7CiAgICAgICAgICAgIHRyZWUucmVuYW1lKHBhdGgsICgwLCBjb3JlXzEuam9pbikodG9QYXRoLCBwYXRoLnNsaWNlKGZyb21QYXRoLmxlbmd0aCkpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJlZTsKICAgICAgfTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvcmFuZG9tLmpzCnZhciByZXF1aXJlX3JhbmRvbSA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy9yYW5kb20uanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLmRlZmF1bHQgPSBkZWZhdWx0XzE7CiAgICB2YXIgaG9zdF90cmVlXzEgPSByZXF1aXJlX2hvc3RfdHJlZSgpOwogICAgZnVuY3Rpb24gZ2VuZXJhdGVTdHJpbmdPZkxlbmd0aChsKSB7CiAgICAgIHJldHVybiBuZXcgQXJyYXkobCkuZmlsbCgwKS5tYXAoKF94KSA9PiB7CiAgICAgICAgcmV0dXJuICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjYpXTsKICAgICAgfSkuam9pbigiIik7CiAgICB9CiAgICBmdW5jdGlvbiByYW5kb20oZnJvbSwgdG8pIHsKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh0byAtIGZyb20pKSArIGZyb207CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0XzEob3B0aW9ucykgewogICAgICByZXR1cm4gKCkgPT4gewogICAgICAgIGNvbnN0IHJvb3QgPSAicm9vdCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMucm9vdCA6ICIvIjsKICAgICAgICBjb25zdCBtYXAgPSBuZXcgaG9zdF90cmVlXzEuSG9zdFRyZWUoKTsKICAgICAgICBjb25zdCBuYkZpbGVzID0gIm11bHRpRmlsZXMiIGluIG9wdGlvbnMgPyB0eXBlb2Ygb3B0aW9ucy5tdWx0aUZpbGVzID09ICJudW1iZXIiID8gb3B0aW9ucy5tdWx0aUZpbGVzIDogcmFuZG9tKDIsIDEyKSA6IDE7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYkZpbGVzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHBhdGggPSAiYS9iL2MvZC9lL2YiLnNsaWNlKE1hdGgucmFuZG9tKCkgKiAxMCk7CiAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGdlbmVyYXRlU3RyaW5nT2ZMZW5ndGgoMjApOwogICAgICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlU3RyaW5nT2ZMZW5ndGgoMTAwKTsKICAgICAgICAgIG1hcC5jcmVhdGUocm9vdCArICIvIiArIHBhdGggKyAiLyIgKyBmaWxlTmFtZSwgY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXA7CiAgICAgIH07CiAgICB9CiAgfQp9KTsKCi8vIC4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL3NjaGVtYXRpYy5qcwp2YXIgcmVxdWlyZV9zY2hlbWF0aWMyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL3NjaGVtYXRpYy5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuZXh0ZXJuYWxTY2hlbWF0aWMgPSBleHRlcm5hbFNjaGVtYXRpYzsKICAgIGV4cG9ydHMyLnNjaGVtYXRpYyA9IHNjaGVtYXRpYzsKICAgIHZhciByeGpzXzEgPSByZXF1aXJlX2NqcygpOwogICAgdmFyIGludGVyZmFjZV8xID0gcmVxdWlyZV9pbnRlcmZhY2UzKCk7CiAgICB2YXIgc3RhdGljXzEgPSByZXF1aXJlX3N0YXRpYygpOwogICAgZnVuY3Rpb24gZXh0ZXJuYWxTY2hlbWF0aWMoY29sbGVjdGlvbk5hbWUsIHNjaGVtYXRpY05hbWUsIG9wdGlvbnMsIGV4ZWN1dGlvbk9wdGlvbnMpIHsKICAgICAgcmV0dXJuIChpbnB1dCwgY29udGV4dCkgPT4gewogICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjb250ZXh0LmVuZ2luZS5jcmVhdGVDb2xsZWN0aW9uKGNvbGxlY3Rpb25OYW1lLCBjb250ZXh0LnNjaGVtYXRpYy5jb2xsZWN0aW9uKTsKICAgICAgICBjb25zdCBzY2hlbWF0aWMyID0gY29sbGVjdGlvbi5jcmVhdGVTY2hlbWF0aWMoc2NoZW1hdGljTmFtZSk7CiAgICAgICAgcmV0dXJuIHNjaGVtYXRpYzIuY2FsbChvcHRpb25zLCAoMCwgcnhqc18xLm9mKSgoMCwgc3RhdGljXzEuYnJhbmNoKShpbnB1dCkpLCBjb250ZXh0LCBleGVjdXRpb25PcHRpb25zKS5waXBlKCgwLCByeGpzXzEubGFzdCkoKSwgKDAsIHJ4anNfMS5tYXApKCh4KSA9PiB7CiAgICAgICAgICBpbnB1dC5tZXJnZSh4LCBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkFsbG93T3ZlcndyaXRlQ29uZmxpY3QpOwogICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0pKTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHNjaGVtYXRpYyhzY2hlbWF0aWNOYW1lLCBvcHRpb25zLCBleGVjdXRpb25PcHRpb25zKSB7CiAgICAgIHJldHVybiAoaW5wdXQsIGNvbnRleHQpID0+IHsKICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gY29udGV4dC5zY2hlbWF0aWMuY29sbGVjdGlvbjsKICAgICAgICBjb25zdCBzY2hlbWF0aWMyID0gY29sbGVjdGlvbi5jcmVhdGVTY2hlbWF0aWMoc2NoZW1hdGljTmFtZSwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIHNjaGVtYXRpYzIuY2FsbChvcHRpb25zLCAoMCwgcnhqc18xLm9mKSgoMCwgc3RhdGljXzEuYnJhbmNoKShpbnB1dCkpLCBjb250ZXh0LCBleGVjdXRpb25PcHRpb25zKS5waXBlKCgwLCByeGpzXzEubGFzdCkoKSwgKDAsIHJ4anNfMS5tYXApKCh4KSA9PiB7CiAgICAgICAgICBpbnB1dC5tZXJnZSh4LCBpbnRlcmZhY2VfMS5NZXJnZVN0cmF0ZWd5LkFsbG93T3ZlcndyaXRlQ29uZmxpY3QpOwogICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0pKTsKICAgICAgfTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvdGVtcGxhdGUuanMKdmFyIHJlcXVpcmVfdGVtcGxhdGUyID0gX19jb21tb25KUyh7CiAgIi4uLy4uLy55YXJuL2NhY2hlL0Bhbmd1bGFyLWRldmtpdC1zY2hlbWF0aWNzLW5wbS0xOS4xLjUtZDgyOGI2MzU1NC1iNWUyZmQyMjJmLnppcC9ub2RlX21vZHVsZXMvQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL3RlbXBsYXRlLmpzIihleHBvcnRzMikgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5JbnZhbGlkUGlwZUV4Y2VwdGlvbiA9IGV4cG9ydHMyLlVua25vd25QaXBlRXhjZXB0aW9uID0gZXhwb3J0czIuT3B0aW9uSXNOb3REZWZpbmVkRXhjZXB0aW9uID0gZXhwb3J0czIuVEVNUExBVEVfRklMRU5BTUVfUkUgPSB2b2lkIDA7CiAgICBleHBvcnRzMi5hcHBseUNvbnRlbnRUZW1wbGF0ZSA9IGFwcGx5Q29udGVudFRlbXBsYXRlOwogICAgZXhwb3J0czIuY29udGVudFRlbXBsYXRlID0gY29udGVudFRlbXBsYXRlOwogICAgZXhwb3J0czIuYXBwbHlQYXRoVGVtcGxhdGUgPSBhcHBseVBhdGhUZW1wbGF0ZTsKICAgIGV4cG9ydHMyLnBhdGhUZW1wbGF0ZSA9IHBhdGhUZW1wbGF0ZTsKICAgIGV4cG9ydHMyLnJlbmFtZVRlbXBsYXRlRmlsZXMgPSByZW5hbWVUZW1wbGF0ZUZpbGVzOwogICAgZXhwb3J0czIudGVtcGxhdGUgPSB0ZW1wbGF0ZTM7CiAgICBleHBvcnRzMi5hcHBseVRlbXBsYXRlcyA9IGFwcGx5VGVtcGxhdGVzOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICB2YXIgbm9kZV9vc18xID0gcmVxdWlyZSgibm9kZTpvcyIpOwogICAgdmFyIGJhc2VfMSA9IHJlcXVpcmVfYmFzZTIoKTsKICAgIGV4cG9ydHMyLlRFTVBMQVRFX0ZJTEVOQU1FX1JFID0gL1wudGVtcGxhdGUkLzsKICAgIHZhciBPcHRpb25Jc05vdERlZmluZWRFeGNlcHRpb24gPSBjbGFzcyBleHRlbmRzIGNvcmVfMS5CYXNlRXhjZXB0aW9uIHsKICAgICAgY29uc3RydWN0b3IobmFtZSkgewogICAgICAgIHN1cGVyKGBPcHRpb24gIiR7bmFtZX0iIGlzIG5vdCBkZWZpbmVkLmApOwogICAgICB9CiAgICB9OwogICAgZXhwb3J0czIuT3B0aW9uSXNOb3REZWZpbmVkRXhjZXB0aW9uID0gT3B0aW9uSXNOb3REZWZpbmVkRXhjZXB0aW9uOwogICAgdmFyIFVua25vd25QaXBlRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgICAgICBzdXBlcihgUGlwZSAiJHtuYW1lfSIgaXMgbm90IGRlZmluZWQuYCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5Vbmtub3duUGlwZUV4Y2VwdGlvbiA9IFVua25vd25QaXBlRXhjZXB0aW9uOwogICAgdmFyIEludmFsaWRQaXBlRXhjZXB0aW9uID0gY2xhc3MgZXh0ZW5kcyBjb3JlXzEuQmFzZUV4Y2VwdGlvbiB7CiAgICAgIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgICAgICBzdXBlcihgUGlwZSAiJHtuYW1lfSIgaXMgaW52YWxpZC5gKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkludmFsaWRQaXBlRXhjZXB0aW9uID0gSW52YWxpZFBpcGVFeGNlcHRpb247CiAgICB2YXIgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigidXRmLTgiLCB7IGZhdGFsOiB0cnVlIH0pOwogICAgZnVuY3Rpb24gYXBwbHlDb250ZW50VGVtcGxhdGUob3B0aW9ucykgewogICAgICByZXR1cm4gKGVudHJ5KSA9PiB7CiAgICAgICAgY29uc3QgeyBwYXRoLCBjb250ZW50IH0gPSBlbnRyeTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgZGVjb2RlZENvbnRlbnQgPSBkZWNvZGVyLmRlY29kZShjb250ZW50KS5yZXBsYWNlKC9ccj9cbi9nLCBub2RlX29zXzEuRU9MKTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKCgwLCBjb3JlXzEudGVtcGxhdGUpKGRlY29kZWRDb250ZW50LCB7fSkob3B0aW9ucykpCiAgICAgICAgICB9OwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yIHx8IGUuY29kZSA9PT0gIkVSUl9FTkNPRElOR19JTlZBTElEX0VOQ09ERURfREFUQSIpIHsKICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjb250ZW50VGVtcGxhdGUob3B0aW9ucykgewogICAgICByZXR1cm4gKDAsIGJhc2VfMS5mb3JFYWNoKShhcHBseUNvbnRlbnRUZW1wbGF0ZShvcHRpb25zKSk7CiAgICB9CiAgICBmdW5jdGlvbiBhcHBseVBhdGhUZW1wbGF0ZShkYXRhLCBvcHRpb25zID0gewogICAgICBpbnRlcnBvbGF0aW9uU3RhcnQ6ICJfXyIsCiAgICAgIGludGVycG9sYXRpb25FbmQ6ICJfXyIsCiAgICAgIHBpcGVTZXBhcmF0b3I6ICJAIgogICAgfSkgewogICAgICBjb25zdCBpcyA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvblN0YXJ0OwogICAgICBjb25zdCBpZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbkVuZDsKICAgICAgY29uc3QgaXNMID0gaXMubGVuZ3RoOwogICAgICBjb25zdCBpZUwgPSBpZS5sZW5ndGg7CiAgICAgIHJldHVybiAoZW50cnkpID0+IHsKICAgICAgICBsZXQgcGF0aCA9IGVudHJ5LnBhdGg7CiAgICAgICAgY29uc3QgY29udGVudCA9IGVudHJ5LmNvbnRlbnQ7CiAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBwYXRoOwogICAgICAgIGxldCBzdGFydCA9IHBhdGguaW5kZXhPZihpcyk7CiAgICAgICAgbGV0IGVuZCA9IHBhdGguaW5kZXhPZihpZSwgc3RhcnQgKyBpc0wgKyAxKTsKICAgICAgICB3aGlsZSAoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKSB7CiAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhdGguc3Vic3RyaW5nKHN0YXJ0ICsgaXNMLCBlbmQpOwogICAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gZGF0YVttYXRjaF07CiAgICAgICAgICBpZiAoIW9wdGlvbnMucGlwZVNlcGFyYXRvcikgewogICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50ID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LmNhbGwoZGF0YSwgb3JpZ2luYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGlvbklzTm90RGVmaW5lZEV4Y2VwdGlvbihtYXRjaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IFtuYW1lLCAuLi5waXBlc10gPSBtYXRjaC5zcGxpdChvcHRpb25zLnBpcGVTZXBhcmF0b3IpOwogICAgICAgICAgICByZXBsYWNlbWVudCA9IGRhdGFbbmFtZV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQuY2FsbChkYXRhLCBvcmlnaW5hbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW9uSXNOb3REZWZpbmVkRXhjZXB0aW9uKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gcGlwZXMucmVkdWNlKChhY2MsIHBpcGUpID0+IHsKICAgICAgICAgICAgICBpZiAoIXBpcGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghKHBpcGUgaW4gZGF0YSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duUGlwZUV4Y2VwdGlvbihwaXBlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgcGlwZUZuID0gZGF0YVtwaXBlXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHBpcGVGbiAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVFeGNlcHRpb24ocGlwZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiAiIiArIHBpcGVGbihhY2MpOwogICAgICAgICAgICB9LCAiIiArIHJlcGxhY2VtZW50KTsKICAgICAgICAgIH0KICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzdGFydCkgKyByZXBsYWNlbWVudCArIHBhdGguc3Vic3RyaW5nKGVuZCArIGllTCk7CiAgICAgICAgICBzdGFydCA9IHBhdGguaW5kZXhPZihvcHRpb25zLmludGVycG9sYXRpb25TdGFydCk7CiAgICAgICAgICBlbmQgPSBwYXRoLmluZGV4T2Yob3B0aW9ucy5pbnRlcnBvbGF0aW9uRW5kLCBzdGFydCArIGlzTCArIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBwYXRoOiAoMCwgY29yZV8xLm5vcm1hbGl6ZSkocGF0aCksIGNvbnRlbnQgfTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhdGhUZW1wbGF0ZShvcHRpb25zKSB7CiAgICAgIHJldHVybiAoMCwgYmFzZV8xLmZvckVhY2gpKGFwcGx5UGF0aFRlbXBsYXRlKG9wdGlvbnMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbmFtZVRlbXBsYXRlRmlsZXMoKSB7CiAgICAgIHJldHVybiAoMCwgYmFzZV8xLmZvckVhY2gpKChlbnRyeSkgPT4gewogICAgICAgIGlmIChlbnRyeS5wYXRoLm1hdGNoKGV4cG9ydHMyLlRFTVBMQVRFX0ZJTEVOQU1FX1JFKSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY29udGVudDogZW50cnkuY29udGVudCwKICAgICAgICAgICAgcGF0aDogKDAsIGNvcmVfMS5ub3JtYWxpemUpKGVudHJ5LnBhdGgucmVwbGFjZShleHBvcnRzMi5URU1QTEFURV9GSUxFTkFNRV9SRSwgIiIpKQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiB0ZW1wbGF0ZTMob3B0aW9ucykgewogICAgICByZXR1cm4gKDAsIGJhc2VfMS5jaGFpbikoWwogICAgICAgIGNvbnRlbnRUZW1wbGF0ZShvcHRpb25zKSwKICAgICAgICAvLyBGb3JjZSBjYXN0IHRvIFBhdGhUZW1wbGF0ZURhdGEuIFdlIG5lZWQgdGhlIHR5cGUgZm9yIHRoZSBhY3R1YWwgcGF0aFRlbXBsYXRlKCkgY2FsbCwKICAgICAgICAvLyBidXQgaW4gdGhpcyBjYXNlIHdlIGNhbm5vdCBkbyBhbnl0aGluZyBhcyBjb250ZW50VGVtcGxhdGUgYXJlIG1vcmUgcGVybWlzc2l2ZS4KICAgICAgICAvLyBTaW5jZSB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBpbiBQYXRoVGVtcGxhdGVzIGl0IHdpbGwgYmUgZmluZSBpbiB0aGUgZW5kLgogICAgICAgIHBhdGhUZW1wbGF0ZShvcHRpb25zKQogICAgICBdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5VGVtcGxhdGVzKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuICgwLCBiYXNlXzEuZm9yRWFjaCkoKDAsIGJhc2VfMS53aGVuKSgocGF0aCkgPT4gcGF0aC5lbmRzV2l0aCgiLnRlbXBsYXRlIiksICgwLCBiYXNlXzEuY29tcG9zZUZpbGVPcGVyYXRvcnMpKFsKICAgICAgICBhcHBseUNvbnRlbnRUZW1wbGF0ZShvcHRpb25zKSwKICAgICAgICAvLyBTZWUgYWJvdmUgZm9yIHRoaXMgd2VpcmQgY2FzdC4KICAgICAgICBhcHBseVBhdGhUZW1wbGF0ZShvcHRpb25zKSwKICAgICAgICAoZW50cnkpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvbnRlbnQ6IGVudHJ5LmNvbnRlbnQsCiAgICAgICAgICAgIHBhdGg6IGVudHJ5LnBhdGgucmVwbGFjZShleHBvcnRzMi5URU1QTEFURV9GSUxFTkFNRV9SRSwgIiIpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgXSkpKTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvdXJsLmpzCnZhciByZXF1aXJlX3VybCA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy91cmwuanMiKGV4cG9ydHMyKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMyLnVybCA9IHVybDM7CiAgICB2YXIgdXJsXzEgPSByZXF1aXJlKCJ1cmwiKTsKICAgIGZ1bmN0aW9uIHVybDModXJsU3RyaW5nKSB7CiAgICAgIGNvbnN0IHVybDQgPSAoMCwgdXJsXzEucGFyc2UpKHVybFN0cmluZyk7CiAgICAgIHJldHVybiAoY29udGV4dCkgPT4gY29udGV4dC5lbmdpbmUuY3JlYXRlU291cmNlRnJvbVVybCh1cmw0LCBjb250ZXh0KShjb250ZXh0KTsKICAgIH0KICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9lbXB0eS5qcwp2YXIgcmVxdWlyZV9lbXB0eTMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9lbXB0eS5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuRW1wdHlUcmVlID0gdm9pZCAwOwogICAgdmFyIGhvc3RfdHJlZV8xID0gcmVxdWlyZV9ob3N0X3RyZWUoKTsKICAgIHZhciBFbXB0eVRyZWUgPSBjbGFzcyBleHRlbmRzIGhvc3RfdHJlZV8xLkhvc3RUcmVlIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMyLkVtcHR5VHJlZSA9IEVtcHR5VHJlZTsKICB9Cn0pOwoKLy8gLi4vLi4vLnlhcm4vY2FjaGUvQGFuZ3VsYXItZGV2a2l0LXNjaGVtYXRpY3MtbnBtLTE5LjEuNS1kODI4YjYzNTU0LWI1ZTJmZDIyMmYuemlwL25vZGVfbW9kdWxlcy9AYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvaW5kZXguanMKdmFyIHJlcXVpcmVfc3JjMiA9IF9fY29tbW9uSlMoewogICIuLi8uLi8ueWFybi9jYWNoZS9AYW5ndWxhci1kZXZraXQtc2NoZW1hdGljcy1ucG0tMTkuMS41LWQ4MjhiNjM1NTQtYjVlMmZkMjIyZi56aXAvbm9kZV9tb2R1bGVzL0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9pbmRleC5qcyIoZXhwb3J0czIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2NyZWF0ZUJpbmRpbmcgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7CiAgICAgIGlmICghZGVzYyB8fCAoImdldCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkgewogICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbVtrXTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTsKICAgIH0gOiBmdW5jdGlvbihvLCBtLCBrLCBrMikgewogICAgICBpZiAoazIgPT09IHZvaWQgMCkgazIgPSBrOwogICAgICBvW2syXSA9IG1ba107CiAgICB9KTsKICAgIHZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbihvLCB2KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7CiAgICB9IDogZnVuY3Rpb24obywgdikgewogICAgICBvWyJkZWZhdWx0Il0gPSB2OwogICAgfSk7CiAgICB2YXIgX19pbXBvcnRTdGFyID0gZXhwb3J0czIgJiYgZXhwb3J0czIuX19pbXBvcnRTdGFyIHx8IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8yKSB7CiAgICAgICAgICB2YXIgYXIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGsgaW4gbzIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzIsIGspKSBhclthci5sZW5ndGhdID0gazsKICAgICAgICAgIHJldHVybiBhcjsKICAgICAgICB9OwogICAgICAgIHJldHVybiBvd25LZXlzKG8pOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24obW9kKSB7CiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSAiZGVmYXVsdCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7CiAgICAgICAgfQogICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0oKTsKICAgIHZhciBfX2V4cG9ydFN0YXIgPSBleHBvcnRzMiAmJiBleHBvcnRzMi5fX2V4cG9ydFN0YXIgfHwgZnVuY3Rpb24obSwgZXhwb3J0czMpIHsKICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0czMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0czMsIG0sIHApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuVHJlZSA9IGV4cG9ydHMyLndvcmtmbG93ID0gZXhwb3J0czIuc3RyaW5ncyA9IGV4cG9ydHMyLmZvcm1hdHMgPSBleHBvcnRzMi5TY2hlbWF0aWNzRXhjZXB0aW9uID0gdm9pZCAwOwogICAgdmFyIGNvcmVfMSA9IHJlcXVpcmVfc3JjKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJzdHJpbmdzIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY29yZV8xLnN0cmluZ3M7CiAgICB9IH0pOwogICAgdmFyIGZvcm1hdHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZV9mb3JtYXRzMigpKTsKICAgIGV4cG9ydHMyLmZvcm1hdHMgPSBmb3JtYXRzOwogICAgdmFyIGludGVyZmFjZV8xID0gcmVxdWlyZV9pbnRlcmZhY2UzKCk7CiAgICB2YXIgc3RhdGljXzEgPSByZXF1aXJlX3N0YXRpYygpOwogICAgdmFyIHdvcmtmbG93ID0gX19pbXBvcnRTdGFyKHJlcXVpcmVfd29ya2Zsb3coKSk7CiAgICBleHBvcnRzMi53b3JrZmxvdyA9IHdvcmtmbG93OwogICAgdmFyIGV4Y2VwdGlvbl8xID0gcmVxdWlyZV9leGNlcHRpb24yKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJTY2hlbWF0aWNzRXhjZXB0aW9uIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXhjZXB0aW9uXzEuU2NoZW1hdGljc0V4Y2VwdGlvbjsKICAgIH0gfSk7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9hY3Rpb24oKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfZW5naW5lMigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9leGNlcHRpb24yKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2ludGVyZmFjZTMoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfYmFzZTIoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfY2FsbCgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9tb3ZlKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3JhbmRvbSgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9zY2hlbWF0aWMyKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3RlbXBsYXRlMigpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV91cmwoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfZGVsZWdhdGUoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfZW1wdHkzKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2hvc3RfdHJlZSgpLCBleHBvcnRzMik7CiAgICBfX2V4cG9ydFN0YXIocmVxdWlyZV9zY2hlbWF0aWMoKSwgZXhwb3J0czIpOwogICAgX19leHBvcnRTdGFyKHJlcXVpcmVfZHJ5cnVuKCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX2hvc3Q0KCksIGV4cG9ydHMyKTsKICAgIF9fZXhwb3J0U3RhcihyZXF1aXJlX3NpbmsoKSwgZXhwb3J0czIpOwogICAgZXhwb3J0czIuVHJlZSA9IHsKICAgICAgZW1wdHkoKSB7CiAgICAgICAgcmV0dXJuICgwLCBzdGF0aWNfMS5lbXB0eSkoKTsKICAgICAgfSwKICAgICAgYnJhbmNoKHRyZWUpIHsKICAgICAgICByZXR1cm4gKDAsIHN0YXRpY18xLmJyYW5jaCkodHJlZSk7CiAgICAgIH0sCiAgICAgIG1lcmdlKHRyZWUsIG90aGVyLCBzdHJhdGVneSA9IGludGVyZmFjZV8xLk1lcmdlU3RyYXRlZ3kuRGVmYXVsdCkgewogICAgICAgIHJldHVybiAoMCwgc3RhdGljXzEubWVyZ2UpKHRyZWUsIG90aGVyLCBzdHJhdGVneSk7CiAgICAgIH0sCiAgICAgIHBhcnRpdGlvbih0cmVlLCBwcmVkaWNhdGUpIHsKICAgICAgICByZXR1cm4gKDAsIHN0YXRpY18xLnBhcnRpdGlvbikodHJlZSwgcHJlZGljYXRlKTsKICAgICAgfSwKICAgICAgb3B0aW1pemUodHJlZSkgewogICAgICAgIHJldHVybiB0cmVlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyAuLi8uLi8ueWFybi9jYWNoZS9zdHJpcC1qc29uLWNvbW1lbnRzLW5wbS0zLjEuMS1kY2IyMzI0ODIzLTQ5MmY3M2UyNzIuemlwL25vZGVfbW9kdWxlcy9zdHJpcC1qc29uLWNvbW1lbnRzL2luZGV4LmpzCnZhciByZXF1aXJlX3N0cmlwX2pzb25fY29tbWVudHMgPSBfX2NvbW1vbkpTKHsKICAiLi4vLi4vLnlhcm4vY2FjaGUvc3RyaXAtanNvbi1jb21tZW50cy1ucG0tMy4xLjEtZGNiMjMyNDgyMy00OTJmNzNlMjcyLnppcC9ub2RlX21vZHVsZXMvc3RyaXAtanNvbi1jb21tZW50cy9pbmRleC5qcyIoZXhwb3J0czIsIG1vZHVsZTIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBzaW5nbGVDb21tZW50ID0gU3ltYm9sKCJzaW5nbGVDb21tZW50Iik7CiAgICB2YXIgbXVsdGlDb21tZW50ID0gU3ltYm9sKCJtdWx0aUNvbW1lbnQiKTsKICAgIHZhciBzdHJpcFdpdGhvdXRXaGl0ZXNwYWNlID0gKCkgPT4gIiI7CiAgICB2YXIgc3RyaXBXaXRoV2hpdGVzcGFjZSA9IChzdHJpbmcsIHN0YXJ0LCBlbmQpID0+IHN0cmluZy5zbGljZShzdGFydCwgZW5kKS5yZXBsYWNlKC9cUy9nLCAiICIpOwogICAgdmFyIGlzRXNjYXBlZCA9IChqc29uU3RyaW5nLCBxdW90ZVBvc2l0aW9uKSA9PiB7CiAgICAgIGxldCBpbmRleCA9IHF1b3RlUG9zaXRpb24gLSAxOwogICAgICBsZXQgYmFja3NsYXNoQ291bnQgPSAwOwogICAgICB3aGlsZSAoanNvblN0cmluZ1tpbmRleF0gPT09ICJcXCIpIHsKICAgICAgICBpbmRleCAtPSAxOwogICAgICAgIGJhY2tzbGFzaENvdW50ICs9IDE7CiAgICAgIH0KICAgICAgcmV0dXJuIEJvb2xlYW4oYmFja3NsYXNoQ291bnQgJSAyKTsKICAgIH07CiAgICBtb2R1bGUyLmV4cG9ydHMgPSAoanNvblN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7CiAgICAgIGlmICh0eXBlb2YganNvblN0cmluZyAhPT0gInN0cmluZyIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhcmd1bWVudCBcYGpzb25TdHJpbmdcYCB0byBiZSBhIFxgc3RyaW5nXGAsIGdvdCBcYCR7dHlwZW9mIGpzb25TdHJpbmd9XGBgKTsKICAgICAgfQogICAgICBjb25zdCBzdHJpcCA9IG9wdGlvbnMud2hpdGVzcGFjZSA9PT0gZmFsc2UgPyBzdHJpcFdpdGhvdXRXaGl0ZXNwYWNlIDogc3RyaXBXaXRoV2hpdGVzcGFjZTsKICAgICAgbGV0IGluc2lkZVN0cmluZyA9IGZhbHNlOwogICAgICBsZXQgaW5zaWRlQ29tbWVudCA9IGZhbHNlOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgbGV0IHJlc3VsdCA9ICIiOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25TdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBjdXJyZW50Q2hhcmFjdGVyID0ganNvblN0cmluZ1tpXTsKICAgICAgICBjb25zdCBuZXh0Q2hhcmFjdGVyID0ganNvblN0cmluZ1tpICsgMV07CiAgICAgICAgaWYgKCFpbnNpZGVDb21tZW50ICYmIGN1cnJlbnRDaGFyYWN0ZXIgPT09ICciJykgewogICAgICAgICAgY29uc3QgZXNjYXBlZCA9IGlzRXNjYXBlZChqc29uU3RyaW5nLCBpKTsKICAgICAgICAgIGlmICghZXNjYXBlZCkgewogICAgICAgICAgICBpbnNpZGVTdHJpbmcgPSAhaW5zaWRlU3RyaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zaWRlU3RyaW5nKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpbnNpZGVDb21tZW50ICYmIGN1cnJlbnRDaGFyYWN0ZXIgKyBuZXh0Q2hhcmFjdGVyID09PSAiLy8iKSB7CiAgICAgICAgICByZXN1bHQgKz0ganNvblN0cmluZy5zbGljZShvZmZzZXQsIGkpOwogICAgICAgICAgb2Zmc2V0ID0gaTsKICAgICAgICAgIGluc2lkZUNvbW1lbnQgPSBzaW5nbGVDb21tZW50OwogICAgICAgICAgaSsrOwogICAgICAgIH0gZWxzZSBpZiAoaW5zaWRlQ29tbWVudCA9PT0gc2luZ2xlQ29tbWVudCAmJiBjdXJyZW50Q2hhcmFjdGVyICsgbmV4dENoYXJhY3RlciA9PT0gIlxyXG4iKSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBpbnNpZGVDb21tZW50ID0gZmFsc2U7CiAgICAgICAgICByZXN1bHQgKz0gc3RyaXAoanNvblN0cmluZywgb2Zmc2V0LCBpKTsKICAgICAgICAgIG9mZnNldCA9IGk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKGluc2lkZUNvbW1lbnQgPT09IHNpbmdsZUNvbW1lbnQgJiYgY3VycmVudENoYXJhY3RlciA9PT0gIlxuIikgewogICAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlOwogICAgICAgICAgcmVzdWx0ICs9IHN0cmlwKGpzb25TdHJpbmcsIG9mZnNldCwgaSk7CiAgICAgICAgICBvZmZzZXQgPSBpOwogICAgICAgIH0gZWxzZSBpZiAoIWluc2lkZUNvbW1lbnQgJiYgY3VycmVudENoYXJhY3RlciArIG5leHRDaGFyYWN0ZXIgPT09ICIvKiIpIHsKICAgICAgICAgIHJlc3VsdCArPSBqc29uU3RyaW5nLnNsaWNlKG9mZnNldCwgaSk7CiAgICAgICAgICBvZmZzZXQgPSBpOwogICAgICAgICAgaW5zaWRlQ29tbWVudCA9IG11bHRpQ29tbWVudDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoaW5zaWRlQ29tbWVudCA9PT0gbXVsdGlDb21tZW50ICYmIGN1cnJlbnRDaGFyYWN0ZXIgKyBuZXh0Q2hhcmFjdGVyID09PSAiKi8iKSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBpbnNpZGVDb21tZW50ID0gZmFsc2U7CiAgICAgICAgICByZXN1bHQgKz0gc3RyaXAoanNvblN0cmluZywgb2Zmc2V0LCBpICsgMSk7CiAgICAgICAgICBvZmZzZXQgPSBpICsgMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0ICsgKGluc2lkZUNvbW1lbnQgPyBzdHJpcChqc29uU3RyaW5nLnNsaWNlKG9mZnNldCkpIDoganNvblN0cmluZy5zbGljZShvZmZzZXQpKTsKICAgIH07CiAgfQp9KTsKCi8vIHNyYy9zY2hlbWF0aWMvaW5kZXgudHMKdmFyIGluZGV4X2V4cG9ydHMgPSB7fTsKX19leHBvcnQoaW5kZXhfZXhwb3J0cywgewogIG1haW46ICgpID0+IG1haW4KfSk7Cm1vZHVsZS5leHBvcnRzID0gX190b0NvbW1vbkpTKGluZGV4X2V4cG9ydHMpOwoKLy8gc3JjL3NjaGVtYXRpYy9wcm9qZWN0L3Byb2plY3QuZmFjdG9yeS50cwp2YXIgaW1wb3J0X3NjaGVtYXRpY3M5ID0gX190b0VTTShyZXF1aXJlX3NyYzIoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljczEwID0gX190b0VTTShyZXF1aXJlX3NyYzIoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljczExID0gX190b0VTTShyZXF1aXJlX3NyYzIoKSwgMSk7CgovLyBzcmMvc2NoZW1hdGljL3V0aWxzL2pzb24udXRpbHMudHMKdmFyIGltcG9ydF9zdHJpcF9qc29uX2NvbW1lbnRzID0gX190b0VTTShyZXF1aXJlX3N0cmlwX2pzb25fY29tbWVudHMoKSwgMSk7CnZhciBzZXJpYWxpemVKc29uID0gKGpzb24pID0+IGAke0pTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDIpfQpgOwp2YXIgcmVhZEpzb25JblRyZWUgPSAoaG9zdCwgcGF0aCkgPT4gewogIGlmICghaG9zdC5leGlzdHMocGF0aCkpIHsKICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgJHtwYXRofWApOwogIH0KICBjb25zdCBjb250ZW50cyA9ICgwLCBpbXBvcnRfc3RyaXBfanNvbl9jb21tZW50cy5kZWZhdWx0KShob3N0LnJlYWQocGF0aCk/LnRvU3RyaW5nKCJ1dGYtOCIpIHx8ICIiKTsKICB0cnkgewogICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudHMpOwogIH0gY2F0Y2ggKGUpIHsKICAgIGNvbnN0IGVycm9yID0gZTsKICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7cGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gKTsKICB9Cn07CnZhciB1cGRhdGVKc29uSW5UcmVlID0gKHBhdGgsIGNhbGxiYWNrKSA9PiAoaG9zdCwgY29udGV4dCkgPT4gewogIGlmICghaG9zdC5leGlzdHMocGF0aCkpIHsKICAgIGhvc3QuY3JlYXRlKHBhdGgsIHNlcmlhbGl6ZUpzb24oY2FsbGJhY2soe30sIGNvbnRleHQpKSk7CiAgICByZXR1cm4gaG9zdDsKICB9CiAgaG9zdC5vdmVyd3JpdGUoCiAgICBwYXRoLAogICAgc2VyaWFsaXplSnNvbihjYWxsYmFjayhyZWFkSnNvbkluVHJlZShob3N0LCBwYXRoKSwgY29udGV4dCkpCiAgKTsKICByZXR1cm4gaG9zdDsKfTsKCi8vIHNyYy9zY2hlbWF0aWMvdXRpbHMvdHNjb25maWcudXRpbHMudHMKdmFyIHVwZGF0ZVRzQ29uZmlnSW5UcmVlID0gKGNvbXBpbGVyT3B0aW9ucykgPT4gdXBkYXRlSnNvbkluVHJlZSgidHNjb25maWcuanNvbiIsICh0c2NvbmZpZykgPT4gKHsKICAuLi50c2NvbmZpZywKICBjb21waWxlck9wdGlvbnMKfSkpOwoKLy8gc3JjL3NjaGVtYXRpYy9ydWxlcy91cGRhdGUtdHMtY29uZmlnLnJ1bGUudHMKdmFyIHVwZGF0ZVRzQ29uZmlnUnVsZSA9IGFzeW5jICgpID0+IHsKICBjb25zdCB7IHRzQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoIkBhdGxzL2NvZGUtcnVudGltZSIpOwogIHJldHVybiB1cGRhdGVUc0NvbmZpZ0luVHJlZSh7CiAgICAuLi50c0NvbmZpZy5jb21waWxlck9wdGlvbnMKICB9KTsKfTsKCi8vIHNyYy9zY2hlbWF0aWMvc291cmNlcy9nZW5lcmF0ZS1jb21tb24uc291cmNlLnRzCnZhciBpbXBvcnRfY29yZSA9IF9fdG9FU00ocmVxdWlyZV9zcmMoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljcyA9IF9fdG9FU00ocmVxdWlyZV9zcmMyKCksIDEpOwp2YXIgaW1wb3J0X3NjaGVtYXRpY3MyID0gX190b0VTTShyZXF1aXJlX3NyYzIoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljczMgPSBfX3RvRVNNKHJlcXVpcmVfc3JjMigpLCAxKTsKdmFyIGltcG9ydF9zY2hlbWF0aWNzNCA9IF9fdG9FU00ocmVxdWlyZV9zcmMyKCksIDEpOwp2YXIgZ2VuZXJhdGVDb21tb25Tb3VyY2UgPSAob3B0aW9ucykgPT4gKDAsIGltcG9ydF9zY2hlbWF0aWNzLmFwcGx5KSgoMCwgaW1wb3J0X3NjaGVtYXRpY3M0LnVybCkoIi4uL3RlbXBsYXRlcy9jb21tb24iKSwgWwogICgwLCBpbXBvcnRfc2NoZW1hdGljczIudGVtcGxhdGUpKHsKICAgIC4uLmltcG9ydF9jb3JlLnN0cmluZ3MsCiAgICAuLi5vcHRpb25zLAogICAgZG90OiAiLiIKICB9KSwKICAoMCwgaW1wb3J0X3NjaGVtYXRpY3MzLm1vdmUpKCIuLyIpCl0pOwoKLy8gc3JjL3NjaGVtYXRpYy9zb3VyY2VzL2dlbmVyYXRlLXByb2plY3Qtc3BlY2lmaWMuc291cmNlLnRzCnZhciBpbXBvcnRfbm9kZV9mcyA9IHJlcXVpcmUoIm5vZGU6ZnMiKTsKdmFyIGltcG9ydF9ub2RlX3BhdGggPSByZXF1aXJlKCJub2RlOnBhdGgiKTsKdmFyIGltcG9ydF9jb3JlMiA9IF9fdG9FU00ocmVxdWlyZV9zcmMoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljczUgPSBfX3RvRVNNKHJlcXVpcmVfc3JjMigpLCAxKTsKdmFyIGltcG9ydF9zY2hlbWF0aWNzNiA9IF9fdG9FU00ocmVxdWlyZV9zcmMyKCksIDEpOwp2YXIgaW1wb3J0X3NjaGVtYXRpY3M3ID0gX190b0VTTShyZXF1aXJlX3NyYzIoKSwgMSk7CnZhciBpbXBvcnRfc2NoZW1hdGljczggPSBfX3RvRVNNKHJlcXVpcmVfc3JjMigpLCAxKTsKdmFyIGdlbmVyYXRlUHJvamVjdFNwZWNpZmljU291cmNlID0gKG9wdGlvbnMpID0+IHsKICBjb25zdCB7IG5hbWU6IHByb2plY3ROYW1lIH0gPSBKU09OLnBhcnNlKAogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tc3luYwogICAgKDAsIGltcG9ydF9ub2RlX2ZzLnJlYWRGaWxlU3luYykoKDAsIGltcG9ydF9ub2RlX3BhdGguam9pbikob3B0aW9ucy5jd2QsICJwYWNrYWdlLmpzb24iKSwgInV0Zi04IikKICApOwogIHJldHVybiAoMCwgaW1wb3J0X3NjaGVtYXRpY3M1LmFwcGx5KSgoMCwgaW1wb3J0X3NjaGVtYXRpY3M2LnVybCkoKDAsIGltcG9ydF9ub2RlX3BhdGguam9pbikoIi4uL3RlbXBsYXRlcyIsIG9wdGlvbnMudHlwZSkpLCBbCiAgICAoMCwgaW1wb3J0X3NjaGVtYXRpY3M3LnRlbXBsYXRlKSh7CiAgICAgIC4uLmltcG9ydF9jb3JlMi5zdHJpbmdzLAogICAgICAuLi5vcHRpb25zLAogICAgICBwcm9qZWN0TmFtZSwKICAgICAgZG90OiAiLiIKICAgIH0pLAogICAgKDAsIGltcG9ydF9zY2hlbWF0aWNzOC5tb3ZlKSgiLi8iKQogIF0pOwp9OwoKLy8gc3JjL3NjaGVtYXRpYy9wcm9qZWN0L3Byb2plY3QuZmFjdG9yeS50cwp2YXIgbWFpbiA9IChvcHRpb25zKSA9PiAoMCwgaW1wb3J0X3NjaGVtYXRpY3MxMC5jaGFpbikoWwogIHVwZGF0ZVRzQ29uZmlnUnVsZSwKICAoMCwgaW1wb3J0X3NjaGVtYXRpY3MxMS5tZXJnZVdpdGgpKGdlbmVyYXRlQ29tbW9uU291cmNlKG9wdGlvbnMpLCBpbXBvcnRfc2NoZW1hdGljczkuTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGUpLAogICgwLCBpbXBvcnRfc2NoZW1hdGljczExLm1lcmdlV2l0aCkoZ2VuZXJhdGVQcm9qZWN0U3BlY2lmaWNTb3VyY2Uob3B0aW9ucyksIGltcG9ydF9zY2hlbWF0aWNzOS5NZXJnZVN0cmF0ZWd5Lk92ZXJ3cml0ZSkKXSk7Ci8vIEFubm90YXRlIHRoZSBDb21tb25KUyBleHBvcnQgbmFtZXMgZm9yIEVTTSBpbXBvcnQgaW4gbm9kZToKMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7CiAgbWFpbgp9KTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3V0aWxzLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS91dGlsaXR5LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS90cmFuc2Zvcm1zLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9pbnRlcmZhY2UuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2pzb24vc2NoZW1hL3BvaW50ZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2V4Y2VwdGlvbi5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvbGl0ZXJhbHMuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL3N0cmluZ3MuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL29iamVjdC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvdGVtcGxhdGUuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL3BhcnRpYWxseS1vcmRlcmVkLXNldC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdXRpbHMvcHJpb3JpdHktcXVldWUuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2xhbmcuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3V0aWxzL2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS92aXNpdG9yLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9yZWdpc3RyeS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9zY2hlbWEvc2NoZW1hLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9qc29uL3NjaGVtYS9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvanNvbi9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2xvZ2dlci5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2luZGVudC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvbG9nZ2VyL2xldmVsLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9sb2dnZXIvbnVsbC1sb2dnZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2xvZ2dlci90cmFuc2Zvcm0tbG9nZ2VyLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy9sb2dnZXIvaW5kZXguanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9kZWZpbml0aW9ucy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9wYXRoLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvYnVmZmVyLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvaW50ZXJmYWNlLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvbWVtb3J5LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3Qvc3luYy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3Rlc3QuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9yZXNvbHZlci5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L2FsaWFzLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvY3JlYXRlLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvZW1wdHkuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3ZpcnR1YWwtZnMvaG9zdC9wYXR0ZXJuLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3QvcmVjb3JkLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2hvc3Qvc2FmZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L3Njb3BlZC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvdmlydHVhbC1mcy9ob3N0L2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy92aXJ0dWFsLWZzL2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvaG9zdC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2pzb24vbWV0YWRhdGEuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9qc29uL3V0aWxpdGllcy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9zcmMvd29ya3NwYWNlL2pzb24vcmVhZGVyLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvanNvbi93cml0ZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9jb3JlLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UvaW5kZXguanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9mb3JtYXRzL2h0bWwtc2VsZWN0b3IuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2Zvcm1hdHMvcGF0aC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZm9ybWF0cy9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9pbnRlcmZhY2UuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2V4Y2VwdGlvbi9leGNlcHRpb24uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvZGVsZWdhdGUuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvZW50cnkuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvcmVjb3JkZXIuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvc2NvcGVkLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL2hvc3QtdHJlZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9zdGF0aWMuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvbnVsbC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvY2FsbC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL3NjaGVtYXRpYy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2VuZ2luZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2ludGVyZmFjZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvZW5naW5lL2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9jb3JlL25vZGUvY2xpLWxvZ2dlci5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvY29yZS9ub2RlL2hvc3QuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L2NvcmUvbm9kZS9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvdHJlZS9hY3Rpb24uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3Npbmsvc2luay5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvc2luay9ob3N0LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9zaW5rL2RyeXJ1bi5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvd29ya2Zsb3cvYmFzZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvd29ya2Zsb3cvaW50ZXJmYWNlLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy93b3JrZmxvdy9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvYmFzZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvbW92ZS5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICoKICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmRldi9saWNlbnNlCiAgICopCgpAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcy9zcmMvcnVsZXMvcmFuZG9tLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy9zY2hlbWF0aWMuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3J1bGVzL3RlbXBsYXRlLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKCkBhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy9ydWxlcy91cmwuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3RyZWUvZW1wdHkuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAqCiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZQogICAqKQoKQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2luZGV4LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgKgogICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2UKICAgKikKKi8K";
|
|
2
|
+
export declare const writeSchematicFactory: (path: string) => Promise<void>;
|