From 39af60f95fb9e3e6f64857d2bbce113537b5dbaf Mon Sep 17 00:00:00 2001 From: plojo Date: Tue, 8 Oct 2024 16:34:55 +0200 Subject: [PATCH] change gltf emissive factors to ShaderLit interpretation --- Distribution/FudgeCore.js | 6 ++++-- Source/Core/Serialization/GLTF/GLTFLoader.ts | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Distribution/FudgeCore.js b/Distribution/FudgeCore.js index 617ce2c..ec2640a 100644 --- a/Distribution/FudgeCore.js +++ b/Distribution/FudgeCore.js @@ -20456,8 +20456,10 @@ var FudgeCore; const intensity = 0.7 * (1 - gltfRoughnessFactor) + gltfMetallicFactor; // Influences how much the material's color affects the specular reflection. When metallic is higher, the specular reflection takes on the color of the material, creating a metallic appearance. Range from 0.0 to 1.0. const metallic = gltfMetallicFactor; - const isLit = gltfEmissiveFactor[0] == 1 && gltfEmissiveFactor[1] == 1 || gltfEmissiveFactor[2] == 1; + const isLit = gltfEmissiveFactor[0] > 0 || gltfEmissiveFactor[1] > 0 || gltfEmissiveFactor[2] > 0; const color = new FudgeCore.Color(...gltfBaseColorFactor); + if (isLit) + color.add(new FudgeCore.Color(...gltfEmissiveFactor, 0)); const coat = gltfBaseColorTexture ? isLit ? new FudgeCore.CoatTextured(color, await this.getTexture(gltfBaseColorTexture.index)) : gltfNormalTexture ? @@ -22950,4 +22952,4 @@ var FudgeCore; } FudgeCore.Timer = Timer; })(FudgeCore || (FudgeCore = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVkZ2VDb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUYXJnZXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0ludGVyZmFjZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0NvbnNvbGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Zy50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yU2hhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29hdC50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3Rvck1lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUmVjeWNsZS9SZWN5Y2xlci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvUmVjdGFuZ2xlLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlcldlYkdMLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSGVscGVyc1BoeXNpY3MudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludEF4aWFsLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvTWF0ZXJpYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFNrZWxldG9uLnRzIiwiLi4vU291cmNlL0NvcmUvUmVmZXJlbmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uRnVuY3Rpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb25LZXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEF1ZGlvLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9NYW5hZ2VyLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9Pc2NpbGxhdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudEFtYmllbnRPY2NsdXNpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QW5pbWF0b3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW9MaXN0ZW5lci50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRDYW1lcmEudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50RmFjZUNhbWVyYS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRGb2cudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50R3JhcGhGaWx0ZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9MaWdodC9MaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRMaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNYXRlcmlhbC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBpY2sudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2NyaXB0LnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFRleHQudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VHJhbnNmb3JtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFZSRGV2aWNlLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9Db250cm9sLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9BeGlzLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9LZXlib2FyZC50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnQWxlcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0RpYWxvZy50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnVGV4dEFyZWEudHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEtleWJvYXJkLnRzIiwiLi4vU291cmNlL0NvcmUvRXZlbnQvRXZlbnRUaW1lci50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50VG91Y2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9HcmFwaC9HcmFwaC50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoSW5zdGFuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdENvbG9yZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFRleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFJlbWlzc2l2ZVRleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXRUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29sb3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9NYXRlcmlhbEdMVEYudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0NhbGMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0ZyYW1pbmcudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0dlbzIudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0dlbzMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0xGSUI0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9NYXRyaXgzeDMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL01hdHJpeDR4NC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2UzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9Ob2lzZTQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1F1YXRlcm5pb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1JhbmRvbS50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yNC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvRmFjZS50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEN1YmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hQb2x5Z29uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRXh0cnVzaW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRnJvbURhdGEudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoT0JKLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUHlyYW1pZC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFF1YWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hUZXJyYWluLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUmVsaWVmLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUm90YXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hTcGhlcmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hTcHJpdGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hUb3J1cy50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvUXVhZC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvVmVydGV4LnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9WZXJ0aWNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1BhcnRpY2xlU3lzdGVtL1NoYWRlclBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db21wb25lbnRXYWxrZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXRoaW5nL0NvbXBvbmVudFdheXBvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db25uZWN0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Db21wb25lbnRSaWdpZGJvZHkudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0RlYnVnUGh5c2ljc0RyYXcudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50Q3lsaW5kcmljYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UHJpc21hdGljLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFJhZ2RvbGwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UmV2b2x1dGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50U3BoZXJpY2FsLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFVuaXZlcnNhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSm9pbnRXZWxkaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9QaHlzaWNzLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L0JveC50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9QaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L1BpY2tlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9SYXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvR2l6bW9zLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1ZpZXdwb3J0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1hSVmlld3BvcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZpbGVJb0Jyb3dzZXJMb2NhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vTXV0YWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9Qcm9qZWN0LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvQnVmZmVyUmVhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTG9hZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vRkJYL2xvYWRGcm9tTm9kZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZCWC9wYXJzZU5vZGVzRnJvbUJpbmFyeS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vR0xURi9HTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9HTFRGL0dMVEZMb2FkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvTWVyZ2VkU2hhZGVyU291cmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyQW1iaWVudE9jY2x1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0LnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0VGV4dHVyZWRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTGl0U2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZFNraW4udHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTWF0Q2FwLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBpY2tUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlRGVmYXVsdC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvTG9vcC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZS50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFVLFNBQVMsQ0FvQmxCO0FBcEJELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQXNCLFdBQVc7UUFHL0I7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsR0FBRyxLQUFlO1lBQy9ELElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUNsRSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUs7Z0JBQ25CLElBQUksR0FBRyxZQUFZLE1BQU07b0JBQ3ZCLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjs7b0JBRTVFLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsK0JBQStCO1lBQ2pFLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztLQUNGO0lBZnFCLHFCQUFXLGNBZWhDLENBQUE7QUFDSCxDQUFDLEVBcEJTLFNBQVMsS0FBVCxTQUFTLFFBb0JsQjtBQ3BCRCxvQ0FBb0M7QUFDcEMsSUFBVSxTQUFTLENBZ0NsQjtBQWpDRCxvQ0FBb0M7QUFDcEMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsSUFBWSxZ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QUM1QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxRQUFRO1lBQ2pELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsUUFBUTtnQkFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSxD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QUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksU0FBUyxHQUFjLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7YUFDbEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBZTtZQUNuQyxJQUFJLENBQUMsR0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUvQixJQUFJLENBQUMsR0FBVyxDQUFDO2dCQUNmLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUM1QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQzdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFbkMsTUFBTSxTQUFTLEdBQWMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxD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SSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dC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RUFBRSxDQUFDO2FBQ3pCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTTtZQUNYLElBQUksQ0FBQyxHQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBRTlCLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ3JELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUV6QyxJQUFJLEVBQUUsR0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNyRCxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxFQUFFLEdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDdEQsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztZQUUxQyxJQUFJLENBQUMsR0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDUCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNO2dCQUNkLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTTtnQkFDZCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFTLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBUyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQU8sTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFPLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE9BQU87Z0JBQ3JHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxPQUFPO2dCQUNyRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdB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QUMsVUFBVSxDQUFDLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsWUFBWTtRQUVaLHdCQUF3QjtR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RSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFN0QsbUVBQW1FO2dCQUNuRSxrREFBa0Q7Z0JBQ2xELE9BQU8saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUM7UUFDSixDQUFDOztJQTdGVSxnQkFBTSxTQWtHbEIsQ0FBQTtBQUNILENBQUMsRUFqSFMsU0FBUyxLQUFULFNBQVMsUUFpSGxCO0FDakhELElBQVUsU0FBUyxDQThKbEI7QUE5SkQsV0FBVSxTQUFTO0lBQ2pCLGFBQWE7SUFDYjs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQWEsTUFBTyxTQUFRLFVBQUEsS0FBSztpQkFDaEIsV0FBTSxHQUFXLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEFBQXhDLENBQXlDO2lCQUMvQyxhQUFRLEdBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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QyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLGtEQUFrRDtnQkFDbEQsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxHQUFXLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLG1EQUFtRDtnQkFDbkQsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxHQUFXLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRDLCtFQUErRTtnQkFDL0UsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZ0RBQWdEO2dCQUM1RixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsK0NBQStDO2dCQUNqRyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZ0RBQWdEO2dCQUNsRyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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QUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxDQUFDO29CQUN2QixDQUFDLENBQUMsR0FBRztvQkFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FB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UUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsd0ZBQXdGO1lBQy9OLGlLQUFpSztZQUNqSyxJQUFJLEtBQUssR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3TSxJQUFJLFFBQVEsR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0TixJQUFJLFFBQVEsR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENB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QUVNLFNBQVMsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFB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QUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVc7WUFDaEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSztZQUNWLHlDQUF5QztZQUN6Qyx1QkFBdUI7WUFDdkIsdUVBQXVFO1lBQ3ZFLDJHQUEyRztZQUMzRyxvQ0FBb0M7WUFDcEMsSUFBSTtZQUNKLE9BQU87WUFDUCxrSEFBa0g7WUFDbEgsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztLQUNGO0lBN0ZZLGVBQUssUUE2RmpCLENBQUE7QUFDSCxDQUFDLEVBM0dTLFNBQVMsS0FBVCxTQUFTLFFBMkdsQiIsInNvdXJjZXNDb250ZW50IjpbIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEJhc2UgY2xhc3MgZm9yIHRoZSBkaWZmZXJlbnQgRGVidWdUYXJnZXRzLCBtYWlubHkgZm9yIHRlY2huaWNhbCBwdXJwb3NlIG9mIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlYnVnVGFyZ2V0IHtcclxuICAgIHB1YmxpYyBkZWxlZ2F0ZXM6IE1hcERlYnVnRmlsdGVyVG9EZWxlZ2F0ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1lcmdlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBzdHJpbmcsIHNlcGFyYXRlZCBieSAnLCAnXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VBcmd1bWVudHMoX21lc3NhZ2U6IE9iamVjdCwgLi4uX2FyZ3M6IE9iamVjdFtdKTogc3RyaW5nIHtcclxuICAgICAgbGV0IG91dDogc3RyaW5nID0gX21lc3NhZ2UudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShfbWVzc2FnZSk7XHJcbiAgICAgIGZvciAobGV0IGFyZyBvZiBfYXJncylcclxuICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgTnVtYmVyKVxyXG4gICAgICAgICAgb3V0ICs9IFwiLCBcIiArIGFyZy50b1ByZWNpc2lvbigyKS50b1N0cmluZygpOyAvL0pTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMik7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgb3V0ICs9IFwiLCBcIiArIGFyZy50b1N0cmluZygpOyAvL0pTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMik7XHJcbiAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWdBbGVydC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBkZWJ1ZyBhY3Rpdml0aWVzLCBtb3JlIHRvIGNvbWVcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBERUJVR19GSUxURVIge1xyXG4gICAgTk9ORSA9IDB4MDAsXHJcbiAgICBJTkZPID0gMHgwMSxcclxuICAgIExPRyA9IDB4MDIsXHJcbiAgICBXQVJOID0gMHgwNCxcclxuICAgIEVSUk9SID0gMHgwOCxcclxuICAgIEZVREdFID0gMHgxMCxcclxuICAgIENMRUFSID0gMHgxMDAsXHJcbiAgICBHUk9VUCA9IDB4MTAxLFxyXG4gICAgR1JPVVBDT0xMQVBTRUQgPSAweDEwMixcclxuICAgIEdST1VQRU5EID0gMHgxMDQsXHJcbiAgICBTT1VSQ0UgPSAweDIwMCxcclxuICAgIE1FU1NBR0VTID0gSU5GTyB8IExPRyB8IFdBUk4gfCBFUlJPUiB8IEZVREdFLFxyXG4gICAgRk9STUFUID0gQ0xFQVIgfCBHUk9VUCB8IEdST1VQQ09MTEFQU0VEIHwgR1JPVVBFTkQsXHJcbiAgICBBTEwgPSBNRVNTQUdFUyB8IEZPUk1BVFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNvbnN0IERFQlVHX1NZTUJPTDogeyBbZmlsdGVyOiBudW1iZXJdOiBzdHJpbmcgfSA9IHtcclxuICAgIFtERUJVR19GSUxURVIuSU5GT106IFwi4pyTXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLkxPR106IFwi4pyOXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLldBUk5dOiBcIuKaoFwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IFwi4p2MXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLkZVREdFXTogXCLwn46yXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLlNPVVJDRV06IFwi8J+Ul1wiXHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0IHR5cGUgTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlID0gTWFwPERlYnVnVGFyZ2V0LCBGdW5jdGlvbj47XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGUgeyBbZmlsdGVyOiBudW1iZXJdOiBGdW5jdGlvbiB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIHRoZSBzdGFuZGFyZC1jb25zb2xlXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnQ29uc29sZSBleHRlbmRzIERlYnVnVGFyZ2V0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVsZWdhdGVzOiBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGUgPSB7XHJcbiAgICAgIFtERUJVR19GSUxURVIuSU5GT106IGNvbnNvbGUuaW5mbyxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBjb25zb2xlLmxvZyxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogY29uc29sZS53YXJuLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkVSUk9SXTogY29uc29sZS5lcnJvcixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IERlYnVnQ29uc29sZS5mdWRnZSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5DTEVBUl06IGNvbnNvbGUuY2xlYXIsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBdOiBjb25zb2xlLmdyb3VwLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQQ09MTEFQU0VEXTogY29uc29sZS5ncm91cENvbGxhcHNlZCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUEVORF06IGNvbnNvbGUuZ3JvdXBFbmQsXHJcbiAgICAgIFtERUJVR19GSUxURVIuU09VUkNFXTogRGVidWdDb25zb2xlLnNvdXJjZVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3VsZCBiZSB1c2VkIHRvIGRpc3BsYXkgdW5jcml0aWNhbCBzdGF0ZSBpbmZvcm1hdGlvbiBvZiBGVURHRSwgb25seSB2aXNpYmxlIGluIGJyb3dzZXIncyB2ZXJib3NlIG1vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBmdWRnZShfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSwgX21lc3NhZ2UsIC4uLl9hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGFuIGV4dHJhIGxpbmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc291cmNlKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICBjb25zb2xlLmxvZyhERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLlNPVVJDRV0sIF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnSW50ZXJmYWNlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnQ29uc29sZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIERlYnVnLUNsYXNzIG9mZmVycyBmdW5jdGlvbnMga25vd24gZnJvbSB0aGUgY29uc29sZS1vYmplY3QgYW5kIGFkZGl0aW9ucywgXHJcbiAgICogcm91dGluZyB0aGUgaW5mb3JtYXRpb24gdG8gdmFyaW91cyB7QGxpbmsgRGVidWdUYXJnZXR9cyB0aGF0IGNhbiBiZSBlYXNpbHkgZGVmaW5lZCBieSB0aGUgZGV2ZWxvcGVycyBhbmQgcmVnaXN0ZXJkIGJ5IHVzZXJzXHJcbiAgICogT3ZlcnJpZGUgZnVuY3Rpb25zIGluIHN1YmNsYXNzZXMgb2Yge0BsaW5rIERlYnVnVGFyZ2V0fSBhbmQgcmVnaXN0ZXIgdGhlbSBhcyB0aGVpciBkZWxlZ2F0ZXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCBzZXQgZmlsdGVyLCB0aGlzIGFzc29jaWF0aXZlIGFycmF5IGtlZXBzIHJlZmVyZW5jZXMgdG8gdGhlIHJlZ2lzdGVyZWQgZGVsZWdhdGUgZnVuY3Rpb25zIG9mIHRoZSBjaG9zZW4ge0BsaW5rIERlYnVnVGFyZ2V0fXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVsZWdhdGVzOiB7IFtmaWx0ZXI6IG51bWJlcl06IE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSB9ID0gRGVidWcuc2V0dXBDb25zb2xlKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSBhIGZpbHRlciBmb3IgdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQsIF9maWx0ZXI6IERFQlVHX0ZJTFRFUik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gRGVidWcuZGVsZWdhdGVzKVxyXG4gICAgICAgIERlYnVnLmRlbGVnYXRlc1tmaWx0ZXJdLmRlbGV0ZShfdGFyZ2V0KTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBpbiBERUJVR19GSUxURVIpIHtcclxuICAgICAgICBsZXQgcGFyc2VkOiBudW1iZXIgPSBwYXJzZUludChmaWx0ZXIpO1xyXG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgaWYgKFtERUJVR19GSUxURVIuTUVTU0FHRVMsIERFQlVHX0ZJTFRFUi5GT1JNQVQsIERFQlVHX0ZJTFRFUi5BTExdLmluZGV4T2YocGFyc2VkKSAhPSAtMSlcclxuICAgICAgICAgIC8vIGRvbnQgZGVsZWdhdGUgY29tYm9zLi4uIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKF9maWx0ZXIgJiBwYXJzZWQpXHJcbiAgICAgICAgICBEZWJ1Zy5kZWxlZ2F0ZXNbcGFyc2VkXS5zZXQoX3RhcmdldCwgX3RhcmdldC5kZWxlZ2F0ZXNbcGFyc2VkXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZmlsdGVyKHMpIGZvciB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCk6IERFQlVHX0ZJTFRFUiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IERFQlVHX0ZJTFRFUiA9IDA7XHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBpbiBfdGFyZ2V0LmRlbGVnYXRlcylcclxuICAgICAgICByZXN1bHQgfD0gcGFyc2VJbnQoZmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCwgX2ZpbHRlcjogREVCVUdfRklMVEVSKTogdm9pZCB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBERUJVR19GSUxURVIgPSBEZWJ1Zy5nZXRGaWx0ZXIoX3RhcmdldCk7XHJcbiAgICAgIERlYnVnLnNldEZpbHRlcihfdGFyZ2V0LCBjdXJyZW50IHwgX2ZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgZnJvbSB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlRmlsdGVyKF90YXJnZXQ6IERlYnVnVGFyZ2V0LCBfZmlsdGVyOiBERUJVR19GSUxURVIpOiB2b2lkIHtcclxuICAgICAgbGV0IGN1cnJlbnQ6IERFQlVHX0ZJTFRFUiA9IERlYnVnLmdldEZpbHRlcihfdGFyZ2V0KTtcclxuICAgICAgRGVidWcuc2V0RmlsdGVyKF90YXJnZXQsIGN1cnJlbnQgXiBfZmlsdGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZm8oLi4uKSBkaXNwbGF5cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpdGggbG93IHByaW9yaXR5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuSU5GTywgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgaW5mb3JtYXRpb24gd2l0aCBtZWRpdW0gcHJpb3JpdHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBsb2coX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkxPRywgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgbm9uLWNvbmZvcm1pdGllcyBpbiB1c2FnZSwgd2hpY2ggaXMgZW1waGFzaXplZCBlLmcuIGJ5IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgd2FybihfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuV0FSTiwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgY3JpdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHdoaWNoIGlzIGVtcGhhc2l6ZWQgZS5nLiBieSBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGVycm9yKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5FUlJPUiwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgbWVzc2FnZXMgZnJvbSBGVURHRVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGZ1ZGdlKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5GVURHRSwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBvdXRwdXQgYW5kIHJlbW92ZXMgcHJldmlvdXMgbWVzc2FnZXMgaWYgcG9zc2libGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkNMRUFSLCBudWxsLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgYSBuZXcgZ3JvdXAgZm9yIG1lc3NhZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXAoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVAsIF9uYW1lLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgYSBuZXcgZ3JvdXAgZm9yIG1lc3NhZ2VzIHRoYXQgaXMgY29sbGFwc2VkIGF0IGZpcnN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBDb2xsYXBzZWQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRUQsIF9uYW1lLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSB5b3VuZ2VzdCBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwRW5kKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVBFTkQsIG51bGwsIG51bGwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2cgYSBicmFuY2ggb2YgdGhlIG5vZGUgaGllcmFyY2h5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYnJhbmNoKF9icmFuY2g6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKF9icmFuY2gubkNoaWxkcmVuID4gMClcclxuICAgICAgICBEZWJ1Zy5ncm91cChfYnJhbmNoLm5hbWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcuZnVkZ2UoX2JyYW5jaC5uYW1lKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIF9icmFuY2guZ2V0Q2hpbGRyZW4oKSkgRGVidWcuYnJhbmNoKGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfYnJhbmNoLm5DaGlsZHJlbiA+IDApXHJcbiAgICAgICAgRGVidWcuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIG1lc3NhZ2VzIGFib3V0IHRoZSBzb3VyY2Ugb2YgdGhlIGRlYnVnIGNhbGxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzb3VyY2UoX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLlNPVVJDRSwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvb2t1cCBhbGwgZGVsZWdhdGVzIHJlZ2lzdGVyZWQgdG8gdGhlIGZpbHRlciBhbmQgY2FsbCB0aGVtIHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVsZWdhdGUoX2ZpbHRlcjogREVCVUdfRklMVEVSLCBfbWVzc2FnZTogdW5rbm93biwgX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBpZiAoX2ZpbHRlciA9PSBERUJVR19GSUxURVIuTE9HIHx8IF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLldBUk4gfHwgX2ZpbHRlciA9PSBERUJVR19GSUxURVIuRVJST1IpIHtcclxuICAgICAgICBpZiAoRGVidWcuZGVsZWdhdGVzW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdKVxyXG4gICAgICAgICAgZm9yIChsZXQgZGVsZWdhdGUgb2YgRGVidWcuZGVsZWdhdGVzW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLnZhbHVlcygpKVxyXG4gICAgICAgICAgICBpZiAoZGVsZWdhdGUpIHtcclxuICAgICAgICAgICAgICBsZXQgdHJhY2U6IHN0cmluZ1tdID0gbmV3IEVycm9yKFwiVGVzdFwiKS5zdGFjay5zcGxpdChcIlxcblwiKTtcclxuICAgICAgICAgICAgICBkZWxlZ2F0ZSh0cmFjZVszXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgZGVsZWdhdGVzOiBNYXBEZWJ1Z1RhcmdldFRvRGVsZWdhdGUgPSBEZWJ1Zy5kZWxlZ2F0ZXNbX2ZpbHRlcl07XHJcbiAgICAgIGZvciAobGV0IGRlbGVnYXRlIG9mIGRlbGVnYXRlcy52YWx1ZXMoKSlcclxuICAgICAgICBpZiAoZGVsZWdhdGUpXHJcbiAgICAgICAgICBpZiAoX2FyZ3MgJiYgX2FyZ3MubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgZGVsZWdhdGUoX21lc3NhZ2UsIC4uLl9hcmdzKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZGVsZWdhdGUoX21lc3NhZ2UpO1xyXG5cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogc2V0dXAgcm91dGluZyB0byBzdGFuZGFyZCBjb25zb2xlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIHNldHVwQ29uc29sZSgpOiB7fSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHsgW2ZpbHRlcjogbnVtYmVyXTogTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlIH0gPSB7fTtcclxuICAgICAgbGV0IGZpbHRlcnM6IERFQlVHX0ZJTFRFUltdID0gW1xyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5JTkZPLCBERUJVR19GSUxURVIuTE9HLCBERUJVR19GSUxURVIuV0FSTiwgREVCVUdfRklMVEVSLkVSUk9SLCBERUJVR19GSUxURVIuRlVER0UsXHJcbiAgICAgICAgREVCVUdfRklMVEVSLkNMRUFSLCBERUJVR19GSUxURVIuR1JPVVAsIERFQlVHX0ZJTFRFUi5HUk9VUENPTExBUFNFRCwgREVCVUdfRklMVEVSLkdST1VQRU5ELFxyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5TT1VSQ0VcclxuICAgICAgXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBvZiBmaWx0ZXJzKVxyXG4gICAgICAgIHJlc3VsdFtmaWx0ZXJdID0gbmV3IE1hcChbW0RlYnVnQ29uc29sZSwgRGVidWdDb25zb2xlLmRlbGVnYXRlc1tmaWx0ZXJdXV0pO1xyXG5cclxuICAgICAgcmVzdWx0W0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLmRlbGV0ZShEZWJ1Z0NvbnNvbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEV2ZW50VHlwZVRvTGlzdGVuZXIge1xyXG4gICAgW2V2ZW50VHlwZTogc3RyaW5nXTogRXZlbnRMaXN0ZW5lclVuaWZpZWRbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR5cGVzIG9mIGV2ZW50cyBzcGVjaWZpYyB0byBGVURHRSwgaW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIERPTS9Ccm93c2VyLVR5cGVzIGFuZCBjdXN0b20gc3RyaW5nc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UIHtcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHRhcmdldHMgcmVnaXN0ZXJlZCBhdCB7QGxpbmsgTG9vcH0sIHdoZW4gcmVxdWVzdGVkIGFuaW1hdGlvbiBmcmFtZSBzdGFydHMgKi9cclxuICAgIExPT1BfRlJBTUUgPSBcImxvb3BGcmFtZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBhZGRlZCB0byBhIHtAbGluayBOb2RlfSAqL1xyXG4gICAgQ09NUE9ORU5UX0FERCA9IFwiY29tcG9uZW50QWRkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBDb21wb25lbnR9IHdoZW4gaXRzIGJlaW5nIHJlbW92ZWQgZnJvbSBhIHtAbGluayBOb2RlfSAqL1xyXG4gICAgQ09NUE9ORU5UX1JFTU9WRSA9IFwiY29tcG9uZW50UmVtb3ZlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBDb21wb25lbnR9IHdoZW4gaXRzIGJlaW5nIGFjdGl2YXRlZCAqL1xyXG4gICAgQ09NUE9ORU5UX0FDVElWQVRFID0gXCJjb21wb25lbnRBY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBkZWFjdGl2YXRlZCAqL1xyXG4gICAgQ09NUE9ORU5UX0RFQUNUSVZBVEUgPSBcImNvbXBvbmVudERlYWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE5vZGV9LCBpdCdzIHN1Y2Nlc3NvcnMgYW5kIGFuY2VzdG9ycyB3aGVuIGl0cyBiZWluZyBhY3RpdmF0ZWQgKi9cclxuICAgIE5PREVfQUNUSVZBVEUgPSBcIm5vZGVBY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgTm9kZX0sIGl0J3Mgc3VjY2Vzc29ycyBhbmQgYW5jZXN0b3JzIHdoZW4gaXRzIGJlaW5nIGRlYWN0aXZhdGVkICovXHJcbiAgICBOT0RFX0RFQUNUSVZBVEUgPSBcIm5vZGVEZWFjdGl2YXRlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIGNoaWxkIHtAbGluayBOb2RlfSBhbmQgaXRzIGFuY2VzdG9ycyBhZnRlciBpdCB3YXMgYXBwZW5kZWQgdG8gYSBwYXJlbnQgKi9cclxuICAgIENISUxEX0FQUEVORCA9IFwiY2hpbGRBcHBlbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEgY2hpbGQge0BsaW5rIE5vZGV9IGFuZCBpdHMgYW5jZXN0b3JzIGp1c3QgYmVmb3JlIGl0cyBiZWluZyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCAqL1xyXG4gICAgQ0hJTERfUkVNT1ZFID0gXCJjaGlsZFJlbW92ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgTXV0YWJsZX0gd2hlbiBpdCBtdXRhdGVzICovXHJcbiAgICBNVVRBVEUgPSBcIm11dGF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgYnkgYSB7QGxpbmsgR3JhcGh9IHdoZW4gaXQgbXV0YXRlcywge0BsaW5rIEdyYXBoSW5zdGFuY2V9cyBjb25uZWN0ZWQgdG8gdGhlIGdyYXBoIGxpc3RlbiAqL1xyXG4gICAgTVVUQVRFX0dSQVBIID0gXCJtdXRhdGVHcmFwaFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgYnkgYSB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gd2hlbiBpdCByZWZsZWN0ZWQgdGhlIG11dGF0aW9uIG9mIHRoZSB7QGxpbmsgR3JhcGh9IGl0J3MgY29ubmVjdGVkIHRvICovXHJcbiAgICBNVVRBVEVfSU5TVEFOQ0UgPSBcIm11dGF0ZUdyYXBoRG9uZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSB3aGVuIGl0IGdldHMgdGhlIGZvY3VzIHRvIHJlY2VpdmUga2V5Ym9hcmQgaW5wdXQgKi9cclxuICAgIEZPQ1VTX0lOID0gXCJmb2N1c2luXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IHdoZW4gaXQgbG9zZXMgdGhlIGZvY3VzIHRvIHJlY2VpdmUga2V5Ym9hcmQgaW5wdXQgKi9cclxuICAgIEZPQ1VTX09VVCA9IFwiZm9jdXNvdXRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIGl0J3MgZG9uZSBzZXJpYWxpemluZyAqL1xyXG4gICAgTk9ERV9TRVJJQUxJWkVEID0gXCJub2RlU2VyaWFsaXplZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIHtAbGluayBDb21wb25lbnR9cyB3aGVuIGl0J3MgZG9uZSBkZXNlcmlhbGl6aW5nLCBzbyBhbGwgY29tcG9uZW50cywgY2hpbGRyZW4gYW5kIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSAqL1xyXG4gICAgTk9ERV9ERVNFUklBTElaRUQgPSBcIm5vZGVEZXNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBicm9hZGNhc3QgZnJvbSBhIHtAbGluayBHcmFwaEluc3RhbmNlfSB0byBhbGwgaXRzIGRlc2NlbmRhbnRzIHdoZW4gaXQncyBjb250ZW50IGlzIHNldCBhY2NvcmRpbmcgdG8gYSBzZXJpYWxpemF0aW9uIG9mIGEge0BsaW5rIEdyYXBofS4gQnJvYWRjYXN0ZWQsIHNvIG5lZWRzIHRvIGJlIGNhdWdodCBpbiBjYXB0dXJlLiAqL1xyXG4gICAgR1JBUEhfSU5TVEFOVElBVEVEID0gXCJncmFwaEluc3RhbnRpYXRlZFwiLFxyXG4gICAgLyoqIGJyb2FkY2FzdCBmcm9tIGEge0BsaW5rIEdyYXBofSB0byBhbGwgaXRzIGRlc2NlbmRhbnRzIHdoZW4gaXQncyBmaW5pc2hlZCBkZXNlcmlhbGl6aW5nLiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBHUkFQSF9ERVNFUklBTElaRUQgPSBcImdyYXBoRGVzZXJpYWxpemVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCBieSBhIHtAbGluayBHcmFwaH0gd2hlbiBpdCBhbmQgaXRzIGNvbm5lY3RlZCBpbnN0YW5jZXMgaGF2ZSBmaW5pc2hlZCBtdXRhdGluZyAgKi9cclxuICAgIEdSQVBIX01VVEFURUQgPSBcImdyYXBoTXV0YXRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFRpbWV9IHdoZW4gaXQncyBzY2FsaW5nIGNoYW5nZWQgICovXHJcbiAgICBUSU1FX1NDQUxFRCA9IFwidGltZVNjYWxlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEZpbGVJb0Jyb3dzZXJMb2NhbH0gd2hlbiBhIGxpc3Qgb2YgZmlsZXMgaGFzIGJlZW4gbG9hZGVkICAqL1xyXG4gICAgRklMRV9MT0FERUQgPSBcImZpbGVMb2FkZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBGaWxlSW9Ccm93c2VyTG9jYWx9IHdoZW4gYSBsaXN0IG9mIGZpbGVzIGhhcyBiZWVuIHNhdmVkICovXHJcbiAgICBGSUxFX1NBVkVEID0gXCJmaWxlU2F2ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIHJlY2FsY3VsYXRpbmcgdHJhbnNmb3JtcyBmb3IgcmVuZGVyICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRSA9IFwicmVuZGVyUHJlcGFyZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSBhbmQge0BsaW5rIE5vZGV9IHdoZW4gcmVjYWxjdWxhdGlvbiBvZiB0aGUgYnJhbmNoIHRvIHJlbmRlciBzdGFydHMuICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRV9TVEFSVCA9IFwicmVuZGVyUHJlcGFyZVN0YXJ0XCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IGFuZCB7QGxpbmsgTm9kZX0gd2hlbiByZWNhbGN1bGF0aW9uIG9mIHRoZSBicmFuY2ggdG8gcmVuZGVyIGVuZHMuIFRoZSBicmFuY2ggZGlzcGF0Y2hlcyBiZWZvcmUgdGhlIGxpZ2h0cyBhcmUgdHJhbnNtaXR0ZWQgdG8gdGhlIHNoYWRlcnMgICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRV9FTkQgPSBcInJlbmRlclByZXBhcmVFbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gYXQgdGhlIGVuZCBvZiBhIHJlbmRlcmVkIGZyYW1lIHJpZ2h0IGJlZm9yZSBpdCBnZXRzIGRpc3BsYXllZC4gQXQgdGhpcyBwb2ludCB7QGxpbmsgR2l6bW9zfSBjYW4gc3RpbGwgYmUgZHJhd24uICovXHJcbiAgICBSRU5ERVJfRU5EID0gXCJyZW5kZXJFbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBKb2ludH0tQ29tcG9uZW50cyBpbiBvcmRlciB0byBkaXNjb25uZWN0ICovXHJcbiAgICBESVNDT05ORUNUX0pPSU5UID0gXCJkaXNjb25uZWN0Sm9pbnRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIGl0IGdldHMgYXR0YWNoZWQgdG8gYSB2aWV3cG9ydCBmb3IgcmVuZGVyaW5nLiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBBVFRBQ0hfQlJBTkNIID0gXCJhdHRhY2hCcmFuY2hcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBQcm9qZWN0fSB3aGVuIGl0J3MgZG9uZSBsb2FkaW5nIHJlc291cmNlcyBmcm9tIGEgdXJsICovXHJcbiAgICBSRVNPVVJDRVNfTE9BREVEID0gXCJyZXNvdXJjZXNMb2FkZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IGFuZCB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9IHdoZW4gYSB7QGxpbmsgQ29tcG9uZW50V2Fsa2VyfSByZWFjaGVzIGEge0BsaW5rIFdheXBvaW50fSBvciB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9ICovXHJcbiAgICBXQVlQT0lOVF9SRUFDSEVEID0gXCJ3YXlwb2ludFJlYWNoZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IHdoZW4gdGhlIGZpbmFsIHtAbGluayBXYXlwb2ludH0gaW4gdGhlIGN1cnJlbnQgcGF0aCBoYXMgYmVlbiByZWFjaGVkICovXHJcbiAgICBQQVRISU5HX0NPTkNMVURFRCA9IFwicGF0aGluZ0NvbmNsdWRlZFwiXHJcbiAgfVxyXG5cclxuICAvKiogVW5pb24gdHlwZSBvZiBvdGhlciBldmVudCB0eXBlcyBzZXJ2aW5nIGFzIGFubm90YXRpb24gZm9yIGxpc3RlbmVycyBhbmQgaGFuZGxlcnMgKi9cclxuICBleHBvcnQgdHlwZSBFdmVudFVuaWZpZWQgPSBFdmVudCB8IEN1c3RvbUV2ZW50IHwgRXZlbnRQaHlzaWNzO1xyXG5cclxuICAvKiogVW5pZmllZCBsaXN0ZW5lciB0eXBlIGV4dGVuZGluZyBFdmVudExpc3RlbmVyIGFuZCBFdmVudExpc3RlbmVyT2JqZWN0IGZvciBDdXN0b21FdmVudCBhbmQgb3RoZXJzICovXHJcbiAgZXhwb3J0IHR5cGUgRXZlbnRMaXN0ZW5lclVuaWZpZWQgPVxyXG4gICAgKChfZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKSB8XHJcbiAgICAoKF9ldmVudDogQ3VzdG9tRXZlbnQpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBFdmVudFBoeXNpY3MpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBFdmVudFRpbWVyKSA9PiB2b2lkKSB8XHJcbiAgICBFdmVudExpc3RlbmVyIHxcclxuICAgIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q7XHJcblxyXG4gIC8qKiBFeHRlbmRzIEV2ZW50VGFyZ2V0IHRvIHdvcmsgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfSAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFRhcmdldFVuaWZpZWQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcn0gZm9yIHJlZmVyZW5jZS4gV29ya3Mgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogc3RyaW5nLCBfaGFuZGxlcjogRXZlbnRMaXN0ZW5lclVuaWZpZWQsIF9vcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIoX3R5cGUsIDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0Pl9oYW5kbGVyLCBfb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJ9IGZvciByZWZlcmVuY2UuIFdvcmtzIHdpdGgge0BsaW5rIEV2ZW50TGlzdGVuZXJVbmlmaWVkfSBhbmQge0BsaW5rIEV2ZW50VW5pZmllZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKF90eXBlLCA8RXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdD5faGFuZGxlciwgX29wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBFdmVudFRhcmdldC5kaXNwYXRjaEV2ZW50fSBmb3IgcmVmZXJlbmNlLiBXb3JrcyB3aXRoIHdpdGgge0BsaW5rIEV2ZW50VW5pZmllZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudFVuaWZpZWQpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJhc2UgY2xhc3MgZm9yIEV2ZW50VGFyZ2V0IHNpbmdsZXRvbnMsIHdoaWNoIGFyZSBmaXhlZCBlbnRpdGllcyBpbiB0aGUgc3RydWN0dXJlIG9mIEZVREdFLCBzdWNoIGFzIHRoZSBjb3JlIGxvb3AgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50VGFyZ2V0U3RhdGljIGV4dGVuZHMgRXZlbnRUYXJnZXRVbmlmaWVkIHtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdGFyZ2V0U3RhdGljOiBFdmVudFRhcmdldFN0YXRpYyA9IG5ldyBFdmVudFRhcmdldFN0YXRpYygpO1xyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIEV2ZW50VGFyZ2V0U3RhdGljLnRhcmdldFN0YXRpYy5hZGRFdmVudExpc3RlbmVyKF90eXBlLCBfaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIEV2ZW50VGFyZ2V0U3RhdGljLnRhcmdldFN0YXRpYy5yZW1vdmVFdmVudExpc3RlbmVyKF90eXBlLCBfaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCBvbiB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkaXNwYXRjaEV2ZW50KF9ldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIGRlc2NyaWJpbmcgdGhlIGRhdGF0eXBlcyBvZiB0aGUgYXR0cmlidXRlcyBhIG11dGF0b3IgYXMgc3RyaW5ncyBcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICBbYXR0cmlidXRlOiBzdHJpbmddOiBzdHJpbmcgfCBPYmplY3Q7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEludGVyZmFjZSBkZXNjcmliaW5nIGEgbXV0YXRvciwgd2hpY2ggaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCBuYW1lcyBvZiBhdHRyaWJ1dGVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvciB7XHJcbiAgICBbYXR0cmlidXRlOiBzdHJpbmddOiBHZW5lcmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBJbnRlcmZhY2VzIGRlZGljYXRlZCBmb3IgZWFjaCBwdXJwb3NlLiBFeHRyYSBhdHRyaWJ1dGUgbmVjZXNzYXJ5IGZvciBjb21waWxldGltZSB0eXBlIGNoZWNraW5nLCBub3QgZXhpc3RlbnQgYXQgcnVudGltZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckZvckFuaW1hdGlvbiBleHRlbmRzIE11dGF0b3IgeyByZWFkb25seSBmb3JBbmltYXRpb246IG51bGwgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckZvclVzZXJJbnRlcmZhY2UgZXh0ZW5kcyBNdXRhdG9yIHsgcmVhZG9ubHkgZm9yVXNlckludGVyZmFjZTogbnVsbCB9XHJcbiAgLy8gZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yQ29tcG9uZW50IGV4dGVuZHMgTXV0YXRvciB7IHJlYWRvbmx5IGZvclVzZXJDb21wb25lbnQ6IG51bGw7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdCBhcHBsaWNhYmxlIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlIGFuZCBjb3BpZXMgb2YgdGhlaXIgdmFsdWVzIGluIGEgTXV0YXRvci1vYmplY3RcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TXV0YXRvck9mQXJiaXRyYXJ5KF9vYmplY3Q6IE9iamVjdCk6IE11dGF0b3Ige1xyXG4gICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgIGxldCBhdHRyaWJ1dGVzOiAoc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sKVtdID0gUmVmbGVjdC5vd25LZXlzKFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoX29iamVjdCkpO1xyXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcclxuICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBSZWZsZWN0LmdldChfb2JqZWN0LCBhdHRyaWJ1dGUpO1xyXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbilcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKSlcclxuICAgICAgLy8gICBjb250aW51ZTtcclxuICAgICAgbXV0YXRvclthdHRyaWJ1dGUudG9TdHJpbmcoKV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBtdXRhdG9yO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZSAtIGFzIG9mIG5vdyB3ZSBuZWVkIHRvIHBvbHlmaWxsIHRoZSBzeW1ib2wgdG8gbWFrZSBkZWNvcmF0b3IgbWV0YWRhdGEgd29yaywgc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC01LTIuaHRtbCNkZWNvcmF0b3ItbWV0YWRhdGFcclxuICBTeW1ib2wubWV0YWRhdGEgPz89IFN5bWJvbChcIlN5bWJvbC5tZXRhZGF0YVwiKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXNzb2NpYXRpb24gb2YgYW4gYXR0cmlidXRlIHdpdGggaXRzIHNwZWNpZmllZCB0eXBlIChjb25zdHJ1Y3RvcikuXHJcbiAgICogQHNlZSB7QGxpbmsgTWV0YWRhdGF9LlxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIE1ldGFBdHRyaWJ1dGVUeXBlcyA9IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIEZ1bmN0aW9uPjtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0YWRhdGEgZm9yIGNsYXNzZXMgZXh0ZW5kaW5nIHtAbGluayBNdXRhYmxlfS4gTWV0YWRhdGEgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgdXNpbmcgZGVjb3JhdG9ycy5cclxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtNS0yLmh0bWwjZGVjb3JhdG9yLW1ldGFkYXRhIHwgdHlwZSBzY3JpcHQgNS4yIGZlYXR1cmUgXCJkZWNvcmF0b3IgbWV0YWRhdGFcIn0gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzcGVjaWZpZWQgdHlwZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcy4gVXNlIHRoZSB7QGxpbmsgdHlwZX0gZGVjb3JhdG9yIHRvIGFkZCB0eXBlIGluZm9ybWF0aW9uIHRvIHRoZSBtZXRhZGF0YSBvZiBhIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBhdHRyaWJ1dGVUeXBlcz86IE1ldGFBdHRyaWJ1dGVUeXBlcztcclxuXHJcbiAgICBlbnVtZXJhYmxlS2V5cz86IChzdHJpbmcgfCBzeW1ib2wpW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvcmF0b3IgdG8gc3BlY2lmeSBhIHR5cGUgKGNvbnN0cnVjdG9yKSBmb3IgYW4gYXR0cmlidXRlIHdpdGhpbiBhIGNsYXNzJ3Mge0BsaW5rIE1ldGFkYXRhIHwgbWV0YWRhdGF9LlxyXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBpbnRlbmRlZCB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB0byBiZSBrbm93biBhdCBydW50aW1lLCBtYWtpbmcgaXQgYSB2YWxpZCBkcm9wIHRhcmdldCBpbiB0aGUgZWRpdG9yLlxyXG4gICAqXHJcbiAgICogKipOb3RlOioqIEF0dHJpYnV0ZXMgd2l0aCBhIHNwZWNpZmllZCBtZXRhLXR5cGUgd2lsbCBhbHdheXMgYmUgaW5jbHVkZWQgaW4gdGhlIHtAbGluayBNdXRhdG9yIGJhc2UtbXV0YXRvcn0gXHJcbiAgICogKHZpYSB7QGxpbmsgTXV0YWJsZS5nZXRNdXRhdG9yfSksIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgb3duIHR5cGUuIE5vbi17QGxpbmsgTXV0YWJsZSBtdXRhYmxlfSBvYmplY3RzIFxyXG4gICAqIHdpbGwgYmUgZGlzcGxheWVkIHZpYSB0aGVpciB7QGxpbmsgdG9TdHJpbmd9IG1ldGhvZCBpbiB0aGUgZWRpdG9yLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiB0eXBlKF9jb25zdHJ1Y3RvcjogYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBHZW5lcmFsW10pID0+IEdlbmVyYWwpOiAoX3ZhbHVlOiB1bmtub3duLCBfY29udGV4dDogQ2xhc3NGaWVsZERlY29yYXRvckNvbnRleHQgfCBDbGFzc0dldHRlckRlY29yYXRvckNvbnRleHQgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gKF92YWx1ZTogdW5rbm93biwgX2NvbnRleHQ6IENsYXNzTWVtYmVyRGVjb3JhdG9yQ29udGV4dCkgPT4geyAvLyBjb3VsZCBjYWNoZSB0aGUgZGVjb3JhdG9yIGZ1bmN0aW9uIGZvciBlYWNoIGNsYXNzXHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgfCBzeW1ib2wgPSBfY29udGV4dC5uYW1lO1xyXG4gICAgICBsZXQgbWV0YWRhdGE6IE1ldGFkYXRhID0gX2NvbnRleHQubWV0YWRhdGE7XHJcbiAgICAgIGxldCB0eXBlczogTWV0YUF0dHJpYnV0ZVR5cGVzID0gbWV0YWRhdGEuYXR0cmlidXRlVHlwZXMgPz89IHt9O1xyXG4gICAgICB0eXBlc1tuYW1lXSA9IF9jb25zdHJ1Y3RvcjtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvcmF0b3IgZm9yIG1ha2luZyBnZXR0ZXJzIGluIGEge0BsaW5rIE11dGFibGV9IGNsYXNzIGVudW1lcmFibGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBnZXR0ZXJzIGFyZSBpbmNsdWRlZCBpbiBtdXRhdG9ycyBhbmQgYXJlIHN1YnNlcXVlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvci5cclxuICAgKiBcclxuICAgKiAqKlVzYWdlOioqIEFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIGJvdGggdGhlIGdldHRlciBtZXRob2QgYW5kIHRoZSBjbGFzcyB0byBtYWtlIGl0IGVmZmVjdGl2ZS5cclxuICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhYmxlKF92YWx1ZTogdW5rbm93biwgX2NvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dCB8IENsYXNzR2V0dGVyRGVjb3JhdG9yQ29udGV4dCB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0KTogdm9pZCB7XHJcbiAgICAvLyBfY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAodGhpczogdW5rbm93bikgeyAvLyB0aGlzIGlzIHJ1biBwZXIgaW5zdGFuY2UuLi4gaWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIHJ1biB0aGlzIG9uY2UgcGVyIGNsYXNzXHJcbiAgICAvLyAgIGNvbnN0IHByb3RvdHlwZTogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcclxuICAgIC8vICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIF9jb250ZXh0Lm5hbWUpO1xyXG4gICAgLy8gICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUgPT0gZmFsc2UpXHJcbiAgICAvLyAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgX2NvbnRleHQubmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgbGV0IG1ldGFkYXRhOiBNZXRhZGF0YSA9IF9jb250ZXh0Lm1ldGFkYXRhO1xyXG4gICAgaWYgKF9jb250ZXh0LmtpbmQgPT0gXCJnZXR0ZXJcIiB8fCBfY29udGV4dC5raW5kID09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICBtZXRhZGF0YS5lbnVtZXJhYmxlS2V5cyA/Pz0gW107XHJcbiAgICAgIG1ldGFkYXRhLmVudW1lcmFibGVLZXlzLnB1c2goX2NvbnRleHQubmFtZS50b1N0cmluZygpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKF9jb250ZXh0LmtpbmQgPT0gXCJjbGFzc1wiKSB7XHJcbiAgICAgIG1ldGFkYXRhLmVudW1lcmFibGVLZXlzID8/PSBbXTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbWV0YWRhdGEuZW51bWVyYWJsZUtleXMpXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCg8RnVuY3Rpb24+X3ZhbHVlKS5wcm90b3R5cGUsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHlwZXMgdGhhdCBhcmUgbXV0YWJsZSB1c2luZyB7QGxpbmsgTXV0YXRvcn0tb2JqZWN0cywgdGh1cyBwcm92aWRpbmcgYW5kIHVzaW5nIGludGVyZmFjZXMgY3JlYXRlZCBhdCBydW50aW1lLlxyXG4gICAqIFxyXG4gICAqIE11dGFibGVzIHByb3ZpZGUgYSB7QGxpbmsgTXV0YXRvcn0gYnVpbHQgYnkgY29sbGVjdGluZyBhbGwgdGhlaXIgYXBwbGljYWJsZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEJ5IGRlZmF1bHQsIHRoaXMgaW5jbHVkZXMgb25seSBwcmltaXRpdmUgdHlwZXMgYW5kIG5lc3RlZCBtdXRhYmxlIG9iamVjdHMuXHJcbiAgICogVXNpbmcgdGhlIHtAbGluayB0eXBlfS1kZWNvcmF0b3IgY2FuIGFsc28gaW5jbHVkZSBub24tbXV0YWJsZSBvYmplY3RzLCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCB2aWEgdGhlaXIge0BsaW5rIHRvU3RyaW5nfSBtZXRob2QgaW4gdGhlIGVkaXRvci5cclxuICAgKiBcclxuICAgKiBTdWJjbGFzc2VzIGNhbiBlaXRoZXIgcmVkdWNlIHRoZSBzdGFuZGFyZCB7QGxpbmsgTXV0YXRvcn0gYnVpbHQgYnkgdGhpcyBiYXNlIGNsYXNzIGJ5IGRlbGV0aW5nIHByb3BlcnRpZXMgb3IgaW1wbGVtZW50IGFuIGluZGl2aWR1YWwgZ2V0TXV0YXRvciBtZXRob2QuXHJcbiAgICogVGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBNdXRhdG9yfSBtdXN0IG1hdGNoIHB1YmxpYyBwcm9wZXJ0aWVzIG9yIGdldHRlcnMvc2V0dGVycyBvZiB0aGUgb2JqZWN0LlxyXG4gICAqIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGhhbmRsZWQgYnkgYW4gb3ZlcnJpZGUgb2YgdGhlIG11dGF0ZSBtZXRob2QgaW4gdGhlIHN1YmNsYXNzLCBhbmQgd2lsbCB0aHJvdyBlcnJvcnMgaW4gYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBvYmplY3QuXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE11dGFibGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvcmF0b3IgYWxsb3dzIHRvIGF0dGFjaCB7QGxpbmsgTXV0YWJsZX0gZnVuY3Rpb25hbGl0eSB0byBleGlzdGluZyBjbGFzc2VzLiBcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAvLyAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgLy8gICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNdXRhdG9yKHRoaXM6IE11dGFibGVGb3JVc2VySW50ZXJmYWNlKTogTXV0YXRvciB7XHJcbiAgICAvLyAgICAgICByZXR1cm4gZ2V0TXV0YXRvck9mQXJiaXRyYXJ5KHRoaXMpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRNdXRhdG9yRnJvbVBhdGgoX211dGF0b3I6IE11dGF0b3IsIF9wYXRoOiBzdHJpbmdbXSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfcGF0aFswXTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKF9tdXRhdG9yW2tleV0gPT0gdW5kZWZpbmVkKSAvLyBpZiB0aGUgcGF0aCBkZXZpYXRlcyBmcm9tIG11dGF0b3Igc3RydWN0dXJlLCByZXR1cm4gdGhlIG11dGF0b3JcclxuICAgICAgICByZXR1cm4gX211dGF0b3I7XHJcbiAgICAgIG11dGF0b3Jba2V5XSA9IF9tdXRhdG9yW2tleV07XHJcbiAgICAgIGlmIChfcGF0aC5sZW5ndGggPiAxKVxyXG4gICAgICAgIG11dGF0b3Jba2V5XSA9IE11dGFibGUuZ2V0TXV0YXRvckZyb21QYXRoKG11dGF0b3Jba2V5XSwgX3BhdGguc2xpY2UoMSwgX3BhdGgubGVuZ3RoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoaXMgbXV0YWJsZSBzdWJjbGFzcyBhcyB0aGUgbmFtZSBvZiB0aGUgcnVudGltZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMgVGhlIHR5cGUgb2YgdGhlIG11dGFibGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3QgYXBwbGljYWJsZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgY29waWVzIG9mIHRoZWlyIHZhbHVlcyBpbiBhIE11dGF0b3Itb2JqZWN0LlxyXG4gICAgICogQnkgZGVmYXVsdCwgYSBtdXRhdG9yIGNhbm5vdCBiZSBleHRlbmRlZCwgc2luY2UgZXh0ZW5zaW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgb2JqZWN0IHRoZSBtdXRhdG9yIGJlbG9uZ3MgdG8uXHJcbiAgICAgKiBBIG11dGF0b3IgbWF5IGJlIHJlZHVjZWQgYnkgdGhlIGRlc2NlbmRhbnRzIG9mIHtAbGluayBNdXRhYmxlfSB0byBjb250YWluIG9ubHkgdGhlIHByb3BlcnRpZXMgbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge307XHJcblxyXG4gICAgICAvLyBjb2xsZWN0IHByaW1pdGl2ZSBhbmQgbXV0YWJsZSBhdHRyaWJ1dGVzXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiB0aGlzKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSB0aGlzW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlQXJyYXkpICYmICEodmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFJlc291cmNlXCIpKSAmJiB0aGlzLmdldE1ldGFBdHRyaWJ1dGVUeXBlcygpW2F0dHJpYnV0ZV0gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2V4dGVuZGFibGUpXHJcbiAgICAgICAgLy8gbXV0YXRvciBjYW4gYmUgcmVkdWNlZCBidXQgbm90IGV4dGVuZGVkIVxyXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgLy8gZGVsZXRlIHVud2FudGVkIGF0dHJpYnV0ZXNcclxuICAgICAgdGhpcy5yZWR1Y2VNdXRhdG9yKG11dGF0b3IpO1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSByZWZlcmVuY2VzIHRvIG11dGFibGUgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbXV0YXRvcnNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIG11dGF0b3IpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IG11dGF0b3JbYXR0cmlidXRlXTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGVBcnJheSlcclxuICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IHZhbHVlLm1hcCgoX3ZhbHVlKSA9PiBfdmFsdWUuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIGFuaW1hdGlvbi5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKF9leHRlbmRhYmxlOiBib29sZWFuID0gZmFsc2UpOiBNdXRhdG9yRm9yQW5pbWF0aW9uIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yQW5pbWF0aW9uPnRoaXMuZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZShfZXh0ZW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTXV0YXRvckZvclVzZXJJbnRlcmZhY2Uge1xyXG4gICAgICByZXR1cm4gPE11dGF0b3JGb3JVc2VySW50ZXJmYWNlPnRoaXMuZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZSk7ICAvLyBUT0RPOiBib3RoIG9mIHRoZXNlICh0aGlzIGFuZCBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKSBkb24ndCByZWFsbHkgd29yayBhcyB0aGV5IGRvbid0IHJlY3Vyc2l2ZWx5IGNhbGwgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2Ugb24gc3ViLW11dGFibGUgb2JqZWN0cywgbWF5YmUgaW5zdGVhZCBpbXBsZW1lbnQgYSByZWR1Y2VNdXRhdG9yRm9yVXNlckludGVyZmFjZT8/P1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGVjdCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIHRoZWlyIHZhbHVlcyBhcHBsaWNhYmxlIGZvciBpbmRpdml1YWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBCYXNpYyBmdW5jdGlvbmFsaXR5IGlzIGlkZW50aWNhbCB0byB7QGxpbmsgZ2V0TXV0YXRvcn0sIHJldHVybmVkIG11dGF0b3Igc2hvdWxkIHRoZW4gYmUgcmVkdWNlZCBieSB0aGUgc3ViY2xhc3NlZCBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpOiBNdXRhdG9yRm9yQ29tcG9uZW50IHtcclxuICAgIC8vICAgICByZXR1cm4gPE11dGF0b3JGb3JDb21wb25lbnQ+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBnaXZlbiBtdXRhdG9yLCBidXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBhcyBzdHJpbmctdmFsdWVzLlxyXG4gICAgICogRG9lcyBub3QgcmVjdXJzZSBpbnRvIG9iamVjdHMhIFRoaXMgd2lsbCByZXR1cm4gdGhlIGRlY29yYXRlZCB7QGxpbmsgTWV0YWRhdGEgbWV0YS10eXBlfSBpbnN0ZWFkIG9mIHRoZSBydW50aW1lLXR5cGUgb2YgdGhlIG9iamVjdCwgaWYgYXZhaWxhYmxlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSB7fTtcclxuICAgICAgbGV0IG1ldGFUeXBlczogTWV0YUF0dHJpYnV0ZVR5cGVzID0gdGhpcy5nZXRNZXRhQXR0cmlidXRlVHlwZXMoKTtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHR5cGU6IHN0cmluZyA9IG1ldGFUeXBlc1thdHRyaWJ1dGVdPy5uYW1lO1xyXG4gICAgICAgIGxldCB2YWx1ZTogbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZyB8IG9iamVjdCB8IEZ1bmN0aW9uID0gX211dGF0b3JbYXR0cmlidXRlXTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCAmJiB0eXBlID09IHVuZGVmaW5lZClcclxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgdHlwZSA9ICg8R2VuZXJhbD50aGlzKVthdHRyaWJ1dGVdLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICB0eXBlID0gdmFsdWUubmFtZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdHlwZSA9IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XHJcblxyXG4gICAgICAgIHR5cGVzW2F0dHJpYnV0ZV0gPSB0eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgc3BlY2lmaWVkIHtAbGluayBNZXRhZGF0YS5hdHRyaWJ1dGVUeXBlcyB8IGF0dHJpYnV0ZSB0eXBlc30gZnJvbSB0aGUge0BsaW5rIE1ldGFkYXRhIHwgbWV0YWRhdGF9IG9mIHRoaXMgaW5zdGFuY2UncyBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1ldGFBdHRyaWJ1dGVUeXBlcygpOiBNZXRhQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSgpLmF0dHJpYnV0ZVR5cGVzID8/PSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBNZXRhZGF0YSB8IG1ldGFkYXRhfSBvZiB0aGlzIGluc3RhbmNlJ3MgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNZXRhZGF0YSgpOiBNZXRhZGF0YSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5tZXRhZGF0YV0gPz89IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtdXRhdG9yIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBSZWZsZWN0LmdldCh0aGlzLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpXHJcbiAgICAgICAgICB2YWx1ZS51cGRhdGVNdXRhdG9yKF9tdXRhdG9yW2F0dHJpYnV0ZV0pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIHRoZSBtdXRhdG9yLlxyXG4gICAgICogVGhlIG11dGF0aW9uIG1heSBiZSByZXN0cmljdGVkIHRvIGEgc3Vic2V0IG9mIHRoZSBtdXRhdG9yIGFuZCB0aGUgZXZlbnQgZGlzcGF0Y2hpbmcgc3VwcHJlc3NlZC5cclxuICAgICAqIFVzZXMgbXV0YXRlQmFzZSwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBzdWJjbGFzc2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIF9zZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoX2Rpc3BhdGNoTXV0YXRlKVxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFLCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBtdXRhdG9yOiBfbXV0YXRvciB9IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJhc2UgbWV0aG9kIGZvciBtdXRhdGlvbiwgYWx3YXlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzLiBEbyBub3Qgb3ZlcndyaXRlIGluIHN1YmNsYXNzZXMhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhc3luYyBtdXRhdGVCYXNlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBfbXV0YXRvcjtcclxuXHJcbiAgICAgIGlmIChfc2VsZWN0aW9uKSB7IC8vIFRPRE86IHRoaXMgZG9lc24ndCB3b3JrIGFzIGl0IGRvZXMgbm90IHJlY3Vyc2UgaW50byBvYmplY3RzXHJcbiAgICAgICAgbXV0YXRvciA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBfc2VsZWN0aW9uKSAvLyByZWR1Y2UgdGhlIG11dGF0b3IgdG8gdGhlIHNlbGVjdGlvblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3JbYXR0cmlidXRlXSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBtdXRhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFSZWZsZWN0Lmhhcyh0aGlzLCBhdHRyaWJ1dGUpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IG11dGFudDogT2JqZWN0ID0gUmVmbGVjdC5nZXQodGhpcywgYXR0cmlidXRlKTtcclxuICAgICAgICBsZXQgdmFsdWU6IE11dGF0b3IgPSA8TXV0YXRvcj5tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKG11dGFudCBpbnN0YW5jZW9mIE11dGFibGVBcnJheSB8fCBtdXRhbnQgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgYXdhaXQgbXV0YW50Lm11dGF0ZSh2YWx1ZSwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIGF0dHJpYnV0ZSwgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZHVjZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdlbmVyYWwgbXV0YXRvciBhY2NvcmRpbmcgdG8gZGVzaXJlZCBvcHRpb25zIGZvciBtdXRhdGlvbi4gVG8gYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xyXG4gICAgICogQHBhcmFtIF9tdXRhdG9yIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQ7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgZXhwb3J0IHR5cGUgR2VuZXJhbCA9IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9sZHMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlY3JlYXRlIGFuIG9iamVjdCBpZGVudGljYWwgdG8gdGhlIG9uZSBpdCBvcmlnaW5hdGVkIGZyb20uIFxyXG4gICAqIEEgc2VyaWFsaXphdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBjb3BpZXMgb2YgZXhpc3Rpbmcgb2JqZWN0cyBhdCBydW50aW1lIG9yIHRvIHN0b3JlIG9iamVjdHMgYXMgc3RyaW5ncyBvciByZWNyZWF0ZSB0aGVtLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphdGlvbiB7XHJcbiAgICBbdHlwZTogc3RyaW5nXTogR2VuZXJhbDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBvZiB0aGlzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb247XHJcbiAgICAvKipcclxuICAgICAqIFJlY3JlYXRlcyB0aGlzIGluc3RhbmNlIG9mIHtAbGluayBTZXJpYWxpemFibGV9IHdpdGggdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIHtAbGluayBTZXJpYWxpemF0aW9ufS5cclxuICAgICAqL1xyXG4gICAgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT47XHJcbiAgfVxyXG5cclxuICBpbnRlcmZhY2UgTmFtZXNwYWNlUmVnaXN0ZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE9iamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGV4dGVybmFsIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZiB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzLiBUaGUgaW50ZXJuYWwgcHJvY2VzcyBpcyBoYW5kbGVkIGJ5IHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuICBcclxuICAgKiBBIHtAbGluayBTZXJpYWxpemF0aW9ufSBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdCBhbmQgYSBKU09OLVN0cmluZyBtYXkgYmUgY3JlYXRlZCBmcm9tIHRoYXQuICBcclxuICAgKiBWaWNlIHZlcnNhLCBhIEpTT04tU3RyaW5nIGNhbiBiZSBwYXJzZWQgdG8gYSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gd2hpY2ggY2FuIGJlIGRlc2VyaWFsaXplZCB0byBhIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogIFtTZXJpYWxpemFibGVdIOKGkiAoc2VyaWFsaXplKSDihpIgW1NlcmlhbGl6YXRpb25dIOKGkiAoc3RyaW5naWZ5KSDihpIgW1N0cmluZ10g4oaSIChzYXZlIG9yIHNlbmQpXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaTICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgIFtTZXJpYWxpemFibGVdIOKGkCAoZGVzZXJpYWxpemUpIOKGkCBbU2VyaWFsaXphdGlvbl0g4oaQIChwYXJzZSkg4oaQIChsb2FkKSDihpAgW01lZGl1bV1cclxuICAgKiBgYGAgICAgICBcclxuICAgKiBXaGlsZSB0aGUgaW50ZXJuYWwgc2VyaWFsaXplL2Rlc2VyaWFsaXplIG1ldGhvZDFzIG9mIHRoZSBvYmplY3RzIGNhcmUgb2YgdGhlIHNlbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVjcmVhdGUgdGhlIG9iamVjdCBhbmQgaXRzIHN0cnVjdHVyZSwgIFxyXG4gICAqIHRoZSB7QGxpbmsgU2VyaWFsaXplcn0ga2VlcHMgdHJhY2sgb2YgdGhlIG5hbWVzcGFjZXMgYW5kIGNsYXNzZXMgaW4gb3JkZXIgdG8gcmVjcmVhdGUge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cy4gVGhlIGdlbmVyYWwgc3RydWN0dXJlIG9mIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IGlzIGFzIGZvbGxvd3MgIFxyXG4gICAqIGBgYHRleHRcclxuICAgKiB7XHJcbiAgICogICAgICBuYW1lc3BhY2VOYW1lLmNsYXNzTmFtZToge1xyXG4gICAqICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlWYWx1ZSxcclxuICAgKiAgICAgICAgICAuLi4sXHJcbiAgICogICAgICAgICAgcHJvcGVydHlOYW1lT2ZSZWZlcmVuY2U6IFNlcmlhbGl6YXRpb25PZlRoZVJlZmVyZW5jZWRPYmplY3QsXHJcbiAgICogICAgICAgICAgLi4uLFxyXG4gICAqICAgICAgICAgIGNvbnN0cnVjdG9yTmFtZU9mU3VwZXJjbGFzczogU2VyaWFsaXphdGlvbk9mU3VwZXJDbGFzc1xyXG4gICAqICAgICAgfVxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKiBTaW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHN1cGVyY2xhc3MgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWQsIFxyXG4gICAqIHRoZSBTZXJpYWxpemF0aW9uT2ZTdXBlckNsYXNzIG9taXRzIHRoZSB0aGUgbmFtZXNwYWNlTmFtZS5jbGFzc05hbWUga2V5IGFuZCBjb25zaXN0cyBvbmx5IG9mIGl0cyB2YWx1ZS4gXHJcbiAgICogVGhlIGNvbnN0cnVjdG9yTmFtZU9mU3VwZXJjbGFzcyBpcyBnaXZlbiBpbnN0ZWFkIGFzIGEgcHJvcGVydHkgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc3ViY2xhc3MuXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6ZXIge1xyXG4gICAgLyoqIEluIG9yZGVyIGZvciB0aGUgU2VyaWFsaXplciB0byBjcmVhdGUgY2xhc3MgaW5zdGFuY2VzLCBpdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZXMgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVzcGFjZXM6IE5hbWVzcGFjZVJlZ2lzdGVyID0geyBcIsaSXCI6IEZ1ZGdlQ29yZSB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlIHRvIHRoZSB7QGxpbmsgU2VyaWFsaXplcn0sIHRvIGVuYWJsZSBhdXRvbWF0aWMgaW5zdGFudGlhdGlvbiBvZiBjbGFzc2VzIGRlZmluZWQgd2l0aGluXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJOYW1lc3BhY2UoX25hbWVzcGFjZTogT2JqZWN0KTogc3RyaW5nIHtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBTZXJpYWxpemVyLm5hbWVzcGFjZXMpXHJcbiAgICAgICAgaWYgKFNlcmlhbGl6ZXIubmFtZXNwYWNlc1tuYW1lXSA9PSBfbmFtZXNwYWNlKVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWU7XHJcblxyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gU2VyaWFsaXplci5maW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZSwgd2luZG93KTtcclxuICAgICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIGZvciAobGV0IHBhcmVudE5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgICBuYW1lID0gU2VyaWFsaXplci5maW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZSwgU2VyaWFsaXplci5uYW1lc3BhY2VzW3BhcmVudE5hbWVdKTtcclxuICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBwYXJlbnROYW1lICsgXCIuXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICBpZiAoIW5hbWUpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTmFtZXNwYWNlIG5vdCBmb3VuZC4gTWF5YmUgcGFyZW50IG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZT9cIik7XHJcblxyXG4gICAgICBTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZV0gPSBfbmFtZXNwYWNlO1xyXG4gICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgamF2YXNjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemFibGUgRlVER0Utb2JqZWN0IGdpdmVuLFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHMgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcmVjb25zdHJ1Y3Rpb25cclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IEFuIG9iamVjdCB0byBzZXJpYWxpemUsIGltcGxlbWVudGluZyB0aGUge0BsaW5rIFNlcmlhbGl6YWJsZX0gaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKF9vYmplY3Q6IFNlcmlhbGl6YWJsZSk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICAvLyBUT0RPOiBzYXZlIHRoZSBuYW1lc3BhY2Ugd2l0aCB0aGUgY29uc3RydWN0b3JzIG5hbWVcclxuICAgICAgLy8gc2VyaWFsaXphdGlvbltfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWVdID0gX29iamVjdC5zZXJpYWxpemUoKTtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZyA9IHRoaXMuZ2V0RnVsbFBhdGgoX29iamVjdCk7XHJcbiAgICAgIGlmICghcGF0aClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWVzcGFjZSBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIG9yIHRoZSBjbGFzcyBub3QgZXhwb3J0ZWQ/YCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bcGF0aF0gPSBfb2JqZWN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgLy8gcmV0dXJuIF9vYmplY3Quc2VyaWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgRlVER0Utb2JqZWN0IHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHtAbGluayBTZXJpYWxpemF0aW9ufSBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Q6IFNlcmlhbGl6YWJsZTtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBsb29wIGNvbnN0cnVjdGVkIHNvbGVseSB0byBhY2Nlc3MgdHlwZS1wcm9wZXJ0eS4gT25seSBvbmUgZXhwZWN0ZWQhXHJcbiAgICAgICAgZm9yIChwYXRoIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgICByZWNvbnN0cnVjdCA9IFNlcmlhbGl6ZXIucmVjb25zdHJ1Y3QocGF0aCk7XHJcbiAgICAgICAgICByZWNvbnN0cnVjdCA9IGF3YWl0IHJlY29uc3RydWN0LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3BhdGhdKTtcclxuICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIGxldCBtZXNzYWdlOiBzdHJpbmcgPSBgRGVzZXJpYWxpemF0aW9uIG9mICR7cGF0aH0sICR7cmVjb25zdHJ1Y3QgPyBSZWZsZWN0LmdldChyZWNvbnN0cnVjdCwgXCJpZFJlc291cmNlXCIpIDogXCJcIn0gZmFpbGVkOiBgICsgX2Vycm9yO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gQXJyYXkgb2YgamF2YXNjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemFibGUgRlVER0Utb2JqZWN0cyBnaXZlbiBpbiB0aGUgYXJyYXksXHJcbiAgICAgKiBpbmNsdWRpbmcgYXR0YWNoZWQgY29tcG9uZW50cywgY2hpbGRyZW4sIHN1cGVyY2xhc3Mtb2JqZWN0cyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUFycmF5PFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF90eXBlOiBuZXcgKCkgPT4gVCwgX29iamVjdHM6IFNlcmlhbGl6YWJsZVtdKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uczogU2VyaWFsaXphdGlvbltdID0gW107XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmcgPSB0aGlzLmdldEZ1bGxQYXRoKG5ldyBfdHlwZSgpKTtcclxuICAgICAgaWYgKCFwYXRoKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmFtZXNwYWNlIG9mIHNlcmlhbGl6YWJsZSBvYmplY3Qgb2YgdHlwZSAke190eXBlLm5hbWV9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIG9yIHRoZSBjbGFzcyBub3QgZXhwb3J0ZWQ/YCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBvYmplY3Qgb2YgX29iamVjdHMpXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbnMucHVzaChvYmplY3Quc2VyaWFsaXplKCkpO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbltwYXRoXSA9IHNlcmlhbGl6YXRpb25zO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gQXJyYXkgb2YgRlVER0Utb2JqZWN0cyByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhcnJheSBvZiB7QGxpbmsgU2VyaWFsaXphdGlvbn1zIGdpdmVuLFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGVbXT4ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphYmxlczogU2VyaWFsaXphYmxlW10gPSBbXTtcclxuICAgICAgbGV0IGNvbnN0cnVjdDogbmV3ICgpID0+IFNlcmlhbGl6YWJsZTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb25zOiBTZXJpYWxpemF0aW9uW10gPSBbXTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBsb29wIGNvbnN0cnVjdGVkIHNvbGVseSB0byBhY2Nlc3MgdHlwZS1wcm9wZXJ0eS4gT25seSBvbmUgZXhwZWN0ZWQhXHJcbiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgY29uc3RydWN0ID0gU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcihwYXRoKTtcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25zID0gX3NlcmlhbGl6YXRpb25bcGF0aF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlc2VyaWFsaXphdGlvbiBmYWlsZWQ6IFwiICsgX2Vycm9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgc2VyaWFsaXphdGlvbiBvZiBzZXJpYWxpemF0aW9ucykge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemFibGU6IFNlcmlhbGl6YWJsZSA9IG5ldyBjb25zdHJ1Y3QoKTtcclxuICAgICAgICBhd2FpdCBzZXJpYWxpemFibGUuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgc2VyaWFsaXphYmxlcy5wdXNoKHNlcmlhbGl6YWJsZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemFibGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogaW1wbGVtZW50IHByZXR0aWZpZXIgdG8gbWFrZSBKU09OLVN0cmluZ2lmaWNhdGlvbiBvZiBzZXJpYWxpemF0aW9ucyBtb3JlIHJlYWRhYmxlLCBlLmcuIHBsYWNpbmcgeCwgeSBhbmQgeiBpbiBvbmUgbGluZVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmV0dGlmeSBhIEpTT04tU3RyaW5nLCB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUuXHJcbiAgICAgKiBub3QgaW1wbGVtZW50ZWQgeWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcHJldHRpZnkoX2pzb246IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBfanNvbjsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCwgaHVtYW4gcmVhZGFibGUgSlNPTi1TdHJpbmcsIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4ge0BsaW5rIFNlcmlhbGl6YXRpb259IHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHtAbGluayBTZXJpYWxpemVyfS5zZXJpYWxpemVcclxuICAgICAqIEBwYXJhbSBfc2VyaWFsaXphdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0cmluZ2lmeShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IHN0cmluZyB7XHJcbiAgICAgIC8vIGFkanVzdG1lbnRzIHRvIHNlcmlhbGl6YXRpb24gY2FuIGJlIG1hZGUgaGVyZSBiZWZvcmUgc3RyaW5naWZpY2F0aW9uLCBpZiBkZXNpcmVkXHJcbiAgICAgIGxldCBqc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShfc2VyaWFsaXphdGlvbiwgbnVsbCwgMik7XHJcbiAgICAgIGxldCBwcmV0dHk6IHN0cmluZyA9IFNlcmlhbGl6ZXIucHJldHRpZnkoanNvbik7XHJcbiAgICAgIHJldHVybiBwcmV0dHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gSlNPTi1TdHJpbmcuIFJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHtAbGluayBTZXJpYWxpemVyLmRlc2VyaWFsaXplfVxyXG4gICAgICogQHBhcmFtIF9qc29uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKF9qc29uOiBzdHJpbmcpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoX2pzb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIGRlZmluZWQgd2l0aCB0aGUgZnVsbCBwYXRoIGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlTmFtZShzKSBhbmQgdGhlIGNsYXNzTmFtZSBzZXBlcmF0ZWQgYnkgZG90cyguKSBcclxuICAgICAqIEBwYXJhbSBfcGF0aCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWNvbnN0cnVjdChfcGF0aDogc3RyaW5nKTogU2VyaWFsaXphYmxlIHtcclxuICAgICAgbGV0IGNvbnN0cnVjdG9yOiBuZXcgKCkgPT4gU2VyaWFsaXphYmxlID0gU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcihfcGF0aCk7XHJcbiAgICAgIGxldCByZWNvbnN0cnVjdGlvbjogU2VyaWFsaXphYmxlID0gbmV3IGNvbnN0cnVjdG9yKCk7XHJcbiAgICAgIHJldHVybiByZWNvbnN0cnVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGdldENvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF90eXBlOiBzdHJpbmcsIF9uYW1lc3BhY2U6IE9iamVjdCA9IEZ1ZGdlQ29yZSk6IG5ldyAoKSA9PiBUIHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgZ2l2ZW4gcGF0aCB0byBhIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29uc3RydWN0b3I8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oX3BhdGg6IHN0cmluZyk6IG5ldyAoKSA9PiBUIHtcclxuICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBfcGF0aC5zdWJzdHJpbmcoX3BhdGgubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcbiAgICAgIGxldCBuYW1lc3BhY2U6IE9iamVjdCA9IFNlcmlhbGl6ZXIuZ2V0TmFtZXNwYWNlKF9wYXRoKTtcclxuICAgICAgaWYgKCFuYW1lc3BhY2UpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25zdHJ1Y3RvciBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfcGF0aH0gbm90IGZvdW5kLiBNYXliZSB0aGUgbmFtZXNwYWNlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ/YCk7XHJcbiAgICAgIHJldHVybiAoPEdlbmVyYWw+bmFtZXNwYWNlKVt0eXBlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QsIGlmIGZvdW5kIGluIHRoZSByZWdpc3RlcmVkIG5hbWVzcGFjZXNcclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGdWxsUGF0aChfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IF9vYmplY3QuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgLy8gRGVidWcubG9nKFwiU2VhcmNoaW5nIG5hbWVzcGFjZSBvZjogXCIgKyB0eXBlTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IG5hbWVzcGFjZU5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgbGV0IGZvdW5kOiBHZW5lcmFsID0gKDxHZW5lcmFsPlNlcmlhbGl6ZXIubmFtZXNwYWNlcylbbmFtZXNwYWNlTmFtZV1bdHlwZU5hbWVdO1xyXG4gICAgICAgIGlmIChmb3VuZCAmJiBfb2JqZWN0IGluc3RhbmNlb2YgZm91bmQpXHJcbiAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlTmFtZSArIFwiLlwiICsgdHlwZU5hbWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Utb2JqZWN0IGRlZmluZWQgd2l0aGluIHRoZSBmdWxsIHBhdGgsIGlmIHJlZ2lzdGVyZWRcclxuICAgICAqIEBwYXJhbSBfcGF0aFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXROYW1lc3BhY2UoX3BhdGg6IHN0cmluZyk6IE9iamVjdCB7XHJcbiAgICAgIGxldCBuYW1lc3BhY2VOYW1lOiBzdHJpbmcgPSBfcGF0aC5zdWJzdHIoMCwgX3BhdGgubGFzdEluZGV4T2YoXCIuXCIpKTtcclxuICAgICAgcmV0dXJuIFNlcmlhbGl6ZXIubmFtZXNwYWNlc1tuYW1lc3BhY2VOYW1lXSB8fCBGdWRnZUNvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgbmFtZXNwYWNlLW9iamVjdCBpbiBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJlbnQtb2JqZWN0IChlLmcuIHdpbmRvdyksIGlmIHByZXNlbnRcclxuICAgICAqIEBwYXJhbSBfbmFtZXNwYWNlIFxyXG4gICAgICogQHBhcmFtIF9wYXJlbnQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGZpbmROYW1lc3BhY2VJbihfbmFtZXNwYWNlOiBPYmplY3QsIF9wYXJlbnQ6IE9iamVjdCk6IHN0cmluZyB7XHJcbiAgICAgIGZvciAobGV0IHByb3AgaW4gX3BhcmVudClcclxuICAgICAgICBpZiAoKDxHZW5lcmFsPl9wYXJlbnQpW3Byb3BdID09IF9uYW1lc3BhY2UpXHJcbiAgICAgICAgICByZXR1cm4gcHJvcDtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogR2VuZXJhbFtdKSA9PiBUO1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IChhYnN0cmFjdCkgY2xhc3MgaW1wbGVtZW50aW5nIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfSBmcm9tIGFueSBjbGFzcyB0aGF0IGltcGxlbWVudHMge0BsaW5rIFNlcmlhbGl6YWJsZVJlc291cmNlfSBieSBtaXhpbmcgaW4gdGhlIGZ1bmN0aW9uYWxpdHkgdG8gbG9hZCB0aGUgcmVzb3VyY2UgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlPj4oX2Jhc2U6IFRCYXNlKSB7IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgKi8gLy9kaXNhYmxlIGVzbGludCBiZWNhdXNlIG9ubHkgdHlwZSBpbmZlcmVuY2Ugc2VlbXMgdG8gYmUgYWJsZSB0byBoYW5kbGUgbWl4aW4gYWJzdHJhY3QgY2xhc3NlcyBjb3JyZWN0bHlcclxuICAgIGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgZXh0ZW5kcyBfYmFzZSBpbXBsZW1lbnRzIEZ1ZGdlQ29yZS5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsIHtcclxuICAgICAgcHVibGljIHVybDogUmVxdWVzdEluZm87XHJcblxyXG4gICAgICBwdWJsaWMgc3RhdHVzOiBSRVNPVVJDRV9TVEFUVVMgPSBSRVNPVVJDRV9TVEFUVVMuUEVORElORztcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IG9mIHRoaXMgcmVzb3VyY2UuIE9ubHkgdGhlIGRhdGEgbmVlZGVkIHRvIGxvYWQgaXQgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlIGlzIHNlcmlhbGl6ZWQgKFwidXJsXCIsIFwibmFtZVwiLCBcImlkUmVzb3VyY2VcIikuXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICB1cmw6IHRoaXMudXJsLnRvU3RyaW5nKClcclxuICAgICAgICB9OyBcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICAgIHRoaXMudXJsID0gX3NlcmlhbGl6YXRpb24udXJsO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYWJzdHJhY3QgbG9hZCgpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+O1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX2Jhc2UucHJvdG90eXBlIGluc3RhbmNlb2YgTXV0YWJsZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogTWl4aW4gdGhlIHtAbGluayBNdXRhYmxlfSBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzXHJcbiAgICAgICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gbWl4aW5NdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgJiBNdXRhYmxlPj4oX2Jhc2U6IFRCYXNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgICBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIF9iYXNlIHtcclxuICAgICAgICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB1bmRlZmluZWQgfHwgX211dGF0b3IubmFtZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgICAgICAgZGVsZXRlIF9tdXRhdG9yLnN0YXR1cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1peGluTXV0YWJsZVNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoPFRCYXNlICYgQ29uc3RydWN0b3I8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCAmIE11dGFibGU+PlNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwQ2xhc3NUb0NvbXBvbmVudHMge1xyXG4gICAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ29tcG9uZW50W107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgc2NlbmV0cmVlLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0dyYXBoXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZzsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIG5vZGUgYnkuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHRpbWVzdGFtcFVwZGF0ZTogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG5vZGVzIG9mIHRoZSB3aG9sZSBicmFuY2ggaW5jbHVkaW5nIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgKi9cclxuICAgIHB1YmxpYyBuTm9kZXNJbkJyYW5jaDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgZGltZW5zaW9ucyBlbmNsb3NpbmcgdGhlIGdlb21ldHJ5IG9mIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgaW4gdGhlIGJyYW5jaCAqL1xyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudDogTm9kZSB8IG51bGwgPSBudWxsOyAvLyBUaGUgcGFyZW50IG9mIHRoaXMgbm9kZS5cclxuICAgIHByaXZhdGUgY2hpbGRyZW46IE5vZGVbXSA9IFtdOyAvLyBhcnJheSBvZiBjaGlsZCBub2RlcyBhcHBlbmRlZCB0byB0aGlzIG5vZGUuXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IE1hcENsYXNzVG9Db21wb25lbnRzID0ge307XHJcbiAgICAvLyBwcml2YXRlIHRhZ3M6IHN0cmluZ1tdID0gW107IC8vIE5hbWVzIG9mIHRhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiAoVE9ETzogQXMgb2YgeWV0IG5vIGZ1bmN0aW9uYWxpdHkpXHJcbiAgICAvLyBwcml2YXRlIGxheWVyczogc3RyaW5nW10gPSBbXTsgLy8gTmFtZXMgb2YgdGhlIGxheWVycyB0aGlzIG5vZGUgaXMgb24uIChUT0RPOiBBcyBvZiB5ZXQgbm8gZnVuY3Rpb25hbGl0eSlcclxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGNhcHR1cmVzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI210eFdvcmxkSW52ZXJzZVVwZGF0ZWQ6IG51bWJlcjtcclxuICAgICNtdHhXb3JsZEludmVyc2U6IE1hdHJpeDR4NDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGEgbmFtZSBhbmQgaW5pdGlhbGl6ZXMgYWxsIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG11dGF0b3ItbGlrZSBwYXRoIHN0cmluZyB0byBnZXQgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyIG9yIG51bGwgaWYgbm8gcGF0aCBpcyBmb3VuZCBlLmcuOlxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogXCJub2RlL3BhcmVudC9jaGlsZHJlbi8xL2NvbXBvbmVudHMvQ29tcG9uZW50U2tlbGV0b24vMFwiXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVRIX0ZST01fVE8oX2Zyb206IE5vZGUgfCBDb21wb25lbnQsIF90bzogTm9kZSB8IENvbXBvbmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICBjb25zdCBmcm9tOiBOb2RlID0gX2Zyb20gaW5zdGFuY2VvZiBDb21wb25lbnQgPyBfZnJvbS5ub2RlIDogX2Zyb207XHJcbiAgICAgIGNvbnN0IHRvOiBOb2RlID0gX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50ID8gX3RvLm5vZGUgOiBfdG87XHJcbiAgICAgIGlmICghZnJvbSB8fCAhdG8pXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBmaW5kIHBhdGhzIHRvIGxvd2VzdCBjb21tb24gYW5jZXN0b3JcclxuICAgICAgbGV0IHBhdGhGcm9tOiBOb2RlW10gPSBmcm9tLmdldFBhdGgoKTtcclxuICAgICAgbGV0IHBhdGhUbzogTm9kZVtdID0gdG8uZ2V0UGF0aCgpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBudWxsO1xyXG4gICAgICB3aGlsZSAocGF0aEZyb20ubGVuZ3RoICYmIHBhdGhUby5sZW5ndGggJiYgcGF0aEZyb21bMF0gPT0gcGF0aFRvWzBdKSB7XHJcbiAgICAgICAgYW5jZXN0b3IgPSBwYXRoRnJvbS5zaGlmdCgpO1xyXG4gICAgICAgIHBhdGhUby5zaGlmdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhdGhUby51bnNoaWZ0KGFuY2VzdG9yKTtcclxuXHJcbiAgICAgIGlmICghYW5jZXN0b3IpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBsZXQgcGF0aFRvQW5jZXN0b3I6IHN0cmluZ1tdID0gcGF0aEZyb20ubWFwKF9ub2RlID0+IFwicGFyZW50XCIpOyAvLyBUT0RPOiB1c2UgXCJrZXlvZiBOb2RlXCIgYXMgdHlwZVxyXG4gICAgICBsZXQgcGF0aEZyb21BbmNlc3Rvcjogc3RyaW5nW10gPSBwYXRoVG9cclxuICAgICAgICAuZmxhdE1hcCgoX25vZGUsIF9pbmRleCwgX2FycmF5KSA9PiBbXCJjaGlsZHJlblwiLCBfbm9kZS5maW5kQ2hpbGQoX2FycmF5W19pbmRleCArIDFdKS50b1N0cmluZygpXSlcclxuICAgICAgICAuc2xpY2UoMCwgLTIpO1xyXG5cclxuICAgICAgaWYgKF9mcm9tIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhUb0FuY2VzdG9yLnVuc2hpZnQoXCJub2RlXCIpO1xyXG4gICAgICBpZiAoX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhGcm9tQW5jZXN0b3IucHVzaChcImNvbXBvbmVudHNcIiwgX3RvLnR5cGUsIHRvLmNvbXBvbmVudHNbX3RvLnR5cGVdLmluZGV4T2YoX3RvKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIHJldHVybiBwYXRoVG9BbmNlc3Rvci5jb25jYXQocGF0aEZyb21BbmNlc3Rvcikuam9pbihcIi9cIik7IC8vIFRPRE86IG9yIG1heWJlIHZhbGlkYXRlIHRoaXMgc3RyaW5nIHdpdGggbm9kZSBhbmQgY29tcG9uZW50IG9iamVjdHM/XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBOb2RlfSBvciB7QGxpbmsgQ29tcG9uZW50fSBmb3VuZCBhdCB0aGUgZ2l2ZW4gcGF0aCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBGSU5EPFQgPSBOb2RlIHwgQ29tcG9uZW50PihfZnJvbTogTm9kZSB8IENvbXBvbmVudCwgX3BhdGg6IHN0cmluZyk6IFQge1xyXG4gICAgICBpZiAoX3BhdGggPT0gXCJcIilcclxuICAgICAgICByZXR1cm4gPFQ+X2Zyb207XHJcblxyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBfcGF0aC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGxldCB0bzogR2VuZXJhbCA9IF9mcm9tO1xyXG5cclxuICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoICYmIHRvKVxyXG4gICAgICAgIHRvID0gUmVmbGVjdC5nZXQodG8sIHBhdGguc2hpZnQoKSk7XHJcblxyXG4gICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhpcyBub2RlcyB7QGxpbmsgQ29tcG9uZW50VHJhbnNmb3JtfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNtcFRyYW5zZm9ybSgpOiBDb21wb25lbnRUcmFuc2Zvcm0ge1xyXG4gICAgICByZXR1cm4gPENvbXBvbmVudFRyYW5zZm9ybT50aGlzLmdldENvbXBvbmVudHMoQ29tcG9uZW50VHJhbnNmb3JtKT8uWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhlIGxvY2FsIHtAbGluayBNYXRyaXg0eDR9IGF0dGFjaGVkIHRvIHRoaXMgbm9kZXMge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gIFxyXG4gICAgICogRmFpbHMgaWYgbm8ge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gaXMgYXR0YWNoZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhMb2NhbCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy5jbXBUcmFuc2Zvcm0/Lm10eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGRJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZEludmVyc2VVcGRhdGVkICE9IHRoaXMudGltZXN0YW1wVXBkYXRlKVxyXG4gICAgICAgIHRoaXMuI210eFdvcmxkSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG5cclxuICAgICAgdGhpcy4jbXR4V29ybGRJbnZlcnNlVXBkYXRlZCA9IHRoaXMudGltZXN0YW1wVXBkYXRlO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGF0dGFjaGVkIHRvIHRoaXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBuQ2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBub2RlIGFuZCBhbGwgZGVjZW5kYW50cyBpbiB0aGUgZ3JhcGggYmVsb3cgZm9yIGl0ZXJhdGlvblxyXG4gICAgICogSW5hY3RpdmUgbm9kZXMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIGNhbiBiZSBmaWx0ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgKiBnZXRJdGVyYXRvcihfYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgaWYgKCFfYWN0aXZlIHx8IHRoaXMuaXNBY3RpdmUpIHtcclxuICAgICAgICB5aWVsZCB0aGlzO1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXHJcbiAgICAgICAgICB5aWVsZCogY2hpbGQuZ2V0SXRlcmF0b3IoX2FjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGJlbG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlcmF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoaXMgbm9kZS4gSW5hY3RpdmUgbm9kZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSByZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IF9vbjtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBTY2VuZXRyZWVcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGVzIHBhcmVudCBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJlbnQoKTogTm9kZSB8IG51bGwge1xyXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjZXMgYmFjayB0aGUgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZSBhbmQgcmV0dXJucyB0aGUgZmlyc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuY2VzdG9yKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKGFuY2VzdG9yLmdldFBhcmVudCgpKVxyXG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCk7XHJcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNlcyB0aGUgaGllcmFyY2h5IHVwd2FyZHMgdG8gdGhlIGZpcnN0IGFuY2VzdG9yIGFuZCByZXR1cm5zIHRoZSBwYXRoIHRocm91Z2ggdGhlIGdyYXBoIHRvIHRoaXMgbm9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBOb2RlW10ge1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICBsZXQgcGF0aDogTm9kZVtdID0gW3RoaXNdO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgcGF0aC51bnNoaWZ0KGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpO1xyXG4gICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgY2hpbGQgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZChfaW5kZXg6IG51bWJlcik6IE5vZGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZHJlbigpOiBOb2RlW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zbGljZSgwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byBjaGlsZG5vZGVzIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWU6IHN0cmluZyk6IE5vZGVbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogTm9kZVtdID0gW107XHJcbiAgICAgIGZvdW5kID0gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKF9ub2RlOiBOb2RlKSA9PiBfbm9kZS5uYW1lID09IF9uYW1lKTtcclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2ltcGx5IGNhbGxzIHtAbGluayBhZGRDaGlsZH0uIFRoaXMgcmVmZXJlbmNlIGlzIGhlcmUgc29sZWx5IGJlY2F1c2UgYXBwZW5kQ2hpbGQgaXMgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIGluIERPTS5cclxuICAgICAqIFNlZSBhbmQgcHJlZmVyYWJseSB1c2Uge0BsaW5rIGFkZENoaWxkfVxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcGVuZENoaWxkOiAoX2NoaWxkOiBOb2RlKSA9PiB2b2lkID0gdGhpcy5hZGRDaGlsZDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYSBub2RlIHRvIHRoZSBsaXN0IG9mIGNoaWxkcmVuLCBpZiBub3QgYWxyZWFkeSBpblxyXG4gICAgICogQHRocm93cyBFcnJvciB3aGVuIHRyeWluZyB0byBhZGQgYW4gYW5jZXN0b3Igb2YgdGhpcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENoaWxkKF9jaGlsZDogTm9kZSk6IHZvaWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhIG5vZGUgdG8gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gYXQgdGhlIGdpdmVuIGluZGV4LiBJZiBpdCBpcyBhbHJlYWR5IGEgY2hpbGQsIGl0IGlzIG1vdmVkIHRvIHRoZSBuZXcgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleDogbnVtYmVyKTogdm9pZDtcclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5pbmNsdWRlcyhfY2hpbGQpICYmIF9pbmRleCA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLy8gX25vZGUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXNcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgaW5BdWRpb0dyYXBoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBncmFwaExpc3RlbmVkOiBOb2RlID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IpIHtcclxuICAgICAgICBhbmNlc3Rvci50aW1lc3RhbXBVcGRhdGUgPSAwO1xyXG4gICAgICAgIGluQXVkaW9HcmFwaCA9IGluQXVkaW9HcmFwaCB8fCAoYW5jZXN0b3IgPT0gZ3JhcGhMaXN0ZW5lZCk7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9yID09IF9jaGlsZClcclxuICAgICAgICAgIHRocm93IChuZXcgRXJyb3IoXCJDeWNsaWMgcmVmZXJlbmNlIHByb2hpYml0ZWQgaW4gbm9kZSBoaWVyYXJjaHksIGFuY2VzdG9ycyBtdXN0IG5vdCBiZSBhZGRlZCBhcyBjaGlsZHJlblwiKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcmV2aW91c1BhcmVudDogTm9kZSA9IF9jaGlsZC5wYXJlbnQ7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudCA9PSB0aGlzICYmIF9pbmRleCA+IHByZXZpb3VzUGFyZW50LmZpbmRDaGlsZChfY2hpbGQpKVxyXG4gICAgICAgIF9pbmRleC0tO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzUGFyZW50KVxyXG4gICAgICAgIHByZXZpb3VzUGFyZW50LnJlbW92ZUNoaWxkKF9jaGlsZCk7XHJcblxyXG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShfaW5kZXggPz8gdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIF9jaGlsZCk7XHJcbiAgICAgIF9jaGlsZC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICBfY2hpbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAoaW5BdWRpb0dyYXBoKVxyXG4gICAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGdpdmUgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDaGlsZChfY2hpbGQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfY2hpbGQpO1xyXG4gICAgICBpZiAoZm91bmQgPCAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIF9jaGlsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DSElMRF9SRU1PVkUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICAgIGlmICh0aGlzLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSkpXHJcbiAgICAgICAgX2NoaWxkLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUpKTtcclxuICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZm91bmQsIDEpO1xyXG4gICAgICBfY2hpbGQucGFyZW50ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUFsbENoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9yIC0xIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZENoaWxkKF9zZWFyY2g6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5pbmRleE9mKF9zZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBub2RlIHdpdGggYW5vdGhlciwgcHJlc2VydmluZyB0aGUgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDaGlsZChfcmVwbGFjZTogTm9kZSwgX3dpdGg6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfcmVwbGFjZSk7XHJcbiAgICAgIGlmIChmb3VuZCA8IDApXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgX3dpdGguZ2V0UGFyZW50KCk/LnJlbW92ZUNoaWxkKF93aXRoKTtcclxuICAgICAgdGhpcy5yZW1vdmVDaGlsZChfcmVwbGFjZSk7XHJcblxyXG4gICAgICB0aGlzLmFkZENoaWxkKF93aXRoLCBmb3VuZCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGltZXN0YW1wIG1hdGNoZXMgdGhlIGxhc3QgdXBkYXRlIHRpbWVzdGFtcCB0aGlzIG5vZGUgdW5kZXJ3ZW50LCBlbHNlIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1VwZGF0ZWQoX3RpbWVzdGFtcFVwZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAodGhpcy50aW1lc3RhbXBVcGRhdGUgPT0gX3RpbWVzdGFtcFVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGdpdmVuIG5vZGUsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGVsc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRGVzY2VuZGFudE9mKF9hbmNlc3RvcjogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgbm9kZTogTm9kZSA9IHRoaXM7XHJcbiAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT0gX2FuY2VzdG9yKVxyXG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcclxuICAgICAgcmV0dXJuIChub2RlICE9IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhIE11dGF0b3IgZnJvbSB7QGxpbmsgQW5pbWF0aW9ufSB0byBhbGwgaXRzIGNvbXBvbmVudHMgYW5kIHRyYW5zZmVycyBpdCB0byBpdHMgY2hpbGRyZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUFuaW1hdGlvbihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBpZiAoXCJjb21wb25lbnRzXCIgaW4gX211dGF0b3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudFR5cGUgaW4gX211dGF0b3IuY29tcG9uZW50cykge1xyXG4gICAgICAgICAgbGV0IGNvbXBvbmVudHNPZlR5cGU6IENvbXBvbmVudFtdID0gdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudFR5cGVdOyAvLyBUT0RPOiBhZGQgZXJyb3JzIGlmIG5vZGUgZG9lc24ndCBjb250YWluIHByb3BlcnR5XHJcbiAgICAgICAgICBsZXQgbXV0YXRvcnNGb3JUeXBlOiBNdXRhdG9yW10gPSBfbXV0YXRvci5jb21wb25lbnRzW2NvbXBvbmVudFR5cGVdO1xyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudHNPZlR5cGUgIT0gdW5kZWZpbmVkICYmIG11dGF0b3JzRm9yVHlwZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIG11dGF0b3JzRm9yVHlwZSkge1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudHNPZlR5cGVbaV0ubXV0YXRlKG11dGF0b3JzRm9yVHlwZVtpXSwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChcImNoaWxkcmVuXCIgaW4gX211dGF0b3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTmFtZSBpbiBfbXV0YXRvci5jaGlsZHJlbikge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgdGhpcy5nZXRDaGlsZHJlbkJ5TmFtZShjaGlsZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNoaWxkTm9kZS5hcHBseUFuaW1hdGlvbihfbXV0YXRvci5jaGlsZHJlbltjaGlsZE5hbWVdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIENvbXBvbmVudHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gdGhpcyBub2RlLCBpbmRlcGVuZGVudCBvZiB0eXBlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFsbENvbXBvbmVudHMoKTogQ29tcG9uZW50W10ge1xyXG4gICAgICBsZXQgYWxsOiBDb21wb25lbnRbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuY29tcG9uZW50cykge1xyXG4gICAgICAgIGFsbCA9IGFsbC5jb25jYXQodGhpcy5jb21wb25lbnRzW3R5cGVdKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRvIHRoaXMgbm9kZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRzPFQgZXh0ZW5kcyBDb21wb25lbnQ+KF9jbGFzczogbmV3ICgpID0+IFQpOiBUW10ge1xyXG4gICAgICByZXR1cm4gPFRbXT4odGhpcy5jb21wb25lbnRzW19jbGFzcy5uYW1lXSB8fCBbXSkuc2xpY2UoMCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNvbXBvbnRlbnQgZm91bmQgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRoaXMgbm9kZSBvciBudWxsLCBpZiBsaXN0IGlzIGVtcHR5IG9yIGRvZXNuJ3QgZXhpc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXBvbmVudDxUIGV4dGVuZHMgQ29tcG9uZW50PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCBsaXN0OiBUW10gPSA8VFtdPnRoaXMuY29tcG9uZW50c1tfY2xhc3MubmFtZV07XHJcbiAgICAgIGlmIChsaXN0KVxyXG4gICAgICAgIHJldHVybiBsaXN0WzBdO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGFjaCB0aGUgZ2l2ZW4gY29tcG9uZW50IHRvIHRoaXMgbm9kZS4gSWRlbnRpY2FsIHRvIHtAbGluayBhZGRDb21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdHRhY2goX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWRkQ29tcG9uZW50KF9jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgdG8gdGhpcyBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDb21wb25lbnQoX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfY29tcG9uZW50Lm5vZGUgPT0gdGhpcylcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGxldCBjbXBMaXN0OiBDb21wb25lbnRbXSA9IHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdO1xyXG4gICAgICBpZiAoY21wTGlzdCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdID0gW19jb21wb25lbnRdO1xyXG4gICAgICBlbHNlIGlmIChjbXBMaXN0Lmxlbmd0aCAmJiBfY29tcG9uZW50LmlzU2luZ2xldG9uKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7X2NvbXBvbmVudC50eXBlfSBpcyBtYXJrZWQgc2luZ2xldG9uIGFuZCBjYW4ndCBiZSBhdHRhY2hlZCwgbm8gbW9yZSB0aGFuIG9uZSBhbGxvd2VkYCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjbXBMaXN0LnB1c2goX2NvbXBvbmVudCk7XHJcblxyXG4gICAgICBfY29tcG9uZW50LmF0dGFjaFRvTm9kZSh0aGlzKTtcclxuICAgICAgX2NvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DT01QT05FTlRfQUREKSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuQ09NUE9ORU5UX0FERCwgeyBkZXRhaWw6IF9jb21wb25lbnQgfSkpOyAvLyBUT0RPOiBzZWUgaWYgdGhpcyBpcyBiZSBmZWFzYWJsZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgZnJvbSB0aGlzIG5vZGUuIElkZW50aWNhbCB0byB7QGxpbmsgcmVtb3ZlQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGV0YWNoKF9jb21wb25lbnQ6IENvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRvIHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNvbXBvbmVudHMoX2NsYXNzOiBuZXcgKCkgPT4gQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2V0Q29tcG9uZW50cyhfY2xhc3MpLmZvckVhY2goX2NvbXBvbmVudCA9PiB0aGlzLnJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29tcG9uZW50IGZyb20gdGhlIG5vZGUsIGlmIGl0IHdhcyBhdHRhY2hlZCwgYW5kIHNldHMgaXRzIHBhcmVudCB0byBudWxsLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgY29tcG9uZW50c09mVHlwZTogQ29tcG9uZW50W10gPSB0aGlzLmNvbXBvbmVudHNbX2NvbXBvbmVudC50eXBlXTtcclxuICAgICAgICBsZXQgZm91bmRBdDogbnVtYmVyID0gY29tcG9uZW50c09mVHlwZS5pbmRleE9mKF9jb21wb25lbnQpO1xyXG4gICAgICAgIGlmIChmb3VuZEF0IDwgMClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBfY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUpKTtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnRUb1RhcmdldE9ubHkobmV3IEN1c3RvbUV2ZW50KEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHsgZGV0YWlsOiBfY29tcG9uZW50IH0pKTsgLy8gVE9ETzogc2VlIGlmIHRoaXMgd291bGQgYmUgZmVhc2FibGVcclxuICAgICAgICBjb21wb25lbnRzT2ZUeXBlLnNwbGljZShmb3VuZEF0LCAxKTtcclxuICAgICAgICBfY29tcG9uZW50LmF0dGFjaFRvTm9kZShudWxsKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVtb3ZlIGNvbXBvbmVudCAnJHtfY29tcG9uZW50fSdpbiBub2RlIG5hbWVkICcke3RoaXMubmFtZX0nYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIFNlcmlhbGl6YXRpb25cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuYWN0aXZlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsZXQgY29tcG9uZW50czogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuY29tcG9uZW50cykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoID09IDApXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29tcG9uZW50c1t0eXBlXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHNbdHlwZV0pIHtcclxuICAgICAgICAgIC8vIGNvbXBvbmVudHNbdHlwZV0ucHVzaChjb21wb25lbnQuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgY29tcG9uZW50c1t0eXBlXS5wdXNoKFNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzZXJpYWxpemF0aW9uW1wiY29tcG9uZW50c1wiXSA9IGNvbXBvbmVudHM7XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChTZXJpYWxpemVyLnNlcmlhbGl6ZShjaGlsZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bXCJjaGlsZHJlblwiXSA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX1NFUklBTElaRUQpKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdGhpcy5wYXJlbnQgPSBpcyBzZXQgd2hlbiB0aGUgbm9kZXMgYXJlIGFkZGVkXHJcblxyXG4gICAgICAvLyBkZXNlcmlhbGl6ZSBjb21wb25lbnRzIGZpcnN0IHNvIHNjcmlwdHMgY2FuIHJlYWN0IHRvIGNoaWxkcmVuIGJlaW5nIGFwcGVuZGVkXHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gX3NlcmlhbGl6YXRpb24uY29tcG9uZW50cykge1xyXG4gICAgICAgIGZvciAobGV0IHNlcmlhbGl6ZWRDb21wb25lbnQgb2YgX3NlcmlhbGl6YXRpb24uY29tcG9uZW50c1t0eXBlXSkge1xyXG4gICAgICAgICAgbGV0IGRlc2VyaWFsaXplZENvbXBvbmVudDogQ29tcG9uZW50ID0gPENvbXBvbmVudD5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRDb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoZGVzZXJpYWxpemVkQ29tcG9uZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5jaGlsZHJlbilcclxuICAgICAgICBmb3IgKGxldCBzZXJpYWxpemVkQ2hpbGQgb2YgX3NlcmlhbGl6YXRpb24uY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGxldCBkZXNlcmlhbGl6ZWRDaGlsZDogTm9kZSA9IDxOb2RlPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZENoaWxkKTtcclxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZGVzZXJpYWxpemVkQ2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQpKTtcclxuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCkpO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgaWYgdGhpcyBpcyBhIGdvb2QgaWRlYVxyXG4gICAgICAvLyBjb25zdCBobmRHcmFwaERlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAvLyAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgeyBidWJibGVzOiBmYWxzZSB9KSk7XHJcbiAgICAgIC8vICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgLy8gfTtcclxuICAgICAgLy8gdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVELCBobmRHcmFwaERlc2VyaWFsaXplZCwgdHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlKF9zZXJpYWxpemF0aW9uLmFjdGl2ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyBhcyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9IaWVyYXJjaHlTdHJpbmcoX25vZGU6IE5vZGUgPSBudWxsLCBfbGV2ZWw6IG51bWJlciA9IDApOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiByZWZhY3RvciBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XHJcbiAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgX25vZGUgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gXCIrXCIucmVwZWF0KF9sZXZlbCk7XHJcblxyXG4gICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSBwcmVmaXggKyBcIiBcIiArIF9ub2RlLm5hbWUgKyBcIiB8IFwiO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIF9ub2RlLmNvbXBvbmVudHMpXHJcbiAgICAgICAgb3V0cHV0ICs9IF9ub2RlLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoICsgXCIgXCIgKyB0eXBlLnNwbGl0KFwiQ29tcG9uZW50XCIpLnBvcCgpICsgXCIsIFwiO1xyXG4gICAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMCwgLTIpICsgXCI8L2JyPlwiO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgIG91dHB1dCArPSB0aGlzLnRvSGllcmFyY2h5U3RyaW5nKGNoaWxkLCBfbGV2ZWwgKyAxKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNyZWdpb24gRXZlbnRzXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUuIFRoZSBnaXZlbiBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBtYXRjaGluZyBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5vZGUuXHJcbiAgICAgKiBEZXZpYXRpbmcgZnJvbSB0aGUgc3RhbmRhcmQgRXZlbnRUYXJnZXQsIGhlcmUgdGhlIF9oYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiBhbmQgX2NhcHR1cmUgaXMgdGhlIG9ubHkgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogRVZFTlQgfCBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX2NhcHR1cmU6IGJvb2xlYW4gLyp8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKi8gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGlzdExpc3RlbmVyczogTWFwRXZlbnRUeXBlVG9MaXN0ZW5lciA9IF9jYXB0dXJlID8gdGhpcy5jYXB0dXJlcyA6IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICBpZiAoIWxpc3RMaXN0ZW5lcnNbX3R5cGVdKVxyXG4gICAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdID0gW107XHJcbiAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdLnB1c2goX2hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIG5vZGUuIFRoZSBzaWduYXR1cmUgbXVzdCBtYXRjaCB0aGUgb25lIHVzZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBFVkVOVCB8IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfY2FwdHVyZTogYm9vbGVhbiAvKnwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMqLyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBsaXN0ZW5lcnNGb3JUeXBlOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gX2NhcHR1cmUgPyB0aGlzLmNhcHR1cmVzW190eXBlXSA6IHRoaXMubGlzdGVuZXJzW190eXBlXTtcclxuICAgICAgaWYgKGxpc3RlbmVyc0ZvclR5cGUpXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGlzdGVuZXJzRm9yVHlwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JUeXBlW2ldID09IF9oYW5kbGVyKVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNGb3JUeXBlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZSAoc3RhbmRhcmQ6IHJldHVybiB0cnVlIG9ubHkgaWYgZWl0aGVyIGV2ZW50J3MgY2FuY2VsYWJsZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZmFsc2Ugb3IgaXRzIHByZXZlbnREZWZhdWx0KCkgbWV0aG9kIHdhcyBub3QgaW52b2tlZClcclxuICAgICAqIFRoZSBldmVudCB0cmF2ZWxzIGludG8gdGhlIGhpZXJhcmNoeSB0byB0aGlzIG5vZGUgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50LCBpbnZva2luZyBtYXRjaGluZyBoYW5kbGVycyBvZiB0aGUgbm9kZXMgYW5jZXN0b3JzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZSwgXHJcbiAgICAgKiB0aGFuIHRoZSBtYXRjaGluZyBoYW5kbGVyIG9mIHRoZSB0YXJnZXQgbm9kZSBpbiB0aGUgdGFyZ2V0IHBoYXNlLCBhbmQgYmFjayBvdXQgb2YgdGhlIGhpZXJhcmNoeSBpbiB0aGUgYnViYmxpbmcgcGhhc2UsIGludm9raW5nIGFwcHJvcHJpYXRlIGhhbmRsZXJzIG9mIHRoZSBhbnZlc3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgYW5jZXN0b3JzOiBOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHVwY29taW5nOiBOb2RlID0gdGhpcztcclxuICAgICAgLy8gb3ZlcndyaXRlIGV2ZW50IHRhcmdldFxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcInRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgUmVmbGVjdCBpbnN0ZWFkIG9mIE9iamVjdCB0aHJvdWdob3V0LiBTZWUgYWxzbyBSZW5kZXIgYW5kIE11dGFibGUuLi5cclxuICAgICAgd2hpbGUgKHVwY29taW5nLnBhcmVudClcclxuICAgICAgICBhbmNlc3RvcnMucHVzaCh1cGNvbWluZyA9IHVwY29taW5nLnBhcmVudCk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwicGF0aFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEFycmF5PE5vZGU+KHRoaXMsIC4uLmFuY2VzdG9ycykgfSk7XHJcblxyXG4gICAgICAvLyBjYXB0dXJlIHBoYXNlXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQ0FQVFVSSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBhbmNlc3RvcnNbaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJjdXJyZW50VGFyZ2V0XCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhbmNlc3RvciB9KTtcclxuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMoYW5jZXN0b3IuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0YXJnZXQgcGhhc2VcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJldmVudFBoYXNlXCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBFdmVudC5BVF9UQVJHRVQgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKHRoaXMuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmNhbGxMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKCFfZXZlbnQuYnViYmxlcylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGJ1YmJsZSBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkJVQkJMSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gYW5jZXN0b3JzW2ldO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYW5jZXN0b3IgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKGFuY2VzdG9yLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7IC8vVE9ETzogcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSwgc2VlIGRvY3VtZW50YXRpb24gb2YgZGlzcGF0Y2ggZXZlbnRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQgd2l0aG91dCB0cmF2ZWxsaW5nIHRocm91Z2ggdGhlIGdyYXBoIGhpZXJhcmNoeSBuZWl0aGVyIGR1cmluZyBjYXB0dXJlIG5vciBidWJibGluZyBwaGFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShfZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQVRfVEFSR0VUIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImN1cnJlbnRUYXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuY2FsbExpc3RlbmVycyh0aGlzLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7IC8vIFRPRE86IGV4YW1pbmUgaWYgdGhpcyBzaG91bGQgZ28gdG8gdGhlIGNhcHR1cmVzIGluc3RlYWQgb2YgdGhlIGxpc3RlbmVyc1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIHN5bnRoZXRpYyBldmVudCB0byB0aGlzIG5vZGUgYW5kIGZyb20gdGhlcmUgdG8gYWxsIG5vZGVzIGRlZXBlciBpbiB0aGUgaGllcmFyY2h5LFxyXG4gICAgICogaW52b2tpbmcgbWF0Y2hpbmcgaGFuZGxlcnMgb2YgdGhlIG5vZGVzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZS4gV2F0Y2ggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBub2RlcyBpbnZvbHZlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnJvYWRjYXN0RXZlbnQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAvLyBvdmVyd3JpdGUgZXZlbnQgdGFyZ2V0IGFuZCBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkNBUFRVUklOR19QSEFTRSB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJ0YXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJyb2FkY2FzdEV2ZW50UmVjdXJzaXZlKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgLy8gY2FwdHVyZSBwaGFzZSBvbmx5XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgbGV0IGNhcHR1cmVzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gdGhpcy5jYXB0dXJlc1tfZXZlbnQudHlwZV07XHJcbiAgICAgIGlmIChjYXB0dXJlcykge1xyXG4gICAgICAgIGNhcHR1cmVzID0gWy4uLmNhcHR1cmVzXTsgLy8gY3JlYXRlIGEgY29weSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGhhbmRsZXJzIHRoYXQgZGV0YWNoIHRoZW1zZWx2ZXNcclxuICAgICAgICBmb3IgKGxldCBoYW5kbGVyIG9mIGNhcHR1cmVzKVxyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgaGFuZGxlcihfZXZlbnQpO1xyXG4gICAgICAgIC8vIGFwcGVhcnMgdG8gYmUgc2xvd2VyLCBhc3RvbmlzaGluZ2x5Li4uXHJcbiAgICAgICAgLy8gY2FwdHVyZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICAvLyAgICAgaGFuZGxlcihfZXZlbnQpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzYW1lIGZvciBjaGlsZHJlblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGQuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsbExpc3RlbmVycyhfbGlzdGVuZXJzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdLCBfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfbGlzdGVuZXJzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgX2xpc3RlbmVycylcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RyYW5zZmVyL1NlcmlhbGl6ZXIudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVHJhbnNmZXIvTXV0YWJsZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqIFxyXG4gICAqIFN1cGVyY2xhc3MgZm9yIGFsbCB7QGxpbmsgQ29tcG9uZW50fXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8ge0BsaW5rIE5vZGV9cy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMCB8IEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBHaXptbyB7XHJcbiAgICAvKiogc3ViY2xhc3NlcyBnZXQgYSBpU3ViY2xhc3MgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlcjtcclxuICAgIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIENvbXBvbmVudCA9IENvbXBvbmVudDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIENvbXBvbmVudFtdID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgYWN0aXZlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICNub2RlOiBOb2RlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCAoX2V2ZW50OiBDdXN0b21FdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLiNub2RlKSB7XHJcbiAgICAgICAgICAvLyBUT0RPOiBmaW5kIHRoZSBudW1iZXIgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGUgYXJyYXkgaWYgbm90IHNpbmdsZXRvblxyXG4gICAgICAgICAgX2V2ZW50LmRldGFpbC5jb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBfZXZlbnQuZGV0YWlsLmNvbXBvbmVudEluZGV4ID0gdGhpcy5ub2RlLmdldENvbXBvbmVudHModGhpcy5jb25zdHJ1Y3RvcikuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgIHRoaXMuI25vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJjbGFzczogdHlwZW9mIENvbXBvbmVudCk6IG51bWJlciB7IHJldHVybiBDb21wb25lbnQuc3ViY2xhc3Nlcy5wdXNoKF9zdWJjbGFzcykgLSAxOyB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdHJ1ZSwgd2hlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzIGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc1NpbmdsZXRvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBub2RlLCB0aGlzIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBub2RlKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSB0aGlzIGNvbXBvbmVudC4gSW5hY3RpdmUgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWN0aXZhdGUoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gX29uO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KF9vbiA/IEVWRU5ULkNPTVBPTkVOVF9BQ1RJVkFURSA6IEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmllcyB0byBhdHRhY2ggdGhlIGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gbm9kZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbm9kZSBpdCB3YXMgYXR0YWNoZWQgdG8gaWYgYXBwbGljYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoVG9Ob2RlKF9jb250YWluZXI6IE5vZGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNub2RlID09IF9jb250YWluZXIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcHJldmlvdXNDb250YWluZXI6IE5vZGUgPSB0aGlzLiNub2RlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChwcmV2aW91c0NvbnRhaW5lcilcclxuICAgICAgICAgIHByZXZpb3VzQ29udGFpbmVyLnJlbW92ZUNvbXBvbmVudCh0aGlzKTtcclxuICAgICAgICB0aGlzLiNub2RlID0gX2NvbnRhaW5lcjtcclxuICAgICAgICBpZiAodGhpcy4jbm9kZSlcclxuICAgICAgICAgIHRoaXMuI25vZGUuYWRkQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aGlzLiNub2RlID0gcHJldmlvdXNDb250YWluZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBmb3IgdGhpcyBjb21wb25lbnQgaW5zaWRlIHRoZSBlZGl0b3JzIHJlbmRlciB2aWV3LiBVc2Uge0BsaW5rIEdpem1vc30gaW5zaWRlIHRoZSBvdmVycmlkZSB0byBkcmF3IHN0dWZmLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcz8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIGRyYXdHaXptb3N9LiBPbmx5IGRpc3BsYXllZCB3aGlsZSB0aGUgY29ycmVzcG9uZGluZyBub2RlIGlzIHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkPyhfY21wQ2FtZXJhPzogQ29tcG9uZW50Q2FtZXJhKTogdm9pZDtcclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShfc2VyaWFsaXphdGlvbi5hY3RpdmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hY3RpdmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUoX211dGF0b3IuYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2luZ2xldG9uO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubXR4V29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogV3JhcHMgYSByZWd1bGFyIEphdmFzY3JpcHQgQXJyYXkgYW5kIG9mZmVycyB2ZXJ5IGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBnZWFyZWQgc29sZWx5IHRvd2FyZHMgYXZvaWRpbmcgZ2FyYmFnZSBjb2xsZXRpb24uXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVjeWNsZXJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVjeWNhYmxlQXJyYXk8VD4ge1xyXG4gICAgI2xlbmd0aDogbnVtYmVyID0gMDtcclxuICAgICNhcnJheTogQXJyYXk8VD4gPSBuZXcgQXJyYXk8VD4oKTtcclxuICAgIC8vICN0eXBlOiBuZXcgKCkgPT4gVDtcclxuXHJcbiAgICAvLyAvL3RzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcclxuICAgIC8vIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSB7XHJcbiAgICAvLyAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlydHVhbCBsZW5ndGggb2YgdGhlIGFycmF5IHRvIHplcm8gYnV0IGtlZXBzIHRoZSBlbnRyaWVzIGJleW9uZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNsZW5ndGggPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZSB0aGlzIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGEgbmV3IGVudHJ5IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCBhbmQgcmV0dXJucyB0aGUgbmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwdXNoKF9lbnRyeTogVCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aF0gPSBfZW50cnk7XHJcbiAgICAgIHRoaXMuI2xlbmd0aCsrO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgbGFzdCBlbnRyeSBmcm9tIHRoZSBhcnJheSBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvcCgpOiBUIHtcclxuICAgICAgdGhpcy4jbGVuZ3RoLS07XHJcbiAgICAgIHJldHVybiB0aGlzLiNhcnJheVt0aGlzLiNsZW5ndGhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb2xsb3dpbmcgdGhlIGxhc3QgaW4gdGhlIGFycmF5IGFuZCBpbmNyZWFzZXMgdGhlIGFycmF5IGxlbmd0aFxyXG4gICAgICogSXQgbXVzdCBiZSBhc3N1cmVkLCB0aGF0IG5vbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5IGlzIHN0aWxsIGluIGFueSB1c2Ugb2YgYW55IGtpbmQhXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyByZWN5Y2xlKCk6IFQge1xyXG4gICAgLy8gICBpZiAodGhpcy4jbGVuZ3RoIDwgdGhpcy4jYXJyYXkubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgdGhpcy4jbGVuZ3RoKys7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aCsrXTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLiNhcnJheS5wdXNoKFJlY3ljbGVyLmdldCh0aGlzLiN0eXBlKSk7XHJcbiAgICAvLyAgIHJldHVybiB0aGlzLiNhcnJheVt0aGlzLiNsZW5ndGgrK107XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuI2xlbmd0aDsgaSsrKVxyXG4gICAgICAgIHlpZWxkIHRoaXMuI2FycmF5W2ldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGFycmF5IHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBhcmUgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNvcnRlZChfc29ydDogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IFRbXSB7XHJcbiAgICAgIGxldCBzb3J0ZWQ6IFRbXSA9IHRoaXMuI2FycmF5LnNsaWNlKDAsIHRoaXMuI2xlbmd0aCk7XHJcbiAgICAgIHNvcnRlZC5zb3J0KF9zb3J0KTtcclxuICAgICAgcmV0dXJuIHNvcnRlZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIHtAbGluayBSZW5kZXJJbmplY3RvckNvYXR9IGFuZCB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciB3aXRoIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBnaXZlbiBpbmplY3Rvci4gTmFtZSBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RvciBtZXRob2QgbXVzdCBtYXRjaC5cclxuICAgICAqIFVzZWQgaW4gc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGluamVjdChfY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBfaW5qZWN0b3I6IHR5cGVvZiBSZW5kZXJJbmplY3Rvcik6IHZvaWQge1xyXG4gICAgICBsZXQgaW5qZWN0aW9uOiBGdW5jdGlvbiA9IFJlZmxlY3QuZ2V0KF9pbmplY3RvciwgXCJpbmplY3RcIiArIF9jb25zdHJ1Y3Rvci5uYW1lKTtcclxuICAgICAgaWYgKCFpbmplY3Rpb24pIHtcclxuICAgICAgICBEZWJ1Zy5lcnJvcihcIk5vIGluamVjdGlvbiBkZWNvcmF0b3IgZGVmaW5lZCBmb3IgXCIgKyBfY29uc3RydWN0b3IubmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyRGF0YVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IGluamVjdGlvblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBTaGFkZXJ9XHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yU2hhZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiB7QGxpbmsgU2hhZGVyfS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJ1c2VQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIudXNlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJkZWxldGVQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIuZGVsZXRlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJjcmVhdGVQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIuY3JlYXRlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIHByb2dyYW0gdG8gdXNlIGFzIHRoZSBhY3RpdmUgcHJvZ3JhbSBpbiBXZWJHTFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucHJvZ3JhbSlcclxuICAgICAgICB0aGlzLmNyZWF0ZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhpcyBwcm9ncmFtIGZyb20gV2ViR0wsIGNsZWFyaW5nIHRoZSB1c2VkIG1lbW9yeSBvbiB0aGUgR1BVLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgaWYgKHRoaXMucHJvZ3JhbSkge1xyXG4gICAgICAgIGNyYzMuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudW5pZm9ybXM7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvZ3JhbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiQ3JlYXRlIHNoYWRlciBwcm9ncmFtXCIsIHRoaXMubmFtZSk7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBsZXQgcHJvZ3JhbTogV2ViR0xQcm9ncmFtID0gY3JjMy5jcmVhdGVQcm9ncmFtKCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBzaGRWZXJ0ZXg6IFdlYkdMU2hhZGVyID0gY29tcGlsZVNoYWRlcih0aGlzLmdldFZlcnRleFNoYWRlclNvdXJjZSgpLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlZFUlRFWF9TSEFERVIpO1xyXG4gICAgICAgIGxldCBzaGRGcmFnbWVudDogV2ViR0xTaGFkZXIgPSBjb21waWxlU2hhZGVyKHRoaXMuZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFHTUVOVF9TSEFERVIpO1xyXG5cclxuICAgICAgICBjcmMzLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xTaGFkZXI+KHNoZFZlcnRleCkpO1xyXG4gICAgICAgIGNyYzMuYXR0YWNoU2hhZGVyKHByb2dyYW0sIFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFNoYWRlcj4oc2hkRnJhZ21lbnQpKTtcclxuICAgICAgICBjcmMzLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IFJlbmRlcldlYkdMLmFzc2VydDxzdHJpbmc+KGNyYzMuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xyXG4gICAgICAgIGlmIChlcnJvciAhPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgbGlua2luZyBTaGFkZXI6IFwiICsgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBkZXRlY3RBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IGRldGVjdFVuaWZvcm1zKCk7XHJcblxyXG4gICAgICAgIGxldCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkxJR0hUUy5OQU1FKTtcclxuICAgICAgICBpZiAoYmxvY2tJbmRleCAhPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LklOVkFMSURfSU5ERVgpXHJcbiAgICAgICAgICBjcmMzLnVuaWZvcm1CbG9ja0JpbmRpbmcocHJvZ3JhbSwgYmxvY2tJbmRleCwgVU5JRk9STV9CTE9DS1MuTElHSFRTLkJJTkRJTkcpO1xyXG5cclxuICAgICAgICBibG9ja0luZGV4ID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5TS0lOLk5BTUUpO1xyXG4gICAgICAgIGlmIChibG9ja0luZGV4ICE9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5WQUxJRF9JTkRFWClcclxuICAgICAgICAgIGNyYzMudW5pZm9ybUJsb2NrQmluZGluZyhwcm9ncmFtLCBibG9ja0luZGV4LCBVTklGT1JNX0JMT0NLUy5TS0lOLkJJTkRJTkcpO1xyXG5cclxuICAgICAgICBibG9ja0luZGV4ID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5GT0cuTkFNRSk7XHJcbiAgICAgICAgaWYgKGJsb2NrSW5kZXggIT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5JTlZBTElEX0lOREVYKVxyXG4gICAgICAgICAgY3JjMy51bmlmb3JtQmxvY2tCaW5kaW5nKHByb2dyYW0sIGJsb2NrSW5kZXgsIFVOSUZPUk1fQkxPQ0tTLkZPRy5CSU5ESU5HKTtcclxuXHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIoX3NoYWRlckNvZGU6IHN0cmluZywgX3NoYWRlclR5cGU6IEdMZW51bSk6IFdlYkdMU2hhZGVyIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHdlYkdMU2hhZGVyOiBXZWJHTFNoYWRlciA9IGNyYzMuY3JlYXRlU2hhZGVyKF9zaGFkZXJUeXBlKTtcclxuICAgICAgICBjcmMzLnNoYWRlclNvdXJjZSh3ZWJHTFNoYWRlciwgX3NoYWRlckNvZGUpO1xyXG4gICAgICAgIGNyYzMuY29tcGlsZVNoYWRlcih3ZWJHTFNoYWRlcik7XHJcbiAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8c3RyaW5nPihjcmMzLmdldFNoYWRlckluZm9Mb2cod2ViR0xTaGFkZXIpKTtcclxuICAgICAgICBpZiAoZXJyb3IgIT09IFwiXCIpIHtcclxuICAgICAgICAgIERlYnVnLmxvZyhfc2hhZGVyQ29kZSk7XHJcblxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29tcGlsaW5nIHNoYWRlcjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhbnkgY29tcGlsYXRpb24gZXJyb3JzLlxyXG4gICAgICAgIGlmICghY3JjMy5nZXRTaGFkZXJQYXJhbWV0ZXIod2ViR0xTaGFkZXIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09NUElMRV9TVEFUVVMpKSB7XHJcbiAgICAgICAgICBhbGVydChjcmMzLmdldFNoYWRlckluZm9Mb2cod2ViR0xTaGFkZXIpKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd2ViR0xTaGFkZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRldGVjdEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH0ge1xyXG4gICAgICAgIGxldCBkZXRlY3RlZEF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUNvdW50OiBudW1iZXIgPSBjcmMzLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BQ1RJVkVfQVRUUklCVVRFUyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50OyBpKyspIHtcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVJbmZvOiBXZWJHTEFjdGl2ZUluZm8gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xBY3RpdmVJbmZvPihjcmMzLmdldEFjdGl2ZUF0dHJpYihwcm9ncmFtLCBpKSk7XHJcbiAgICAgICAgICBpZiAoIWF0dHJpYnV0ZUluZm8pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZGV0ZWN0ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZm8ubmFtZV0gPSBjcmMzLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGF0dHJpYnV0ZUluZm8ubmFtZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGV0ZWN0ZWRBdHRyaWJ1dGVzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZXRlY3RVbmlmb3JtcygpOiB7IFtuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB9IHtcclxuICAgICAgICBsZXQgZGV0ZWN0ZWRVbmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfSA9IHt9O1xyXG4gICAgICAgIGxldCB1bmlmb3JtQ291bnQ6IG51bWJlciA9IGNyYzMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFDVElWRV9VTklGT1JNUyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHVuaWZvcm1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgaW5mbzogV2ViR0xBY3RpdmVJbmZvID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQWN0aXZlSW5mbz4oY3JjMy5nZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGkpKTtcclxuICAgICAgICAgIGlmICghaW5mbykge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24gPSBjcmMzLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBpbmZvLm5hbWUpO1xyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uKVxyXG4gICAgICAgICAgICBkZXRlY3RlZFVuaWZvcm1zW2luZm8ubmFtZV0gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xVbmlmb3JtTG9jYXRpb24+KGxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRldGVjdGVkVW5pZm9ybXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBDb2F0fVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvckNvYXQgZXh0ZW5kcyBSZW5kZXJJbmplY3RvciB7XHJcbiAgICAvKipcclxuICAgICAqIEluamVjdHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBjbGFzcyBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4ge0BsaW5rIENvYXR9LXN1YmNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbiwgX2NvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3Rvci5pbmplY3QoX2NvbnN0cnVjdG9yLCBSZW5kZXJJbmplY3RvckNvYXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdENvbG9yZWQodGhpczogQ29hdENvbG9yZWQsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gX3NoYWRlci51bmlmb3Jtc1tcInVfdmN0Q29sb3JcIl07XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5QUk9EVUNUKHRoaXMuY29sb3IsIF9jbXBNYXRlcmlhbC5jbHJQcmltYXJ5KTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm00ZnYodW5pZm9ybSwgY29sb3IuZ2V0KCkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0UmVtaXNzaXZlKHRoaXM6IENvYXRSZW1pc3NpdmUsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRDb2xvcmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfZkRpZmZ1c2VcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5kaWZmdXNlKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZNZXRhbGxpY1wiXTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm0xZih1bmlmb3JtLCB0aGlzLm1ldGFsbGljKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZTcGVjdWxhclwiXTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm0xZih1bmlmb3JtLCB0aGlzLnNwZWN1bGFyKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZJbnRlbnNpdHlcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5pbnRlbnNpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFRleHR1cmVkKHRoaXM6IENvYXRUZXh0dXJlZCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdENvbG9yZWQuY2FsbCh0aGlzLCBfc2hhZGVyLCBfY21wTWF0ZXJpYWwpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZS51c2VSZW5kZXJEYXRhKFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5JTkRFWCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDNmdihfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhQaXZvdFwiXSwgZmFsc2UsIF9jbXBNYXRlcmlhbC5tdHhQaXZvdC5nZXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0UmVtaXNzaXZlVGV4dHVyZWQodGhpczogQ29hdFJlbWlzc2l2ZVRleHR1cmVkLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4UGl2b3RcIl0sIGZhbHNlLCBfY21wTWF0ZXJpYWwubXR4UGl2b3QuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyh0aGlzOiBDb2F0UmVtaXNzaXZlVGV4dHVyZWROb3JtYWxzLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlVGV4dHVyZWQuY2FsbCh0aGlzLCBfc2hhZGVyLCBfY21wTWF0ZXJpYWwpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIHRoaXMubm9ybWFsTWFwLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5OT1JNQUwuVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5OT1JNQUwuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uTk9STUFMLklOREVYKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUb29uKHRoaXM6IENvYXRUb29uLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleFRvb24udXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLlRPT04uVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLlRPT04uSU5ERVgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFRvb25UZXh0dXJlZCh0aGlzOiBDb2F0VG9vbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleFRvb24udXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLlRPT04uVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLlRPT04uSU5ERVgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBNZXNofSBpbnRvIGEgV2ViR0wgQnVmZmVyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yTWVzaCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBNZXNofS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyQnVmZmVyc1wiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yTWVzaC51c2VSZW5kZXJCdWZmZXJzXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRSZW5kZXJCdWZmZXJzXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JNZXNoLmdldFJlbmRlckJ1ZmZlcnNcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckJ1ZmZlcnNcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3Rvck1lc2guZGVsZXRlUmVuZGVyQnVmZmVyc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldFJlbmRlckJ1ZmZlcnModGhpczogTWVzaCk6IFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzID0ge1xyXG4gICAgICAgICAgdmVydGljZXM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnZlcnRpY2VzKSxcclxuICAgICAgICAgIGluZGljZXM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guaW5kaWNlcyksXHJcbiAgICAgICAgICBub3JtYWxzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5ub3JtYWxzKSxcclxuICAgICAgICAgIHRleHR1cmVVVnM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnRleHR1cmVVVnMpLFxyXG4gICAgICAgICAgY29sb3JzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5jb2xvcnMpLFxyXG4gICAgICAgICAgdGFuZ2VudHM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnRhbmdlbnRzKSxcclxuICAgICAgICAgIG5JbmRpY2VzOiB0aGlzLnJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGhcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLmJvbmVzKVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMuYm9uZXMgPSBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5ib25lcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlck1lc2gud2VpZ2h0cylcclxuICAgICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzLndlaWdodHMgPSBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC53ZWlnaHRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyKF90eXBlOiBHTGVudW0sIF9hcnJheTogRmxvYXQzMkFycmF5IHwgVWludDE2QXJyYXkgfCBVaW50OEFycmF5KTogV2ViR0xCdWZmZXIge1xyXG4gICAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xCdWZmZXI+KGNyYzMuY3JlYXRlQnVmZmVyKCkpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlcihfdHlwZSwgYnVmZmVyKTtcclxuICAgICAgICBjcmMzLmJ1ZmZlckRhdGEoX3R5cGUsIF9hcnJheSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEFUSUNfRFJBVyk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdXNlUmVuZGVyQnVmZmVycyh0aGlzOiBNZXNoLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCwgX210eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCwgX2lkPzogbnVtYmVyKTogUmVuZGVyQnVmZmVycyB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBsZXQgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IHRoaXMuZ2V0UmVuZGVyQnVmZmVycygpO1xyXG5cclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1ZpZXdcIl07XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDRmdih1bmlmb3JtLCBmYWxzZSwgX210eE1lc2hUb1ZpZXcuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1dvcmxkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9tdHhNZXNoVG9Xb3JsZC5nZXQoKSk7XHJcblxyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4Tm9ybWFsTWVzaFRvV29ybGRcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKSB7XHJcbiAgICAgICAgbGV0IG5vcm1hbE1hdHJpeDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlRSQU5TUE9TRShNYXRyaXg0eDQuSU5WRVJTRShfbXR4TWVzaFRvV29ybGQpKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIG5vcm1hbE1hdHJpeC5nZXQoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGZlZWQgaW4gYW4gaWQgb2YgdGhlIG5vZGUgaWYgc2hhZGVyIGFjY2VwdHMgdV9pZC4gVXNlZCBmb3IgcGlja2luZ1xyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfaWRcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKVxyXG4gICAgICAgIGNyYzMudW5pZm9ybTFpKHVuaWZvcm0sIF9pZCk7XHJcblxyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdFBvc2l0aW9uXCIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMsIDMpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdENvbG9yXCIsIHJlbmRlckJ1ZmZlcnMuY29sb3JzLCA0KTtcclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RUZXh0dXJlXCIsIHJlbmRlckJ1ZmZlcnMudGV4dHVyZVVWcywgMik7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0Tm9ybWFsXCIsIHJlbmRlckJ1ZmZlcnMubm9ybWFscywgMyk7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0VGFuZ2VudFwiLCByZW5kZXJCdWZmZXJzLnRhbmdlbnRzLCA0KTtcclxuXHJcbiAgICAgIGNvbnN0IGFCb25lOiBudW1iZXIgPSBfc2hhZGVyLmF0dHJpYnV0ZXNbXCJhX3ZjdEJvbmVzXCJdO1xyXG4gICAgICBpZiAoYUJvbmUpIHtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHJlbmRlckJ1ZmZlcnMuYm9uZXMpO1xyXG4gICAgICAgIGNyYzMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYUJvbmUpO1xyXG4gICAgICAgIGNyYzMudmVydGV4QXR0cmliSVBvaW50ZXIoYUJvbmUsIDQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSwgMCwgMCk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RXZWlnaHRzXCIsIHJlbmRlckJ1ZmZlcnMud2VpZ2h0cywgNCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgcmVuZGVyQnVmZmVycy5pbmRpY2VzKTtcclxuXHJcbiAgICAgIHJldHVybiByZW5kZXJCdWZmZXJzO1xyXG5cclxuICAgICAgZnVuY3Rpb24gc2V0QXR0cmlidXRlQnVmZmVyKF9uYW1lOiBzdHJpbmcsIF9idWZmZXI6IFdlYkdMQnVmZmVyLCBfc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW19uYW1lXTtcclxuICAgICAgICBpZiAoYXR0cmlidXRlID09IHVuZGVmaW5lZClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIF9idWZmZXIpO1xyXG4gICAgICAgIGNyYzMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmlidXRlKTtcclxuICAgICAgICBjcmMzLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlLCBfc2l6ZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GTE9BVCwgZmFsc2UsIDAsIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJCdWZmZXJzKF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAoX3JlbmRlckJ1ZmZlcnMpIHtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIG51bGwpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgICAgICBPYmplY3QudmFsdWVzKF9yZW5kZXJCdWZmZXJzKS5maWx0ZXIoX2J1ZmZlciA9PiBfYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXIpLmZvckVhY2goKF9idWZmZXIsIF9pbmRleCkgPT4ge1xyXG4gICAgICAgICAgY3JjMy5kZWxldGVCdWZmZXIoX2J1ZmZlcik7XHJcbiAgICAgICAgICBjcmMzLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShfaW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBuYW1lc3BhY2UgUGFydGljbGVEYXRhIHtcclxuXHJcbiAgICBleHBvcnQgZW51bSBGVU5DVElPTiB7XHJcbiAgICAgIC8vIFZBTFVFID0gXCJ2YWx1ZVwiLFxyXG4gICAgICBBRERJVElPTiA9IFwiYWRkaXRpb25cIixcclxuICAgICAgU1VCVFJBQ1RJT04gPSBcInN1YnRyYWN0aW9uXCIsXHJcbiAgICAgIE1VTFRJUExJQ0FUSU9OID0gXCJtdWx0aXBsaWNhdGlvblwiLFxyXG4gICAgICBESVZJU0lPTiA9IFwiZGl2aXNpb25cIixcclxuICAgICAgTU9EVUxPID0gXCJtb2R1bG9cIixcclxuICAgICAgUE9XRVIgPSBcInBvd2VyXCIsXHJcbiAgICAgIFBPTFlOT01JQUwzID0gXCJwb2x5bm9taWFsM1wiLFxyXG4gICAgICBTUVVBUkVfUk9PVCA9IFwic3F1YXJlUm9vdFwiLFxyXG4gICAgICBSQU5ET00gPSBcInJhbmRvbVwiLFxyXG4gICAgICBSQU5ET01fUkFOR0UgPSBcInJhbmRvbVJhbmdlXCJcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY29uc3QgRlVOQ1RJT05fTUlOSU1VTV9QQVJBTUVURVJTOiB7IFtrZXkgaW4gUGFydGljbGVEYXRhLkZVTkNUSU9OXTogbnVtYmVyIH0gPSB7XHJcbiAgICAgIC8vIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uVkFMVUVdOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLkFERElUSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5TVUJUUkFDVElPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTVVMVElQTElDQVRJT05dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLkRJVklTSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5NT0RVTE9dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPV0VSXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5QT0xZTk9NSUFMM106IDUsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1FVQVJFX1JPT1RdOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV06IDAsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUkFORE9NX1JBTkdFXTogMlxyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnQgY29uc3QgUFJFREVGSU5FRF9WQVJJQUJMRVM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgIHN5c3RlbUR1cmF0aW9uOiBcInVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb25cIixcclxuICAgICAgc3lzdGVtU2l6ZTogXCJ1X2ZQYXJ0aWNsZVN5c3RlbVNpemVcIixcclxuICAgICAgc3lzdGVtVGltZTogXCJ1X2ZQYXJ0aWNsZVN5c3RlbVRpbWVcIixcclxuICAgICAgcGFydGljbGVJZDogXCJmUGFydGljbGVJZFwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGlsZXMgcGFydGljbGUgc3lzdGVtIHNoYWRlcnMgKHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0pIGZyb20gc2hhZGVyIHVuaXZlcnNhbCBkZXJpdmF0ZXMgZm9yIFdlYkdMXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0gZXh0ZW5kcyBSZW5kZXJJbmplY3RvclNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZVTkNUSU9OUzogeyBba2V5IGluIFBhcnRpY2xlRGF0YS5GVU5DVElPTl06IEZ1bmN0aW9uIH0gPSB7XHJcbiAgICAgIC8vIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uVkFMVUVdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIC8vICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVyc1swXX0pYDtcclxuICAgICAgLy8gfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5BRERJVElPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICsgJHtfdmFsdWV9YCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1VCVFJBQ1RJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVycy5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfdmFsdWU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfSAtICR7X3ZhbHVlfWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1VTFRJUExJQ0FUSU9OXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn0gKiAke192YWx1ZX1gKX0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5ESVZJU0lPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzWzBdfSAvICR7X3BhcmFtZXRlcnNbMV19KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTU9EVUxPXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGBtb2QoJHtfYWNjdW11bGF0b3J9LCAke192YWx1ZX0pYCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9XRVJdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGBwb3coJHtfcGFyYW1ldGVyc1swXX0sICR7X3BhcmFtZXRlcnNbMV19KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9MWU5PTUlBTDNdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgbGV0IHg6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzBdO1xyXG4gICAgICAgIGxldCBhOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1sxXTtcclxuICAgICAgICBsZXQgYjogc3RyaW5nID0gX3BhcmFtZXRlcnNbMl07XHJcbiAgICAgICAgbGV0IGM6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzNdO1xyXG4gICAgICAgIGxldCBkOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1s0XTtcclxuICAgICAgICByZXR1cm4gYCgke2F9ICogcG93KCR7eH0sIDMuMCkgKyAke2J9ICogcG93KCR7eH0sIDIuMCkgKyAke2N9ICogJHt4fSArICR7ZH0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5TUVVBUkVfUk9PVF06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBsZXQgeDogc3RyaW5nID0gX3BhcmFtZXRlcnNbMF07XHJcbiAgICAgICAgcmV0dXJuIGBzcXJ0KCR7eH0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGBmZXRjaFJhbmRvbU51bWJlcigkeyhSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLnJhbmRvbU51bWJlckluZGV4T2Zmc2V0KyspLnRvRml4ZWQoMCl9LCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZSwgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aClgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV9SQU5HRV06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke1JlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TW1wicmFuZG9tXCJdKCl9ICogKCR7X3BhcmFtZXRlcnNbMV19IC0gJHtfcGFyYW1ldGVyc1swXX0pICsgJHtfcGFyYW1ldGVyc1swXX0pYDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyByYW5kb21OdW1iZXJJbmRleE9mZnNldDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuZGVjb3JhdGUoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgX2NvbnRleHQpO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRWZXJ0ZXhTaGFkZXJTb3VyY2VcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdldFZlcnRleFNoYWRlclNvdXJjZVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2VcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdldEZyYWdtZW50U2hhZGVyU291cmNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHZlcnRleCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS52ZXJ0ZXhTaGFkZXJTb3VyY2V9LlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSh0aGlzOiBTaGFkZXJQYXJ0aWNsZVN5c3RlbSk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBkYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtID0gdGhpcy5kYXRhO1xyXG4gICAgICBsZXQgbXR4TG9jYWw6IFBhcnRpY2xlRGF0YS5UcmFuc2Zvcm1hdGlvbltdID0gZGF0YT8ubXR4TG9jYWw7XHJcbiAgICAgIGxldCBtdHhXb3JsZDogUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW10gPSBkYXRhPy5tdHhXb3JsZDtcclxuXHJcbiAgICAgIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmFuZG9tTnVtYmVySW5kZXhPZmZzZXQgPSAwO1xyXG5cclxuICAgICAgbGV0IHNvdXJjZTogc3RyaW5nID0gdGhpcy52ZXJ0ZXhTaGFkZXJTb3VyY2VcclxuICAgICAgICAucmVwbGFjZShcIiN2ZXJzaW9uIDMwMCBlc1wiLCBgI3ZlcnNpb24gMzAwIGVzXFxuI2RlZmluZSAke3RoaXMuZGVmaW5lWzBdfSR7ZGF0YS5jb2xvciA/IFwiXFxuI2RlZmluZSBQQVJUSUNMRV9DT0xPUlwiIDogXCJcIn1gKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokdmFyaWFibGVzKi9cIiwgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZVZhcmlhYmxlcyhkYXRhPy52YXJpYWJsZXMsIGRhdGE/LnZhcmlhYmxlTmFtZXMpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eExvY2FsLCBcIkxvY2FsXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBtdHhMb2NhbCAmJiBtdHhMb2NhbC5sZW5ndGggPiAwID8gXCIqIG10eExvY2FsXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eFdvcmxkLCBcIldvcmxkXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBtdHhXb3JsZCAmJiBtdHhXb3JsZC5sZW5ndGggPiAwID8gXCJtdHhXb3JsZCAqXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKFwiLyokY29sb3IqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlQ29sb3IoZGF0YT8uY29sb3IpKTtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBmcmFnbWVudCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5mcmFnbWVudFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UodGhpczogU2hhZGVyUGFydGljbGVTeXN0ZW0pOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlclNvdXJjZS5yZXBsYWNlKFwiI3ZlcnNpb24gMzAwIGVzXCIsIGAjdmVyc2lvbiAzMDAgZXNcXG4jZGVmaW5lICR7dGhpcy5kZWZpbmVbMF19JHt0aGlzLmRhdGEuY29sb3IgPyBcIlxcbiNkZWZpbmUgUEFSVElDTEVfQ09MT1JcIiA6IFwiXCJ9YClcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gY29kZSBnZW5lcmF0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVWYXJpYWJsZXMoX3ZhcmlhYmxlczogUGFydGljbGVEYXRhLlN5c3RlbVtcInZhcmlhYmxlc1wiXSwgX3ZhcmlhYmxlTmFtZXM6IFBhcnRpY2xlRGF0YS5TeXN0ZW1bXCJ2YXJpYWJsZU5hbWVzXCJdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfdmFyaWFibGVzKSByZXR1cm4gXCJcIjtcclxuXHJcbiAgICAgIHJldHVybiBfdmFyaWFibGVzXHJcbiAgICAgICAgLm1hcCgoX3ZhcmlhYmxlLCBfaW5kZXgpID0+ICh7IG5hbWU6IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfdmFyaWFibGVOYW1lc1tfaW5kZXhdLCB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhcmlhYmxlKSB9KSlcclxuICAgICAgICAubWFwKF92YXJpYWJsZSA9PiBgZmxvYXQgJHtfdmFyaWFibGUubmFtZX0gPSAke192YXJpYWJsZS52YWx1ZX07YClcclxuICAgICAgICAucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX2NvZGU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfVxcbiR7X2NvZGV9YCwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUcmFuc2Zvcm1hdGlvbnMoX3RyYW5zZm9ybWF0aW9uczogUGFydGljbGVEYXRhLlN5c3RlbVtcIm10eExvY2FsXCJdLCBfbG9jYWxPcldvcmxkOiBcIkxvY2FsXCIgfCBcIldvcmxkXCIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAoIV90cmFuc2Zvcm1hdGlvbnMgfHwgX3RyYW5zZm9ybWF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgICBsZXQgdHJhbnNmb3JtYXRpb25zOiBbUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW1widHJhbnNmb3JtYXRpb25cIl0sIHN0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBfdHJhbnNmb3JtYXRpb25zXHJcbiAgICAgICAgLm1hcChfZGF0YSA9PiB7XHJcbiAgICAgICAgICBsZXQgaXNTY2FsZTogYm9vbGVhbiA9IF9kYXRhLnRyYW5zZm9ybWF0aW9uID09PSBcInNjYWxlXCI7XHJcbiAgICAgICAgICBsZXQgW3gsIHksIHpdID0gW19kYXRhLnBhcmFtZXRlcnNbMF0sIF9kYXRhLnBhcmFtZXRlcnNbMV0sIF9kYXRhLnBhcmFtZXRlcnNbMl1dXHJcbiAgICAgICAgICAgIC5tYXAoKF92YWx1ZSkgPT4gX3ZhbHVlID8gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhbHVlKSA6IChpc1NjYWxlID8gXCIxLjBcIiA6IFwiMC4wXCIpKSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFtfZGF0YS50cmFuc2Zvcm1hdGlvbiwgeCwgeSwgel07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgY29kZSArPSB0cmFuc2Zvcm1hdGlvbnNcclxuICAgICAgICAubWFwKChbX3RyYW5zZm9ybWF0aW9uLCBfeCwgX3ksIF96XSwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCByb3RhdGVJZDogc3RyaW5nID0gX2luZGV4ICsgX2xvY2FsT3JXb3JsZDtcclxuICAgICAgICAgIGlmIChfdHJhbnNmb3JtYXRpb24gPT0gXCJyb3RhdGVcIikge1xyXG4gICAgICAgICAgICBsZXQgdG9SYWRpYW5zOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyA9IChfdmFsdWU6IHN0cmluZykgPT4gYCR7X3ZhbHVlfSAqICR7Q2FsYy5kZWcycmFkfWA7XHJcbiAgICAgICAgICAgIHJldHVybiBgZmxvYXQgZlhSYWRpYW5zJHtyb3RhdGVJZH0gPSAke3RvUmFkaWFucyhfeCl9O1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZZUmFkaWFucyR7cm90YXRlSWR9ID0gJHt0b1JhZGlhbnMoX3kpfTtcclxuICAgICAgICAgICAgICBmbG9hdCBmWlJhZGlhbnMke3JvdGF0ZUlkfSA9ICR7dG9SYWRpYW5zKF96KX07XHJcbiAgICAgICAgICAgICAgZmxvYXQgZlNpblgke3JvdGF0ZUlkfSA9IHNpbihmWFJhZGlhbnMke3JvdGF0ZUlkfSk7XHJcbiAgICAgICAgICAgICAgZmxvYXQgZkNvc1gke3JvdGF0ZUlkfSA9IGNvcyhmWFJhZGlhbnMke3JvdGF0ZUlkfSk7IFxyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5ZJHtyb3RhdGVJZH0gPSBzaW4oZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NZJHtyb3RhdGVJZH0gPSBjb3MoZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5aJHtyb3RhdGVJZH0gPSBzaW4oZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NaJHtyb3RhdGVJZH0gPSBjb3MoZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xcbmA7XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKChfdHJhbnNmb3JtYXRpb246IHN0cmluZykgPT4gX3RyYW5zZm9ybWF0aW9uICE9IFwiXCIpXHJcbiAgICAgICAgLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF9jb2RlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn1cXG4ke19jb2RlfWAsIFwiXCIpO1xyXG4gICAgICBjb2RlICs9IFwiXFxuXCI7XHJcblxyXG4gICAgICBjb2RlICs9IGBtYXQ0IG10eCR7X2xvY2FsT3JXb3JsZH0gPSBgO1xyXG4gICAgICBjb2RlICs9IHRyYW5zZm9ybWF0aW9uc1xyXG4gICAgICAgIC5tYXAoKFtfdHJhbnNmb3JtYXRpb24sIF94LCBfeSwgX3pdLCBfaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGV0IHJvdGF0ZUlkOiBzdHJpbmcgPSBfaW5kZXggKyBfbG9jYWxPcldvcmxkO1xyXG4gICAgICAgICAgc3dpdGNoIChfdHJhbnNmb3JtYXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcInRyYW5zbGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjAsXHJcbiAgICAgICAgICAgICAgMC4wLCAxLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCxcclxuICAgICAgICAgICAgICAke194fSwgJHtfeX0sICR7X3p9LCAxLjApYDtcclxuICAgICAgICAgICAgY2FzZSBcInJvdGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICBmQ29zWiR7cm90YXRlSWR9ICogZkNvc1kke3JvdGF0ZUlkfSwgZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NZJHtyb3RhdGVJZH0sIC1mU2luWSR7cm90YXRlSWR9LCAwLjAsXHJcbiAgICAgICAgICAgICAgZkNvc1oke3JvdGF0ZUlkfSAqIGZTaW5ZJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9IC0gZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSArIGZDb3NaJHtyb3RhdGVJZH0gKiBmQ29zWCR7cm90YXRlSWR9LCBmQ29zWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgMC4wLFxyXG4gICAgICAgICAgICAgIGZDb3NaJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZkNvc1gke3JvdGF0ZUlkfSArIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9LCBmU2luWiR7cm90YXRlSWR9ICogZlNpblkke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0gLSBmQ29zWiR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgZkNvc1kke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIDAuMCxcclxuICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAxLjBcclxuICAgICAgICAgICAgICApYDtcclxuICAgICAgICAgICAgY2FzZSBcInNjYWxlXCI6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGBtYXQ0KFxyXG4gICAgICAgICAgICAgICR7X3h9LCAwLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgJHtfeX0sIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAke196fSwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxyXG4gICAgICAgICAgICAgIClgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X3RyYW5zZm9ybWF0aW9ufVwiIGlzIG5vdCBhIHRyYW5zZm9ybWF0aW9uYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfY29kZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogXFxuJHtfY29kZX1gKTtcclxuICAgICAgY29kZSArPSBcIjtcXG5cIjtcclxuXHJcbiAgICAgIHJldHVybiBjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQ29sb3IoX2NvbG9yOiBQYXJ0aWNsZURhdGEuRXhwcmVzc2lvbltdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfY29sb3IpIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgbGV0IHJnYmE6IHN0cmluZyA9IFtfY29sb3JbMF0sIF9jb2xvclsxXSwgX2NvbG9yWzJdLCBfY29sb3JbM11dXHJcbiAgICAgICAgLm1hcCgoX3ZhbHVlKTogc3RyaW5nID0+IF92YWx1ZSA/IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2VuZXJhdGVFeHByZXNzaW9uKF92YWx1ZSkgOiBcIjEuMFwiKVxyXG4gICAgICAgIC5qb2luKFwiLCBcIik7XHJcblxyXG4gICAgICByZXR1cm4gYHZlYzQoJHtyZ2JhfSk7YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUV4cHJlc3Npb24oX2V4cHJlc3Npb246IFBhcnRpY2xlRGF0YS5FeHByZXNzaW9uKTogc3RyaW5nIHtcclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0Z1bmN0aW9uKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIF9leHByZXNzaW9uLnBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlRXhwcmVzc2lvbihwYXJhbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUZ1bmN0aW9uKF9leHByZXNzaW9uLmZ1bmN0aW9uLCBwYXJhbWV0ZXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc1ZhcmlhYmxlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIHJldHVybiBQYXJ0aWNsZURhdGEuUFJFREVGSU5FRF9WQVJJQUJMRVNbX2V4cHJlc3Npb24udmFsdWVdIHx8IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfZXhwcmVzc2lvbi52YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0NvbnN0YW50KF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gX2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JHt2YWx1ZS5pbmNsdWRlcyhcIi5cIikgPyBcIlwiIDogXCIuMFwifWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChQYXJ0aWNsZURhdGEuaXNDb2RlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBjb2RlOiBzdHJpbmcgPSBfZXhwcmVzc2lvbi5jb2RlXHJcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxiW2EtekEtel0rXFx3Kig/IVxcKClcXGIvZywgKF9tYXRjaCkgPT4gUGFydGljbGVEYXRhLlBSRURFRklORURfVkFSSUFCTEVTW19tYXRjaF0gfHwgXCJmUGFydGljbGVTeXN0ZW1WYXJpYWJsZV9cIiArIF9tYXRjaClcclxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8oPzwhXFwuKVxcYlxcZCtcXGIoPyFcXC4pL2csIChfbWF0Y2gpID0+IF9tYXRjaCArIFwiLjBcIik7XHJcbiAgICAgICAgY29kZSA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmVwbGFjZUZ1bmN0aW9ucyhjb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBpbnZhbGlkIG5vZGUgc3RydWN0dXJlIGluIHBhcnRpY2xlIHN5c3RlbSBzZXJpYWxpemF0aW9uYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUZ1bmN0aW9uKF9mdW5jdGlvbjogUGFydGljbGVEYXRhLkZVTkNUSU9OLCBfcGFyYW1ldGVyczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICBpZiAoX3BhcmFtZXRlcnMubGVuZ3RoIDwgUGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dKVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIG5lZWRzIGF0IGxlYXN0ICR7UGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dfSBwYXJhbWV0ZXJzYDtcclxuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoUGFydGljbGVEYXRhLkZVTkNUSU9OKS5pbmNsdWRlcyhfZnVuY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tfZnVuY3Rpb25dKF9wYXJhbWV0ZXJzKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIGlzIG5vdCBhbiBvcGVyYXRpb25gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlcGxhY2VGdW5jdGlvbnMoX2NvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBmdW5jdGlvblJlZ2V4OiBSZWdFeHAgPSAvXFxiW2EtekEtel9dK1xcdypcXCgvZztcclxuICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXk7XHJcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBmdW5jdGlvblJlZ2V4LmV4ZWMoX2NvZGUpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGZ1bmN0aW9uR2VuZXJhdG9yOiBGdW5jdGlvbiA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TWzxQYXJ0aWNsZURhdGEuRlVOQ1RJT04+bWF0Y2hbMF0uc2xpY2UoMCwgLTEpXTtcclxuICAgICAgICBpZiAoIWZ1bmN0aW9uR2VuZXJhdG9yKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjb21tYUluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgbGV0IG9wZW5CcmFja2V0czogbnVtYmVyID0gMTtcclxuICAgICAgICBsZXQgYXJndW1lbnRzTGFzdEluZGV4OiBudW1iZXIgPSBmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleDtcclxuICAgICAgICB3aGlsZSAob3BlbkJyYWNrZXRzID4gMCkge1xyXG4gICAgICAgICAgc3dpdGNoIChfY29kZVthcmd1bWVudHNMYXN0SW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCIoXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzKys7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIpXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzLS07XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIsXCI6XHJcbiAgICAgICAgICAgICAgaWYgKG9wZW5CcmFja2V0cyA9PSAxKVxyXG4gICAgICAgICAgICAgICAgY29tbWFJbmRpY2VzLnB1c2goYXJndW1lbnRzTGFzdEluZGV4KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ3VtZW50c0xhc3RJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFyZ3M6IHN0cmluZ1tdID1cclxuICAgICAgICAgIFtmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleCAtIDEsIC4uLmNvbW1hSW5kaWNlcywgYXJndW1lbnRzTGFzdEluZGV4IC0gMV0ucmVkdWNlPHN0cmluZ1tdPigoX2FjY3VtdWxhdG9yLCBfcG9zaXRpb24sIF9pbmRleCwgX3Bvc2l0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX2luZGV4ID09IF9wb3NpdGlvbnMubGVuZ3RoIC0gMSA/XHJcbiAgICAgICAgICAgICAgX2FjY3VtdWxhdG9yIDpcclxuICAgICAgICAgICAgICBfYWNjdW11bGF0b3IuY29uY2F0KF9jb2RlLnNsaWNlKF9wb3NpdGlvbiArIDEsIF9wb3NpdGlvbnNbX2luZGV4ICsgMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uUmVnZXgubGFzdEluZGV4ID0gbWF0Y2guaW5kZXg7XHJcbiAgICAgICAgX2NvZGUgPSBgJHtfY29kZS5zbGljZSgwLCBtYXRjaC5pbmRleCl9KCR7ZnVuY3Rpb25HZW5lcmF0b3IoYXJncyl9KSR7X2NvZGUuc2xpY2UoYXJndW1lbnRzTGFzdEluZGV4KX1gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfY29kZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgZm9yIHRoZSBwYXJ0aWNsZSBzeXN0ZW0gKHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0pIGludG8gYSBXZWJHTCBUZXh0dXJlXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBfY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0KTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnVzZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlbGV0ZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1c2VSZW5kZXJEYXRhKHRoaXM6IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJEYXRhKSB7XHJcbiAgICAgICAgLy8gYnVmZmVycyBleGlzdFxyXG4gICAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShURVhUVVJFX0xPQ0FUSU9OLlBBUlRJQ0xFLlVOSVQpOyAvLyBBVFRFTlRJT04hOiBjaGFuZ2luZyB0aGlzIGlkIHJlcXVpcmVzIGNoYW5naW5nIG9mIGNvcnJlc3BvbmRpbmcgaWQgaW4gcGFydGljbGUgcmVuZGVyIG1ldGhvZCwgdXNlIGN0cmwgKyBzaGlmdCArIGYgc2VhcmNoIVxyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlci5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG5cclxuICAgICAgICBsZXQgdGV4dHVyZVNpemU6IG51bWJlciA9IE1hdGguY2VpbChNYXRoLnNxcnQodGhpcy5zaXplKSk7XHJcbiAgICAgICAgdGV4dHVyZVNpemUgPSBNYXRoLm1pbih0ZXh0dXJlU2l6ZSwgY3JjMy5nZXRQYXJhbWV0ZXIoY3JjMy5NQVhfVEVYVFVSRV9TSVpFKSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHVzZSBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYWRkaXRpb25hbGx5IG1heWJlIHVzZSBhIHNlZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWNyZWF0ZSB0aGUgc2FtZSByYW5kb20gbnVtYmVyc1xyXG4gICAgICAgIGxldCByYW5kb21OdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0ZXh0dXJlU2l6ZSAqIHRleHR1cmVTaXplOyBpKyspXHJcbiAgICAgICAgICByYW5kb21OdW1iZXJzLnB1c2goTWF0aC5yYW5kb20oKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SMzJGLCB0ZXh0dXJlU2l6ZSwgdGV4dHVyZVNpemUsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULFxyXG4gICAgICAgICAgICBGbG9hdDMyQXJyYXkuZnJvbShyYW5kb21OdW1iZXJzKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUlOX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUFHX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnVzZVJlbmRlckRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlckRhdGE7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB0aGF0IGNhbiBiZSByZWN5Y2xlZCwgaS5lLiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnkgcmV1c2luZyB0aGUgb2JqZWN0IGluc3RlYWQgb2YgcmVwbGFjaW5nIGl0IHdpdGggYSBuZXcgb25lLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVjeWNhYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb3IgdGhlIG5leHQgcmV1c2UgYnkgc2V0dGluZyBpdHMgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHN0YXRlcy5cclxuICAgICAqL1xyXG4gICAgcmVjeWNsZSgpOiB2b2lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2VlcHMgYSBkZXBvdCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgcmV1c2UsIHNvcnRlZCBieSB0eXBlLiAgXHJcbiAgICogVXNpbmcge0BsaW5rIFJlY3ljbGVyfSByZWR1Y2VzIGxvYWQgb24gdGhlIGNhcmJhZ2UgY29sbGVjdG9yIGFuZCB0aHVzIHN1cHBvcnRzIHNtb290aCBwZXJmb3JtYW5jZS5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWN5Y2xlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBkZXBvdDogeyBbdHlwZTogc3RyaW5nXTogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgZnJvbSB0aGUgZGVwb3QsIGNhbGxzIGl0cyByZWN5Y2xlLW1ldGhvZCBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqIElmIHRoZSBkZXBvdCBmb3IgdGhhdCB0eXBlIGlzIGVtcHR5IGl0IHJldHVybnMgYSBuZXcgb2JqZWN0IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS5cclxuICAgICAqIEBwYXJhbSBfdCBUaGUgY2xhc3MgaWRlbnRpZmllciBvZiB0aGUgZGVzaXJlZCBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8VCBleHRlbmRzIFJlY3ljYWJsZSB8IFJlY3ljYWJsZUFycmF5PFQ+IHwgT2JqZWN0PihfdDogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgbGV0IGtleTogc3RyaW5nID0gX3QubmFtZTtcclxuICAgICAgbGV0IGluc3RhbmNlczogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiA9IFJlY3ljbGVyLmRlcG90W2tleV07XHJcbiAgICAgIGlmIChpbnN0YW5jZXMgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgaW5zdGFuY2U6IFQgPSA8VD5pbnN0YW5jZXMucG9wKCk7XHJcbiAgICAgICAgKDxSZWN5Y2FibGU+aW5zdGFuY2UpLnJlY3ljbGU/LigpO1xyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIG5ldyBfdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGZyb20gdGhlIGRlcG90IGFuZCByZXR1cm5zIGl0LiDimqDvuI8qKkRPRVMgTk9UKiogY2FsbCBpdHMgcmVjeWNsZS1tZXRob2QuXHJcbiAgICAgKiBGYXN0ZXIgdGhhbiB7QGxpbmsgUmVjeWNsZXIuZ2V0fSwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZXVzZTxUIGV4dGVuZHMgT2JqZWN0PihfdDogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgcmV0dXJuIDxUPlJlY3ljbGVyLmRlcG90W190Lm5hbWVdPy5wb3AoKSA/PyBuZXcgX3QoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgb2JqZWN0IGluIHRoZSBkZXBvdCBmb3IgbGF0ZXIgcmVjeWNsaW5nLiBVc2VycyBhcmUgcmVzcG9uc2libGUgZm9yIHRocm93aW5nIGluIG9iamVjdHMgdGhhdCBhcmUgYWJvdXQgdG8gbG9vc2Ugc2NvcGUgYW5kIGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgb3RoZXJcclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZShfaW5zdGFuY2U6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgICAvLyBsZXQga2V5OiBzdHJpbmcgPSBfaW5zdGFuY2UuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgLy8gLy9EZWJ1Zy5sb2coa2V5KTtcclxuICAgICAgLy8gbGV0IGluc3RhbmNlczogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiA9IFJlY3ljbGVyTmV3LmRlcG90W2tleV0gfHwgbmV3IFJlY3ljYWJsZUFycmF5PE9iamVjdD4oKTtcclxuICAgICAgLy8gaW5zdGFuY2VzLnB1c2goX2luc3RhbmNlKTtcclxuICAgICAgLy8gUmVjeWNsZXJOZXcuZGVwb3Rba2V5XSA9IGluc3RhbmNlcztcclxuICAgICAgLy8gRGVidWcubG9nKGBPYmplY3RNYW5hZ2VyLmRlcG90WyR7a2V5fV06ICR7T2JqZWN0TWFuYWdlci5kZXBvdFtrZXldLmxlbmd0aH1gKTtcclxuICAgICAgLy9EZWJ1Zy5sb2codGhpcy5kZXBvdCk7XHJcbiAgICAgIChSZWN5Y2xlci5kZXBvdFtfaW5zdGFuY2UuY29uc3RydWN0b3IubmFtZV0gPz89IG5ldyBSZWN5Y2FibGVBcnJheTxPYmplY3Q+KCkpLnB1c2goX2luc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgb2JqZWN0cyB1c2luZyB0aGUge0BsaW5rIFJlY3ljbGVyLnN0b3JlfSBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZU11bHRpcGxlKC4uLl9pbnN0YW5jZXM6IE9iamVjdFtdKTogdm9pZCB7IC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyB0aGUgZGVmYXVsdCBzdG9yZSBtZXRob2RcclxuICAgICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBfaW5zdGFuY2VzKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGluc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtcHR5cyB0aGUgZGVwb3Qgb2YgYSBnaXZlbiB0eXBlLCBsZWF2aW5nIHRoZSBvYmplY3RzIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIE1heSByZXN1bHQgaW4gYSBzaG9ydCBzdGFsbCB3aGVuIG1hbnkgb2JqZWN0cyB3ZXJlIGluXHJcbiAgICAgKiBAcGFyYW0gX3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkdW1wPFQ+KF90OiBuZXcgKCkgPT4gVCk6IHZvaWQge1xyXG4gICAgICBSZWN5Y2xlci5kZXBvdFtfdC5uYW1lXSA9IG5ldyBSZWN5Y2FibGVBcnJheTxPYmplY3Q+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbXB0eXMgYWxsIGRlcG90cywgbGVhdmluZyBhbGwgb2JqZWN0cyB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIE1heSByZXN1bHQgaW4gYSBzaG9ydCBzdGFsbCB3aGVuIG1hbnkgb2JqZWN0cyB3ZXJlIGluXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHVtcEFsbCgpOiB2b2lkIHtcclxuICAgICAgUmVjeWNsZXIuZGVwb3QgPSB7fTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgdHdvZGltZW5zaW9uYWwgdmVjdG9yIGNvbXByaXNlZCBvZiB0aGUgY29tcG9uZW50cyB4IGFuZCB5XHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICAgK3lcclxuICAgKiAgICAgICAgICAgICB8X18gK3hcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBMdWthcyBTY2hldWVybGUsIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFZlY3RvcjIgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTdGF0aWNcclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMigwLCAwKWAuXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzICgwLCAwKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFpFUk8oKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDApO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMihfc2NhbGUsIF9zY2FsZSlgLlxyXG4gICAgICogQHBhcmFtIF9zY2FsZSB0aGUgc2NhbGUgb2YgdGhlIHZlY3Rvci4gRGVmYXVsdDogMVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9ORShfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3NjYWxlLCBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMih4LCAwKWAuXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIFRoZSBudW1iZXIgdG8gd3JpdGUgaW4gdGhlIHggY29vcmRpbmF0ZS4gRGVmYXVsdDogMVxyXG4gICAgICogQHJldHVybnMgQSBuZXcgdmVjdG9yIHdpdGggdGhlIHZhbHVlcyAoX3NjYWxlLCAwKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKDAsIHkpYC5cclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIG51bWJlciB0byB3cml0ZSBpbiB0aGUgeSBjb29yZGluYXRlLiBEZWZhdWx0OiAxXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzICgwLCBfc2NhbGUpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWShfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IyLCBfbXR4VHJhbnNmb3JtOiBNYXRyaXgzeDMsIF9pbmNsdWRlVHJhbnNsYXRpb246IGJvb2xlYW4gPSB0cnVlKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gX210eFRyYW5zZm9ybS5nZXQoKTtcclxuICAgICAgdmVjdG9yLnNldChcclxuICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVszXSAqIF92ZWN0b3IueSxcclxuICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdmVjdG9yLmFkZChfbXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCB0byB0aGUgZ2l2ZW4gbGVuZ3RoLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMiwgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjIgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIHNjYWxpbmcgZmFjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTEUoX3ZlY3RvcjogVmVjdG9yMiwgX3NjYWxlOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3ZlY3Rvci54ICogX3NjYWxlLCBfdmVjdG9yLnkgKiBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvciBhdHRhaW5lZCBieSBhZGRpdGlvbiBvZiBhbGwgZ2l2ZW4gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTVU0oLi4uX3ZlY3RvcnM6IFZlY3RvcjJbXSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIGZvciAobGV0IHZlY3RvciBvZiBfdmVjdG9ycylcclxuICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC54ICsgdmVjdG9yLngsIHJlc3VsdC55ICsgdmVjdG9yLnkpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBESUZGRVJFTkNFKF9taW51ZW5kOiBWZWN0b3IyLCBfc3VidHJhaGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfbWludWVuZC54IC0gX3N1YnRyYWhlbmQueCwgX21pbnVlbmQueSAtIF9zdWJ0cmFoZW5kLnkpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gVmVjdG9ycy4gRHVlIHRvIHRoZW0gYmVpbmcgb25seSAyIERpbWVuc2lvbmFsLCB0aGUgcmVzdWx0IGlzIGEgc2luZ2xlIG51bWJlcixcclxuICAgICAqIHdoaWNoIGltcGxpY2l0bHkgaXMgb24gdGhlIFogYXhpcy4gSXQgaXMgYWxzbyB0aGUgc2lnbmVkIG1hZ25pdHVkZSBvZiB0aGUgcmVzdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENST1NTKF9hOiBWZWN0b3IyLCBfYjogVmVjdG9yMik6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS54ICogX2IueSAtIF9hLnkgKiBfYi54O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgdGhlIGRvdHByb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfYTogVmVjdG9yMiwgX2I6IFZlY3RvcjIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnggKyBfYS55ICogX2IueTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIG9ydGhvZ29uYWwgdmVjdG9yIHRvIHRoZSBnaXZlbiB2ZWN0b3IuIFJvdGF0ZXMgY291bnRlcmNsb2Nrd2lzZSBieSBkZWZhdWx0LlxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICog4oaRID0+IOKGkCA9PiDihpMgPT4g4oaSID0+IOKGkVxyXG4gICAgICogYGBgXHJcbiAgICAgKiBAcGFyYW0gX3ZlY3RvciBWZWN0b3IgdG8gZ2V0IHRoZSBvcnRob2dvbmFsIGVxdWl2YWxlbnQgb2ZcclxuICAgICAqIEBwYXJhbSBfY2xvY2t3aXNlIFNob3VsZCB0aGUgcm90YXRpb24gYmUgY2xvY2t3aXNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgY291bnRlcmNsb2Nrd2lzZT8gZGVmYXVsdDogZmFsc2VcclxuICAgICAqIEByZXR1cm5zIEEgVmVjdG9yIHRoYXQgaXMgb3J0aG9nb25hbCB0byBhbmQgaGFzIHRoZSBzYW1lIG1hZ25pdHVkZSBhcyB0aGUgZ2l2ZW4gVmVjdG9yLiAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT1JUSE9HT05BTChfdmVjdG9yOiBWZWN0b3IyLCBfY2xvY2t3aXNlOiBib29sZWFuID0gZmFsc2UpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBpZiAoX2Nsb2Nrd2lzZSlcclxuICAgICAgICByZXN1bHQuc2V0KF92ZWN0b3IueSwgLV92ZWN0b3IueCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQuc2V0KC1fdmVjdG9yLnksIF92ZWN0b3IueCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2FydGVzaWFuIHZlY3RvciBmcm9tIHBvbGFyIGNvb3JkaW5hdGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR0VPKF9hbmdsZTogbnVtYmVyID0gMCwgX21hZ25pdHVkZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIGxldCBnZW86IEdlbzIgPSBSZWN5Y2xlci5yZXVzZShHZW8yKTtcclxuICAgICAgZ2VvLnNldChfYW5nbGUsIF9tYWduaXR1ZGUpO1xyXG4gICAgICB2ZWN0b3IuZ2VvID0gZ2VvO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShnZW8pO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIEFjY2Vzc29yc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hZ25pdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gTWF0aC5oeXBvdCh0aGlzLngsIHRoaXMueSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMi5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9sYXIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBnZW8oKTogR2VvMiB7XHJcbiAgICAgIGxldCBnZW86IEdlbzIgPSBSZWN5Y2xlci5nZXQoR2VvMik7XHJcbiAgICAgIGdlby5tYWduaXR1ZGUgPSB0aGlzLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChnZW8ubWFnbml0dWRlID09PSAwKVxyXG4gICAgICAgIHJldHVybiBnZW87XHJcblxyXG4gICAgICBnZW8uYW5nbGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueSAvIGdlby5tYWduaXR1ZGUsIHRoaXMueCAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIHBvbGFyIGNvb3JkaW5hdGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgZ2VvKF9nZW86IEdlbzIpIHtcclxuICAgICAgdGhpcy5zZXQoX2dlby5tYWduaXR1ZGUsIDApO1xyXG4gICAgICB0aGlzLnRyYW5zZm9ybShNYXRyaXgzeDMuUk9UQVRJT04oX2dlby5hbmdsZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gUmVjeWNsZXIucmV1c2UoVmVjdG9yMikuY29weSh0aGlzKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHZlY3RvciBhcmUgdG8gYmUgY29uc2lkZXJlZCBpZGVudGljYWwgd2l0aGluIHRoZSBnaXZlbiB0b2xlcmFuY2VcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRvbGVyYW5jZSBhcyBjcml0ZXJpdW0gZm9yIHRoZSBkaWZmZXJlbmNlIGlzIGFwcHJvcHJpYXRlIHdpdGggdmVyeSBsYXJnZSBjb29yZGluYXRlIHZhbHVlcyBvciBpZiBfdG9sZXJhbmNlIHNob3VsZCBiZSBtdWx0aXBsaWVkIGJ5IGNvb3JkaW5hdGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVxdWFscyhfY29tcGFyZTogVmVjdG9yMiwgX3RvbGVyYW5jZTogbnVtYmVyID0gTnVtYmVyLkVQU0lMT04pOiBib29sZWFuIHtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueCAtIF9jb21wYXJlLngpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy55IC0gX2NvbXBhcmUueSkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoZSBleGVjdXRpbmcgdmVjdG9yLCBjaGFuZ2luZyB0aGUgZXhlY3V0b3IuXHJcbiAgICAgKiBAcGFyYW0gX2FkZGVuZCBUaGUgdmVjdG9yIHRvIGFkZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGUgZXhlY3V0aW5nIHZlY3RvciwgY2hhbmdpbmcgdGhlIGV4ZWN1dG9yLlxyXG4gICAgICogQHBhcmFtIF9zdWJ0cmFoZW5kIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdWJ0cmFjdChfc3VidHJhaGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggLT0gX3N1YnRyYWhlbmQueDtcclxuICAgICAgdGhpcy55IC09IF9zdWJ0cmFoZW5kLnk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoZSBWZWN0b3IgYnkgdGhlIGdpdmVuIF9zY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB0byB0aGUgZ2l2ZW4gbGVuZ3RoLCAxIGJ5IGRlZmF1bHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbGl6ZShfbGVuZ3RoOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvcHkoVmVjdG9yMi5OT1JNQUxJWkFUSU9OKHRoaXMsIF9sZW5ndGgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCA9IF94O1xyXG4gICAgICB0aGlzLnkgPSBfeTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFt0aGlzLngsIHRoaXMueV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gbWF0cml4LCBpbmNsdWRpbmcgb3IgZXhsdWRpbmcgdGhlIHRyYW5zbGF0aW9uLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX210eFRyYW5zZm9ybTogTWF0cml4M3gzLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgdHJhbnNmb3JtZWQ6IFZlY3RvcjIgPSBWZWN0b3IyLlRSQU5TRk9STUFUSU9OKHRoaXMsIF9tdHhUcmFuc2Zvcm0sIF9pbmNsdWRlVHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLmNvcHkodHJhbnNmb3JtZWQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2Zvcm1lZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtYXhpbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1heChfY29tcGFyZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1heCh0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1heCh0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB6LWNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbWFnbml0dWRlIChkZWZhdWx0PTApIHRvIHRoZSB2ZWN0b3IgYW5kIHJldHVybnMgYSBuZXcgVmVjdG9yM1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IzKF96OiBudW1iZXIgPSAwKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLngsIHRoaXMueSwgX3opO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IGAoJHt0aGlzLngudG9QcmVjaXNpb24oNSl9LCAke3RoaXMueS50b1ByZWNpc2lvbig1KX0pYDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZXMgdGhlIHN0YW5kYXJkIGFycmF5Lm1hcCBmdW5jdGlvbmFsaXR5IHRvIHBlcmZvcm0gdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKiBhbmQgcmV0dXJuIGEgbmV3IHZlY3RvciB3aXRoIHRoZSByZXN1bHRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXAoX2Z1bmN0aW9uOiAodmFsdWU6IG51bWJlciwgaW5kZXg6IG51bWJlciwgYXJyYXk6IEFycmF5TGlrZTxudW1iZXI+KSA9PiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IGNvcHk6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIGNvcHkuc2V0KC4uLlt0aGlzLngsIHRoaXMueV0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX1dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3IyPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55XSA9IEpTT04ucGFyc2UoPHN0cmluZz48dW5rbm93bj5fc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRoaXMubXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHg6IHRoaXMueCwgeTogdGhpcy55XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi4vUmVjeWNsZS9SZWN5Y2xlci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiVmVjdG9yMi50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIG9yaWdpbiBvZiBhIHJlY3RhbmdsZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIE9SSUdJTjJEIHtcclxuICAgIFRPUExFRlQgPSAweDAwLFxyXG4gICAgVE9QQ0VOVEVSID0gMHgwMSxcclxuICAgIFRPUFJJR0hUID0gMHgwMixcclxuICAgIENFTlRFUkxFRlQgPSAweDEwLFxyXG4gICAgQ0VOVEVSID0gMHgxMSxcclxuICAgIENFTlRFUlJJR0hUID0gMHgxMixcclxuICAgIEJPVFRPTUxFRlQgPSAweDIwLFxyXG4gICAgQk9UVE9NQ0VOVEVSID0gMHgyMSxcclxuICAgIEJPVFRPTVJJR0hUID0gMHgyMlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBhIHJlY3RhbmdsZSB3aXRoIHBvc2l0aW9uIGFuZCBzaXplIGFuZCBhZGQgY29tZm9ydGFibGUgbWV0aG9kcyB0byBpdFxyXG4gICAqIEBhdXRob3IgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVjdGFuZ2xlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgcG9zaXRpb246IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICBwdWJsaWMgc2l6ZTogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfd2lkdGg6IG51bWJlciA9IDEsIF9oZWlnaHQ6IG51bWJlciA9IDEsIF9vcmlnaW46IE9SSUdJTjJEID0gT1JJR0lOMkQuVE9QTEVGVCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uQW5kU2l6ZShfeCwgX3ksIF93aWR0aCwgX2hlaWdodCwgX29yaWdpbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHJlY3RhbmdsZSBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHRVQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfd2lkdGg6IG51bWJlciA9IDEsIF9oZWlnaHQ6IG51bWJlciA9IDEsIF9vcmlnaW46IE9SSUdJTjJEID0gT1JJR0lOMkQuVE9QTEVGVCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGxldCByZWN0OiBSZWN0YW5nbGUgPSBSZWN5Y2xlci5nZXQoUmVjdGFuZ2xlKTtcclxuICAgICAgcmVjdC5zZXRQb3NpdGlvbkFuZFNpemUoX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQpO1xyXG4gICAgICByZXR1cm4gcmVjdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgeSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaXplLng7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaXplLnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGxlZnRtb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGxlZnQoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS54ID4gMClcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueCArIHRoaXMuc2l6ZS54KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSB0b3Btb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0b3AoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS55ID4gMClcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueSArIHRoaXMuc2l6ZS55KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByaWdodG1vc3QgZXhwYW5zaW9uLCByZXNwZWN0aW5nIGFsc28gbmVnYXRpdmUgdmFsdWVzIG9mIHdpZHRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS54ID4gMClcclxuICAgICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueCArIHRoaXMuc2l6ZS54KTtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBsb3dlc3QgZXhwYW5zaW9uLCByZXNwZWN0aW5nIGFsc28gbmVnYXRpdmUgdmFsdWVzIG9mIGhlaWdodFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJvdHRvbSgpOiBudW1iZXIge1xyXG4gICAgICBpZiAodGhpcy5zaXplLnkgPiAwKVxyXG4gICAgICAgIHJldHVybiAodGhpcy5wb3NpdGlvbi55ICsgdGhpcy5zaXplLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgeChfeDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueCA9IF94O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB5KF95OiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbi55ID0gX3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHdpZHRoKF93aWR0aDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS54ID0gX3dpZHRoO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBoZWlnaHQoX2hlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS55ID0gX2hlaWdodDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbGVmdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueCA9IHRoaXMucmlnaHQgLSBfdmFsdWU7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdG9wKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS55ID0gdGhpcy5ib3R0b20gLSBfdmFsdWU7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcmlnaHQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnggPSB0aGlzLnBvc2l0aW9uLnggKyBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGJvdHRvbShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IHRoaXMucG9zaXRpb24ueSArIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKHRoaXMueCwgdGhpcy55LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyByZWN0YW5nbGUgdG8gdGhlIHZhbHVlcyBnaXZlbiBieSB0aGUgcmVjdGFuZ2xlIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9yZWN0OiBSZWN0YW5nbGUpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbkFuZFNpemUoX3JlY3QueCwgX3JlY3QueSwgX3JlY3Qud2lkdGgsIF9yZWN0LmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UG9zaXRpb25BbmRTaXplKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaXplLnNldChfd2lkdGgsIF9oZWlnaHQpO1xyXG4gICAgICBzd2l0Y2ggKF9vcmlnaW4gJiAweDAzKSB7XHJcbiAgICAgICAgY2FzZSAweDAwOiB0aGlzLnBvc2l0aW9uLnggPSBfeDsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAweDAxOiB0aGlzLnBvc2l0aW9uLnggPSBfeCAtIF93aWR0aCAvIDI7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgwMjogdGhpcy5wb3NpdGlvbi54ID0gX3ggLSBfd2lkdGg7IGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHN3aXRjaCAoX29yaWdpbiAmIDB4MzApIHtcclxuICAgICAgICBjYXNlIDB4MDA6IHRoaXMucG9zaXRpb24ueSA9IF95OyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MTA6IHRoaXMucG9zaXRpb24ueSA9IF95IC0gX2hlaWdodCAvIDI7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgyMDogdGhpcy5wb3NpdGlvbi55ID0gX3kgLSBfaGVpZ2h0OyBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSB0aGlzIHJlY3RhbmdsZXMgc3BhY2UgdG8gdGhlIHRhcmdldCByZWN0YW5nbGVzIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludFRvUmVjdChfcG9pbnQ6IFZlY3RvcjIsIF90YXJnZXQ6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gX3BvaW50LmNsb25lO1xyXG4gICAgICByZXN1bHQuc3VidHJhY3QodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgIHJlc3VsdC54ICo9IF90YXJnZXQud2lkdGggLyB0aGlzLndpZHRoO1xyXG4gICAgICByZXN1bHQueSAqPSBfdGFyZ2V0LmhlaWdodCAvIHRoaXMuaGVpZ2h0O1xyXG4gICAgICByZXN1bHQuYWRkKF90YXJnZXQucG9zaXRpb24pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgb2YgdGhpcyByZWN0YW5nbGUgb3Igb24gdGhlIGJvcmRlclxyXG4gICAgICogQHBhcmFtIF9wb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IyKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoX3BvaW50LnggPj0gdGhpcy5sZWZ0ICYmIF9wb2ludC54IDw9IHRoaXMucmlnaHQgJiYgX3BvaW50LnkgPj0gdGhpcy50b3AgJiYgX3BvaW50LnkgPD0gdGhpcy5ib3R0b20pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVjdGFuZ2xlIGNvbGxpZGVzIHdpdGggdGhlIHJlY3RhbmdsZSBnaXZlblxyXG4gICAgICogQHBhcmFtIF9yZWN0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGlkZXMoX3JlY3Q6IFJlY3RhbmdsZSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAodGhpcy5sZWZ0ID4gX3JlY3QucmlnaHQpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMucmlnaHQgPCBfcmVjdC5sZWZ0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnRvcCA+IF9yZWN0LmJvdHRvbSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5ib3R0b20gPCBfcmVjdC50b3ApIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZWN0YW5nbGUgY3JlYXRlZCBieSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiByZWN0YW5nbGUgb3IgbnVsbCwgaWYgdGhleSBkb24ndCBjb2xsaWRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbnRlcnNlY3Rpb24oX3JlY3Q6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGlmICghdGhpcy5jb2xsaWRlcyhfcmVjdCkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgaW50ZXJzZWN0aW9uOiBSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi54ID0gTWF0aC5tYXgodGhpcy5sZWZ0LCBfcmVjdC5sZWZ0KTtcclxuICAgICAgaW50ZXJzZWN0aW9uLnkgPSBNYXRoLm1heCh0aGlzLnRvcCwgX3JlY3QudG9wKTtcclxuICAgICAgaW50ZXJzZWN0aW9uLndpZHRoID0gTWF0aC5taW4odGhpcy5yaWdodCwgX3JlY3QucmlnaHQpIC0gaW50ZXJzZWN0aW9uLng7XHJcbiAgICAgIGludGVyc2VjdGlvbi5oZWlnaHQgPSBNYXRoLm1pbih0aGlzLmJvdHRvbSwgX3JlY3QuYm90dG9tKSAtIGludGVyc2VjdGlvbi55O1xyXG5cclxuICAgICAgcmV0dXJuIGludGVyc2VjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICogUmV0dXJucyB0aGUgcmVjdGFuZ2xlIGNyZWF0ZWQgYnkgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIG9yIG51bGwsIGlmIHRoZXkgZG9uJ3QgY29sbGlkZVxyXG4gKi9cclxuICAgIHB1YmxpYyBjb3ZlcnMoX3JlY3Q6IFJlY3RhbmdsZSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAodGhpcy5sZWZ0ID4gX3JlY3QubGVmdCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5yaWdodCA8IF9yZWN0LnJpZ2h0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnRvcCA+IF9yZWN0LnRvcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5ib3R0b20gPCBfcmVjdC5ib3R0b20pIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVjdGFuZ2xlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgxpIuUmVjdGFuZ2xlKHBvc2l0aW9uOiR7dGhpcy5wb3NpdGlvbi50b1N0cmluZygpfSwgc2l6ZToke3RoaXMuc2l6ZS50b1N0cmluZygpfWA7XHJcbiAgICAgIHJlc3VsdCArPSBgLCBsZWZ0OiR7dGhpcy5sZWZ0LnRvUHJlY2lzaW9uKDUpfSwgdG9wOiR7dGhpcy50b3AudG9QcmVjaXNpb24oNSl9LCByaWdodDoke3RoaXMucmlnaHQudG9QcmVjaXNpb24oNSl9LCBib3R0b206JHt0aGlzLmJvdHRvbS50b1ByZWNpc2lvbig1KX1gO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyogKi8gfVxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvclNoYWRlci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JDb2F0LnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3Rvck1lc2gudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0udHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0udHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL01hdGgvUmVjdGFuZ2xlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gZXhwb3J0IGRlY2xhcmUgbGV0IGZ1ZGdlQ29uZmlnOiBHZW5lcmFsO1xyXG5cclxuICBleHBvcnQgdHlwZSBSZW5kZXJUZXh0dXJlID0gV2ViR0xUZXh0dXJlO1xyXG5cclxuICBleHBvcnQgZW51bSBCTEVORCB7XHJcbiAgICBPUEFRVUUsIFRSQU5TUEFSRU5ULCBBRERJVElWRSwgU1VCVFJBQ1RJVkUsIE1PRFVMQVRFXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBERVBUSF9GVU5DVElPTiB7XHJcbiAgICBORVZFUiwgTEVTUywgRVFVQUwsIExFU1NfRVFVQUwsIEdSRUFURVIsIE5PVF9FUVVBTCwgR1JFQVRFUl9FUVVBTCwgQUxXQVlTXHJcbiAgfVxyXG5cclxuICAvLyB3ZSB3YW50IHR5cGUgaW5mZXJlbmNlIGhlcmUgc28gd2UgY2FuIHVzZSB2cyBjb2RlIHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlc1xyXG4gIGV4cG9ydCBjb25zdCBVTklGT1JNX0JMT0NLUyA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG4gICAgTElHSFRTOiB7XHJcbiAgICAgIE5BTUU6IFwiTGlnaHRzXCIsXHJcbiAgICAgIEJJTkRJTkc6IDBcclxuICAgIH0sXHJcbiAgICBTS0lOOiB7XHJcbiAgICAgIE5BTUU6IFwiU2tpblwiLFxyXG4gICAgICBCSU5ESU5HOiAxXHJcbiAgICB9LFxyXG4gICAgRk9HOiB7XHJcbiAgICAgIE5BTUU6IFwiRm9nXCIsXHJcbiAgICAgIEJJTkRJTkc6IDJcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBleHBvcnQgY29uc3QgVEVYVFVSRV9MT0NBVElPTiA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG4gICAgQ09MT1I6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleENvbG9yXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsXHJcbiAgICAgIElOREVYOiAwIC8vIGNvdWxkIGNvbXB1dGUgdGhlc2UgYnkgVU5JVCAtIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAgXHJcbiAgICB9LFxyXG4gICAgTk9STUFMOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhOb3JtYWxcIixcclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMSxcclxuICAgICAgSU5ERVg6IDFcclxuICAgIH0sXHJcbiAgICBQQVJUSUNMRToge1xyXG4gICAgICBVTklGT1JNOiBcInVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTIsXHJcbiAgICAgIElOREVYOiAyXHJcbiAgICB9LFxyXG4gICAgVEVYVDoge1xyXG4gICAgICBVTklGT1JNOiBcInVfdGV4VGV4dFwiLCAvLyBUT0RPOiBhZGQgdGV4dCB1bmlmb3JtIHRvIHNoYWRlci4uLlxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUzLFxyXG4gICAgICBJTkRFWDogM1xyXG4gICAgfSxcclxuICAgIFRPT046IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleFRvb25cIixcclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFNCxcclxuICAgICAgSU5ERVg6IDRcclxuICAgIH1cclxuICB9IGFzIGNvbnN0O1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBSZW5kZXJNYW5hZ2VyLCBoYW5kbGluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVuZGVyaW5nIHN5c3RlbSwgaW4gdGhpcyBjYXNlIFdlYkdMLlxyXG4gICAqIE1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgb2YgdGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSwgb25seSB0aHJvdWdoIHtAbGluayBSZW5kZXJ9XHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcldlYkdMIGV4dGVuZHMgRXZlbnRUYXJnZXRTdGF0aWMge1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IFJlbmRlcldlYkdMLmdldENhbnZhc1JlY3QoKTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9NYWluOiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIGZvciBmb3J3YXJkIHJlbmRlcmluZyBwYXNzZXMsIGUuZy4gb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBvYmplY3RzXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9Qb3N0OiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIGZvciBwb3N0LXByb2Nlc3NpbmcgZWZmZWN0cywgYXR0YWNobWVudHMgZ2V0IHN3YXBwZWQgZm9yIGRpZmZlcmVudCBlZmZlY3RzXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9UYXJnZXQ6IFdlYkdMRnJhbWVidWZmZXI7IC8vIHVzZWQgdG8gcmVuZGVyIHRoZSBmaW5hbCBpbWFnZSB0bywgdXN1YWxseSBcIm51bGxcIiB0byByZW5kZXIgdG8gdGhlIGNhbnZhcyBkZWZhdWx0IGZyYW1lYnVmZmVyLiBVc2VkIGJ5IFhSIHRvIHJlbmRlciB0byB0aGUgWFJXZWJHTExheWVyIGZyYW1lYnVmZmVyLlxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHRleENvbG9yOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgY29sb3Igb2YgZWFjaCBwaXhlbCByZW5kZXJlZFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4UG9zaXRpb246IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHBpeGVsIGluIHdvcmxkIHNwYWNlXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhOb3JtYWw6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBub3JtYWwgb2YgZWFjaCBwaXhlbCBpbiB3b3JsZCBzcGFjZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Tm9pc2U6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHJhbmRvbSB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwsIHVzZWQgZm9yIGFtYmllbnQgb2NjbHVzaW9uXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhEZXB0aFN0ZW5jaWw6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBkZXB0aCBvZiBlYWNoIHBpeGVsLCBjdXJyZW50bHkgdW51c2VkXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhCbG9vbVNhbXBsZXM6IFdlYkdMVGV4dHVyZVtdOyAvLyBzdG9yZXMgZG93biBhbmQgdXBzYW1wbGVkIHZlcnNpb25zIG9mIHRoZSBjb2xvciB0ZXh0dXJlLCB1c2VkIGZvciBibG9vbVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZib1BpY2s6IFdlYkdMQnVmZmVyO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4UGljazogV2ViR0xUZXh0dXJlO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4RGVwdGhQaWNrOiBXZWJHTFRleHR1cmU7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdWJvTGlnaHRzOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHByaXZhdGUgc3RhdGljIHVib0xpZ2h0c09mZnNldHM6IHsgW19uYW1lOiBzdHJpbmddOiBudW1iZXIgfTsgLy8gTWFwcyB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBpbnNpZGUgdGhlIExpZ2h0cyB1bmlmb3JtIGJsb2NrIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnl0ZSBvZmZzZXRcclxuICAgIHByaXZhdGUgc3RhdGljIHVib0ZvZzogV2ViR0xCdWZmZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBvZmZzY3JlZW4tY2FudmFzLCByZW5kZXJpbmdjb250ZXh0IGFuZCBoYXJkd2FyZSB2aWV3cG9ydC4gQ2FsbCBvbmNlIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzIGxpa2UgbWVzaGVzIG9yIHNoYWRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKF9hbnRpYWxpYXM/OiBib29sZWFuLCBfYWxwaGE/OiBib29sZWFuKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbCA9IFJlZmxlY3QuZ2V0KGdsb2JhbFRoaXMsIFwiZnVkZ2VDb25maWdcIikgfHwge307XHJcbiAgICAgIGNvbnN0IGFudGlhbGlhczogYm9vbGVhbiA9IChfYW50aWFsaWFzICE9IHVuZGVmaW5lZCkgPyBfYW50aWFsaWFzIDogZnVkZ2VDb25maWcuYW50aWFsaWFzIHx8IGZhbHNlO1xyXG4gICAgICBpZiAoYW50aWFsaWFzKVxyXG4gICAgICAgIERlYnVnLmVycm9yKFwiVGhlIGRlZmF1bHQgYW50aWFsaWFzaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMgYW5kIHdpbGwgdGhlcmVmb3JlIGJlIGRpc2FibGVkLlwiKTtcclxuICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzOiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzID0geyAvLyBUT0RPOiBcclxuICAgICAgICBhbHBoYTogKF9hbHBoYSAhPSB1bmRlZmluZWQpID8gX2FscGhhIDogZnVkZ2VDb25maWcuYWxwaGEgfHwgZmFsc2UsXHJcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcclxuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxyXG4gICAgICAgIHN0ZW5jaWw6IHRydWVcclxuICAgICAgfTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJJbml0aWFsaXplIFJlbmRlcldlYkdMXCIsIGNvbnRleHRBdHRyaWJ1dGVzKTtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgY3JjMyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTDJSZW5kZXJpbmdDb250ZXh0PihcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiLCBjb250ZXh0QXR0cmlidXRlcyksXHJcbiAgICAgICAgXCJXZWJHTC1jb250ZXh0IGNvdWxkbid0IGJlIGNyZWF0ZWRcIlxyXG4gICAgICApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzID0gY3JjMztcclxuICAgICAgLy8gRW5hYmxlIGJhY2tmYWNlLSBhbmQgekJ1ZmZlci1jdWxsaW5nLlxyXG4gICAgICBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNVTExfRkFDRSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyID0gUmVuZGVyV2ViR0wuZ2V0Q2FudmFzUmVjdCgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZUF0dGFjaG1lbnRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmFkanVzdEF0dGFjaG1lbnRzKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5pbml0aWFsaXplTGlnaHRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmluaXRpYWxpemVGb2coKTtcclxuXHJcbiAgICAgIHJldHVybiBjcmMzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDaGVja3MgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBXZWJHTC1lcnJvcmNvZGUgaWYgdGhlIHZhbHVlIGlzIG51bGxcclxuICAgICogQHBhcmFtIF92YWx1ZSAgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCBudWxsXHJcbiAgICAqIEBwYXJhbSBfbWVzc2FnZSAgb3B0aW9uYWwsIGFkZGl0aW9uYWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvblxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXNzZXJ0PFQ+KF92YWx1ZTogVCB8IG51bGwsIF9tZXNzYWdlOiBzdHJpbmcgPSBcIlwiKTogVCB7XHJcbiAgICAgIGlmIChfdmFsdWUgPT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlcnRpb24gZmFpbGVkLiAke19tZXNzYWdlfSwgV2ViR0wtRXJyb3I6ICR7UmVuZGVyV2ViR0wuY3JjMyA/IFJlbmRlcldlYkdMLmNyYzMuZ2V0RXJyb3IoKSA6IFwiXCJ9YCk7XHJcbiAgICAgIHJldHVybiBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIG9mZnNjcmVlbi1jYW52YXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xyXG4gICAgICByZXR1cm4gPEhUTUxDYW52YXNFbGVtZW50PlJlbmRlcldlYkdMLmNyYzMuY2FudmFzOyAvLyBUT0RPOiBlbmFibGUgT2Zmc2NyZWVuQ2FudmFzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyaW5nQ29udGV4dCgpOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IHtcclxuICAgICAgcmV0dXJuIFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWN0YW5nbGUgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2NyZWVuLWNhbnZhcy4geCx5IGFyZSAwIGF0IGFsbCB0aW1lcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDYW52YXNSZWN0KCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gPEhUTUxDYW52YXNFbGVtZW50PlJlbmRlcldlYkdMLmNyYzMuY2FudmFzO1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaXplIG9mIHRoZSBvZmZzY3JlZW4tY2FudmFzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENhbnZhc1NpemUoX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNhbnZhcy53aWR0aCA9IF93aWR0aDtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5jYW52YXMuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYXJlYSBvbiB0aGUgb2Zmc2NyZWVuLWNhbnZhcyB0byByZW5kZXIgdGhlIGNhbWVyYSBpbWFnZSB0by5cclxuICAgICAqIEBwYXJhbSBfcmVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFJlbmRlclJlY3RhbmdsZShfcmVjdDogUmVjdGFuZ2xlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLnJlY3RSZW5kZXIuc2V0UG9zaXRpb25BbmRTaXplKF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhlIG9mZnNjcmVlbiByZW5kZXJidWZmZXIgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIENvbG9yfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyKF9jb2xvcj86IENvbG9yLCBfY29sb3JzOiBib29sZWFuID0gdHJ1ZSwgX2RlcHRoOiBib29sZWFuID0gdHJ1ZSwgX3N0ZW5jaWw6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2xlYXJDb2xvcihfY29sb3I/LnIgPz8gMCwgX2NvbG9yPy5nID8/IDAsIF9jb2xvcj8uYiA/PyAwLCBfY29sb3I/LmEgPz8gMSk7XHJcbiAgICAgIGxldCBtYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAoX2NvbG9ycylcclxuICAgICAgICBtYXNrIHw9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVDtcclxuICAgICAgaWYgKF9kZXB0aClcclxuICAgICAgICBtYXNrIHw9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVDtcclxuICAgICAgaWYgKF9zdGVuY2lsKVxyXG4gICAgICAgIG1hc2sgfD0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2xlYXIobWFzayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZpbmFsIGZyYW1lYnVmZmVyIHRvIHJlbmRlciB0by4gSWYgbnVsbCwgdGhlIGNhbnZhcyBkZWZhdWx0IGZyYW1lYnVmZmVyIGlzIHVzZWQuXHJcbiAgICAgKiBVc2VkIGJ5IFhSIHRvIHJlbmRlciB0byB0aGUgWFJXZWJHTExheWVyIGZyYW1lYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEZyYW1lYnVmZmVyVGFyZ2V0KF9idWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvVGFyZ2V0ID0gX2J1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0IHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgbWFpbiBjb2xvciBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVzZXRGcmFtZWJ1ZmZlcigpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgYXJlYSBvbiB0aGUgb2Zmc2NyZWVuLWNhbnZhcyB0aGUgY2FtZXJhIGltYWdlIGdldHMgcmVuZGVyZWQgdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyUmVjdGFuZ2xlKCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgZGVwdGggdGVzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXREZXB0aFRlc3QoX3Rlc3Q6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF90ZXN0KVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmRpc2FibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9URVNUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb24gdXNlZCB0byB0ZXN0IGZyYWdtZW50IGRlcHRocyBhZ2FpbnN0IGN1cnJlbnQgZGVwdGggYnVmZmVyIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXREZXB0aEZ1bmN0aW9uKF9mdW5jdGlvbjogREVQVEhfRlVOQ1RJT04gPSBERVBUSF9GVU5DVElPTi5MRVNTKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZGVwdGhGdW5jKF9mdW5jdGlvbiArIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVWRVIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgc2Npc3NvciB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFNjaXNzb3JUZXN0KF90ZXN0OiBib29sZWFuLCBfeD86IG51bWJlciwgX3k/OiBudW1iZXIsIF93aWR0aD86IG51bWJlciwgX2hlaWdodD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TQ0lTU09SX1RFU1QpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kaXNhYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU0NJU1NPUl9URVNUKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5zY2lzc29yKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB3aGljaCBjb2xvciBjb21wb25lbnRzIHRvIGVuYWJsZSBvciB0byBkaXNhYmxlIHdoZW4gcmVuZGVyaW5nIHRvIGEgY29sb3IgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENvbG9yV3JpdGVNYXNrKF9yOiBib29sZWFuLCBfZzogYm9vbGVhbiwgX2I6IGJvb2xlYW4sIF9hOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY29sb3JNYXNrKF9yLCBfZywgX2IsIF9hKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBXZWJHTHMgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Vmlld3BvcnQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYmxlbmQgbW9kZSB0byByZW5kZXIgd2l0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEJsZW5kTW9kZShfbW9kZTogQkxFTkQpOiB2b2lkIHtcclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgQkxFTkQuT1BBUVVFOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuWkVSTyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELlRSQU5TUEFSRU5UOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNSQ19BTFBIQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuQURESVRJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICAvLyBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TUkNfQUxQSEEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuU1VCVFJBQ1RJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmxlbmRGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1JDX0FMUEhBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELk1PRFVMQVRFOiAvLyBjb2xvciBnZXRzIG11bHRpcGxpZWQsIHRyaWVkIHRvIGNvcHkgdW5pdHlzIFwiUGFydGljbGUgU2hhZGVyOiBCbGVuZGluZyBPcHRpb246IFJlbmRlcmluZyBNb2RlOiBNb2R1bGF0ZVwiXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9DT0xPUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgdGhlICh3b3JsZCkgcG9zaXRpb24gZnJvbSB0aGUgcGl4ZWwgYXQgdGhlIGdpdmVuIHBvaW50IG9uIHRoZSByZW5kZXItcmVjdGFuZ2xlIChvcmlnaW4gdG9wIGxlZnQpLlxyXG4gICAgICog4pqg77iPIENBVVRJT046IEN1cnJlbnRseSBvbmx5IHdvcmtzIHdoZW4gYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlIGR1ZSB0byB3cml0aW5nIHRvIHRoZSBwb3NpdGlvbiB0ZXh0dXJlIGJlaW5nIGRpc2FibGVkIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwb2ludFJlbmRlclRvV29ybGQoX3JlbmRlcjogVmVjdG9yMik6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEpO1xyXG4gICAgICBjcmMzLnJlYWRQaXhlbHMoX3JlbmRlci54LCBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLmhlaWdodCAtIF9yZW5kZXIueSwgMSwgMSwgY3JjMy5SR0JBLCBjcmMzLkZMT0FULCBkYXRhKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDApO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHBvc2l0aW9uLnNldChkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgZGlmZmVyZW50IGZyYW1lYnVmZmVycyBhc3dlbGwgYXMgdGV4dHVyZSBhdHRhY2htZW50cyB0byB1c2UgYXMgcmVuZGVyIHRhcmdldHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplQXR0YWNobWVudHMoKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKTsgLy8gVE9ETzogZGlzYWJsZSBzc2FvIGlmIG5vdCBzdXBwb3J0ZWRcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmZib01haW4gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xGcmFtZWJ1ZmZlcj4oUmVuZGVyV2ViR0wuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvUG9zdCA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEZyYW1lYnVmZmVyPihSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBudWxsO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9QaWNrID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmNyYzMuY3JlYXRlRnJhbWVidWZmZXIoKSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhDb2xvciA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhQb3NpdGlvbiA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhOb3JtYWwgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleE5vaXNlID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleFBpY2sgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXMgPSBuZXcgQXJyYXkoNik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib01haW4pO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24sIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Tm9ybWFsLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhEZXB0aFN0ZW5jaWwsIDApO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvUGljayk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhQaWNrLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX0FUVEFDSE1FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrLCAwKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIG51bGwpO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShfZmlsdGVyOiBudW1iZXIsIF93cmFwOiBudW1iZXIpOiBXZWJHTFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5jcmMzO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFRleHR1cmU+KGNyYzMuY3JlYXRlVGV4dHVyZSgpKTtcclxuICAgICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIF9maWx0ZXIpO1xyXG4gICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBfZmlsdGVyKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBfd3JhcCk7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgX3dyYXApO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgc2l6ZSBvZiB0aGUgZGlmZmVyZW50IHRleHR1cmUgYXR0YWNobWVudHMgKHJlbmRlciB0YXJnZXRzKSB0byB0aGUgY2FudmFzIHNpemVcclxuICAgICAqIOKaoO+4jyBDQVVUSU9OOiBFeHBlbnNpdmUgb3BlcmF0aW9uLCB1c2Ugb25seSB3aGVuIGNhbnZhcyBzaXplIGNoYW5nZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGp1c3RBdHRhY2htZW50cygpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNyYzMuY2FudmFzLndpZHRoIHx8IDE7XHJcbiAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY3JjMy5jYW52YXMuaGVpZ2h0IHx8IDE7XHJcblxyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoY3JjMy5URVhUVVJFMCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9CWVRFLCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhQb3NpdGlvbik7XHJcbiAgICAgIC8vIEluIHZpZXcgc3BhY2UgMTZGIHdvdWxkIGJlIHByZWNpc2UgZW5vdWdoLi4uIGJ1dCB3ZSB3YW50IHRvIHVzZSB3b3JsZCBzcGFjZSBmb3IgY2FsY3VsYXRpb25zXHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMyRiwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhOb3JtYWwpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkExNkYsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GTE9BVCwgbnVsbCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSDI0X1NURU5DSUw4LCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1NURU5DSUwsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfSU5UXzI0XzgsIG51bGwpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgZGl2aXNvcjogbnVtYmVyID0gMTsgaSA8IFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlcy5sZW5ndGg7IGkrKywgZGl2aXNvciAqPSAyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLndpZHRoIC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMuaGVpZ2h0IC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaV0pO1xyXG4gICAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIG51bGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuVmFsdWVzOiBudW1iZXIgPSB3aWR0aCAqIGhlaWdodCAqIDQ7XHJcbiAgICAgIGNvbnN0IG5vaXNlRGF0YTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KG5WYWx1ZXMpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WYWx1ZXM7IGkgKz0gNCkge1xyXG4gICAgICAgIG5vaXNlRGF0YVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAxXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAyXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAzXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoY3JjMy5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhOb2lzZSk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChjcmMzLlRFWFRVUkVfMkQsIDAsIGNyYzMuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgY3JjMy5SR0JBLCBjcmMzLlVOU0lHTkVEX0JZVEUsIG5vaXNlRGF0YSk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoY3JjMy5URVhUVVJFXzJELCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIHBpY2thYmxlIG9iamVjdCBpbiB0aGUgbGluZSBvZiBzaWdodCBhbmQgcmV0dXJucyB0aGF0IGFzIGFuIHVuc29ydGVkIGFycmF5IG9mIHtAbGluayBQaWNrfXMuXHJcbiAgICAgKiBUaGUgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBvYmplY3RzIGludG8gdGhlIHBpY2sgYnVmZmVyIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cclxuICAgICAqIEBwYXJhbSBfcGljayBUaGUgZnVuY3Rpb24gd2hpY2ggcmVuZGVycyBvYmplY3RzIGludG8gdGhlIHBpY2sgYnVmZmVyLiBSZXR1cm5zIGEge0BsaW5rIFBpY2t9IGZvciBlYWNoIHJlbmRlcmVkIG9iamVjdC4gXHJcbiAgICAgKiAqKk1VU1QqKiB1c2Uge0BsaW5rIFNoYWRlclBpY2t9IG9yIHtAbGluayBTaGFkZXJQaWNrVGV4dHVyZWR9IHRvIHJlbmRlciBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tGcm9tPFQ+KF9mcm9tOiBUW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2s6IChfZnJvbTogVFtdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpID0+IFBpY2tbXSk6IFBpY2tbXSB7IC8vIFRPRE86IHNlZSBpZiB0aGlyZCBwYXJhbWV0ZXIgX3dvcmxkPzogTWF0cml4NHg0IHdvdWxkIGJlIHVzZWZ1bGxcclxuICAgICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gTWF0aC5jZWlsKE1hdGguc3FydChfZnJvbS5sZW5ndGgpKTtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIC8vIGFkanVzdCBwaWNrIGJ1ZmZlciBzaXplXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1BpY2spO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4UGljayk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMySSwgc2l6ZSwgc2l6ZSwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBX0lOVEVHRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5ULCBudWxsKTsgLy8gY291bGQgdXNlIFJCR0EzMkYgaW4gdGhlIGZ1dHVyZSBlLmcuIFdlYkdQVVxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9DT01QT05FTlQyNCwgc2l6ZSwgc2l6ZSwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9DT01QT05FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfSU5ULCBudWxsKTtcclxuICAgICAgY3JjMy5jbGVhcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX0JVRkZFUl9CSVQpO1xyXG5cclxuICAgICAgLy8gYnVmZmVyIHNpemUgaW50byBwaWNrIHNoYWRlcnNcclxuICAgICAgU2hhZGVyUGljay51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmdihTaGFkZXJQaWNrLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbc2l6ZSwgc2l6ZV0pO1xyXG4gICAgICBTaGFkZXJQaWNrVGV4dHVyZWQudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZnYoU2hhZGVyUGlja1RleHR1cmVkLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbc2l6ZSwgc2l6ZV0pO1xyXG5cclxuICAgICAgLy8gcmVuZGVyIHBpY2tzIGludG8gcGljayBidWZmZXJcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELk9QQVFVRSk7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gX3BpY2soX2Zyb20sIF9jbXBDYW1lcmEpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG5cclxuICAgICAgLy8gZ2V0L2ZpbHRlciBwaWNrc1xyXG4gICAgICAvLyBldmFsdWF0ZSB0ZXh0dXJlIGJ5IHJlYWRpbmcgcGl4ZWxzIGFuZCBleHRyYWN0LCBjb252ZXJ0IGFuZCBzdG9yZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBtZXNoIGhpdFxyXG4gICAgICBsZXQgZGF0YTogSW50MzJBcnJheSA9IG5ldyBJbnQzMkFycmF5KHNpemUgKiBzaXplICogNCk7XHJcbiAgICAgIFJlbmRlci5jcmMzLnJlYWRQaXhlbHMoMCwgMCwgc2l6ZSwgc2l6ZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBX0lOVEVHRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5ULCBkYXRhKTtcclxuXHJcbiAgICAgIGxldCBwaWNrZWQ6IFBpY2tbXSA9IFtdO1xyXG4gICAgICBsZXQgbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKF9jbXBDYW1lcmEubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGlja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgekJ1ZmZlcjogbnVtYmVyID0gZGF0YVs0ICogaSArIDBdICsgZGF0YVs0ICogaSArIDFdIC8gMjU2O1xyXG4gICAgICAgIGlmICh6QnVmZmVyID09IDApIC8vIGRpc2NhcmQgbWlzc2VzIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBwaWNrc1tpXTtcclxuICAgICAgICBwaWNrLnpCdWZmZXIgPSBjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoZGF0YSwgNCAqIGkgKyAwKSAqIDIgLSAxO1xyXG4gICAgICAgIHBpY2suY29sb3IgPSBjb252ZXJ0SW50MzJ0b0NvbG9yKGRhdGEsIDQgKiBpICsgMSk7XHJcbiAgICAgICAgcGljay50ZXh0dXJlVVYgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgICBwaWNrLnRleHR1cmVVVi5zZXQoY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMiksIGNvbnZlcnRJbnQzMnRvRmxvYXQzMihkYXRhLCA0ICogaSArIDMpKTtcclxuICAgICAgICBwaWNrLm10eFZpZXdUb1dvcmxkID0gbXR4Vmlld1RvV29ybGQ7XHJcblxyXG4gICAgICAgIHBpY2tlZC5wdXNoKHBpY2spO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5yZXNldEZyYW1lYnVmZmVyKCk7XHJcblxyXG4gICAgICByZXR1cm4gcGlja2VkO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY29udmVydEludDMydG9GbG9hdDMyKF9pbnQzMkFycmF5OiBJbnQzMkFycmF5LCBfaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7XHJcbiAgICAgICAgbGV0IHZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XHJcbiAgICAgICAgdmlldy5zZXRJbnQzMigwLCBfaW50MzJBcnJheVtfaW5kZXhdKTtcclxuICAgICAgICByZXR1cm4gdmlldy5nZXRGbG9hdDMyKDApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBjb252ZXJ0SW50MzJ0b0NvbG9yKF9pbnQzMkFycmF5OiBJbnQzMkFycmF5LCBfaW5kZXg6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgICBsZXQgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTtcclxuICAgICAgICBsZXQgdmlldzogRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcclxuICAgICAgICB2aWV3LnNldEludDMyKDAsIF9pbnQzMkFycmF5W19pbmRleF0pO1xyXG4gICAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoYHJnYigke3ZpZXcuZ2V0VWludDgoMCl9LCAke3ZpZXcuZ2V0VWludDgoMSl9LCAke3ZpZXcuZ2V0VWludDgoMil9KWAsIHZpZXcuZ2V0VWludDgoMykgLyAyNTUpO1xyXG4gICAgICAgIHJldHVybiBjb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlciBmdW5jdGlvbiBmb3IgcGlja2luZyBub2Rlcy4gXHJcbiAgICAgKiBBIGNhbWVyYXByb2plY3Rpb24gd2l0aCBleHRyZW1lbHkgbmFycm93IGZvY3VzIGlzIHVzZWQsIHNvIGVhY2ggcGl4ZWwgb2YgdGhlIGJ1ZmZlciB3b3VsZCBob2xkIHRoZSBzYW1lIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUsICBcclxuICAgICAqIGJ1dCB0aGUgZnJhZ21lbnQgc2hhZGVyIHJlbmRlcnMgb25seSAxIHBpeGVsIGZvciBlYWNoIG5vZGUgaW50byB0aGUgcmVuZGVyIGJ1ZmZlciwgMXN0IG5vZGUgdG8gMXN0IHBpeGVsLCAybmQgbm9kZSB0byBzZWNvbmQgcGl4ZWwgZXRjLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2soX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gW107XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgX25vZGVzKSB7XHJcbiAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICAgIGlmICghKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNvYXQgaW5zdGFuY2VvZiBDb2F0VGV4dHVyZWQgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJQaWNrO1xyXG5cclxuICAgICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gUmVuZGVyV2ViR0wuY2FsY01lc2hUb1ZpZXcobm9kZSwgY21wTWVzaC5tdHhXb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIGxldCBtZXNoOiBNZXNoID0gY21wTWVzaC5tZXNoO1xyXG4gICAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbWVzaC51c2VSZW5kZXJCdWZmZXJzKHNoYWRlciwgbm9kZS5tdHhXb3JsZCwgbXR4TWVzaFRvVmlldywgcGlja3MubGVuZ3RoKTtcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmRyYXdFbGVtZW50cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgcmVuZGVyQnVmZmVycy5uSW5kaWNlcywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcblxyXG4gICAgICAgIHBpY2tzLnB1c2gobmV3IFBpY2sobm9kZSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcGlja3M7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluaXRpYWxpemVGb2coKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0ZvZyA9IFJlbmRlcldlYkdMLmFzc2VydChSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5GT0cuQklORElORywgUmVuZGVyV2ViR0wudWJvRm9nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZm9nIHBhcmFtZXRlcnMgaW50byB0aGUgZm9nIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckZvZyhfY21wRm9nOiBDb21wb25lbnRGb2cpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoOCk7XHJcblxyXG4gICAgICBkYXRhWzBdID0gX2NtcEZvZz8uaXNBY3RpdmUgPyAxIDogMDtcclxuICAgICAgaWYgKF9jbXBGb2cpIHtcclxuICAgICAgICBkYXRhWzFdID0gX2NtcEZvZy5uZWFyO1xyXG4gICAgICAgIGRhdGFbMl0gPSBfY21wRm9nLmZhcjtcclxuICAgICAgICBkYXRhLnNldChfY21wRm9nLmNvbG9yLmdldCgpLCA0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYnVmZmVyIGRhdGEgdG8gYm91bmQgYnVmZmVyXHJcbiAgICAgIGNyYzMuYmluZEJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBSZW5kZXJXZWJHTC51Ym9Gb2cpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgZGF0YSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5pdGlhbGl6ZUxpZ2h0cygpOiB2b2lkIHtcclxuICAgICAgY29uc3QgTUFYX0xJR0hUU19ESVJFQ1RJT05BTDogbnVtYmVyID0gMTU7IC8vIG11c3QgbWF0Y2ggdGhlIGRlZmluZSBpbiB0aGUgc2hhZGVyXHJcbiAgICAgIGNvbnN0IE1BWF9MSUdIVFNfUE9JTlQ6IG51bWJlciA9IDEwMDtcclxuICAgICAgY29uc3QgTUFYX0xJR0hUU19TUE9UOiBudW1iZXIgPSAxMDA7XHJcbiAgICAgIGNvbnN0IEJZVEVTX1BFUl9MSUdIVDogbnVtYmVyID0gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogKDQgKyAxNiArIDE2KTsgLy8gdmN0Q29sb3IgKyBtdHhTaGFwZSArIG10eFNoYXBlSW52ZXJzZSBhcyBmbG9hdDMycyBpbiBzaGFkZXJcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHMgPSB7fTtcclxuICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiAwO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9uTGlnaHRzUG9pbnRcIl0gPSBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDE7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X25MaWdodHNTcG90XCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiAyO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9hbWJpZW50XCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiA0O1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9kaXJlY3Rpb25hbFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X2FtYmllbnRcIl0gKyBCWVRFU19QRVJfTElHSFQgKiAxO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9wb2ludFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X2RpcmVjdGlvbmFsXCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19ESVJFQ1RJT05BTDtcclxuICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfc3BvdFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X3BvaW50XCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19QT0lOVDtcclxuXHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0cyA9IFJlbmRlcldlYkdMLmFzc2VydChjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgY29uc3QgYmxvY2tTaXplOiBudW1iZXIgPSBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9zcG90XCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19TUE9UO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIFJlbmRlcldlYkdMLnVib0xpZ2h0cyk7XHJcbiAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBibG9ja1NpemUsIGNyYzMuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5MSUdIVFMuQklORElORywgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lZ3JhcGggaW50byB0aGUgbGlnaHRzIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckxpZ2h0cyhfbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCk6IHZvaWQge1xyXG4gICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuXHJcbiAgICAgIC8vIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhbWJpZW50IGxpZ2h0IGNvbG9yXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KExpZ2h0QW1iaWVudCk7XHJcbiAgICAgIGlmIChjbXBMaWdodHMpIHtcclxuICAgICAgICBsZXQgY2xyU3VtOiBDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAwLCAwKTtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpIHtcclxuICAgICAgICAgIGxldCBjbHJMaWdodDogQ29sb3IgPSBDb2xvci5QUk9EVUNUKGNtcExpZ2h0LmxpZ2h0LmNvbG9yLCBjbXBMaWdodC5saWdodC5pbnRlbnNpdHkpO1xyXG4gICAgICAgICAgY2xyU3VtLmFkZChjbHJMaWdodCk7XHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShjbHJMaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJ1ZmZlclN1YkRhdGEoXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLlVOSUZPUk1fQlVGRkVSLFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfYW1iaWVudFwiXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBcInVfYW1iaWVudFwiIGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGNsclN1bS5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgbGlnaHQgZGF0YSBmb3IgZWFjaCBsaWdodCB0eXBlXHJcbiAgICAgIC8vIHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgYSBtYXhpbXVtIG9mIDQgY3JjMy5idWZmZXJTdWJEYXRhKCkgY2FsbHMsIGJ1dCB3ZSBjb3VsZCBkbyB0aGlzIGluIG9uZSBjYWxsXHJcbiAgICAgIGJ1ZmZlckxpZ2h0c09mVHlwZShMaWdodERpcmVjdGlvbmFsLCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIsIFwidV9kaXJlY3Rpb25hbFwiKTtcclxuICAgICAgYnVmZmVyTGlnaHRzT2ZUeXBlKExpZ2h0UG9pbnQsIFwidV9uTGlnaHRzUG9pbnRcIiwgXCJ1X3BvaW50XCIpO1xyXG4gICAgICBidWZmZXJMaWdodHNPZlR5cGUoTGlnaHRTcG90LCBcInVfbkxpZ2h0c1Nwb3RcIiwgXCJ1X3Nwb3RcIik7XHJcblxyXG4gICAgICBmdW5jdGlvbiBidWZmZXJMaWdodHNPZlR5cGUoX3R5cGU6IFR5cGVPZkxpZ2h0LCBfdW5pTmFtZTogc3RyaW5nLCBfdW5pU3RydWN0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KF90eXBlKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbX3VuaU5hbWVdLCAvLyBieXRlIG9mZnNldCBvZiB0aGUgdWludCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIgaW5zaWRlIHRoZSB1Ym9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KFtjbXBMaWdodHM/Lmxlbmd0aCA/PyAwXSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIWNtcExpZ2h0cylcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgbGlnaHREYXRhU2l6ZTogbnVtYmVyID0gNCArIDE2ICsgMTY7IC8vIHZjdENvbG9yICsgbXR4U2hhcGUgKyBtdHhTaGFwZUludmVyc2UsIGFzIGZsb2F0MzJzXHJcbiAgICAgICAgY29uc3QgbGlnaHRzRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShjbXBMaWdodHMubGVuZ3RoICogbGlnaHREYXRhU2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBpTGlnaHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY21wTGlnaHQgb2YgY21wTGlnaHRzKSB7XHJcbiAgICAgICAgICBjb25zdCBsaWdodERhdGFPZmZzZXQ6IG51bWJlciA9IGlMaWdodCAqIGxpZ2h0RGF0YVNpemU7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHZjdENvbG9yXHJcbiAgICAgICAgICBsZXQgY2xyTGlnaHQ6IENvbG9yID0gQ29sb3IuUFJPRFVDVChjbXBMaWdodC5saWdodC5jb2xvciwgY21wTGlnaHQubGlnaHQuaW50ZW5zaXR5KTtcclxuICAgICAgICAgIGxpZ2h0c0RhdGEuc2V0KGNsckxpZ2h0LmdldCgpLCBsaWdodERhdGFPZmZzZXQgKyAwKTtcclxuICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKGNsckxpZ2h0KTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgbXR4U2hhcGVcclxuICAgICAgICAgIGxldCBtdHhUb3RhbDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoY21wTGlnaHQubm9kZS5tdHhXb3JsZCwgY21wTGlnaHQubXR4UGl2b3QpO1xyXG4gICAgICAgICAgaWYgKF90eXBlID09IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IHplcm86IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgbXR4VG90YWwudHJhbnNsYXRpb24gPSB6ZXJvO1xyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZSh6ZXJvKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsaWdodHNEYXRhLnNldChtdHhUb3RhbC5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCk7IC8vIG9mZnNldCArIHZjdENvbG9yXHJcblxyXG4gICAgICAgICAgLy8gc2V0IG10eFNoYXBlSW52ZXJzZVxyXG4gICAgICAgICAgaWYgKF90eXBlICE9IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFRvdGFsKTtcclxuICAgICAgICAgICAgbGlnaHRzRGF0YS5zZXQobXR4SW52ZXJzZS5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCArIDE2KTsgLy8gb2Zmc2V0ICsgdmN0Q29sb3IgKyBtdHhTaGFwZVxyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhJbnZlcnNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUb3RhbCk7XHJcbiAgICAgICAgICBpTGlnaHQrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYnVmZmVyU3ViRGF0YShcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuVU5JRk9STV9CVUZGRVIsXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW191bmlTdHJ1Y3RdLCAvLyBieXRlIG9mZnNldCBvZiB0aGUgc3RydWN0IExpZ2h0IGFycmF5IGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBsaWdodHNEYXRhXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGdpdmVuIG5vZGVzIHVzaW5nIHRoZSBnaXZlbiBjYW1lcmEgYW5kIHRoZSBwb3N0IHByb2Nlc3MgY29tcG9uZW50cyBhdHRhY2hlZCB0byB0aGUgc2FtZSBub2RlIGFzIHRoZSBjYW1lcmFcclxuICAgICAqIFRoZSBvcGFxdWUgbm9kZXMgYXJlIGRyYXduIGZpcnN0LCB0aGVuIHNzYW8gaXMgYXBwbGllZCwgdGhlbiBibG9vbSBpcyBhcHBsaWVkLCB0aGVuIG5vZGVzIGFscGhhIChzb3J0Rm9yQWxwaGEpIGFyZSBkcmF3bi5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Tm9kZXMoX25vZGVzT3BhcXVlOiBJdGVyYWJsZTxOb2RlPiwgX25vZGVzQWxwaGE6IEl0ZXJhYmxlPE5vZGU+LCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGNtcEZvZzogQ29tcG9uZW50Rm9nID0gX2NtcENhbWVyYS5ub2RlPy5nZXRDb21wb25lbnQoQ29tcG9uZW50Rm9nKTtcclxuICAgICAgY29uc3QgY21wQW1iaWVudE9jY2x1c2lvbjogQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbiA9IF9jbXBDYW1lcmEubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24pO1xyXG4gICAgICBjb25zdCBjbXBCbG9vbTogQ29tcG9uZW50Qmxvb20gPSBfY21wQ2FtZXJhLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRCbG9vbSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5idWZmZXJGb2coY21wRm9nKTtcclxuXHJcbiAgICAgIC8vIG9wYXF1ZSBwYXNzIFxyXG4gICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBkaXNhYmxpbmcgYmxlbmRpbmcgZm9yIGFsbCBvcGFxdWUgb2JqZWN0cywgdGhpcyBtaWdodCBpbXByb3ZlIHBlcmZvcm1hbmNlIFxyXG4gICAgICAvLyBhcyBvdGhlcndpc2UgdGhlIDMgY29sb3IgYXR0YWNobWVudHMgKGNvbG9yLCBwb3NpdGlvbiBhbmQgbm9ybWFscykgYWxsIG5lZWQgdG8gYmUgYmxlbmRlZFxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5kcmF3QnVmZmVycyhjbXBBbWJpZW50T2NjbHVzaW9uPy5pc0FjdGl2ZSA/IC8vIG9ubHkgdXNlIHBvc2l0aW9uIGFuZCBub3JtYWwgdGV4dHVyZXMgaWYgYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlXHJcbiAgICAgICAgW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDJdIDpcclxuICAgICAgICBbV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMF1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkJMRU5EKTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXNPcGFxdWUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd05vZGUobm9kZSwgX2NtcENhbWVyYSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG5cclxuICAgICAgLy8gYW1iaWVudCBvY2NsdXNpb24gcGFzc1xyXG4gICAgICBpZiAoY21wQW1iaWVudE9jY2x1c2lvbj8uaXNBY3RpdmUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd0FtYmllbnRPY2NsdXNpb24oX2NtcENhbWVyYSwgY21wQW1iaWVudE9jY2x1c2lvbik7XHJcblxyXG4gICAgICAvLyBibG9vbSBwYXNzXHJcbiAgICAgIGlmIChjbXBCbG9vbT8uaXNBY3RpdmUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd0Jsb29tKGNtcEJsb29tKTtcclxuXHJcbiAgICAgIC8vIHRyYW5zcGFyZW50IHBhc3MgVE9ETzogdGhpbmsgYWJvdXQgZGlzYWJsaW5nIGRlcHRoIHdyaXRlIGZvciBhbGwgdHJhbnNwYXJlbnQgb2JqZWN0cyAtPiB0aGlzIG1pZ2h0IG1ha2UgZGVwdGggbWFzayBvcHRpb24gaW4gY29tcG9uZW50IHBhcnRpY2xlIHN5c3RlbSBvYnNvbGV0ZVxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5kcmF3QnVmZmVycyhbV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMF0pO1xyXG5cclxuICAgICAgLy8gY3JjMy5kZXB0aE1hc2soZmFsc2UpO1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIF9ub2Rlc0FscGhhKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdOb2RlKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG4gICAgICAvLyBjcmMzLmRlcHRoTWFzayh0cnVlKTtcclxuXHJcbiAgICAgIC8vIGNvcHkgZnJhbWVidWZmZXIgdG8gY2FudmFzXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVBRF9GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRFJBV19GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvVGFyZ2V0KTtcclxuICAgICAgY3JjMy5ibGl0RnJhbWVidWZmZXIoMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCwgMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9CVUZGRVJfQklUIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9CVUZGRVJfQklULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIG9jY2x1c2lvbiBvdmVyIHRoZSBjb2xvci1idWZmZXIsIHVzaW5nIHRoZSBnaXZlbiBhbWJpZW50LW9jY2x1c2lvbi1jb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3QW1iaWVudE9jY2x1c2lvbihfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9jbXBBbWJpZW50T2NjbHVzaW9uOiBDb21wb25lbnRBbWJpZW50T2NjbHVzaW9uKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIFNoYWRlckFtYmllbnRPY2NsdXNpb24udXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhQb3NpdGlvblwiKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4Tm9ybWFsLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUxLCBcInVfdGV4Tm9ybWFsXCIpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJBbWJpZW50T2NjbHVzaW9uLCBSZW5kZXJXZWJHTC50ZXhOb2lzZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMiwgXCJ1X3RleE5vaXNlXCIpO1xyXG5cclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZk5lYXJcIl0sIF9jbXBDYW1lcmEuZ2V0TmVhcigpKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkZhclwiXSwgX2NtcENhbWVyYS5nZXRGYXIoKSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZCaWFzXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5iaWFzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZlNhbXBsZVJhZGl1c1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uc2FtcGxlUmFkaXVzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uQ29uc3RhbnRcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLmF0dGVudWF0aW9uQ29uc3RhbnQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV9mQXR0ZW51YXRpb25MaW5lYXJcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLmF0dGVudWF0aW9uTGluZWFyKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uUXVhZHJhdGljXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvblF1YWRyYXRpYyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X3ZjdFJlc29sdXRpb25cIl0sIFJlbmRlcldlYkdMLmdldENhbnZhcygpLndpZHRoLCBSZW5kZXJXZWJHTC5nZXRDYW52YXMoKS5oZWlnaHQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0zZnYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfdmN0Q2FtZXJhXCJdLCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldCgpKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1Bvc3QpO1xyXG4gICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuU1VCVFJBQ1RJVkUpO1xyXG4gICAgICBjcmMzLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIDAsIDMpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGJsb29tLWVmZmVjdCBvdmVyIHRoZSBjb2xvci1idWZmZXIsIHVzaW5nIHRoZSBnaXZlbiBibG9vbS1jb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Qmxvb20oX2NtcEJsb29tOiBDb21wb25lbnRCbG9vbSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBTaGFkZXJCbG9vbS51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICAvLyBleHRyYWN0IGJyaWdodCBjb2xvcnMsIGNvdWxkIG1vdmUgdGhpcyB0byBtYWluIHJlbmRlciBwYXNzIHNvIHRoYXQgaW5kaXZpZHVhbCBvYmplY3RzIGNhbiBiZSBleGVtcHQgZnJvbSBibG9vbVxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9Qb3N0KTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1swXSwgMCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNsZWFyKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9mVGhyZXNob2xkXCJdLCBfY21wQmxvb20udGhyZXNob2xkKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAwKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuXHJcbiAgICAgIC8vIGRvd25zYW1wbGVcclxuICAgICAgY29uc3QgaXRlcmF0aW9uczogbnVtYmVyID0gUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMSwgZGl2aXNvcjogbnVtYmVyID0gMjsgaSA8IGl0ZXJhdGlvbnM7IGkrKywgZGl2aXNvciAqPSAyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLndpZHRoIC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMuaGVpZ2h0IC8gZGl2aXNvciksIDEpO1xyXG5cclxuICAgICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldLCAwKTtcclxuICAgICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5jbGVhcigpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2kgLSAxXSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCwgXCJ1X3RleFNvdXJjZVwiKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0xaShTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfaU1vZGVcIl0sIDEpO1xyXG4gICAgICAgIGNyYzMudW5pZm9ybTJmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV92Y3RUZXhlbFwiXSwgMC41IC8gd2lkdGgsIDAuNSAvIGhlaWdodCk7IC8vIGhhbGYgdGV4ZWwgc2l6ZVxyXG4gICAgICAgIC8vIGNyYzMudW5pZm9ybTJmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV92Y3RSZXNvbHV0aW9uXCJdLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELkFERElUSVZFKTtcclxuXHJcbiAgICAgIC8vIHVwc2FtcGxlXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGl0ZXJhdGlvbnMgLSAxLCBkaXZpc29yOiBudW1iZXIgPSAyICoqIChpdGVyYXRpb25zIC0gMik7IGkgPiAwOyBpLS0sIGRpdmlzb3IgLz0gMikge1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy53aWR0aCAvIGRpdmlzb3IpLCAxKTtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLmhlaWdodCAvIGRpdmlzb3IpLCAxKTtcclxuXHJcbiAgICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpIC0gMV0sIDApO1xyXG4gICAgICAgIGNyYzMudmlld3BvcnQoMCwgMCwgTWF0aC5yb3VuZCh3aWR0aCksIE1hdGgucm91bmQoaGVpZ2h0KSk7XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckJsb29tLCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaV0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAyKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0VGV4ZWxcIl0sIDAuNSAvIHdpZHRoLCAwLjUgLyBoZWlnaHQpOyAvLyBoYWxmIHRleGVsIHNpemVcclxuICAgICAgICAvLyBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0UmVzb2x1dGlvblwiXSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNyYzMudmlld3BvcnQoMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzWzBdLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfaU1vZGVcIl0sIDMpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZkludGVuc2l0eVwiXSwgX2NtcEJsb29tLmludGVuc2l0eSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9mSGlnaGxpZ2h0RGVzYXR1cmF0aW9uXCJdLCBfY21wQmxvb20uaGlnaGxpZ2h0RGVzYXR1cmF0aW9uKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5UUkFOU1BBUkVOVCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGEgbWVzaCBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIGluZm9zIGFuZCB0aGUgY29tcGxldGUgcHJvamVjdGlvbiBtYXRyaXhcclxuICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGRyYXdOb2RlKF9ub2RlOiBOb2RlLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICBsZXQgY21wVGV4dDogQ29tcG9uZW50VGV4dCA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRUZXh0KTtcclxuICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICBsZXQgY21wUGFydGljbGVTeXN0ZW06IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTtcclxuICAgICAgbGV0IGRyYXdQYXJ0aWNsZXM6IGJvb2xlYW4gPSBjbXBQYXJ0aWNsZVN5c3RlbSAmJiBjbXBQYXJ0aWNsZVN5c3RlbS5pc0FjdGl2ZTtcclxuICAgICAgbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuZ2V0U2hhZGVyKCk7XHJcbiAgICAgIGlmIChkcmF3UGFydGljbGVzKVxyXG4gICAgICAgIHNoYWRlciA9IGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtLmdldFNoYWRlckZyb20oc2hhZGVyKTtcclxuXHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBtdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0ID0gY21wTWVzaC5tdHhXb3JsZDtcclxuXHJcbiAgICAgIGlmIChjbXBUZXh0Py5pc0FjdGl2ZSlcclxuICAgICAgICBtdHhNZXNoVG9Xb3JsZCA9IGNtcFRleHQudXNlUmVuZGVyRGF0YShtdHhNZXNoVG9Xb3JsZCwgX2NtcENhbWVyYSk7XHJcblxyXG4gICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gUmVuZGVyV2ViR0wuY2FsY01lc2hUb1ZpZXcoX25vZGUsIG10eE1lc2hUb1dvcmxkLCBfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3LCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSBjbXBNZXNoLm1lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIG10eE1lc2hUb1dvcmxkLCBtdHhNZXNoVG9WaWV3KTtcclxuXHJcbiAgICAgIGlmIChjbXBNZXNoLnNrZWxldG9uPy5pc0FjdGl2ZSlcclxuICAgICAgICBjbXBNZXNoLnNrZWxldG9uLnVzZVJlbmRlckJ1ZmZlcihzaGFkZXIpO1xyXG5cclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gc2hhZGVyLnVuaWZvcm1zW1widV92Y3RDYW1lcmFcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMudW5pZm9ybTNmdih1bmlmb3JtLCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBzaGFkZXIudW5pZm9ybXNbXCJ1X210eFdvcmxkVG9WaWV3XCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9jbXBDYW1lcmEubXR4V29ybGRUb1ZpZXcuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IHNoYWRlci51bmlmb3Jtc1tcInVfbXR4V29ybGRUb0NhbWVyYVwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pIHtcclxuICAgICAgICAvLyBsZXQgbXR4V29ybGRUb0NhbWVyYTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0lPTihfY21wQ2FtZXJhLm10eFdvcmxkKTsgLy8gdG9kbzogb3B0aW1pemUvc3RvcmUgaW4gY2FtZXJhXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfY21wQ2FtZXJhLm10eENhbWVyYUludmVyc2UuZ2V0KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB1bmlmb3JtID0gc2hhZGVyLnVuaWZvcm1zW1widV9mQWxwaGFDbGlwXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm0xZih1bmlmb3JtLCBjbXBNYXRlcmlhbC5tYXRlcmlhbC5hbHBoYUNsaXApO1xyXG5cclxuICAgICAgaWYgKGRyYXdQYXJ0aWNsZXMpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd1BhcnRpY2xlcyhjbXBQYXJ0aWNsZVN5c3RlbSwgc2hhZGVyLCByZW5kZXJCdWZmZXJzLCBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50RmFjZUNhbWVyYSkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIHJlbmRlckJ1ZmZlcnMubkluZGljZXMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd1BhcnRpY2xlcyhfY21wUGFydGljbGVTeXN0ZW06IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtLCBfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzLCBfY21wRmFjZUNhbWVyYTogQ29tcG9uZW50RmFjZUNhbWVyYSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY3JjMy5kZXB0aE1hc2soX2NtcFBhcnRpY2xlU3lzdGVtLmRlcHRoTWFzayk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShfY21wUGFydGljbGVTeXN0ZW0uYmxlbmRNb2RlKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfaUJsZW5kTW9kZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLmJsZW5kTW9kZSk7XHJcbiAgICAgIF9jbXBQYXJ0aWNsZVN5c3RlbS51c2VSZW5kZXJEYXRhKCk7XHJcblxyXG4gICAgICBjcmMzLnVuaWZvcm0xZihfc2hhZGVyLnVuaWZvcm1zW1widV9mUGFydGljbGVTeXN0ZW1EdXJhdGlvblwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLmR1cmF0aW9uKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtU2l6ZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLnNpemUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihfc2hhZGVyLnVuaWZvcm1zW1widV9mUGFydGljbGVTeXN0ZW1UaW1lXCJdLCBfY21wUGFydGljbGVTeXN0ZW0udGltZSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5QQVJUSUNMRS5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5QQVJUSUNMRS5JTkRFWCk7XHJcblxyXG4gICAgICBsZXQgZmFjZUNhbWVyYTogYm9vbGVhbiA9IF9jbXBGYWNlQ2FtZXJhICYmIF9jbXBGYWNlQ2FtZXJhLmlzQWN0aXZlO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1widV9iUGFydGljbGVTeXN0ZW1GYWNlQ2FtZXJhXCJdLCBmYWNlQ2FtZXJhID8gMSA6IDApO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1widV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdFwiXSwgZmFjZUNhbWVyYSAmJiBfY21wRmFjZUNhbWVyYS5yZXN0cmljdCA/IDEgOiAwKTtcclxuXHJcbiAgICAgIGNyYzMuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCBfcmVuZGVyQnVmZmVycy5uSW5kaWNlcywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCwgX2NtcFBhcnRpY2xlU3lzdGVtLnNpemUpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlRSQU5TUEFSRU5UKTtcclxuICAgICAgY3JjMy5kZXB0aE1hc2sodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2FsY01lc2hUb1ZpZXcoX25vZGU6IE5vZGUsIF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfbXR4V29ybGRUb1ZpZXc6IE1hdHJpeDR4NCwgX3RhcmdldD86IFZlY3RvcjMpOiBNYXRyaXg0eDQge1xyXG4gICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGEgUmVuZGVyIGZ1bmN0aW9uIGFzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIHdpdGggV2ViR0xcclxuICAgICAgbGV0IGNtcEZhY2VDYW1lcmE6IENvbXBvbmVudEZhY2VDYW1lcmEgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50RmFjZUNhbWVyYSk7XHJcbiAgICAgIGlmIChjbXBGYWNlQ2FtZXJhICYmIGNtcEZhY2VDYW1lcmEuaXNBY3RpdmUpIHtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0OyAvLyBtZXNoIHRvIHdvcmxkP1xyXG4gICAgICAgIG10eE1lc2hUb1ZpZXcgPSBfbXR4TWVzaFRvV29ybGQuY2xvbmU7XHJcbiAgICAgICAgbXR4TWVzaFRvVmlldy5sb29rQXQoX3RhcmdldCwgY21wRmFjZUNhbWVyYS51cExvY2FsID8gbnVsbCA6IGNtcEZhY2VDYW1lcmEudXAsIGNtcEZhY2VDYW1lcmEucmVzdHJpY3QpO1xyXG4gICAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVChfbXR4V29ybGRUb1ZpZXcsIG10eE1lc2hUb1ZpZXcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eFdvcmxkVG9WaWV3LCBfbXR4TWVzaFRvV29ybGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJpbmRUZXh0dXJlKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX3RleHR1cmU6IFdlYkdMVGV4dHVyZSwgX3VuaXQ6IG51bWJlciwgX3VuaWZvcm06IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoX3VuaXQpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgX3RleHR1cmUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW191bmlmb3JtXSwgX3VuaXQgLSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBUZXh0dXJlfVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvclRleHR1cmUgZXh0ZW5kcyBSZW5kZXJJbmplY3RvciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3IuaW5qZWN0KF9jb25zdHJ1Y3RvciwgUmVuZGVySW5qZWN0b3JUZXh0dXJlKTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZGVsZXRlUmVuZGVyRGF0YVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yVGV4dHVyZS5kZWxldGVSZW5kZXJEYXRhXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0VGV4dHVyZSh0aGlzOiBUZXh0dXJlLCBfdGV4dHVyZVVuaXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTApOiB2b2lkIHtcclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJEYXRhKVxyXG4gICAgICAgIHRoaXMucmVuZGVyRGF0YSA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFRleHR1cmU+KGNyYzMuY3JlYXRlVGV4dHVyZSgpKTsgLy8gVE9ETzogY2hlY2sgaWYgYWxsIFdlYkdMLUNyZWF0aW9ucyBhcmUgYXNzZXJ0ZWRcclxuXHJcbiAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShfdGV4dHVyZVVuaXQpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgdGhpcy5yZW5kZXJEYXRhKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRleHR1cmVEaXJ0eSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBBbHdheXMgcHJlbXVsdGlwbHkgYWxwaGEgd2hpbGUgbG9hZGluZyB0ZXh0dXJlc1xyXG4gICAgICAgICAgY3JjMy5waXhlbFN0b3JlaShjcmMzLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgdGhpcy50ZXhJbWFnZVNvdXJjZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNyYzMucGl4ZWxTdG9yZWkoY3JjMy5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLm1pcG1hcERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihfZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubWlwbWFwRGlydHkpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMubWlwbWFwKSB7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5DUklTUDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgTUlQTUFQLk1FRElVTTpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1RfTUlQTUFQX0xJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMuZ2VuZXJhdGVNaXBtYXAoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5CTFVSUlk6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUl9NSVBNQVBfTElORUFSKTtcclxuICAgICAgICAgICAgY3JjMy5nZW5lcmF0ZU1pcG1hcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgTUlQTUFQLlNNT09USDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWlwbWFwRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMud3JhcERpcnR5KSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLndyYXApIHtcclxuICAgICAgICAgIGNhc2UgV1JBUC5SRVBFQVQ6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgV1JBUC5DTEFNUDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuTUlSUk9SOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTUlSUk9SRURfUkVQRUFUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndyYXBEaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJEYXRhKHRoaXM6IFRleHR1cmUpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnJlbmRlckRhdGEpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIHRoaXMucmVuZGVyRGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMud3JhcERpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGNvbnN0IGVudW0gRVZFTlRfUEhZU0lDUyB7XHJcbiAgICBUUklHR0VSX0VOVEVSID0gXCJUcmlnZ2VyRW50ZXJlZENvbGxpc2lvblwiLFxyXG4gICAgVFJJR0dFUl9FWElUID0gXCJUcmlnZ2VyTGVmdENvbGxpc2lvblwiLFxyXG4gICAgQ09MTElTSU9OX0VOVEVSID0gXCJDb2xsaWRlckVudGVyZWRDb2xsaXNpb25cIixcclxuICAgIENPTExJU0lPTl9FWElUID0gXCJDb2xsaWRlckxlZnRDb2xsaXNpb25cIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3BlY2lhbCB0eXBlIG9mIHtAbGluayBFdmVudH0gZm9yIHBoeXNpY3MuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50UGh5c2ljcyBleHRlbmRzIEV2ZW50IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcG9uZW50UmlnaWRib2R5IHRoYXQgY29sbGlkZWQgd2l0aCB0aGlzIENvbXBvbmVudFJpZ2lkYm9keVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBub3JtYWwgaW1wdWxzZSBiZXR3ZWVuIHRoZSB0d28gY29sbGlkaW5nIG9iamVjdHMuIE5vcm1hbCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGltcHVsc2UuXHJcbiAgICAgKiBJbXB1bHNlIGlzIG9ubHkgaGFwcGVuaW5nIG9uIENPTExJU0lPTl9FTlRFUiwgc28gdGhlcmUgaXMgbm8gaW1wdWxzZSBvbiBleGl0IG5vciBvbiB0cmlnZ2Vycy5cclxuICAgICAqIFVzZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGNtcFJpZ2lkYm9keSB0byBkZXRlcm1pbmUgdGhlIGludGVuc2l0eSBvZiB0aGUgRVZFTlQgaW5zdGVhZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbEltcHVsc2U6IG51bWJlcjtcclxuICAgIHB1YmxpYyB0YW5nZW50SW1wdWxzZTogbnVtYmVyO1xyXG4gICAgcHVibGljIGJpbm9tYWxJbXB1bHNlOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIHBvaW50IHdoZXJlIHRoZSBjb2xsaXNpb24vdHJpZ2dlcmluZyBpbml0aWFsbHkgaGFwcGVuZWQuIFRoZSBjb2xsaXNpb24gcG9pbnQgZXhpc3RzIG9ubHkgb24gQ09MTElTSU9OX0VOVEVSIC8gVFJJR0dFUl9FTlRFUi4gKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25Qb2ludDogVmVjdG9yMztcclxuICAgIC8qKiBUaGUgbm9ybWFsIHZlY3RvciBvZiB0aGUgY29sbGlzaW9uLiBPbmx5IGV4aXN0aW5nIG9uIENPTExJU0lPTl9FTlRFUiAqL1xyXG4gICAgcHVibGljIGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMztcclxuXHJcbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBldmVudCBjdXN0b21pemVkIGZvciBwaHlzaWNzLiBIb2xkaW5nIGluZm9ybWF0aW9ucyBhYm91dCBpbXB1bHNlcy4gQ29sbGlzaW9uIHBvaW50IGFuZCB0aGUgYm9keSB0aGF0IGlzIGNvbGxpZGluZyAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBFVkVOVF9QSFlTSUNTLCBfaGl0UmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHksIF9ub3JtYWxJbXB1bHNlOiBudW1iZXIsIF90YW5nZW50SW1wdWxzZTogbnVtYmVyLCBfYmlub3JtYWxJbXB1bHNlOiBudW1iZXIsIF9jb2xsaXNpb25Qb2ludDogVmVjdG9yMyA9IG51bGwsIF9jb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjMgPSBudWxsKSB7XHJcbiAgICAgIHN1cGVyKF90eXBlKTtcclxuICAgICAgdGhpcy5jbXBSaWdpZGJvZHkgPSBfaGl0UmlnaWRib2R5O1xyXG4gICAgICB0aGlzLm5vcm1hbEltcHVsc2UgPSBfbm9ybWFsSW1wdWxzZTtcclxuICAgICAgdGhpcy50YW5nZW50SW1wdWxzZSA9IF90YW5nZW50SW1wdWxzZTtcclxuICAgICAgdGhpcy5iaW5vbWFsSW1wdWxzZSA9IF9iaW5vcm1hbEltcHVsc2U7XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uUG9pbnQgPSBfY29sbGlzaW9uUG9pbnQ7XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uTm9ybWFsID0gX2NvbGxpc2lvbk5vcm1hbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogR3JvdXBzIHRvIHBsYWNlIGEgbm9kZSBpbiwgbm90IGV2ZXJ5IGdyb3VwIHNob3VsZCBjb2xsaWRlIHdpdGggZXZlcnkgZ3JvdXAuIFVzZSBhIE1hc2sgaW4gdG8gZXhjbHVkZSBjb2xsaXNpb25zXHJcbiAgKi9cclxuICBleHBvcnQgZW51bSBDT0xMSVNJT05fR1JPVVAgeyAvL1RPRE8gR2l2ZSBhIHBvc3NpYmxpdGh5IHRvIHNldCB3aGljaCBsYXllciBjb2xsaWRlcyB3aXRoIHdoaWNoLCBDb2xsaXNpb25NYXRyaXg/XHJcbiAgICBERUZBVUxUID0gMSxcclxuICAgIEdST1VQXzEgPSAyLFxyXG4gICAgR1JPVVBfMiA9IDQsXHJcbiAgICBHUk9VUF8zID0gOCxcclxuICAgIEdST1VQXzQgPSAxNixcclxuICAgIEdST1VQXzUgPSAzMlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSByaWdpZGJvZHkgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgd2F5IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwaHlzaWNhbCBhbmQgdGhlIHZpc3VhbCB3b3JsZFxyXG4gICovXHJcbiAgZXhwb3J0IGVudW0gQk9EWV9UWVBFIHtcclxuICAgIC8qKiBUaGUgYm9keSBpZ25vcmVzIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHJlbmRlciBncmFwaCwgaXMgY29tcGxldGVseSBjb250cm9sbGVkICBieSBwaHlzaWNzIGFuZCB0YWtlcyBpdHMgbm9kZSB3aXRoIGl0ICAqL1xyXG4gICAgRFlOQU1JQywgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQyxcclxuICAgIC8qKiBUaGUgYm9keSBpZ25vcmVzIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHJlbmRlciBncmFwaCwgaXMgY29tcGxldGVseSBpbW1vdmVibGUgYW5kIGtlZXBzIGl0cyBub2RlIGZyb20gbW92aW5nICAqL1xyXG4gICAgU1RBVElDLCAvLyA9IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUMsXHJcbiAgICAvKiogVGhlIGJvZHkgaXMgY29udHJvbGxlZCBieSBpdHMgbm9kZSBhbmQgbW92ZXMgd2l0aCBpdCwgd2hpbGUgaXQgaW1wYWN0cyB0aGUgcGh5c2ljYWwgd29ybGQgZS5nLiBieSBjb2xsaXNpb25zICovXHJcbiAgICBLSU5FTUFUSUMgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuS0lORU1BVElDXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIERpZmZlcmVudCB0eXBlcyBvZiBjb2xsaWRlciBzaGFwZXMsIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgaW4gc2NhbGluZyBCT1ggPSBWZWN0b3IzKGxlbmd0aCwgaGVpZ2h0LCBkZXB0aCksXHJcbiAgKiBTUEhFUkUgPSBWZWN0b3IzKGRpYW1ldGVyLCB4LCB4KSwgQ0FQU1VMRSA9IFZlY3RvcjMoZGlhbWV0ZXIsIGhlaWdodCwgeCksIENZTElOREVSID0gVmVjdG9yMyhkaWFtZXRlciwgaGVpZ2h0LCB4KSxcclxuICAqIENPTkUgPSBWZWN0b3IoZGlhbWV0ZXIsIGhlaWdodCwgeCksIFBZUkFNSUQgPSBWZWN0b3IzKGxlbmd0aCwgaGVpZ2h0LCBkZXB0aCk7IHggPT0gdW51c2VkLlxyXG4gICogQ09OVkVYID0gQ29tcG9uZW50TWVzaCBuZWVkcyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIFJCIFByb3BlcnR5IGNvbnZleE1lc2gsIHRoZSBwb2ludHMgb2YgdGhhdCBjb21wb25lbnQgYXJlIHVzZWQgdG8gY3JlYXRlIGEgY29sbGlkZXIgdGhhdCBtYXRjaGVzLFxyXG4gICogdGhlIGNsb3Nlc3QgcG9zc2libGUgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBmb3JtLCBpbiBmb3JtIG9mIGEgaHVsbC4gQ29udmV4IGlzIGV4cGVyaW1lbnRhbCBhbmQgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB2ZXJ0aWNlc1xyXG4gICogYXJlIHRvbyBjbG9zZSB0byBvbmUgYW5vdGhlciBhbmQgdGhlIGdpdmVuIHZlcnRpY2VzIGRvIG5vdCBmb3JtIGEgaW4gaXRzZWxmIGNsb3NlZCBzaGFwZSBhbmQgaGF2aW5nIGEgZ2VudXMgb2YgMCAobm8gaG9sZXMpLiBWZXJ0aWNlcyBpbiB0aGUgQ29tcG9uZW50TWVzaCBjYW4gYmUgc2NhbGVkIGRpZmZlcmVudGx5IFxyXG4gICogZm9yIHRleHR1cmluZy9ub3JtYWwgb3Igb3RoZXIgcmVhc29ucywgc28gdGhlIGNvbGxpZGVyIG1pZ2h0IGJlIG9mZiBjb21wYXJlZCB0byB0aGUgdmlzdWFsIHNoYXBlLCB0aGlzIGNhbiBiZSBjb3JyZWN0ZWQgYnkgY2hhbmdpbmcgdGhlIHBpdm90IHNjYWxlIG9mIHRoZSBDb21wb25lbnRSaWdpZGJvZHkuICBcclxuICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTExJREVSX1RZUEUge1xyXG4gICAgQ1VCRSxcclxuICAgIFNQSEVSRSxcclxuICAgIENBUFNVTEUsXHJcbiAgICBDWUxJTkRFUixcclxuICAgIENPTkUsXHJcbiAgICBQWVJBTUlELFxyXG4gICAgQ09OVkVYXHJcbiAgfVxyXG5cclxuICAvKiogRGlzcGxheWluZyBkaWZmZXJlbnQgdHlwZXMgb2YgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHBoeXNpYyBmZWF0dXJlcy4gRGVmYXVsdCA9IEpPSU5UU19BTkRfQ09MTElERVIuICovXHJcbiAgZXhwb3J0IGVudW0gUEhZU0lDU19ERUJVR01PREUge1xyXG4gICAgTk9ORSxcclxuICAgIENPTExJREVSUyxcclxuICAgIEpPSU5UU19BTkRfQ09MTElERVIsXHJcbiAgICBCT1VORElOR19CT1hFUyxcclxuICAgIENPTlRBQ1RTLFxyXG4gICAgUEhZU0lDX09CSkVDVFNfT05MWVxyXG4gIH1cclxuXHJcbiAgLyoqIEluZm8gYWJvdXQgUmF5Y2FzdHMgc2hvdCBmcm9tIHRoZSBwaHlzaWNzIHN5c3RlbS4gKi9cclxuICBleHBvcnQgY2xhc3MgUmF5SGl0SW5mbyBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgaGl0OiBib29sZWFuO1xyXG4gICAgcHVibGljIGhpdERpc3RhbmNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaGl0UG9pbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByaWdpZGJvZHlDb21wb25lbnQ6IENvbXBvbmVudFJpZ2lkYm9keTtcclxuICAgIHB1YmxpYyBoaXROb3JtYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByYXlFbmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByYXlPcmlnaW46IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmhpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhpdERpc3RhbmNlID0gMDtcclxuICAgICAgdGhpcy5oaXRQb2ludC5yZWN5Y2xlKCk7XHJcbiAgICAgIHRoaXMucmlnaWRib2R5Q29tcG9uZW50ID0gbnVsbDtcclxuICAgICAgdGhpcy5oaXROb3JtYWwucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJheU9yaWdpbi5yZWN5Y2xlKCk7XHJcbiAgICAgIHRoaXMucmF5RW5kLnJlY3ljbGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBHZW5lcmFsIHNldHRpbmdzIGZvciB0aGUgcGh5c2ljIHNpbXVsYXRpb24gYW5kIHRoZSBkZWJ1ZyBvZiBpdC4gKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc1NldHRpbmdzIHtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2RlZmF1bHRDb2xsaXNpb25Hcm91cDogbnVtYmVyLCBfZGVmYXVsdENvbGxpc2lvbk1hc2s6IG51bWJlcikge1xyXG4gICAgICBpZiAodHlwZW9mIE9JTU8gPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbGxpc2lvbkdyb3VwID0gX2RlZmF1bHRDb2xsaXNpb25Hcm91cDtcclxuICAgICAgdGhpcy5kZWZhdWx0Q29sbGlzaW9uTWFzayA9IF9kZWZhdWx0Q29sbGlzaW9uTWFzaztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hhbmdlIGlmIHJpZ2lkYm9kaWVzIGFyZSBhYmxlIHRvIHNsZWVwIChkb24ndCBiZSBjb25zaWRlcmVkIGluIHBoeXNpY2FsIGNhbGN1bGF0aW9ucykgd2hlbiB0aGVpciBtb3ZlbWVudCBpcyBiZWxvdyBhIHRocmVzaG9sZC4gRGVhY3RpdmF0aW9uIGlzIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UgZm9yIG1pbm9yIGFkdmFudGFnZSBpbiBwcmVjaXNpb24uICovXHJcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVTbGVlcGluZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kaXNhYmxlU2xlZXBpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRpc2FibGVTbGVlcGluZyhfdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRpc2FibGVTbGVlcGluZyA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKiBTbGVlcGluZyBUaHJlc2hvbGQgZm9yIE1vdmVtZW50IFZlbG9jdGl5LiAqL1xyXG4gICAgcHVibGljIGdldCBzbGVlcGluZ1ZlbG9jaXR5VGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2xlZXBpbmcgVGhyZXNob2xkIGZvciBSb3RhdGlvbiBWZWxvY2l0eS4gKi9cclxuICAgIHB1YmxpYyBnZXQgc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5zbGVlcGluZ0FuZ3VsYXJWZWxvY2l0eVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLnNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaHJlc2hvbGQgaG93IGxvbmcgdGhlIFJpZ2lkYm9keSBtdXN0IGJlIGJlbG93L2Fib3ZlIHRoZSB0aHJlc2hvbGQgdG8gY291bnQgYXMgc2xlZXBpbmcuICovXHJcbiAgICBwdWJsaWMgZ2V0IHNsZWVwaW5nVGltZVRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLnNsZWVwaW5nVGltZVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdUaW1lVGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5zbGVlcGluZ1RpbWVUaHJlc2hvbGQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVycm9yIHRocmVzaG9sZC4gRGVmYXVsdCBpcyAwLjA1LiBUaGUgaGlnaGVyIHRoZSBtb3JlIGxpa2VseSBjb2xsaXNpb25zIGdldCBkZXRlY3RlZCBiZWZvcmUgYWN0dWFsIGltcGFjdCBhdCBoaWdoIHNwZWVkcyBidXQgaXQncyB2aXN1YWxseSBsZXNzIGFjY3VyYXRlLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uTWFyZ2luKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEdKS01hcmdpbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbk1hcmdpbihfdGhpY2tuZXNzOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRHSktNYXJnaW4gPSBfdGhpY2tuZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZGVmYXVsdCBhcHBsaWVkIGZyaWN0aW9uIGJldHdlZW4gdHdvIHJpZ2lkYm9kaWVzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuIEhvdyBtdWNoIHZlbG9jaXR5IGlzIHNsb3dlZCBkb3duIHdoZW4gbW92aW5nIGFjY3Jvc3MgdGhpcyBzdXJmYWNlLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0RnJpY3Rpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0RnJpY3Rpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRGcmljdGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdEZyaWN0aW9uID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBCb3VuY2luZXNzIG9mIHJpZ2lkYm9kaWVzLiBIb3cgbXVjaCBvZiB0aGUgaW1wYWN0IGlzIHJlc3RpdHV0ZWQuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRSZXN0aXR1dGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRSZXN0aXR1dGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdFJlc3RpdHV0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0UmVzdGl0dXRpb24gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdyb3VwcyB0aGUgZGVmYXVsdCByaWdpZGJvZHkgd2lsbCBjb2xsaWRlIHdpdGguIFNldCBpdCBsaWtlOiAoUEhZU0lDU19HUk9VUC5ERUZBVUxUIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8xIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8yIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8zKSBcclxuICAgICAqIHRvIGNvbGxpZGUgd2l0aCBtdWx0aXBsZSBncm91cHMuIERlZmF1bHQgaXMgY29sbGlzaW9uIHdpdGggZXZlcnl0aGluZyBidXQgdHJpZ2dlcnMuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uTWFzaygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25NYXNrO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29sbGlzaW9uTWFzayhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdENvbGxpc2lvbk1hc2sgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBncm91cCB0aGF0IHRoaXMgcmlnaWRib2R5IGJlbG9uZ3MgdG8uIERlZmF1bHQgaXMgdGhlIERFRkFVTFQgR3JvdXAgd2hpY2ggbWVhbnMgaXRzIGp1c3QgYSBub3JtYWwgUmlnaWRib2R5IG5vdCBhIHRyaWdnZXIgbm9yIGFueXRoaW5nIHNwZWNpYWwuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb2xsaXNpb25Hcm91cCgpOiBDT0xMSVNJT05fR1JPVVAge1xyXG4gICAgICByZXR1cm4gPENPTExJU0lPTl9HUk9VUD5PSU1PLlNldHRpbmcuZGVmYXVsdENvbGxpc2lvbkdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29sbGlzaW9uR3JvdXAoX3ZhbHVlOiBDT0xMSVNJT05fR1JPVVApIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25Hcm91cCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hhbmdlIHRoZSB0eXBlIG9mIGpvaW50IHNvbHZlciBhbGdvcml0aG0uIERlZmF1bHQgSXRlcmF0aXZlID09IDAsIGlzIGZhc3RlciBidXQgbGVzcyBzdGFibGUuIERpcmVjdCA9PSAxLCBzbG93IGJ1dCBtb3JlIHN0YWJsZSwgcmVjb21tZW5kZWQgZm9yIGNvbXBsZXggam9pbnQgd29yay4gQ2hhbmdlIHRoaXMgc2V0dGluZyBvbmx5IGF0IHRoZSBzdGFydCBvZiB5b3VyIGdhbWUuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb25zdHJhaW50U29sdmVyVHlwZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludENvbnN0cmFpbnRTb2x2ZXJUeXBlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29uc3RyYWludFNvbHZlclR5cGUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludENvbnN0cmFpbnRTb2x2ZXJUeXBlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY29ycmVjdGlvbiBhbGdvcml0aG0gdXNlZCB0byBjb3JyZWN0IHBoeXNpY3MgY2FsY3VsYXRpb25zLiBDaGFuZ2UgdGhpcyBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgeW91ciBnYW1lLiBFYWNoIGhhcyBkaWZmZXJlbnQgYXBwcm9hY2hlcywgc28gaWYgeW91IGhhdmUgcHJvYmxlbXMgdGVzdCBhbm90aGVyXHJcbiAgICAgKiAgRGVmYXVsdCAwID0gQmF1bWdhcnRlIChmYXN0IGJ1dCBsZXNzIGNvcnJlY3QgaW5kdWNlcyBzb21lIGVuZXJneSBlcnJvcnMpLCAxID0gU3BsaXQtSW1wdWxzZSAoZmFzdCBhbmQgbm8gZW5nZXJ5IGVycm9ycywgYnV0IG1vcmUgaW5hY2N1cmF0ZSBmb3Igam9pbnRzKSwgMiA9IE5vbi1saW5lYXIgR2F1c3MgU2VpZGVsIChzbG93ZXN0IGJ1dCBtb3N0IGFjY3VyYXRlKSovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb3JyZWN0aW9uQWxnb3JpdGhtKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEpvaW50UG9zaXRpb25Db3JyZWN0aW9uQWxnb3JpdGhtO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29ycmVjdGlvbkFsZ29yaXRobShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdEpvaW50UG9zaXRpb25Db3JyZWN0aW9uQWxnb3JpdGhtID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBzaW11bGF0aW9uIGluIGZvcm0gb2YgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhlIHNpbXVsYXRpb25zIHJ1bnMgdGhyb3VnaCB1bnRpbCBpdCBhY2NlcHRzIHRoZSByZXN1bHQuXHJcbiAgICAgKiAgMTAgRGVmYXVsdCAtIEhpZ2hlciBtZWFucyBtb3JlIHByZWNpc2lvbiBidXQgcmVzdWx0cyBpbiBhIHBlcmZvcm1hbmNlIGRlY3JlYXNlLiBUaGlzIGhlbHBzIGVzcGVjaWFsbHkgd2l0aCBqb2ludHMsXHJcbiAgICAgKiBidXQgYWxzbyB0aGUgZ2VuZXJhbCBzdGFiaWxpdHkgb2YgdGhlIHNpbXVsYXRpb24gZHVlIHRvIHNpbXVsYXRpb24gc3RlcHMgYmVpbmcgcmVjaGVja2VkIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBiZWluZyBzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc29sdmVySXRlcmF0aW9ucygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5nZXROdW1Qb3NpdGlvbkl0ZXJhdGlvbnMoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc29sdmVySXRlcmF0aW9ucyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBQaHlzaWNzLmFjdGl2ZUluc3RhbmNlLmdldE9pbW9Xb3JsZCgpLnNldE51bVBvc2l0aW9uSXRlcmF0aW9ucyhfdmFsdWUpO1xyXG4gICAgICBQaHlzaWNzLmFjdGl2ZUluc3RhbmNlLmdldE9pbW9Xb3JsZCgpLnNldE51bVZlbG9jaXR5SXRlcmF0aW9ucyhfdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQWN0cyBhcyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHtAbGluayBOb2RlfSdzLlxyXG4gICAgICogVGhlIHR5cGUgb2YgY29ubmNldGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBzdWJjbGFzc2VzIGxpa2UgcHJpc21hdGljIGpvaW50LCBjeWxpbmRlciBqb2ludCBldGMuXHJcbiAgICAgKiBBIFJpZ2lkYm9keSBvbiB0aGUge0BsaW5rIE5vZGV9IHRoYXQgdGhpcyBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXMgbmVlZGVkLiBTZXR0aW5nIHRoZSBjb25uZWN0ZWRSaWdpZGJvZHkgYW5kXHJcbiAgICAgKiBpbml0aWFsaXppbmcgdGhlIGNvbm5lY3Rpb24gY3JlYXRlcyBhIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGVtLiBUaGlzIGRpZmZlcnMgZnJvbSBhIGNvbm5lY3Rpb24gdGhyb3VnaCBoaWVyYXJjaHlcclxuICAgICAqIGluIHRoZSBub2RlIHN0cnVjdHVyZSBvZiBmdWRnZS4gSm9pbnRzIGNhbiBoYXZlIGRpZmZlcmVudCBET0YncyAoRGVncmVlcyBPZiBGcmVlZG9tKSwgMSBBeGlzIHRoYXQgY2FuIGVpdGhlciB0d2lzdCBvciBzd2luZyBpcyBhIGRlZ3JlZSBvZiBmcmVlZG9tLlxyXG4gICAgICogQSBqb2ludCB0eXBpY2FsbHkgY29uc2lzdHMgb2YgYSBtb3RvciB0aGF0IGxpbWl0cyBtb3ZlbWVudC9yb3RhdGlvbiBvciBpcyBhY3Rpdmx5IHRyeWluZyB0byBtb3ZlIHRvIGEgbGltaXQuIEFuZCBhIHNwcmluZyB3aGljaCBkZWZpbmVzIHRoZSByaWdpZGl0eS5cclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjBcclxuICAgICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2ludCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICAvKiogcmVmZXJzIGJhY2sgdG8gdGhpcyBjbGFzcyBmcm9tIGFueSBzdWJjbGFzcyBlLmcuIGluIG9yZGVyIHRvIGZpbmQgY29tcGF0aWJsZSBvdGhlciByZXNvdXJjZXMqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBiYXNlQ2xhc3M6IHR5cGVvZiBKb2ludCA9IEpvaW50O1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgSm9pbnRbXSA9IFtdO1xyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRKb2ludCk7XHJcbiAgICBwcm90ZWN0ZWQgc2luZ2xldG9uOiBib29sZWFuID0gZmFsc2U7IC8vTXVsdGlwbGUgam9pbnRzIGNhbiBiZSBhdHRhY2hlZCB0byBvbmUgTm9kZVxyXG5cclxuICAgICNpZEJvZHlBbmNob3I6IG51bWJlciA9IDA7XHJcbiAgICAjaWRCb2R5VGllZDogbnVtYmVyID0gMDtcclxuICAgICNib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICAjYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keTtcclxuXHJcbiAgICAjY29ubmVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAjYW5jaG9yOiBPSU1PLlZlYzM7XHJcbiAgICAjaW50ZXJuYWxDb2xsaXNpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAjYnJlYWtGb3JjZTogbnVtYmVyID0gMDtcclxuICAgICNicmVha1RvcnF1ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbmFtZUNoaWxkVG9Db25uZWN0OiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGpvaW50OiBPSU1PLkpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbmZpZzogT0lNTy5Kb2ludENvbmZpZztcclxuXHJcbiAgICAvKiogQ3JlYXRlIGEgam9pbnQgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gUmlnaWRib2R5Q29tcG9uZW50cy4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYm9keUFuY2hvciA9IF9ib2R5QW5jaG9yO1xyXG4gICAgICB0aGlzLmJvZHlUaWVkID0gX2JvZHlUaWVkO1xyXG5cclxuICAgICAgLypcclxuICAgICAgICBUZWxsIHRoZSBwaHlzaWNzIHRoYXQgdGhlcmUgaXMgYSBuZXcgam9pbnQgYW5kIG9uIHRoZSBwaHlzaWNzIHN0YXJ0IHRoZSBhY3R1YWwgam9pbnQgaXMgZmlyc3QgY3JlYXRlZC4gVmFsdWVzIGNhbiBiZSBzZXQgYnV0IHRoZVxyXG4gICAgICAgIGFjdHVhbCBjb25zdHJhaW50IGFpbid0IGV4aXN0ZW50IHVudGlsIHRoZSBnYW1lIHN0YXJ0c1xyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgSm9pbnQpOiBudW1iZXIgeyByZXR1cm4gSm9pbnQuc3ViY2xhc3Nlcy5wdXNoKF9zdWJjbGFzcykgLSAxOyB9XHJcblxyXG4gICAgLyoqIEdldC9TZXQgdGhlIGZpcnN0IENvbXBvbmVudFJpZ2lkYm9keSBvZiB0aGlzIGNvbm5lY3Rpb24uIEl0IHNob3VsZCBhbHdheXMgYmUgdGhlIG9uZSB0aGF0IHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvbyBpbiB0aGUgc2NlbmVUcmVlLiAqL1xyXG4gICAgcHVibGljIGdldCBib2R5QW5jaG9yKCk6IENvbXBvbmVudFJpZ2lkYm9keSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNib2R5QW5jaG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYm9keUFuY2hvcihfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSkge1xyXG4gICAgICB0aGlzLiNpZEJvZHlBbmNob3IgPSBfY21wUkIgIT0gbnVsbCA/IF9jbXBSQi5pZCA6IC0xO1xyXG4gICAgICB0aGlzLiNib2R5QW5jaG9yID0gX2NtcFJCO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQvU2V0IHRoZSBzZWNvbmQgQ29tcG9uZW50UmlnaWRib2R5IG9mIHRoaXMgY29ubmVjdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgYm9keVRpZWQoKTogQ29tcG9uZW50UmlnaWRib2R5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JvZHlUaWVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBib2R5VGllZChfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSkge1xyXG4gICAgICB0aGlzLiNpZEJvZHlUaWVkID0gX2NtcFJCICE9IG51bGwgPyBfY21wUkIuaWQgOiAtMTtcclxuICAgICAgdGhpcy4jYm9keVRpZWQgPSBfY21wUkI7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXhhY3QgcG9zaXRpb24gd2hlcmUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGFyZSBjb25uZWN0ZWQuIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYW5jaG9yKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYW5jaG9yLngsIHRoaXMuI2FuY2hvci55LCB0aGlzLiNhbmNob3Iueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGFuY2hvcihfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYW5jaG9yID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhbW91bnQgb2YgZm9yY2UgbmVlZGVkIHRvIGJyZWFrIHRoZSBKT0lOVCwgd2hpbGUgcm90YXRpbmcsIGluIE5ld3Rvbi4gMCBlcXVhbHMgdW5icmVha2FibGUgKGRlZmF1bHQpIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYnJlYWtUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyZWFrVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBicmVha1RvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNicmVha1RvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRCcmVha1RvcnF1ZSh0aGlzLiNicmVha1RvcnF1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZvcmNlIG5lZWRlZCB0byBicmVhayB0aGUgSk9JTlQsIGluIE5ld3Rvbi4gMCBlcXVhbHMgdW5icmVha2FibGUgKGRlZmF1bHQpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJyZWFrRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyZWFrRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGJyZWFrRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jYnJlYWtGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRCcmVha0ZvcmNlKHRoaXMuI2JyZWFrRm9yY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICAqIE9uIGEgd2VsZGluZyBqb2ludCB0aGUgY29ubmVjdGVkIGJvZGllcyBzaG91bGQgbm90IGJlIGNvbGxpZGluZyB3aXRoIGVhY2ggb3RoZXIsXHJcbiAgICAgICogZm9yIGJlc3QgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGludGVybmFsQ29sbGlzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW50ZXJuYWxDb2xsaXNpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGludGVybmFsQ29sbGlzaW9uKF92YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLiNpbnRlcm5hbENvbGxpc2lvbiA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRBbGxvd0NvbGxpc2lvbih0aGlzLiNpbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0IGEgY2hpbGQgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBqb2ludC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3RDaGlsZChfbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI25hbWVDaGlsZFRvQ29ubmVjdCA9IF9uYW1lO1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IE5vZGVbXSA9IHRoaXMubm9kZS5nZXRDaGlsZHJlbkJ5TmFtZShfbmFtZSk7XHJcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSlcclxuICAgICAgICB0aGlzLmNvbm5lY3ROb2RlKGNoaWxkcmVuLnBvcCgpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RoaXMubm9kZS5uYW1lfSBmYWlscyB0byBjb25uZWN0IGNoaWxkIHdpdGggbm9uIGV4aXN0ZW50IG9yIGFtYmlnb3VzIG5hbWUgJHtfbmFtZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3QgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGpvaW50LiBUaWVpbmcgaXRzIHJpZ2lkYm9keSB0byB0aGUgbm9kZXMgcmlnaWRib2R5IHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdE5vZGUoX25vZGU6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfbm9kZSB8fCAhdGhpcy5ub2RlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIERlYnVnLmZ1ZGdlKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gY29ubmVjdGVkICR7dGhpcy5ub2RlLm5hbWV9IGFuZCAke19ub2RlLm5hbWV9YCk7XHJcblxyXG4gICAgICBsZXQgY29ubmVjdEJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgICBsZXQgdGhpc0JvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuXHJcbiAgICAgIGlmICghY29ubmVjdEJvZHkgfHwgIXRoaXNCb2R5KSB7XHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IGF0ICR7dGhpcy5ub2RlLm5hbWV9IGZhaWxzIGR1ZSB0byBtaXNzaW5nIHJpZ2lkYm9kaWVzIG9uICR7dGhpcy5ub2RlLm5hbWV9IG9yICR7X25vZGUubmFtZX1gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYm9keUFuY2hvciA9IHRoaXNCb2R5O1xyXG4gICAgICB0aGlzLmJvZHlUaWVkID0gY29ubmVjdEJvZHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoZWNrIGlmIGNvbm5lY3Rpb24gaXMgZGlydHksIHNvIHdoZW4gZWl0aGVyIHJiIGlzIGNoYW5nZWQgZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0LiBJbnRlcm5hbGx5IHVzZWQgbm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuICovXHJcbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXppbmcgYW5kIGNvbm5lY3RpbmcgdGhlIHR3byByaWdpZGJvZGllcyB3aXRoIHRoZSBjb25maWd1cmVkIGpvaW50IHByb3BlcnRpZXNcclxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IHRoZSBwaHlzaWNzIHN5c3RlbS4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy4jY29ubmVjdGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2lkQm9keUFuY2hvciA9PSAtMSB8fCB0aGlzLiNpZEJvZHlUaWVkID09IC0xKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0KVxyXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RDaGlsZCh0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RKb2ludCgpO1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRKb2ludCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNjb25uZWN0aW5nIHRoZSB0d28gcmlnaWRib2RpZXMgYW5kIHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgcGh5c2ljcyBzeXN0ZW0sXHJcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgcGh5c2ljcyBzeXN0ZW0uIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI2Nvbm5lY3RlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVKb2ludCgpO1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBKb2ludCB1c2VkIGJ5IHRoZSBwaHlzaWNzIGVuZ2luZS4gVXNlZCBpbnRlcm5hbGx5IG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICogT25seSB0byBiZSB1c2VkIHdoZW4gZnVuY3Rpb25hbGl0eSB0aGF0IGlzIG5vdCBhZGRlZCB3aXRoaW4gRlVER0UgaXMgbmVlZGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vSm9pbnQoKTogT0lNTy5Kb2ludCB7XHJcbiAgICAgIHJldHVybiB0aGlzLmpvaW50O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmFuY2hvciA9IHRoaXMuYW5jaG9yLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5hbmNob3IpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHRoaXMuY29ubmVjdENoaWxkKF9zZXJpYWxpemF0aW9uLm5hbWVDaGlsZFRvQ29ubmVjdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24obXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgbXV0YXRvci5hbmNob3IgPSB0aGlzLmFuY2hvci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIHR5cGVzLm5hbWVDaGlsZFRvQ29ubmVjdCA9IFwiU3RyaW5nXCI7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH0gXHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmFuY2hvcikgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyguLi48bnVtYmVyW10+KE9iamVjdC52YWx1ZXMoX211dGF0b3IuYW5jaG9yKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYW5jaG9yO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5uYW1lQ2hpbGRUb0Nvbm5lY3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuY29ubmVjdENoaWxkKF9tdXRhdG9yLm5hbWVDaGlsZFRvQ29ubmVjdCk7XHJcbiAgICAgIHRoaXMuI211dGF0ZShfbXV0YXRvcik7XHJcbiAgICAgIHRoaXMuZGVsZXRlRnJvbU11dGF0b3IoX211dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5qb2ludDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1vdG9yO1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGVsbCB0aGUgRnVkZ2VQaHlzaWNzIHN5c3RlbSB0aGF0IHRoaXMgam9pbnQgbmVlZHMgdG8gYmUgaGFuZGxlZCBpbiB0aGUgbmV4dCBmcmFtZS4gKi9cclxuICAgIHByb3RlY3RlZCBkaXJ0eVN0YXR1cygpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy5jaGFuZ2VKb2ludFN0YXR1cyh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkSm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuYWRkSm9pbnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbW92ZUpvaW50KCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLnJlbW92ZUpvaW50KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCguLi5fY29uZmlnUGFyYW1zOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQm9keUFuY2hvcjogVmVjdG9yMyA9IHRoaXMuYm9keUFuY2hvci5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uOyAvL1NldHRpbmcgdGhlIGFuY2hvciBwb3NpdGlvbiBsb2NhbGx5IGZyb20gdGhlIGZpcnN0IHJpZ2lkYm9keVxyXG4gICAgICBsZXQgd29ybGRBbmNob3I6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMocG9zQm9keUFuY2hvci54ICsgdGhpcy4jYW5jaG9yLngsIHBvc0JvZHlBbmNob3IueSArIHRoaXMuI2FuY2hvci55LCBwb3NCb2R5QW5jaG9yLnogKyB0aGlzLiNhbmNob3Iueik7XHJcblxyXG4gICAgICAvLyBAdHMtaWdub3JlICAgIC8vIHVuZm9ydHVuYXRlbHksIG1ldGhvZCBpbml0IGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgYmFzZSBjbGFzcyBPSU1PLkpvaW50Q29uZmlnXHJcbiAgICAgIHRoaXMuY29uZmlnLmluaXQodGhpcy4jYm9keUFuY2hvci5nZXRPaW1vUmlnaWRib2R5KCksIHRoaXMuI2JvZHlUaWVkLmdldE9pbW9SaWdpZGJvZHkoKSwgd29ybGRBbmNob3IsIC4uLl9jb25maWdQYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25maWd1cmVKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5qb2ludC5zZXRCcmVha0ZvcmNlKHRoaXMuYnJlYWtGb3JjZSk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QnJlYWtUb3JxdWUodGhpcy5icmVha1RvcnF1ZSk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy4jaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvciwgX2RlbGV0ZTogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gX2RlbGV0ZSlcclxuICAgICAgICBkZWxldGUgX211dGF0b3Jba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgc3dpdGNoIChfZXZlbnQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRJU0NPTk5FQ1RfSk9JTlQsICgpID0+IHsgdGhpcy5kaXNjb25uZWN0KCk7IHRoaXMuZGlydHlTdGF0dXMoKTsgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9SRU1PVkU6XHJcbiAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5ESVNDT05ORUNUX0pPSU5ULCAoKSA9PiB7IHRoaXMuZGlzY29ubmVjdCgpOyB0aGlzLmRpcnR5U3RhdHVzKCk7IH0sIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVKb2ludCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIG5hbWVDaGlsZFRvQ29ubmVjdDogdGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0LFxyXG4gICAgICAgIGludGVybmFsQ29sbGlzaW9uOiB0aGlzLiNpbnRlcm5hbENvbGxpc2lvbixcclxuICAgICAgICBicmVha0ZvcmNlOiB0aGlzLiNicmVha0ZvcmNlLFxyXG4gICAgICAgIGJyZWFrVG9ycXVlOiB0aGlzLiNicmVha1RvcnF1ZVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcImludGVybmFsQ29sbGlzaW9uXCIsIFwiYnJlYWtGb3JjZVwiLCBcImJyZWFrVG9ycXVlXCJdKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBCYXNlIGNsYXNzIGZvciBqb2ludHMgb3BlcmF0aW5nIHdpdGggZXhhY3RseSBvbmUgYXhpc1xyXG4gICAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2ludEF4aWFsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHJvdGVjdGVkIHNwcmluZ0RhbXBlcjogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICBcclxuICAgIC8vSW50ZXJuYWwgVmFyaWFibGVzXHJcbiAgICAjbWF4TW90b3I6IG51bWJlciA9IDEwO1xyXG4gICAgI21pbk1vdG9yOiBudW1iZXIgPSAtMTA7XHJcbiAgICAjbW90b3JTcGVlZDogbnVtYmVyID0gMDtcclxuICAgICNheGlzOiBPSU1PLlZlYzM7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5OiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0RhbXBpbmc6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgY3lsaW5kcmljYWwgam9pbnQgYmV0d2VlbiB0d28gQ29tcG9uZW50UmlnaWRib2RpZXMgbW92aW5nIG9uIG9uZSBheGlzIGFuZCByb3RhdGluZyBhcm91bmQgYW5vdGhlciBib3VuZCBvbiBhIGxvY2FsIGFuY2hvcnBvaW50LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXMgPSBfYXhpcztcclxuICAgICAgdGhpcy5hbmNob3IgPSBfbG9jYWxBbmNob3I7XHJcbiAgICAgIHRoaXMubWluTW90b3IgPSAtMTA7XHJcbiAgICAgIHRoaXMubWF4TW90b3IgPSAxMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpcy54LCB0aGlzLiNheGlzLnksIHRoaXMuI2F4aXMueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXMoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhNb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4TW90b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtYXhNb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhNb3RvciA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+PHVua25vd24+dGhpcy5qb2ludCkuZ2V0TGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7IC8qICovIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Nb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluTW90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pbk1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD48dW5rbm93bj50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50Pjx1bmtub3duPnRoaXMuam9pbnQpLmdldFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclNwZWVkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclNwZWVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbW90b3JTcGVlZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50PnRoaXMuam9pbnQpLmdldFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzID0gdGhpcy5heGlzLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYXhpcyA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpcyk7XHJcbiAgICAgIHRoaXMuI211dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXMpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpcyA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpcztcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzID0gdGhpcy5heGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3ksIHRoaXMuI3NwcmluZ0RhbXBpbmcpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCh0aGlzLiNheGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgc3ByaW5nRGFtcGluZzogdGhpcy4jc3ByaW5nRGFtcGluZyxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3k6IHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSxcclxuICAgICAgICBtYXhNb3RvcjogdGhpcy4jbWF4TW90b3IsXHJcbiAgICAgICAgbWluTW90b3I6IHRoaXMuI21pbk1vdG9yLFxyXG4gICAgICAgIG1vdG9yU3BlZWQ6IHRoaXMuI21vdG9yU3BlZWRcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9O1xyXG5cclxuICAgICNtdXRhdGUgPSAoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkID0+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXCJzcHJpbmdEYW1waW5nXCIsIFwic3ByaW5nRnJlcXVlbmN5XCIsIFwibWF4TW90b3JcIiwgXCJtaW5Nb3RvclwiLCBcIm1vdG9yU3BlZWRcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKioge0BsaW5rIFRleEltYWdlU291cmNlfSBpcyBhIHVuaW9uIHR5cGUgd2hpY2ggYXMgb2Ygbm93IGluY2x1ZGVzIHtAbGluayBWaWRlb0ZyYW1lfS4gQWxsIG90aGVyIHBhcnRzIG9mIHRoaXMgdW5pb24gaGF2ZSBhIC53aWR0aCBhbmQgLmhlaWdodCBwcm9wZXJ0eSBidXQgVmlkZW9GcmFtZSBkb2VzIG5vdC4gQW5kIHNpbmNlIHdlIG9ubHkgZXZlciB1c2Uge0BsaW5rIEhUTUxJbWFnZUVsZW1lbnR9IGFuZCB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSBjdXJyZW50bHkgVmlkZW9GcmFtZSBjYW4gYmUgZXhjbHVkZWQgZm9yIGNvbnZlbmllbmNlIG9mIGFjY2Vzc2luZyAud2lkdGggYW5kIC5oZWlnaHQgKi9cclxuICB0eXBlIEltYWdlU291cmNlID0gRXhjbHVkZTxUZXhJbWFnZVNvdXJjZSwgVmlkZW9GcmFtZT47XHJcblxyXG4gIC8qKlxyXG4gICAqIC0gQ1JJU1A6IG5vIG1pcG1hcHBpbmcsIG1hZyBmaWx0ZXIgbmVhcmVzdCwgbWluIGZpbHRlciBuZWFyZXN0XHJcbiAgICogLSBNRURJVU06IG1pcG1hcHBpbmcsIG1hZyBmaWx0ZXIgbmVhcmVzdCwgbWluIGZpbHRlciBuZWFyZXN0X21pcG1hcF9saW5lYXJcclxuICAgKiAtIEJMVVJSWTogbWlwbWFwcGluZywgbWFnIGZpbHRlciBsaW5lYXIsIG1pbiBmaWx0ZXIgbGluZWFyX21pcG1hcF9saW5lYXJcclxuICAgKiAtIFNNT09USDogbm8gbWlwbWFwcGluZywgbWFnIGZpbHRlciBsaW5lYXIsIG1pbiBmaWx0ZXIgbGluZWFyXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gTUlQTUFQIHtcclxuICAgIENSSVNQLCBNRURJVU0sIEJMVVJSWSwgU01PT1RIXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBXUkFQIHtcclxuICAgIFJFUEVBVCwgQ0xBTVAsIE1JUlJPUlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZWNsYXNzIGZvciBkaWZmZXJlbnQga2luZHMgb2YgdGV4dHVyZXMuIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yVGV4dHVyZS5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZXh0dXJlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHByb3RlY3RlZCByZW5kZXJEYXRhOiB1bmtub3duO1xyXG5cclxuICAgIHByb3RlY3RlZCB0ZXh0dXJlRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJvdGVjdGVkIG1pcG1hcERpcnR5OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb3RlY3RlZCB3cmFwRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICNtaXBtYXA6IE1JUE1BUCA9IE1JUE1BUC5DUklTUDtcclxuICAgICN3cmFwOiBXUkFQID0gV1JBUC5SRVBFQVQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIlRleHR1cmVcIikge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1pcG1hcChfbWlwbWFwOiBNSVBNQVApIHtcclxuICAgICAgdGhpcy4jbWlwbWFwID0gX21pcG1hcDtcclxuICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtaXBtYXAoKTogTUlQTUFQIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pcG1hcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHdyYXAoX3dyYXA6IFdSQVApIHtcclxuICAgICAgdGhpcy4jd3JhcCA9IF93cmFwO1xyXG4gICAgICB0aGlzLndyYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3cmFwKCk6IFdSQVAge1xyXG4gICAgICByZXR1cm4gdGhpcy4jd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGltYWdlIHNvdXJjZSBvZiB0aGlzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIGJpbmRzIHRoZSB0ZXh0dXJlIGluIFdlYkdMIGZyb20gdGhlIHtAbGluayB0ZXhJbWFnZVNvdXJjZX0uIFxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yVGV4dHVyZX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0OiBudW1iZXIgPSAwKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSB0ZXh0dXJlIGluIFdlYkdMIGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBncHUgbWVtb3J5LlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yVGV4dHVyZX0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVJlbmRlckRhdGEoKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZyZXNoZXMgdGhlIGltYWdlIGRhdGEgaW4gdGhlIHJlbmRlciBlbmdpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIG1pcG1hcDogTUlQTUFQW3RoaXMuI21pcG1hcF0sXHJcbiAgICAgICAgd3JhcDogV1JBUFt0aGlzLiN3cmFwXVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcywgX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIHRoaXMuI21pcG1hcCA9IDxudW1iZXI+PHVua25vd24+TUlQTUFQW19zZXJpYWxpemF0aW9uLm1pcG1hcF07XHJcbiAgICAgIHRoaXMuI3dyYXAgPSA8bnVtYmVyPjx1bmtub3duPldSQVBbX3NlcmlhbGl6YXRpb24ud3JhcF07XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKF9leHRlbmRhYmxlPzogYm9vbGVhbik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IubWlwbWFwID0gdGhpcy4jbWlwbWFwO1xyXG4gICAgICBtdXRhdG9yLndyYXAgPSB0aGlzLiN3cmFwO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMubWlwbWFwKVxyXG4gICAgICAgIHR5cGVzLm1pcG1hcCA9IE1JUE1BUDtcclxuICAgICAgaWYgKHR5cGVzLndyYXApXHJcbiAgICAgICAgdHlwZXMud3JhcCA9IFdSQVA7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuaWRSZXNvdXJjZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckRhdGE7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50ZXh0dXJlRGlydHk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5taXBtYXBEaXJ0eTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1pcG1hcEdlbmVyYXRlZDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLndyYXBEaXJ0eTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGFuIGV4aXN0aW5nIGltYWdlXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVJbWFnZSBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHVibGljIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbnVsbDtcclxuICAgIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdXJsPzogUmVxdWVzdEluZm8pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgaWYgKF91cmwpIHtcclxuICAgICAgICB0aGlzLmxvYWQoX3VybCk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gX3VybC50b1N0cmluZygpLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyB0aGUgaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHRoaXMudXJsID0gX3VybDtcclxuICAgICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG5cclxuXHJcbiAgICAgIC8vIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IHdpbmRvdy5mZXRjaCh0aGlzLnVybCk7XHJcbiAgICAgIC8vIGNvbnN0IGJsb2I6IEJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcbiAgICAgIC8vIGxldCBvYmplY3RVUkw6IHN0cmluZyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIC8vIHRoaXMuaW1hZ2Uuc3JjID0gb2JqZWN0VVJMO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gbnVsbDsgLy8gcmVmcmVzaCByZW5kZXIgZGF0YSBvbiBuZXh0IGRyYXcgY2FsbFxyXG4gICAgICAgICAgX3Jlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiBfcmVqZWN0KCkpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gbmV3IFVSTCh0aGlzLnVybC50b1N0cmluZygpLCBQcm9qZWN0LmJhc2VVUkwpLnRvU3RyaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSwgLy8gc2VyaWFsaXplIGZvciBlZGl0b3Igdmlld3NcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZChfc2VyaWFsaXphdGlvbi51cmwpO1xyXG4gICAgICAvLyB0aGlzLnR5cGUgaXMgYW4gYWNjZXNzb3Igb2YgTXV0YWJsZSBkb2Vzbid0IG5lZWQgdG8gYmUgZGVzZXJpYWxpemVkXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoX211dGF0b3IudXJsICYmIF9tdXRhdG9yLnVybCAhPSB0aGlzLnVybC50b1N0cmluZygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChfbXV0YXRvci51cmwpO1xyXG4gICAgICAvLyBleGNlcHQgdXJsIGZyb20gbXV0YXRvciBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcbiAgICAgIGRlbGV0ZSAoX211dGF0b3IudXJsKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lIG5lY2Vzc2l0eSB0byByZWNvbnN0cnVjdCwgaWYgbXV0YXRvciBpcyBrZXB0IGJ5IGNhbGxlclxyXG4gICAgICAvLyBfbXV0YXRvci51cmwgPSB0aGlzLnVybDsgXHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVCYXNlNjQgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBpbWFnZTogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfYmFzZTY0OiBzdHJpbmcsIF9taXBtYXA6IE1JUE1BUCA9IE1JUE1BUC5DUklTUCwgX3dyYXA6IFdSQVAgPSBXUkFQLlJFUEVBVCwgX3dpZHRoPzogbnVtYmVyLCBfaGVpZ2h0PzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5pbWFnZS5zcmMgPSBfYmFzZTY0O1xyXG4gICAgICB0aGlzLm1pcG1hcCA9IF9taXBtYXA7XHJcbiAgICAgIHRoaXMud3JhcCA9IF93cmFwO1xyXG4gICAgICBpZiAoX3dpZHRoKVxyXG4gICAgICAgIHRoaXMuaW1hZ2Uud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIGlmIChfaGVpZ2h0KVxyXG4gICAgICAgIHRoaXMuaW1hZ2UuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVDYW52YXMgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9jcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBfY3JjMjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmMyLmNhbnZhcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgdGV4dC4gVGV4dHVyZSB1cGF0ZXMgd2hlbiB0aGUgdGV4dCBvciBmb250IGNoYW5nZXMuIFRoZSB0ZXh0dXJlIGlzIHJlc2l6ZWQgdG8gZml0IHRoZSB0ZXh0LlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlVGV4dCBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHJvdGVjdGVkIGNyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICAgICN0ZXh0OiBzdHJpbmc7XHJcbiAgICAjZm9udDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfdGV4dDogc3RyaW5nID0gXCJUZXh0XCIsIF9mb250OiBzdHJpbmcgPSBcIjIwcHggbW9ub3NwYWNlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3RleHQ7XHJcbiAgICAgIHRoaXMuZm9udCA9IF9mb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGV4dChfdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuI3RleHQgPSBfdGV4dDtcclxuICAgICAgdGhpcy50ZXh0dXJlRGlydHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZvbnQoX2ZvbnQ6IHN0cmluZykge1xyXG4gICAgICB0aGlzLiNmb250ID0gX2ZvbnQ7XHJcbiAgICAgIGRvY3VtZW50LmZvbnRzLmxvYWQodGhpcy4jZm9udClcclxuICAgICAgICAuY2F0Y2goKF9lcnJvcikgPT4gRGVidWcuZXJyb3IoYCR7VGV4dHVyZVRleHQubmFtZX06ICR7X2Vycm9yfWApKVxyXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmb250KCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXMud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RyYW5zcGFyZW5jeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JjMi5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLnRleHR1cmVEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuY3JjMi5mb250ID0gdGhpcy5mb250O1xyXG5cclxuICAgICAgICBsZXQgbWV0cmljczogVGV4dE1ldHJpY3MgPSB0aGlzLmNyYzIubWVhc3VyZVRleHQodGhpcy50ZXh0KTtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IG1ldHJpY3Mud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGggKyB0aGlzLmNyYzIubWVhc3VyZVRleHQoXCIgIFwiKS53aWR0aDtcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiAxLjE7IC8vIHBhZGRpbmcsIG90aGVyd2lzZSBvbiBzb21lIGdseXBocyBtaWdodCBnZXQgY3V0IG9mZlxyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCA9PSAwKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNyYzIuZm9udCA9IHRoaXMuZm9udDsgLy8gVE9ETzogd2FpdCBmb3IgZm9udCB0byBiZSBsb2FkZWQgdXNpbmcgZG9jdW1lbnQuZm9udHNcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEJhc2VsaW5lID0gXCJtaWRkbGVcIjtcclxuICAgICAgICB0aGlzLmNyYzIuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIHRoaXMuY3JjMi5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jcmMyLmZpbGxUZXh0KHRoaXMuI3RleHQsIHRoaXMuY2FudmFzLndpZHRoIC8gMiwgdGhpcy5jYW52YXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN1cGVyLnVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxyXG4gICAgICAgIGZvbnQ6IHRoaXMuZm9udFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3NlcmlhbGl6YXRpb24udGV4dDtcclxuICAgICAgdGhpcy5mb250ID0gX3NlcmlhbGl6YXRpb24uZm9udDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU/OiBib29sZWFuKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci50ZXh0ID0gdGhpcy50ZXh0O1xyXG4gICAgICBtdXRhdG9yLmZvbnQgPSB0aGlzLmZvbnQ7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSBGVURHRS1Ta2V0Y2hcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZVNrZXRjaCBleHRlbmRzIFRleHR1cmVDYW52YXMge1xyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUZXh0dXJlIGNyZWF0ZWQgZnJvbSBhbiBIVE1MLXBhZ2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUhUTUwgZXh0ZW5kcyBUZXh0dXJlQ2FudmFzIHtcclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgbWVzaGVzLiBcclxuICAgKiBNZXNoZXMgcHJvdmlkZSBpbmRleGVkIHZlcnRpY2VzLCB0aGUgb3JkZXIgb2YgaW5kaWNlcyB0byBjcmVhdGUgdHJpZ29ucyBhbmQgbm9ybWFscywgYW5kIHRleHR1cmUgY29vcmRpbmF0ZXNcclxuICAgKiBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS8yMlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3Rvck1lc2guZGVjb3JhdGVcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVzaCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICAvKiogcmVmZXJzIGJhY2sgdG8gdGhpcyBjbGFzcyBmcm9tIGFueSBzdWJjbGFzcyBlLmcuIGluIG9yZGVyIHRvIGZpbmQgY29tcGF0aWJsZSBvdGhlciByZXNvdXJjZXMqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBiYXNlQ2xhc3M6IHR5cGVvZiBNZXNoID0gTWVzaDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIE1lc2hbXSA9IFtdO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbmFtZSB2ZXJ0aWNlcyB0byB2ZXJ0aWNlc1Ntb290aCBvciBqdXN0IGNsb3VkLCBhbmQgY2xvdWQgdG8gdmVydGljZXNcclxuXHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiTWVzaFwiO1xyXG4gICAgLy8gYmFzZSBzdHJ1Y3R1cmUgZm9yIG1lc2hlcyBpbiBGVURHRVxyXG4gICAgcHVibGljIHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgcHVibGljIGZhY2VzOiBGYWNlW10gPSBbXTtcclxuXHJcbiAgICAvLyBwdWJsaWMgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVyczsgLyogZGVmaW5lZCBieSBSZW5kZXJJbmplY3RvciovXHJcblxyXG4gICAgLyoqIGJvdW5kaW5nIGJveCBBQUJCICovXHJcbiAgICBwcm90ZWN0ZWQgxpJib3g6IEJveDtcclxuICAgIC8vIFRPRE86IGV4cGxvcmUgbWF0aGVtYXRpY3MgZm9yIGVhc3kgdHJhbnNmb3JtYXRpb25zIG9mIHJhZGl1cyBcclxuICAgIC8qKiBib3VuZGluZyByYWRpdXMgKi9cclxuICAgIHByb3RlY3RlZCDGknJhZGl1czogbnVtYmVyO1xyXG5cclxuICAgICNyZW5kZXJNZXNoOiBSZW5kZXJNZXNoO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoXCIpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgTWVzaCk6IG51bWJlciB7IHJldHVybiBNZXNoLnN1YmNsYXNzZXMucHVzaChfc3ViQ2xhc3MpIC0gMTsgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVuZGVyTWVzaCgpOiBSZW5kZXJNZXNoIHtcclxuICAgICAgaWYgKHRoaXMuI3JlbmRlck1lc2ggPT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyZW5kZXJNZXNoID0gbmV3IFJlbmRlck1lc2godGhpcyk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jcmVuZGVyTWVzaDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvdW5kaW5nQm94KCk6IEJveCB7XHJcbiAgICAgIGlmICh0aGlzLsaSYm94ID09IG51bGwpXHJcbiAgICAgICAgdGhpcy7GkmJveCA9IHRoaXMuY3JlYXRlQm91bmRpbmdCb3goKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLsaSYm94O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCByYWRpdXMoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuxpJyYWRpdXMgPT0gbnVsbClcclxuICAgICAgICB0aGlzLsaScmFkaXVzID0gdGhpcy5jcmVhdGVSYWRpdXMoKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLsaScmFkaXVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yTWVzaH0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJCdWZmZXJzKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX210eE1lc2hUb1dvcmxkOiBNYXRyaXg0eDQsIF9tdHhNZXNoVG9WaWV3OiBNYXRyaXg0eDQsIF9pZD86IG51bWJlcik6IFJlbmRlckJ1ZmZlcnMgeyByZXR1cm4gbnVsbDsgLyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvck1lc2h9LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVuZGVyQnVmZmVycygpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JNZXNofS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVJlbmRlckJ1ZmZlcnMoX3JlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgYm91bmRzIG9mIHRoaXMgbWVzaCBhc3dlbGwgYXMgdGhlIGJ1ZmZlcnMgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbmRlck1lc2h9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuxpJib3ggPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuxpJyYWRpdXMgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICB0aGlzLmRlbGV0ZVJlbmRlckJ1ZmZlcnModGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMpO1xyXG4gICAgICB0aGlzLnJlbmRlck1lc2guY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8vIFNlcmlhbGl6ZS9EZXNlcmlhbGl6ZSBmb3IgYWxsIG1lc2hlcyB0aGF0IGNhbGN1bGF0ZSB3aXRob3V0IHBhcmFtZXRlcnNcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgdHlwZTogdGhpcy50eXBlIC8vIHN0b3JlIGZvciBlZGl0b3Igdmlld1xyXG4gICAgICB9OyAvLyBubyBkYXRhIG5lZWRlZCAuLi5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICAvLyB0eXBlIGlzIGFuIGFjY2Vzc29yIGFuZCBtdXN0IG5vdCBiZSBkZXNlcmlhbGl6ZWRcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgLy8gVE9ETzogc28gbXVjaCB0byBkZWxldGUuLi4gcmF0aGVyIGp1c3QgZ2F0aGVyIHdoYXQgdG8gbXV0YXRlXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci7GkmJveDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLsaScmFkaXVzO1xyXG5cclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckJ1ZmZlcnM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVJhZGl1cygpOiBudW1iZXIge1xyXG4gICAgICAvL1RPRE86IHJhZGl1cyBhbmQgYm91bmRpbmcgYm94IGNvdWxkIGJlIGNyZWF0ZWQgb24gY29uc3RydWN0aW9uIG9mIHZlcnRleC1hcnJheVxyXG4gICAgICBsZXQgcmFkaXVzOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgdGhpcy52ZXJ0aWNlcy5wb3NpdGlvbihpKS5tYWduaXR1ZGVTcXVhcmVkKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KHJhZGl1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUJvdW5kaW5nQm94KCk6IEJveCB7XHJcbiAgICAgIGxldCBib3g6IEJveCA9IFJlY3ljbGVyLmdldChCb3gpO1xyXG4gICAgICBib3guc2V0KCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvaW50OiBWZWN0b3IzID0gdGhpcy52ZXJ0aWNlcy5wb3NpdGlvbihpKTtcclxuICAgICAgICBib3guZXhwYW5kKHBvaW50KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYm94O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIG1hdGVyaWFscy4gQ29tYmluZXMgYSB7QGxpbmsgU2hhZGVyfSB3aXRoIGEgY29tcGF0aWJsZSB7QGxpbmsgQ29hdH1cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIEBlbnVtZXJhYmxlXHJcbiAgZXhwb3J0IGNsYXNzIE1hdGVyaWFsIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8qKiBUaGUgbmFtZSB0byBjYWxsIHRoZSBNYXRlcmlhbCBieS4gKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENsaXBwaW5nIHRocmVzaG9sZCBmb3IgYWxwaGEgdmFsdWVzLCBldmVyeSBwaXhlbCB3aXRoIGFscGhhIDwgYWxwaGFDbGlwIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWxwaGFDbGlwOiBudW1iZXIgPSAwLjAxO1xyXG5cclxuICAgIHByaXZhdGUgc2hhZGVyVHlwZTogdHlwZW9mIFNoYWRlcjsgLy8gVGhlIHNoYWRlciBwcm9ncmFtIHVzZWQgYnkgdGhpcyBCYXNlTWF0ZXJpYWxcclxuICAgICNjb2F0OiBDb2F0O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfc2hhZGVyPzogdHlwZW9mIFNoYWRlciwgX2NvYXQ/OiBDb2F0KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLnNoYWRlclR5cGUgPSBfc2hhZGVyO1xyXG4gICAgICBpZiAoX3NoYWRlcikge1xyXG4gICAgICAgIGlmIChfY29hdClcclxuICAgICAgICAgIHRoaXMuY29hdCA9IF9jb2F0O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuY29hdCA9IHRoaXMuY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZWZlcmVuY2VkIHtAbGluayBDb2F0fSBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBAdHlwZShDb2F0KVxyXG4gICAgQGVudW1lcmFibGVcclxuICAgIHB1YmxpYyBnZXQgY29hdCgpOiBDb2F0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvYXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1ha2VzIHRoaXMgbWF0ZXJpYWwgcmVmZXJlbmNlIHRoZSBnaXZlbiB7QGxpbmsgQ29hdH0gaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZWZlcmVuY2VkIHtAbGluayBTaGFkZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY29hdChfY29hdDogQ29hdCkge1xyXG4gICAgICBpZiAodGhpcy5zaGFkZXJUeXBlKVxyXG4gICAgICAgIGlmIChfY29hdC5jb25zdHJ1Y3RvciAhPSB0aGlzLnNoYWRlclR5cGUuZ2V0Q29hdCgpKVxyXG4gICAgICAgICAgaWYgKF9jb2F0IGluc3RhbmNlb2YgdGhpcy5zaGFkZXJUeXBlLmdldENvYXQoKSlcclxuICAgICAgICAgICAgRGVidWcuZnVkZ2UoXCJDb2F0IGlzIGV4dGVuc2lvbiBvZiBDb2F0IHJlcXVpcmVkIGJ5IHNoYWRlclwiKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihcIlNoYWRlciBhbmQgY29hdCBkb24ndCBtYXRjaFwiKSk7XHJcbiAgICAgIHRoaXMuI2NvYXQgPSBfY29hdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvYXR9IGluc3RhbmNlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSB7QGxpbmsgU2hhZGVyfSByZWZlcmVuY2VkIGJ5IHRoaXMgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUNvYXRNYXRjaGluZ1NoYWRlcigpOiBDb2F0IHtcclxuICAgICAgbGV0IGNvYXQ6IENvYXQgPSBuZXcgKHRoaXMuc2hhZGVyVHlwZS5nZXRDb2F0KCkpKCk7XHJcbiAgICAgIHJldHVybiBjb2F0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyB0aGUgbWF0ZXJpYWxzIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4ge0BsaW5rIFNoYWRlcn0sIGNyZWF0ZXMgYW5kIHJlZmVyZW5jZXMgYSBuZXcge0BsaW5rIENvYXR9IGluc3RhbmNlICBcclxuICAgICAqIGFuZCBtdXRhdGVzIHRoZSBuZXcgY29hdCB0byBwcmVzZXJ2ZSBtYXRjaGluZyBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIF9zaGFkZXJUeXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2hhZGVyKF9zaGFkZXJUeXBlOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhZGVyVHlwZSA9IF9zaGFkZXJUeXBlO1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IHRoaXMuY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk7XHJcbiAgICAgIGNvYXQubXV0YXRlKHRoaXMuI2NvYXQ/LmdldE11dGF0b3IoKSk7XHJcbiAgICAgIHRoaXMuY29hdCA9IGNvYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2hhZGVyfSByZWZlcmVuY2VkIGJ5IHRoaXMgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYWRlcigpOiB0eXBlb2YgU2hhZGVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2hhZGVyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8vIFRPRE86IHRoaXMgdHlwZSBvZiBzZXJpYWxpemF0aW9uIHdhcyBpbXBsZW1lbnRlZCBmb3IgaW1wbGljaXQgTWF0ZXJpYWwgY3JlYXRlLiBDaGVjayBpZiBvYnNvbGV0ZSB3aGVuIG9ubHkgb25lIG1hdGVyaWFsIGNsYXNzIGV4aXN0cyBhbmQvb3IgbWF0ZXJpYWxzIGFyZSBzdG9yZWQgc2VwYXJhdGVseVxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBzaGFkZXI6IHRoaXMuc2hhZGVyVHlwZS5uYW1lLFxyXG4gICAgICAgIGNvYXQ6IFNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuI2NvYXQpLFxyXG4gICAgICAgIGFscGhhQ2xpcDogdGhpcy5hbHBoYUNsaXBcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLnNoYWRlclR5cGUgPSAoPEdlbmVyYWw+RnVkZ2VDb3JlKVtfc2VyaWFsaXphdGlvbi5zaGFkZXJdO1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IDxDb2F0PmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY29hdCk7XHJcbiAgICAgIHRoaXMuY29hdCA9IGNvYXQ7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5hbHBoYUNsaXAgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMuYWxwaGFDbGlwID0gX3NlcmlhbGl6YXRpb24uYWxwaGFDbGlwO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvLyBkZWxldGUgX211dGF0b3IuaWRSZXNvdXJjZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbmFtZXNhcGNlIGZvciBoYW5kbGluZyB0aGUgcGFydGljbGUgZGF0YVxyXG4gICAqL1xyXG4gIGV4cG9ydCBuYW1lc3BhY2UgUGFydGljbGVEYXRhIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgYSBwYXJ0aWNsZSBzeXN0ZW0uIERlc2NyaWJlcyB0aGUgcGFydGljbGUgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtIHtcclxuICAgICAgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdO1xyXG4gICAgICB2YXJpYWJsZXM/OiBFeHByZXNzaW9uW107IC8veyBbbmFtZTogc3RyaW5nXTogRXhwcmVzc2lvbiB9O1xyXG4gICAgICBjb2xvcj86IEV4cHJlc3Npb25bXTtcclxuICAgICAgbXR4TG9jYWw/OiBUcmFuc2Zvcm1hdGlvbltdO1xyXG4gICAgICBtdHhXb3JsZD86IFRyYW5zZm9ybWF0aW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgUmVjdXJzaXZlID0gU3lzdGVtIHwgRXhwcmVzc2lvbltdIHwgVHJhbnNmb3JtYXRpb25bXSB8IFRyYW5zZm9ybWF0aW9uIHwgRXhwcmVzc2lvbjtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBFeHByZXNzaW9uID0gRnVuY3Rpb24gfCBWYXJpYWJsZSB8IENvbnN0YW50IHwgQ29kZTtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcclxuICAgICAgZnVuY3Rpb246IEZVTkNUSU9OO1xyXG4gICAgICBwYXJhbWV0ZXJzOiBFeHByZXNzaW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZSB7XHJcbiAgICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb25zdGFudCB7XHJcbiAgICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlIHtcclxuICAgICAgY29kZTogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24ge1xyXG4gICAgICB0cmFuc2Zvcm1hdGlvbjogXCJ0cmFuc2xhdGVcIiB8IFwicm90YXRlXCIgfCBcInNjYWxlXCI7XHJcbiAgICAgIHBhcmFtZXRlcnM6IEV4cHJlc3Npb25bXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YSBpcyBhIHtAbGluayBFeHByZXNzaW9ufVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBFeHByZXNzaW9uIHtcclxuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oX2RhdGEpIHx8IGlzVmFyaWFibGUoX2RhdGEpIHx8IGlzQ29uc3RhbnQoX2RhdGEpIHx8IGlzQ29kZShfZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgRnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBGdW5jdGlvbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcImZ1bmN0aW9uXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgVmFyaWFibGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1ZhcmlhYmxlKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBWYXJpYWJsZSB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInZhbHVlXCIgaW4gX2RhdGEgJiYgdHlwZW9mIF9kYXRhLnZhbHVlID09IFwic3RyaW5nXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgQ29uc3RhbnR9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbnN0YW50KF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBDb25zdGFudCB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInZhbHVlXCIgaW4gX2RhdGEgJiYgdHlwZW9mIF9kYXRhLnZhbHVlID09IFwibnVtYmVyXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgQ29kZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29kZShfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgQ29kZSB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBfZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YSBpcyBhIHtAbGluayBUcmFuc2Zvcm1hdGlvbn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNmb3JtYXRpb24oX2RhdGE6IFJlY3Vyc2l2ZSk6IF9kYXRhIGlzIFRyYW5zZm9ybWF0aW9uIHtcclxuICAgICAgcmV0dXJuIHR5cGVvZiBfZGF0YSA9PSBcIm9iamVjdFwiICYmIFwidHJhbnNmb3JtYXRpb25cIiBpbiBfZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBtdXRhdGUgdGhlIHBhcnRpY2xlcyBvZiBhIHBhcnRpY2xlIHN5c3RlbS5cclxuICAgKiBBIGZ1bGwgcGFydGljbGUgc3lzdGVtIGlzIGNvbXBvc2VkIGJ5IGF0dGFjaGluZyBhIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0sIHtAbGluayBDb21wb25lbnRNZXNofSBhbmQge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsfSB0byB0aGUgc2FtZSB7QGxpbmsgTm9kZX0uIFxyXG4gICAqIEFkZGl0aW9uYWxseSBhIHtAbGluayBDb21wb25lbnRGYWNlQ2FtZXJhfSBjYW4gYmUgYXR0YWNoZWQgdG8gbWFrZSB0aGUgcGFydGljbGVzIGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUGFydGljbGVTeXN0ZW0gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgI2RhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW07XHJcbiAgICAvKiogTWFwIG9mIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzIHRvIGNvcnJlc3BvbmRpbmcgY29tcHV0ZWQge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfS4gXHJcbiAgICAgKiBUaGlzIHdheSBlYWNoIHBhcnRpY2xlIHN5c3RlbSByZXNvdXJjZSBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG11bHRpcGxlIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzICovXHJcbiAgICAjc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbTogTWFwPFNoYWRlckludGVyZmFjZSwgU2hhZGVyUGFydGljbGVTeXN0ZW0+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gUGFydGljbGVTeXN0ZW0ubmFtZSwgX2RhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW0gPSB7fSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5kYXRhID0gX2RhdGE7XHJcblxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBQYXJ0aWNsZURhdGEuU3lzdGVtIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXRhKF9kYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtKSB7XHJcbiAgICAgIHRoaXMuI2RhdGEgPSBfZGF0YTtcclxuICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5mb3JFYWNoKF9zaGFkZXIgPT4gX3NoYWRlci5kZWxldGVQcm9ncmFtKCkpO1xyXG4gICAgICB0aGlzLiNzaGFkZXJUb1NoYWRlclBhcnRpY2xlU3lzdGVtLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29ycmVzcG9uZGluZyB7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19IGZvciB0aGUgZ2l2ZW4gc2hhZGVyIHVuaXZlcnNhbCBkZXJpdmF0ZS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0gdG8gcmVuZGVyIHRoZSBwYXJ0aWNsZSBzeXN0ZW0uXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYWRlckZyb20oX3NvdXJjZTogU2hhZGVySW50ZXJmYWNlKTogU2hhZGVyUGFydGljbGVTeXN0ZW0ge1xyXG4gICAgICBpZiAoIXRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uaGFzKF9zb3VyY2UpKSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2xlU2hhZGVyOiBTaGFkZXJQYXJ0aWNsZVN5c3RlbSA9IG5ldyBTaGFkZXJQYXJ0aWNsZVN5c3RlbSgpO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgcGFydGljbGVTaGFkZXIuZGVmaW5lID0gWy4uLnBhcnRpY2xlU2hhZGVyLmRlZmluZSwgLi4uX3NvdXJjZS5kZWZpbmVdO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLnZlcnRleFNoYWRlclNvdXJjZSA9IF9zb3VyY2UuZ2V0VmVydGV4U2hhZGVyU291cmNlKCk7XHJcbiAgICAgICAgcGFydGljbGVTaGFkZXIuZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBfc291cmNlLmdldEZyYWdtZW50U2hhZGVyU291cmNlKCk7XHJcbiAgICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5zZXQoX3NvdXJjZSwgcGFydGljbGVTaGFkZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZXQoX3NvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmRhdGEgPSBfc2VyaWFsaXphdGlvbi5kYXRhO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuY2FjaGVkTXV0YXRvcnM7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zaGFkZXJNYXA7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVmZmVycyB0aGUgYm9uZSBkYXRhIGZyb20gdGhlIHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gaW50byBhIFdlYkdMIEJ1ZmZlclxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyQnVmZmVyXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi51c2VSZW5kZXJCdWZmZXJcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVwZGF0ZVJlbmRlckJ1ZmZlclwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJkZWxldGVSZW5kZXJCdWZmZXJcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLmRlbGV0ZVJlbmRlckJ1ZmZlclxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHVzZVJlbmRlckJ1ZmZlcih0aGlzOiBDb21wb25lbnRTa2VsZXRvbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucmVuZGVyQnVmZmVyKVxyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlckJhc2UoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgVU5JRk9STV9CTE9DS1MuU0tJTi5CSU5ESU5HLCB0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1cGRhdGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJCdWZmZXIpIHtcclxuICAgICAgICBjb25zdCBib25lc0J5dGVTaXplOiBudW1iZXIgPSAyNTYgKiAxNiAqIDQ7IC8vIENBVVRJT046IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBzaGFkZXIgc291cmNlIGNvZGUgd2hlcmUgMjU2IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib25lc1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckJ1ZmZlciA9IFJlbmRlcldlYkdMLmFzc2VydChjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBib25lc0J5dGVTaXplLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tdHhCb25lcy5sZW5ndGggKiAxNik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm10eEJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGRhdGEuc2V0KHRoaXMubXR4Qm9uZXNbaV0uZ2V0KCksIGkgKiAxNik7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICBjcmMzLmJ1ZmZlclN1YkRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgMCwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlbmRlckJ1ZmZlcilcclxuICAgICAgICBjcmMzLmRlbGV0ZUJ1ZmZlcih0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi8uLi9SZW5kZXIvUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGFuIGFycmF5IG9mIGJvbmVzICh7QGxpbmsgTm9kZX1zIHdpdGhpbiBhIHtAbGluayBHcmFwaH0pLiBSZWZlcmVuY2VkIGZyb20gYSB7QGxpbmsgQ29tcG9uZW50TWVzaH0gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBNZXNofSBhbmQgZW5hYmxlIHNraW5uaW5nIGZvciB0aGUgbWVzaC5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMi0yMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50U2tlbGV0b24gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLyoqIFRoZSBib25lcyB1c2VkIGZvciBza2lubmluZyAqL1xyXG4gICAgcHVibGljIGJvbmVzOiBOb2RlW107XHJcbiAgICAvKiogV2hlbiBhcHBsaWVkIHRvIHZlcnRpY2VzLCBpdCBtb3ZlcyB0aGVtIGZyb20gb2JqZWN0L21vZGVsIHNwYWNlIHRvIGJvbmUtbG9jYWwgc3BhY2UgYXMgaWYgdGhlIGJvbmUgd2VyZSBhdCBpdHMgaW5pdGlhbCBwb3NlICovXHJcbiAgICBwdWJsaWMgbXR4QmluZEludmVyc2VzOiBNYXRyaXg0eDRbXTsgLy8gVE9ETzogdGhpbmsgYWJvdXQgc2VyaWFsaXppbmcgdGhpcyBzZXBhcmF0ZWx5IHRvIG1ha2UgaXQgc2hhcmVhYmxlIGJldHdlZW4gc2tlbGV0b24gc2VyaWFsaXphdGlvbnNcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQnVmZmVyOiB1bmtub3duO1xyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib25lIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSB2ZXJ0aWNlcyBvZiBhIHtAbGluayBNZXNofSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG10eEJvbmVzOiBNYXRyaXg0eDRbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9uZXM6IE5vZGVbXSA9IFtdLCBfbXR4Qm9uZUludmVyc2VzOiBNYXRyaXg0eDRbXSA9IFtdKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYm9uZXMgPSBfYm9uZXM7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gX210eEJvbmVJbnZlcnNlcztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGlmICh0aGlzLm10eEJpbmRJbnZlcnNlc1tpXSA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0gPSB0aGlzLmJvbmVzW2ldLm10eFdvcmxkSW52ZXJzZS5jbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9ufS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVJlbmRlckJ1ZmZlcihfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbn0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVSZW5kZXJCdWZmZXIoKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b259LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyQnVmZmVyKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5vZGUgYXMgYSBib25lIHdpdGggaXRzIGJpbmQgaW52ZXJzZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZEJvbmUoX2JvbmU6IE5vZGUsIF9tdHhCaW5kSW52ZXJzZTogTWF0cml4NHg0ID0gX2JvbmUubXR4V29ybGRJbnZlcnNlLmNsb25lKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYm9uZXMucHVzaChfYm9uZSk7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzLnB1c2goX210eEJpbmRJbnZlcnNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJvbmUgaW4gdGhlIGJvbmVzIGFycmF5IHdoaWNoIGhhcyB0aGUgZ2l2ZW4gbmFtZSwgYW5kIC0xIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25hbWU6IHN0cmluZyk6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gYm9uZSBub2RlIGluIHRoZSBib25lIGFycmF5LCBvciAtMSBpZiBpdCBpcyBub3QgcHJlc2VudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25vZGU6IE5vZGUpOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaW5kZXhPZihfbmFtZTogc3RyaW5nIHwgTm9kZSk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9uYW1lKSA9PSBcInN0cmluZ1wiKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvbmVzLmZpbmRJbmRleCgoX2JvbmU6IE5vZGUpID0+IF9ib25lLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9uZXMuaW5kZXhPZihfbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBib25lIG1hdHJpY2VzIHRvIGJlIHVzZWQgYnkgdGhlIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGNvbnN0IG10eEJvbmUgb2YgdGhpcy5tdHhCb25lcylcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhCb25lKTtcclxuICAgICAgdGhpcy5tdHhCb25lcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgbXR4Qm9uZTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ib25lc1tpXS5tdHhXb3JsZCwgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0pO1xyXG4gICAgICAgIHRoaXMubXR4Qm9uZXMucHVzaChtdHhCb25lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBwb3NlIG9mIHRoaXMgc2tlbGV0b24gdG8gdGhlIGRlZmF1bHQgcG9zZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXRQb3NlKCk6IHZvaWQgeyAvLyBUT0RPOiB0ZXN0IHRoaXNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgdGhpcy5ib25lc1tpXS5tdHhMb2NhbC5jb3B5KE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4QmluZEludmVyc2VzW2ldKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uYm9uZXMgPSB0aGlzLmJvbmVzLm1hcChfYm9uZSA9PiBOb2RlLlBBVEhfRlJPTV9UTyh0aGlzLCBfYm9uZSkpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm10eEJpbmRJbnZlcnNlcyA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoTWF0cml4NHg0LCB0aGlzLm10eEJpbmRJbnZlcnNlcyk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG5cclxuICAgICAgY29uc3QgaG5kTm9kZURlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ib25lcyA9IF9zZXJpYWxpemF0aW9uLmJvbmVzLm1hcCgoX3BhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgbGV0IGJvbmU6IE5vZGUgPSBOb2RlLkZJTkQodGhpcywgX3BhdGgpO1xyXG4gICAgICAgICAgaWYgKCFib25lKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Tm9kZS5uYW1lfSBcIiR7dGhpcy5ub2RlLm5hbWV9XCIgJHtDb21wb25lbnRTa2VsZXRvbi5uYW1lfTogQ291bGQgbm90IGZpbmQgYm9uZSAke19wYXRofWApO1xyXG4gICAgICAgICAgcmV0dXJuIGJvbmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuXHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gPE1hdHJpeDR4NFtdPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbi5tdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnL0RlYnVnVGFyZ2V0LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWcvRGVidWcudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiVGltZS9UaW1lLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiRXZlbnQvRXZlbnQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJTZXJpYWxpemF0aW9uL011dGFibGUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJTZXJpYWxpemF0aW9uL1NlcmlhbGl6ZXIudHNcIi8+IFxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiR3JhcGgvTm9kZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbXBvbmVudC9Db21wb25lbnQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVyL1JlbmRlcldlYkdMLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBoeXNpY3MvSGVscGVyc1BoeXNpY3MudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQaHlzaWNzL0pvaW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGh5c2ljcy9Kb2ludEF4aWFsLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiVGV4dHVyZS9UZXh0dXJlLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiTWVzaC9NZXNoLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiTWF0ZXJpYWwvTWF0ZXJpYWwudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbXBvbmVudC9Db21wb25lbnRTa2VsZXRvbi50c1wiLz5cclxuXHJcblxyXG4vL2dsb2JhbCBmdW5jdGlvbnNcclxuZnVuY3Rpb24gaWZOdW1iZXIoX2NoZWNrOiBudW1iZXIsIF9kZWZhdWx0OiBudW1iZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiB0eXBlb2YgX2NoZWNrID09IFwidW5kZWZpbmVkXCIgPyBfZGVmYXVsdCA6IF9jaGVjaztcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdGhhdCB0aGUgQW5pbWF0aW9uIHVzZXMgdG8gbWFwIHRoZSBTZXF1ZW5jZXMgdG8gdGhlIEF0dHJpYnV0ZXMuXHJcbiAgICogQnVpbHQgb3V0IG9mIGEge0BsaW5rIE5vZGV9J3Mgc2VyaWFsc2F0aW9uLCBpdCBzd2FwcyB0aGUgdmFsdWVzIHdpdGgge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgW2F0dHJpYnV0ZTogc3RyaW5nXTogQW5pbWF0aW9uU3RydWN0dXJlW10gfCBBbmltYXRpb25TdHJ1Y3R1cmUgfCBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzIGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3I0IGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHc/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgZXh0ZW5kcyBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgcm90YXRpb24/OiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgfCBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjQ7XHJcbiAgICBzY2FsZT86IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMztcclxuICAgIHRyYW5zbGF0aW9uPzogQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbiBhc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIG5hbWVzIG9mIGxhYmxlcyB0byB0aW1lc3RhbXBzLlxyXG4gICogTGFiZWxzIG5lZWQgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24uXHJcbiAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkxhYmVsIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IEFuaW1hdGlvbiBFdmVudCBUcmlnZ2Vyc1xyXG4gICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAxOVxyXG4gICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25FdmVudFRyaWdnZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsbHkgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHZhcmlvdXMgZ2VuZXJhdGVkIHN0cnVjdHVyZXMgYW5kIGV2ZW50cy5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZW51bSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUge1xyXG4gICAgLyoqRGVmYXVsdDogZm9yd2FyZCwgY29udGlub3VzICovXHJcbiAgICBOT1JNQUwsXHJcbiAgICAvKipiYWNrd2FyZCwgY29udGlub3VzICovXHJcbiAgICBSRVZFUlNFLFxyXG4gICAgLyoqZm9yd2FyZCwgcmFzdGVyZWQgKi9cclxuICAgIFJBU1RFUkVELFxyXG4gICAgLyoqYmFja3dhcmQsIHJhc3RlcmVkICovXHJcbiAgICBSQVNURVJFRFJFVkVSU0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGRpZmZlcmVudCBwbGF5bW9kZXMgdGhlIGFuaW1hdGlvbiB1c2VzIHRvIHBsYXkgYmFjayBpdHMgYW5pbWF0aW9uLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCA9IFwibG9vcFwiLFxyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIG9uY2UgYW5kIHN0b3BzIGF0IHRoZSBsYXN0IGtleS9mcmFtZSovXHJcbiAgICBQTEFZX09OQ0UgPSBcInBsYXlPbmNlXCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gb25jZSBhbmQgc3RvcHMgb24gdGhlIGZpcnN0IGtleS9mcmFtZSAqL1xyXG4gICAgUExBWV9PTkNFX1JFU0VUID0gXCJwbGF5T25jZVJlc2V0XCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gbGlrZSBMT09QLCBidXQgYmFja3dhcmRzLiovXHJcbiAgICBSRVZFUlNFX0xPT1AgPSBcInJldmVyc2VMb29wXCIsXHJcbiAgICAvKipDYXVzZXMgdGhlIGFuaW1hdGlvbiBub3QgdG8gcGxheSBhdCBhbGwuIFVzZWZ1bCBmb3IganVtcGluZyB0byB2YXJpb3VzIHBvc2l0aW9ucyBpbiB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgcHJvY2VlZGluZyBpbiB0aGUgYW5pbWF0aW9uLiovXHJcbiAgICBTVE9QID0gXCJzdG9wXCJcclxuICAgIC8vVE9ETzogYWRkIGFuIElOSEVSSVQgYW5kIGEgUElOR1BPTkcgbW9kZVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gQU5JTUFUSU9OX1FVQU5USVpBVElPTiB7XHJcbiAgICAvL1RPRE86IGFkZCBhbiBpbi1kZXB0aCBkZXNjcmlwdGlvbiBvZiB3aGF0IGhhcHBlbnMgdG8gdGhlIGFuaW1hdGlvbiAoYW5kIGV2ZW50cykgZGVwZW5kaW5nIG9uIHRoZSBxdWFudGl6YXRpb24uIFVzZSBHcmFwaHMgdG8gZXhwbGFpbi5cclxuICAgIC8qKkNhbGN1bGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRpbWUuIElnbm9yZXMgRlBTIHZhbHVlIG9mIGFuaW1hdGlvbi4qL1xyXG4gICAgQ09OVElOT1VTID0gXCJjb250aW5vdXNcIixcclxuICAgIC8qKkxpbWl0cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIEZQUyB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLiBTa2lwcyBmcmFtZXMgaWYgbmVlZGVkLiovXHJcbiAgICBESVNDUkVURSA9IFwiZGlzY3JldGVcIixcclxuICAgIC8qKiBBZHZhbmNlcyB0aGUgdGltZSBlYWNoIGZyYW1lIGFjY29yZGluZyB0byB0aGUgRlBTIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIGlnbm9yaW5nIHRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIGZyYW1lcy4gRG9lc24ndCBza2lwIGFueSBmcmFtZXMuKi9cclxuICAgIEZSQU1FUyA9IFwiZnJhbWVzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc2NyaWJlcyBhbmQgY29udHJvbHMgYW5kIGFuaW1hdGlvbiBieSB5aWVsZGluZyBtdXRhdG9ycyBcclxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIHN0b3JlZCB7QGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlfSBhbmQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXNcclxuICAgKiBBcHBsaWVkIHRvIGEge0BsaW5rIE5vZGV9IGRpcmVjdGx5IHZpYSBzY3JpcHQgb3Ige0BsaW5rIENvbXBvbmVudEFuaW1hdG9yfS5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMTAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8vIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIEFuaW1hdGlvbiA9IEFuaW1hdGlvbjtcclxuICAgIC8vIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEFuaW1hdGlvbltdID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uKTtcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRvdGFsVGltZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbHM6IEFuaW1hdGlvbkxhYmVsID0ge307IC8vIGEgbGFiZWwgbWFya3MgYSBzcGVjaWZpYyB0aW1lIHRvIGNvbnZlbmllbnRseSBqdW1wIHRvIHVzaW5nIGEgdGV4dCBpZGVudGlmaWVyXHJcbiAgICAvLyBzdGVwc1BlclNlY29uZDogbnVtYmVyID0gMTA7XHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uU3RydWN0dXJlOiBBbmltYXRpb25TdHJ1Y3R1cmU7IC8vIFRPRE86IGlmIHNldCB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgKGFuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQpXHJcbiAgICBwdWJsaWMgZXZlbnRzOiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgIHByb3RlY3RlZCBmcmFtZXNQZXJTZWNvbmQ6IG51bWJlciA9IDYwOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBhbmQgaXRzIGFjY2Vzc29ycyB0byAjZnJhbWVzUGVyU2Vjb25kP1xyXG5cclxuICAgIC8vIHByb2Nlc3NlZCBldmVudGxpc3QgYW5kIGFuaW1hdGlvbiBzdHJ1Y3V0cmVzIGZvciBwbGF5YmFjay5cclxuICAgIHByaXZhdGUgZXZlbnRzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25FdmVudFRyaWdnZXI+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuICAgICNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvblN0cnVjdHVyZT4oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IEFuaW1hdGlvbi5uYW1lLCBfYW5pbVN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge30sIF9mcHM6IG51bWJlciA9IDYwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IF9hbmltU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLiNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkLnNldChBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuTk9STUFMLCBfYW5pbVN0cnVjdHVyZSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZwcztcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgQW5pbWF0aW9uKTogbnVtYmVyIHsgcmV0dXJuIEFuaW1hdGlvbi5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdldExhYmVscygpOiBFbnVtZXJhdG9yIHtcclxuICAgICAgLy9UT0RPOiB0aGlzIGFjdHVhbGx5IG5lZWRzIHRlc3RpbmdcclxuICAgICAgbGV0IGVuOiBFbnVtZXJhdG9yID0gbmV3IEVudW1lcmF0b3IodGhpcy5sYWJlbHMpO1xyXG4gICAgICByZXR1cm4gZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmcHMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZnBzKF9mcHM6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9mcHM7XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhpcyBhbmltYXRpb25zIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IHdpdGggdGhlIGluZm9ybWF0aW9uIHRvIGFwcGx5IHRvIHRoZSB7QGxpbmsgTm9kZX0gdG8gYW5pbWF0ZVxyXG4gICAgICogaW4gdGhlIHN0YXRlIHRoZSBhbmltYXRpb24gaXMgaW4gYXQgdGhlIGdpdmVuIHRpbWUsIGRpcmVjdGlvbiBhbmQgcXVhbnRpemF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGF0ZShfdGltZTogbnVtYmVyLCBfZGlyZWN0aW9uOiBudW1iZXIsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG06IE11dGF0b3IgPSB7fTtcclxuICAgICAgbGV0IGFuaW1hdGlvblN0cnVjdHVyZTogQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFO1xyXG5cclxuICAgICAgaWYgKF9xdWFudGl6YXRpb24gPT0gQU5JTUFUSU9OX1FVQU5USVpBVElPTi5DT05USU5PVVMpXHJcbiAgICAgICAgYW5pbWF0aW9uU3RydWN0dXJlID0gX2RpcmVjdGlvbiA8IDAgPyBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSA6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbmltYXRpb25TdHJ1Y3R1cmUgPSBfZGlyZWN0aW9uIDwgMCA/IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UgOiBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRUQ7XHJcblxyXG4gICAgICBtID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck11dGF0b3IodGhpcy5nZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoYW5pbWF0aW9uU3RydWN0dXJlKSwgX3RpbWUpO1xyXG4gICAgICByZXR1cm4gbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZXZlbnRzIHRoZSB7QGxpbmsgQ29tcG9uZW50QW5pbWF0b3J9IG5lZWRzIHRvIGZpcmUgYmV0d2VlbiBfbWluIGFuZCBfbWF4IGlucHV0IHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIGFuaW1hdGlvbiBpcyBzdXBwb3NlZCB0byBydW4gaW4uID4wID09IGZvcndhcmQsIDAgPT0gc3RvcCwgPDAgPT0gYmFja3dhcmRzXHJcbiAgICAgKiBAcmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUgY3VzdG9tIGV2ZW50cyB0byBmaXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXZlbnRzVG9GaXJlKF9taW46IG51bWJlciwgX21heDogbnVtYmVyLCBfcXVhbnRpemF0aW9uOiBBTklNQVRJT05fUVVBTlRJWkFUSU9OLCBfZGlyZWN0aW9uOiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBtaW5TZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9taW4gLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIGxldCBtYXhTZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9tYXggLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIF9taW4gPSBfbWluICUgdGhpcy50b3RhbFRpbWU7XHJcbiAgICAgIF9tYXggPSBfbWF4ICUgdGhpcy50b3RhbFRpbWU7XHJcblxyXG4gICAgICB3aGlsZSAobWluU2VjdGlvbiA8PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciA9IHRoaXMuZ2V0Q29ycmVjdEV2ZW50TGlzdChfZGlyZWN0aW9uLCBfcXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAobWluU2VjdGlvbiA9PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgICBldmVudExpc3QgPSBldmVudExpc3QuY29uY2F0KHRoaXMuY2hlY2tFdmVudHNCZXR3ZWVuKGV2ZW50VHJpZ2dlcnMsIF9taW4sIF9tYXgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXZlbnRMaXN0ID0gZXZlbnRMaXN0LmNvbmNhdCh0aGlzLmNoZWNrRXZlbnRzQmV0d2VlbihldmVudFRyaWdnZXJzLCBfbWluLCB0aGlzLnRvdGFsVGltZSkpO1xyXG4gICAgICAgICAgX21pbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pblNlY3Rpb24rKztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGV2ZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gRXZlbnQgdG8gdGhlIExpc3Qgb2YgZXZlbnRzLlxyXG4gICAgICogQHBhcmFtIF9uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCAobmVlZHMgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24pLlxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50IChpbiBtaWxsaXNlY29uZHMpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RXZlbnQoX25hbWU6IHN0cmluZywgX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmV2ZW50c1tfbmFtZV0gPSBfdGltZTtcclxuICAgICAgdGhpcy5ldmVudHNQcm9jZXNzZWQuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgbGlzdCBvZiBldmVudHMuXHJcbiAgICAgKiBAcGFyYW0gX25hbWUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgdGhpcy5ldmVudHNbX25hbWVdO1xyXG4gICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pQ2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBBbmltYXRpb24uIENhbGN1bGF0aW9uLWhlYXZ5LCB1c2Ugb25seSBpZiBhY3R1YWxseSBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVUb3RhbFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG90YWxUaW1lID0gMDtcclxuICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICAvLyBpZiAodGhpcy50b3RhbFRpbWUgPT0gMCkgLy8gYW5pbWF0aW9ucyB3aXRoIG9uZSBrZXlmcmFtZSBuZWVkIGEgdG90YWwgdGltZSAhPSAwIHRvIHdvcmtcclxuICAgICAgLy8gICB0aGlzLnRvdGFsVGltZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRvIHVzZSBmb3IgYW5pbWF0aW9uIHNhbXBsaW5nIHdoZW4gYXBwbHlpbmcgYSBwbGF5bW9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9kYWxUaW1lKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFLCBfdGltZVN0b3A6IG51bWJlciA9IF90aW1lKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgLy8gcmV0dXJuIHRoaXMubG9jYWxUaW1lLmdldE9mZnNldCgpO1xyXG4gICAgICAgICAgcmV0dXJuIF90aW1lU3RvcDtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0U6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvdGFsVGltZSAtIDAuMDE7ICAgICAvL1RPRE86IHRoaXMgbWlnaHQgY2F1c2Ugc29tZSBpc3N1ZXNcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBfdGltZVN0b3AgaW5zdGVhZD9cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lICsgMC4wMTsgICAgIC8vVE9ETzogdGhpcyBtaWdodCBjYXVzZSBzb21lIGlzc3Vlc1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGltZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGRpcmVjdGlvbiB0aGUgYW5pbWF0aW9uIHNob3VsZCBjdXJyZW50bHkgYmUgcGxheWluZyBpbi5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgdGltZSBhdCB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGRpcmVjdGlvblxyXG4gICAgICogQHJldHVybnMgMSBpZiBmb3J3YXJkLCAwIGlmIHN0b3AsIC0xIGlmIGJhY2t3YXJkc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgLy8gY2FzZSBBTklNQVRJT05fUExBWU1PREUuUElOR1BPTkc6XHJcbiAgICAgICAgLy8gICBpZiAoTWF0aC5mbG9vcihfdGltZSAvIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZSkgJSAyID09IDApXHJcbiAgICAgICAgLy8gICAgIHJldHVybiAxO1xyXG4gICAgICAgIC8vICAgZWxzZVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgY2FzZSBBTklNQVRJT05fUExBWU1PREUuUkVWRVJTRV9MT09QOlxyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNhc2UgQU5JTUFUSU9OX1BMQVlNT0RFLlBMQVlfT05DRTpcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgczogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGxhYmVsczoge30sXHJcbiAgICAgICAgZXZlbnRzOiB7fSxcclxuICAgICAgICBmcmFtZXNQZXJTZWNvbmQ6IHRoaXMuZnJhbWVzUGVyU2Vjb25kXHJcbiAgICAgICAgLy8gc3BzOiB0aGlzLnN0ZXBzUGVyU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICBzLmxhYmVsc1tuYW1lXSA9IHRoaXMubGFiZWxzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcclxuICAgICAgICBzLmV2ZW50c1tuYW1lXSA9IHRoaXMuZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHMuYW5pbWF0aW9uU3RydWN0dXJlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclNlcmlhbGl6YXRpb24odGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgLy8gdGhpcy5zdGVwc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLnNwcztcclxuICAgICAgdGhpcy5sYWJlbHMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfc2VyaWFsaXphdGlvbi5sYWJlbHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IF9zZXJpYWxpemF0aW9uLmxhYmVsc1tuYW1lXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV2ZW50cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lIGluIF9zZXJpYWxpemF0aW9uLmV2ZW50cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzW25hbWVdID0gX3NlcmlhbGl6YXRpb24uZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0gYXdhaXQgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG5cclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZCA9IG5ldyBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+KCk7XHJcblxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsVGltZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRvdGFsVGltZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIEFuaW1hdGlvblN0cnVjdHVyZSBhbmQgcmV0dXJucyB0aGUgU2VyaWFsaXphdGlvbiBvZiBzYWlkIFN0cnVjdHVyZS5cclxuICAgICAqIEBwYXJhbSBfc3RydWN0dXJlIFRoZSBBbmltYXRpb24gU3RydWN0dXJlIGF0IHRoZSBjdXJyZW50IGxldmVsIHRvIHRyYW5zZm9ybSBpbnRvIHRoZSBTZXJpYWxpemF0aW9uLlxyXG4gICAgICogQHJldHVybnMgdGhlIGZpbGxlZCBTZXJpYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yU2VyaWFsaXphdGlvbihfc3RydWN0dXJlOiBPYmplY3QpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBfc3RydWN0dXJlKSB7XHJcbiAgICAgICAgbGV0IHN0cnVjdHVyZU9yU2VxdWVuY2U6IE9iamVjdCA9ICg8R2VuZXJhbD5fc3RydWN0dXJlKVtwcm9wZXJ0eV07XHJcbiAgICAgICAgaWYgKHN0cnVjdHVyZU9yU2VxdWVuY2UgaW5zdGFuY2VvZiBBbmltYXRpb25TZXF1ZW5jZSlcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25bcHJvcGVydHldID0gc3RydWN0dXJlT3JTZXF1ZW5jZS5zZXJpYWxpemUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9uW3Byb3BlcnR5XSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JTZXJpYWxpemF0aW9uKHN0cnVjdHVyZU9yU2VxdWVuY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmF2ZXJzZXMgYSBTZXJpYWxpemF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBBbmltYXRpb25TdHJ1Y3R1cmUuXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb24gVGhlIHNlcmlhbGl6YXRpb24gdG8gdHJhbnNmZXIgaW50byBhbiBBbmltYXRpb25TdHJ1Y3R1cmVcclxuICAgICAqIEByZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIEFuaW1hdGlvblN0cnVjdHVyZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8QW5pbWF0aW9uU3RydWN0dXJlPiB7XHJcbiAgICAgIGxldCBzdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgaWYgKF9zZXJpYWxpemF0aW9uW25dLmFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgYW5pbVNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgICAgIHN0cnVjdHVyZVtuXSA9IDxBbmltYXRpb25TZXF1ZW5jZT4oYXdhaXQgYW5pbVNlcS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltuXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdHJ1Y3R1cmVbbl0gPSBhd2FpdCB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yRGVzZXJpYWxpemF0aW9uKF9zZXJpYWxpemF0aW9uW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnRzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRDb3JyZWN0RXZlbnRMaXN0KF9kaXJlY3Rpb246IG51bWJlciwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmIChfcXVhbnRpemF0aW9uICE9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgaWYgKF9kaXJlY3Rpb24gPj0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoX2RpcmVjdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIHtAbGluayBBbmltYXRpb25TdHJ1Y3R1cmV9IGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IGRlc2NyaWJpbmcgdGhlIHN0YXRlIGF0IHRoZSBnaXZlbiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JNdXRhdG9yKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbmV3TXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBuZXdNdXRhdG9yW25dID0gKDxBbmltYXRpb25TZXF1ZW5jZT5fc3RydWN0dXJlW25dKS5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld011dGF0b3Jbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTXV0YXRvcig8QW5pbWF0aW9uU3RydWN0dXJlPl9zdHJ1Y3R1cmVbbl0sIF90aW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdNdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIHRoZSBjdXJyZW50IEFuaW1hdGlvblN0cmN1dHVyZSB0byBmaW5kIHRoZSB0b3RhbFRpbWUgb2YgdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gX3N0cnVjdHVyZSBUaGUgc3RydWN0dXJlIHRvIHRyYXZlcnNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JUaW1lKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gPEFuaW1hdGlvblNlcXVlbmNlPl9zdHJ1Y3R1cmVbbl07XHJcbiAgICAgICAgICBpZiAoc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc2VxdWVuY2VUaW1lOiBudW1iZXIgPSBzZXF1ZW5jZS5nZXRLZXkoc2VxdWVuY2UubGVuZ3RoIC0gMSkudGltZTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbFRpbWUgPSBNYXRoLm1heChzZXF1ZW5jZVRpbWUsIHRoaXMudG90YWxUaW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUoPEFuaW1hdGlvblN0cnVjdHVyZT5fc3RydWN0dXJlW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25TdHJjdXR1cmV9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gZ2V0XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWVzdGVkIFtbQGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlXV1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvblN0cnVjdHVyZSB7XHJcbiAgICAgIGlmICghdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5oYXMoX3R5cGUpKSB7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgICBsZXQgYWU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLk5PUk1BTDpcclxuICAgICAgICAgICAgYWUgPSB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0U6XHJcbiAgICAgICAgICAgIGFlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck5ld1N0cnVjdHVyZSh0aGlzLmdldFByb2Nlc3NlZEFuaW1hdGlvblN0cnVjdHVyZShBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSksIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuc2V0KF90eXBlLCBhZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25FdmVudFRyaWdnZXJ9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIFRoZSB0eXBlIG9mIEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB0byBnZXRcclxuICAgICAqIEByZXR1cm5zIHRoZSByZXF1ZXN0ZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmICghdGhpcy5ldmVudHNQcm9jZXNzZWQuaGFzKF90eXBlKSkge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgICAgbGV0IGV2OiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw6XHJcbiAgICAgICAgICAgIGV2ID0gdGhpcy5ldmVudHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRTpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKHRoaXMuZXZlbnRzKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRDpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJhc3RlcmVkRXZlbnRUcmlnZ2Vycyh0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRURSRVZFUlNFOlxyXG4gICAgICAgICAgICBldiA9IHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5zZXQoX3R5cGUsIGV2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ldmVudHNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXZlcnNlcyBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgdG8gYXBwbHkgYSByZWNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdG8gc3RvcmUgaW4gYSBuZXcgU3RydWN0dXJlLlxyXG4gICAgICogQHBhcmFtIF9vbGRTdHJ1Y3R1cmUgVGhlIG9sZCBzdHJ1Y3R1cmUgdG8gdHJhdmVyc2VcclxuICAgICAqIEBwYXJhbSBfZnVuY3Rpb25Ub1VzZSBUaGUgZnVuY3Rpb24gdG8gdXNlIHRvIHJlY2FsY3VsYXRlZCB0aGUgc3RydWN0dXJlLlxyXG4gICAgICogQHJldHVybnMgQSBuZXcgQW5pbWF0aW9uIFN0cnVjdHVyZSB3aXRoIHRoZSByZWNhbHVsYXRlZCBBbmltYXRpb24gU2VxdWVuY2VzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKF9vbGRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX2Z1bmN0aW9uVG9Vc2U6IEZ1bmN0aW9uKTogQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgICAgbGV0IG5ld1N0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcbiAgICAgIGZvciAobGV0IG4gaW4gX29sZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGlmIChfb2xkU3RydWN0dXJlW25dIGluc3RhbmNlb2YgQW5pbWF0aW9uU2VxdWVuY2UpIHtcclxuICAgICAgICAgIG5ld1N0cnVjdHVyZVtuXSA9IF9mdW5jdGlvblRvVXNlKF9vbGRTdHJ1Y3R1cmVbbl0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdTdHJ1Y3R1cmVbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKDxBbmltYXRpb25TdHJ1Y3R1cmU+X29sZFN0cnVjdHVyZVtuXSwgX2Z1bmN0aW9uVG9Vc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3U3RydWN0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHJldmVyc2VkIEFuaW1hdGlvbiBTZXF1ZW5jZSBvdXQgb2YgYSBnaXZlbiBTZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgVGhlIHJldmVyc2VkIFNlcXVlbmNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlKF9zZXF1ZW5jZTogQW5pbWF0aW9uU2VxdWVuY2UpOiBBbmltYXRpb25TZXF1ZW5jZSB7XHJcbiAgICAgIGxldCBzZXE6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb2xkS2V5OiBBbmltYXRpb25LZXkgPSBfc2VxdWVuY2UuZ2V0S2V5KGkpO1xyXG4gICAgICAgIGxldCBrZXk6IEFuaW1hdGlvbktleSA9IG5ldyBBbmltYXRpb25LZXkodGhpcy50b3RhbFRpbWUgLSBvbGRLZXkudGltZSwgb2xkS2V5LnZhbHVlLCBvbGRLZXkuaW50ZXJwb2xhdGlvbiwgb2xkS2V5LnNsb3BlT3V0LCBvbGRLZXkuc2xvcGVJbik7XHJcbiAgICAgICAgc2VxLmFkZEtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcmFzdGVyZWQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfSBvdXQgb2YgYSBnaXZlbiBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJhc3RlcmVkIHNlcXVlbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJhc3RlcmVkU2VxdWVuY2UoX3NlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZSk6IEFuaW1hdGlvblNlcXVlbmNlIHtcclxuICAgICAgbGV0IHNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IGZyYW1lVGltZTogbnVtYmVyID0gMTAwMCAvIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50b3RhbFRpbWU7IGkgKz0gZnJhbWVUaW1lKSB7XHJcbiAgICAgICAgbGV0IGtleTogQW5pbWF0aW9uS2V5ID0gbmV3IEFuaW1hdGlvbktleShpLCBfc2VxdWVuY2UuZXZhbHVhdGUoaSksIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNPTlNUQU5ULCAwLCAwKTtcclxuICAgICAgICBzZXEuYWRkS2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmV2ZXJzZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn0gb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBvbmUuICBcclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIHRoZSBldmVudCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBuZXcgb25lIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJldmVyc2VkIGV2ZW50IG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50cykge1xyXG4gICAgICAgIGFlW25hbWVdID0gdGhpcy50b3RhbFRpbWUgLSBfZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSByYXN0ZXJlZCB7QGxpbmsgQW5pbWF0aW9uRXZlbnRUcmlnZ2VyfSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIG9uZS4gIFxyXG4gICAgICogQHBhcmFtIF9ldmVudHMgdGhlIGV2ZW50IG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG5ldyBvbmUgb3V0IG9mXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmFzdGVyZWQgZXZlbnQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGxldCBmcmFtZVRpbWU6IG51bWJlciA9IDEwMDAgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfZXZlbnRzKSB7XHJcbiAgICAgICAgYWVbbmFtZV0gPSBfZXZlbnRzW25hbWVdIC0gKF9ldmVudHNbbmFtZV0gJSBmcmFtZVRpbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGljaCBldmVudHMgbGF5IGJldHdlZW4gdHdvIGdpdmVuIHRpbWVzIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb25lcyB0aGF0IGRvLlxyXG4gICAgICogQHBhcmFtIF9ldmVudFRyaWdnZXJzIFRoZSBldmVudCBvYmplY3QgdG8gY2hlY2sgdGhlIGV2ZW50cyBpbnNpZGUgb2ZcclxuICAgICAqIEBwYXJhbSBfbWluIHRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSB0byBjaGVjayBiZXR3ZWVuIChpbmNsdXNpdmUpXHJcbiAgICAgKiBAcGFyYW0gX21heCB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UgdG8gY2hlY2sgYmV0d2VlbiAoZXhjbHVzaXZlKVxyXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgaW4gdGhlIGdpdmVuIHJhbmdlLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0V2ZW50c0JldHdlZW4oX2V2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudHNUb1RyaWdnZXI6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50VHJpZ2dlcnMpIHtcclxuICAgICAgICBpZiAoX21pbiA8PSBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSAmJiBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSA8IF9tYXgpIHtcclxuICAgICAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXZlbnRzVG9UcmlnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyBiZXR3ZWVuIHtAbGluayBBbmltYXRpb25LZXl9cy5cclxuICAgKiBSZXByZXNlbnRlZCBpbnRlcm5hbGx5IGJ5IGEgY3ViaWMgZnVuY3Rpb24gKGBmKHgpID0gYXjCsyArIGJ4wrIgKyBjeCArIGRgKS4gXHJcbiAgICogT25seSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbiB0aGUga2V5cyBjaGFuZ2UsIHNvIGF0IHJ1bnRpbWUgaXQgc2hvdWxkIG9ubHkgYmUgY2FsY3VsYXRlZCBvbmNlLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uRnVuY3Rpb24ge1xyXG4gICAgcHJpdmF0ZSBhOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBiOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBrZXlJbjogQW5pbWF0aW9uS2V5O1xyXG4gICAgcHJpdmF0ZSBrZXlPdXQ6IEFuaW1hdGlvbktleTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2tleUluOiBBbmltYXRpb25LZXksIF9rZXlPdXQ6IEFuaW1hdGlvbktleSA9IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2V0S2V5SW4oX2tleUluOiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNldEtleU91dChfa2V5T3V0OiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBvZiB0aGlzIGN1YmljIGZ1bmN0aW9uLiBgZih4KSA9IGF4wrMgKyBieMKyICsgY3ggKyBkYFxyXG4gICAgICogVXNlZCBieSBlZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IHsgYTogbnVtYmVyOyBiOiBudW1iZXI7IGM6IG51bWJlcjsgZDogbnVtYmVyIH0ge1xyXG4gICAgICByZXR1cm4geyBhOiB0aGlzLmEsIGI6IHRoaXMuYiwgYzogdGhpcy5jLCBkOiB0aGlzLmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBhdCB0aGUgZ2l2ZW4gdGltZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gaW4gbWlsbGlzZWNvbmRzLiBXaWxsIGJlIGNvcnJlY3RlZCBmb3Igb2Zmc2V0IGludGVybmFsbHkuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV2YWx1YXRlKF90aW1lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfdGltZSAtPSB0aGlzLmtleUluLnRpbWU7XHJcbiAgICAgIGxldCB0aW1lMjogbnVtYmVyID0gX3RpbWUgKiBfdGltZTtcclxuICAgICAgbGV0IHRpbWUzOiBudW1iZXIgPSB0aW1lMiAqIF90aW1lO1xyXG4gICAgICByZXR1cm4gdGhpcy5hICogdGltZTMgKyB0aGlzLmIgKiB0aW1lMiArIHRoaXMuYyAqIF90aW1lICsgdGhpcy5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogKFJlLSlDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdWJpYyBmdW5jdGlvbi5cclxuICAgICAqIFNlZSBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMxNzM0NjkvY2FsY3VsYXRlLWN1YmljLWVxdWF0aW9uLWZyb20tdHdvLXBvaW50cy1hbmQtdHdvLXNsb3Blcy12YXJpYWJseVxyXG4gICAgICogYW5kIGh0dHBzOi8vamlya2FkZWxsb3JvLmdpdGh1Yi5pby9GVURHRS9Eb2N1bWVudGF0aW9uL0xvZ3MvMTkwNDEwX05vdGl6ZW5fTFNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLmtleUluKSB7XHJcbiAgICAgICAgdGhpcy5kID0gdGhpcy5jID0gdGhpcy5iID0gdGhpcy5hID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmtleU91dCB8fCB0aGlzLmtleUluLmludGVycG9sYXRpb24gPT0gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ09OU1RBTlQpIHtcclxuICAgICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuYyA9IHRoaXMuYiA9IHRoaXMuYSA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgeDE6IG51bWJlciA9IHRoaXMua2V5T3V0LnRpbWUgLSB0aGlzLmtleUluLnRpbWU7XHJcblxyXG4gICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5rZXlJbi5pbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUikge1xyXG4gICAgICAgIHRoaXMuYyA9ICh0aGlzLmtleU91dC52YWx1ZSAtIHRoaXMua2V5SW4udmFsdWUpIC8geDE7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmMgPSB0aGlzLmtleUluLnNsb3BlT3V0O1xyXG4gICAgICB0aGlzLmEgPSAoLXgxICogKHRoaXMua2V5SW4uc2xvcGVPdXQgKyB0aGlzLmtleU91dC5zbG9wZUluKSAtIDIgKiB0aGlzLmtleUluLnZhbHVlICsgMiAqIHRoaXMua2V5T3V0LnZhbHVlKSAvIC1NYXRoLnBvdyh4MSwgMyk7XHJcbiAgICAgIHRoaXMuYiA9ICh0aGlzLmtleU91dC5zbG9wZUluIC0gdGhpcy5rZXlJbi5zbG9wZU91dCAtIDMgKiB0aGlzLmEgKiBNYXRoLnBvdyh4MSwgMikpIC8gKDIgKiB4MSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQW4ge0BsaW5rIEFuaW1hdGlvbn0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBbmltYXRpb25HTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKEFuaW1hdGlvbikge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8QW5pbWF0aW9uR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgIC8vICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gICBzZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnBzOyAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3Q/P1xyXG4gICAgLy8gICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICBDT05TVEFOVCxcclxuICAgIExJTkVBUixcclxuICAgIENVQklDXHJcbiAgfVxyXG4gIC8vIHR5cGUgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiA9IFwiY29uc3RhbnRcIiB8IFwibGluZWFyXCIgfCBcImN1YmljXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGNvbnRpbm91cyBwb2ludHMgaW4gdGltZSB0aGVpciBhY2NvbXBhbnlpbmcgdmFsdWVzIGFzIHdlbGwgYXMgdGhlaXIgc2xvcGVzLiBcclxuICAgKiBBbHNvIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyB0aGF0IGNvbWUgaW4gYW5kIG91dCBvZiB0aGUgc2lkZXMuIFxyXG4gICAqIFRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyBhcmUgaGFuZGxlZCBieSB0aGUge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICogSWYgdGhlIHByb3BlcnR5IGNvbnN0YW50IGlzIHRydWUsIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgYW5kIHdpbCBub3QgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4gdGhpcyBhbmQgdGhlIG5leHQga2V5IGluIGEgc2VxdWVuY2VcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvbktleSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gVE9ETzogY2hlY2sgaWYgZnVuY3Rpb25JbiBjYW4gYmUgcmVtb3ZlZFxyXG4gICAgLyoqRG9uJ3QgbW9kaWZ5IHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiovXHJcbiAgICBwdWJsaWMgZnVuY3Rpb25JbjogQW5pbWF0aW9uRnVuY3Rpb247XHJcbiAgICAvKipEb24ndCBtb2RpZnkgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuKi9cclxuICAgIHB1YmxpYyBmdW5jdGlvbk91dDogQW5pbWF0aW9uRnVuY3Rpb247XHJcblxyXG4gICAgI3RpbWU6IG51bWJlcjtcclxuICAgICN2YWx1ZTogbnVtYmVyO1xyXG4gICAgI2ludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OO1xyXG5cclxuICAgICNzbG9wZUluOiBudW1iZXIgPSAwO1xyXG4gICAgI3Nsb3BlT3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogbnVtYmVyID0gMCwgX3ZhbHVlOiBudW1iZXIgPSAwLCBfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04gPSBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQywgX3Nsb3BlSW46IG51bWJlciA9IDAsIF9zbG9wZU91dDogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuI3ZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNpbnRlcnBvbGF0aW9uID0gX2ludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2xvcGVJbjtcclxuICAgICAgdGhpcy4jc2xvcGVPdXQgPSBfc2xvcGVPdXQ7XHJcblxyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0ID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIGNvbXBhcmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBpbiBhbiBhcnJheSBzb3J0IGZ1bmN0aW9uIHRvIHNvcnQgdGhlIGtleXMgYnkgdGhlaXIgdGltZS5cclxuICAgICAqIEBwYXJhbSBfYSB0aGUgYW5pbWF0aW9uIGtleSB0byBjaGVja1xyXG4gICAgICogQHBhcmFtIF9iIHRoZSBhbmltYXRpb24ga2V5IHRvIGNoZWNrIGFnYWluc3RcclxuICAgICAqIEByZXR1cm5zID4wIGlmIGE+YiwgMCBpZiBhPWIsIDwwIGlmIGE8YlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUoX2E6IEFuaW1hdGlvbktleSwgX2I6IEFuaW1hdGlvbktleSk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS50aW1lIC0gX2IudGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jdGltZSA9IF90aW1lO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB2YWx1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN2YWx1ZSA9IF92YWx1ZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbkluLmNhbGN1bGF0ZSgpO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0LmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaW50ZXJwb2xhdGlvbigpOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpbnRlcnBvbGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04pIHtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9pbnRlcnBvbGF0aW9uO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZUluKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzbG9wZUluO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2xvcGVJbihfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZUluID0gX3Nsb3BlO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZU91dCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2xvcGVPdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzbG9wZU91dChfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zbG9wZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbk91dC5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udGltZSA9IHRoaXMuI3RpbWU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udmFsdWUgPSB0aGlzLiN2YWx1ZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlcnBvbGF0aW9uID0gdGhpcy4jaW50ZXJwb2xhdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZUluID0gdGhpcy4jc2xvcGVJbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZU91dCA9IHRoaXMuI3Nsb3BlT3V0O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3NlcmlhbGl6YXRpb24udGltZTtcclxuICAgICAgdGhpcy4jdmFsdWUgPSBfc2VyaWFsaXphdGlvbi52YWx1ZTtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2VyaWFsaXphdGlvbi5zbG9wZUluO1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zZXJpYWxpemF0aW9uLnNsb3BlT3V0O1xyXG4gICAgICAvLyBpZiAoX3NlcmlhbGl6YXRpb24uaW50ZXJwb2xhdGlvbiA9PSB1bmRlZmluZWQpXHJcbiAgICAgIC8vICAgaWYgKF9zZXJpYWxpemF0aW9uLmNvbnN0YW50KSAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGNvbnN0YW50IGlzIHJlbW92ZWRcclxuICAgICAgLy8gICAgIHRoaXMuI2ludGVycG9sYXRpb24gPSBcImNvbnN0YW50XCI7XHJcbiAgICAgIC8vICAgZWxzZVxyXG4gICAgICAvLyAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IFwiY3ViaWNcIjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvL1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBzZXF1ZW5jZSBvZiB7QGxpbmsgQW5pbWF0aW9uS2V5fXMgdGhhdCBpcyBtYXBwZWQgdG8gYW4gYXR0cmlidXRlIG9mIGEge0BsaW5rIE5vZGV9IG9yIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgaW5zaWRlIHRoZSB7QGxpbmsgQW5pbWF0aW9ufS5cclxuICAgKiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gbW9kaWZ5IHNhaWQga2V5c1xyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcXVlbmNlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwcml2YXRlIGtleXM6IEFuaW1hdGlvbktleVtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfa2V5czogQW5pbWF0aW9uS2V5W10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmtleXMgPSBfa2V5cztcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiBwb2ludCBpbiB0aW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBzZXF1ZW5jZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiB0aW1lLiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZShfdGltZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMua2V5cy5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1RPRE86IHNob3VsZG4ndCByZXR1cm4gMCBidXQgc29tZXRoaW5nIGluZGljYXRpbmcgbm8gY2hhbmdlLCBsaWtlIG51bGwuIHByb2JhYmx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgaW4gTm9kZSBhcyB3ZWxsIHRvIGlnbm9yZSBub24tbnVtZXJpYyB2YWx1ZXMgaW4gdGhlIGFwcGx5QW5pbWF0aW9uIGZ1bmN0aW9uXHJcbiAgICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID09IDEgfHwgdGhpcy5rZXlzWzBdLnRpbWUgPj0gX3RpbWUpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5c1swXS52YWx1ZTtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXNbaV0udGltZSA8PSBfdGltZSAmJiBfdGltZSA8IHRoaXMua2V5c1tpICsgMV0udGltZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMua2V5c1tpXS5mdW5jdGlvbk91dC5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLmtleXNbaV0udGltZSA9PSBfdGltZSlcclxuICAgICAgICAvLyAgIHJldHVybiB0aGlzLmtleXNbaV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMua2V5c1t0aGlzLmtleXMubGVuZ3RoIC0gMV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGtleSB0byB0aGUgc2VxdWVuY2UuXHJcbiAgICAgKiBAcGFyYW0gX2tleSB0aGUga2V5IHRvIGFkZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkS2V5KF9rZXk6IEFuaW1hdGlvbktleSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmtleXMucHVzaChfa2V5KTtcclxuICAgICAgdGhpcy5rZXlzLnNvcnQoQW5pbWF0aW9uS2V5LmNvbXBhcmUpO1xyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmeXMgYSBnaXZlbiBrZXkgaW4gdGhlIHNlcXVlbmNlLlxyXG4gICAgICogQHBhcmFtIF9rZXkgdGhlIGtleSB0byBhZGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZGlmeUtleShfa2V5OiBBbmltYXRpb25LZXksIF90aW1lPzogbnVtYmVyLCBfdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKF90aW1lICE9IG51bGwpXHJcbiAgICAgICAgX2tleS50aW1lID0gX3RpbWU7XHJcbiAgICAgIGlmIChfdmFsdWUgIT0gbnVsbClcclxuICAgICAgICBfa2V5LnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLmtleXMuc29ydChBbmltYXRpb25LZXkuY29tcGFyZSk7XHJcbiAgICAgIHRoaXMucmVnZW5lcmF0ZUZ1bmN0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGtleSBmcm9tIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfa2V5IHRoZSBrZXkgdG8gcmVtb3ZlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVLZXkoX2tleTogQW5pbWF0aW9uS2V5KTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5rZXlzW2ldID09IF9rZXkpIHtcclxuICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBrZXkgaW4gdGhlIHNlcXVlbmNlIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kS2V5KF90aW1lOiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5rZXlzKVxyXG4gICAgICAgIGlmIChrZXkudGltZSA9PSBfdGltZSlcclxuICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgQW5pbWF0aW9uIEtleSBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUga2V5cy5cclxuICAgICAqIEBwYXJhbSBfaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlIHRoZSBrZXlcclxuICAgICAqIEByZXR1cm5zIHRoZSByZW1vdmVkIEFuaW1hdGlvbktleSBpZiBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUtleUF0SW5kZXgoX2luZGV4OiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBpZiAoX2luZGV4IDwgMCB8fCBfaW5kZXggPj0gdGhpcy5rZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhazogQW5pbWF0aW9uS2V5ID0gdGhpcy5rZXlzW19pbmRleF07XHJcbiAgICAgIHRoaXMua2V5cy5zcGxpY2UoX2luZGV4LCAxKTtcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICAgIHJldHVybiBhaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBrZXkgZnJvbSB0aGUgc2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgaW5kZXguXHJcbiAgICAgKiBAcGFyYW0gX2luZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IGF0IHdoaWNoIHRvIGdldCB0aGUga2V5XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgQW5pbWF0aW9uS2V5IGF0IHRoZSBpbmRleCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5KF9pbmRleDogbnVtYmVyKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgaWYgKF9pbmRleCA8IDAgfHwgX2luZGV4ID49IHRoaXMua2V5cy5sZW5ndGgpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzLmtleXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBzZXF1ZW5jZSdzIGtleXMuIFRoaXMgaXMgbm90IGEgY29weSwgYnV0IHRoZSBhY3R1YWwgYXJyYXkgdXNlZCBpbnRlcm5hbGx5LiBIYW5kbGUgd2l0aCBjYXJlIVxyXG4gICAgICogVXNlZCBieSBFZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IEFuaW1hdGlvbktleVtdIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGtleXM6IFtdLFxyXG4gICAgICAgIGFuaW1hdGlvblNlcXVlbmNlOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzLmtleXNbaV0gPSB0aGlzLmtleXNbaV0uc2VyaWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IF9zZXJpYWxpemF0aW9uLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyB0aGlzLmtleXMucHVzaCg8QW5pbWF0aW9uS2V5PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ua2V5c1tpXSkpO1xyXG4gICAgICAgIGxldCBrOiBBbmltYXRpb25LZXkgPSBuZXcgQW5pbWF0aW9uS2V5KCk7XHJcbiAgICAgICAgYXdhaXQgay5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5rZXlzW2ldKTtcclxuICAgICAgICB0aGlzLmtleXNbaV0gPSBrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgeyAvKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCAocmUtKWdlbmVyYXRlcyBhbGwgZnVuY3Rpb25zIGluIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWdlbmVyYXRlRnVuY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGY6IEFuaW1hdGlvbkZ1bmN0aW9uID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMua2V5c1tpXSk7XHJcbiAgICAgICAgdGhpcy5rZXlzW2ldLmZ1bmN0aW9uT3V0ID0gZjtcclxuICAgICAgICBpZiAoaSA9PSB0aGlzLmtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiB0aGlzIGlzIGV2ZW4gdXNlZnVsLiBNYXliZSB1cGRhdGUgdGhlIHJ1bmNvbmRpdGlvbiB0byBsZW5ndGggLSAxIGluc3RlYWQuIE1pZ2h0IGJlIHJlZHVuZGFudCBpZiBmdW5jdGlvbkluIGlzIHJlbW92ZWQsIHNlZSBUT0RPIGluIEFuaW1hdGlvbktleS5cclxuICAgICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzWzBdO1xyXG4gICAgICAgICAgdGhpcy5rZXlzWzBdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzW2kgKyAxXTtcclxuICAgICAgICB0aGlzLmtleXNbaSArIDFdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgQGVudW1lcmFibGVcclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uU3ByaXRlIGV4dGVuZHMgQW5pbWF0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBBbmltYXRpb24ucmVnaXN0ZXJTdWJjbGFzcyhBbmltYXRpb25TcHJpdGUpO1xyXG4gICAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlciA9IDI1O1xyXG4gICAgcHJpdmF0ZSB3cmFwQWZ0ZXI6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcbiAgICBwcml2YXRlIHNpemU6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMig4MCwgODApO1xyXG4gICAgcHJpdmF0ZSBuZXh0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoODAsIDApO1xyXG4gICAgcHJpdmF0ZSB3cmFwOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgODApO1xyXG5cclxuICAgICN0ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3I7XHJcblxyXG4gICAgLy8gVE9ETzogZnBzIHNob3VsZCBiZSBhIHBhcmFtZXRlciB0b29cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJBbmltYXRpb25TcHJpdGVcIikgeyAvL30sIF9mcHM6IG51bWJlciA9IDE1KSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCB7fSwgMSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gdGhpcy5mcmFtZXM7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgQGVudW1lcmFibGVcclxuICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICBwdWJsaWMgZ2V0IHRleHR1cmUoKTogVGV4dHVyZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0ZXh0dXJlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQgYXMgdGhlIHNwcml0ZXNoZWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdGV4dHVyZShfdGV4dHVyZTogVGV4dHVyZSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlID0gX3RleHR1cmU7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoaXMgYW5pbWF0aW9uIHNwcml0ZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfdGV4dHVyZTogVGV4dHVyZSwgX2ZyYW1lczogbnVtYmVyLCBfd3JhcEFmdGVyOiBudW1iZXIsIF9zdGFydDogVmVjdG9yMiwgX3NpemU6IFZlY3RvcjIsIF9uZXh0OiBWZWN0b3IyLCBfd3JhcDogVmVjdG9yMiwgX2ZyYW1lc1BlclNlY29uZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3RleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgICAgdGhpcy5mcmFtZXMgPSBfZnJhbWVzO1xyXG4gICAgICB0aGlzLndyYXBBZnRlciA9IF93cmFwQWZ0ZXI7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBfc3RhcnQ7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zaXplO1xyXG4gICAgICB0aGlzLm5leHQgPSBfbmV4dDtcclxuICAgICAgdGhpcy53cmFwID0gX3dyYXA7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZyYW1lc1BlclNlY29uZDtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogVmVjdG9yMiA9IHRoaXMuZ2V0U2NhbGUoKTtcclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yMltdID0gdGhpcy5nZXRQb3NpdGlvbnMoKTtcclxuXHJcbiAgICAgIGxldCB4VHJhbnNsYXRpb246IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB5VHJhbnNsYXRpb246IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB4U2NhbGU6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB5U2NhbGU6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIHhTY2FsZS5hZGRLZXkobmV3IEFuaW1hdGlvbktleSgwLCBzY2FsZS54KSk7XHJcbiAgICAgIHlTY2FsZS5hZGRLZXkobmV3IEFuaW1hdGlvbktleSgwLCBzY2FsZS55KSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBmcmFtZTogbnVtYmVyID0gMDsgZnJhbWUgPD0gdGhpcy5mcmFtZXM7IGZyYW1lKyspIHtcclxuICAgICAgICBsZXQgdGltZTogbnVtYmVyID0gMTAwMCAqIGZyYW1lIC8gdGhpcy5mcmFtZXNQZXJTZWNvbmQ7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IyID0gcG9zaXRpb25zW01hdGgubWluKGZyYW1lLCB0aGlzLmZyYW1lcyAtIDEpXTsgLy9yZXBlYXQgdGhlIGxhc3Qga2V5IHRvIGdpdmUgdGhlIGxhc3QgZnJhbWUgc29tZSB0aW1lXHJcbiAgICAgICAgeFRyYW5zbGF0aW9uLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIHBvc2l0aW9uLnggLyB0aGlzLiN0ZXh0dXJlLnRleEltYWdlU291cmNlLndpZHRoKSk7Ly8sIDAsIDAsIHRydWUpKVxyXG4gICAgICAgIHlUcmFuc2xhdGlvbi5hZGRLZXkobmV3IEFuaW1hdGlvbktleSh0aW1lLCBwb3NpdGlvbi55IC8gdGhpcy4jdGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHQpKTsvLywgMCwgMCwgdHJ1ZSkpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0ge1xyXG4gICAgICAgIFwiY29tcG9uZW50c1wiOiB7XHJcbiAgICAgICAgICBcIkNvbXBvbmVudE1hdGVyaWFsXCI6IFt7XHJcbiAgICAgICAgICAgIFwibXR4UGl2b3RcIjoge1xyXG4gICAgICAgICAgICAgIFwidHJhbnNsYXRpb25cIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFRyYW5zbGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgeTogeVRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBcInNjYWxpbmdcIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFNjYWxlLFxyXG4gICAgICAgICAgICAgICAgeTogeVNjYWxlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY2FsZSBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgdGhpcy5zaXplLnggLyB0aGlzLiN0ZXh0dXJlLnRleEltYWdlU291cmNlLndpZHRoLFxyXG4gICAgICAgIHRoaXMuc2l6ZS55IC8gdGhpcy4jdGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHRcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBvc2l0aW9ucygpOiBWZWN0b3IyW10ge1xyXG4gICAgICBsZXQgaU5leHQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBpV3JhcDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGZvciAobGV0IGZyYW1lOiBudW1iZXIgPSAwOyBmcmFtZSA8IHRoaXMuZnJhbWVzOyBmcmFtZSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICB0aGlzLnN0YXJ0LnggKyBpTmV4dCAqIHRoaXMubmV4dC54ICsgaVdyYXAgKiB0aGlzLndyYXAueCxcclxuICAgICAgICAgIHRoaXMuc3RhcnQueSArIGlOZXh0ICogdGhpcy5uZXh0LnkgKyBpV3JhcCAqIHRoaXMud3JhcC55XHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgICAgIGlOZXh0Kys7XHJcbiAgICAgICAgaWYgKGlOZXh0ID49IHRoaXMud3JhcEFmdGVyKSB7XHJcbiAgICAgICAgICBpTmV4dCA9IDA7XHJcbiAgICAgICAgICBpV3JhcCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiB0cmFuc2ZlclxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbj86IHN0cmluZ1tdLCBfZGlzcGF0Y2hNdXRhdGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy50ZXh0dXJlLCB0aGlzLmZyYW1lcywgdGhpcy53cmFwQWZ0ZXIsIHRoaXMuc3RhcnQsIHRoaXMuc2l6ZSwgdGhpcy5uZXh0LCB0aGlzLndyYXAsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UgPSB0aGlzLmlkUmVzb3VyY2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXh0dXJlID0gdGhpcy4jdGV4dHVyZS5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lcyA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLndyYXBBZnRlciA9IHRoaXMud3JhcEFmdGVyO1xyXG4gICAgICBmb3IgKGxldCBuYW1lIG9mIFtcInN0YXJ0XCIsIFwic2l6ZVwiLCBcIm5leHRcIiwgXCJ3cmFwXCJdKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25bbmFtZV0gPSAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLnNlcmlhbGl6ZSgpO1xyXG5cclxuICAgICAgbGV0IGFuaW1hdGlvbnNTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IHt9OyAvLyBubyBuZWVkIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmVcclxuICAgICAgLy8gbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvbnNTdHJ1Y3R1cmU7IC8vIHJlc3RvcmUgZXhpc3RlbnQgc3RydWN0dXJlXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkVGV4dHVyZSlcclxuICAgICAgICB0aGlzLiN0ZXh0dXJlID0gPFRleHR1cmU+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgbmFtZSBvZiBbXCJzdGFydFwiLCBcInNpemVcIiwgXCJuZXh0XCIsIFwid3JhcFwiXSlcclxuICAgICAgICAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW25hbWVdKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy50ZXh0dXJlLCBfc2VyaWFsaXphdGlvbi5mcmFtZXMsIF9zZXJpYWxpemF0aW9uLndyYXBBZnRlciwgdGhpcy5zdGFydCwgdGhpcy5zaXplLCB0aGlzLm5leHQsIHRoaXMud3JhcCwgdGhpcy5mcmFtZXNQZXJTZWNvbmQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIHtAbGluayBBbmltYXRpb25TcHJpdGV9IGludG8gYW4ge0BsaW5rIEFuaW1hdGlvbn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnZlcnRUb0FuaW1hdGlvbigpOiBBbmltYXRpb24ge1xyXG4gICAgICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKHRoaXMubmFtZSwgdGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgICAgcmV0dXJuIGFuaW1hdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFeHRlbnNpb24gb2YgQXVkaW9CdWZmZXIgd2l0aCBhIGxvYWQgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGJ1ZmZlciBpbiB0aGUge0BsaW5rIEF1ZGlvTWFuYWdlcn0uZGVmYXVsdCB0byBiZSB1c2VkIHdpdGgge0BsaW5rIENvbXBvbmVudEF1ZGlvfVxyXG4gICAqIEBhdXRob3JzIFRob21hcyBEb3JuZXIsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEF1ZGlvIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkF1ZGlvXCI7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIGJ1ZmZlcjogQXVkaW9CdWZmZXIgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgcGF0aDogVVJMID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSB1cmw6IFJlcXVlc3RJbmZvID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSByZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdXJsPzogUmVxdWVzdEluZm8pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgaWYgKF91cmwpIHtcclxuICAgICAgICB0aGlzLmxvYWQoX3VybCk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gX3VybC50b1N0cmluZygpLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVhZHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyB0aGUgYXVkaW8gKG1wMykgZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiQXVkaW9Mb2FkXCIsIF91cmwpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5wYXRoID0gbmV3IFVSTCh0aGlzLnVybC50b1N0cmluZygpLCBQcm9qZWN0LmJhc2VVUkwpO1xyXG4gICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cuZmV0Y2godGhpcy5wYXRoLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgICBsZXQgYnVmZmVyOiBBdWRpb0J1ZmZlciA9IGF3YWl0IEF1ZGlvTWFuYWdlci5kZWZhdWx0LmRlY29kZUF1ZGlvRGF0YShhcnJheUJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5SRUFEWSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgdHlwZTogdGhpcy50eXBlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWQoX3NlcmlhbGl6YXRpb24udXJsKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbj86IHN0cmluZ1tdLCBfZGlzcGF0Y2hNdXRhdGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IF9tdXRhdG9yLnVybDsgLy8gc2F2ZSB1cmwgZm9yIHJlY29uc3RydWN0aW9uIGFmdGVyIGV4Y2x1c2lvblxyXG4gICAgICBpZiAoX211dGF0b3IudXJsICE9IHRoaXMudXJsLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgdGhpcy5sb2FkKF9tdXRhdG9yLnVybCk7XHJcbiAgICAgIC8vIGV4Y2VwdCB1cmwgZnJvbSBtdXRhdG9yIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgICAgZGVsZXRlIChfbXV0YXRvci51cmwpO1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIC8vIHJlY29uc3RydWN0LCBmb3IgbXV0YXRvciBtYXkgYmUga2VwdCBieSBjYWxsZXJcclxuICAgICAgUmVmbGVjdC5zZXQoX211dGF0b3IsIFwidXJsXCIsIHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgLy8gZGVsZXRlIF9tdXRhdG9yLmlkUmVzb3VyY2U7IFxyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVhZHk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVF9BVURJTyB7XHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCBhZnRlciBpdCB3YXMgYXBwZW5kZWQgdG8gYSBwYXJlbnQgKi9cclxuICAgIENISUxEX0FQUEVORCA9IFwiY2hpbGRBcHBlbmRUb0F1ZGlvR3JhcGhcIixcclxuICAgIC8qKiBicm9hZGNhc3QgdG8gYSB7QGxpbmsgTm9kZX0gYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGp1c3QgYmVmb3JlIGl0cyBiZWluZyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCAqL1xyXG4gICAgQ0hJTERfUkVNT1ZFID0gXCJjaGlsZFJlbW92ZUZyb21BdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCB0byB1cGRhdGUgdGhlIHBhbm5lcnMgaW4gQXVkaW9Db21wb25lbnRzICovXHJcbiAgICBVUERBVEUgPSBcInVwZGF0ZUF1ZGlvR3JhcGhcIixcclxuICAgIC8qKiBmaXJlZCB3aGVuIHRoZSBhdWRpbyBmaWxlIHdhcyBsb2FkZWQgYW5kIGlzIHJlYWR5IGZvciBwbGF5aW5nICovXHJcbiAgICBSRUFEWSA9IFwicmVhZHlcIixcclxuICAgIC8qKiBmaXJlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGF1ZGlvIGlzIHJlYWNoZWQgd2hpbGUgcGxheWluZyAqL1xyXG4gICAgRU5ERUQgPSBcImVuZGVkXCJcclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi9FdmVudC9FdmVudEF1ZGlvLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFeHRlbmRzIHRoZSBzdGFuZGFyZCBBdWRpb0NvbnRleHQgZm9yIGludGVncmF0aW9uIHdpdGggRlVER0UtZ3JhcGhzLlxyXG4gICAqIENyZWF0ZXMgYSBkZWZhdWx0IG9iamVjdCBhdCBzdGFydHVwIHRvIGJlIGFkZHJlc3NlZCBhcyBBdWRpb01hbmFnZXIgZGVmYXVsdC5cclxuICAgKiBPdGhlciBvYmplY3RzIG9mIHRoaXMgY2xhc3MgbWF5IGJlIGNyZWF0ZSBmb3Igc3BlY2lhbCBwdXJwb3Nlcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQXVkaW9NYW5hZ2VyIGV4dGVuZHMgQXVkaW9Db250ZXh0IHtcclxuICAgIC8qKiBUaGUgZGVmYXVsdCBjb250ZXh0IHRoYXQgbWF5IGJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdCB3aXRob3V0IHRoZSBuZWVkIHRvIGNyZWF0ZSBvdGhlcnMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdDogQXVkaW9NYW5hZ2VyID0gbmV3IEF1ZGlvTWFuYWdlcih7IGxhdGVuY3lIaW50OiBcImludGVyYWN0aXZlXCIsIHNhbXBsZVJhdGU6IDQ0MTAwIH0pO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXZlbnRVcGRhdGU6IEV2ZW50ID0gbmV3IEV2ZW50KEVWRU5UX0FVRElPLlVQREFURSk7XHJcbiAgICAvKiogVGhlIG1hc3RlciB2b2x1bWUgYWxsIEF1ZGlvTm9kZXMgaW4gdGhlIGNvbnRleHQgc2hvdWxkIGF0dGFjaCB0byAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGdhaW46IEdhaW5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBncmFwaDogTm9kZSA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNtcExpc3RlbmVyOiBDb21wb25lbnRBdWRpb0xpc3RlbmVyID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbnRleHRPcHRpb25zPzogQXVkaW9Db250ZXh0T3B0aW9ucykge1xyXG4gICAgICBzdXBlcihfY29udGV4dE9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmdhaW4gPSB0aGlzLmNyZWF0ZUdhaW4oKTtcclxuICAgICAgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG1hc3RlciB2b2x1bWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB2b2x1bWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5nYWluLmdhaW4udmFsdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1hc3RlciB2b2x1bWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB2b2x1bWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBGVURHRS1ncmFwaCB0byBsaXN0ZW4gdG8uIEVhY2gge0BsaW5rIENvbXBvbmVudEF1ZGlvfSBpbiB0aGUgZ3JhcGggd2lsbCBjb25uZWN0IHRvIHRoaXMgY29udGV4dHMgbWFzdGVyIGdhaW4sIGFsbCBvdGhlcnMgZGlzY29ubmVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlblRvID0gKF9ncmFwaDogTm9kZSB8IG51bGwpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKHRoaXMuZ3JhcGgpXHJcbiAgICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfUkVNT1ZFKSk7XHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgdGhpcy5ncmFwaCA9IF9ncmFwaDtcclxuICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIEZVREdFLWdyYXBoIGN1cnJlbnRseSBsaXN0ZW5pbmcgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdyYXBoTGlzdGVuaW5nVG8gPSAoKTogTm9kZSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyYXBoO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUge0BsaW5rIENvbXBvbmVudEF1ZGlvTGlzdGVuZXJ9IHRoYXQgc2VydmVzIHRoZSBzcGF0aWFsIGxvY2F0aW9uIGFuZCBvcmllbnRhdGlvbiBmb3IgdGhpcyBjb250ZXh0cyBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGlzdGVuV2l0aCA9IChfY21wTGlzdGVuZXI6IENvbXBvbmVudEF1ZGlvTGlzdGVuZXIgfCBudWxsKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMuY21wTGlzdGVuZXIgPSBfY21wTGlzdGVuZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc3BhdGlhbCBzZXR0aW5ncyBvZiB0aGUgQXVkaW9Ob2RlcyBlZmZlY3RlZCBpbiB0aGUgY3VycmVudCBGVURHRS1ncmFwaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZSAhPSBcInJ1bm5pbmdcIilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIC8vIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLlVQREFURSkpO1xyXG4gICAgICB0aGlzLmdyYXBoLmJyb2FkY2FzdEV2ZW50KEF1ZGlvTWFuYWdlci5ldmVudFVwZGF0ZSk7XHJcbiAgICAgIGlmICh0aGlzLmNtcExpc3RlbmVyKVxyXG4gICAgICAgIHRoaXMuY21wTGlzdGVuZXIudXBkYXRlKHRoaXMubGlzdGVuZXIpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCIvLyBuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAgIFxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBFbnVtZXJhdG9yIGZvciBhbGwgcG9zc2libGUgT3NjaWxsYXRvciBUeXBlc1xyXG4vLyAgICAgICovXHJcbi8vICAgICB0eXBlIE9TQ0lMTEFUT1JfVFlQRSA9IFwic2luZVwiIHwgXCJzcXVhcmVcIiB8IFwic2F3dG9vdGhcIiB8IFwidHJpYW5nbGVcIiB8IFwiY3VzdG9tXCI7XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBJbnRlcmZhY2UgdG8gY3JlYXRlIEN1c3RvbSBPc2NpbGxhdG9yIFR5cGVzLlxyXG4vLyAgICAgICogU3RhcnQtL0VuZHBvaW50IG9mIGEgY3VzdHVtIGN1cnZlIGUuZy4gc2luZSBjdXJ2ZS5cclxuLy8gICAgICAqIEJvdGggcGFyYW1ldGVycyBuZWVkIHRvIGJlIGluYmV0d2VlbiAtMSBhbmQgMS5cclxuLy8gICAgICAqIEBwYXJhbSBzdGFydHBvaW50IHN0YXJ0cG9pbnQgb2YgYSBjdXJ2ZSBcclxuLy8gICAgICAqIEBwYXJhbSBlbmRwb2ludCBFbmRwb2ludCBvZiBhIGN1cnZlIFxyXG4vLyAgICAgICovXHJcbi8vICAgICBpbnRlcmZhY2UgT3NjaWxsYXRvcldhdmUge1xyXG4vLyAgICAgICAgIHN0YXJ0cG9pbnQ6IG51bWJlcjtcclxuLy8gICAgICAgICBlbmRwb2ludDogbnVtYmVyO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBBZGQgYW4ge0BsaW5rIEF1ZGlvRmlsdGVyfSB0byBhbiB7QGxpbmsgQXVkaW9dXVxyXG4vLyAgICAgICogQGF1dGhvcnMgVGhvbWFzIERvcm5lciwgSEZVLCAyMDE5XHJcbi8vICAgICAgKi9cclxuLy8gICAgIGV4cG9ydCBjbGFzcyBBdWRpb09zY2lsbGF0b3Ige1xyXG5cclxuLy8gICAgICAgICBwdWJsaWMgYXVkaW9Pc2NpbGxhdG9yOiBPc2NpbGxhdG9yTm9kZTsgXHJcblxyXG4vLyAgICAgICAgIHByaXZhdGUgZnJlcXVlbmN5OiBudW1iZXI7XHJcbi8vICAgICAgICAgcHJpdmF0ZSBvc2NpbGxhdG9yVHlwZTogT1NDSUxMQVRPUl9UWVBFO1xyXG4vLyAgICAgICAgIHByaXZhdGUgb3NjaWxsYXRvcldhdmU6IFBlcmlvZGljV2F2ZTtcclxuXHJcbi8vICAgICAgICAgcHJpdmF0ZSBsb2NhbEdhaW46IEdhaW5Ob2RlO1xyXG4vLyAgICAgICAgIHByaXZhdGUgbG9jYWxHYWluVmFsdWU6IG51bWJlcjtcclxuXHJcbi8vICAgICAgICAgY29uc3RydWN0b3IoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9vc2NpbGxhdG9yVHlwZT86IE9TQ0lMTEFUT1JfVFlQRSkge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvciA9IF9hdWRpb1NldHRpbmdzLmdldEF1ZGlvQ29udGV4dCgpLmNyZWF0ZU9zY2lsbGF0b3IoKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4gPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVHYWluKCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvclR5cGUgPSBfb3NjaWxsYXRvclR5cGU7XHJcbi8vICAgICAgICAgICAgIGlmICh0aGlzLm9zY2lsbGF0b3JUeXBlICE9IFwiY3VzdG9tXCIpIHtcclxuLy8gICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnR5cGUgPSB0aGlzLm9zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zY2lsbGF0b3JXYXZlKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3Iuc2V0UGVyaW9kaWNXYXZlKHRoaXMub3NjaWxsYXRvcldhdmUpO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGUgYSBDdXN0b20gUGVyaW9kaWMgV2F2ZSBmaXJzdCB0byB1c2UgQ3VzdG9tIFR5cGVcIik7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRPc2NpbGxhdG9yVHlwZShfb3NjaWxsYXRvclR5cGU6IE9TQ0lMTEFUT1JfVFlQRSk6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vc2NpbGxhdG9yVHlwZSAhPSBcImN1c3RvbVwiKSB7XHJcbi8vICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci50eXBlID0gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghdGhpcy5vc2NpbGxhdG9yV2F2ZSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0aGlzLm9zY2lsbGF0b3JXYXZlKTtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldE9zY2lsbGF0b3JUeXBlKCk6IE9TQ0lMTEFUT1JfVFlQRSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiB0aGlzLm9zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGNyZWF0ZVBlcmlvZGljV2F2ZShfYXVkaW9TZXR0aW5nczogQXVkaW9TZXR0aW5ncywgX3JlYWw6IE9zY2lsbGF0b3JXYXZlLCBfaW1hZzogT3NjaWxsYXRvcldhdmUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgbGV0IHdhdmVSZWFsOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xyXG4vLyAgICAgICAgICAgICB3YXZlUmVhbFswXSA9IF9yZWFsLnN0YXJ0cG9pbnQ7XHJcbi8vICAgICAgICAgICAgIHdhdmVSZWFsWzFdID0gX3JlYWwuZW5kcG9pbnQ7XHJcblxyXG4vLyAgICAgICAgICAgICBsZXQgd2F2ZUltYWc6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMik7XHJcbi8vICAgICAgICAgICAgIHdhdmVJbWFnWzBdID0gX2ltYWcuc3RhcnRwb2ludDtcclxuLy8gICAgICAgICAgICAgd2F2ZUltYWdbMV0gPSBfaW1hZy5lbmRwb2ludDtcclxuXHJcbi8vICAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvcldhdmUgPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVQZXJpb2RpY1dhdmUod2F2ZVJlYWwsIHdhdmVJbWFnKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRMb2NhbEdhaW4oX2xvY2FsR2FpbjogR2Fpbk5vZGUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4gPSBfbG9jYWxHYWluO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldExvY2FsR2FpbigpOiBHYWluTm9kZSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsR2FpbjtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRMb2NhbEdhaW5WYWx1ZShfbG9jYWxHYWluVmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2FpblZhbHVlID0gX2xvY2FsR2FpblZhbHVlO1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2Fpbi5nYWluLnZhbHVlID0gdGhpcy5sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRMb2NhbEdhaW5WYWx1ZSgpOiBudW1iZXIge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRGcmVxdWVuY3koX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9mcmVxdWVuY3k6IG51bWJlcik6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IF9mcmVxdWVuY3k7XHJcbi8vICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSh0aGlzLmZyZXF1ZW5jeSwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldEZyZXF1ZW5jeSgpOiBudW1iZXIge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5mcmVxdWVuY3k7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgY3JlYXRlU25hcmUoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRPc2NpbGxhdG9yVHlwZShcInRyaWFuZ2xlXCIpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLnNldEZyZXF1ZW5jeShfYXVkaW9TZXR0aW5ncywgMTAwKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRMb2NhbEdhaW5WYWx1ZSgwKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLCBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAxLCBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSArIC4xKTtcclxuXHJcbi8vICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5sb2NhbEdhaW4pO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gfSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYW4gYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LlxyXG4gICAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbiBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbik7XHJcblxyXG4gICAgcHVibGljIHNhbXBsZVJhZGl1czogbnVtYmVyO1xyXG4gICAgcHVibGljIGJpYXM6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdHRlbnVhdGlvbkNvbnN0YW50OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25MaW5lYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdHRlbnVhdGlvblF1YWRyYXRpYzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2FtcGxlUmFkaXVzOiBudW1iZXIgPSAxNiwgX2JpYXM6IG51bWJlciA9IDAuMDcsIF9hdHRlbnVhdGlvbkNvbnN0YW50OiBudW1iZXIgPSAyLjUsIF9hdHRlbnVhdGlvbkxpbmVhcjogbnVtYmVyID0gMSwgX2F0dGVudWF0aW9uUXVhZHJhdGljOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2FtcGxlUmFkaXVzID0gX3NhbXBsZVJhZGl1cztcclxuICAgICAgdGhpcy5iaWFzID0gX2JpYXM7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCA9IF9hdHRlbnVhdGlvbkNvbnN0YW50O1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uTGluZWFyID0gX2F0dGVudWF0aW9uTGluZWFyO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uUXVhZHJhdGljID0gX2F0dGVudWF0aW9uUXVhZHJhdGljO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc2FtcGxlUmFkaXVzOiB0aGlzLnNhbXBsZVJhZGl1cyxcclxuICAgICAgICBiaWFzOiB0aGlzLmJpYXMsXHJcbiAgICAgICAgYXR0ZW51YXRpb25Db25zdGFudDogdGhpcy5hdHRlbnVhdGlvbkNvbnN0YW50LFxyXG4gICAgICAgIGF0dGVudWF0aW9uTGluZWFyOiB0aGlzLmF0dGVudWF0aW9uTGluZWFyLFxyXG4gICAgICAgIGF0dGVudWF0aW9uUXVhZHJhdGljOiB0aGlzLmF0dGVudWF0aW9uUXVhZHJhdGljXHJcbiAgICAgIH07XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5zYW1wbGVSYWRpdXMgPSBfc2VyaWFsaXphdGlvbi5zYW1wbGVSYWRpdXM7XHJcbiAgICAgIHRoaXMuYmlhcyA9IF9zZXJpYWxpemF0aW9uLmJpYXM7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCA9IF9zZXJpYWxpemF0aW9uLmF0dGVudWF0aW9uQ29uc3RhbnQ7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25MaW5lYXIgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvbkxpbmVhcjtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpYyA9IF9zZXJpYWxpemF0aW9uLmF0dGVudWF0aW9uUXVhZHJhdGljO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGltZS9Mb29wLnRzXCIvPlxyXG4vLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FuaW1hdGlvbi9BbmltYXRpb24udHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9sZHMgYSByZWZlcmVuY2UgdG8gYW4ge0BsaW5rIEFuaW1hdGlvbn0gYW5kIGNvbnRyb2xzIGl0LiBDb250cm9scyBxdWFudGl6YXRpb24gYW5kIHBsYXltb2RlIGFzIHdlbGwgYXMgc3BlZWQuXHJcbiAgICogQGF1dGhvcnMgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRBbmltYXRvciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QW5pbWF0b3IpO1xyXG4gICAgLy9UT0RPOiBhZGQgZnVuY3Rpb25hbGl0eSB0byBibGVuZCBmcm9tIG9uZSBhbmltYXRpb24gdG8gYW5vdGhlci5cclxuICAgIEB0eXBlKEFuaW1hdGlvbilcclxuICAgIHB1YmxpYyBhbmltYXRpb246IEFuaW1hdGlvbjtcclxuICAgIHB1YmxpYyBwbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFO1xyXG4gICAgcHVibGljIHF1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTjtcclxuICAgIHB1YmxpYyBzY2FsZVdpdGhHYW1lVGltZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgYW5pbWF0ZUluRWRpdG9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgI3NjYWxlOiBudW1iZXIgPSAxO1xyXG4gICAgI3RpbWVMb2NhbDogVGltZTtcclxuICAgICNwcmV2aW91czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2FuaW1hdGlvbj86IEFuaW1hdGlvbiwgX3BsYXltb2RlOiBBTklNQVRJT05fUExBWU1PREUgPSBBTklNQVRJT05fUExBWU1PREUuTE9PUCwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTiA9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uQ09OVElOT1VTKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMucGxheW1vZGUgPSBfcGxheW1vZGU7XHJcbiAgICAgIHRoaXMucXVhbnRpemF0aW9uID0gX3F1YW50aXphdGlvbjtcclxuICAgICAgdGhpcy5hbmltYXRpb24gPSBfYW5pbWF0aW9uO1xyXG5cclxuICAgICAgdGhpcy4jdGltZUxvY2FsID0gbmV3IFRpbWUoKTtcclxuXHJcbiAgICAgIC8vVE9ETzogdXBkYXRlIGFuaW1hdGlvbiB0b3RhbCB0aW1lIHdoZW4gbG9hZGluZyBhIGRpZmZlcmVudCBhbmltYXRpb24/XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uPy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCAoKSA9PiB0aGlzLmFjdGl2YXRlKGZhbHNlKSk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ0hJTERfUkVNT1ZFLCAoKSA9PiB0aGlzLmFjdGl2YXRlKGZhbHNlKSk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzY2FsZShfc2NhbGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzY2FsZSA9IF9zY2FsZTtcclxuICAgICAgdGhpcy51cGRhdGVTY2FsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gdGhlIGN1cnJlbnQgc2FtcGxlIHRpbWUgb2YgdGhlIGFuaW1hdGlvbiAgXHJcbiAgICAgKiAtIHNldDoganVtcCB0byBhIGNlcnRhaW4gc2FtcGxlIHRpbWUgaW4gdGhlIGFuaW1hdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWVMb2NhbC5nZXQoKSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUoX3RpbWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmp1bXBUbyhfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBzdXBlci5hY3RpdmF0ZShfb24pO1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlTGlzdGVuZXJzKF9vbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKdW1wcyB0byBhIGNlcnRhaW4gdGltZSBpbiB0aGUgYW5pbWF0aW9uIHRvIHBsYXkgZnJvbSB0aGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGp1bXBUbyhfdGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3RpbWVMb2NhbC5zZXQoX3RpbWUpO1xyXG4gICAgICB0aGlzLiNwcmV2aW91cyA9IF90aW1lO1xyXG4gICAgICBfdGltZSA9IF90aW1lICUgdGhpcy5hbmltYXRpb24udG90YWxUaW1lO1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHRoaXMuYW5pbWF0aW9uLmdldFN0YXRlKF90aW1lLCB0aGlzLmFuaW1hdGlvbi5jYWxjdWxhdGVEaXJlY3Rpb24oX3RpbWUsIHRoaXMucGxheW1vZGUpLCB0aGlzLnF1YW50aXphdGlvbik7XHJcbiAgICAgIHRoaXMubm9kZS5hcHBseUFuaW1hdGlvbihtdXRhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEp1bXBzIHRvIGEgY2VydGFpbiBsYWJlbCBpbiB0aGUgYW5pbWF0aW9uIGlmIGRlZmluZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGp1bXBUb0xhYmVsKF9sYWJlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGxldCB0aW1lOiBudW1iZXIgPSB0aGlzLmFuaW1hdGlvbi5sYWJlbHNbX2xhYmVsXTtcclxuICAgICAgaWYgKHRpbWUpXHJcbiAgICAgICAgdGhpcy5qdW1wVG8odGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZXMgYW4gdXBkYXRlIG9mIHRoZSBhbmltYXRpb24gZnJvbSBvdXRzaWRlLiBVc2VkIGluIHRoZSBWaWV3QW5pbWF0aW9uLiBTaG91bGRuJ3QgYmUgdXNlZCBkdXJpbmcgdGhlIGdhbWUuXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgdGhlICh1bnNjYWxlZCkgdGltZSB0byB1cGRhdGUgdGhlIGFuaW1hdGlvbiB3aXRoLlxyXG4gICAgICogQHJldHVybnMgdGhlIE11dGF0b3IgZm9yIEFuaW1hdGlvbi4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVBbmltYXRpb24oX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICB0aGlzLiNwcmV2aW91cyA9IHVuZGVmaW5lZDtcclxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcChudWxsLCBfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRBbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbi5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnBsYXltb2RlID0gdGhpcy5wbGF5bW9kZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5xdWFudGl6YXRpb24gPSB0aGlzLnF1YW50aXphdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zY2FsZSA9IHRoaXMuc2NhbGU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGVXaXRoR2FtZVRpbWUgPSB0aGlzLnNjYWxlV2l0aEdhbWVUaW1lO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmFuaW1hdGVJbkVkaXRvciA9IHRoaXMuYW5pbWF0ZUluRWRpdG9yO1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbiA9IDxBbmltYXRpb24+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZEFuaW1hdGlvbik7XHJcbiAgICAgIHRoaXMucGxheW1vZGUgPSBfc2VyaWFsaXphdGlvbi5wbGF5bW9kZTtcclxuICAgICAgdGhpcy5xdWFudGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbi5xdWFudGl6YXRpb247XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2VyaWFsaXphdGlvbi5zY2FsZTtcclxuICAgICAgdGhpcy5zY2FsZVdpdGhHYW1lVGltZSA9IF9zZXJpYWxpemF0aW9uLnNjYWxlV2l0aEdhbWVUaW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGVJbkVkaXRvciA9IF9zZXJpYWxpemF0aW9uLmFuaW1hdGVJbkVkaXRvcjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmFuaW1hdGVJbkVkaXRvcikgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFuaW1hdGlvbigwKTtcclxuICAgICAgICB0aGlzLmFjdGl2YXRlTGlzdGVuZXJzKHRoaXMuYWN0aXZlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5wbGF5bW9kZSlcclxuICAgICAgICB0eXBlcy5wbGF5bW9kZSA9IEFOSU1BVElPTl9QTEFZTU9ERTtcclxuICAgICAgaWYgKHR5cGVzLnF1YW50aXphdGlvbilcclxuICAgICAgICB0eXBlcy5xdWFudGl6YXRpb24gPSBBTklNQVRJT05fUVVBTlRJWkFUSU9OO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlTGlzdGVuZXJzKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX29uICYmIChQcm9qZWN0Lm1vZGUgIT0gTU9ERS5FRElUT1IgfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SICYmIHRoaXMuYW5pbWF0ZUluRWRpdG9yKSkge1xyXG4gICAgICAgIFRpbWUuZ2FtZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVNjYWxlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGVBbmltYXRpb25Mb29wKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBUaW1lLmdhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5USU1FX1NDQUxFRCwgdGhpcy51cGRhdGVTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVOREVSX1BSRVBBUkUsIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdXBkYXRlQW5pbWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIEFuaW1hdGlvbi5cclxuICAgICAqIFVzZXMgdGhlIGJ1aWx0LWluIHRpbWUgdW5sZXNzIGEgZGlmZmVyZW50IHRpbWUgaXMgc3BlY2lmaWVkLlxyXG4gICAgICogTWF5IGFsc28gYmUgY2FsbGVkIGZyb20gdXBkYXRlQW5pbWF0aW9uKCkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQW5pbWF0aW9uTG9vcCA9IChfZTogRXZlbnQsIF90aW1lPzogbnVtYmVyKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWUgPT0gMCkgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgdGltZTogbnVtYmVyID0gX3RpbWUgfHwgX3RpbWUgPT09IDAgPyBfdGltZSA6IHRoaXMuI3RpbWVMb2NhbC5nZXQoKTtcclxuICAgICAgaWYgKHRoaXMucXVhbnRpemF0aW9uID09IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgdGltZSA9IHRoaXMuI3ByZXZpb3VzICsgKDEwMDAgLyB0aGlzLmFuaW1hdGlvbi5mcHMpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBkaXJlY3Rpb246IG51bWJlciA9IHRoaXMuYW5pbWF0aW9uLmNhbGN1bGF0ZURpcmVjdGlvbih0aW1lLCB0aGlzLnBsYXltb2RlKTtcclxuICAgICAgdGltZSA9IHRoaXMuYW5pbWF0aW9uLmdldE1vZGFsVGltZSh0aW1lLCB0aGlzLnBsYXltb2RlLCB0aGlzLiN0aW1lTG9jYWwuZ2V0T2Zmc2V0KCkpO1xyXG4gICAgICB0aGlzLmV4ZWN1dGVFdmVudHModGhpcy5hbmltYXRpb24uZ2V0RXZlbnRzVG9GaXJlKHRoaXMuI3ByZXZpb3VzLCB0aW1lLCB0aGlzLnF1YW50aXphdGlvbiwgZGlyZWN0aW9uKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy4jcHJldmlvdXMgIT0gdGltZSkge1xyXG4gICAgICAgIHRoaXMuI3ByZXZpb3VzID0gdGltZTtcclxuICAgICAgICB0aW1lID0gdGltZSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHRoaXMuYW5pbWF0aW9uLmdldFN0YXRlKHRpbWUsIGRpcmVjdGlvbiwgdGhpcy5xdWFudGl6YXRpb24pO1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGUpIHtcclxuICAgICAgICAgIHRoaXMubm9kZS5hcHBseUFuaW1hdGlvbihtdXRhdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlyZXMgYWxsIGN1c3RvbSBldmVudHMgdGhlIEFuaW1hdGlvbiBzaG91bGQgaGF2ZSBmaXJlZCBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZS5cclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIGEgbGlzdCBvZiBuYW1lcyBvZiBjdXN0b20gZXZlbnRzIHRvIGZpcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleGVjdXRlRXZlbnRzKF9ldmVudHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfZXZlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfZXZlbnRzW2ldKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNjYWxlIG9mIHRoZSBhbmltYXRpb24gaWYgdGhlIHVzZXIgY2hhbmdlcyBpdCBvciBpZiB0aGUgZ2xvYmFsIGdhbWUgdGltZXIgY2hhbmdlZCBpdHMgc2NhbGUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlU2NhbGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBuZXdTY2FsZTogbnVtYmVyID0gdGhpcy4jc2NhbGU7XHJcbiAgICAgIGlmICh0aGlzLnNjYWxlV2l0aEdhbWVUaW1lKVxyXG4gICAgICAgIG5ld1NjYWxlICo9IFRpbWUuZ2FtZS5nZXRTY2FsZSgpO1xyXG4gICAgICB0aGlzLiN0aW1lTG9jYWwuc2V0U2NhbGUobmV3U2NhbGUpO1xyXG4gICAgfTtcclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgZW51bSBBVURJT19QQU5ORVIge1xyXG4gICAgQ09ORV9JTk5FUl9BTkdMRSA9IFwiY29uZUlubmVyQW5nbGVcIixcclxuICAgIENPTkVfT1VURVJfQU5HTEUgPSBcImNvbmVPdXRlckFuZ2xlXCIsXHJcbiAgICBDT05FX09VVEVSX0dBSU4gPSBcImNvbmVPdXRlckdhaW5cIixcclxuICAgIERJU1RBTkNFX01PREVMID0gXCJkaXN0YW5jZU1vZGVsXCIsXHJcbiAgICBNQVhfRElTVEFOQ0UgPSBcIm1heERpc3RhbmNlXCIsXHJcbiAgICBQQU5OSU5HX01PREVMID0gXCJwYW5uaW5nTW9kZWxcIixcclxuICAgIFJFRl9ESVNUQU5DRSA9IFwicmVmRGlzdGFuY2VcIixcclxuICAgIFJPTExPRkZfRkFDVE9SID0gXCJyb2xsb2ZmRmFjdG9yXCJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFVRElPX05PREVfVFlQRSB7XHJcbiAgICBTT1VSQ0UsIFBBTk5FUiwgR0FJTlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGEgbWluaW1hbCBhdWRpbyBncmFwaCAoYnkgZGVmYXVsdCBpbiB7QGxpbmsgQXVkaW9NYW5hZ2VyfS5kZWZhdWx0KSBhbmQgc3luY2hyb25pemVzIGl0IHdpdGggdGhlIGNvbnRhaW5pbmcge0BsaW5rIE5vZGV9XHJcbiAgICogYGBgdGV4dFxyXG4gICAqIOKUjCBBdWRpb01hbmFnZXIoLmRlZmF1bHQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqIOKUgiDilIwgQ29tcG9uZW50QXVkaW8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgIOKUglxyXG4gICAqIOKUgiDilIIgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiDilIzilIDilIDilIDilIDilIDilIDilJAg4pSCICBcclxuICAgKiDilIIg4pSCICAgIOKUgnNvdXJjZeKUgiDihpIg4pSCcGFubmVy4pSCIOKGkiDilIIgZ2FpbiDilIIg4oaSIOKUgiBnYWluIOKUgiDilIJcclxuICAgKiDilIIg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiAgXHJcbiAgICog4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICDilIJcclxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBUaG9tYXMgRG9ybmVyLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRBdWRpbyBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QXVkaW8pO1xyXG4gICAgLyoqIHBsYWNlcyBhbmQgZGlyZWN0cyB0aGUgcGFubmVyIHJlbGF0aXZlIHRvIHRoZSB3b3JsZCB0cmFuc2Zvcm0gb2YgdGhlIHtAbGluayBOb2RlfSAgKi9cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEB0eXBlKEF1ZGlvKVxyXG4gICAgcHJpdmF0ZSBhdWRpbzogQXVkaW87XHJcbiAgICBwcml2YXRlIGdhaW46IEdhaW5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBwYW5uZXI6IFBhbm5lck5vZGU7XHJcbiAgICBwcml2YXRlIHNvdXJjZTogQXVkaW9CdWZmZXJTb3VyY2VOb2RlO1xyXG4gICAgcHJpdmF0ZSBhdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlcjtcclxuICAgIHByaXZhdGUgcGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYXVkaW86IEF1ZGlvID0gbnVsbCwgX2xvb3A6IGJvb2xlYW4gPSBmYWxzZSwgX3N0YXJ0OiBib29sZWFuID0gZmFsc2UsIF9hdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlciA9IEF1ZGlvTWFuYWdlci5kZWZhdWx0KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuaW5zdGFsbChfYXVkaW9NYW5hZ2VyKTtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoX2F1ZGlvLCBfbG9vcCk7XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5oYW5kbGVBdHRhY2gpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5oYW5kbGVBdHRhY2gpO1xyXG5cclxuICAgICAgaWYgKF9zdGFydClcclxuICAgICAgICB0aGlzLnBsYXkoX3N0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHZvbHVtZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBsb29wKF9vbjogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLnNvdXJjZS5sb29wID0gX29uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbG9vcCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmxvb3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBwbGF5YmFja1JhdGUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcGxheWJhY2tSYXRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNQbGF5aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbGF5aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNBdHRhY2hlZCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMubm9kZSAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNMaXN0ZW5lZCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB7QGxpbmsgQXVkaW99IGFzIHRoZSBhdWRpbyBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEF1ZGlvKF9hdWRpbzogQXVkaW8pOiB2b2lkIHtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoX2F1ZGlvLCB0aGlzLnNvdXJjZS5sb29wKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBdWRpb30gY3VycmVudGx5IHVzZWQgYXMgYXVkaW8gc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBdWRpbygpOiBBdWRpbyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmF1ZGlvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBwcm9wZXJ0eSBvZiB0aGUgcGFubmVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4gVXNlIHRvIG1hbmlwdWxhdGUgcmFuZ2UgYW5kIHJvbGxvZmYgZXRjLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UGFubmVyKF9wcm9wZXJ0eTogQVVESU9fUEFOTkVSLCBfdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZWZsZWN0LnNldCh0aGlzLnBhbm5lciwgX3Byb3BlcnR5LCBfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IG1heSBiZSB1c2VkIGZvciBzZXJpYWxpemF0aW9uIG9mIEF1ZGlvTm9kZXNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbXV0YXRvciBmb3IgdGhlIHNwZWNpZmllZCBBdWRpb05vZGUgb2YgdGhlIHN0YW5kYXJkIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yT2ZOb2RlKF90eXBlOiBBVURJT19OT0RFX1RZUEUpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG5vZGU6IEF1ZGlvTm9kZSA9IHRoaXMuZ2V0QXVkaW9Ob2RlKF90eXBlKTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBnZXRNdXRhdG9yT2ZBcmJpdHJhcnkobm9kZSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIEF1ZGlvTm9kZSBvZiB0aGUgc3RhbmRhcmQgZ3JhcGggZm9yIGZ1cnRoZXIgbWFuaXB1bGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBdWRpb05vZGUoX3R5cGU6IEFVRElPX05PREVfVFlQRSk6IEF1ZGlvTm9kZSB7XHJcbiAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5TT1VSQ0U6IHJldHVybiB0aGlzLnNvdXJjZTtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5QQU5ORVI6IHJldHVybiB0aGlzLnBhbm5lcjtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5HQUlOOiByZXR1cm4gdGhpcy5nYWluO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydCBvciBzdG9wIHBsYXlpbmcgdGhlIGF1ZGlvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwbGF5KF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX29uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW8uaXNSZWFkeSkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTb3VyY2UodGhpcy5hdWRpbywgdGhpcy5zb3VyY2UubG9vcCwgdGhpcy5wbGF5YmFja1JhdGUpO1xyXG4gICAgICAgICAgdGhpcy5zb3VyY2Uuc3RhcnQoMCwgMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5SRUFEWSwgdGhpcy5obmRBdWRpb1JlYWR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5FTkRFRCwgdGhpcy5obmRBdWRpb0VuZGVkKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuc291cmNlLnN0b3AoKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3I6IHVua25vd24pIHsgLyogY2F0Y2ggZXhjZXB0aW9uIHdoZW4gc291cmNlIGhhc24ndCBiZWVuIHN0YXJ0ZWQuLi4gKi8gfVxyXG4gICAgICB0aGlzLnBsYXlpbmcgPSBfb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnRzIEF1ZGlvTm9kZXMgYmV0d2VlbiB0aGUgcGFubmVyIGFuZCB0aGUgbG9jYWwgZ2FpbiBvZiB0aGlzIHtAbGluayBDb21wb25lbnRBdWRpb31cclxuICAgICAqIF9pbnB1dCBhbmQgX291dHB1dCBtYXkgYmUgdGhlIHNhbWUgQXVkaW9Ob2RlLCBpZiB0aGVyZSBpcyBvbmx5IG9uZSB0byBpbnNlcnQsXHJcbiAgICAgKiBvciBtYXkgaGF2ZSBtdWx0aXBsZSBBdWRpb05vZGUgYmV0d2VlbiB0aGVtIHRvIGNyZWF0ZSBhbiBlZmZlY3QtZ3JhcGguXFxcclxuICAgICAqIE5vdGUgdGhhdCB7QGxpbmsgQ29tcG9uZW50QXVkaW99IGRvZXMgbm90IGtlZXAgdHJhY2sgb2YgaW5zZXJ0ZWQgQXVkaW9Ob2RlcyFcclxuICAgICAqIGBgYHRleHRcclxuICAgICAqIOKUjCBBdWRpb01hbmFnZXIoLmRlZmF1bHQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAgICog4pSCIOKUjCBDb21wb25lbnRBdWRpbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgICAg4pSCXHJcbiAgICAgKiDilIIg4pSCICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilJAg4pSCIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIgIFxyXG4gICAgICog4pSCIOKUgiAgICDilIJzb3VyY2XilIIg4oaSIOKUgnBhbm5lcuKUgiDihpIg4pSCX2lucHV04pSCIOKGkiAuLi4gIOKGkiDilIJfb3V0cHV04pSCIOKGkiDilIIgZ2FpbiDilIIg4oaSIOKUgiBnYWluIOKUgiDilIJcclxuICAgICAqIOKUgiDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiAgXHJcbiAgICAgKiDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgIOKUglxyXG4gICAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluc2VydEF1ZGlvTm9kZXMoX2lucHV0OiBBdWRpb05vZGUsIF9vdXRwdXQ6IEF1ZGlvTm9kZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnBhbm5lci5kaXNjb25uZWN0KDApO1xyXG4gICAgICBpZiAoIV9pbnB1dCAmJiAhX291dHB1dCkge1xyXG4gICAgICAgIHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdChfaW5wdXQpO1xyXG4gICAgICBfb3V0cHV0LmNvbm5lY3QodGhpcy5nYWluKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlIG92ZXJyaWRlLiBDb25uZWN0cyBvciBkaXNjb25uZWN0cyBBdWRpb05vZGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWN0aXZhdGUoX29uKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGlzIGNvbXBvbmVudHMgZ2Fpbi1ub2RlIHRvIHRoZSBnYWluIG5vZGUgb2YgdGhlIEF1ZGlvTWFuYWdlciB0aGlzIGNvbXBvbmVudCBydW5zIG9uLlxyXG4gICAgICogT25seSBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IGJ1dCBuZWVkcyB0byBiZSBoZWFyZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3QoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIGlmIChfb24pXHJcbiAgICAgICAgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5hdWRpb01hbmFnZXIuZ2Fpbik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmF1ZGlvTWFuYWdlci5nYWluKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJjb3JuZmxvd2VyYmx1ZVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25BdWRpbywgbXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSA9IHRoaXMuYXVkaW8/LmlkUmVzb3VyY2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ucGxheWluZyA9IHRoaXMucGxheWluZztcclxuICAgICAgc2VyaWFsaXphdGlvbi5sb29wID0gdGhpcy5sb29wO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnZvbHVtZSA9IHRoaXMudm9sdW1lO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdldE11dGF0b3JPZk5vZGUoQVVESU9fTk9ERV9UWVBFLlBBTk5FUikpO1xyXG4gICAgICAvLyBUT0RPOiBzZXJpYWxpemUgcGFubmVyIHBhcmFtZXRlcnNcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBhdWRpbzogQXVkaW8gPSA8QXVkaW8+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoYXVkaW8sIF9zZXJpYWxpemF0aW9uLmxvb3ApO1xyXG4gICAgICB0aGlzLnZvbHVtZSA9IF9zZXJpYWxpemF0aW9uLnZvbHVtZTtcclxuICAgICAgdGhpcy5wbGF5KF9zZXJpYWxpemF0aW9uLnBsYXlpbmcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBsZXQgYXVkaW86IE11dGF0b3IgPSBtdXRhdG9yLmF1ZGlvO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5hdWRpbzsgLy8ganVzdCB0byByZWFycmFuZ2UgaW4gaW50ZXJmYWNlcy4uLlxyXG4gICAgICBtdXRhdG9yLmxvb3AgPSB0aGlzLmxvb3A7XHJcbiAgICAgIG11dGF0b3Iudm9sdW1lID0gdGhpcy52b2x1bWU7XHJcbiAgICAgIG11dGF0b3IuYXVkaW8gPSBhdWRpbzsgLy8uLi4gc28gYXVkaW8gY29tZXMgbGFzdFxyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvcik7XHJcbiAgICAvLyAgIC8vIHRoaXMudm9sdW1lID0gX211dGF0b3Iudm9sdW1lO1xyXG4gICAgLy8gICAvLyB0aGlzLmxvb3AgPSBfbXV0YXRvci5sb29wO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubGlzdGVuZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBobmRBdWRpb1JlYWR5OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJBdWRpbyBzdGFydFwiLCBSZWZsZWN0LmdldChfZXZlbnQudGFyZ2V0LCBcInVybFwiKSk7XHJcbiAgICAgIGlmICh0aGlzLnBsYXlpbmcpXHJcbiAgICAgICAgdGhpcy5wbGF5KHRydWUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGhuZEF1ZGlvRW5kZWQ6IEV2ZW50TGlzdGVuZXIgPSAoX2V2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBEZWJ1Zy5mdWRnZShcIkF1ZGlvIGVuZGVkXCIsIFJlZmxlY3QuZ2V0KF9ldmVudC50YXJnZXQsIFwidXJsXCIpKTtcclxuICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaW5zdGFsbChfYXVkaW9NYW5hZ2VyOiBBdWRpb01hbmFnZXIgPSBBdWRpb01hbmFnZXIuZGVmYXVsdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYWN0aXZlOiBib29sZWFuID0gdGhpcy5pc0FjdGl2ZTtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuYXVkaW9NYW5hZ2VyID0gX2F1ZGlvTWFuYWdlcjtcclxuICAgICAgdGhpcy5wYW5uZXIgPSBfYXVkaW9NYW5hZ2VyLmNyZWF0ZVBhbm5lcigpO1xyXG4gICAgICB0aGlzLmdhaW4gPSBfYXVkaW9NYW5hZ2VyLmNyZWF0ZUdhaW4oKTtcclxuICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgICB0aGlzLmdhaW4uY29ubmVjdChfYXVkaW9NYW5hZ2VyLmdhaW4pO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlKGFjdGl2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTb3VyY2UoX2F1ZGlvOiBBdWRpbywgX2xvb3A6IGJvb2xlYW4sIF9wbGF5YmFja1JhdGU6IG51bWJlciA9IDEuMCk6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5zb3VyY2UpIHtcclxuICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYnVmZmVyID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNvdXJjZSA9IHRoaXMuYXVkaW9NYW5hZ2VyLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMucGFubmVyKTtcclxuXHJcbiAgICAgIGlmIChfYXVkaW8pIHtcclxuICAgICAgICB0aGlzLmF1ZGlvID0gX2F1ZGlvO1xyXG4gICAgICAgIHRoaXMuc291cmNlLmJ1ZmZlciA9IF9hdWRpby5idWZmZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc291cmNlLmxvb3AgPSBfbG9vcDtcclxuICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBfcGxheWJhY2tSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ29ubmVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNvbm5lY3QodGhpcy5pc0FjdGl2ZSAmJiB0aGlzLmlzQXR0YWNoZWQgJiYgdGhpcy5saXN0ZW5lZCk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIC8vIG5vcFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljYWxseSBjb25uZWN0cy9kaXNjb25uZWN0cyBBdWRpb05vZGVzIHdoZW4gYWRkaW5nL3JlbW92aW5nIHRoaXMgY29tcG9uZW50IHRvL2Zyb20gYSBub2RlLiBcclxuICAgICAqIFRoZXJlZm9yZSB1bnVzZWQgQXVkaW9Ob2RlcyBtYXkgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhbiB1bnVzZWQgY29tcG9uZW50IGlzIGNvbGxlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUF0dGFjaCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhfZXZlbnQpO1xyXG4gICAgICBpZiAoX2V2ZW50LnR5cGUgPT0gRVZFTlQuQ09NUE9ORU5UX0FERCkge1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCwgdGhpcy5oYW5kbGVHcmFwaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfUkVNT1ZFLCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5VUERBVEUsIHRoaXMudXBkYXRlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVkID0gdGhpcy5ub2RlLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5ELCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlVQREFURSwgdGhpcy51cGRhdGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljYWxseSBjb25uZWN0cy9kaXNjb25uZWN0cyBBdWRpb05vZGVzIHdoZW4gYXBwZW5kaW5nL3JlbW92aW5nIHRoZSBGVURHRS1ncmFwaCB0aGUgY29tcG9uZW50IGlzIGluLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVHcmFwaCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhfZXZlbnQpO1xyXG4gICAgICB0aGlzLmxpc3RlbmVkID0gKF9ldmVudC50eXBlID09IEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBwYW5uZXIgbm9kZSwgaXRzIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24sIHVzaW5nIHRoZSB3b3JsZG1hdHJpeCBvZiB0aGUgY29udGFpbmVyIGFuZCB0aGUgcGl2b3Qgb2YgdGhpcyBjb21wb25lbnQuIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZSA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3Q7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG10eFJlc3VsdC50cmFuc2xhdGlvbjtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWigxKSwgbXR4UmVzdWx0LCBmYWxzZSk7XHJcblxyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvblgudmFsdWUgPSBwb3NpdGlvbi54O1xyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvblkudmFsdWUgPSBwb3NpdGlvbi55O1xyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvbloudmFsdWUgPSBwb3NpdGlvbi56O1xyXG5cclxuICAgICAgdGhpcy5wYW5uZXIub3JpZW50YXRpb25YLnZhbHVlID0gZm9yd2FyZC54O1xyXG4gICAgICB0aGlzLnBhbm5lci5vcmllbnRhdGlvblkudmFsdWUgPSBmb3J3YXJkLnk7XHJcbiAgICAgIHRoaXMucGFubmVyLm9yaWVudGF0aW9uWi52YWx1ZSA9IGZvcndhcmQuejtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGZvcndhcmQpO1xyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lIHdoeSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzIGVycm9uZW91cyByZXN1bHRzLCBzZWUgdGVzdCBcIlNwYXRpYWwgQXVkaW9cIlxyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFNlcnZlcyB0byBzZXQgdGhlIHNwYXRpYWwgbG9jYXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIEF1ZGlvTGlzdGVuZXJzIHJlbGF0aXZlIHRvIHRoZVxyXG4gICAqIHdvcmxkIHRyYW5zZm9ybSBvZiB0aGUge0BsaW5rIE5vZGV9IGl0IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEF1ZGlvTGlzdGVuZXIpO1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gQXVkaW9MaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKF9saXN0ZW5lcjogQXVkaW9MaXN0ZW5lcik6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSB0aGlzLm10eFBpdm90O1xyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIG10eFJlc3VsdCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcblxyXG4gICAgICAvLyBEZWJ1Zy5sb2cobXR4UmVzdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBtdHhSZXN1bHQudHJhbnNsYXRpb247XHJcbiAgICAgIGxldCBmb3J3YXJkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihWZWN0b3IzLlooMSksIG10eFJlc3VsdCwgZmFsc2UpO1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWSgpLCBtdHhSZXN1bHQsIGZhbHNlKTtcclxuICAgICAgaWYgKF9saXN0ZW5lci5wb3NpdGlvblggIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWC52YWx1ZSA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWS52YWx1ZSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWi52YWx1ZSA9IHBvc2l0aW9uLno7XHJcblxyXG4gICAgICAgIF9saXN0ZW5lci5mb3J3YXJkWC52YWx1ZSA9IGZvcndhcmQueDtcclxuICAgICAgICBfbGlzdGVuZXIuZm9yd2FyZFkudmFsdWUgPSBmb3J3YXJkLnk7XHJcbiAgICAgICAgX2xpc3RlbmVyLmZvcndhcmRaLnZhbHVlID0gZm9yd2FyZC56O1xyXG5cclxuICAgICAgICBfbGlzdGVuZXIudXBYLnZhbHVlID0gdXAueDtcclxuICAgICAgICBfbGlzdGVuZXIudXBZLnZhbHVlID0gdXAueTtcclxuICAgICAgICBfbGlzdGVuZXIudXBaLnZhbHVlID0gdXAuejtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGaXJlZm94IHN0aWxsIHVzZXMgZGVwcmVjYXRlZCBtZXRob2RzLiBUT0RPOiBkZWxldGUgYXMgc29vbiBhcyBwb3NzaWJsZSFcclxuICAgICAgICBfbGlzdGVuZXIuc2V0UG9zaXRpb24ocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcbiAgICAgICAgX2xpc3RlbmVyLnNldE9yaWVudGF0aW9uKGZvcndhcmQueCwgZm9yd2FyZC55LCBmb3J3YXJkLnosIHVwLngsIHVwLnksIHVwLnopO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShmb3J3YXJkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodXApO1xyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcblxyXG4gICAgICAvLyBEZWJ1Zy5sb2cobXR4UmVzdWx0LnRyYW5zbGF0aW9uLnRvU3RyaW5nKCksIGZvcndhcmQudG9TdHJpbmcoKSwgdXAudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYSBibG9vbS1lZmZlY3QuXHJcbiAgICogQGF1dGhvcnMgUm9sYW5kIEhlZXIsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRCbG9vbSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Qmxvb20pO1xyXG4gICAgXHJcbiAgICAjdGhyZXNob2xkOiBudW1iZXI7XHJcbiAgICAjaW50ZW5zaXR5OiBudW1iZXI7XHJcbiAgICAjaGlnaGxpZ2h0RGVzYXR1cmF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90aHJlc2hvbGQ6IG51bWJlciA9IDAuOTUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDEuMCwgX2Rlc2F0dXJhdGVIaWdobGlnaHRzOiBudW1iZXIgPSAwLjUpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy4jdGhyZXNob2xkID0gX3RocmVzaG9sZDtcclxuICAgICAgdGhpcy4jaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gX2Rlc2F0dXJhdGVIaWdobGlnaHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0aHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpbnRlbnNpdHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ludGVuc2l0eTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaW50ZW5zaXR5KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2ludGVuc2l0eSA9IE1hdGgubWF4KDAsIF92YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoaWdobGlnaHREZXNhdHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaGlnaGxpZ2h0RGVzYXR1cmF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbiA9IENhbGMuY2xhbXAoX3ZhbHVlLCAwLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy4jdGhyZXNob2xkLFxyXG4gICAgICAgIGludGVuc2l0eTogdGhpcy4jaW50ZW5zaXR5LFxyXG4gICAgICAgIGRlc2F0dXJhdGVIaWdobGlnaHRzOiB0aGlzLiNoaWdobGlnaHREZXNhdHVyYXRpb24sXHJcbiAgICAgIH07XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy4jdGhyZXNob2xkID0gX3NlcmlhbGl6YXRpb24udGhyZXNob2xkO1xyXG4gICAgICB0aGlzLiNpbnRlbnNpdHkgPSBfc2VyaWFsaXphdGlvbi5pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmRlc2F0dXJhdGVIaWdobGlnaHRzO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQ7XHJcbiAgICAgIG11dGF0b3IuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcbiAgICAgIG11dGF0b3IuaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gdGhpcy5oaWdobGlnaHREZXNhdHVyYXRpb247XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiQ29tcG9uZW50LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgZW51bSBGSUVMRF9PRl9WSUVXIHtcclxuICAgIEhPUklaT05UQUwgPSBcImhvcml6b250YWxcIixcclxuICAgIFZFUlRJQ0FMID0gXCJ2ZXJ0aWNhbFwiLFxyXG4gICAgRElBR09OQUwgPSBcImRpYWdvbmFsXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgcHJvamVjdGlvbnMgYSBjYW1lcmEgY2FuIHByb3ZpZGUuICBcclxuICAgKiBUT0RPOiBjaGFuZ2UgYmFjayB0byBudW1iZXIgZW51bSBpZiBzdHJpbmdzIG5vdCBuZWVkZWRcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBQUk9KRUNUSU9OIHtcclxuICAgIENFTlRSQUwgPSBcImNlbnRyYWxcIixcclxuICAgIE9SVEhPR1JBUEhJQyA9IFwib3J0aG9ncmFwaGljXCIsXHJcbiAgICBESU1FVFJJQyA9IFwiZGltZXRyaWNcIixcclxuICAgIFNURVJFTyA9IFwic3RlcmVvXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIGNhbWVyYSBjb21wb25lbnQgaG9sZHMgdGhlIHByb2plY3Rpb24tbWF0cml4IGFuZCBvdGhlciBkYXRhIG5lZWRlZCB0byByZW5kZXIgYSBzY2VuZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgbm9kZSBpdCBpcyBhdHRhY2hlZCB0by5cclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudENhbWVyYSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Q2FtZXJhKTtcclxuXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIGNsckJhY2tncm91bmQ6IENvbG9yID0gbmV3IENvbG9yKDAsIDAsIDAsIDEpOyAvLyBUaGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmQgdGhlIGNhbWVyYSB3aWxsIHJlbmRlci5cclxuICAgIC8vcHJpdmF0ZSBvcnRob2dyYXBoaWM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbWFnZSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICBwcml2YXRlIHByb2plY3Rpb246IFBST0pFQ1RJT04gPSBQUk9KRUNUSU9OLkNFTlRSQUw7XHJcbiAgICBwcml2YXRlIGZpZWxkT2ZWaWV3OiBudW1iZXIgPSA0NTsgLy8gVGhlIGNhbWVyYSdzIHNlbnNvcmFuZ2xlLlxyXG4gICAgcHJpdmF0ZSBhc3BlY3RSYXRpbzogbnVtYmVyID0gMS4wO1xyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb246IEZJRUxEX09GX1ZJRVcgPSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMO1xyXG4gICAgcHJpdmF0ZSBuZWFyOiBudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBmYXI6IG51bWJlciA9IDIwMDA7XHJcbiAgICBwcml2YXRlIGJhY2tncm91bmRFbmFibGVkOiBib29sZWFuID0gdHJ1ZTsgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYmFja2dyb3VuZCBvZiB0aGlzIGNhbWVyYSB3aWxsIGJlIHJlbmRlcmVkLlxyXG4gICAgLy8gVE9ETzogZXhhbWluZSwgaWYgYmFja2dyb3VuZCBzaG91bGQgYmUgYW4gYXR0cmlidXRlIG9mIENhbWVyYSBvciBWaWV3cG9ydFxyXG5cclxuICAgICNtdHhXb3JsZFRvVmlldzogTWF0cml4NHg0O1xyXG4gICAgI210eENhbWVyYUludmVyc2U6IE1hdHJpeDR4NDtcclxuICAgICNtdHhQcm9qZWN0aW9uOiBNYXRyaXg0eDQgPSBuZXcgTWF0cml4NHg0OyAvLyBUaGUgbWF0cml4IHRvIG11bHRpcGx5IGVhY2ggc2NlbmUgb2JqZWN0cyB0cmFuc2Zvcm1hdGlvbiBieSwgdG8gZGV0ZXJtaW5lIHdoZXJlIGl0IHdpbGwgYmUgZHJhd24uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIHdvcmxkdHJhbnNmb3JtYXRpb24gbWF0cml4IGkuZS4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBncmFwaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhDYW1lcmE6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3QuY2xvbmU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbXR4Q2FtZXJhID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgLy8gbm8gY29udGFpbmVyIG5vZGUgb3Igbm8gd29ybGQgdHJhbnNmb3JtYXRpb24gZm91bmQgLT4gY29udGludWUgd2l0aCBwaXZvdCBvbmx5XHJcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgdXNlIGlmICgpIHRoZW4gaW5zdGVhZCBvZiB0cnkgY2F0Y2hcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbXR4Q2FtZXJhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhlIHdvcmxkdHJhbnNmb3JtYXRpb24gb2YgdGhlIGNhbWVyYSBjb250YWluZXIsIHRoZSBwaXZvdCBvZiB0aGlzIGNhbWVyYSBhbmQgdGhlIGludmVyc2lvbiBvZiB0aGUgcHJvamVjdGlvbiBtYXRyaXhcclxuICAgICAqIHlpZWxkaW5nIHRoZSB3b3JsZHNwYWNlIHRvIHZpZXdzcGFjZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhXb3JsZFRvVmlldygpOiBNYXRyaXg0eDQge1xyXG4gICAgICBpZiAodGhpcy4jbXR4V29ybGRUb1ZpZXcpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eFdvcmxkVG9WaWV3O1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4V29ybGRUb1ZpZXcgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLiNtdHhQcm9qZWN0aW9uLCB0aGlzLm10eENhbWVyYUludmVyc2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRUb1ZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnZlcnNpb24gb2YgdGhpcyBjYW1lcmFzIHdvcmxkdHJhbnNmb3JtYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhDYW1lcmFJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlO1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHByb2plY3Rpb25tYXRyaXggb2YgdGhpcyBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhQcm9qZWN0aW9uKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhQcm9qZWN0aW9uKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNtdHhQcm9qZWN0aW9uO1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4UHJvamVjdGlvbiA9IG5ldyBNYXRyaXg0eDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhQcm9qZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgY2FtZXJhcyB7QGxpbmsgbXR4V29ybGRUb1ZpZXd9IGFuZCB7QGxpbmsgbXR4Q2FtZXJhSW52ZXJzZX0gbWF0cmljZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0V29ybGRUb1ZpZXcoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZFRvVmlldykgUmVjeWNsZXIuc3RvcmUodGhpcy4jbXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBpZiAodGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSkgUmVjeWNsZXIuc3RvcmUodGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSk7XHJcbiAgICAgIHRoaXMuI210eFdvcmxkVG9WaWV3ID0gbnVsbDtcclxuICAgICAgdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIHtAbGluayBQUk9KRUNUSU9OfSBtb2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9qZWN0aW9uKCk6IFBST0pFQ1RJT04ge1xyXG4gICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBjYW1lcmEgc2hvdWxkIGJlIHJlbmRlcmVkLCBmYWxzZSBpZiBub3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJhY2tncm91bmRFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgYXNwZWN0IHJhdGlvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBc3BlY3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIGZpZWxkIG9mIHZpZXcgaW4gZGVncmVlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmllbGRPZlZpZXcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmllbGRPZlZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIGRpcmVjdGlvbiBpLmUuIHRoZSBwbGFuZSBvbiB3aGljaCB0aGUgZmllbGRPZlZpZXctQW5nbGUgaXMgZ2l2ZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERpcmVjdGlvbigpOiBGSUVMRF9PRl9WSUVXIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBuZWFyIHZhbHVlIGkuZS4gdGhlIG1pbmltdW0gZGlzdGFuY2UgdG8gcmVuZGVyIG9iamVjdHMgYXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5lYXIoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmVhcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZmFyIHZhbHVlIGkuZS4gdGhlIG1heGltdW0gZGlzdGFuY2UgdG8gcmVuZGVyIG9iamVjdHMgYXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZhcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5mYXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbWVyYSB0byBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBUaGUgd29ybGQgb3JpZ2luIGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc2VsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0gX2FzcGVjdCBUaGUgYXNwZWN0IHJhdGlvIGJldHdlZW4gd2lkdGggYW5kIGhlaWdodCBvZiBwcm9qZWN0aW9uc3BhY2UuKERlZmF1bHQgPSBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuQ2xpZW50SGVpZ2h0KVxyXG4gICAgICogQHBhcmFtIF9maWVsZE9mVmlldyBUaGUgZmllbGQgb2YgdmlldyBpbiBEZWdyZWVzLiAoRGVmYXVsdCA9IDQ1KVxyXG4gICAgICogQHBhcmFtIF9kaXJlY3Rpb24gVGhlIHBsYW5lIG9uIHdoaWNoIHRoZSBmaWVsZE9mVmlldy1BbmdsZSBpcyBnaXZlbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2plY3RDZW50cmFsKF9hc3BlY3Q6IG51bWJlciA9IHRoaXMuYXNwZWN0UmF0aW8sIF9maWVsZE9mVmlldzogbnVtYmVyID0gdGhpcy5maWVsZE9mVmlldywgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVyA9IHRoaXMuZGlyZWN0aW9uLCBfbmVhcjogbnVtYmVyID0gdGhpcy5uZWFyLCBfZmFyOiBudW1iZXIgPSB0aGlzLmZhcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFzcGVjdFJhdGlvID0gX2FzcGVjdDtcclxuICAgICAgdGhpcy5maWVsZE9mVmlldyA9IF9maWVsZE9mVmlldztcclxuICAgICAgdGhpcy5kaXJlY3Rpb24gPSBfZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBQUk9KRUNUSU9OLkNFTlRSQUw7XHJcbiAgICAgIHRoaXMubmVhciA9IF9uZWFyO1xyXG4gICAgICB0aGlzLmZhciA9IF9mYXI7XHJcbiAgICAgIHRoaXMuI210eFByb2plY3Rpb24gPSBNYXRyaXg0eDQuUFJPSkVDVElPTl9DRU5UUkFMKF9hc3BlY3QsIHRoaXMuZmllbGRPZlZpZXcsIF9uZWFyLCBfZmFyLCB0aGlzLmRpcmVjdGlvbik7IC8vIFRPRE86IHJlbW92ZSBtYWdpYyBudW1iZXJzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbWVyYSB0byBvcnRob2dyYXBoaWMgcHJvamVjdGlvbi4gRGVmYXVsdCB2YWx1ZXMgYXJlIGRlcml2ZWQgdGhlIGNhbnZhcyBjbGllbnQgZGltZW5zaW9uc1xyXG4gICAgICogQHBhcmFtIF9sZWZ0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBsZWZ0IGJvcmRlci4gICAgXHJcbiAgICAgKiBAcGFyYW0gX3JpZ2h0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyByaWdodCBib3JkZXIuICBcclxuICAgICAqIEBwYXJhbSBfYm90dG9tIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBib3R0b20gYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF90b3AgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHRvcCBib3JkZXIuICAgICAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9qZWN0T3J0aG9ncmFwaGljKF9sZWZ0OiBudW1iZXIgPSAtUmVuZGVyLmdldENhbnZhcygpLmNsaWVudFdpZHRoIC8gMiwgX3JpZ2h0OiBudW1iZXIgPSBSZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50V2lkdGggLyAyLCBfYm90dG9tOiBudW1iZXIgPSBSZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50SGVpZ2h0IC8gMiwgX3RvcDogbnVtYmVyID0gLVJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRIZWlnaHQgLyAyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucHJvamVjdGlvbiA9IFBST0pFQ1RJT04uT1JUSE9HUkFQSElDO1xyXG4gICAgICB0aGlzLiNtdHhQcm9qZWN0aW9uID0gTWF0cml4NHg0LlBST0pFQ1RJT05fT1JUSE9HUkFQSElDKF9sZWZ0LCBfcmlnaHQsIF9ib3R0b20sIF90b3AsIDQwMCwgLTQwMCk7IC8vIFRPRE86IGV4YW1pbmUgbWFnaWMgbnVtYmVycyFcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gb2YgYSBwcm9qZWN0aW9uIHN1cmZhY2UgaW4gdGhlIGh5cG90aGV0aWNhbCBkaXN0YW5jZSBvZiAxIHRvIHRoZSBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb2plY3Rpb25SZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgbGV0IHRhbkZvdjogbnVtYmVyID0gTWF0aC50YW4oTWF0aC5QSSAqIHRoaXMuZmllbGRPZlZpZXcgLyAzNjApOyAvLyBIYWxmIG9mIHRoZSBhbmdsZSwgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbiBmcm9tIHRoZSBjZW50ZXIgLT4gcmlnaHQgYW5nbGVcclxuICAgICAgbGV0IHRhbkhvcml6b250YWw6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0YW5WZXJ0aWNhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMKSB7XHJcbiAgICAgICAgbGV0IGFzcGVjdDogbnVtYmVyID0gTWF0aC5zcXJ0KHRoaXMuYXNwZWN0UmF0aW8pO1xyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5Gb3YgKiBhc3BlY3Q7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Gb3YgLyBhc3BlY3Q7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5WRVJUSUNBTCkge1xyXG4gICAgICAgIHRhblZlcnRpY2FsID0gdGFuRm92O1xyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5WZXJ0aWNhbCAqIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICAgIH0gZWxzZSB7Ly9GT1ZfRElSRUNUSU9OLkhPUklaT05UQUxcclxuICAgICAgICB0YW5Ib3Jpem9udGFsID0gdGFuRm92O1xyXG4gICAgICAgIHRhblZlcnRpY2FsID0gdGFuSG9yaXpvbnRhbCAvIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRhbkhvcml6b250YWwgKiAyLCB0YW5WZXJ0aWNhbCAqIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSB3b3JsZCBzcGFjZSB0byBjbGlwIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludFdvcmxkVG9DbGlwKF9wb2ludEluV29ybGRTcGFjZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gdGhpcy5tdHhXb3JsZFRvVmlldy5nZXQoKTtcclxuICAgICAgbGV0IHc6IG51bWJlciA9IG1bM10gKiBfcG9pbnRJbldvcmxkU3BhY2UueCArIG1bN10gKiBfcG9pbnRJbldvcmxkU3BhY2UueSArIG1bMTFdICogX3BvaW50SW5Xb3JsZFNwYWNlLnogKyBtWzE1XTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3BvaW50SW5Xb3JsZFNwYWNlLCB0aGlzLm10eFdvcmxkVG9WaWV3KTtcclxuICAgICAgcmVzdWx0LnNjYWxlKDEgLyB3KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHBvaW50IGZyb20gY2xpcCBzcGFjZSB0byB3b3JsZCBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGlwVG9Xb3JsZChfcG9pbnRJbkNsaXBTcGFjZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gbXR4Vmlld1RvV29ybGQuZ2V0KCk7XHJcbiAgICAgIGxldCByYXlXb3JsZDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3BvaW50SW5DbGlwU3BhY2UsIG10eFZpZXdUb1dvcmxkLCB0cnVlKTtcclxuICAgICAgbGV0IHc6IG51bWJlciA9IG1bM10gKiBfcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIF9wb2ludEluQ2xpcFNwYWNlLnkgKyBtWzExXSAqIF9wb2ludEluQ2xpcFNwYWNlLnogKyBtWzE1XTtcclxuICAgICAgcmF5V29ybGQuc2NhbGUoMSAvIHcpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheVdvcmxkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNjYWxpbmcgZmFjdG9yIHRoYXQsIGdpdmVuIGEgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UsIFxyXG4gICAgICogc2NhbGVzIGFuIG9iamVjdCBhdCB0aGF0IHBvc2l0aW9uIHNvIHRoYXQgb25lIHVuaXQgZXF1YWxzIG9uZSAobG9naWNhbCkgcGl4ZWwgb24gdGhlIHNjcmVlbiBcclxuICAgICAqIHdoZW4gc2VlbiB0aHJvdWdoIHRoaXMgY2FtZXJhLlxyXG4gICAgICogZS5nLiwgYWZ0ZXIgc2V0dGluZyB0aGUgc2NhbGluZywgMSB1bml0IGluIHRoZSB3b3JsZCBlcXVhbHMgb25lIChsb2dpY2FsKSBwaXhlbCBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0V29ybGRUb1BpeGVsU2NhbGUoX3Bvc1dvcmxkOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGRpc3RhbmNlOiBudW1iZXIgPSB0aGlzLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldERpc3RhbmNlKF9wb3NXb3JsZCk7XHJcbiAgICAgIGxldCBzY2FsZTogbnVtYmVyO1xyXG4gICAgICBsZXQgcmVjdDogUmVjdGFuZ2xlID0gUmVuZGVyLmdldFJlbmRlclJlY3RhbmdsZSgpO1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuZ2V0RGlyZWN0aW9uKCkpIHtcclxuICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuVkVSVElDQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyByZWN0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyByZWN0LndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuRElBR09OQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyBNYXRoLnNxcnQoKHJlY3Qud2lkdGggKiByZWN0LmhlaWdodCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHNjYWxlICogZGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuY2xyQmFja2dyb3VuZCxcclxuICAgICAgICBiYWNrZ3JvdW5kRW5hYmxlZDogdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCxcclxuICAgICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXHJcbiAgICAgICAgZmllbGRPZlZpZXc6IHRoaXMuZmllbGRPZlZpZXcsXHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhcixcclxuICAgICAgICBhc3BlY3Q6IHRoaXMuYXNwZWN0UmF0aW8sXHJcbiAgICAgICAgcGl2b3Q6IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsckJhY2tncm91bmQuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCA9IF9zZXJpYWxpemF0aW9uLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBfc2VyaWFsaXphdGlvbi5wcm9qZWN0aW9uO1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX3NlcmlhbGl6YXRpb24uZmllbGRPZlZpZXc7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfc2VyaWFsaXphdGlvbi5hc3BlY3Q7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX3NlcmlhbGl6YXRpb24uZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5wcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQzpcclxuICAgICAgICAgIHRoaXMucHJvamVjdE9ydGhvZ3JhcGhpYygpOyAvLyBUT0RPOiBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHBhcmFtZXRlcnNcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLmRpcmVjdGlvbilcclxuICAgICAgICB0eXBlcy5kaXJlY3Rpb24gPSBGSUVMRF9PRl9WSUVXO1xyXG4gICAgICBpZiAodHlwZXMucHJvamVjdGlvbilcclxuICAgICAgICB0eXBlcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMucHJvamVjdGlvbikge1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCh0aGlzLmFzcGVjdFJhdGlvLCB0aGlzLmZpZWxkT2ZWaWV3LCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25DYW1lcmEsIG10eFdvcmxkLCBjb2xvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIGNvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVGcnVzdHVtKHRoaXMuZ2V0QXNwZWN0KCksIHRoaXMuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5nZXROZWFyKCksIHRoaXMuZ2V0RmFyKCksIHRoaXMuZ2V0RGlyZWN0aW9uKCksIHRoaXMubXR4V29ybGQsIENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50cmFuc2Zvcm07XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFrZXMgdGhlIG5vZGUgZmFjZSB0aGUgY2FtZXJhIHdoZW4gcmVuZGVyaW5nLCByZXNwZWN0aW5nIHJlc3RyaWN0aW9ucyBmb3Igcm90YXRpb24gYXJvdW5kIHNwZWNpZmljIGF4aXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEZhY2VDYW1lcmEgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyB1cExvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB1cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgxKTtcclxuICAgIHB1YmxpYyByZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYSBmb2ctZWZmZWN0LlxyXG4gICAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50Rm9nIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRGb2cpO1xyXG4gICAgcHVibGljIGNvbG9yOiBDb2xvcjtcclxuICAgIHB1YmxpYyBuZWFyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZmFyOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSksIF9uZWFyOiBudW1iZXIgPSAxLCBfZmFyOiBudW1iZXIgPSA1MCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmNvbG9yID0gX2NvbG9yO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfbmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfZmFyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKCksXHJcbiAgICAgICAgbmVhcjogdGhpcy5uZWFyLFxyXG4gICAgICAgIGZhcjogdGhpcy5mYXJcclxuICAgICAgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbG9yLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNvbG9yKTtcclxuICAgICAgdGhpcy5uZWFyID0gX3NlcmlhbGl6YXRpb24ubmVhciA/PyB0aGlzLm5lYXI7XHJcbiAgICAgIHRoaXMuZmFyID0gX3NlcmlhbGl6YXRpb24uZmFyID8/IHRoaXMuZmFyO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEZpbHRlcnMgc3luY2hyb25pemF0aW9uIGJldHdlZW4gYSBncmFwaCBpbnN0YW5jZSBhbmQgdGhlIGdyYXBoIGl0IGlzIGNvbm5lY3RlZCB0by4gSWYgYWN0aXZlLCBubyBzeW5jaHJvbml6YXRpb24gb2NjdXJzLlxyXG4gICAqIE1heWJlIG1vcmUgZmluZWdyYWluZWQgaW4gdGhlIGZ1dHVyZS4uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9Db21wb25lbnRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50R3JhcGhGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2luZ2xldG9uID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgdHlwZSBUeXBlT2ZMaWdodCA9IG5ldyAoKSA9PiBMaWdodDtcclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBsaWdodHMuIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIExpZ2h0IGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIGludGVuc2l0eTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpLCBfaW50ZW5zaXR5OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUeXBlT2ZMaWdodH0gb2YgdGhpcyBsaWdodC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFR5cGUoKTogVHlwZU9mTGlnaHQge1xyXG4gICAgICByZXR1cm4gPFR5cGVPZkxpZ2h0PnRoaXMuY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaW50ZW5zaXR5OiB0aGlzLmludGVuc2l0eVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbG9yLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNvbG9yKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmludGVuc2l0eSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5pbnRlbnNpdHkgPSBfc2VyaWFsaXphdGlvbi5pbnRlbnNpdHk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKCk6IHZvaWQgey8qKi8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW1iaWVudCBsaWdodCwgY29taW5nIGZyb20gYWxsIGRpcmVjdGlvbnMsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIHdpdGggaXRzIGNvbG9yIGluZGVwZW5kZW50IG9mIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiAobGlrZSBhIGZvZ2d5IGRheSBvciBpbiB0aGUgc2hhZGVzKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggaXMgaWdub3JlZC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogfiB+IH4gIFxyXG4gICAqICB+IH4gfiAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0QW1iaWVudCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlyZWN0aW9uYWwgbGlnaHQsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0aW9uIHdpdGggaXRzIGNvbG9yIChsaWtlIHN0YW5kaW5nIGluIGJyaWdodCBzdW5saWdodCkgIFxyXG4gICAqIEF0dGFjaGVkIHRvIGEgbm9kZSBieSB7QGxpbmsgQ29tcG9uZW50TGlnaHR9LCB0aGUgcGl2b3QgbWF0cml4IHNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsaWdodCBvbmx5LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHREaXJlY3Rpb25hbCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT21uaWRpcmVjdGlvbmFsIGxpZ2h0IGVtaXR0aW5nIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yIChsaWtlIGEgY29sb3JlZCBsaWdodCBidWxiKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlnaHQsIGl0J3Mgc2hhcGUgYW5kIHJvdGF0aW9uLiBcclxuICAgKiBTbyB3aXRoIHVuZXZlbiBzY2FsaW5nLCBvdGhlciBzaGFwZXMgdGhhbiBhIHBlcmZlY3Qgc3BoZXJlLCBzdWNoIGFzIGFuIG92YWwgb3IgYSBkaXNjLCBhcmUgcG9zc2libGUsIHdoaWNoIGNyZWF0ZXMgYSB2aXNpYmxlIGVmZmVjdCBvZiB0aGUgcm90YXRpb24gdG9vLiBcclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHNoYXBlLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIC5cXHwvLlxyXG4gICAqICAgICAgICAtLSBvIC0tXHJcbiAgICogICAgICAgICDCtC98XFxgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0UG9pbnQgZXh0ZW5kcyBMaWdodCB7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNwb3QgbGlnaHQgZW1pdHRpbmcgd2l0aGluIGEgc3BlY2lmaWVkIGFuZ2xlIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yICBcclxuICAgKiBBdHRhY2hlZCB0byBhIG5vZGUgYnkge0BsaW5rIENvbXBvbmVudExpZ2h0fSwgdGhlIHBpdm90IG1hdHJpeCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaWdodCwgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIHNpemUgYW5kIGFuZ2xlcyBvZiB0aGUgY29uZS5cclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBvdXRlciBsaW1pdHMgb2YgdGhlIGNvbmUuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIG8gIFxyXG4gICAqICAgICAgICAgL3xcXCAgXHJcbiAgICogICAgICAgIC8gfCBcXCBcclxuICAgKiBgYGAgICBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHRTcG90IGV4dGVuZHMgTGlnaHQge1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0xpZ2h0L0xpZ2h0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGlnaHQgdGhpcyBjb21wb25lbnQgY2FuIHByb3ZpZGUuICBcclxuICAgKi9cclxuICAvLyBleHBvcnQgbGV0IExJR0hUX1RZUEU6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gIGV4cG9ydCBlbnVtIExJR0hUX1RZUEUge1xyXG4gICAgQU1CSUVOVCA9IFwiTGlnaHRBbWJpZW50XCIsXHJcbiAgICBESVJFQ1RJT05BTCA9IFwiTGlnaHREaXJlY3Rpb25hbFwiLFxyXG4gICAgUE9JTlQgPSBcIkxpZ2h0UG9pbnRcIixcclxuICAgIFNQT1QgPSBcIkxpZ2h0U3BvdFwiXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAgKiBBdHRhY2hlcyBhIHtAbGluayBMaWdodH0gdG8gdGhlIG5vZGVcclxuICAgICogVGhlIHBpdm90IG1hdHJpeCBoYXMgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgTGlnaHR9LiBTZWUgdGhlcmUgZm9yIGRldGFpbHMuXHJcbiAgICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRMaWdodCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TGlnaHQpO1xyXG5cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGNvbnN0cnVjdG9yczogeyBbdHlwZTogc3RyaW5nXTogR2VuZXJhbCB9ID0geyBbTElHSFRfVFlQRS5BTUJJRU5UXTogTGlnaHRBbWJpZW50LCBbTElHSFRfVFlQRS5ESVJFQ1RJT05BTF06IExpZ2h0RGlyZWN0aW9uYWwsIFtMSUdIVF9UWVBFLlBPSU5UXTogTGlnaHRQb2ludCwgW0xJR0hUX1RZUEUuU1BPVF06IExpZ2h0U3BvdCB9O1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgIHB1YmxpYyBsaWdodDogTGlnaHQgPSBudWxsO1xyXG4gICAgLy9UT0RPOiBzaW5jZSB0aGVyZSBpcyBhbG1vc3Qgbm8gZnVuY3Rpb25hbGl0eSBsZWZ0IGluIExpZ2h0LCBlbGltaW5hdGUgaXQgYW5kIHB1dCBhbGwgaW4gdGhlIGNvbXBvbmVudCBhcyB3aXRoIHRoZSBjYW1lcmEuLi5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xpZ2h0OiBMaWdodCA9IG5ldyBMaWdodEFtYmllbnQoKSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxpZ2h0ID0gX2xpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVzZSBUeXBlT2ZMaWdodCBhcyByZXR1cm4gdHlwZT9cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0eXBlIG9mIHtAbGluayBMaWdodH0gdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFR5cGU8VCBleHRlbmRzIExpZ2h0PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHJPbGQ6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKHRoaXMubGlnaHQpXHJcbiAgICAgICAgbXRyT2xkID0gdGhpcy5saWdodC5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICB0aGlzLmxpZ2h0ID0gbmV3IF9jbGFzcygpO1xyXG4gICAgICB0aGlzLmxpZ2h0Lm11dGF0ZShtdHJPbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHBpdm90OiB0aGlzLm10eFBpdm90LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGxpZ2h0OiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLmxpZ2h0KVxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIHRoaXMubGlnaHQgPSBhd2FpdCA8UHJvbWlzZTxMaWdodD4+U2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5saWdodCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudHlwZSA9IHRoaXMubGlnaHQuZ2V0VHlwZSgpLm5hbWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlKVxyXG4gICAgICAgIHR5cGVzLnR5cGUgPSBMSUdIVF9UWVBFO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBfbXV0YXRvci50eXBlO1xyXG4gICAgICBpZiAodHlwZW9mICh0eXBlKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlICE9IHRoaXMubGlnaHQuY29uc3RydWN0b3IubmFtZSlcclxuICAgICAgICB0aGlzLnNldFR5cGUoU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcjxMaWdodD4odHlwZSkpO1xyXG4gICAgICBkZWxldGUgKF9tdXRhdG9yLnR5cGUpOyAvLyBleGNsdWRlIGxpZ2h0IHR5cGUgZnJvbSBmdXJ0aGVyIG11dGF0aW9uXHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgX211dGF0b3IudHlwZSA9IHR5cGU7IC8vIHJlY29uc3RydWN0IG11dGF0b3JcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3SWNvbihUZXh0dXJlRGVmYXVsdC5pY29uTGlnaHQsIG10eFNoYXBlLCB0aGlzLmxpZ2h0LmNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2hhcGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJ5ZWxsb3dcIik7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMubGlnaHQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBMaWdodERpcmVjdGlvbmFsOlxyXG4gICAgICAgICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSAwLjU7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVDaXJjbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkoMTApLmZpbGwobnVsbCkubWFwKCgpID0+IFJlY3ljbGVyLmdldChWZWN0b3IzKSk7XHJcbiAgICAgICAgICBsaW5lc1swXS5zZXQoMCwgMCwgMCk7IGxpbmVzWzFdLnNldCgwLCAwLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzJdLnNldCgwLCByYWRpdXMsIDApOyBsaW5lc1szXS5zZXQoMCwgcmFkaXVzLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzZdLnNldCgwLCAtcmFkaXVzLCAwKTsgbGluZXNbN10uc2V0KDAsIC1yYWRpdXMsIDEpO1xyXG4gICAgICAgICAgbGluZXNbNF0uc2V0KHJhZGl1cywgMCwgMCk7IGxpbmVzWzVdLnNldChyYWRpdXMsIDAsIDEpO1xyXG4gICAgICAgICAgbGluZXNbOF0uc2V0KC1yYWRpdXMsIDAsIDApOyBsaW5lc1s5XS5zZXQoLXJhZGl1cywgMCwgMSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSguLi5saW5lcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExpZ2h0UG9pbnQ6XHJcbiAgICAgICAgICBtdHhTaGFwZS5zY2FsZShuZXcgVmVjdG9yMygyLCAyLCAyKSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVTcGhlcmUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTGlnaHRTcG90OlxyXG4gICAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBNYXRlcmlhbH0gdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAtIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWF0ZXJpYWwgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgIHB1YmxpYyBjbHJQcmltYXJ5OiBDb2xvciA9IENvbG9yLkNTUyhcIndoaXRlXCIpO1xyXG4gICAgcHVibGljIGNsclNlY29uZGFyeTogQ29sb3IgPSBDb2xvci5DU1MoXCJ3aGl0ZVwiKTtcclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICBAdHlwZShNYXRlcmlhbClcclxuICAgIHB1YmxpYyBtYXRlcmlhbDogTWF0ZXJpYWw7XHJcbiAgICAvKiogU3VwcG9ydCBzb3J0aW5nIG9mIG9iamVjdHMgd2l0aCB0cmFuc3BhcmVuY3kgd2hlbiByZW5kZXJpbmcsIHJlbmRlciBvYmplY3RzIGluIHRoZSBiYWNrIGZpcnN0LiBXaGVuIHRoaXMgY29tcG9uZW50IGlzIHVzZWQgYXMgYSBwYXJ0IG9mIGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfSwgdHJ5IGVuYWJsaW5nIHRoaXMgd2hlbiBkaXNhYmxpbmcge0BsaW5rIENvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlcHRoTWFza30gKi9cclxuICAgIHB1YmxpYyBzb3J0Rm9yQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIGEgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsP1xyXG4gICAgLy8gcHVibGljIG11dGF0b3JDb2F0OiBNdXRhdG9yRm9yQ29tcG9uZW50O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWF0ZXJpYWw6IE1hdGVyaWFsID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm1hdGVyaWFsID0gX21hdGVyaWFsO1xyXG4gICAgICAvLyB0aGlzLm11dGF0b3JDb2F0ID0gX21hdGVyaWFsLmdldENvYXQoKS5nZXRNdXRhdG9yRm9yQ29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc29ydEZvckFscGhhOiB0aGlzLnNvcnRGb3JBbHBoYSxcclxuICAgICAgICBjbHJQcmltYXJ5OiB0aGlzLmNsclByaW1hcnkuc2VyaWFsaXplKCksXHJcbiAgICAgICAgY2xyU2Vjb25kYXJ5OiB0aGlzLmNsclNlY29uZGFyeS5zZXJpYWxpemUoKSxcclxuICAgICAgICBwaXZvdDogdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGlkTWF0ZXJpYWw6IHRoaXMubWF0ZXJpYWwuaWRSZXNvdXJjZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tYXRlcmlhbCA9IDxNYXRlcmlhbD5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkTWF0ZXJpYWwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNsclByaW1hcnkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY2xyUHJpbWFyeSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2xyU2Vjb25kYXJ5LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNsclNlY29uZGFyeSk7XHJcbiAgICAgIHRoaXMuc29ydEZvckFscGhhID0gX3NlcmlhbGl6YXRpb24uc29ydEZvckFscGhhO1xyXG4gICAgICBhd2FpdCB0aGlzLm10eFBpdm90LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnBpdm90KTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIE1lc2h9IHRvIHRoZSBub2RlXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWVzaCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TWVzaCk7XHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICBAdHlwZShNZXNoKVxyXG4gICAgcHVibGljIG1lc2g6IE1lc2g7XHJcbiAgICBwdWJsaWMgc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWVzaD86IE1lc2gsIF9za2VsZXRvbj86IENvbXBvbmVudFNrZWxldG9uKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgICB0aGlzLnNrZWxldG9uID0gX3NrZWxldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5tdHhXb3JsZC5zY2FsaW5nO1xyXG4gICAgICBsZXQgc2NhbGU6IG51bWJlciA9IE1hdGgubWF4KE1hdGguYWJzKHNjYWxpbmcueCksIE1hdGguYWJzKHNjYWxpbmcueSksIE1hdGguYWJzKHNjYWxpbmcueikpO1xyXG4gICAgICByZXR1cm4gdGhpcy5tZXNoLnJhZGl1cyAqIHNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICogQ2FsY3VsYXRlcyB0aGUgcG9zaXRpb24gb2YgYSB2ZXJ0ZXggdHJhbnNmb3JtZWQgYnkgdGhlIHNrZWxldG9uXHJcbiAgICAvLyAgKiBAcGFyYW0gX2luZGV4IGluZGV4IG9mIHRoZSB2ZXJ0ZXhcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGdldFZlcnRleFBvc2l0aW9uKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIC8vIGV4dHJhY3QgdGhlIHZlcnRleCBkYXRhICh2ZXJ0aWNlczogM0QgdmVjdG9ycywgYm9uZSBpbmRpY2VzICYgd2VpZ2h0czogNEQgdmVjdG9ycylcclxuICAgIC8vICAgY29uc3QgaVZlcnRleDogbnVtYmVyID0gX2luZGV4ICogMztcclxuICAgIC8vICAgY29uc3QgaUJvbmVJbmZsdWVuY2U6IG51bWJlciA9IF9pbmRleCAqIDQ7XHJcblxyXG4gICAgLy8gICBjb25zdCB2ZXJ0ZXg6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyguLi5SZWZsZWN0LmdldCh0aGlzLm1lc2gsIFwicmVuZGVyTWVzaFwiKS52ZXJ0aWNlcy5zbGljZShpVmVydGV4LCBpVmVydGV4ICsgMykpO1xyXG4gICAgLy8gICBpZiAoISh0aGlzLm1lc2ggaW5zdGFuY2VvZiBNZXNoU2tpbikpIHJldHVybiB2ZXJ0ZXg7XHJcblxyXG4gICAgLy8gICBjb25zdCBpQm9uZXM6IFVpbnQ4QXJyYXkgPSB0aGlzLm1lc2guaUJvbmVzLnNsaWNlKGlCb25lSW5mbHVlbmNlLCBpQm9uZUluZmx1ZW5jZSArIDQpO1xyXG4gICAgLy8gICBjb25zdCB3ZWlnaHRzOiBGbG9hdDMyQXJyYXkgPSB0aGlzLm1lc2gud2VpZ2h0cy5zbGljZShpQm9uZUluZmx1ZW5jZSwgaUJvbmVJbmZsdWVuY2UgKyA0KTtcclxuXHJcbiAgICAvLyAgIC8vIGdldCBib25lIG1hdHJpY2VzXHJcbiAgICAvLyAgIGNvbnN0IG10eEJvbmVzOiBBcnJheTxNYXRyaXg0eDQ+ID0gdGhpcy5za2VsZXRvbi5tdHhCb25lcztcclxuXHJcbiAgICAvLyAgIC8vIHNraW4gbWF0cml4IFMgPSBzdW1faT0xXm17d19pICogQl9pfVxyXG4gICAgLy8gICBjb25zdCBza2luTWF0cml4OiBNYXRyaXg0eDQgPSBuZXcgTWF0cml4NHg0KCk7XHJcbiAgICAvLyAgIHNraW5NYXRyaXguc2V0KEFycmF5XHJcbiAgICAvLyAgICAgLmZyb20oaUJvbmVzKVxyXG4gICAgLy8gICAgIC5tYXAoKGlCb25lLCBpV2VpZ2h0KSA9PiBtdHhCb25lc1tpQm9uZV0uZ2V0KCkubWFwKHZhbHVlID0+IHZhbHVlICogd2VpZ2h0c1tpV2VpZ2h0XSkpIC8vIGFwcGx5IHdlaWdodCBvbiBlYWNoIG1hdHJpeFxyXG4gICAgLy8gICAgIC5yZWR1Y2UoKG10eFN1bSwgbXR4Qm9uZSkgPT4gbXR4U3VtLm1hcCgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSArIG10eEJvbmVbaW5kZXhdKSkgLy8gc3VtIHVwIHRoZSBtYXRyaWNlc1xyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgLy8gdHJhbnNmb3JtIHZlcnRleFxyXG4gICAgLy8gICB2ZXJ0ZXgudHJhbnNmb3JtKHNraW5NYXRyaXgpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIHZlcnRleDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBUT0RPOiByZW1vdmUgb3IgdGhpbmsgaWYgdGhlIHRyYW5zZm9ybWVkIGJvdW5kaW5nIGJveCBpcyBvZiB2YWx1ZSBvciBjYW4gYmUgbWFkZSB0byBiZVxyXG4gICAgLy8gcHVibGljIGdldCBib3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgLy8gICBsZXQgYm94OiBCb3ggPSBSZWN5Y2xlci5nZXQoQm94KTtcclxuICAgIC8vICAgYm94LnNldChcclxuICAgIC8vICAgICBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMubWVzaC5ib3VuZGluZ0JveC5taW4sIHRoaXMubXR4V29ybGQsIHRydWUpLFxyXG4gICAgLy8gICAgIFZlY3RvcjMuVFJBTlNGT1JNQVRJT04odGhpcy5tZXNoLmJvdW5kaW5nQm94Lm1heCwgdGhpcy5tdHhXb3JsZCwgdHJ1ZSlcclxuICAgIC8vICAgKTtcclxuICAgIC8vICAgcmV0dXJuIGJveDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uO1xyXG4gICAgICAvKiBhdCB0aGlzIHBvaW50IG9mIHRpbWUsIHNlcmlhbGl6YXRpb24gYXMgcmVzb3VyY2UgYW5kIGFzIGlubGluZSBvYmplY3QgaXMgcG9zc2libGUuIFRPRE86IGNoZWNrIGlmIGlubGluZSBiZWNvbWVzIG9ic29sZXRlICovXHJcbiAgICAgIGxldCBpZE1lc2g6IHN0cmluZyA9IHRoaXMubWVzaC5pZFJlc291cmNlO1xyXG4gICAgICBpZiAoaWRNZXNoKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb24gPSB7IGlkTWVzaDogaWRNZXNoIH07XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZXJpYWxpemF0aW9uID0geyBtZXNoOiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLm1lc2gpIH07XHJcblxyXG4gICAgICBpZiAodGhpcy5za2VsZXRvbilcclxuICAgICAgICBzZXJpYWxpemF0aW9uLnNrZWxldG9uID0gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgdGhpcy5za2VsZXRvbik7XHJcblxyXG4gICAgICBzZXJpYWxpemF0aW9uLnBpdm90ID0gdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBsZXQgbWVzaDogTWVzaDtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkTWVzaClcclxuICAgICAgICBtZXNoID0gPE1lc2g+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZE1lc2gpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbWVzaCA9IDxNZXNoPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubWVzaCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IG1lc2g7XHJcblxyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uc2tlbGV0b24pIHtcclxuICAgICAgICBjb25zdCBobmROb2RlRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGhuZEdyYXBoRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbiA9IE5vZGUuRklORCh0aGlzLCBfc2VyaWFsaXphdGlvbi5za2VsZXRvbik7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHVibGljIGRyYXdHaXptb3NTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLm1lc2gpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gQ29sb3IuQ1NTKFwic2FsbW9uXCIpO1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVNZXNoKHRoaXMubWVzaCwgdGhpcy5tdHhXb3JsZCwgY29sb3IsIDAuMSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgZW51bSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgcGFydGljbGUgc3lzdGVtIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCxcclxuICAgIC8qKlBsYXlzIHBhcnRpY2xlIHN5c3RlbSBvbmNlIGFuZCBzdG9wcyBhdCB0aGUgbGFzdCBwb2ludCBpbiB0aW1lLiovXHJcbiAgICBQTEFZX09OQ0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfSB0byB0aGUgbm9kZS4gXHJcbiAgICogV29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgQ29tcG9uZW50TWVzaH0gYW5kIHtAbGluayBDb21wb25lbnRNYXRlcmlhbH0gdG8gY3JlYXRlIGEgc2hhZGVyIHBhcnRpY2xlIHN5c3RlbS5cclxuICAgKiBBZGRpdGlvbmFsbHkgYSB7QGxpbmsgQ29tcG9uZW50RmFjZUNhbWVyYX0gY2FuIGJlIGF0dGFjaGVkIHRvIG1ha2UgdGhlIHBhcnRpY2xlcyBmYWNlIHRoZSBjYW1lcmEuXHJcbiAgICogQGF1dGhvciBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb21wb25lbnRQYXJ0aWNsZVN5c3RlbS5kZWNvcmF0ZVxyXG4gIEBlbnVtZXJhYmxlXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICBAdHlwZShQYXJ0aWNsZVN5c3RlbSlcclxuICAgIHB1YmxpYyBwYXJ0aWNsZVN5c3RlbTogUGFydGljbGVTeXN0ZW07XHJcbiAgICAvKiogV2hlbiBkaXNhYmxlZCB0cnkgZW5hYmxpbmcge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsLnNvcnRGb3JBbHBoYX0gKi9cclxuICAgIHB1YmxpYyBkZXB0aE1hc2s6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgYmxlbmRNb2RlOiBCTEVORDtcclxuICAgIHB1YmxpYyBwbGF5TW9kZTogUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFO1xyXG4gICAgcHVibGljIGR1cmF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBBIHRleHR1cmUgZmlsZWQgd2l0aCByYW5kb20gbnVtYmVycy4gVXNlZCBieSB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGE6IHVua25vd247XHJcblxyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzICovXHJcbiAgICAjc2l6ZTogbnVtYmVyO1xyXG4gICAgI3RpbWVTY2FsZTogbnVtYmVyID0gMTtcclxuICAgIHJlYWRvbmx5ICN0aW1lOiBUaW1lO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcGFydGljbGVTeXN0ZW06IFBhcnRpY2xlU3lzdGVtID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnBhcnRpY2xlU3lzdGVtID0gX3BhcnRpY2xlU3lzdGVtO1xyXG4gICAgICB0aGlzLmRlcHRoTWFzayA9IHRydWU7XHJcbiAgICAgIHRoaXMuYmxlbmRNb2RlID0gQkxFTkQuQURESVRJVkU7XHJcbiAgICAgIHRoaXMucGxheU1vZGUgPSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuTE9PUDtcclxuICAgICAgdGhpcy5kdXJhdGlvbiA9IDEwMDA7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IDEwO1xyXG4gICAgICB0aGlzLiN0aW1lID0gbmV3IFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgcGFydGljbGVzXHJcbiAgICAgKi9cclxuICAgIEBlbnVtZXJhYmxlXHJcbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMuIENhdXRpb246IFNldHRpbmcgdGhpcyB3aWxsIHJlaW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlcnMgYXJyYXkodGV4dHVyZSkgdXNlZCBpbiB0aGUgc2hhZGVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNpemUoX3NpemU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzaXplID0gX3NpemU7XHJcbiAgICAgIHRoaXMuZGVsZXRlUmVuZGVyRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGltZS5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUoX3RpbWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lLnNldChfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aW1lU2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWVTY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWVTY2FsZShfc2NhbGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lU2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZVNjYWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogR2VuZXJhdGVzIGFuZCBiaW5kcyB0aGUgcmFuZG9tIG51bWJlcnMgdGV4dHVyZSBpbiBXZWJHTFxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBEZWxldGVzIHRoZSByYW5kb20gbnVtYmVycyB0ZXh0dXJlIGluIFdlYkdMIGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBncHUgbWVtb3J5LlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaWRQYXJ0aWNsZVN5c3RlbTogdGhpcy5wYXJ0aWNsZVN5c3RlbT8uaWRSZXNvdXJjZSxcclxuICAgICAgICBkZXB0aE1hc2s6IHRoaXMuZGVwdGhNYXNrLFxyXG4gICAgICAgIGJsZW5kTW9kZTogdGhpcy5ibGVuZE1vZGUsXHJcbiAgICAgICAgcGxheU1vZGU6IHRoaXMucGxheU1vZGUsXHJcbiAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXHJcbiAgICAgICAgc2l6ZTogdGhpcy5zaXplXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFBhcnRpY2xlU3lzdGVtKSB0aGlzLnBhcnRpY2xlU3lzdGVtID0gPFBhcnRpY2xlU3lzdGVtPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgIHRoaXMuZGVwdGhNYXNrID0gX3NlcmlhbGl6YXRpb24uZGVwdGhNYXNrO1xyXG4gICAgICB0aGlzLmJsZW5kTW9kZSA9IF9zZXJpYWxpemF0aW9uLmJsZW5kTW9kZTtcclxuICAgICAgdGhpcy5wbGF5TW9kZSA9IF9zZXJpYWxpemF0aW9uLnBsYXlNb2RlO1xyXG4gICAgICB0aGlzLmR1cmF0aW9uID0gX3NlcmlhbGl6YXRpb24uZHVyYXRpb247XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zZXJpYWxpemF0aW9uLnNpemU7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvckFuaW1hdGlvbigpOiBNdXRhdG9yRm9yQW5pbWF0aW9uIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3JGb3JBbmltYXRpb24gPSA8TXV0YXRvckZvckFuaW1hdGlvbj50aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IucGFydGljbGVTeXN0ZW07XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnNpemU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5ibGVuZE1vZGUpXHJcbiAgICAgICAgdHlwZXMuYmxlbmRNb2RlID0gQkxFTkQ7XHJcbiAgICAgIGlmICh0eXBlcy5wbGF5TW9kZSlcclxuICAgICAgICB0eXBlcy5wbGF5TW9kZSA9IFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERTtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBobmRFdmVudCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIEVWRU5ULk5PREVfREVTRVJJQUxJWkVEOlxyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVRpbWVTY2FsZSk7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5DT01QT05FTlRfUkVNT1ZFOlxyXG4gICAgICAgICAgVGltZS5nYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVElNRV9TQ0FMRUQsIHRoaXMudXBkYXRlVGltZVNjYWxlKTtcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFTkRFUl9QUkVQQVJFLCB0aGlzLnVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnRpbWUgPiB0aGlzLmR1cmF0aW9uKVxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGF5TW9kZSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNhc2UgUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFLkxPT1A6XHJcbiAgICAgICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuUExBWV9PTkNFOlxyXG4gICAgICAgICAgICB0aGlzLnRpbWUgPSB0aGlzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVUaW1lU2NhbGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCB0aW1lU2NhbGU6IG51bWJlciA9IHRoaXMuI3RpbWVTY2FsZSAqIFRpbWUuZ2FtZS5nZXRTY2FsZSgpO1xyXG4gICAgICB0aGlzLiN0aW1lLnNldFNjYWxlKHRpbWVTY2FsZSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIFBJQ0sge1xyXG4gICAgUkFESVVTID0gXCJyYWRpdXNcIixcclxuICAgIENBTUVSQSA9IFwiY2FtZXJhXCIsXHJcbiAgICBQSFlTSUNTID0gXCJwaHlzaWNzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIHBpY2tpbmcgZnVuY3Rpb25hbGl0eSB0byB0aGUgbm9kZVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBpY2sgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFBpY2spO1xyXG4gICAgcHVibGljIHBpY2s6IFBJQ0sgPSBQSUNLLlJBRElVUztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIHRoZSBub2RlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFJheX0gYW5kIGludm9rZXMgZXZlbnRzIGFjY29yZGluZ2x5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrQW5kRGlzcGF0Y2goX3JheTogUmF5LCBfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IGNtcE1lc2ggPyBjbXBNZXNoLm10eFdvcmxkLnRyYW5zbGF0aW9uIDogdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLnBpY2spIHtcclxuICAgICAgICBjYXNlIFBJQ0suUkFESVVTOlxyXG4gICAgICAgICAgLy8gVE9ETzogc2hvdWxkIG9ubHkgYmUgbm9kZS5yYWRpdXMuIEFkanVzdG1lbnQgbmVlZGVkLCBpZiBtZXNoIHdhcyB0cmFuc2Zvcm1lZC4uLlxyXG4gICAgICAgICAgaWYgKF9yYXkuZ2V0RGlzdGFuY2UocG9zaXRpb24pLm1hZ25pdHVkZSA8IHRoaXMubm9kZS5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSy5QSFlTSUNTOlxyXG4gICAgICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBQaHlzaWNzLnJheWNhc3QoX3JheS5vcmlnaW4sIF9yYXkuZGlyZWN0aW9uLCBWZWN0b3IzLkRJRkZFUkVOQ0UocG9zaXRpb24sIF9yYXkub3JpZ2luKS5tYWduaXR1ZGVTcXVhcmVkKTtcclxuICAgICAgICAgIGlmIChoaXRJbmZvLmhpdClcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vVE9ETzogUElDSy5DQU1FUkFcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5waWNrKVxyXG4gICAgICAgIHR5cGVzLnBpY2sgPSBQSUNLO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3Igc2NyaXB0cyB0aGUgdXNlciB3cml0ZXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFNjcmlwdCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICAvLyByZWdpc3RlcmluZyB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgb25seSBpdHMgc3ViY2xhc3Nlcy4gT3IgdGhpcyBjb21wb25lbnQgbXVzdCByZWZlciB0byBzY3JpcHRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoaXMgY29tcG9uZW50XHJcbiAgICAvLyBUT0RPOiByZXRoaW5rICYgcmVmYWN0b3JcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRTY3JpcHQpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBUZXh0dXJlVGV4dH0gdG8gdGhlIG5vZGUuIFxyXG4gICAqIFdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIENvbXBvbmVudE1lc2h9IGFuZCB7QGxpbmsgQ29tcG9uZW50TWF0ZXJpYWx9IHRvIGNyZWF0ZSBhIHRleHQgbm9kZS5cclxuICAgKiBBICd0ZXh0dXJlZCcge0BsaW5rIE1hdGVyaWFsfSAoZS5nLiB7QGxpbmsgU2hhZGVyTGl0VGV4dHVyZWR9KSBtdXN0IGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgdGV4dCBwcm9wZXJseS4gSWRlYWxseSBhIHtAbGluayBNZXNoUXVhZH0gc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0ZXh0IG9udG8uXHJcbiAgICogQWRkaXRpb25hbGx5IGEge0BsaW5rIENvbXBvbmVudEZhY2VDYW1lcmF9IGNhbiBiZSBhdHRhY2hlZCB0byBtYWtlIHRoZSB0ZXh0IGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VGV4dCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VGV4dCk7XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmU6IFRleHR1cmVUZXh0O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgLyoqIC0gb246IFRoZSB0ZXh0cyBzaXplIGlzIGZpeGVkIHRvIG1hdGNoIHRoZSBzZXQgZm9udCBzaXplXHJcbiAgICAgKiAgLSBvZmY6IFRoZSBmb250IHNpemUgaXMgc3RyZXRjaGVkIHRvIG1hdGNoIHRoZSBhdHRhY2hlZCBtZXNoZXMgc2l6ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZml4ZWRTaXplOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGV4dD86IHN0cmluZywgX2ZvbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmVUZXh0KENvbXBvbmVudFRleHQubmFtZSwgX3RleHQsIF9mb250KTtcclxuICAgICAgdGhpcy5tdHhXb3JsZCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICB0aGlzLmZpeGVkU2l6ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiBNYXRyaXg0eDQge1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICB0aGlzLm10eFdvcmxkLmNvcHkoX210eE1lc2hUb1dvcmxkKTtcclxuXHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZml4ZWRTaXplKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlOiBudW1iZXIgPSBfY21wQ2FtZXJhLmdldFdvcmxkVG9QaXhlbFNjYWxlKF9tdHhNZXNoVG9Xb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgdGhpcy5tdHhXb3JsZC5zY2FsaW5nID0gc2NhbGluZy5zZXQodGhpcy50ZXh0dXJlLndpZHRoICogc2NhbGUsIHRoaXMudGV4dHVyZS5oZWlnaHQgKiBzY2FsZSwgMSk7O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBwaXhlbHNUb1VuaXRzOiBudW1iZXIgPSAxIC8gdGhpcy50ZXh0dXJlLmhlaWdodDtcclxuICAgICAgICBzY2FsaW5nLnNldCh0aGlzLnRleHR1cmUud2lkdGggKiBwaXhlbHNUb1VuaXRzLCB0aGlzLnRleHR1cmUuaGVpZ2h0ICogcGl4ZWxzVG9Vbml0cywgMSk7XHJcbiAgICAgICAgdGhpcy5tdHhXb3JsZC5zY2FsZShzY2FsaW5nKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzLm10eFdvcmxkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAgIGxldCBtZXNoOiBNZXNoID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKT8ubWVzaDtcclxuICAgICAgbGV0IGNtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICBpZiAobWVzaCA9PSBudWxsIHx8IGNtcE1hdGVyaWFsID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdXaXJlTWVzaChtZXNoLCB0aGlzLm10eFdvcmxkLCBjbXBNYXRlcmlhbC5jbHJQcmltYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRleHR1cmUubmFtZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gQkFTRSB7XHJcbiAgICBTRUxGLCBQQVJFTlQsIFdPUkxELCBOT0RFXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHRyYW5zZm9ybS17QGxpbmsgTWF0cml4NHg0fSB0byB0aGUgbm9kZSwgbW92aW5nLCBzY2FsaW5nIGFuZCByb3RhdGluZyBpdCBpbiBzcGFjZSByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFRyYW5zZm9ybSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VHJhbnNmb3JtKTtcclxuICAgIHB1YmxpYyBtdHhMb2NhbDogTWF0cml4NHg0O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbXR4SW5pdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5tdHhMb2NhbCA9IF9tdHhJbml0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2Zvcm1hdGlvbnMgcmVzcGVjdGluZyB0aGUgaGllcmFyY2h5XHJcbiAgICAvKipcclxuICAgICAqIHJlY2FsY3VsYXRlcyB0aGlzIGxvY2FsIG1hdHJpeCB0byB5aWVsZCB0aGUgaWRlbnRpY2FsIHdvcmxkIG1hdHJpeCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbm9kZS5cclxuICAgICAqIFVzZSByZWJhc2UgYmVmb3JlIGFwcGVuZGluZyB0aGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9uZW50IHRvIGFub3RoZXIgbm9kZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgd29ybGQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWJhc2UoX25vZGU6IE5vZGUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4TG9jYWw7XHJcbiAgICAgIGxldCBjb250YWluZXI6IE5vZGUgPSB0aGlzLm5vZGU7XHJcbiAgICAgIGlmIChjb250YWluZXIpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gY29udGFpbmVyLm10eFdvcmxkO1xyXG5cclxuICAgICAgaWYgKF9ub2RlKVxyXG4gICAgICAgIG10eFJlc3VsdCA9IE1hdHJpeDR4NC5SRUxBVElWRShtdHhSZXN1bHQsIG51bGwsIF9ub2RlLm10eFdvcmxkSW52ZXJzZSk7XHJcblxyXG4gICAgICB0aGlzLm10eExvY2FsID0gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGVkIGJhc2UgKFNFTEYsIFBBUkVOVCwgV09STEQpIG9yIGEgcGFydGljdWxhciBvdGhlciBub2RlIChOT0RFKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCwgX2Jhc2U6IEJBU0UgPSBCQVNFLlNFTEYsIF9ub2RlOiBOb2RlID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBzd2l0Y2ggKF9iYXNlKSB7XHJcbiAgICAgICAgY2FzZSBCQVNFLlNFTEY6XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCQVNFLlBBUkVOVDpcclxuICAgICAgICAgIHRoaXMubXR4TG9jYWwubXVsdGlwbHkoX210eFRyYW5zZm9ybSwgdHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJBU0UuTk9ERTpcclxuICAgICAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJBU0UuTk9ERSByZXF1aXJlcyBhIG5vZGUgZ2l2ZW4gYXMgYmFzZVwiKTtcclxuICAgICAgICBjYXNlIEJBU0UuV09STEQ6XHJcbiAgICAgICAgICB0aGlzLnJlYmFzZShfbm9kZSk7XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0sIHRydWUpO1xyXG5cclxuICAgICAgICAgIGxldCBub2RlOiBOb2RlID0gdGhpcy5ub2RlO1xyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgbGV0IG10eFRlbXA6IE1hdHJpeDR4NDtcclxuICAgICAgICAgICAgaWYgKF9iYXNlID09IEJBU0UuTk9ERSkge1xyXG4gICAgICAgICAgICAgIC8vIGZpeCBtdHhXb3JsZCBvZiBjb250YWluZXIgZm9yIHN1YnNlcXVlbnQgcmViYXNpbmcgXHJcbiAgICAgICAgICAgICAgbXR4VGVtcCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9ub2RlLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IE5vZGUgPSBub2RlLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgLy8gZml4IG10eExvY2FsIGZvciBjdXJyZW50IHBhcmVudFxyXG4gICAgICAgICAgICAgIHRoaXMucmViYXNlKG5vZGUuZ2V0UGFyZW50KCkpO1xyXG4gICAgICAgICAgICAgIG10eFRlbXAgPSBNYXRyaXg0eDQuUFJPRFVDVChub2RlLmdldFBhcmVudCgpLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGxvY2FsOiB0aGlzLm10eExvY2FsLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4TG9jYWwuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubG9jYWwpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2NhbC5tdXRhdGUoX211dGF0b3IpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7IFxyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLmxvY2FsLmdldE11dGF0b3IoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgIC8vICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHRoaXMubG9jYWwuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgIC8vICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLndvcmxkO1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgVlIgQ29udHJvbGxlciBhbmQgaXRzIGNhcGFiaWxpdGllcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVlJDb250cm9sbGVyIHtcclxuICAgIHB1YmxpYyBjbXBUcmFuc2Zvcm06IENvbXBvbmVudFRyYW5zZm9ybSA9IG51bGw7XHJcbiAgICBwdWJsaWMgZ2FtZVBhZDogR2FtZXBhZCA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1g6IG51bWJlciA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1k6IG51bWJlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWUiBDb21wb25lbnQgQ2xhc3MsIGZvciBTZXNzaW9uIE1hbmFnZW1lbnQsIENvbnRyb2xsZXIgTWFuYWdlbWVudCBhbmQgUmVmZXJlbmNlIFNwYWNlIE1hbmFnZW1lbnQuIFxyXG4gICAqIEBhdXRob3IgVmFsZW50aW4gU2NobWlkYmVyZ2VyLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VlJEZXZpY2UgZXh0ZW5kcyBDb21wb25lbnRDYW1lcmEge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFZSRGV2aWNlKTtcclxuICAgIHB1YmxpYyByaWdodENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcbiAgICBwdWJsaWMgbGVmdENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcblxyXG4gICAgI210eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5nZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYWN0dWFsIG1hdHJpeCBvZiB0aGUgdnIgLSBkZXZpY2UuXHJcbiAgICAgKiBDcmVhdG9ycyBzaG91bGQgdXNlIHRoaXMgZm9yIHJlYWRvbmx5IHB1cnBvc2VzLiAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbXR4TG9jYWwoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIFZlY3RvcjMgYXMgUG9zaXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGlvbihfdHJhbnNsYXRpb246IFZlY3RvcjMpIHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gX3RyYW5zbGF0aW9uLmNsb25lO1xyXG4gICAgICB0cmFuc2xhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbik7XHJcbiAgICAgIHRyYW5zbGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0odHJhbnNsYXRpb24pKTtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24gPSBfdHJhbnNsYXRpb247XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgVmVjdG9yMyBSb3RhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICBsZXQgcm90YXRpb246IFZlY3RvcjMgPSBfcm90YXRpb24uY2xvbmU7IFxyXG4gICAgICByb3RhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC5yb3RhdGlvbik7XHJcbiAgICAgIHJvdGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBsZXQgb3JpZW50YXRpb246IFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG4gICAgICBvcmllbnRhdGlvbi5ldWxlckFuZ2xlcyA9IHJvdGF0aW9uO1xyXG4gICAgICAvLyBSb3RhdGlvbiBuZWVkcyB0byBiZSBzZXQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0aW9uID0gX3JvdGF0aW9uO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVmVjdG9yMyBpbiBQb3NpdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBfYnkuY2xvbmU7XHJcbiAgICAgIHRyYW5zbGF0aW9uLnRyYW5zZm9ybSh0aGlzLiNtdHhMb2NhbC5xdWF0ZXJuaW9uKTtcclxuICAgICAgdHJhbnNsYXRpb24ubmVnYXRlKCk7XHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybSh0cmFuc2xhdGlvbikpO1xyXG4gICAgICB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGUoX2J5KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFZlY3RvcjMgaW4gUm90YXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZShfYnk6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHJvdGF0aW9uOiBWZWN0b3IzID0gX2J5LmNsb25lLm5lZ2F0ZSgpOyBcclxuICAgICAgbGV0IG9yaWVudGF0aW9uOiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgICAgb3JpZW50YXRpb24uZXVsZXJBbmdsZXMgPSByb3RhdGlvbjtcclxuICAgICAgLy8gUm90YXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0ZShfYnkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0oKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI210eExvY2FsID0gdGhpcy5ub2RlLm10eExvY2FsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX0NPTlRST0wge1xyXG4gICAgSU5QVVQgPSBcImlucHV0XCIsXHJcbiAgICBPVVRQVVQgPSBcIm91dHB1dFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgY29uc3QgZW51bSBDT05UUk9MX1RZUEUge1xyXG4gICAgLyoqIFRoZSBvdXRwdXQgc2ltcGx5IGZvbGxvd3MgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgUFJPUE9SVElPTkFMLFxyXG4gICAgLyoqIFRoZSBvdXRwdXQgdmFsdWUgY2hhbmdlcyBvdmVyIHRpbWUgd2l0aCBhIHJhdGUgZ2l2ZW4gYnkgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgSU5URUdSQUwsXHJcbiAgICAvKiogVGhlIG91dHB1dCB2YWx1ZSByZWFjdHMgdG8gY2hhbmdlcyBvZiB0aGUgc2NhbGVkIGlucHV0IGFuZCBkcm9wcyB0byAwIHdpdGggZ2l2ZW4gZGVsYXksIGlmIGlucHV0IHJlbWFpbnMgY29uc3RhbnQgKi9cclxuICAgIERJRkZFUkVOVElBTFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2Vzc2VzIGlucHV0IHNpZ25hbHMgb2YgdHlwZSBudW1iZXIgYW5kIGdlbmVyYXRlcyBhbiBvdXRwdXQgc2lnbmFsIG9mIHRoZSBzYW1lIHR5cGUgdXNpbmcgXHJcbiAgICogcHJvcG9ydGlvbmFsLCBpbnRlZ3JhbCBvciBkaWZmZXJlbnRpYWwgbWFwcGluZywgYW4gYW1wbGlmaWNhdGlvbiBmYWN0b3IgYW5kIGEgbGluZWFyIGRhbXBlbmluZy9kZWxheVxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAg4pSCICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgcGFzcyB0aHJvdWdoIChQcm9wb3J0aW9uYWwpICAgICAg4pSCXHJcbiAgICogSW5wdXQg4oaSIOKUgiDihpIg4pSCYW1wbGlmeeKUgiDihpIg4pSCZGVsYXnilIIg4oaSIOKanyBzdW0gdXAgb3ZlciB0aW1lIChJbnRlZ3JhbCkg4pqeIOKGkiDilIIg4oaSIE91dHB1dFxyXG4gICAqICAgICAgICAg4pSCICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgcGFzcyBjaGFuZ2UgIChEaWZmZXJlbnRpYWwpICAgICAg4pSCXHJcbiAgICogICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbnRyb2wgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQ09OVFJPTF9UWVBFO1xyXG4gICAgcHVibGljIGFjdGl2ZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJhdGVEaXNwYXRjaE91dHB1dDogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB2YWx1ZVByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dEJhc2U6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0VGFyZ2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFRhcmdldFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGZhY3RvcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdGltZTogVGltZSA9IFRpbWUuZ2FtZTtcclxuICAgIHByb3RlY3RlZCB0aW1lVmFsdWVEZWxheTogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB0aW1lT3V0cHV0VGFyZ2V0U2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGlkVGltZXI6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZywgX2ZhY3RvcjogbnVtYmVyID0gMSwgX3R5cGU6IENPTlRST0xfVFlQRSA9IENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUwsIF9kZWxheTogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmZhY3RvciA9IF9mYWN0b3I7XHJcbiAgICAgIHRoaXMudHlwZSA9IF90eXBlO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLnNldERlbGF5KF9kZWxheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRpbWUtb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IGluIHtAbGluayBDT05UUk9MX1RZUEUuSU5URUdSQUx9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUaW1lYmFzZShfdGltZTogVGltZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRpbWUgPSBfdGltZTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZlZWQgYW4gaW5wdXQgdmFsdWUgaW50byB0aGlzIGNvbnRyb2wgYW5kIGZpcmUgdGhlIGV2ZW50cyB7QGxpbmsgRVZFTlRfQ09OVFJPTC5JTlBVVH0gYW5kIHtAbGluayBFVkVOVF9DT05UUk9MLk9VVFBVVH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldElucHV0KF9pbnB1dDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5vdXRwdXRCYXNlID0gdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuICAgICAgdGhpcy5vdXRwdXRUYXJnZXQgPSB0aGlzLmZhY3RvciAqIF9pbnB1dDtcclxuICAgICAgdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0ID0gdGhpcy50aW1lLmdldCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudHlwZSA9PSBDT05UUk9MX1RZUEUuRElGRkVSRU5USUFMKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5vdXRwdXRUYXJnZXQgLSB0aGlzLm91dHB1dFRhcmdldFByZXZpb3VzO1xyXG4gICAgICAgIHRoaXMub3V0cHV0VGFyZ2V0UHJldmlvdXMgPSB0aGlzLm91dHB1dFRhcmdldDtcclxuICAgICAgICB0aGlzLm91dHB1dFRhcmdldCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlRfQ09OVFJPTC5JTlBVVCkpO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09IENPTlRST0xfVFlQRS5ESUZGRVJFTlRJQUwpXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dCh0aGlzLnZhbHVlUHJldmlvdXMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE86IGRlc2NyaWJlIVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHVsc2UoX2lucHV0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXRJbnB1dChfaW5wdXQpO1xyXG4gICAgICB0aGlzLnNldElucHV0KDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0aW1lIHRvIHRha2UgZm9yIHRoZSBpbnRlcm5hbCBsaW5lYXIgZGFtcGVuaW5nIHVudGlsIHRoZSBmaW5hbCBvdXB1dCB2YWx1ZSBpcyByZWFjaGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXREZWxheShfdGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGltZVZhbHVlRGVsYXkgPSBNYXRoLm1heCgwLCBfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBvdXRwdXQtZXZlbnRzIHRvIGRpc3BhdGNoIHBlciBzZWNvbmQuIFxyXG4gICAgICogQXQgdGhlIGRlZmF1bHQgb2YgMCwgdGhlIGNvbnRyb2wgb3V0cHV0IG11c3QgYmUgcG9sbGVkIGFuZCB3aWxsIG9ubHkgYWN0aXZlbHkgZGlzcGF0Y2hlZCBvbmNlIGVhY2ggdGltZSBpbnB1dCBvY2N1cnMgYW5kIHRoZSBvdXRwdXQgY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFJhdGVEaXNwYXRjaE91dHB1dChfcmF0ZURpc3BhdGNoT3V0cHV0OiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0ID0gX3JhdGVEaXNwYXRjaE91dHB1dDtcclxuICAgICAgdGhpcy50aW1lLmRlbGV0ZVRpbWVyKHRoaXMuaWRUaW1lcik7XHJcbiAgICAgIHRoaXMuaWRUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0KVxyXG4gICAgICAgIHRoaXMuaWRUaW1lciA9IHRoaXMudGltZS5zZXRUaW1lcigxMDAwIC8gdGhpcy5yYXRlRGlzcGF0Y2hPdXRwdXQsIDAsIHRoaXMuZGlzcGF0Y2hPdXRwdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmYWN0b3IgdG8gbXVsdGlwbHkgdGhlIGlucHV0IHZhbHVlIGdpdmVuIHdpdGgge0BsaW5rIHNldElucHV0fSB3aXRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRGYWN0b3IoX2ZhY3RvcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZmFjdG9yID0gX2ZhY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlT3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBvdXRwdXQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBDT05UUk9MX1RZUEUuSU5URUdSQUw6XHJcbiAgICAgICAgICBsZXQgdGltZUN1cnJlbnQ6IG51bWJlciA9IHRoaXMudGltZS5nZXQoKTtcclxuICAgICAgICAgIGxldCB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ6IG51bWJlciA9IHRpbWVDdXJyZW50IC0gdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0O1xyXG4gICAgICAgICAgb3V0cHV0ID0gdGhpcy5vdXRwdXRCYXNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVWYWx1ZURlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTaW5jZUlucHV0IDwgdGhpcy50aW1lVmFsdWVEZWxheSkge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgICB0aW1lRWxhcHNlZFNpbmNlSW5wdXQgLT0gdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb3V0cHV0ICs9IHZhbHVlICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgLy8gdmFsdWUgKz0gMC41ICogKHRoaXMuaW5wdXRQcmV2aW91cyAtIGlucHV0KSAqIHRoaXMudGltZUlucHV0RGVsYXkgKyBpbnB1dCAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09OVFJPTF9UWVBFLkRJRkZFUkVOVElBTDpcclxuICAgICAgICBjYXNlIENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUw6XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG91dHB1dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FsY3VsYXRlcyB0aGUgb3V0cHV0IGNvbnNpZGVyaW5nIHRoZSB0aW1lIG9mIHRoZSBkZWxheVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbHVlRGVsYXllZCgpOiBudW1iZXIge1xyXG4gICAgICBpZiAodGhpcy50aW1lVmFsdWVEZWxheSA+IDApIHtcclxuICAgICAgICBsZXQgdGltZUVsYXBzZWRTaW5jZUlucHV0OiBudW1iZXIgPSB0aGlzLnRpbWUuZ2V0KCkgLSB0aGlzLnRpbWVPdXRwdXRUYXJnZXRTZXQ7XHJcbiAgICAgICAgaWYgKHRpbWVFbGFwc2VkU2luY2VJbnB1dCA8IHRoaXMudGltZVZhbHVlRGVsYXkpXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVByZXZpb3VzICsgKHRoaXMub3V0cHV0VGFyZ2V0IC0gdGhpcy52YWx1ZVByZXZpb3VzKSAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dCAvIHRoaXMudGltZVZhbHVlRGVsYXk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzcGF0Y2hPdXRwdXQgPSAoX2V2ZW50T3JWYWx1ZTogRXZlbnRUaW1lciB8IG51bWJlcik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCB0aW1lcjogVGltZXIgPSB0aGlzLnRpbWUuZ2V0VGltZXIodGhpcy5pZFRpbWVyKTtcclxuICAgICAgbGV0IG91dHB1dDogbnVtYmVyO1xyXG4gICAgICBpZiAodHlwZW9mIChfZXZlbnRPclZhbHVlKSA9PSBcIm51bWJlclwiKVxyXG4gICAgICAgIG91dHB1dCA9IF9ldmVudE9yVmFsdWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgICBsZXQgb3V0cHV0Q2hhbmdlZDogYm9vbGVhbiA9IChvdXRwdXQgIT0gdGhpcy5vdXRwdXRQcmV2aW91cyk7XHJcblxyXG4gICAgICBpZiAodGltZXIpIHtcclxuICAgICAgICB0aW1lci5hY3RpdmUgPSBvdXRwdXRDaGFuZ2VkO1xyXG4gICAgICAgIGlmICghb3V0cHV0Q2hhbmdlZClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vdXRwdXRQcmV2aW91cyA9IG91dHB1dDtcclxuXHJcbiAgICAgIGxldCBldmVudDogQ3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRVZFTlRfQ09OVFJPTC5PVVRQVVQsIHtcclxuICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgIG91dHB1dDogb3V0cHV0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIkNvbnRyb2wudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgbXVsdGlwbGUgY29udHJvbHMgYXMgaW5wdXRzIGFuZCBjcmVhdGVzIGFuIG91dHB1dCBmcm9tIHRoYXQuXHJcbiAgICogQXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ29udHJvbH0sIGF4aXMgY2FsY3VsYXRlcyB0aGUgb3VwdXQgc3VtbWluZyB1cCB0aGUgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSByZXN1bHQgdXNpbmcgaXRzIG93biBzZXR0aW5ncy4gIFxyXG4gICAqIERpc3BhdGNoZXMge0BsaW5rIEVWRU5UX0NPTlRST0wuT1VUUFVUfSBhbmQge0BsaW5rIEVWRU5UX0NPTlRST0wuSU5QVVR9IHdoZW4gb25lIG9mIHRoZSBjb250cm9scyBkaXNwYXRjaGVzIHRoZW0uXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcclxuICAgKiAgICAgICAgICAg4pSCIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICBcXOKUjOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCLS0t4pSCc3Vt4pSCIOKGkiDilIJpbnRlcm5hbCBjb250cm9sIOKUgiDihpIg4pSCIOKGkiBPdXRwdXRcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgL+KUlOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICBJbnB1dCDihpIg4pSCIOKUgmNvbnRyb2zilIIvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggIFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBeGlzIGV4dGVuZHMgQ29udHJvbCB7XHJcbiAgICBwcml2YXRlIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBDb250cm9sPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgc3VtUHJldmlvdXM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgdGhlIGNvbnRyb2wgZ2l2ZW4gdG8gdGhlIGxpc3Qgb2YgY29udHJvbHMgZmVlZGluZyBpbnRvIHRoaXMgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQ29udHJvbChfY29udHJvbDogQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNvbnRyb2xzLnNldChfY29udHJvbC5uYW1lLCBfY29udHJvbCk7XHJcbiAgICAgIF9jb250cm9sLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQ09OVFJPTC5JTlBVVCwgdGhpcy5obmRJbnB1dEV2ZW50KTtcclxuICAgICAgX2NvbnRyb2wuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbnRyb2woX25hbWU6IHN0cmluZyk6IENvbnRyb2wge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb250cm9scy5nZXQoX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDb250cm9sKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgbGV0IGNvbnRyb2w6IENvbnRyb2wgPSB0aGlzLmdldENvbnRyb2woX25hbWUpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLklOUFVULCB0aGlzLmhuZElucHV0RXZlbnQpO1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9scy5kZWxldGUoX25hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF4aXMgYWZ0ZXIgc3VtbWluZyB1cCBhbGwgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSBzdW0gYWNjb3JkaW5nIHRvIHRoZSBheGlzJyBzZXR0aW5nc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzdW1JbnB1dDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xzKSB7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sWzFdLmFjdGl2ZSlcclxuICAgICAgICAgIHN1bUlucHV0ICs9IGNvbnRyb2xbMV0uZ2V0T3V0cHV0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdW1JbnB1dCAhPSB0aGlzLnN1bVByZXZpb3VzKVxyXG4gICAgICAgIHN1cGVyLnNldElucHV0KHN1bUlucHV0KTtcclxuXHJcbiAgICAgIHRoaXMuc3VtUHJldmlvdXMgPSBzdW1JbnB1dDtcclxuXHJcbiAgICAgIHJldHVybiBzdXBlci5nZXRPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZE91dHB1dEV2ZW50OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgY29udHJvbDogQ29udHJvbCA9ICg8Q29udHJvbD5fZXZlbnQudGFyZ2V0KTtcclxuICAgICAgbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVF9DT05UUk9MLk9VVFBVVCwge1xyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgY29udHJvbDogY29udHJvbCxcclxuICAgICAgICAgIGlucHV0OiAoPEN1c3RvbUV2ZW50Pl9ldmVudCkuZGV0YWlsLm91dHB1dCxcclxuICAgICAgICAgIG91dHB1dDogdGhpcy5nZXRPdXRwdXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaG5kSW5wdXRFdmVudDogRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGV2ZW50OiBFdmVudCA9IG5ldyBFdmVudChFVkVOVF9DT05UUk9MLklOUFVULCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBpbnRlcmZhY2UgS2V5UHJlc3NlZCB7XHJcbiAgICBbY29kZTogc3RyaW5nXTogYm9vbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxlY3RzIHRoZSBrZXlzIHByZXNzZWQgb24gdGhlIGtleWJvYXJkIGFuZCBzdG9yZXMgdGhlaXIgc3RhdHVzLiBcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5Ym9hcmQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMga2V5c1ByZXNzZWQ6IEtleVByZXNzZWQgPSBLZXlib2FyZC5pbml0aWFsaXplKCk7XHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBjb2RlX2VuOiBPYmplY3Q7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBnaXZlbiBrZXlzIGlzIGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZE9uZShfa2V5czogS0VZQk9BUkRfQ09ERVtdKTogYm9vbGVhbiB7XHJcbiAgICAgIGZvciAobGV0IGNvZGUgb2YgX2tleXMpIHtcclxuICAgICAgICBpZiAoS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZENvbWJvKF9rZXlzOiBLRVlCT0FSRF9DT0RFW10pOiBib29sZWFuIHtcclxuICAgICAgZm9yIChsZXQgY29kZSBvZiBfa2V5cykge1xyXG4gICAgICAgIGlmICghS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBnaXZlbiBhcyBfYWN0aXZlIGlmIG9uZSBvciwgd2hlbiBfY29tYm8gaXMgdHJ1ZSwgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBwcmVzc2VkLlxyXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZ2l2ZW4gYXMgX2luYWN0aXZlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1ZhbHVlPFQ+KF9hY3RpdmU6IFQsIF9pbmFjdGl2ZTogVCwgX2tleXM6IEtFWUJPQVJEX0NPREVbXSwgX2NvbWJvOiBib29sZWFuID0gZmFsc2UpOiBUIHtcclxuICAgICAgaWYgKCFfY29tYm8gJiYgS2V5Ym9hcmQuaXNQcmVzc2VkT25lKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgaWYgKEtleWJvYXJkLmlzUHJlc3NlZENvbWJvKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgcmV0dXJuIF9pbmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBiYWxhbmNlZCB0ZXJuYXJ5IHZhbHVlIChlaXRoZXIgLTEsIDAgb3IgMSkgXHJcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG1hdGNoIG9mIHRoZSBrZXlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGFuZCB0aGUgbGlzdHMgb2Yga2V5cyBnaXZlbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1RyaXQoX3Bvc2l0aXZlOiBLRVlCT0FSRF9DT0RFW10sIF9uZWdhdGl2ZTogS0VZQk9BUkRfQ09ERVtdKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIEtleWJvYXJkLm1hcFRvVmFsdWUoLTEsIDAsIF9uZWdhdGl2ZSkgKyBLZXlib2FyZC5tYXBUb1ZhbHVlKDEsIDAsIF9wb3NpdGl2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBsb2NhbGUoX2tleWJvYXJkOiBPYmplY3QpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFLZXlib2FyZC5jb2RlX2VuKSB7XHJcbiAgICAvLyAgICAgLy8gc2F2ZSBvcmlnaW5hbCBrZXlib2FyZCBjb2RlcyB0byBiZSBhYmxlIHRvIHN3aXRjaCBiYWNrIGxhdGVyXHJcbiAgICAvLyAgICAgS2V5Ym9hcmQuY29kZV9lbiA9IHt9O1xyXG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oS2V5Ym9hcmQuY29kZV9lbiwgS0VZQk9BUkRfQ09ERSk7XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGZvciAobGV0IGtleSBpbiBfa2V5Ym9hcmQpIHtcclxuICAgIC8vICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IFJlZmxlY3QuZ2V0KF9rZXlib2FyZCwga2V5KTtcclxuICAgIC8vICAgICBmb3IgKGxldCBvcmlnaW5hbCBpbiBLRVlCT0FSRF9DT0RFKVxyXG4gICAgLy8gICAgICAgaWYgKFJlZmxlY3QuZ2V0KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKSA9PSB2YWx1ZSlcclxuICAgIC8vICAgICAgICAgLy8gcmVtb3ZlIG9yaWdpbmFsIGtleSB0aGUgeWllbGRzIHRoZSB2YWx1ZVxyXG4gICAgLy8gICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKTtcclxuICAgIC8vICAgICAvLyBhZGQgbmV3IGtleSB0byB5aWVsZCB0aGF0IHZhbHVlXHJcbiAgICAvLyAgICAgUmVmbGVjdC5zZXQoS0VZQk9BUkRfQ09ERSwga2V5LCB2YWx1ZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbml0aWFsaXplKCk6IEtleVByZXNzZWQge1xyXG4gICAgICBsZXQgc3RvcmU6IEtleVByZXNzZWQgPSB7fTtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICByZXR1cm4gc3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaG5kS2V5SW50ZXJhY3Rpb24oX2V2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIEtleWJvYXJkLmtleXNQcmVzc2VkW19ldmVudC5jb2RlXSA9IChfZXZlbnQudHlwZSA9PSBcImtleWRvd25cIik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGluZyB0byB0aGUgYWxlcnQgYm94XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnQWxlcnQgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuSU5GT10pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkxPR106IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5MT0ddKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLldBUk5dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5FUlJPUl0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkZVREdFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuU09VUkNFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLlNPVVJDRV0pXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYXJnczogc3RyaW5nW10gPSBfYXJncy5tYXAoX2FyZyA9PiBfYXJnLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGxldCBvdXQ6IHN0cmluZyA9IF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIGFyZ3MpO1xyXG4gICAgICAgIGFsZXJ0KG91dCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIGEgSFRNTERpYWxvZ0VsZW1lbnRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWdEaWFsb2cgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICAvLyBUT0RPOiBjaGVja291dCBIVE1MRGlhbG9nRWxlbWVudDsgISEhXHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGUgdG8gYW4gSFRNTFRleHRBcmVhLCBtYXkgYmUgb2Jzb2xldGUgd2hlbiB1c2luZyBIVE1MRGlhbG9nRWxlbWVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z1RleHRBcmVhIGV4dGVuZHMgRGVidWdUYXJnZXQge1xyXG4gICAgcHVibGljIHN0YXRpYyB0ZXh0QXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYXV0b1Njcm9sbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWxlZ2F0ZXM6IE1hcERlYnVnRmlsdGVyVG9EZWxlZ2F0ZSA9IHtcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5JTkZPXTogRGVidWdUZXh0QXJlYS5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLklORk9dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuTE9HXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuV0FSTl06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5XQVJOXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuRVJST1JdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuRVJST1JdKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5GVURHRV0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkNMRUFSXTogRGVidWdUZXh0QXJlYS5jbGVhcixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUF06IERlYnVnVGV4dEFyZWEuZ3JvdXAsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRURdOiBEZWJ1Z1RleHRBcmVhLmdyb3VwLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQRU5EXTogRGVidWdUZXh0QXJlYS5ncm91cEVuZCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgIH07XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncm91cHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIHRleHQgYXJlYSBhbmQgdGhlIGdyb3Vwc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnRleHRDb250ZW50ID0gXCJcIjtcclxuICAgICAgRGVidWdUZXh0QXJlYS5ncm91cHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJlZ2lucyBhIG5ldyBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXAoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KFwi4pa8IFwiICsgX25hbWUpO1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wdXNoKF9uYW1lKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5kcyB0aGUgbGFzdCBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwRW5kKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIF9hcmdzKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJbmRlbnRhdGlvbihfbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfbGV2ZWw7IGkrKylcclxuICAgICAgICByZXN1bHQgKz0gXCJ8IFwiO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHByaW50KF90ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS50ZXh0Q29udGVudCArPSBEZWJ1Z1RleHRBcmVhLmdldEluZGVudGF0aW9uKERlYnVnVGV4dEFyZWEuZ3JvdXBzLmxlbmd0aCkgKyBfdGV4dCArIFwiXFxuXCI7XHJcbiAgICAgIGlmIChEZWJ1Z1RleHRBcmVhLmF1dG9TY3JvbGwpXHJcbiAgICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS5zY3JvbGxUb3AgPSBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnNjcm9sbEhlaWdodDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgY29kZXMgc2VudCBmcm9tIGEgc3RhbmRhcmQgZW5nbGlzaCBrZXlib2FyZCBsYXlvdXRcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFIHtcclxuICAgIEEgPSBcIktleUFcIixcclxuICAgIEIgPSBcIktleUJcIixcclxuICAgIEMgPSBcIktleUNcIixcclxuICAgIEQgPSBcIktleURcIixcclxuICAgIEUgPSBcIktleUVcIixcclxuICAgIEYgPSBcIktleUZcIixcclxuICAgIEcgPSBcIktleUdcIixcclxuICAgIEggPSBcIktleUhcIixcclxuICAgIEkgPSBcIktleUlcIixcclxuICAgIEogPSBcIktleUpcIixcclxuICAgIEsgPSBcIktleUtcIixcclxuICAgIEwgPSBcIktleUxcIixcclxuICAgIE0gPSBcIktleU1cIixcclxuICAgIE4gPSBcIktleU5cIixcclxuICAgIE8gPSBcIktleU9cIixcclxuICAgIFAgPSBcIktleVBcIixcclxuICAgIFEgPSBcIktleVFcIixcclxuICAgIFIgPSBcIktleVJcIixcclxuICAgIFMgPSBcIktleVNcIixcclxuICAgIFQgPSBcIktleVRcIixcclxuICAgIFUgPSBcIktleVVcIixcclxuICAgIFYgPSBcIktleVZcIixcclxuICAgIFcgPSBcIktleVdcIixcclxuICAgIFggPSBcIktleVhcIixcclxuICAgIFkgPSBcIktleVlcIixcclxuICAgIFogPSBcIktleVpcIixcclxuICAgIEVTQyA9IFwiRXNjYXBlXCIsXHJcbiAgICBaRVJPID0gXCJEaWdpdDBcIixcclxuICAgIE9ORSA9IFwiRGlnaXQxXCIsXHJcbiAgICBUV08gPSBcIkRpZ2l0MlwiLFxyXG4gICAgVEhSRUUgPSBcIkRpZ2l0M1wiLFxyXG4gICAgRk9VUiA9IFwiRGlnaXQ0XCIsXHJcbiAgICBGSVZFID0gXCJEaWdpdDVcIixcclxuICAgIFNJWCA9IFwiRGlnaXQ2XCIsXHJcbiAgICBTRVZFTiA9IFwiRGlnaXQ3XCIsXHJcbiAgICBFSUdIVCA9IFwiRGlnaXQ4XCIsXHJcbiAgICBOSU5FID0gXCJEaWdpdDlcIixcclxuICAgIE1JTlVTID0gXCJNaW51c1wiLFxyXG4gICAgRVFVQUwgPSBcIkVxdWFsXCIsXHJcbiAgICBCQUNLU1BBQ0UgPSBcIkJhY2tzcGFjZVwiLFxyXG4gICAgVEFCVUxBVE9SID0gXCJUYWJcIixcclxuICAgIEJSQUNLRVRfTEVGVCA9IFwiQnJhY2tldExlZnRcIixcclxuICAgIEJSQUNLRVRfUklHSFQgPSBcIkJyYWNrZXRSaWdodFwiLFxyXG4gICAgRU5URVIgPSBcIkVudGVyXCIsXHJcbiAgICBDVFJMX0xFRlQgPSBcIkNvbnRyb2xMZWZ0XCIsXHJcbiAgICBTRU1JQ09MT04gPSBcIlNlbWljb2xvblwiLFxyXG4gICAgUVVPVEUgPSBcIlF1b3RlXCIsXHJcbiAgICBCQUNLX1FVT1RFID0gXCJCYWNrcXVvdGVcIixcclxuICAgIFNISUZUX0xFRlQgPSBcIlNoaWZ0TGVmdFwiLFxyXG4gICAgQkFDS1NMQVNIID0gXCJCYWNrc2xhc2hcIixcclxuICAgIENPTU1BID0gXCJDb21tYVwiLFxyXG4gICAgUEVSSU9EID0gXCJQZXJpb2RcIixcclxuICAgIFNMQVNIID0gXCJTbGFzaFwiLFxyXG4gICAgU0hJRlRfUklHSFQgPSBcIlNoaWZ0UmlnaHRcIixcclxuICAgIE5VTVBBRF9NVUxUSVBMWSA9IFwiTnVtcGFkTXVsdGlwbHlcIixcclxuICAgIEFMVF9MRUZUID0gXCJBbHRMZWZ0XCIsXHJcbiAgICBTUEFDRSA9IFwiU3BhY2VcIixcclxuICAgIENBUFNfTE9DSyA9IFwiQ2Fwc0xvY2tcIixcclxuICAgIEYxID0gXCJGMVwiLFxyXG4gICAgRjIgPSBcIkYyXCIsXHJcbiAgICBGMyA9IFwiRjNcIixcclxuICAgIEY0ID0gXCJGNFwiLFxyXG4gICAgRjUgPSBcIkY1XCIsXHJcbiAgICBGNiA9IFwiRjZcIixcclxuICAgIEY3ID0gXCJGN1wiLFxyXG4gICAgRjggPSBcIkY4XCIsXHJcbiAgICBGOSA9IFwiRjlcIixcclxuICAgIEYxMCA9IFwiRjEwXCIsXHJcbiAgICBQQVVTRSA9IFwiUGF1c2VcIixcclxuICAgIFNDUk9MTF9MT0NLID0gXCJTY3JvbGxMb2NrXCIsXHJcbiAgICBOVU1QQUQ3ID0gXCJOdW1wYWQ3XCIsXHJcbiAgICBOVU1QQUQ4ID0gXCJOdW1wYWQ4XCIsXHJcbiAgICBOVU1QQUQ5ID0gXCJOdW1wYWQ5XCIsXHJcbiAgICBOVU1QQURfU1VCVFJBQ1QgPSBcIk51bXBhZFN1YnRyYWN0XCIsXHJcbiAgICBOVU1QQUQ0ID0gXCJOdW1wYWQ0XCIsXHJcbiAgICBOVU1QQUQ1ID0gXCJOdW1wYWQ1XCIsXHJcbiAgICBOVU1QQUQ2ID0gXCJOdW1wYWQ2XCIsXHJcbiAgICBOVU1QQURfQUREID0gXCJOdW1wYWRBZGRcIixcclxuICAgIE5VTVBBRDEgPSBcIk51bXBhZDFcIixcclxuICAgIE5VTVBBRDIgPSBcIk51bXBhZDJcIixcclxuICAgIE5VTVBBRDMgPSBcIk51bXBhZDNcIixcclxuICAgIE5VTVBBRDAgPSBcIk51bXBhZDBcIixcclxuICAgIE5VTVBBRF9ERUNJTUFMID0gXCJOdW1wYWREZWNpbWFsXCIsXHJcbiAgICBQUklOVF9TQ1JFRU4gPSBcIlByaW50U2NyZWVuXCIsXHJcbiAgICBJTlRMX0JBQ0tfU0xBU0ggPSBcIkludGxCYWNrU2xhc2hcIixcclxuICAgIEYxMSA9IFwiRjExXCIsXHJcbiAgICBGMTIgPSBcIkYxMlwiLFxyXG4gICAgTlVNUEFEX0VRVUFMID0gXCJOdW1wYWRFcXVhbFwiLFxyXG4gICAgRjEzID0gXCJGMTNcIixcclxuICAgIEYxNCA9IFwiRjE0XCIsXHJcbiAgICBGMTUgPSBcIkYxNVwiLFxyXG4gICAgRjE2ID0gXCJGMTZcIixcclxuICAgIEYxNyA9IFwiRjE3XCIsXHJcbiAgICBGMTggPSBcIkYxOFwiLFxyXG4gICAgRjE5ID0gXCJGMTlcIixcclxuICAgIEYyMCA9IFwiRjIwXCIsXHJcbiAgICBGMjEgPSBcIkYyMVwiLFxyXG4gICAgRjIyID0gXCJGMjJcIixcclxuICAgIEYyMyA9IFwiRjIzXCIsXHJcbiAgICBGMjQgPSBcIkYyNFwiLFxyXG4gICAgS0FOQV9NT0RFID0gXCJLYW5hTW9kZVwiLFxyXG4gICAgTEFORzIgPSBcIkxhbmcyXCIsXHJcbiAgICBMQU5HMSA9IFwiTGFuZzFcIixcclxuICAgIElOVExfUk8gPSBcIkludGxSb1wiLFxyXG4gICAgQ09OVkVSVCA9IFwiQ29udmVydFwiLFxyXG4gICAgTk9OX0NPTlZFUlQgPSBcIk5vbkNvbnZlcnRcIixcclxuICAgIElOVExfWUVOID0gXCJJbnRsWWVuXCIsXHJcbiAgICBOVU1QQURfQ09NTUEgPSBcIk51bXBhZENvbW1hXCIsXHJcbiAgICBVTkRPID0gXCJVbmRvXCIsXHJcbiAgICBQQVNURSA9IFwiUGFzdGVcIixcclxuICAgIE1FRElBX1RSQUNLX1BSRVZJT1VTID0gXCJNZWRpYVRyYWNrUHJldmlvdXNcIixcclxuICAgIENVVCA9IFwiQ3V0XCIsXHJcbiAgICBDT1BZID0gXCJDb3B5XCIsXHJcbiAgICBNRURJQV9UUkFDS19ORVhUID0gXCJNZWRpYVRyYWNrTmV4dFwiLFxyXG4gICAgTlVNUEFEX0VOVEVSID0gXCJOdW1wYWRFbnRlclwiLFxyXG4gICAgQ1RSTF9SSUdIVCA9IFwiQ29udHJvbFJpZ2h0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfTVVURSA9IFwiQXVkaW9Wb2x1bWVNdXRlXCIsXHJcbiAgICBMQVVOQ0hfQVBQMiA9IFwiTGF1bmNoQXBwMlwiLFxyXG4gICAgTUVESUFfUExBWV9QQVVTRSA9IFwiTWVkaWFQbGF5UGF1c2VcIixcclxuICAgIE1FRElBX1NUT1AgPSBcIk1lZGlhU3RvcFwiLFxyXG4gICAgRUpFQ1QgPSBcIkVqZWN0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfRE9XTiA9IFwiQXVkaW9Wb2x1bWVEb3duXCIsXHJcbiAgICBWT0xVTUVfRE9XTiA9IFwiVm9sdW1lRG93blwiLFxyXG4gICAgQVVESU9fVk9MVU1FX1VQID0gXCJBdWRpb1ZvbHVtZVVwXCIsXHJcbiAgICBWT0xVTUVfVVAgPSBcIlZvbHVtZVVwXCIsXHJcbiAgICBCUk9XU0VSX0hPTUUgPSBcIkJyb3dzZXJIb21lXCIsXHJcbiAgICBOVU1QQURfRElWSURFID0gXCJOdW1wYWREaXZpZGVcIixcclxuICAgIEFMVF9SSUdIVCA9IFwiQWx0UmlnaHRcIixcclxuICAgIEhFTFAgPSBcIkhlbHBcIixcclxuICAgIE5VTV9MT0NLID0gXCJOdW1Mb2NrXCIsXHJcbiAgICBIT01FID0gXCJIb21lXCIsXHJcbiAgICBBUlJPV19VUCA9IFwiQXJyb3dVcFwiLFxyXG4gICAgQVJST1dfUklHSFQgPSBcIkFycm93UmlnaHRcIixcclxuICAgIEFSUk9XX0RPV04gPSBcIkFycm93RG93blwiLFxyXG4gICAgQVJST1dfTEVGVCA9IFwiQXJyb3dMZWZ0XCIsXHJcbiAgICBFTkQgPSBcIkVuZFwiLFxyXG4gICAgUEFHRV9VUCA9IFwiUGFnZVVwXCIsXHJcbiAgICBQQUdFX0RPV04gPSBcIlBhZ2VEb3duXCIsXHJcbiAgICBJTlNFUlQgPSBcIkluc2VydFwiLFxyXG4gICAgREVMRVRFID0gXCJEZWxldGVcIixcclxuICAgIE1FVEFfTEVGVCA9IFwiTWV0YV9MZWZ0XCIsXHJcbiAgICBPU19MRUZUID0gXCJPU0xlZnRcIixcclxuICAgIE1FVEFfUklHSFQgPSBcIk1ldGFSaWdodFwiLFxyXG4gICAgT1NfUklHSFQgPSBcIk9TUmlnaHRcIixcclxuICAgIENPTlRFWFRfTUVOVSA9IFwiQ29udGV4dE1lbnVcIixcclxuICAgIFBPV0VSID0gXCJQb3dlclwiLFxyXG4gICAgQlJPV1NFUl9TRUFSQ0ggPSBcIkJyb3dzZXJTZWFyY2hcIixcclxuICAgIEJST1dTRVJfRkFWT1JJVEVTID0gXCJCcm93c2VyRmF2b3JpdGVzXCIsXHJcbiAgICBCUk9XU0VSX1JFRlJFU0ggPSBcIkJyb3dzZXJSZWZyZXNoXCIsXHJcbiAgICBCUk9XU0VSX1NUT1AgPSBcIkJyb3dzZXJTdG9wXCIsXHJcbiAgICBCUk9XU0VSX0ZPUldBUkQgPSBcIkJyb3dzZXJGb3J3YXJkXCIsXHJcbiAgICBCUk9XU0VSX0JBQ0sgPSBcIkJyb3dzZXJCYWNrXCIsXHJcbiAgICBMQVVOQ0hfQVBQMSA9IFwiTGF1bmNoQXBwMVwiLFxyXG4gICAgTEFVTkNIX01BSUwgPSBcIkxhdW5jaE1haWxcIixcclxuICAgIExBVU5DSF9NRURJQV9QTEFZRVIgPSBcIkxhdW5jaE1lZGlhUGxheWVyXCIsXHJcblxyXG4gICAgLy9tYWMgYnJpbmdzIHRoaXMgYnV0dHRvblxyXG4gICAgRk4gPSBcIkZuXCIsIC8vbm8gZXZlbnQgZmlyZWQgYWN0dWFsbHlcclxuXHJcbiAgICAvL0xpbnV4IGJyaW5ncyB0aGVzZVxyXG4gICAgQUdBSU4gPSBcIkFnYWluXCIsXHJcbiAgICBQUk9QUyA9IFwiUHJvcHNcIixcclxuICAgIFNFTEVDVCA9IFwiU2VsZWN0XCIsXHJcbiAgICBPUEVOID0gXCJPcGVuXCIsXHJcbiAgICBGSU5EID0gXCJGaW5kXCIsXHJcbiAgICBXQUtFX1VQID0gXCJXYWtlVXBcIixcclxuICAgIE5VTVBBRF9QQVJFTlRfTEVGVCA9IFwiTnVtcGFkUGFyZW50TGVmdFwiLFxyXG4gICAgTlVNUEFEX1BBUkVOVF9SSUdIVCA9IFwiTnVtcGFkUGFyZW50UmlnaHRcIixcclxuXHJcbiAgICAvL2FuZHJvaWRcclxuICAgIFNMRUVQID0gXCJTbGVlcFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFX0RFIHtcclxuICAgIFogPSBLRVlCT0FSRF9DT0RFLlksXHJcbiAgICBZID0gS0VZQk9BUkRfQ09ERS5aLFxyXG4gICAgw5YgPSBLRVlCT0FSRF9DT0RFLlNFTUlDT0xPTixcclxuICAgIMOEID0gS0VZQk9BUkRfQ09ERS5RVU9URSxcclxuICAgIMOcID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX0xFRlQsXHJcbiAgICBIQVNIID0gS0VZQk9BUkRfQ09ERS5CQUNLU0xBU0gsXHJcbiAgICBQTFVTID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX1JJR0hULFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIFxyXG4gICAgw58gPSBLRVlCT0FSRF9DT0RFLk1JTlVTLFxyXG4gICAgQUNVVEUgPSBLRVlCT0FSRF9DT0RFLkVRVUFMLFxyXG4gICAgTEVTU19USEFOID0gS0VZQk9BUkRfQ09ERS5JTlRMX0JBQ0tfU0xBU0gsXHJcbiAgICBNSU5VUyA9IEtFWUJPQVJEX0NPREUuU0xBU0hcclxuICB9XHJcblxyXG4gIC8qIFxyXG4gIEZpcmVmb3ggY2FuJ3QgbWFrZSB1c2Ugb2YgdGhvc2UgYnV0dG9ucyBhbmQgQ29tYmluYXRpb25zOlxyXG4gIFNJTkdFTEVfQlVUVE9OUzpcclxuICAgRHJ1Y2ssXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBTaGlmdCArIEYxMCwgU2hpZnQgKyBOdW1wYWQ1LFxyXG4gICBDVFJMICsgcSwgQ1RSTCArIEY0LFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEYzLCBBTFQgKyBGNywgQUxUICsgRjgsIEFMVCArIEYxMFxyXG4gIE9wZXJhIHdvbid0IGRvIGdvb2Qgd2l0aCB0aGVzZSBCdXR0b25zIGFuZCBjb21iaW5hdGlvbnM6XHJcbiAgU0lOR0xFX0JVVFRPTlM6XHJcbiAgIEZsb2F0MzJBcnJheSwgRjExLCBBTFQsXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBDVFJMICsgcSwgQ1RSTCArIHQsIENUUkwgKyBoLCBDVFJMICsgZywgQ1RSTCArIG4sIENUUkwgKyBmIFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEY0LCBBTFQgKyBGNSwgQUxUICsgRjYsIEFMVCArIEY3LCBBTFQgKyBGOCwgQUxUICsgRjEwXHJcbiAgICovXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVF9USU1FUiB7XHJcbiAgICBDQUxMID0gXCLGkmxhcHNlXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIGEgY2FsbCBmcm9tIGEge0BsaW5rIFRpbWVyfVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFRpbWVyIHtcclxuICAgIHB1YmxpYyB0eXBlOiBFVkVOVF9USU1FUiA9IEVWRU5UX1RJTUVSLkNBTEw7XHJcbiAgICBwdWJsaWMgdGFyZ2V0OiBUaW1lcjtcclxuICAgIHB1YmxpYyBhcmd1bWVudHM6IE9iamVjdFtdO1xyXG4gICAgcHVibGljIGZpcnN0Q2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgbGFzdENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZXI6IFRpbWVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSkge1xyXG4gICAgICB0aGlzLnRhcmdldCA9IF90aW1lcjtcclxuICAgICAgdGhpcy5hcmd1bWVudHMgPSBfYXJndW1lbnRzO1xyXG4gICAgICB0aGlzLmZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHRvdWNoIGV2ZW50c1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEVWRU5UX1RPVUNIIHtcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgaW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHRvdWNobW92ZSwgZGV0YWlscyBvZmZzZXQgdG8gc3RhcnRpbmcgdG91Y2ggKi9cclxuICAgIE1PVkUgPSBcInRvdWNoTW92ZVwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyAqL1xyXG4gICAgVEFQID0gXCJ0b3VjaFRhcFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmUgbW92ZWQgb3V0c2lkZSBvZiB0aGUgbm90Y2ggcmFkaXVzLCBkZXRhaWxzIG9mZnNldCBhbmQgY2FyZGluYWwgZGlyZWN0aW9uICovXHJcbiAgICBOT1RDSCA9IFwidG91Y2hOb3RjaFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyBmb3Igc29tZSB0aW1lICovXHJcbiAgICBMT05HID0gXCJ0b3VjaExvbmdcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0d28gdGFwcyB3ZXJlIGRldGVjdGVkIGluIHNob3J0IHN1Y2Nlc3Npb24gKi9cclxuICAgIERPVUJMRSA9IFwidG91Y2hEb3VibGVcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgb25seSB0d28gdG91Y2hlcyBjaGFuZ2VzIGJleW9uZCBhIHRvbGVyYW5jZSAqL1xyXG4gICAgUElOQ0ggPSBcInRvdWNoUGluY2hcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgbm90IGltcGxlbWVudGVkIHlldCAqL1xyXG4gICAgUk9UQVRFID0gXCJ0b3VjaFJvdGF0ZVwiXHJcbiAgfVxyXG5cclxuICAvKiogRGV0YWlscyBmb3IgQ3VzdG9tVG91Y2hFdmVudHMsIHVzZSBhcyBnZW5lcmljIEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+ICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBFdmVudFRvdWNoRGV0YWlsIHtcclxuICAgIHBvc2l0aW9uOiBWZWN0b3IyO1xyXG4gICAgdG91Y2hlczogVG91Y2hMaXN0O1xyXG4gICAgb2Zmc2V0PzogVmVjdG9yMjtcclxuICAgIG1vdmVtZW50PzogVmVjdG9yMjtcclxuICAgIGNhcmRpbmFsPzogVmVjdG9yMjtcclxuICAgIHBpbmNoPzogVmVjdG9yMjtcclxuICAgIHBpbmNoRGVsdGE/OiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaGVzIEN1c3RvbVRvdWNoRXZlbnRzIHRvIHRoZSBFdmVudFRhcmdldCBnaXZlbiB3aXRoIHRoZSBjb25zdHJ1Y3Rvci5cclxuICAgKiBXaGVuIHVzaW5nIHRvdWNoIGV2ZW50cywgbWFrZSBzdXJlIHRvIHNldCBgdG91Y2gtYWN0aW9uOiBub25lYCBpbiBDU1MgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUb3VjaEV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICBwdWJsaWMgcG9zU3RhcnQ6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHB1YmxpYyBwb3NOb3RjaDogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgcHVibGljIHJhZGl1c1RhcDogbnVtYmVyO1xyXG4gICAgcHVibGljIHJhZGl1c05vdGNoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldDogRXZlbnRUYXJnZXQ7XHJcbiAgICBwcml2YXRlIHBvc1ByZXY6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHByaXZhdGUgbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgdGltZXJEb3VibGU6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lckxvbmc6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lRG91YmxlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWVMb25nOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWU6IFRpbWUgPSBuZXcgVGltZSgpO1xyXG4gICAgcHJpdmF0ZSBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBwaW5jaFRvbGVyYW5jZTogbnVtYmVyID0gMTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RhcmdldDogRXZlbnRUYXJnZXQsIF9yYWRpdXNUYXA6IG51bWJlciA9IDUsIF9yYWRpdXNOb3RjaDogbnVtYmVyID0gNTAsIF90aW1lRG91YmxlOiBudW1iZXIgPSAyMDAsIF90aW1lckxvbmc6IG51bWJlciA9IDEwMDApIHtcclxuICAgICAgdGhpcy50YXJnZXQgPSBfdGFyZ2V0O1xyXG4gICAgICB0aGlzLnJhZGl1c1RhcCA9IF9yYWRpdXNUYXA7XHJcbiAgICAgIHRoaXMucmFkaXVzTm90Y2ggPSBfcmFkaXVzTm90Y2g7XHJcbiAgICAgIHRoaXMudGltZURvdWJsZSA9IF90aW1lRG91YmxlO1xyXG4gICAgICB0aGlzLnRpbWVMb25nID0gX3RpbWVyTG9uZztcclxuICAgICAgdGhpcy5hY3RpdmF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLS9BY3RpdmF0ZXMgdGhlIGRpc3BhdGNoIG9mIEN1c3RvbVRvdWNoRXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbikge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgPEV2ZW50TGlzdGVuZXI+dGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBfZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgbGV0IHRvdWNoRmlyc3Q6IFRvdWNoID0gX2V2ZW50LnRvdWNoZXNbMF07XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMiA9IHRoaXMuY2FsY0F2ZXJhZ2VQb3NpdGlvbihfZXZlbnQudG91Y2hlcyk7IC8vbmV3IFZlY3RvcjIodG91Y2hGaXJzdD8uY2xpZW50WCwgdG91Y2hGaXJzdD8uY2xpZW50WSk7XHJcbiAgICAgIGxldCBvZmZzZXQ6IFZlY3RvcjI7XHJcblxyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdWNoc3RhcnRcIjpcclxuICAgICAgICAgIHRoaXMubW92ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3RhcnRHZXN0dXJlKHBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgcGluY2hcclxuICAgICAgICAgICAgbGV0IHBpbmNoOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WCAtIHRvdWNoRmlyc3QuY2xpZW50WCwgX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvdWNoRmlyc3QuY2xpZW50WSk7XHJcbiAgICAgICAgICAgIHRoaXMucGluY2hEaXN0YW5jZSA9IHBpbmNoLm1hZ25pdHVkZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hMb25nOiBUaW1lckhhbmRsZXIgPSAoX2V2ZW50VGltZXI6IEV2ZW50VGltZXIpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILkxPTkcsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRpbWVyTG9uZz8uY2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMudGltZXJMb25nID0gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy50aW1lTG9uZywgMSwgZGlzcGF0Y2hMb25nKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxyXG4gICAgICAgICAgdGhpcy50aW1lckxvbmc/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgaWYgKF9ldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gc3RpbGwgdG91Y2hlcyBhY3RpdmVcclxuICAgICAgICAgICAgdGhpcy5zdGFydEdlc3R1cmUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hUYXA6IFRpbWVySGFuZGxlciA9IChfZXZlbnRUaW1lcjogRXZlbnRUaW1lcik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5UQVAsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgYSB0YXAgYmVmb3JlIGFuZCB0aW1lciBpcyBzdGlsbCBydW5uaW5nIC0+IGRvdWJsZSB0YXBcclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVyRG91YmxlPy5hY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZS5jbGVhcigpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5ET1VCTEUsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm1vdmVkKVxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgbW92ZW1lbnQsIG90aGVyd2lzZSBzZXQgdGltZXIgdG8gZmlyZSB0YXBcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZSA9IG5ldyBUaW1lcih0aGlzLnRpbWUsIHRoaXMudGltZURvdWJsZSwgMSwgZGlzcGF0Y2hUYXApO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcclxuICAgICAgICAgIHRoaXMuZGV0ZWN0UGluY2goX2V2ZW50LCBwb3NpdGlvbik7XHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodGhpcy5wb3NQcmV2LCB0aGlzLnBvc1N0YXJ0KTtcclxuICAgICAgICAgIHRoaXMubW92ZWQgfHw9IChvZmZzZXQubWFnbml0dWRlIDwgdGhpcy5yYWRpdXNUYXApOyAvLyByZW1lbWJlciB0aGF0IHRvdWNoIG1vdmVkIG92ZXIgdGFwIHJhZGl1c1xyXG4gICAgICAgICAgbGV0IG1vdmVtZW50OiBWZWN0b3IyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHBvc2l0aW9uLCB0aGlzLnBvc1ByZXYpO1xyXG4gICAgICAgICAgdGhpcy50YXJnZXQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILk1PVkUsIHtcclxuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgcG9zaXRpb246IHBvc2l0aW9uLCB0b3VjaGVzOiBfZXZlbnQudG91Y2hlcywgb2Zmc2V0OiBvZmZzZXQsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIC8vIGZpcmUgbm90Y2ggd2hlbiB0b3VjaGVzIG1vdmVkIG91dCBvZiBub3RjaCByYWRpdXMgYW5kIHJlc2V0IG5vdGNoXHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UocG9zaXRpb24sIHRoaXMucG9zTm90Y2gpO1xyXG4gICAgICAgICAgaWYgKG9mZnNldC5tYWduaXR1ZGUgPiB0aGlzLnJhZGl1c05vdGNoKSB7XHJcbiAgICAgICAgICAgIGxldCBjYXJkaW5hbDogVmVjdG9yMiA9IE1hdGguYWJzKG9mZnNldC54KSA+IE1hdGguYWJzKG9mZnNldC55KSA/XHJcbiAgICAgICAgICAgICAgVmVjdG9yMi5YKG9mZnNldC54IDwgMCA/IC0xIDogMSkgOlxyXG4gICAgICAgICAgICAgIFZlY3RvcjIuWShvZmZzZXQueSA8IDAgPyAtMSA6IDEpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5OT1RDSCwge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMsIG9mZnNldDogb2Zmc2V0LCBjYXJkaW5hbDogY2FyZGluYWwsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnBvc05vdGNoID0gcG9zaXRpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL1RPRE86IHBpbmNoLCByb3RhdGUuLi5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wb3NQcmV2LnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBkZXRlY3RQaW5jaCA9IChfZXZlbnQ6IFRvdWNoRXZlbnQsIF9wb3NpdGlvbjogVmVjdG9yMik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoICE9IDIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHQ6IFRvdWNoTGlzdCA9IF9ldmVudC50b3VjaGVzO1xyXG4gICAgICBsZXQgcGluY2g6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0WzFdLmNsaWVudFggLSB0WzBdLmNsaWVudFgsIHRbMV0uY2xpZW50WSAtIHRbMF0uY2xpZW50WSk7XHJcbiAgICAgIGxldCBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSBwaW5jaC5tYWduaXR1ZGU7XHJcbiAgICAgIGxldCBwaW5jaERlbHRhOiBudW1iZXIgPSBwaW5jaERpc3RhbmNlIC0gdGhpcy5waW5jaERpc3RhbmNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnMocGluY2hEZWx0YSkgPiB0aGlzLnBpbmNoVG9sZXJhbmNlKVxyXG4gICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4oRVZFTlRfVE9VQ0guUElOQ0gsIHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBfcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzLCBwaW5jaDogcGluY2gsIHBpbmNoRGVsdGE6IHBpbmNoRGVsdGEgfVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnBpbmNoRGlzdGFuY2UgPSBwaW5jaERpc3RhbmNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0R2VzdHVyZShfcG9zaXRpb246IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wb3NOb3RjaC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgICAgdGhpcy5wb3NTdGFydC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGNBdmVyYWdlUG9zaXRpb24oX3RvdWNoZXM6IFRvdWNoTGlzdCk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgYXZlcmFnZTogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgICBmb3IgKGxldCB0b3VjaCBvZiBfdG91Y2hlcykge1xyXG4gICAgICAgIGF2ZXJhZ2UueCArPSB0b3VjaC5jbGllbnRYO1xyXG4gICAgICAgIGF2ZXJhZ2UueSArPSB0b3VjaC5jbGllbnRZO1xyXG4gICAgICB9XHJcbiAgICAgIGF2ZXJhZ2Uuc2NhbGUoMSAvIF90b3VjaGVzLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBhdmVyYWdlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBub2RlIG1hbmFnZWQgYnkge0BsaW5rIFByb2plY3R9IHRoYXQgZnVuY3Rpb25zIGFzIGEgdGVtcGxhdGUgZm9yIHtAbGluayBHcmFwaEluc3RhbmNlfXMgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVzb3VyY2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGggZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIC8vICNzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIkdyYXBoXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCB0aGlzLmhuZE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnR5cGUgPSB0aGlzLnR5cGU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgYXdhaXQgUHJvamVjdC5yZXN5bmNHcmFwaEluc3RhbmNlcyh0aGlzKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfREVTRVJJQUxJWkVEKSk7XHJcbiAgICAgIERlYnVnLmxvZyhcIkRlc2VyaWFsaXplZFwiLCB0aGlzLm5hbWUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZE11dGF0ZSA9IGFzeW5jIChfZXZlbnQ6IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcblxyXG4gICAgICAvLyBUT0RPOiBpZiBwYXRoIGNvbnRhaW5zIGEgZ3JhcGggaW5zdGFuY2UgYmVsb3cgdGhpcywgZG9uJ3QgZGlzcGF0Y2ghXHJcbiAgICAgIC8vIGxldCBwYXRoOiBOb2RlW10gPSBSZWZsZWN0LmdldChfZXZlbnQsIFwicGF0aFwiKTtcclxuICAgICAgLy8gZm9yIChsZXQgbm9kZSBvZiBwYXRoKVxyXG4gICAgICAvLyAgIGlmIChub2RlIGluc3RhbmNlb2YgR3JhcGhJbnN0YW5jZSAmJiBub2RlLmlkU291cmNlICE9IHRoaXMuaWRSZXNvdXJjZSlcclxuICAgICAgLy8gICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiR3JhcGggbXV0YXRlc1wiLCB0aGlzLm5hbWUpO1xyXG4gICAgICAvLyB0aGlzLiNzeW5jaW5nID0gdHJ1ZTtcclxuICAgICAgX2V2ZW50LmRldGFpbC5wYXRoID0gUmVmbGVjdC5nZXQoX2V2ZW50LCBcInBhdGhcIik7IC8vIHNhdmUgcGF0aCB0byB0YXJnZXQgaW4gZGV0YWlsXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFX0dSQVBILCB7IGRldGFpbDogX2V2ZW50LmRldGFpbCB9KSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuR1JBUEhfTVVUQVRFRCwgeyBkZXRhaWw6IF9ldmVudC5kZXRhaWwgfSkpO1xyXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURV9JTlNUQU5DRSkpO1xyXG4gICAgICAvLyB0aGlzLiNzeW5jaW5nID0gZmFsc2U7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBHcmFwaH0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEdyYXBoR0xURiBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChHcmFwaCkge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8R3JhcGhHTFRGPiB7XHJcbiAgICAgIHRoaXMudXJsID0gX3VybDtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHJldHVybiBHTFRGTG9hZGVyLmxvYWRSZXNvdXJjZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBjb25zdCBzZXJpYWxpemF0aW9uRXh0ZXJuYWw6IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk5vZGU6IFNlcmlhbGl6YXRpb24gPSBOb2RlLnByb3RvdHlwZS5zZXJpYWxpemUuY2FsbCh0aGlzKTsgLy8gdGhpcyBpcyB3YXN0ZWZ1bCBhcyB3ZSBvbmx5IG5lZWQgdGhlIGNvbXBvbmVudHMgZGVzZXJpYWxpemVkXHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uTm9kZS5jb21wb25lbnRzW0NvbXBvbmVudFNrZWxldG9uLm5hbWVdO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbk5vZGUuY2hpbGRyZW47XHJcbiAgICAgIHJldHVybiB7IC4uLnNlcmlhbGl6YXRpb25Ob2RlLCAuLi5zZXJpYWxpemF0aW9uRXh0ZXJuYWwgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGF3YWl0IEdyYXBoLnByb3RvdHlwZS5kZXNlcmlhbGl6ZS5jYWxsKHRoaXMsIF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8vIGVudW0gU1lOQyB7XHJcbiAgLy8gICBSRUFEWSwgR1JBUEhfU1lOQ0VELCBHUkFQSF9ET05FLCBJTlNUQU5DRVxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgR3JhcGh9LiAgXHJcbiAgICogVGhpcyBub2RlIGtlZXBzIGEgcmVmZXJlbmNlIHRvIGl0cyByZXNvdXJjZSBhbiBjYW4gdGh1cyBvcHRpbWl6ZSBzZXJpYWxpemF0aW9uXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVzb3VyY2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGhJbnN0YW5jZSBleHRlbmRzIE5vZGUge1xyXG4gICAgLyoqIGlkIG9mIHRoZSByZXNvdXJjZSB0aGF0IGluc3RhbmNlIHdhcyBjcmVhdGVkIGZyb20gKi9cclxuICAgIC8vIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgR3JhcGgsIGluc3RlYWQgb2YgdGhlIGlkXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvdW50OiBudW1iZXIgPSAwO1xyXG4gICAgI2lkU291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAjc3luYzogU1lOQyA9IFNZTkMuUkVBRFk7XHJcbiAgICAjZGVzZXJpYWxpemVGcm9tU291cmNlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgY29uc3RydWN0b3IgYWxvbmUgd2lsbCBub3QgY3JlYXRlIGEgcmVjb25zdHJ1Y3Rpb24sIGJ1dCBvbmx5IHNhdmUgdGhlIGlkLlxyXG4gICAgICogVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBncmFwaCwgY2FsbCByZXNldCBvbiB0aGlzIG9yIHNldCB3aXRoIGEgZ3JhcGggYXMgcGFyYW1ldGVyLlxyXG4gICAgICogUHJlZmVyIFByb2plY3QuY3JlYXRlR3JhcGhJbnN0YW5jZShfZ3JhcGgpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2dyYXBoPzogR3JhcGgpIHtcclxuICAgICAgc3VwZXIoXCJHcmFwaEluc3RhbmNlXCIpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCB0aGlzLmhuZE11dGF0aW9uSW5zdGFuY2UpO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGgpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9ncmFwaC5pZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaWRTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2lkU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjcmVhdGUgdGhpcyBub2RlIGZyb20gdGhlIHtAbGluayBHcmFwaH0gcmVmZXJlbmNlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZTogR3JhcGggPSA8R3JhcGg+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZSh0aGlzLiNpZFNvdXJjZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0KHJlc291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IG9wdGltaXplIHVzaW5nIHRoZSByZWZlcmVuY2VkIEdyYXBoLCBzZXJpYWxpemUvZGVzZXJpYWxpemUgb25seSB0aGUgZGlmZmVyZW5jZXNcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBmaWx0ZXI6IENvbXBvbmVudEdyYXBoRmlsdGVyID0gdGhpcy5nZXRDb21wb25lbnQoQ29tcG9uZW50R3JhcGhGaWx0ZXIpO1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG5cclxuICAgICAgaWYgKGZpbHRlciAmJiBmaWx0ZXIuaXNBY3RpdmUpIHsgLy8gaWYgZ3JhcGggc3luY2hyb25pc2F0aW9uIGlzIHVuZmlsdGVyZWQsIGtub3dpbmcgdGhlIHNvdXJjZSBpcyBzdWZmaWNpZW50IGZvciBzZXJpYWxpemF0aW9uXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURikgeyAvLyBsaWtlIGZvciB0aGUgR3JhcGhHTFRGOiBjaGlsZHJlbiBhbmQgY29tcG9uZW50cyBsb2FkZWQgZnJvbSBnbHRmIG11c3QgbmV2ZXIgYmUgc2VyaWFsaXplZFxyXG4gICAgICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uY29tcG9uZW50c1tDb21wb25lbnRTa2VsZXRvbi5uYW1lXTtcclxuICAgICAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmNoaWxkcmVuO1xyXG4gICAgICAgICAgc2VyaWFsaXphdGlvbi51cmwgPSBncmFwaC51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemVGcm9tU291cmNlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkU291cmNlID0gdGhpcy4jaWRTb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuI2lkU291cmNlID0gX3NlcmlhbGl6YXRpb24uaWRTb3VyY2UgPz8gX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZTtcclxuICAgICAgaWYgKCFfc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZUZyb21Tb3VyY2UpIHtcclxuICAgICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gPEdyYXBoPjx1bmtub3duPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UodGhpcy4jaWRTb3VyY2UpO1xyXG4gICAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICAgIGF3YWl0IEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMsIF9zZXJpYWxpemF0aW9uLnVybCk7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTsgLy8gaW5zdGFuY2UgaXMgZGVzZXJpYWxpemVkIGZyb20gaW5kaXZpZHVhbCBkYXRhXHJcblxyXG4gICAgICAgIHRoaXMuI2Rlc2VyaWFsaXplRnJvbVNvdXJjZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gdGhpcy5nZXQoKTtcclxuICAgICAgaWYgKGdyYXBoKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvR3JhcGgoKTsgLy8gb3RoZXJ3aXNlIGp1c3QgY29ubmVjdFxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBEZWJ1Zy5sb2coXCJSZWdpc3RlciBmb3IgcmVzeW5jXCIsIF9zZXJpYWxpemF0aW9uLm5hbWUsIHRoaXMubmFtZSk7XHJcbiAgICAgICAgUHJvamVjdC5yZWdpc3RlckdyYXBoSW5zdGFuY2VGb3JSZXN5bmModGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGlzIGdyYXBoIGluc3RhbmNlIHRvIHRoZSBncmFwaCByZWZlcmVuY2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdFRvR3JhcGgoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAodGhpcy4jZGVzZXJpYWxpemVGcm9tU291cmNlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KGdyYXBoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIG5vZGUgdG8gYmUgYSByZWNyZWF0aW9uIG9mIHRoZSB7QGxpbmsgR3JhcGh9IGdpdmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzZXQoX2dyYXBoOiBHcmFwaCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9ncmFwaC5pZFJlc291cmNlO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRHcmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAoY3VycmVudEdyYXBoKSB7XHJcbiAgICAgICAgY3VycmVudEdyYXBoLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFX0dSQVBILCB0aGlzLmhuZE11dGF0aW9uR3JhcGgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lLCBpZiB0aGUgc2VyaWFsaXphdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBHcmFwaCBmb3Igb3B0aW1pemF0aW9uIDwtIGFsc28gdXNlZnVsIGZvciBzeW5jIHdpdGggaW5zdGFuY2VzXHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gU2VyaWFsaXplci5zZXJpYWxpemUoX2dyYXBoKTtcclxuICAgICAgZm9yIChsZXQgcGF0aCBpbiBzZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uW3BhdGhdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgRGVidWcuZnVkZ2UoXCJHcmFwaEluc3RhbmNlIHNldCB0byBcIiArIHRoaXMubmFtZSArIFwiIHwgXCIgKyBcIkluc3RhbmNlIGNvdW50OiBcIiArIEdyYXBoSW5zdGFuY2UuY291bnQrKyk7XHJcbiAgICAgIF9ncmFwaC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURV9HUkFQSCwgdGhpcy5obmRNdXRhdGlvbkdyYXBoKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVEKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZ3JhcGggdGhpcyBpbnN0YW5jZXMgcmVmZXJzIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogR3JhcGgge1xyXG4gICAgICByZXR1cm4gPEdyYXBoPlByb2plY3QucmVzb3VyY2VzW3RoaXMuI2lkU291cmNlXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvdXJjZSBncmFwaCBtdXRhdGVkLCByZWZsZWN0IG11dGF0aW9uIGluIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBobmRNdXRhdGlvbkdyYXBoID0gYXN5bmMgKF9ldmVudDogQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCgpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmbGVjdE11dGF0aW9uKF9ldmVudCwgPEdyYXBoPl9ldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLCBfZXZlbnQuZGV0YWlsLnBhdGgpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURV9JTlNUQU5DRSwgeyBidWJibGVzOiB0cnVlIH0pKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGluc3RhbmNlIG11dGF0ZWQsIHJlZmxlY3QgbXV0YXRpb24gaW4gc291cmNlIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaG5kTXV0YXRpb25JbnN0YW5jZSA9IGFzeW5jIChfZXZlbnQ6IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRmlsdGVyZWQoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlZmxlY3RNdXRhdGlvbihfZXZlbnQsIHRoaXMsIHRoaXMuZ2V0KCksIFJlZmxlY3QuZ2V0KF9ldmVudCwgXCJwYXRoXCIpKTtcclxuICAgICAgdGhpcy5nZXQoKS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5NVVRBVEUsIHsgZGV0YWlsOiBfZXZlbnQuZGV0YWlsIH0pKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcmVmbGVjdCBtdXRhdGlvbiBmcm9tIGEgc291cmNlIGdyYXBoIG9yIGluc3RhbmNlIHRvIGEgZGVzdGluYXRpb24gaW5zdGFuY2Ugb3IgZ3JhcGhcclxuICAgIHByaXZhdGUgYXN5bmMgcmVmbGVjdE11dGF0aW9uKF9ldmVudDogQ3VzdG9tRXZlbnQsIF9zb3VyY2U6IE5vZGUsIF9kZXN0aW5hdGlvbjogTm9kZSwgX3BhdGg6IE5vZGVbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIF9wYXRoKSAvLyBpdGVyYXRlIHVwIHRoZSBldmVudCBwYXRoLCB3aGljaCBtYXkgY29udGFpbiByZWd1bGFyIE5vZGVzIG9yIEdyYXBoSW5zdGFuY2VzXHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSAvLyB1bnRpbCB0aGlzIEdyYXBoSW5zdGFuY2UgaXMgZm91bmQgKG9yIG5vIEdyYXBoSW5zdGFuY2UuLi4pXHJcbiAgICAgICAgICBpZiAobm9kZSA9PSB0aGlzKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN5bmMgYWJvcnRlZCwgdGFyZ2V0IGFscmVhZHkgc3luY2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaW4gdGhlIGRlc3RpbmF0aW9uIGhpZXJhcmNoeVxyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IF9wYXRoLmluZGV4T2YoX3NvdXJjZSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgY2hpbGRJbmRleDogbnVtYmVyID0gX3BhdGhbaV0uZ2V0UGFyZW50KCkuZmluZENoaWxkKF9wYXRoW2ldKTsgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgY2hpbGRub2RlIGluIHRoZSBvcmlnaW5hbCBwYXRoXHJcbiAgICAgICAgX2Rlc3RpbmF0aW9uID0gX2Rlc3RpbmF0aW9uLmdldENoaWxkKGNoaWxkSW5kZXgpOyAvLyBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGQgaW4gdGhpcyBwYXRoXHJcbiAgICAgICAgLy8gVE9ETzogcmVzcGVjdCBpbmRleCBmb3Igbm9uLXNpbmdsZXRvbiBjb21wb25lbnRzLi4uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIG11dGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgaW4gdGhlIGRlc3RpbmF0aW9uXHJcbiAgICAgIGxldCBjbXBNdXRhdGU6IENvbXBvbmVudCA9IF9kZXN0aW5hdGlvbi5nZXRDb21wb25lbnQoX2V2ZW50LmRldGFpbC5jb21wb25lbnQuY29uc3RydWN0b3IpO1xyXG4gICAgICBpZiAoY21wTXV0YXRlKVxyXG4gICAgICAgIGF3YWl0IGNtcE11dGF0ZS5tdXRhdGUoX2V2ZW50LmRldGFpbC5tdXRhdG9yLCBudWxsLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgY21wRmlsdGVyOiBDb21wb25lbnRHcmFwaEZpbHRlciA9IHRoaXMuZ2V0Q29tcG9uZW50KENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIChjbXBGaWx0ZXIgJiYgY21wRmlsdGVyLmlzQWN0aXZlKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBIb2xkcyBkYXRhIHRvIGZlZWQgaW50byBhIHtAbGluayBTaGFkZXJ9IHRvIGRlc2NyaWJlIHRoZSBzdXJmYWNlIG9mIHtAbGluayBNZXNofS4gIFxyXG4gICAqIHtAbGluayBNYXRlcmlhbH1zIHJlZmVyZW5jZSB7QGxpbmsgQ29hdH0gYW5kIHtAbGluayBTaGFkZXJ9LiAgIFxyXG4gICAqIFRoZSBtZXRob2QgdXNlUmVuZGVyRGF0YSB3aWxsIGJlIGluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvcn0gYXQgcnVudGltZSwgZXh0ZW5kaW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgdG8gZGVhbCB3aXRoIHRoZSByZW5kZXJlci5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29hdCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gcHVibGljIG5hbWU6IHN0cmluZyA9IFwiQ29hdFwiO1xyXG4gICAgLy8gcHJvdGVjdGVkIHJlbmRlckRhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9OyAvLyB0aGlzIHdhc24ndCB1c2VkIGFueXdoZXJlLi4uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZW5kZXItcGFyYW1ldGVycyBmcm9tIHRoaXMgYW5kIHRoZSBnaXZlbiBtYXRlcmlhbCBpbnNpZGUgdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvYXR9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckRhdGE7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgc2ltcGxlc3Qge0BsaW5rIENvYXR9IHByb3ZpZGluZyBqdXN0IGEgY29sb3JcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRDb2xvcmVkIGV4dGVuZHMgQ29hdCB7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jb2xvciA9IF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uY29sb3IgPSB0aGlzLmNvbG9yLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgdGhpcy5jb2xvci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2xvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgY29sb3IgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSBwaG9uZyBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZSBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yKTtcclxuICAgICAgdGhpcy5kaWZmdXNlID0gX2RpZmZ1c2U7XHJcbiAgICAgIHRoaXMuc3BlY3VsYXIgPSBfc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy5tZXRhbGxpYyA9IF9tZXRhbGxpYztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG1ldGFsbGljKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXRhbGxpYztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWV0YWxsaWMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWV0YWxsaWMgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmRpZmZ1c2UgPSB0aGlzLmRpZmZ1c2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm1ldGFsbGljID0gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUZXh0dXJlZCBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuXHJcbiAgICBAdHlwZShUZXh0dXJlKVxyXG4gICAgcHVibGljIHRleHR1cmU6IFRleHR1cmU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleHR1cmU6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvcikge1xyXG4gICAgICBzdXBlcihfY29sb3IpO1xyXG4gICAgICB0aGlzLnRleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXh0dXJlID0gdGhpcy50ZXh0dXJlLmlkUmVzb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKVxyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IDxUZXh0dXJlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJDb2F0VGV4dHVyZWQudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlIGFuZCBhZGRpdGlvbmFsIGRhdGEgZm9yIHRleHR1cmluZ1xyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZVRleHR1cmVkIGV4dGVuZHMgQ29hdFRleHR1cmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfdGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZGlmZnVzZSA9IF9kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NwZWN1bGFyO1xyXG4gICAgICB0aGlzLmludGVuc2l0eSA9IF9pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMubWV0YWxsaWMgPSBfbWV0YWxsaWM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtZXRhbGxpYygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWV0YWxsaWM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1ldGFsbGljKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21ldGFsbGljID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiQ29hdFRleHR1cmVkLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHMgZXh0ZW5kcyBDb2F0UmVtaXNzaXZlVGV4dHVyZWQge1xyXG5cclxuICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICBwdWJsaWMgbm9ybWFsTWFwOiBUZXh0dXJlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCksIF90ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3IsIF9ub3JtYWxNYXA6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5ub3JtYWwsIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IHVuZGVmaW5lZCwgX2ludGVuc2l0eTogbnVtYmVyID0gdW5kZWZpbmVkLCBfbWV0YWxsaWM6IG51bWJlciA9IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdXBlcihfY29sb3IsIF90ZXh0dXJlLCBfZGlmZnVzZSwgX3NwZWN1bGFyLCBfaW50ZW5zaXR5LCBfbWV0YWxsaWMpO1xyXG4gICAgICB0aGlzLm5vcm1hbE1hcCA9IF9ub3JtYWxNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkTm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAuaWRSZXNvdXJjZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZE5vcm1hbE1hcClcclxuICAgICAgICB0aGlzLm5vcm1hbE1hcCA9IDxUZXh0dXJlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWROb3JtYWxNYXApO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSBjb2xvciBhbmQgcGFyYW1ldGVycyBmb3IgdGhlIHRvb24gc2hhZGluZyBtb2RlbC5cclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUb29uIGV4dGVuZHMgbWl4aW5Db2F0VG9vbihDb2F0UmVtaXNzaXZlKSB7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4VG9vbjogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LnRvb24sIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IDEuMiwgX2ludGVuc2l0eT86IG51bWJlciwgX21ldGFsbGljPzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvciwgX2RpZmZ1c2UsIF9zcGVjdWxhciwgX2ludGVuc2l0eSwgX21ldGFsbGljKTtcclxuICAgICAgdGhpcy50ZXhUb29uID0gX3RleFRvb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlLCBhIGNvbG9yIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgdG9vbiBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFRvb25UZXh0dXJlZCBleHRlbmRzIG1peGluQ29hdFRvb24oQ29hdFJlbWlzc2l2ZVRleHR1cmVkKSB7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfdGV4VG9vbjogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LnRvb24sIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IDEuMiwgX2ludGVuc2l0eT86IG51bWJlciwgX21ldGFsbGljPzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvciwgX3RleHR1cmUsIF9kaWZmdXNlLCBfc3BlY3VsYXIsIF9pbnRlbnNpdHksIF9tZXRhbGxpYyk7XHJcbiAgICAgIHRoaXMudGV4VG9vbiA9IF90ZXhUb29uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbWl4aW5Db2F0VG9vbjxUQmFzZSBleHRlbmRzIG5ldyAoLi4uYXJnczogR2VuZXJhbFtdKSA9PiBTZXJpYWxpemFibGU+KF9iYXNlOiBUQmFzZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcbiAgICBhYnN0cmFjdCBjbGFzcyBDb2F0VG9vbiBleHRlbmRzIF9iYXNlIHtcclxuXHJcbiAgICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICAgIHB1YmxpYyB0ZXhUb29uOiBUZXh0dXJlO1xyXG5cclxuICAgICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXhUb29uID0gdGhpcy50ZXhUb29uLmlkUmVzb3VyY2U7XHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleFRvb24pXHJcbiAgICAgICAgICB0aGlzLnRleFRvb24gPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkVGV4VG9vbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gQ29hdFRvb247XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYSBjb2xvciBhcyB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMSBmb3IgdGhlIGZvdXIgY2hhbm5lbHMgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgKGZvciBvcGFjaXR5KVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb2xvciBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICAvLyBjcmMyIG9ubHkgdXNlZCBmb3IgY29udmVydGluZyBjb2xvcnMgZnJvbSBzdHJpbmdzIHByZWRlZmluZWQgYnkgQ1NTXHJcbiAgICBwcml2YXRlIHN0YXRpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSAoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcclxuICAgICAgY3JjMi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImNvcHlcIjtcclxuICAgICAgcmV0dXJuIGNyYzI7XHJcbiAgICB9KSgpO1xyXG5cclxuICAgIHB1YmxpYyByOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZzogbnVtYmVyO1xyXG4gICAgcHVibGljIGI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yOiBudW1iZXIgPSAxLCBfZzogbnVtYmVyID0gMSwgX2I6IG51bWJlciA9IDEsIF9hOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0Q2xhbXBlZChfciwgX2csIF9iLCBfYSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSB3aXRoIHRoZSA4LWJpdCBjb2xvciBjaGFubmVscyBpbiB0aGUgb3JkZXIgUkdCQS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeXRlc0Zyb21DU1MoX2tleXdvcmQ6IHN0cmluZyk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsU3R5bGUgPSBfa2V5d29yZDtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsUmVjdCgwLCAwLCAxLCAxKTtcclxuICAgICAgcmV0dXJuIENvbG9yLmNyYzIuZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBDb2xvcn0gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gY3NzIGNvbG9yIGtleXdvcmQuIFxyXG4gICAgICogUGFzc2luZyBhbiBfYWxwaGEgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgYWxwaGEgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBrZXl3b3JkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENTUyhfa2V5d29yZDogc3RyaW5nLCBfYWxwaGE/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5nZXQoQ29sb3IpLnNldENTUyhfa2V5d29yZCwgX2FscGhhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXRydW5zIHRoZSBwcm9kdWN0IG9mIHR3byBjb2xvcnMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX2NsckE6IENvbG9yLCBfY2xyQjogQ29sb3IpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHJ1bnMgdGhlIHByb2R1Y3Qgb2YgYSBjb2xvciB3aXRoIGEgc2NhbGFyIHZhbHVlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9jb2xvcjogQ29sb3IsIF9zY2FsYXI6IG51bWJlcik6IENvbG9yO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdWx0aXBsaWNhbnQ6IENvbG9yLCBfbXVsdGlwbGllcjogQ29sb3IgfCBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBfbXVsdGlwbGljYW50LmNsb25lLm11bHRpcGx5KDxHZW5lcmFsPl9tdWx0aXBsaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IENvbG9yIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKENvbG9yKS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGUgZ2l2ZW4gY29sb3IgaW50byB0aGlzIGNvbG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29weShfY29sb3I6IENvbG9yKTogQ29sb3Ige1xyXG4gICAgICB0aGlzLnIgPSBfY29sb3IucjtcclxuICAgICAgdGhpcy5nID0gX2NvbG9yLmc7XHJcbiAgICAgIHRoaXMuYiA9IF9jb2xvci5iO1xyXG4gICAgICB0aGlzLmEgPSBfY29sb3IuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuciA9IDE7IHRoaXMuZyA9IDE7IHRoaXMuYiA9IDE7IHRoaXMuYSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gY3NzIGNvbG9yIGtleXdvcmQuIE9wdGluYWxseSBzZXRzIHRoZSBhbHBoYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDU1MoX2tleXdvcmQ6IHN0cmluZywgX2FscGhhPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICBjb25zdCBieXRlc1JHQkE6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gQ29sb3IuZ2V0Qnl0ZXNGcm9tQ1NTKF9rZXl3b3JkKTtcclxuICAgICAgdGhpcy5zZXRCeXRlcyhieXRlc1JHQkFbMF0sIGJ5dGVzUkdCQVsxXSwgYnl0ZXNSR0JBWzJdLCBieXRlc1JHQkFbM10pO1xyXG4gICAgICB0aGlzLmEgPSBfYWxwaGEgPz8gdGhpcy5hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiA4LWJpdCB2YWx1ZXMgZm9yIHRoZSBjb2xvciBjaGFubmVscy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ5dGVzKF9yOiBudW1iZXIsIF9nOiBudW1iZXIsIF9iOiBudW1iZXIsIF9hOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCeXRlcyhfcmdiYTogVWludDhDbGFtcGVkQXJyYXkpOiBDb2xvcjtcclxuICAgIHB1YmxpYyBzZXRCeXRlcyhfcjogbnVtYmVyIHwgVWludDhDbGFtcGVkQXJyYXksIF9nPzogbnVtYmVyLCBfYj86IG51bWJlciwgX2E/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGlmIChfciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KVxyXG4gICAgICAgIHRoaXMuc2V0Qnl0ZXMoX3JbMF0sIF9yWzFdLCBfclsyXSwgX3JbM10pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5zZXRDbGFtcGVkKF9yIC8gMjU1LCBfZyAvIDI1NSwgX2IgLyAyNTUsIF9hIC8gMjU1KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGlzIGNvbG9yIGFuZCBjbGFtcHMgdGhlbSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDbGFtcGVkKF9yOiBudW1iZXIsIF9nOiBudW1iZXIsIF9iOiBudW1iZXIsIF9hOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIHtAbGluayBGbG9hdDMyQXJyYXl9IHdoaWxlIGNsYW1waW5nIHRoZSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q2xhbXBlZChfcmdiYTogRmxvYXQzMkFycmF5KTogQ29sb3I7XHJcbiAgICBwdWJsaWMgc2V0Q2xhbXBlZChfcjogbnVtYmVyIHwgRmxvYXQzMkFycmF5LCBfZz86IG51bWJlciwgX2I/OiBudW1iZXIsIF9hPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICBpZiAoX3IgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpXHJcbiAgICAgICAgdGhpcy5zZXRDbGFtcGVkKF9yWzBdLCBfclsxXSwgX3JbMl0sIF9yWzNdKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0KFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfciwgMCwgMSksXHJcbiAgICAgICAgICBDYWxjLmNsYW1wKF9nLCAwLCAxKSxcclxuICAgICAgICAgIENhbGMuY2xhbXAoX2IsIDAsIDEpLFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfYSwgMCwgMSlcclxuICAgICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3I6IG51bWJlciwgX2c6IG51bWJlciwgX2I6IG51bWJlciwgX2E6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgdGhpcy5yID0gX3I7IHRoaXMuZyA9IF9nOyB0aGlzLmIgPSBfYjsgdGhpcy5hID0gX2E7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSBvZiB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5dGVzKCk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShbdGhpcy5yICogMjU1LCB0aGlzLmcgKiAyNTUsIHRoaXMuYiAqIDI1NSwgdGhpcy5hICogMjU1XSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjc3MgY29sb3Iga2V5d29yZCByZXByZXNlbnRpbmcgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENTUygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgYnl0ZXM6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gdGhpcy5nZXRCeXRlcygpO1xyXG4gICAgICByZXR1cm4gYFJHQkEoJHtieXRlc1swXX0sICR7Ynl0ZXNbMV19LCAke2J5dGVzWzJdfSwgJHt0aGlzLmF9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRIZXgoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IGJ5dGVzOiBVaW50OENsYW1wZWRBcnJheSA9IHRoaXMuZ2V0Qnl0ZXMoKTtcclxuICAgICAgbGV0IGhleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgZm9yIChsZXQgYnl0ZSBvZiBieXRlcylcclxuICAgICAgICBoZXggKz0gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICByZXR1cm4gaGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIGhleCBzdHJpbmcgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRIZXgoX2hleDogc3RyaW5nKTogQ29sb3Ige1xyXG4gICAgICBsZXQgYnl0ZXM6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gdGhpcy5nZXRCeXRlcygpO1xyXG4gICAgICBsZXQgY2hhbm5lbDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgYnl0ZSBpbiBieXRlcylcclxuICAgICAgICBieXRlc1tieXRlXSA9IHBhcnNlSW50KF9oZXguc3Vic3RyKGNoYW5uZWwrKyAqIDIsIDIpLCAxNik7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldEJ5dGVzKGJ5dGVzKTs7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBjb2xvciB0byB0aGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkKF9jb2xvcjogQ29sb3IpOiBDb2xvciB7XHJcbiAgICAgIHRoaXMuciArPSBfY29sb3IucjtcclxuICAgICAgdGhpcy5nICs9IF9jb2xvci5nO1xyXG4gICAgICB0aGlzLmIgKz0gX2NvbG9yLmI7XHJcbiAgICAgIHRoaXMuYSArPSBfY29sb3IuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBsaWVzIHRoaXMgd2l0aCB0aGUgZ2l2ZW4gY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfY29sb3I6IENvbG9yKTogQ29sb3I7XHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGxpZXMgdGhpcyB3aXRoIHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfc2NhbGFyOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIHB1YmxpYyBtdWx0aXBseShfbXVsdGlwbGllcjogQ29sb3IgfCBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGlmIChfbXVsdGlwbGllciBpbnN0YW5jZW9mIENvbG9yKSB7XHJcbiAgICAgICAgdGhpcy5yICo9IF9tdWx0aXBsaWVyLnI7XHJcbiAgICAgICAgdGhpcy5nICo9IF9tdWx0aXBsaWVyLmc7XHJcbiAgICAgICAgdGhpcy5iICo9IF9tdWx0aXBsaWVyLmI7XHJcbiAgICAgICAgdGhpcy5hICo9IF9tdWx0aXBsaWVyLmE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yICo9IF9tdWx0aXBsaWVyO1xyXG4gICAgICAgIHRoaXMuZyAqPSBfbXVsdGlwbGllcjtcclxuICAgICAgICB0aGlzLmIgKj0gX211bHRpcGxpZXI7XHJcbiAgICAgICAgdGhpcy5hICo9IF9tdWx0aXBsaWVyO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFubmVscyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gY29sb3IgYXJlIHRvIGJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIHdpdGhpbiB0aGUgZ2l2ZW4gdG9sZXJhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlcXVhbHMoX2NvbXBhcmU6IENvbG9yLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy5yIC0gX2NvbXBhcmUucikgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLmcgLSBfY29tcGFyZS5nKSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMuYiAtIF9jb21wYXJlLmIpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy5hIC0gX2NvbXBhcmUuYSkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGAocjogJHt0aGlzLnIudG9GaXhlZCgzKX0sIGc6ICR7dGhpcy5nLnRvRml4ZWQoMyl9LCBiOiAke3RoaXMuYi50b0ZpeGVkKDMpfSwgYTogJHt0aGlzLmEudG9GaXhlZCgzKX0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGB7IFwiclwiOiAke3RoaXMucn0sIFwiZ1wiOiAke3RoaXMuZ30sIFwiYlwiOiAke3RoaXMuYn0sIFwiYVwiOiAke3RoaXMuYX19YDsgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbi50b0pTT04gPSAoKSA9PiB7IHJldHVybiBgWyR7dGhpcy5yfSwgJHt0aGlzLmd9LCAke3RoaXMuYn0sICR7dGhpcy5hfV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfc2VyaWFsaXphdGlvbikgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIFt0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmFdID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1hdGVyaWFsfSBsb2FkZWQgZnJvbSBhIGdsVEYtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0ZXJpYWxHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1hdGVyaWFsKSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lKTogUHJvbWlzZTxNYXRlcmlhbEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFic3RyYWN0IGNsYXNzIHN1cHBvcnRpbmcgdmFyaW91cyBhcml0aG1ldGljYWwgaGVscGVyIGZ1bmN0aW9uc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWxjIHtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIGRlZ3JlZXMgeWllbGRzIHRoZSBhbmdsZSBpbiByYWRpYW4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVnMnJhZDogbnVtYmVyID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIHJhZGlhbiB5aWVsZHMgdGhlIGFuZ2xlIGluIGRlZ3JlZXMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmFkMmRlZzogbnVtYmVyID0gMSAvIENhbGMuZGVnMnJhZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSB2YWx1ZXMgcGFzc2VkIGluLCBlaXRoZXIgX3ZhbHVlIGlmIHdpdGhpbiBfbWluIGFuZCBfbWF4IG9yIHRoZSBib3VuZGFyeSBiZWluZyBleGNlZWRlZCBieSBfdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGFtcDxUPihfdmFsdWU6IFQsIF9taW46IFQsIF9tYXg6IFQsIF9pc1NtYWxsZXI6IChfdmFsdWUxOiBULCBfdmFsdWUyOiBUKSA9PiBib29sZWFuID0gKF92YWx1ZTE6IFQsIF92YWx1ZTI6IFQpID0+IHsgcmV0dXJuIF92YWx1ZTEgPCBfdmFsdWUyOyB9KTogVCB7XHJcbiAgICAgIGlmIChfaXNTbWFsbGVyKF92YWx1ZSwgX21pbikpIHJldHVybiBfbWluO1xyXG4gICAgICBpZiAoX2lzU21hbGxlcihfbWF4LCBfdmFsdWUpKSByZXR1cm4gX21heDtcclxuICAgICAgcmV0dXJuIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcyAoX2EsIF9iKSBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yIChfZikuIGYgaXMgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbGVycChfYTogbnVtYmVyLCBfYjogbnVtYmVyLCBfZjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hICsgKF9iIC0gX2EpICogQ2FsYy5jbGFtcChfZiwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3VuZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHRoZSBnaXZlbiBpbmNyZW1lbnQgdXNpbmcgdGhlIGdpdmVuIHJvdW5kaW5nIGZ1bmN0aW9uLiBcclxuICAgICAqIERlZmF1bHQgcm91bmRpbmcgZnVuY3Rpb24gaXMge0BsaW5rIE1hdGgucm91bmR9LCB1c2Uge0BsaW5rIE1hdGguZmxvb3J9IG9yIHtAbGluayBNYXRoLmNlaWx9IHRvIHJvdW5kIGRvd24gb3IgdXAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc25hcChfdmFsdWU6IG51bWJlciwgX2luY3JlbWVudDogbnVtYmVyLCBfcm91bmQ6IChfdmFsdWU6IG51bWJlcikgPT4gbnVtYmVyID0gTWF0aC5yb3VuZCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfcm91bmQoX3ZhbHVlIC8gX2luY3JlbWVudCkgKiBfaW5jcmVtZW50O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQm9yZGVyIHtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgcmlnaHQ6IG51bWJlcjtcclxuICAgIGJvdHRvbTogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnJhbWluZyBkZXNjcmliZXMgaG93IHRvIG1hcCBhIHJlY3RhbmdsZSBpbnRvIGEgZ2l2ZW4gZnJhbWVcclxuICAgKiBhbmQgaG93IHBvaW50cyBpbiB0aGUgZnJhbWUgY29ycmVzcG9uZCB0byBwb2ludHMgaW4gdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYW5kIHZpY2UgdmVyc2FcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAgXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9GcmFtaW5nXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZyYW1pbmcgZXh0ZW5kcyBNdXRhYmxlIHtcclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYSBwb2ludCBpbiB0aGUgZ2l2ZW4gZnJhbWUgYWNjb3JkaW5nIHRvIHRoaXMgZnJhbWluZ1xyXG4gICAgICogQHBhcmFtIF9wb2ludEluRnJhbWUgVGhlIHBvaW50IGluIHRoZSBmcmFtZSBnaXZlblxyXG4gICAgICogQHBhcmFtIF9yZWN0RnJhbWUgVGhlIGZyYW1lIHRoZSBwb2ludCBpcyByZWxhdGl2ZSB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYSBwb2ludCBpbiBhIGdpdmVuIHJlY3RhbmdsZSBiYWNrIHRvIGEgY2FsY3VsYXRlZCBmcmFtZSBvZiBvcmlnaW5cclxuICAgICAqIEBwYXJhbSBfcG9pbnQgVGhlIHBvaW50IGluIHRoZSByZWN0YW5nbGVcclxuICAgICAqIEBwYXJhbSBfcmVjdCBUaGUgcmVjdGFuZ2xlIHRoZSBwb2ludCBpcyByZWxhdGl2ZSB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHJlY3RhbmdsZSBhcyB0aGUgZnJhbWUgYW5kIGNyZWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIGFjY29yZGluZyB0byB0aGUgZnJhbWluZ1xyXG4gICAgICogQHBhcmFtIF9yZWN0RnJhbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgaGFzIGEgZml4ZWQgd2lkdGggYW5kIGhlaWdodCBhbmQgZGlzcGxheSBzaG91bGQgc2NhbGUgdG8gZml0IHRoZSBmcmFtZVxyXG4gICAqIFBvaW50cyBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIHJhdGlvXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZyYW1pbmdGaXhlZCBleHRlbmRzIEZyYW1pbmcge1xyXG4gICAgcHVibGljIHdpZHRoOiBudW1iZXIgPSAzMDA7XHJcbiAgICBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgPSAxNTA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF93aWR0aDogbnVtYmVyID0gMzAwLCBfaGVpZ2h0OiBudW1iZXIgPSAxNTApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXRTaXplKF93aWR0aCwgX2hlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgZnJhbWluZyB0byB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2l6ZShfd2lkdGg6IG51bWJlciwgX2hlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICB0aGlzLndpZHRoICogKF9wb2ludEluRnJhbWUueCAtIF9yZWN0RnJhbWUueCkgLyBfcmVjdEZyYW1lLndpZHRoLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICogKF9wb2ludEluRnJhbWUueSAtIF9yZWN0RnJhbWUueSkgLyBfcmVjdEZyYW1lLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludEludmVyc2UoX3BvaW50OiBWZWN0b3IyLCBfcmVjdDogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICBfcG9pbnQueCAqIF9yZWN0LndpZHRoIC8gdGhpcy53aWR0aCArIF9yZWN0LngsXHJcbiAgICAgICAgX3BvaW50LnkgKiBfcmVjdC5oZWlnaHQgLyB0aGlzLmhlaWdodCArIF9yZWN0LnlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYXJlIGZyYWN0aW9ucyBvZiB0aG9zZSBvZiB0aGUgZnJhbWUsIHNjYWxlZCBieSBub3JtZWQgdmFsdWVzIG5vcm1XaWR0aCBhbmQgbm9ybUhlaWdodC5cclxuICAgKiBEaXNwbGF5IHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIGZyYW1lIGFuZCBwb2ludHMgYXJlIHNjYWxlZCBpbiB0aGUgc2FtZSByYXRpb1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGcmFtaW5nU2NhbGVkIGV4dGVuZHMgRnJhbWluZyB7XHJcbiAgICBwdWJsaWMgbm9ybVdpZHRoOiBudW1iZXIgPSAxLjA7XHJcbiAgICBwdWJsaWMgbm9ybUhlaWdodDogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGZyYW1pbmcgdG8gdGhlIGdpdmVuIG5vcm1lZCB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTY2FsZShfbm9ybVdpZHRoOiBudW1iZXIsIF9ub3JtSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5ub3JtV2lkdGggPSBfbm9ybVdpZHRoO1xyXG4gICAgICB0aGlzLm5vcm1IZWlnaHQgPSBfbm9ybUhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICB0aGlzLm5vcm1XaWR0aCAqIChfcG9pbnRJbkZyYW1lLnggLSBfcmVjdEZyYW1lLngpLFxyXG4gICAgICAgIHRoaXMubm9ybUhlaWdodCAqIChfcG9pbnRJbkZyYW1lLnkgLSBfcmVjdEZyYW1lLnkpXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54IC8gdGhpcy5ub3JtV2lkdGggKyBfcmVjdC54LFxyXG4gICAgICAgIF9wb2ludC55IC8gdGhpcy5ub3JtSGVpZ2h0ICsgX3JlY3QueVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZWN0KF9yZWN0RnJhbWU6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMubm9ybVdpZHRoICogX3JlY3RGcmFtZS53aWR0aCwgdGhpcy5ub3JtSGVpZ2h0ICogX3JlY3RGcmFtZS5oZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgZml0cyBpbnRvIGEgbWFyZ2luIGdpdmVuIGFzIGZyYWN0aW9ucyBvZiB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgZ2l2ZW4gYnkgbm9ybUFuY2hvclxyXG4gICAqIHBsdXMgYW4gYWJzb2x1dGUgcGFkZGluZyBnaXZlbiBieSBwaXhlbEJvcmRlci4gRGlzcGxheSBzaG91bGQgZml0IGludG8gdGhpcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRnJhbWluZ0NvbXBsZXggZXh0ZW5kcyBGcmFtaW5nIHtcclxuICAgIHB1YmxpYyBtYXJnaW46IEJvcmRlciA9IHsgbGVmdDogMCwgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwIH07XHJcbiAgICBwdWJsaWMgcGFkZGluZzogQm9yZGVyID0geyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAgfTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICBfcG9pbnRJbkZyYW1lLnggLSB0aGlzLnBhZGRpbmcubGVmdCAtIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdEZyYW1lLndpZHRoLFxyXG4gICAgICAgIF9wb2ludEluRnJhbWUueSAtIHRoaXMucGFkZGluZy50b3AgLSB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdEZyYW1lLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54ICsgdGhpcy5wYWRkaW5nLmxlZnQgKyB0aGlzLm1hcmdpbi5sZWZ0ICogX3JlY3Qud2lkdGgsXHJcbiAgICAgICAgX3BvaW50LnkgKyB0aGlzLnBhZGRpbmcudG9wICsgdGhpcy5tYXJnaW4udG9wICogX3JlY3QuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlIHtcclxuICAgICAgaWYgKCFfcmVjdEZyYW1lKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IG1pblg6IG51bWJlciA9IF9yZWN0RnJhbWUueCArIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdEZyYW1lLndpZHRoICsgdGhpcy5wYWRkaW5nLmxlZnQ7XHJcbiAgICAgIGxldCBtaW5ZOiBudW1iZXIgPSBfcmVjdEZyYW1lLnkgKyB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdEZyYW1lLmhlaWdodCArIHRoaXMucGFkZGluZy50b3A7XHJcbiAgICAgIGxldCBtYXhYOiBudW1iZXIgPSBfcmVjdEZyYW1lLnggKyAoMSAtIHRoaXMubWFyZ2luLnJpZ2h0KSAqIF9yZWN0RnJhbWUud2lkdGggLSB0aGlzLnBhZGRpbmcucmlnaHQ7XHJcbiAgICAgIGxldCBtYXhZOiBudW1iZXIgPSBfcmVjdEZyYW1lLnkgKyAoMSAtIHRoaXMubWFyZ2luLmJvdHRvbSkgKiBfcmVjdEZyYW1lLmhlaWdodCAtIHRoaXMucGFkZGluZy5ib3R0b207XHJcblxyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVChtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4geyBtYXJnaW46IHRoaXMubWFyZ2luLCBwYWRkaW5nOiB0aGlzLnBhZGRpbmcgfTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvcjIgYXMgcG9sYXIgY29vcmRpbmF0ZXMgXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICDihpUtIGFuZ2xlIChBbmdsZSB0byB0aGUgeC1heGlzKVxyXG4gICAqICAt4oaSIE1hZ25pdHVkZSAoRGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyKSAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEdlbzIgaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIG1hZ25pdHVkZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhbmdsZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2FuZ2xlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9hbmdsZSwgX21hZ25pdHVkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZSBhdCBvbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FuZ2xlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWFnbml0dWRlID0gX21hZ25pdHVkZTtcclxuICAgICAgdGhpcy5hbmdsZSA9IF9hbmdsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYGFuZ2xlOiAke3RoaXMuYW5nbGUudG9QcmVjaXNpb24oNSl9LCAgbWFnbml0dWRlOiAke3RoaXMubWFnbml0dWRlLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3IzIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXMgYXMgc2VlbiBvbiBhIGdsb2JlXHJcbiAgICogYGBgdGV4dFxyXG4gICAqIOKGkHzihpIgTG9uZ2l0dWRlIChBbmdsZSB0byB0aGUgei1heGlzKSBcclxuICAgKiAg4oaVLSBMYXRpdHVkZSAoQW5nbGUgdG8gdGhlIGVxdWF0b3IpXHJcbiAgICogIC3ihpIgTWFnbml0dWRlIChEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIpICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR2VvMyBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgbWFnbml0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxhdGl0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxvbmdpdHVkZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9sb25naXR1ZGUsIF9sYXRpdHVkZSwgX21hZ25pdHVkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZSBhdCBvbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWFnbml0dWRlID0gX21hZ25pdHVkZTtcclxuICAgICAgdGhpcy5sYXRpdHVkZSA9IF9sYXRpdHVkZTtcclxuICAgICAgdGhpcy5sb25naXR1ZGUgPSBfbG9uZ2l0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgbG9uZ2l0dWRlOiAke3RoaXMubG9uZ2l0dWRlLnRvUHJlY2lzaW9uKDUpfSwgbGF0aXR1ZGU6ICR7dGhpcy5sYXRpdHVkZS50b1ByZWNpc2lvbig1KX0sIG1hZ25pdHVkZTogJHt0aGlzLm1hZ25pdHVkZS50b1ByZWNpc2lvbig1KX1gO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIEZyb20gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xyXG4gIC8vIEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxyXG4gIGV4cG9ydCBmdW5jdGlvbiBNYXNoKCk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCBuOiBudW1iZXIgPSAweGVmYzgyNDlkO1xyXG5cclxuICAgIGxldCBtYXNoOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfZGF0YTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgX2RhdGEgPSBfZGF0YS50b1N0cmluZygpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBuICs9IF9kYXRhLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgbGV0IGg6IG51bWJlciA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xyXG4gICAgICAgIG4gPSBoID4+PiAwO1xyXG4gICAgICAgIGggLT0gbjtcclxuICAgICAgICBoICo9IG47XHJcbiAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIG1hc2gudmVyc2lvbiA9ICdNYXNoIDAuOSc7XHJcbiAgICByZXR1cm4gbWFzaDtcclxuICB9XHJcblxyXG5cclxuICAvLyBGcm9tIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cclxuICBleHBvcnQgZnVuY3Rpb24gTEZJQjQoKTogRnVuY3Rpb24ge1xyXG4gICAgLy8gR2VvcmdlIE1hcnNhZ2xpYSdzIExGSUI0LFxyXG4gICAgLy9odHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvc2NpLmNyeXB0L21zZy9lYjRkZGRlNzgyYjE3MDUxXHJcbiAgICBsZXQgYXJnczogbnVtYmVyW10gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgbGV0IGswOiBudW1iZXIgPSAwLFxyXG4gICAgICBrMTogbnVtYmVyID0gNTgsXHJcbiAgICAgIGsyOiBudW1iZXIgPSAxMTksXHJcbiAgICAgIGszOiBudW1iZXIgPSAxNzg7XHJcblxyXG4gICAgbGV0IHM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgbGV0IG1hc2g6IEZ1bmN0aW9uID0gTWFzaCgpO1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGFyZ3MgPSBbK25ldyBEYXRlKCldO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IDI1NjsgaisrKSB7XHJcbiAgICAgIHNbal0gPSBtYXNoKFwiIFwiKTtcclxuICAgICAgc1tqXSAtPSBtYXNoKFwiIFwiKSAqIDQuNzY4MzcxNTgyMDMxMjVlLTc7IC8vIDJeLTIxXHJcbiAgICAgIGlmIChzW2pdIDwgMCkge1xyXG4gICAgICAgIHNbal0gKz0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IDI1NjsgaisrKSB7XHJcbiAgICAgICAgc1tqXSAtPSBtYXNoKGFyZ3NbaV0pO1xyXG4gICAgICAgIHNbal0gLT0gbWFzaChhcmdzW2ldKSAqIDQuNzY4MzcxNTgyMDMxMjVlLTc7IC8vIDJeLTIxXHJcbiAgICAgICAgaWYgKHNbal0gPCAwKSB7XHJcbiAgICAgICAgICBzW2pdICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtYXNoID0gbnVsbDtcclxuXHJcbiAgICBsZXQgcmFuZG9tOiBGdW5jdGlvbiA9IGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgeDogbnVtYmVyO1xyXG5cclxuICAgICAgazAgPSAoazAgKyAxKSAmIDI1NTtcclxuICAgICAgazEgPSAoazEgKyAxKSAmIDI1NTtcclxuICAgICAgazIgPSAoazIgKyAxKSAmIDI1NTtcclxuICAgICAgazMgPSAoazMgKyAxKSAmIDI1NTtcclxuXHJcbiAgICAgIHggPSBzW2swXSAtIHNbazFdO1xyXG4gICAgICBpZiAoeCA8IDApIHtcclxuICAgICAgICB4ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeCAtPSBzW2syXTtcclxuICAgICAgaWYgKHggPCAwKSB7XHJcbiAgICAgICAgeCArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIHggLT0gc1trM107XHJcbiAgICAgIGlmICh4IDwgMCkge1xyXG4gICAgICAgIHggKz0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHNbazBdID0geDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcmFuZG9tLnVpbnQzMiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIC8vICAgcmV0dXJuIHJhbmRvbSgpICogMHgxMDAwMDAwMDAgPj4+IDA7IC8vIDJeMzJcclxuICAgIC8vIH07XHJcbiAgICAvLyByYW5kb20uZnJhY3Q1MyA9IHJhbmRvbTtcclxuICAgIC8vIHJhbmRvbS52ZXJzaW9uID0gXCJMRklCNCAwLjlcIjtcclxuICAgIC8vIHJhbmRvbS5hcmdzID0gYXJncztcclxuXHJcbiAgICByZXR1cm4gcmFuZG9tO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIHRoZSBtYXRyaXggYXMgdHJhbnNsYXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsaW5nIHtAbGluayBWZWN0b3IyfSwgYmVpbmcgY2FsY3VsYXRlZCBmcm9tIHRoZSBtYXRyaXhcclxuICAgKi9cclxuICBpbnRlcmZhY2UgVmVjdG9yUmVwcmVzZW50YXRpb24ge1xyXG4gICAgdHJhbnNsYXRpb246IFZlY3RvcjI7XHJcbiAgICByb3RhdGlvbjogbnVtYmVyO1xyXG4gICAgc2NhbGluZzogVmVjdG9yMjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpbXBsZSBjbGFzcyBmb3IgM3gzIG1hdHJpeCBvcGVyYXRpb25zXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNYXRyaXgzeDMgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDkpOyAvLyBUaGUgZGF0YSBvZiB0aGUgbWF0cml4LlxyXG4gICAgcHJpdmF0ZSBtdXRhdG9yOiBNdXRhdG9yID0gbnVsbDsgLy8gcHJlcGFyZWQgZm9yIG9wdGltaXphdGlvbiwga2VlcCBtdXRhdG9yIHRvIHJlZHVjZSByZWR1bmRhbnQgY2FsY3VsYXRpb24gYW5kIGZvciBjb21wYXJpc29uLiBTZXQgdG8gbnVsbCB3aGVuIGRhdGEgY2hhbmdlcyFcclxuICAgIHByaXZhdGUgdmVjdG9yczogVmVjdG9yUmVwcmVzZW50YXRpb247IC8vIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVE9ETzogZmlndXJlIG91dCB3aGF0IHRoaXMgaXMgdXNlZCBmb3JcclxuICAgIC8qKiBUT0RPOiBkZXNjcmliZSEgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTihfd2lkdGg6IG51bWJlciwgX2hlaWdodDogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gbmV3IE1hdHJpeDN4MztcclxuICAgICAgbXR4UmVzdWx0LmRhdGEuc2V0KFtcclxuICAgICAgICAyIC8gX3dpZHRoLCAwLCAwLFxyXG4gICAgICAgIDAsIC0yIC8gX2hlaWdodCwgMCxcclxuICAgICAgICAtMSwgMSwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIGEgbmV3IGlkZW50aXR5IG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBJREVOVElUWSgpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLmdldChNYXRyaXgzeDMpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHRyYW5zbGF0ZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtIGFuZCB5LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNMQVRJT04oX3RyYW5zbGF0ZTogVmVjdG9yMik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLFxyXG4gICAgICAgIF90cmFuc2xhdGUueCwgX3RyYW5zbGF0ZS55LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHotYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKiBAcGFyYW0gX2FuZ2xlSW5EZWdyZWVzIFRoZSB2YWx1ZSBvZiB0aGUgcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCBzaW4sIDAsXHJcbiAgICAgICAgLXNpbiwgY29zLCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgc2NhbGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSBhbmQgeS1heGlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTElORyhfc2NhbGFyOiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBfc2NhbGFyLngsIDAsIDAsXHJcbiAgICAgICAgMCwgX3NjYWxhci55LCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHR3byBwYXNzZWQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPRFVDVChfbXR4TGVmdDogTWF0cml4M3gzLCBfbXR4UmlnaHQ6IE1hdHJpeDN4Myk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCBhMDA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMCAqIDMgKyAwXTtcclxuICAgICAgbGV0IGEwMTogbnVtYmVyID0gX210eExlZnQuZGF0YVswICogMyArIDFdO1xyXG4gICAgICBsZXQgYTAyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzAgKiAzICsgMl07XHJcbiAgICAgIGxldCBhMTA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMSAqIDMgKyAwXTtcclxuICAgICAgbGV0IGExMTogbnVtYmVyID0gX210eExlZnQuZGF0YVsxICogMyArIDFdO1xyXG4gICAgICBsZXQgYTEyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzEgKiAzICsgMl07XHJcbiAgICAgIGxldCBhMjA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMiAqIDMgKyAwXTtcclxuICAgICAgbGV0IGEyMTogbnVtYmVyID0gX210eExlZnQuZGF0YVsyICogMyArIDFdO1xyXG4gICAgICBsZXQgYTIyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzIgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMDA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMDE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMDI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMTA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMTE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMTI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMjA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMjE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMjI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMl07XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMCxcclxuICAgICAgICBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjEsXHJcbiAgICAgICAgYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyLFxyXG4gICAgICAgIGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMCxcclxuICAgICAgICBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjEsXHJcbiAgICAgICAgYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyLFxyXG4gICAgICAgIGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMCxcclxuICAgICAgICBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjEsXHJcbiAgICAgICAgYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGludmVyc2Ugb2YgYSBwYXNzZWQgbWF0cml4LlxyXG4gICAgICogQHBhcmFtIF9tdHggVGhlIG1hdHJpeCB0byBjb21wdXRlIHRoZSBpbnZlcnNlIG9mLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX210eDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF9tdHguZGF0YTtcclxuICAgICAgbGV0IG0wMDogbnVtYmVyID0gbVswICogMyArIDBdO1xyXG4gICAgICBsZXQgbTAxOiBudW1iZXIgPSBtWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMDI6IG51bWJlciA9IG1bMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IG0xMDogbnVtYmVyID0gbVsxICogMyArIDBdO1xyXG4gICAgICBsZXQgbTExOiBudW1iZXIgPSBtWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMTI6IG51bWJlciA9IG1bMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IG0yMDogbnVtYmVyID0gbVsyICogMyArIDBdO1xyXG4gICAgICBsZXQgbTIxOiBudW1iZXIgPSBtWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMjI6IG51bWJlciA9IG1bMiAqIDMgKyAyXTtcclxuXHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSAxIC9cclxuICAgICAgICAobTAwICogKG0xMSAqIG0yMiAtIG0yMSAqIG0xMikgLVxyXG4gICAgICAgICAgbTAxICogKG0xMCAqIG0yMiAtIG0xMiAqIG0yMCkgK1xyXG4gICAgICAgICAgbTAyICogKG0xMCAqIG0yMSAtIG0xMSAqIG0yMCkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBkICogKG0xMSAqIG0yMiAtIG0yMSAqIG0xMiksIC8vIFswXVxyXG4gICAgICAgIGQgKiAobTAyICogbTIxIC0gbTAxICogbTIyKSwgLy8gWzFdXHJcbiAgICAgICAgZCAqIChtMDEgKiBtMTIgLSBtMDIgKiBtMTEpLCAvLyBbMl1cclxuICAgICAgICBkICogKG0xMiAqIG0yMCAtIG0xMCAqIG0yMiksIC8vIFszXVxyXG4gICAgICAgIGQgKiAobTAwICogbTIyIC0gbTAyICogbTIwKSwgLy8gWzRdXHJcbiAgICAgICAgZCAqIChtMTAgKiBtMDIgLSBtMDAgKiBtMTIpLCAvLyBbNV1cclxuICAgICAgICBkICogKG0xMCAqIG0yMSAtIG0yMCAqIG0xMSksIC8vIFs2XVxyXG4gICAgICAgIGQgKiAobTIwICogbTAxIC0gbTAwICogbTIxKSwgLy8gWzddXHJcbiAgICAgICAgZCAqIChtMDAgKiBtMTEgLSBtMTAgKiBtMDEpIC8vIFs4XVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB7QGxpbmsgVmVjdG9yMn0uICBcclxuICAgICAqICoqQ2F1dGlvbiEqKiBVc2UgaW1tZWRpYXRlbHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGJ5IFJlY3ljbGVyLiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXggaWdub3JpbmcgaXRzIHJvdGF0aW9uIGFuZCBzY2FsaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHJhbnNsYXRpb24oKTogVmVjdG9yMiB7XHJcbiAgICAgIGlmICghdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG5ldyBWZWN0b3IyKHRoaXMuZGF0YVs2XSwgdGhpcy5kYXRhWzddKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbjsgLy8gLmNsb25lO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGlvbihfdHJhbnNsYXRpb246IFZlY3RvcjIpIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfdHJhbnNsYXRpb24uZ2V0KCksIDYpO1xyXG4gICAgICAvLyBubyBmdWxsIGNhY2hlIHJlc2V0IHJlcXVpcmVkXHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IF90cmFuc2xhdGlvbjtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogYSBjb3B5IG9mIHRoZSBjYWxjdWxhdGVkIHJvdGF0aW9uIHtAbGluayBWZWN0b3IyfSAgIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgaWYgKCF0aGlzLnZlY3RvcnMucm90YXRpb24pXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnJvdGF0aW9uID0gdGhpcy5nZXRFdWxlckFuZ2xlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnZlY3RvcnMucm90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJyb3RhdGlvblwiOiBfcm90YXRpb24gfSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIERvIG5vdCBtYW5pcHVsYXRlIHJlc3VsdCwgaW5zdGVhZCBjcmVhdGUgYSBjbG9uZSEgICAgXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzY2FsaW5nKCk6IFZlY3RvcjIge1xyXG4gICAgICBpZiAoIXRoaXMudmVjdG9ycy5zY2FsaW5nKVxyXG4gICAgICAgIHRoaXMudmVjdG9ycy5zY2FsaW5nID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVswXSwgdGhpcy5kYXRhWzFdKSAqICh0aGlzLmRhdGFbMF0gPCAwID8gLTEgOiAxKSxcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzNdLCB0aGlzLmRhdGFbNF0pICogKHRoaXMuZGF0YVs0XSA8IDAgPyAtMSA6IDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy5zY2FsaW5nOyAvLyAuY2xvbmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNjYWxpbmcoX3NjYWxpbmc6IFZlY3RvcjIpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIG1hdHJpeCB0byB0aGUgaWRlbnRpdHktbWF0cml4IGFuZCBjbGVhcnMgY2FjaGUuIFVzZWQgYnkgdGhlIHJlY3ljbGVyIHRvIHJlc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMSwgMCxcclxuICAgICAgICAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2xhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYnkgdGhlIGdpdmVuIHtAbGluayBWZWN0b3IyfSB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZShfYnk6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5UUkFOU0xBVElPTihfYnkpKTtcclxuICAgICAgLy8gVE9ETzogcG9zc2libGUgb3B0aW1pemF0aW9uLCB0cmFuc2xhdGlvbiBtYXkgYWx0ZXIgbXV0YXRvciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LlxyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB4LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVYKF94OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGFbNl0gKz0gX3g7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVZKF95OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGFbN10gKz0gX3k7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFJvdGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHotQXhpcyB0byB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlKF9hbmdsZUluRGVncmVlczogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBNYXRyaXgzeDMuUk9UQVRJT04oX2FuZ2xlSW5EZWdyZWVzKSk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBNYXRyaXgzeDMuU0NBTElORyhfYnkpKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGFsb25nIHRoZSB4LUF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZVgoX2J5OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9ieSwgMSk7XHJcbiAgICAgIHRoaXMuc2NhbGUodmVjdG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodmVjdG9yKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBhbG9uZyB0aGUgeS1BeGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGVZKF9ieTogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IHdpdGggdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoX210eFJpZ2h0OiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBfbXR4UmlnaHQpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGV1bGVyLWFuZ2xlcyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcm90YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEV1bGVyQW5nbGUoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHNjYWxpbmc6IFZlY3RvcjIgPSB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICBsZXQgczA6IG51bWJlciA9IHRoaXMuZGF0YVswXSAvIHNjYWxpbmcueDtcclxuICAgICAgbGV0IHMxOiBudW1iZXIgPSB0aGlzLmRhdGFbMV0gLyBzY2FsaW5nLng7XHJcbiAgICAgIGxldCBzMzogbnVtYmVyID0gdGhpcy5kYXRhWzNdIC8gc2NhbGluZy55O1xyXG4gICAgICBsZXQgczQ6IG51bWJlciA9IHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueTtcclxuXHJcbiAgICAgIGxldCB4U2tldzogbnVtYmVyID0gTWF0aC5hdGFuMigtczMsIHM0KTtcclxuICAgICAgbGV0IHlTa2V3OiBudW1iZXIgPSBNYXRoLmF0YW4yKHMwLCBzMSk7XHJcblxyXG4gICAgICBsZXQgc3k6IG51bWJlciA9IE1hdGguaHlwb3QoczAsIHMxKTsgLy8gcHJvYmFibHkgMi4gcGFyYW0gc2hvdWxkIGJlIHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueVxyXG4gICAgICBsZXQgcm90YXRpb246IG51bWJlcjtcclxuXHJcbiAgICAgIGlmICghKHN5ID4gMWUtNikpXHJcbiAgICAgICAgcm90YXRpb24gPSB5U2tldztcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJvdGF0aW9uID0geFNrZXc7XHJcblxyXG4gICAgICByb3RhdGlvbiAqPSBDYWxjLnJhZDJkZWc7XHJcblxyXG4gICAgICByZXR1cm4gcm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpOyAvLyBUT0RPOiBmb3Igbm93IHJlc2V0IHRoZSBjYWNoZSwgYXMgaSBoYXZlIG5vIGlkZWEgaG93IHRoZSBjYWNoaW5nIHdvcmtzIGZvciBtYXRyaXgzeDMuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4M3gzKHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgLy8gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiB0aGlzLnRyYW5zbGF0aW9uLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiBhd2FpdCB0aGlzLnRyYW5zbGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnRyYW5zbGF0aW9uKSxcclxuICAgICAgICByb3RhdGlvbjogX3NlcmlhbGl6YXRpb24ucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogYXdhaXQgdGhpcy5zY2FsaW5nLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnNjYWxpbmcpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMubXV0YXRlKG11dGF0b3IpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgaWYgKHRoaXMubXV0YXRvcilcclxuICAgICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG5cclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgb2xkVHJhbnNsYXRpb246IFZlY3RvcjIgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICBsZXQgb2xkUm90YXRpb246IG51bWJlciA9IHRoaXMucm90YXRpb247XHJcbiAgICAgIGxldCBvbGRTY2FsaW5nOiBWZWN0b3IyID0gdGhpcy5zY2FsaW5nO1xyXG4gICAgICBsZXQgbmV3VHJhbnNsYXRpb246IFZlY3RvcjIgPSA8VmVjdG9yMj5fbXV0YXRvcltcInRyYW5zbGF0aW9uXCJdO1xyXG4gICAgICBsZXQgbmV3Um90YXRpb246IG51bWJlciA9IDxudW1iZXI+X211dGF0b3JbXCJyb3RhdGlvblwiXTtcclxuICAgICAgbGV0IG5ld1NjYWxpbmc6IFZlY3RvcjIgPSA8VmVjdG9yMj5fbXV0YXRvcltcInNjYWxpbmdcIl07XHJcbiAgICAgIGxldCB2ZWN0b3JzOiBWZWN0b3JSZXByZXNlbnRhdGlvbiA9IHsgdHJhbnNsYXRpb246IG9sZFRyYW5zbGF0aW9uLCByb3RhdGlvbjogb2xkUm90YXRpb24sIHNjYWxpbmc6IG9sZFNjYWxpbmcgfTtcclxuICAgICAgaWYgKG5ld1RyYW5zbGF0aW9uKSB7XHJcbiAgICAgICAgdmVjdG9ycy50cmFuc2xhdGlvbiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgbmV3VHJhbnNsYXRpb24ueCAhPSB1bmRlZmluZWQgPyBuZXdUcmFuc2xhdGlvbi54IDogb2xkVHJhbnNsYXRpb24ueCxcclxuICAgICAgICAgIG5ld1RyYW5zbGF0aW9uLnkgIT0gdW5kZWZpbmVkID8gbmV3VHJhbnNsYXRpb24ueSA6IG9sZFRyYW5zbGF0aW9uLnlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2ZWN0b3JzLnJvdGF0aW9uID0gKG5ld1JvdGF0aW9uID09IHVuZGVmaW5lZCkgPyBvbGRSb3RhdGlvbiA6IG5ld1JvdGF0aW9uO1xyXG5cclxuICAgICAgaWYgKG5ld1NjYWxpbmcpIHtcclxuICAgICAgICB2ZWN0b3JzLnNjYWxpbmcgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICAgIG5ld1NjYWxpbmcueCAhPSB1bmRlZmluZWQgPyBuZXdTY2FsaW5nLnggOiBvbGRTY2FsaW5nLngsXHJcbiAgICAgICAgICBuZXdTY2FsaW5nLnkgIT0gdW5kZWZpbmVkID8gbmV3U2NhbGluZy55IDogb2xkU2NhbGluZy55XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVE9ETzogcG9zc2libGUgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdoZW4gb25seSBvbmUgb3IgdHdvIGNvbXBvbmVudHMgY2hhbmdlLCB0aGVuIHVzZSBvbGQgbWF0cml4IGluc3RlYWQgb2YgSURFTlRJVFkgYW5kIHRyYW5zZm9ybSBieSBkaWZmZXJlbmNlcy9xdW90aWVudHNcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICAgIGlmICh2ZWN0b3JzLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgIG10eFJlc3VsdC50cmFuc2xhdGUodmVjdG9ycy50cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICh2ZWN0b3JzLnJvdGF0aW9uKSB7XHJcbiAgICAgICAgbXR4UmVzdWx0LnJvdGF0ZSh2ZWN0b3JzLnJvdGF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmVjdG9ycy5zY2FsaW5nKVxyXG4gICAgICAgIG10eFJlc3VsdC5zY2FsZSh2ZWN0b3JzLnNjYWxpbmcpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcblxyXG4gICAgICB0aGlzLnZlY3RvcnMgPSB2ZWN0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHt9O1xyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHR5cGVzLnRyYW5zbGF0aW9uID0gXCJWZWN0b3IyXCI7XHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiAhPSB1bmRlZmluZWQpIHR5cGVzLnJvdGF0aW9uID0gXCJudW1iZXJcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnNjYWxpbmcpIHR5cGVzLnNjYWxpbmcgPSBcIlZlY3RvcjJcIjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy52ZWN0b3JzID0geyB0cmFuc2xhdGlvbjogbnVsbCwgcm90YXRpb246IG51bGwsIHNjYWxpbmc6IG51bGwgfTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBTdG9yZXMgYSA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFuZCBwcm92aWRlcyBvcGVyYXRpb25zIGZvciBpdC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogWyAwLCAxLCAyLCAzIF0g4oaQIHJvdyB2ZWN0b3IgeFxyXG4gICAqIFsgNCwgNSwgNiwgNyBdIOKGkCByb3cgdmVjdG9yIHlcclxuICAgKiBbIDgsIDksMTAsMTEgXSDihpAgcm93IHZlY3RvciB6XHJcbiAgICogWzEyLDEzLDE0LDE1IF0g4oaQIHRyYW5zbGF0aW9uXHJcbiAgICogICAgICAgICAgICDihpEgIGhvbW9nZW5lb3VzIGNvbHVtblxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTkgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0cml4NHg0IGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgUmVjeWNhYmxlIHtcclxuICAgIHByaXZhdGUgZGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7IC8vIFRoZSBkYXRhIG9mIHRoZSBtYXRyaXguXHJcbiAgICBwcml2YXRlIG11dGF0b3I6IE11dGF0b3IgPSBudWxsOyAvLyBwcmVwYXJlZCBmb3Igb3B0aW1pemF0aW9uLCBrZWVwIG11dGF0b3IgdG8gcmVkdWNlIHJlZHVuZGFudCBjYWxjdWxhdGlvbiBhbmQgZm9yIGNvbXBhcmlzb24uIFNldCB0byBudWxsIHdoZW4gZGF0YSBjaGFuZ2VzIVxyXG5cclxuICAgIHJlYWRvbmx5ICN0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgcmVhZG9ubHkgI3NjYWxpbmc6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHJlYWRvbmx5ICNyb3RhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKCk7XHJcbiAgICByZWFkb25seSAjcXVhdGVybmlvbjogUXVhdGVybmlvbiA9IFF1YXRlcm5pb24uSURFTlRJVFkoKTtcclxuXHJcbiAgICAjdHJhbnNsYXRpb25EaXJ0eTogYm9vbGVhbjtcclxuICAgICNzY2FsaW5nRGlydHk6IGJvb2xlYW47XHJcbiAgICAjcm90YXRpb25EaXJ0eTogYm9vbGVhbjtcclxuICAgICNxdWF0ZXJuaW9uRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBJREVOVElUWSgpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcG9zZXMgYSBuZXcgbWF0cml4IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsaW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENPTVBPU0lUSU9OKF90cmFuc2xhdGlvbj86IFZlY3RvcjMsIF9yb3RhdGlvbj86IFZlY3RvcjMgfCBRdWF0ZXJuaW9uLCBfc2NhbGluZz86IFZlY3RvcjMpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgcmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICAgcmVzdWx0Lm11dGF0ZSh7IFwidHJhbnNsYXRpb25cIjogX3RyYW5zbGF0aW9uLCBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiwgXCJzY2FsaW5nXCI6IF9zY2FsaW5nIH0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdHdvIHBhc3NlZCBtYXRyaWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdHhMZWZ0OiBNYXRyaXg0eDQsIF9tdHhSaWdodDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IGE6IEZsb2F0MzJBcnJheSA9IF9tdHhMZWZ0LmRhdGE7XHJcbiAgICAgIGxldCBiOiBGbG9hdDMyQXJyYXkgPSBfbXR4UmlnaHQuZGF0YTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYTAwOiBudW1iZXIgPSBhWzAgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMDE6IG51bWJlciA9IGFbMCAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEwMjogbnVtYmVyID0gYVswICogNCArIDJdO1xyXG4gICAgICBsZXQgYTAzOiBudW1iZXIgPSBhWzAgKiA0ICsgM107XHJcbiAgICAgIGxldCBhMTA6IG51bWJlciA9IGFbMSAqIDQgKyAwXTtcclxuICAgICAgbGV0IGExMTogbnVtYmVyID0gYVsxICogNCArIDFdO1xyXG4gICAgICBsZXQgYTEyOiBudW1iZXIgPSBhWzEgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMTM6IG51bWJlciA9IGFbMSAqIDQgKyAzXTtcclxuICAgICAgbGV0IGEyMDogbnVtYmVyID0gYVsyICogNCArIDBdO1xyXG4gICAgICBsZXQgYTIxOiBudW1iZXIgPSBhWzIgKiA0ICsgMV07XHJcbiAgICAgIGxldCBhMjI6IG51bWJlciA9IGFbMiAqIDQgKyAyXTtcclxuICAgICAgbGV0IGEyMzogbnVtYmVyID0gYVsyICogNCArIDNdO1xyXG4gICAgICBsZXQgYTMwOiBudW1iZXIgPSBhWzMgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMzE6IG51bWJlciA9IGFbMyAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEzMjogbnVtYmVyID0gYVszICogNCArIDJdO1xyXG4gICAgICBsZXQgYTMzOiBudW1iZXIgPSBhWzMgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMDA6IG51bWJlciA9IGJbMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIwMTogbnVtYmVyID0gYlswICogNCArIDFdO1xyXG4gICAgICBsZXQgYjAyOiBudW1iZXIgPSBiWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMDM6IG51bWJlciA9IGJbMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIxMDogbnVtYmVyID0gYlsxICogNCArIDBdO1xyXG4gICAgICBsZXQgYjExOiBudW1iZXIgPSBiWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMTI6IG51bWJlciA9IGJbMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIxMzogbnVtYmVyID0gYlsxICogNCArIDNdO1xyXG4gICAgICBsZXQgYjIwOiBudW1iZXIgPSBiWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBiMjE6IG51bWJlciA9IGJbMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IGIyMjogbnVtYmVyID0gYlsyICogNCArIDJdO1xyXG4gICAgICBsZXQgYjIzOiBudW1iZXIgPSBiWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMzA6IG51bWJlciA9IGJbMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIzMTogbnVtYmVyID0gYlszICogNCArIDFdO1xyXG4gICAgICBsZXQgYjMyOiBudW1iZXIgPSBiWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMzM6IG51bWJlciA9IGJbMyAqIDQgKyAzXTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwICsgYjAzICogYTMwLFxyXG4gICAgICAgIGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMSArIGIwMyAqIGEzMSxcclxuICAgICAgICBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjIgKyBiMDMgKiBhMzIsXHJcbiAgICAgICAgYjAwICogYTAzICsgYjAxICogYTEzICsgYjAyICogYTIzICsgYjAzICogYTMzLFxyXG4gICAgICAgIGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMCArIGIxMyAqIGEzMCxcclxuICAgICAgICBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjEgKyBiMTMgKiBhMzEsXHJcbiAgICAgICAgYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyICsgYjEzICogYTMyLFxyXG4gICAgICAgIGIxMCAqIGEwMyArIGIxMSAqIGExMyArIGIxMiAqIGEyMyArIGIxMyAqIGEzMyxcclxuICAgICAgICBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjAgKyBiMjMgKiBhMzAsXHJcbiAgICAgICAgYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxICsgYjIzICogYTMxLFxyXG4gICAgICAgIGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMiArIGIyMyAqIGEzMixcclxuICAgICAgICBiMjAgKiBhMDMgKyBiMjEgKiBhMTMgKyBiMjIgKiBhMjMgKyBiMjMgKiBhMzMsXHJcbiAgICAgICAgYjMwICogYTAwICsgYjMxICogYTEwICsgYjMyICogYTIwICsgYjMzICogYTMwLFxyXG4gICAgICAgIGIzMCAqIGEwMSArIGIzMSAqIGExMSArIGIzMiAqIGEyMSArIGIzMyAqIGEzMSxcclxuICAgICAgICBiMzAgKiBhMDIgKyBiMzEgKiBhMTIgKyBiMzIgKiBhMjIgKyBiMzMgKiBhMzIsXHJcbiAgICAgICAgYjMwICogYTAzICsgYjMxICogYTEzICsgYjMyICogYTIzICsgYjMzICogYTMzXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHRyYW5zcG9zZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNQT1NFKF9tdHg6IE1hdHJpeDR4NCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBfbXR4LmNsb25lLnRyYW5zcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGludmVyc2Ugb2YgYSBwYXNzZWQgbWF0cml4LlxyXG4gICAgICogQHBhcmFtIF9tdHggVGhlIG1hdHJpeCB0byBjb21wdXRlIHRoZSBpbnZlcnNlIG9mLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX210eDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIF9tdHguY2xvbmUuaW52ZXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgaXRzIHotYXhpcyBwb2ludGluZyBkaXJlY3RseSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0LFxyXG4gICAgICogYW5kIGEgbWluaW1hbCBhbmdsZSBiZXR3ZWVuIGl0cyB5LWF4aXMgYW5kIHRoZSBnaXZlbiB1cC17QGxpbmsgVmVjdG9yM30sIHJlc3BldGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBhbmQgcGl0Y2guXHJcbiAgICAgKiBUaGUgcGl0Y2ggbWF5IGJlIHJlc3RyaWN0ZWQgdG8gdGhlIHVwLXZlY3RvciB0byBvbmx5IGNhbGN1bGF0ZSB5YXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTE9PS19BVChfdHJhbnNsYXRpb246IFZlY3RvcjMsIF90YXJnZXQ6IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpLCBfcmVzdHJpY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCBfdHJhbnNsYXRpb24pO1xyXG4gICAgICB6QXhpcy5ub3JtYWxpemUoKTtcclxuICAgICAgbGV0IHZjdENyb3NzOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKTtcclxuICAgICAgaWYgKHZjdENyb3NzLm1hZ25pdHVkZVNxdWFyZWQgPT0gMCkgLy8gZXhwZXJpbWVudGFsIHdvcmthcm91bmQ6IGlmIHogYW5kIHVwIGlzIHBhcmFsbGVsLCB0aGVyZSBpcyBubyB1cCB0byByZW1haW4uLi5cclxuICAgICAgICB2Y3RDcm9zcy54ID0gMC4wMDE7IC8vIHNvIHRpbHQgYSBsaXR0bGVcclxuICAgICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHZjdENyb3NzKTtcclxuICAgICAgbGV0IHlBeGlzOiBWZWN0b3IzID0gX3Jlc3RyaWN0ID8gX3VwIDogVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoekF4aXMsIHhBeGlzKSk7XHJcbiAgICAgIHpBeGlzID0gX3Jlc3RyaWN0ID8gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoeEF4aXMsIF91cCkpIDogekF4aXM7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgeEF4aXMueCwgeEF4aXMueSwgeEF4aXMueiwgMCxcclxuICAgICAgICB5QXhpcy54LCB5QXhpcy55LCB5QXhpcy56LCAwLFxyXG4gICAgICAgIHpBeGlzLngsIHpBeGlzLnksIHpBeGlzLnosIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLngsXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLnksXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLnosXHJcbiAgICAgICAgMVxyXG4gICAgICBdKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSh6QXhpcywgeEF4aXMsIHZjdENyb3NzKTsgLy8gZG9uJ3Qgc3RvcmUgeUF4aXMsIGl0IG1pZ2h0IGJlIF91cFxyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIGl0cyB6LWF4aXMgcG9pbnRpbmcgZGlyZWN0bHkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbixcclxuICAgICAqIGFuZCBhIG1pbmltYWwgYW5nbGUgYmV0d2VlbiBpdHMgeS1heGlzIGFuZCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LiBJZGVhbGx5IHVwIHNob3VsZCBiZSBwZXJwZW5kaWN1bGFyIHRvIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTE9PS19JTihfdHJhbnNsYXRpb246IFZlY3RvcjMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKF9kaXJlY3Rpb24pO1xyXG4gICAgICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKSk7XHJcbiAgICAgIGxldCB5QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHpBeGlzLCB4QXhpcykpO1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIHhBeGlzLngsIHhBeGlzLnksIHhBeGlzLnosIDAsXHJcbiAgICAgICAgeUF4aXMueCwgeUF4aXMueSwgeUF4aXMueiwgMCxcclxuICAgICAgICB6QXhpcy54LCB6QXhpcy55LCB6QXhpcy56LCAwLFxyXG4gICAgICAgIF90cmFuc2xhdGlvbi54LCBfdHJhbnNsYXRpb24ueSwgX3RyYW5zbGF0aW9uLnosIDFcclxuICAgICAgXSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUoekF4aXMsIHhBeGlzLCB5QXhpcyk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgaXRzIHktYXhpcyBtYXRjaGluZyB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9XHJcbiAgICAgKiBhbmQgaXRzIHotYXhpcyBmYWNpbmcgdG93YXJkcyB0aGUgZ2l2ZW4gdGFyZ2V0IGF0IGEgbWluaW1hbCBhbmdsZSwgcmVzcGV0aXZlbHkgY2FsY3VsYXRpbmcgeWF3IG9ubHkuXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgU0hPV19UTyhfdHJhbnNsYXRpb246IFZlY3RvcjMsIF90YXJnZXQ6IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpKTogTWF0cml4NHg0IHtcclxuICAgIC8vICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5nZXQoTWF0cml4NHg0KTtcclxuICAgIC8vICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIF90cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIHpBeGlzLm5vcm1hbGl6ZSgpO1xyXG4gICAgLy8gICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKSk7XHJcbiAgICAvLyAgIC8vIGxldCB5QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHpBeGlzLCB4QXhpcykpO1xyXG4gICAgLy8gICB6QXhpcyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHhBeGlzLCBfdXApKTtcclxuICAgIC8vICAgbXR4UmVzdWx0LmRhdGEuc2V0KFxyXG4gICAgLy8gICAgIFtcclxuICAgIC8vICAgICAgIHhBeGlzLngsIHhBeGlzLnksIHhBeGlzLnosIDAsXHJcbiAgICAvLyAgICAgICBfdXAueCwgX3VwLnksIF91cC56LCAwLFxyXG4gICAgLy8gICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgIC8vICAgICAgIF90cmFuc2xhdGlvbi54LFxyXG4gICAgLy8gICAgICAgX3RyYW5zbGF0aW9uLnksXHJcbiAgICAvLyAgICAgICBfdHJhbnNsYXRpb24ueixcclxuICAgIC8vICAgICAgIDFcclxuICAgIC8vICAgICBdKTtcclxuICAgIC8vICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCB0cmFuc2xhdGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSwgeS0gYW5kIHotYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0xBVElPTihfdHJhbnNsYXRlOiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMSwgMCxcclxuICAgICAgICBfdHJhbnNsYXRlLngsIF90cmFuc2xhdGUueSwgX3RyYW5zbGF0ZS56LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHgtYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT05fWChfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbGV0IGFuZ2xlSW5SYWRpYW5zOiBudW1iZXIgPSBfYW5nbGVJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBzaW46IG51bWJlciA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbGV0IGNvczogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIGNvcywgc2luLCAwLFxyXG4gICAgICAgIDAsIC1zaW4sIGNvcywgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHktYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT05fWShfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB6LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1ooX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCBzaW4sIDAsIDAsXHJcbiAgICAgICAgLXNpbiwgY29zLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIHJvdGF0aW9uIGV1bGVyIGFuZ2xlcyBvciB1bml0IHF1YXRlcm5pb24gZ2l2ZW4uXHJcbiAgICAgKiBSb3RhdGlvbiBvY2N1cnMgYXJvdW5kIHRoZSBheGlzIGluIHRoZSBvcmRlciBaLVktWCAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX3JvdGF0aW9uOiBWZWN0b3IzIHwgUXVhdGVybmlvbik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtdHhSZXN1bHQuZGF0YSwgX3JvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCBzY2FsZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtLCB5LSBhbmQgei1heGlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTElORyhfc2NhbGFyOiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBfc2NhbGFyLngsIDAsIDAsIDAsXHJcbiAgICAgICAgMCwgX3NjYWxhci55LCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIF9zY2FsYXIueiwgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtYXRyaXggcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGJhc2UuXHJcbiAgICAgKiBJZiBrbm93biwgcGFzcyB0aGUgaW52ZXJzZSBvZiB0aGUgYmFzZSB0byBhdm9pZCB1bm5lY2Nlc2FyeSBjYWxjdWxhdGlvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSRUxBVElWRShfbXR4OiBNYXRyaXg0eDQsIF9tdHhCYXNlOiBNYXRyaXg0eDQsIF9tdHhJbnZlcnNlPzogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKF9tdHhJbnZlcnNlKVxyXG4gICAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVChfbXR4SW52ZXJzZSwgX210eCk7XHJcblxyXG4gICAgICBsZXQgbXR4SW52ZXJzZTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UoX210eEJhc2UpO1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChtdHhJbnZlcnNlLCBfbXR4KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4SW52ZXJzZSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUFJPSkVDVElPTlNcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggdGhhdCBhcHBsaWVzIHBlcnNwZWN0aXZlIHRvIGFuIG9iamVjdCwgaWYgaXRzIHRyYW5zZm9ybSBpcyBtdWx0aXBsaWVkIGJ5IGl0LlxyXG4gICAgICogQHBhcmFtIF9hc3BlY3QgVGhlIGFzcGVjdCByYXRpbyBiZXR3ZWVuIHdpZHRoIGFuZCBoZWlnaHQgb2YgcHJvamVjdGlvbnNwYWNlLihEZWZhdWx0ID0gY2FudmFzLmNsaWVudFdpZHRoIC8gY2FudmFzLkNsaWVudEhlaWdodClcclxuICAgICAqIEBwYXJhbSBfZmllbGRPZlZpZXdJbkRlZ3JlZXMgVGhlIGZpZWxkIG9mIHZpZXcgaW4gRGVncmVlcy4gKERlZmF1bHQgPSA0NSlcclxuICAgICAqIEBwYXJhbSBfbmVhciBUaGUgbmVhciBjbGlwc3BhY2UgYm9yZGVyIG9uIHRoZSB6LWF4aXMuXHJcbiAgICAgKiBAcGFyYW0gX2ZhciBUaGUgZmFyIGNsaXBzcGFjZSBib3JkZXIgb24gdGhlIHotYXhpcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBwbGFuZSBvbiB3aGljaCB0aGUgZmllbGRPZlZpZXctQW5nbGUgaXMgZ2l2ZW4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTl9DRU5UUkFMKF9hc3BlY3Q6IG51bWJlciwgX2ZpZWxkT2ZWaWV3SW5EZWdyZWVzOiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIC8vVE9ETzogY2FtZXJhIGxvb2tzIGRvd24gbmVnYXRpdmUgei1kaXJlY3Rpb24sIHNob3VsZCBiZSBwb3NpdGl2ZVxyXG4gICAgICBsZXQgZmllbGRPZlZpZXdJblJhZGlhbnM6IG51bWJlciA9IF9maWVsZE9mVmlld0luRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IGY6IG51bWJlciA9IE1hdGgudGFuKDAuNSAqIChNYXRoLlBJIC0gZmllbGRPZlZpZXdJblJhZGlhbnMpKTtcclxuICAgICAgbGV0IHJhbmdlSW52OiBudW1iZXIgPSAxLjAgLyAoX25lYXIgLSBfZmFyKTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBmLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIGYsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgKF9uZWFyICsgX2ZhcikgKiByYW5nZUludiwgLTEsXHJcbiAgICAgICAgMCwgMCwgX25lYXIgKiBfZmFyICogcmFuZ2VJbnYgKiAyLCAwXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgaWYgKF9kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5ESUFHT05BTCkge1xyXG4gICAgICAgIF9hc3BlY3QgPSBNYXRoLnNxcnQoX2FzcGVjdCk7XHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbMF0gPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICBtdHhSZXN1bHQuZGF0YVs1XSA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICB9IGVsc2UgaWYgKF9kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5WRVJUSUNBTClcclxuICAgICAgICBtdHhSZXN1bHQuZGF0YVswXSA9IGYgLyBfYXNwZWN0O1xyXG4gICAgICBlbHNlIC8vRk9WX0RJUkVDVElPTi5IT1JJWk9OVEFMXHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbNV0gPSBmICogX2FzcGVjdDtcclxuXHJcbiAgICAgIC8vIEhBQ0s6IG1hdHJpeCBzaG91bGQgbG9vayBpbiBwb3NpdGl2ZSB6LWRpcmVjdGlvbiwgcHJlZmVyYWJseSB0aGUgbWF0cml4IHNob3VsZCBiZSBjYWxjdWxhdGVkIGxpa2UgdGhhdCByaWdodCBhd2F5XHJcbiAgICAgIG10eFJlc3VsdC5yb3RhdGVZKDE4MCk7XHJcblxyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggdGhhdCBhcHBsaWVzIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHRvIGFuIG9iamVjdCwgaWYgaXRzIHRyYW5zZm9ybSBpcyBtdWx0aXBsaWVkIGJ5IGl0LlxyXG4gICAgICogQHBhcmFtIF9sZWZ0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBsZWZ0IGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfcmlnaHQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHJpZ2h0IGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfYm90dG9tIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBib3R0b20gYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF90b3AgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHRvcCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX25lYXIgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIG5lYXIgYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF9mYXIgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGZhciBib3JkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9KRUNUSU9OX09SVEhPR1JBUEhJQyhfbGVmdDogbnVtYmVyLCBfcmlnaHQ6IG51bWJlciwgX2JvdHRvbTogbnVtYmVyLCBfdG9wOiBudW1iZXIsIF9uZWFyOiBudW1iZXIgPSAtNDAwLCBfZmFyOiBudW1iZXIgPSA0MDApOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIDIgLyAoX3JpZ2h0IC0gX2xlZnQpLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIC0yIC8gKF90b3AgLSBfYm90dG9tKSwgMCwgMCxcclxuICAgICAgICAwLCAwLCAyIC8gKF9mYXIgLSBfbmVhciksIDAsXHJcbiAgICAgICAgKF9sZWZ0ICsgX3JpZ2h0KSAvIChfbGVmdCAtIF9yaWdodCksXHJcbiAgICAgICAgKF9ib3R0b20gKyBfdG9wKSAvIChfYm90dG9tIC0gX3RvcCksXHJcbiAgICAgICAgKF9uZWFyICsgX2ZhcikgLyAoX25lYXIgLSBfZmFyKSxcclxuICAgICAgICAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSByb3RhdGlvbiBwYXJ0IG9mIHRoZSBnaXZlbiBtYXRyaXhlcyBkYXRhIGFycmF5IHRvIHRoZSBnaXZlbiByb3RhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2V0Um90YXRpb24oX206IEZsb2F0MzJBcnJheSwgX3JvdGF0aW9uOiBWZWN0b3IzIHwgUXVhdGVybmlvbik6IHZvaWQge1xyXG4gICAgICBpZiAoX3JvdGF0aW9uIGluc3RhbmNlb2YgVmVjdG9yMykge1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlc1JhZDogVmVjdG9yMyA9IFZlY3RvcjMuU0NBTEUoX3JvdGF0aW9uLCBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICAgIGNvbnN0IHNpblg6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlc1JhZC54KTtcclxuICAgICAgICBjb25zdCBjb3NYOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZXNSYWQueCk7XHJcbiAgICAgICAgY29uc3Qgc2luWTogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVzUmFkLnkpO1xyXG4gICAgICAgIGNvbnN0IGNvc1k6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlc1JhZC55KTtcclxuICAgICAgICBjb25zdCBzaW5aOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZXNSYWQueik7XHJcbiAgICAgICAgY29uc3QgY29zWjogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVzUmFkLnopO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGFuZ2xlc1JhZCk7XHJcblxyXG4gICAgICAgIF9tWzBdID0gY29zWiAqIGNvc1k7IC8qKi8gICAgICAgICAgICAgICAgIF9tWzFdID0gc2luWiAqIGNvc1k7IC8qKi8gICAgICAgICAgICAgICAgIF9tWzJdID0gLXNpblk7XHJcbiAgICAgICAgX21bNF0gPSBjb3NaICogc2luWSAqIHNpblggLSBzaW5aICogY29zWDsgX21bNV0gPSBzaW5aICogc2luWSAqIHNpblggKyBjb3NaICogY29zWDsgX21bNl0gPSBjb3NZICogc2luWDtcclxuICAgICAgICBfbVs4XSA9IGNvc1ogKiBzaW5ZICogY29zWCArIHNpblogKiBzaW5YOyBfbVs5XSA9IHNpblogKiBzaW5ZICogY29zWCAtIGNvc1ogKiBzaW5YOyBfbVsxMF0gPSBjb3NZICogY29zWDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByb3RhdGlvbk5vcm1hbGl6ZWQ6IFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLk5PUk1BTElaQVRJT04oX3JvdGF0aW9uKTtcclxuICAgICAgICBjb25zdCB4OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQueCwgeTogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLnksIHo6IG51bWJlciA9IHJvdGF0aW9uTm9ybWFsaXplZC56LCB3OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQudztcclxuICAgICAgICBjb25zdCB4eDogbnVtYmVyID0geCAqIHgsIHh5OiBudW1iZXIgPSB4ICogeSwgeHo6IG51bWJlciA9IHggKiB6LCB4dzogbnVtYmVyID0geCAqIHc7XHJcbiAgICAgICAgY29uc3QgeXk6IG51bWJlciA9IHkgKiB5LCB5ejogbnVtYmVyID0geSAqIHosIHl3OiBudW1iZXIgPSB5ICogdztcclxuICAgICAgICBjb25zdCB6ejogbnVtYmVyID0geiAqIHosIHp3OiBudW1iZXIgPSB6ICogdztcclxuICAgICAgICBjb25zdCB3dzogbnVtYmVyID0gdyAqIHc7XHJcblxyXG4gICAgICAgIF9tWzBdID0gd3cgKyB4eCAtIHl5IC0geno7IF9tWzFdID0gMiAqICh4eSArIHp3KTsvKiovIF9tWzJdID0gMiAqICh4eiAtIHl3KTtcclxuICAgICAgICBfbVs0XSA9IDIgKiAoeHkgLSB6dyk7LyoqLyBfbVs1XSA9IHd3IC0geHggKyB5eSAtIHp6OyBfbVs2XSA9IDIgKiAoeXogKyB4dyk7XHJcbiAgICAgICAgX21bOF0gPSAyICogKHh6ICsgeXcpOy8qKi8gX21bOV0gPSAyICogKHl6IC0geHcpOy8qKi8gX21bMTBdID0gd3cgLSB4eCAtIHl5ICsgeno7XHJcblxyXG4gICAgICAgIC8vIF9tWzBdID0gMSAtIDIgKiAoeXkgKyB6eik7IF9tWzFdID0gMiAqICh4eSArIHp3KTsvKiovIF9tWzJdID0gMiAqICh4eiAtIHl3KTtcclxuICAgICAgICAvLyBfbVs0XSA9IDIgKiAoeHkgLSB6dyk7LyoqLyBfbVs1XSA9IDEgLSAyICogKHh4ICsgenopOyBfbVs2XSA9IDIgKiAoeXogKyB4dyk7XHJcbiAgICAgICAgLy8gX21bOF0gPSAyICogKHh6ICsgeXcpOy8qKi8gX21bOV0gPSAyICogKHl6IC0geHcpOy8qKi8gX21bMTBdID0gMSAtIDIgKiAoeHggKyB5eSk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUocm90YXRpb25Ob3JtYWxpemVkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uICBBY2Nlc3NvcnNcclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeCBpZ25vcmluZyBpdHMgcm90YXRpb24gYW5kIHNjYWxpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0cmFuc2xhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uRGlydHkpIHtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbi5zZXQodGhpcy5kYXRhWzEyXSwgdGhpcy5kYXRhWzEzXSwgdGhpcy5kYXRhWzE0XSk7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb25EaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiN0cmFuc2xhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdHJhbnNsYXRpb24oX3RyYW5zbGF0aW9uOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJ0cmFuc2xhdGlvblwiOiBfdHJhbnNsYXRpb24gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcm90YXRpb24ge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNyb3RhdGlvbkRpcnR5KSB7XHJcbiAgICAgICAgbGV0IHNjYWxpbmc6IFZlY3RvcjMgPSB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGxldCBzMDogbnVtYmVyID0gdGhpcy5kYXRhWzBdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzMTogbnVtYmVyID0gdGhpcy5kYXRhWzFdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzMjogbnVtYmVyID0gdGhpcy5kYXRhWzJdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzNjogbnVtYmVyID0gdGhpcy5kYXRhWzZdIC8gc2NhbGluZy55O1xyXG4gICAgICAgIGxldCBzMTA6IG51bWJlciA9IHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLno7XHJcblxyXG4gICAgICAgIGxldCBzeTogbnVtYmVyID0gTWF0aC5oeXBvdChzMCwgczEpOyAvLyBwcm9iYWJseSAyLiBwYXJhbSBzaG91bGQgYmUgdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55XHJcblxyXG4gICAgICAgIGxldCBzaW5ndWxhcjogYm9vbGVhbiA9IHN5IDwgMWUtNjsgLy8gSWZcclxuXHJcbiAgICAgICAgbGV0IHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHoxOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHoyOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmICghc2luZ3VsYXIpIHtcclxuICAgICAgICAgIHgxID0gTWF0aC5hdGFuMihzNiwgczEwKTtcclxuICAgICAgICAgIHkxID0gTWF0aC5hdGFuMigtczIsIHN5KTtcclxuICAgICAgICAgIHoxID0gTWF0aC5hdGFuMihzMSwgczApO1xyXG5cclxuICAgICAgICAgIHgyID0gTWF0aC5hdGFuMigtczYsIC1zMTApO1xyXG4gICAgICAgICAgeTIgPSBNYXRoLmF0YW4yKC1zMiwgLXN5KTtcclxuICAgICAgICAgIHoyID0gTWF0aC5hdGFuMigtczEsIC1zMCk7XHJcblxyXG4gICAgICAgICAgaWYgKE1hdGguYWJzKHgyKSArIE1hdGguYWJzKHkyKSArIE1hdGguYWJzKHoyKSA8IE1hdGguYWJzKHgxKSArIE1hdGguYWJzKHkxKSArIE1hdGguYWJzKHoxKSkge1xyXG4gICAgICAgICAgICB4MSA9IHgyO1xyXG4gICAgICAgICAgICB5MSA9IHkyO1xyXG4gICAgICAgICAgICB6MSA9IHoyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB4MSA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs5XSAvIHNjYWxpbmcueiwgdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55KTtcclxuICAgICAgICAgIHkxID0gTWF0aC5hdGFuMigtdGhpcy5kYXRhWzJdIC8gc2NhbGluZy54LCBzeSk7XHJcbiAgICAgICAgICB6MSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5zZXQoeDEsIHkxLCB6MSk7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb24uc2NhbGUoQ2FsYy5yYWQyZGVnKTtcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90YXRpb24oX3JvdGF0aW9uOiBRdWF0ZXJuaW9uIHwgVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwicm90YXRpb25cIjogX3JvdGF0aW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxpbmcge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc2NhbGluZygpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3NjYWxpbmdEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuI3NjYWxpbmcuc2V0KFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdKSwgLy8qICh0aGlzLmRhdGFbMF0gPCAwID8gLTEgOiAxKSxcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSksIC8vKiAodGhpcy5kYXRhWzVdIDwgMCA/IC0xIDogMSksXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdKSAvLyAqICh0aGlzLmRhdGFbMTBdIDwgMCA/IC0xIDogMSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5kZXRlcm1pbmFudCA8IDApIC8vIOKaoO+4j0VYUEVSTUlORVRBTCBmcm9tIHRocmVlIGpzOiBpZiBkZXRlcm1pbmFudCBpcyBuZWdhdGl2ZSwgaW52ZXJ0IG9uZSBzY2FsZVxyXG4gICAgICAgIC8vICAgdGhpcy4jc2NhbGluZy54ID0gLXRoaXMuI3NjYWxpbmcueDtcclxuXHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjYWxpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNjYWxpbmcoX3NjYWxpbmc6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHVuaXQgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSBxdWF0ZXJuaW9uIGlzIGdvaW5nIHRvIGJlIHJldXNlZCBpbnRlcm5hbGx5LiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBxdWF0ZXJuaW9uKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBpZiAodGhpcy4jcXVhdGVybmlvbkRpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5ldWxlckFuZ2xlcyA9IHRoaXMucm90YXRpb247XHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNxdWF0ZXJuaW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBxdWF0ZXJuaW9uKF9xdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJyb3RhdGlvblwiOiBfcXVhdGVybmlvbiB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoaXMgbWF0cml4LiBDb21wdXRhdGlvbmFsIGhlYXZ5IG9wZXJhdGlvbiwgbm90IGNhY2hlZCBzbyB1c2Ugd2l0aCBjYXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGRldGVybWluYW50KCk6IG51bWJlciB7XHJcbiAgICAgIGNvbnN0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgIGNvbnN0IGRldDAwOiBudW1iZXIgPSBtWzEwXSAqIG1bMTVdIC0gbVsxMV0gKiBtWzE0XTtcclxuICAgICAgY29uc3QgZGV0MDE6IG51bWJlciA9IG1bOV0gKiBtWzE1XSAtIG1bMTFdICogbVsxM107XHJcbiAgICAgIGNvbnN0IGRldDAyOiBudW1iZXIgPSBtWzldICogbVsxNF0gLSBtWzEwXSAqIG1bMTNdO1xyXG4gICAgICBjb25zdCBkZXQwMzogbnVtYmVyID0gbVs4XSAqIG1bMTVdIC0gbVsxMV0gKiBtWzEyXTtcclxuICAgICAgY29uc3QgZGV0MDQ6IG51bWJlciA9IG1bOF0gKiBtWzE0XSAtIG1bMTBdICogbVsxMl07XHJcbiAgICAgIGNvbnN0IGRldDA1OiBudW1iZXIgPSBtWzhdICogbVsxM10gLSBtWzldICogbVsxMl07XHJcblxyXG4gICAgICBjb25zdCBkZXQ6IG51bWJlciA9XHJcbiAgICAgICAgbVswXSAqIChtWzVdICogZGV0MDAgLSBtWzZdICogZGV0MDEgKyBtWzddICogZGV0MDIpIC1cclxuICAgICAgICBtWzFdICogKG1bNF0gKiBkZXQwMCAtIG1bNl0gKiBkZXQwMyArIG1bN10gKiBkZXQwNCkgK1xyXG4gICAgICAgIG1bMl0gKiAobVs0XSAqIGRldDAxIC0gbVs1XSAqIGRldDAzICsgbVs3XSAqIGRldDA1KSAtXHJcbiAgICAgICAgbVszXSAqIChtWzRdICogZGV0MDIgLSBtWzVdICogZGV0MDQgKyBtWzZdICogZGV0MDUpO1xyXG5cclxuICAgICAgcmV0dXJuIGRldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgeC1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJpZ2h0KCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgcmlnaHQ6IFZlY3RvcjMgPSB0aGlzLmdldFgoKTtcclxuICAgICAgcmlnaHQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiByaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgeS1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHVwKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSB0aGlzLmdldFkoKTtcclxuICAgICAgdXAubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiB1cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgei1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZvcndhcmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBmb3J3YXJkOiBWZWN0b3IzID0gdGhpcy5nZXRaKCk7XHJcbiAgICAgIGZvcndhcmQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBmb3J3YXJkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS4gVXNlZCBieSB0aGUgcmVjeWNsZXIgdG8gcmVzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zcG9zZSB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNwb3NlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIHRoaXMuc2V0KFtcclxuICAgICAgICBtWzBdLCBtWzRdLCBtWzhdLCBtWzEyXSxcclxuICAgICAgICBtWzFdLCBtWzVdLCBtWzldLCBtWzEzXSxcclxuICAgICAgICBtWzJdLCBtWzZdLCBtWzEwXSwgbVsxNF0sXHJcbiAgICAgICAgbVszXSwgbVs3XSwgbVsxMV0sIG1bMTVdXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludmVydCB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52ZXJ0KCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIGxldCBtMDA6IG51bWJlciA9IG1bMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0wMTogbnVtYmVyID0gbVswICogNCArIDFdO1xyXG4gICAgICBsZXQgbTAyOiBudW1iZXIgPSBtWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMDM6IG51bWJlciA9IG1bMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IG0xMDogbnVtYmVyID0gbVsxICogNCArIDBdO1xyXG4gICAgICBsZXQgbTExOiBudW1iZXIgPSBtWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMTI6IG51bWJlciA9IG1bMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0xMzogbnVtYmVyID0gbVsxICogNCArIDNdO1xyXG4gICAgICBsZXQgbTIwOiBudW1iZXIgPSBtWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBtMjE6IG51bWJlciA9IG1bMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IG0yMjogbnVtYmVyID0gbVsyICogNCArIDJdO1xyXG4gICAgICBsZXQgbTIzOiBudW1iZXIgPSBtWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBtMzA6IG51bWJlciA9IG1bMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0zMTogbnVtYmVyID0gbVszICogNCArIDFdO1xyXG4gICAgICBsZXQgbTMyOiBudW1iZXIgPSBtWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMzM6IG51bWJlciA9IG1bMyAqIDQgKyAzXTtcclxuICAgICAgbGV0IHRtcDA6IG51bWJlciA9IG0yMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDE6IG51bWJlciA9IG0zMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDI6IG51bWJlciA9IG0xMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDM6IG51bWJlciA9IG0zMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDQ6IG51bWJlciA9IG0xMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDU6IG51bWJlciA9IG0yMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDY6IG51bWJlciA9IG0wMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDc6IG51bWJlciA9IG0zMiAqIG0wMztcclxuICAgICAgbGV0IHRtcDg6IG51bWJlciA9IG0wMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDk6IG51bWJlciA9IG0yMiAqIG0wMztcclxuICAgICAgbGV0IHRtcDEwOiBudW1iZXIgPSBtMDIgKiBtMTM7XHJcbiAgICAgIGxldCB0bXAxMTogbnVtYmVyID0gbTEyICogbTAzO1xyXG4gICAgICBsZXQgdG1wMTI6IG51bWJlciA9IG0yMCAqIG0zMTtcclxuICAgICAgbGV0IHRtcDEzOiBudW1iZXIgPSBtMzAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAxNDogbnVtYmVyID0gbTEwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTU6IG51bWJlciA9IG0zMCAqIG0xMTtcclxuICAgICAgbGV0IHRtcDE2OiBudW1iZXIgPSBtMTAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAxNzogbnVtYmVyID0gbTIwICogbTExO1xyXG4gICAgICBsZXQgdG1wMTg6IG51bWJlciA9IG0wMCAqIG0zMTtcclxuICAgICAgbGV0IHRtcDE5OiBudW1iZXIgPSBtMzAgKiBtMDE7XHJcbiAgICAgIGxldCB0bXAyMDogbnVtYmVyID0gbTAwICogbTIxO1xyXG4gICAgICBsZXQgdG1wMjE6IG51bWJlciA9IG0yMCAqIG0wMTtcclxuICAgICAgbGV0IHRtcDIyOiBudW1iZXIgPSBtMDAgKiBtMTE7XHJcbiAgICAgIGxldCB0bXAyMzogbnVtYmVyID0gbTEwICogbTAxO1xyXG5cclxuICAgICAgbGV0IHQwOiBudW1iZXIgPSAodG1wMCAqIG0xMSArIHRtcDMgKiBtMjEgKyB0bXA0ICogbTMxKSAtXHJcbiAgICAgICAgKHRtcDEgKiBtMTEgKyB0bXAyICogbTIxICsgdG1wNSAqIG0zMSk7XHJcblxyXG4gICAgICBsZXQgdDE6IG51bWJlciA9ICh0bXAxICogbTAxICsgdG1wNiAqIG0yMSArIHRtcDkgKiBtMzEpIC1cclxuICAgICAgICAodG1wMCAqIG0wMSArIHRtcDcgKiBtMjEgKyB0bXA4ICogbTMxKTtcclxuICAgICAgbGV0IHQyOiBudW1iZXIgPSAodG1wMiAqIG0wMSArIHRtcDcgKiBtMTEgKyB0bXAxMCAqIG0zMSkgLVxyXG4gICAgICAgICh0bXAzICogbTAxICsgdG1wNiAqIG0xMSArIHRtcDExICogbTMxKTtcclxuICAgICAgbGV0IHQzOiBudW1iZXIgPSAodG1wNSAqIG0wMSArIHRtcDggKiBtMTEgKyB0bXAxMSAqIG0yMSkgLVxyXG4gICAgICAgICh0bXA0ICogbTAxICsgdG1wOSAqIG0xMSArIHRtcDEwICogbTIxKTtcclxuXHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSAxLjAgLyAobTAwICogdDAgKyBtMTAgKiB0MSArIG0yMCAqIHQyICsgbTMwICogdDMpO1xyXG5cclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIGQgKiB0MCwgLy8gWzBdXHJcbiAgICAgICAgZCAqIHQxLCAvLyBbMV1cclxuICAgICAgICBkICogdDIsIC8vIFsyXVxyXG4gICAgICAgIGQgKiB0MywgLy8gWzNdXHJcbiAgICAgICAgZCAqICgodG1wMSAqIG0xMCArIHRtcDIgKiBtMjAgKyB0bXA1ICogbTMwKSAtICh0bXAwICogbTEwICsgdG1wMyAqIG0yMCArIHRtcDQgKiBtMzApKSwgICAgICAgIC8vIFs0XVxyXG4gICAgICAgIGQgKiAoKHRtcDAgKiBtMDAgKyB0bXA3ICogbTIwICsgdG1wOCAqIG0zMCkgLSAodG1wMSAqIG0wMCArIHRtcDYgKiBtMjAgKyB0bXA5ICogbTMwKSksICAgICAgICAvLyBbNV1cclxuICAgICAgICBkICogKCh0bXAzICogbTAwICsgdG1wNiAqIG0xMCArIHRtcDExICogbTMwKSAtICh0bXAyICogbTAwICsgdG1wNyAqIG0xMCArIHRtcDEwICogbTMwKSksICAgICAgLy8gWzZdXHJcbiAgICAgICAgZCAqICgodG1wNCAqIG0wMCArIHRtcDkgKiBtMTAgKyB0bXAxMCAqIG0yMCkgLSAodG1wNSAqIG0wMCArIHRtcDggKiBtMTAgKyB0bXAxMSAqIG0yMCkpLCAgICAgIC8vIFs3XVxyXG4gICAgICAgIGQgKiAoKHRtcDEyICogbTEzICsgdG1wMTUgKiBtMjMgKyB0bXAxNiAqIG0zMykgLSAodG1wMTMgKiBtMTMgKyB0bXAxNCAqIG0yMyArIHRtcDE3ICogbTMzKSksICAvLyBbOF1cclxuICAgICAgICBkICogKCh0bXAxMyAqIG0wMyArIHRtcDE4ICogbTIzICsgdG1wMjEgKiBtMzMpIC0gKHRtcDEyICogbTAzICsgdG1wMTkgKiBtMjMgKyB0bXAyMCAqIG0zMykpLCAgLy8gWzldXHJcbiAgICAgICAgZCAqICgodG1wMTQgKiBtMDMgKyB0bXAxOSAqIG0xMyArIHRtcDIyICogbTMzKSAtICh0bXAxNSAqIG0wMyArIHRtcDE4ICogbTEzICsgdG1wMjMgKiBtMzMpKSwgIC8vIFsxMF1cclxuICAgICAgICBkICogKCh0bXAxNyAqIG0wMyArIHRtcDIwICogbTEzICsgdG1wMjMgKiBtMjMpIC0gKHRtcDE2ICogbTAzICsgdG1wMjEgKiBtMTMgKyB0bXAyMiAqIG0yMykpLCAgLy8gWzExXVxyXG4gICAgICAgIGQgKiAoKHRtcDE0ICogbTIyICsgdG1wMTcgKiBtMzIgKyB0bXAxMyAqIG0xMikgLSAodG1wMTYgKiBtMzIgKyB0bXAxMiAqIG0xMiArIHRtcDE1ICogbTIyKSksICAvLyBbMTJdXHJcbiAgICAgICAgZCAqICgodG1wMjAgKiBtMzIgKyB0bXAxMiAqIG0wMiArIHRtcDE5ICogbTIyKSAtICh0bXAxOCAqIG0yMiArIHRtcDIxICogbTMyICsgdG1wMTMgKiBtMDIpKSwgIC8vIFsxM11cclxuICAgICAgICBkICogKCh0bXAxOCAqIG0xMiArIHRtcDIzICogbTMyICsgdG1wMTUgKiBtMDIpIC0gKHRtcDIyICogbTMyICsgdG1wMTQgKiBtMDIgKyB0bXAxOSAqIG0xMikpLCAgLy8gWzE0XVxyXG4gICAgICAgIGQgKiAoKHRtcDIyICogbTIyICsgdG1wMTYgKiBtMDIgKyB0bXAyMSAqIG0xMikgLSAodG1wMjAgKiBtMTIgKyB0bXAyMyAqIG0yMiArIHRtcDE3ICogbTAyKSkgIC8vIFsxNV1cclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2xhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYnkgdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfSB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqIElmIF9sb2NhbCBpcyB0cnVlLCB0aGUgdHJhbnNsYXRpb24gb2NjdXJzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3RhdGlvbiBhbmQgc2NhbGluZyBvZiB0aGlzIG1hdHJpeCxcclxuICAgICAqIG90aGVyd2lzZSwgaXQgb2NjdXJzIGFjY29yZGluZyB0byB0aGUgcGFyZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMywgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmIChfbG9jYWwpIHtcclxuICAgICAgICBsZXQgbXR4VHJhbnNsYXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5UUkFOU0xBVElPTihfYnkpO1xyXG4gICAgICAgIGxldCByb3RhdGlvbkRpcnR5OiBib29sZWFuID0gdGhpcy4jcm90YXRpb25EaXJ0eTsgLy8gcHJlc2VydmUgZGlydHkgZmxhZ3MgZm9yIHJvdGF0aW9uIGFuZCBzY2FsaW5nIGFzIHRoZXkgYXJlIG5vdCBhZmZlY3RlZCBieSB0cmFuc2xhdGlvblxyXG4gICAgICAgIGxldCBzY2FsaW5nRGlydHk6IGJvb2xlYW4gPSB0aGlzLiNzY2FsaW5nRGlydHk7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBseShtdHhUcmFuc2xhdGlvbik7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHJvdGF0aW9uRGlydHk7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gc2NhbGluZ0RpcnR5O1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFRyYW5zbGF0aW9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGFbMTJdICs9IF9ieS54O1xyXG4gICAgICAgIHRoaXMuZGF0YVsxM10gKz0gX2J5Lnk7XHJcbiAgICAgICAgdGhpcy5kYXRhWzE0XSArPSBfYnkuejtcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zdCBtYXRyaXg6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5NVUxUSVBMSUNBVElPTih0aGlzLCBNYXRyaXg0eDQuVFJBTlNMQVRJT04oX2J5KSk7XHJcbiAgICAgIC8vIC8vIFRPRE86IHBvc3NpYmxlIG9wdGltaXphdGlvbiwgdHJhbnNsYXRpb24gbWF5IGFsdGVyIG11dGF0b3IgaW5zdGVhZCBvZiBkZWxldGluZyBpdC5cclxuICAgICAgLy8gdGhpcy5zZXQobWF0cml4KTtcclxuICAgICAgLy8gUmVjeWNsZXIuc3RvcmUobWF0cml4KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVgoX3g6IG51bWJlciwgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWChfeCk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlKHRyYW5zbGF0aW9uLCBfbG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2xhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVZKF95OiBudW1iZXIsIF9sb2NhbDogYm9vbGVhbiA9IHRydWUpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlkoX3kpO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZSh0cmFuc2xhdGlvbiwgX2xvY2FsKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgei1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlWihfejogbnVtYmVyLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aKF96KTtcclxuICAgICAgdGhpcy50cmFuc2xhdGUodHJhbnNsYXRpb24sIF9sb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUm90YXRpb25cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB0aGlzIG1hdHJpeCBieSBnaXZlbiB7QGxpbmsgVmVjdG9yM30gaW4gdGhlIG9yZGVyIFosIFksIFguIFJpZ2h0IGhhbmQgcm90YXRpb24gaXMgdXNlZCwgdGh1bWIgcG9pbnRzIGluIGF4aXMgZGlyZWN0aW9uLCBmaW5nZXJzIGN1cmxpbmcgaW5kaWNhdGUgcm90YXRpb25cclxuICAgICAqIFRoZSByb3RhdGlvbiBpcyBhcHBlbmRlZCB0byBhbHJlYWR5IGFwcGxpZWQgdHJhbnNmb3JtcywgdGh1cyBtdWx0aXBsaWVkIGZyb20gdGhlIHJpZ2h0LiBTZXQgX2Zyb21MZWZ0IHRvIHRydWUgdG8gc3dpdGNoIGFuZCBwdXQgaXQgaW4gZnJvbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGUoX2J5OiBWZWN0b3IzIHwgUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihfYnkpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgeC1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlWChfYW5nbGVJbkRlZ3JlZXM6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9YKF9hbmdsZUluRGVncmVlcyk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4Um90YXRpb24sIF9mcm9tTGVmdCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYXJvdW5kIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVZKF9hbmdsZUluRGVncmVlczogbnVtYmVyLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1koX2FuZ2xlSW5EZWdyZWVzKTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZVooX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWihfYW5nbGVJbkRlZ3JlZXMpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgcm90YXRpb24gb2YgdGhpcyBtYXRyaXggdG8gcG9pbnQgdGhlIHotYXhpcyBkaXJlY3RseSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0IGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LFxyXG4gICAgICogcmVzcGVjdGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBhbmQgcGl0Y2guIElmIG5vIHVwLXtAbGluayBWZWN0b3IzfSBpcyBnaXZlbiwgdGhlIHByZXZpb3VzIHVwLXtAbGluayBWZWN0b3IzfSBpcyB1c2VkLiBcclxuICAgICAqIFRoZSBwaXRjaCBtYXkgYmUgcmVzdHJpY3RlZCB0byB0aGUgdXAtdmVjdG9yIHRvIG9ubHkgY2FsY3VsYXRlIHlhdy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvb2tBdChfdGFyZ2V0OiBWZWN0b3IzLCBfdXA/OiBWZWN0b3IzLCBfcmVzdHJpY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIF91cCA9IF91cCA/IFZlY3RvcjMuTk9STUFMSVpBVElPTihfdXApIDogdGhpcy51cDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy50cmFuc2xhdGlvbiwgX3RhcmdldCwgX3VwLCBfcmVzdHJpY3QpO1xyXG4gICAgICBtdHhSZXN1bHQuc2NhbGUodGhpcy5zY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIGFsaWduIHRoZSB6LWF4aXMgd2l0aCB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LlxyXG4gICAgICogVXAgc2hvdWxkIGJlIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWYgbm8gdXAtdmVjdG9yIGlzIHByb3ZpZGVkLCB7QGxpbmsgdXB9IGlzIHVzZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb29rSW4oX2RpcmVjdGlvbjogVmVjdG9yMywgX3VwOiBWZWN0b3IzID0gdGhpcy51cCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odGhpcy50cmFuc2xhdGlvbiwgX2RpcmVjdGlvbiwgX3VwKTtcclxuICAgICAgbXR4UmVzdWx0LnNjYWxlKHRoaXMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTYW1lIGFzIHtAbGluayBNYXRyaXg0eDQubG9va0F0fSwgYnV0IG9wdGltaXplZCBhbmQgbmVlZHMgdGVzdGluZ1xyXG4gICAgICovXHJcbiAgICAvLyBUT0RPOiB0ZXN0aW5nIGxvb2thdCB0aGF0IHJlYWxseSBqdXN0IHJvdGF0ZXMgdGhlIG1hdHJpeCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmVcclxuICAgIC8vIHB1YmxpYyBsb29rQXRSb3RhdGUoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3ByZXNlcnZlU2NhbGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFfdXApXHJcbiAgICAvLyAgICAgX3VwID0gdGhpcy5nZXRZKCk7XHJcblxyXG4gICAgLy8gICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMuc2NhbGluZztcclxuICAgIC8vICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy50cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIGRpZmZlcmVuY2Uubm9ybWFsaXplKCk7XHJcbiAgICAvLyAgIGxldCBjb3M6IG51bWJlciA9IFZlY3RvcjMuRE9UKFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmdldFooKSksIGRpZmZlcmVuY2UpO1xyXG4gICAgLy8gICBsZXQgc2luOiBudW1iZXIgPSBWZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRYKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgLy8gICAgIDAsIDEsIDAsIDAsXHJcbiAgICAvLyAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIC8vICAgY29zID0gVmVjdG9yMy5ET1QoVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHRoaXMuZ2V0WigpKSwgZGlmZmVyZW5jZSk7XHJcbiAgICAvLyAgIHNpbiA9IC1WZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRZKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgMSwgMCwgMCwgMCxcclxuICAgIC8vICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgIC8vICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG4gICAgLy8gICB0aGlzLnNjYWxpbmcgPSBzY2FsaW5nO1xyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IzLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFNjYWxpbmc6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKF9ieSk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4U2NhbGluZywgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2NhbGluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfYnksIDEsIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWShfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnksIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWihfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCAxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbWF0cml4OiBNYXRyaXg0eDQsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBfZnJvbUxlZnQgPyBNYXRyaXg0eDQuUFJPRFVDVChfbWF0cml4LCB0aGlzKSA6IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMsIF9tYXRyaXgpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBwdWJsaWMgZ2V0RXVsZXJBbmdsZXNOZXcoKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgIC8vICAgbGV0IHRoZXRhWDogbnVtYmVyLCB0aGV0YVk6IG51bWJlciwgdGhldGFaOiBudW1iZXI7XHJcbiAgICAvLyAgIGxldCByMDI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcuejtcclxuICAgIC8vICAgbGV0IHIxMTogbnVtYmVyID0gdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55O1xyXG5cclxuICAgIC8vICAgaWYgKHIwMiA8IDEpIHtcclxuICAgIC8vICAgICBpZiAocjAyID4gLTEpIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguYXNpbigtcjAyKTtcclxuICAgIC8vICAgICAgIHRoZXRhWiA9IE1hdGguYXRhbjIodGhpcy5kYXRhWzFdIC8gc2NhbGluZy55LCB0aGlzLmRhdGFbMF0gLyBzY2FsaW5nLngpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gTWF0aC5hdGFuMih0aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLnopO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgICAgdGhldGFaID0gLU1hdGguYXRhbjIodGhpcy5kYXRhWzZdIC8gc2NhbGluZy55LCByMTEpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gMDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgZWxzZSB7XHJcbiAgICAvLyAgICAgdGhldGFZID0gLU1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgIHRoZXRhWiA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueSwgcjExKTtcclxuICAgIC8vICAgICB0aGV0YVggPSAwO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgtdGhldGFYLCB0aGV0YVksIHRoZXRhWik7XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKE1hdGhlbWF0aWMucmFkMmRlZyk7XHJcblxyXG4gICAgLy8gICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3RyYW5zbGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3JvdGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IF9vcmlnaW5hbC4jc2NhbGluZ0RpcnR5O1xyXG4gICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBfb3JpZ2luYWwuI3F1YXRlcm5pb25EaXJ0eTtcclxuICAgICAgaWYgKCF0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KVxyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uLmNvcHkoX29yaWdpbmFsLiN0cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICghdGhpcy4jcm90YXRpb25EaXJ0eSlcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5jb3B5KF9vcmlnaW5hbC4jcm90YXRpb24pO1xyXG4gICAgICBpZiAoIXRoaXMuI3NjYWxpbmdEaXJ0eSlcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLmNvcHkoX29yaWdpbmFsLiNzY2FsaW5nKTtcclxuICAgICAgaWYgKCF0aGlzLiNxdWF0ZXJuaW9uRGlydHkpXHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5jb3B5KF9vcmlnaW5hbC4jcXVhdGVybmlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4NHg0KHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIC8vIFRPRE86IG9wdGltaXphdGlvbiwgaXQgc2hvdWxkbid0IGFsd2F5cyByZXR1cm4gYSBjb3B5LCBzaW5jZSB0aGlzIGJsb2F0cyBtZW1vcnlcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB4LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFgoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB5LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB6LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFooKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHR3byBjYXJkaW5hbCBheGlzIGFuZCByZXZlcnNlcyB0aGUgdGhpcmQsIGVmZmVjdGl2ZWx5IHJvdGF0aW5nIHRoZSB0cmFuc2Zvcm0gMTgwIGRlZ3JlZXMgYXJvdW5kIG9uZSBhbmQgOTAgZGVncmVlcyBhcm91bmQgYSBzZWNvbmQgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3dhcFhZKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGVtcDogbnVtYmVyW10gPSBbdGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXV07IC8vIHN0b3JlIHgtYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KFt0aGlzLmRhdGFbNF0sIHRoaXMuZGF0YVs1XSwgdGhpcy5kYXRhWzZdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA0KTsgLy8gb3ZlcndyaXRlIFkgd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbOF0sIC10aGlzLmRhdGFbOV0sIC10aGlzLmRhdGFbMTBdXSwgOCk7IC8vIHJldmVyc2Ugei1heGlzXHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgdHdvIGNhcmRpbmFsIGF4aXMgYW5kIHJldmVyc2VzIHRoZSB0aGlyZCwgZWZmZWN0aXZlbHkgcm90YXRpbmcgdGhlIHRyYW5zZm9ybSAxODAgZGVncmVlcyBhcm91bmQgb25lIGFuZCA5MCBkZWdyZWVzIGFyb3VuZCBhIHNlY29uZCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2FwWFooKTogdm9pZCB7XHJcbiAgICAgIGxldCB0ZW1wOiBudW1iZXJbXSA9IFt0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdXTsgLy8gc3RvcmUgeC1heGlzXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoW3RoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB6LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA4KTsgLy8gb3ZlcndyaXRlIFogd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbNF0sIC10aGlzLmRhdGFbNV0sIC10aGlzLmRhdGFbNl1dLCA0KTsgLy8gcmV2ZXJzZSB5LWF4aXNcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN3YXBzIHRoZSB0d28gY2FyZGluYWwgYXhpcyBhbmQgcmV2ZXJzZXMgdGhlIHRoaXJkLCBlZmZlY3RpdmVseSByb3RhdGluZyB0aGUgdHJhbnNmb3JtIDE4MCBkZWdyZWVzIGFyb3VuZCBvbmUgYW5kIDkwIGRlZ3JlZXMgYXJvdW5kIGEgc2Vjb25kIGF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN3YXBZWigpOiB2b2lkIHtcclxuICAgICAgbGV0IHRlbXA6IG51bWJlcltdID0gW3RoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl1dOyAvLyBzdG9yZSB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldChbdGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF1dLCA0KTsgLy8gb3ZlcndyaXRlIHktYXhpcyB3aXRoIHotYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KHRlbXAsIDgpOyAvLyBvdmVyd3JpdGUgWiB3aXRoIHRlbXBcclxuICAgICAgdGhpcy5kYXRhLnNldChbLXRoaXMuZGF0YVswXSwgLXRoaXMuZGF0YVsxXSwgLXRoaXMuZGF0YVsyXV0sIDApOyAvLyByZXZlcnNlIHgtYXhpc1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRyYW5sYXRpb24gZnJvbSB0aGlzIG1hdHJpeCB0byB0aGUgdGFyZ2V0IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRpb25UbyhfbXR4VGFyZ2V0OiBNYXRyaXg0eDQpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGRpZmZlcmVuY2Uuc2V0KF9tdHhUYXJnZXQuZGF0YVsxMl0gLSB0aGlzLmRhdGFbMTJdLCBfbXR4VGFyZ2V0LmRhdGFbMTNdIC0gdGhpcy5kYXRhWzEzXSwgX210eFRhcmdldC5kYXRhWzE0XSAtIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBhd2FpdCB0aGlzLnJvdGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJvdGF0aW9uKSxcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHtcclxuICAgICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICAgIHRyYW5zbGF0aW9uLm11dGF0ZShfbXV0YXRvci50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgbVsxMl0gPSB0cmFuc2xhdGlvbi54OyBtWzEzXSA9IHRyYW5zbGF0aW9uLnk7IG1bMTRdID0gdHJhbnNsYXRpb24uejtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiB8fCBfbXV0YXRvci5zY2FsaW5nKSB7XHJcbiAgICAgICAgLy8gVE9ETzogbWFrZSBmdWxsIHZlY3RvciBhbmQgcXVhdGVybmlvbiBtdXRhdG9ycyBtYW5kYXRvcnk/XHJcblxyXG4gICAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24gPSBfbXV0YXRvci5yb3RhdGlvbj8udyAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgdGhpcy4jcXVhdGVybmlvbiA6IC8vIHVzaW5nIHRoaXMuI3F1YXRlcm5pb24gYXNzdW1lcyB3ZSBnZXQgYSBmdWxsIHF1YXRlcm5pb24gbXV0YXRvciB3aXRoIHgsIHksIHogYW5kIHcgc2V0IHNvIHdlIG5ldmVyIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gaGVyZS4gVGhpcyBtaWdodCBjYXVzZSB0cm91YmxlIGlmIHdlIGV2ZXIgd2FudCB0byBtdXRhdGUgb25seSBhIHBhcnQgb2YgYSBxdWF0ZXJuaW9uLi4uXHJcbiAgICAgICAgICBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yLnJvdGF0aW9uKSA/IHRoaXMuI3JvdGF0aW9uIDogdGhpcy5yb3RhdGlvbjsgLy8gaGFjayB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9uIG9mIHJvdGF0aW9uIGFuZCBzY2FsaW5nLiBUaGlzIHJlY2FsY3VsYXRpb24gaXMgdW5uZWNlc3Nhcnkgd2hlbiB3ZSBnZXQgYSBmdWxsIG11dGF0b3IgaS5lLiB3aXRoIHgsIHkgYW5kIHogc2V0XHJcblxyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gaXNGdWxsVmVjdG9yTXV0YXRvcihfbXV0YXRvci5zY2FsaW5nKSA/IHRoaXMuI3NjYWxpbmcgOiB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbilcclxuICAgICAgICAgIHJvdGF0aW9uLm11dGF0ZShfbXV0YXRvci5yb3RhdGlvbik7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5zY2FsaW5nKVxyXG4gICAgICAgICAgc2NhbGluZy5tdXRhdGUoX211dGF0b3Iuc2NhbGluZyk7XHJcblxyXG4gICAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtLCByb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgaXNFdWxlclJvdGF0aW9uOiBib29sZWFuID0gcm90YXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSAhaXNFdWxlclJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IGlzRXVsZXJSb3RhdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3g6IG51bWJlciA9IHNjYWxpbmcueCwgc3k6IG51bWJlciA9IHNjYWxpbmcueSwgc3o6IG51bWJlciA9IHNjYWxpbmcuejtcclxuICAgICAgICBtWzBdICo9IHN4OyBtWzFdICo9IHN4OyBtWzJdICo9IHN4O1xyXG4gICAgICAgIG1bNF0gKj0gc3k7IG1bNV0gKj0gc3k7IG1bNl0gKj0gc3k7XHJcbiAgICAgICAgbVs4XSAqPSBzejsgbVs5XSAqPSBzejsgbVsxMF0gKj0gc3o7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcblxyXG4gICAgICBmdW5jdGlvbiBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yICYmIF9tdXRhdG9yLnggIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnkgIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnogIT0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjNcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uKSB0eXBlcy5yb3RhdGlvbiA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIE5vaXNlMiwgTm9pc2UzIGFuZCBOb2lzZTRcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vaXNlIHtcclxuICAgIHByb3RlY3RlZCBwZXJtOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoNTEyKTtcclxuICAgIHByb3RlY3RlZCBwZXJtTW9kMTI6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSg1MTIpO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgYmV0d2VlbiAtMSBhbmQgMSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IHNhbXBsZTogKC4uLl9hcmdzOiBudW1iZXJbXSkgPT4gbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIGNvbnN0IHA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjU2OyBpKyspXHJcbiAgICAgICAgcFtpXSA9IGk7XHJcblxyXG4gICAgICBsZXQgbjogbnVtYmVyO1xyXG4gICAgICBsZXQgcTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyNTU7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBuID0gTWF0aC5mbG9vcigoaSArIDEpICogX3JhbmRvbSgpKTtcclxuICAgICAgICBxID0gcFtpXTtcclxuICAgICAgICBwW2ldID0gcFtuXTtcclxuICAgICAgICBwW25dID0gcTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDUxMjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5wZXJtW2ldID0gcFtpICYgMjU1XTtcclxuICAgICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuL05vaXNlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2UyIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoMy4wIC0gTWF0aC5zcXJ0KDMuMCkpIC8gNi4wO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JhZGllbnQ6IG51bWJlcltdW10gPSBbWzEsIDFdLCBbLTEsIDFdLCBbMSwgLTFdLCBbLTEsIC0xXSwgWzEsIDBdLCBbLTEsIDBdLCBbMSwgMF0sIFstMSwgMF0sIFswLCAxXSwgWzAsIC0xXSwgWzAsIDFdLCBbMCwgLTFdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kpICogMC41ICogKE1hdGguc3FydCgzLjApIC0gMS4wKTsgLy8gSGFpcnkgZmFjdG9yIGZvciAyRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgdDogbnVtYmVyID0gKGkgKyBqKSAqIE5vaXNlMi5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSkgc3BhY2VcclxuICAgICAgICBjb25zdCBZMDogbnVtYmVyID0gaiAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXHJcbiAgICAgICAgY29uc3QgeTA6IG51bWJlciA9IF95IC0gWTA7XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpbi5cclxuICAgICAgICBjb25zdCBpMTogbnVtYmVyID0geDAgPiB5MCA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoxOiBudW1iZXIgPSB4MCA+IHkwID8gMCA6IDE7XHJcblxyXG4gICAgICAgIC8vIE9mZnNldDpudW1iZXJzIGZvciBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgeDE6IG51bWJlciA9IHgwIC0gaTEgKyBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2UyLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MjogbnVtYmVyID0geDAgLSAxLjAgKyAyLjAgKiBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkyOiBudW1iZXIgPSB5MCAtIDEuMCArIDIuMCAqIE5vaXNlMi5vZmZzZXQ7XHJcblxyXG4gICAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgdGhyZWUgc2ltcGxleCBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgaWk6IG51bWJlciA9IGkgJiAyNTU7XHJcbiAgICAgICAgY29uc3Qgamo6IG51bWJlciA9IGogJiAyNTU7XHJcbiAgICAgICAgY29uc3QgZzA6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgdGhpcy5wZXJtW2pqXV1dO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlMi5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIGkxICsgdGhpcy5wZXJtW2pqICsgajFdXV07XHJcbiAgICAgICAgY29uc3QgZzI6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgMSArIHRoaXMucGVybVtqaiArIDFdXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMCA/IDAuMCA6IE1hdGgucG93KHQwLCA0KSAqIChnMFswXSAqIHgwICsgZzBbMV0gKiB5MCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHQxOiBudW1iZXIgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwID8gMC4wIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxKTtcclxuXHJcbiAgICAgICAgY29uc3QgdDI6IG51bWJlciA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDAgPyAwLjAgOiBNYXRoLnBvdyh0MiwgNCkgKiAoZzJbMF0gKiB4MiArIGcyWzFdICogeTIpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggY29ybmVyIHRvIGdldCB0aGUgZmluYWwgbm9pc2UgdmFsdWUuXHJcbiAgICAgICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLCAxXVxyXG4gICAgICAgIHJldHVybiA3MC4xNDgwNTc3MDY1Mzk1MiAqIChuMCArIG4xICsgbjIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYW1wbGUgPSAoX3g6IG51bWJlciwgX3k6IG51bWJlcik6IG51bWJlciA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzYW1wbGUoX3gsIF95KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyBhbiBhZGFwdGlvbiBvZiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mYXN0LXNpbXBsZXgtbm9pc2VcclxuICAgKiBkb25lIGJ5IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICpcclxuICAgKiBCYXNlZCBvbiBleGFtcGxlIGNvZGUgYnkgU3RlZmFuIEd1c3RhdnNvbiAoc3RlZ3VAaXRuLmxpdS5zZSkuXHJcbiAgICogT3B0aW1pc2F0aW9ucyBieSBQZXRlciBFYXN0bWFuIChwZWFzdG1hbkBkcml6emxlLnN0YW5mb3JkLmVkdSkuXHJcbiAgICogQmV0dGVyIHJhbmsgb3JkZXJpbmcgbWV0aG9kIGJ5IFN0ZWZhbiBHdXN0YXZzb24gaW4gMjAxMi5cclxuICAgKlxyXG4gICAqIFRoaXMgY29kZSB3YXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IGl0cyBvcmlnaW5hbCBhdXRob3IsXHJcbiAgICogU3RlZmFuIEd1c3RhdnNvbi4gWW91IG1heSB1c2UgaXQgYXMgeW91IHNlZSBmaXQsIGJ1dFxyXG4gICAqIGF0dHJpYnV0aW9uIGlzIGFwcHJlY2lhdGVkLlxyXG4gICAqL1xyXG4gIC8vIFRPRE86IFRlc3RcclxuICBleHBvcnQgY2xhc3MgTm9pc2UzIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAxLjAgLyA2LjA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncmFkaWVudDogbnVtYmVyW11bXSA9IFtbMSwgMSwgMF0sIFstMSwgMSwgMF0sIFsxLCAtMSwgMF0sIFstMSwgLTEsIDBdLCBbMSwgMCwgMV0sIFstMSwgMCwgMV0sIFsxLCAwLCAtMV0sIFstMSwgMCwgLTFdLCBbMCwgMSwgMV0sIFswLCAtMSwgLTFdLCBbMCwgMSwgLTFdLCBbMCwgLTEsIC0xXVxyXG4gICAgXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kgKyBfeikgLyAzLjA7IC8vIFZlcnkgbmljZSBhbmQgc2ltcGxlIHNrZXcgZmFjdG9yIGZvciAzRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgazogbnVtYmVyID0gTWF0aC5mbG9vcihfeiArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGspICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCBYMDogbnVtYmVyID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCB4MDogbnVtYmVyID0gX3ggLSBYMDsgLy8gVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG5cclxuICAgICAgICAvLyBEZXRlcmluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpblxyXG4gICAgICAgIGxldCBpMTogbnVtYmVyLCBqMTogbnVtYmVyLCBrMTogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xyXG4gICAgICAgICAgO1xyXG4gICAgICAgIGxldCBpMjogbnVtYmVyLCBqMjogbnVtYmVyLCBrMjogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXHJcbiAgICAgICAgICA7XHJcbiAgICAgICAgaWYgKHgwID49IHkwKSB7XHJcbiAgICAgICAgICBpZiAoeTAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGoyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGsyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoeDAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGoyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGsxID0gaTIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBqMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh5MCA8IHowKSB7XHJcbiAgICAgICAgICAgIGsxID0gajIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBpMiA9IDA7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHgwIDwgejApIHtcclxuICAgICAgICAgICAgajEgPSBqMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgaTEgPSBrMSA9IGkyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGoxID0gaTIgPSBqMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gazEgPSBrMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlMy5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MTogbnVtYmVyID0geTAgLSBqMSArIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejE6IG51bWJlciA9IHowIC0gazEgKyBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2UzLm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXHJcbiAgICAgICAgY29uc3QgeTI6IG51bWJlciA9IHkwIC0gajIgKyAyLjAgKiBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHoyOiBudW1iZXIgPSB6MCAtIGsyICsgMi4wICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSAxLjAgKyAzLjAgKiBOb2lzZTMub2Zmc2V0OyAvLyBPZmZzZXRzIGZvciBsYXN0IGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIDEuMCArIDMuMCAqIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejM6IG51bWJlciA9IHowIC0gMS4wICsgMy4wICogTm9pc2UzLm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayA6bnVtYmVydXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmb3VyIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtra11dXV07XHJcbiAgICAgICAgY29uc3QgZzE6IG51bWJlcltdID0gTm9pc2UzLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgaTEgKyB0aGlzLnBlcm1bamogKyBqMSArIHRoaXMucGVybVtrayArIGsxXV1dXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTMuZ3JhZGllbnRbdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV1dO1xyXG4gICAgICAgIGNvbnN0IGczOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIDEgKyB0aGlzLnBlcm1bamogKyAxICsgdGhpcy5wZXJtW2trICsgMV1dXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1Om51bWJlcmF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIGZvdXIgY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IHQwOiBudW1iZXIgPSAwLjUgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDAsIDQpICogKGcwWzBdICogeDAgKyBnMFsxXSAqIHkwICsgZzBbMl0gKiB6MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MSwgNCkgKiAoZzFbMF0gKiB4MSArIGcxWzFdICogeTEgKyBnMVsyXSAqIHoxKTtcclxuICAgICAgICBjb25zdCB0MjogbnVtYmVyID0gMC41IC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIpO1xyXG4gICAgICAgIGNvbnN0IHQzOiBudW1iZXIgPSAwLjUgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejM7XHJcbiAgICAgICAgY29uc3QgbjM6IG51bWJlciA9IHQzIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDMsIDQpICogKGczWzBdICogeDMgKyBnM1sxXSAqIHkzICsgZzNbMl0gKiB6Myk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cclxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIHNjYWxlZCB0byBzdGF5IGp1c3QgaW5zaWRlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA5NC42ODQ5MzE1MDY4MTk3MiAqIChuMCArIG4xICsgbjIgKyBuMyk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhbXBsZSA9IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NhbXBsZShfeCwgX3ksIF96KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gVE9ETzogVGVzdFxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2U0IGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoNS4wIC0gTWF0aC5zcXJ0KDUuMCkpIC8gMjAuMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGdyYWRpZW50OiBudW1iZXJbXVtdID0gW1swLCAxLCAxLCAxXSwgWzAsIDEsIDEsIC0xXSwgWzAsIDEsIC0xLCAxXSwgWzAsIDEsIC0xLCAtMV0sIFswLCAtMSwgMSwgMV0sIFswLCAtMSwgMSwgLTFdLCBbMCwgLTEsIC0xLCAxXSwgWzAsIC0xLCAtMSwgLTFdLCBbMSwgMCwgMSwgMV0sIFsxLCAwLCAxLCAtMV0sIFsxLCAwLCAtMSwgMV0sIFsxLCAwLCAtMSwgLTFdLCBbLTEsIDAsIDEsIDFdLCBbLTEsIDAsIDEsIC0xXSwgWy0xLCAwLCAtMSwgMV0sIFstMSwgMCwgLTEsIC0xXSwgWzEsIDEsIDAsIDFdLCBbMSwgMSwgMCwgLTFdLCBbMSwgLTEsIDAsIDFdLCBbMSwgLTEsIDAsIC0xXSwgWy0xLCAxLCAwLCAxXSwgWy0xLCAxLCAwLCAtMV0sIFstMSwgLTEsIDAsIDFdLCBbLTEsIC0xLCAwLCAtMV0sIFsxLCAxLCAxLCAwXSwgWzEsIDEsIC0xLCAwXSwgWzEsIC0xLCAxLCAwXSwgWzEsIC0xLCAtMSwgMF0sIFstMSwgMSwgMSwgMF0sIFstMSwgMSwgLTEsIDBdLCBbLTEsIC0xLCAxLCAwXSwgWy0xLCAtMSwgLTEsIDBdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyLCBfdzogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIC8vIFNrZXcgdGhlICh4LHkseix3KSBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbCBvZiAyNCBzaW1wbGljZXMgd2UncmUgaW5cclxuICAgICAgICBjb25zdCBzOiBudW1iZXIgPSAoX3ggKyBfeSArIF96ICsgX3cpICogKE1hdGguc3FydCg1LjApIC0gMS4wKSAvIDQuMDsgLy8gRmFjdG9yIGZvciA0RCBza2V3aW5nXHJcbiAgICAgICAgY29uc3QgaTogbnVtYmVyID0gTWF0aC5mbG9vcihfeCArIHMpO1xyXG4gICAgICAgIGNvbnN0IGo6IG51bWJlciA9IE1hdGguZmxvb3IoX3kgKyBzKTtcclxuICAgICAgICBjb25zdCBrOiBudW1iZXIgPSBNYXRoLmZsb29yKF96ICsgcyk7XHJcbiAgICAgICAgY29uc3QgbDogbnVtYmVyID0gTWF0aC5mbG9vcihfdyArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGsgKyBsKSAqIE5vaXNlNC5vZmZzZXQ7IC8vIEZhY3RvciBmb3IgNEQgdW5za2V3aW5nXHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6LHcpIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCBXMDogbnVtYmVyID0gbCAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkseix3IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG4gICAgICAgIGNvbnN0IHcwOiBudW1iZXIgPSBfdyAtIFcwO1xyXG5cclxuICAgICAgICAvLyBUbyBmaW5kIG91dCB3aGljaCBvZiB0aGUgMjQgcG9zc2libGUgc2ltcGxpY2VzIHdlJ3JlIGluLCB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGVcclxuICAgICAgICAvLyBtYWduaXR1ZGUgb3JkZXJpbmcgb2YgeDAsIHkwLCB6MCBhbmQgdzAuIFNpeCBwYWlyLXdpc2UgY29tcGFyaXNvbnMgYXJlIHBlcmZvcm1lZCBiZXR3ZWVuXHJcbiAgICAgICAgLy8gZWFjaCBwb3NzaWJsZSBwYWlyIG9mIHRoZSBmb3VyIGNvb3JkaW5hdGVzLCBhbmQgdGhlIHJlc3VsdHMgYXJlIHVzZWQgdG8gcmFuayB0aGUgbnVtYmVycy5cclxuICAgICAgICBsZXQgcmFua3g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmt5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5rejogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFua3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKHgwID4geTApIHJhbmt4Kys7XHJcbiAgICAgICAgZWxzZSByYW5reSsrO1xyXG4gICAgICAgIGlmICh4MCA+IHowKSByYW5reCsrO1xyXG4gICAgICAgIGVsc2UgcmFua3orKztcclxuICAgICAgICBpZiAoeDAgPiB3MCkgcmFua3grKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcbiAgICAgICAgaWYgKHkwID4gejApIHJhbmt5Kys7XHJcbiAgICAgICAgZWxzZSByYW5reisrO1xyXG4gICAgICAgIGlmICh5MCA+IHcwKSByYW5reSsrO1xyXG4gICAgICAgIGVsc2UgcmFua3crKztcclxuICAgICAgICBpZiAoejAgPiB3MCkgcmFua3orKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcblxyXG4gICAgICAgIC8vIHNpbXBsZXhbY10gaXMgYSA0LXZlY3RvciB3aXRoIHRoZSBudW1iZXJzIDAsIDEsIDIgYW5kIDMgaW4gc29tZSBvcmRlci5cclxuICAgICAgICAvLyBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dyBtYWtlcyB4PHosIHk8dyBhbmQgeDx3XHJcbiAgICAgICAgLy8gaW1wb3NzaWJsZS4gT25seSB0aGUgMjQgaW5kaWNlcyB3aGljaCBoYXZlIG5vbi16ZXJvIGVudHJpZXMgbWFrZSBhbnkgc2Vuc2UuXHJcbiAgICAgICAgLy8gV2UgdXNlIGEgdGhyZXNob2xkaW5nIHRvIHNldCB0aGUgY29vcmRpbmF0ZXMgaW4gdHVybiBmcm9tIHRoZSBsYXJnZXN0IG1hZ25pdHVkZS5cclxuICAgICAgICAvLyBSYW5rIDMgZGVub3RlcyB0aGUgbGFyZ2VzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkxOiBudW1iZXIgPSByYW5reCA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajE6IG51bWJlciA9IHJhbmt5ID49IDMgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMTogbnVtYmVyID0gcmFua3ogPj0gMyA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwxOiBudW1iZXIgPSByYW5rdyA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgLy8gUmFuayA6IDIgZGVub3RlcyB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS5cclxuICAgICAgICBjb25zdCBpMjogbnVtYmVyID0gcmFua3ggPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoyOiBudW1iZXIgPSByYW5reSA+PSAyID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgazI6IG51bWJlciA9IHJhbmt6ID49IDIgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBsMjogbnVtYmVyID0gcmFua3cgPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIC8vIFJhbmsgOiAxIGRlbm90ZXMgdGhlIHNlY29uZCBzbWFsbGVzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkzOiBudW1iZXIgPSByYW5reCA+PSAxID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajM6IG51bWJlciA9IHJhbmt5ID49IDEgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMzogbnVtYmVyID0gcmFua3ogPj0gMSA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwzOiBudW1iZXIgPSByYW5rdyA+PSAxID8gMSA6IDA7XHJcblxyXG4gICAgICAgIC8vIFRoZSBmaWZ0aCBjb3JuZXIgaGFzIGFsbCBjb29yZGluYXRlIG9mZnNldHMgPSAxLCBzbyBubyBuZWVkIHRvIGNvbXB1dGUgdGhhdC5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MTogbnVtYmVyID0gejAgLSBrMSArIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzE6IG51bWJlciA9IHcwIC0gbDEgKyBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2U0Lm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MjogbnVtYmVyID0geTAgLSBqMiArIDIuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejI6IG51bWJlciA9IHowIC0gazIgKyAyLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHcyOiBudW1iZXIgPSB3MCAtIGwyICsgMi4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSBpMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGZvdXJ0aCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIGozICsgMy4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MzogbnVtYmVyID0gejAgLSBrMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzM6IG51bWJlciA9IHcwIC0gbDMgKyAzLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHg0OiBudW1iZXIgPSB4MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5NDogbnVtYmVyID0geTAgLSAxLjAgKyA0LjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHo0OiBudW1iZXIgPSB6MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzQ6IG51bWJlciA9IHcwIC0gMS4wICsgNC4wICogTm9pc2U0Lm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayBvdXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmaXZlIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGxsOiBudW1iZXIgPSBsICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtrayArIHRoaXMucGVybVtsbF1dXV0gJVxyXG4gICAgICAgICAgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyBpMSArIHRoaXMucGVybVtqaiArIGoxICsgdGhpcy5wZXJtW2trICsgazEgKyB0aGlzLnBlcm1bbGwgKyBsMV1dXVxyXG4gICAgICAgICAgXSAlIDMyXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTQuZ3JhZGllbnRbXHJcbiAgICAgICAgICB0aGlzLnBlcm1bXHJcbiAgICAgICAgICAgIGlpICsgaTIgKyB0aGlzLnBlcm1bamogKyBqMiArIHRoaXMucGVybVtrayArIGsyICsgdGhpcy5wZXJtW2xsICsgbDJdXV1cclxuICAgICAgICAgIF0gJSAzMlxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZzM6IG51bWJlcltdID0gTm9pc2U0LmdyYWRpZW50W1xyXG4gICAgICAgICAgdGhpcy5wZXJtW1xyXG4gICAgICAgICAgICBpaSArIGkzICsgdGhpcy5wZXJtW2pqICsgajMgKyB0aGlzLnBlcm1ba2sgKyBrMyArIHRoaXMucGVybVtsbCArIGwzXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGc0OiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDEgKyB0aGlzLnBlcm1bbGwgKyAxXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmaXZlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTAgLSB6MCAqIHowIC0gdzAgKiB3MDtcclxuICAgICAgICBjb25zdCBuMDogbnVtYmVyID0gdDAgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MCwgNCkgKiAoZzBbMF0gKiB4MCArIGcwWzFdICogeTAgKyBnMFsyXSAqIHowICsgZzBbM10gKiB3MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MSAtIHcxICogdzE7XHJcbiAgICAgICAgY29uc3QgbjE6IG51bWJlciA9IHQxIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxICsgZzFbMl0gKiB6MSArIGcxWzNdICogdzEpO1xyXG4gICAgICAgIGNvbnN0IHQyOiBudW1iZXIgPSAwLjUgLSB4MiAqIHgyIC0geTIgKiB5MiAtIHoyICogejIgLSB3MiAqIHcyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIgKyBnMlszXSAqIHcyKTtcclxuICAgICAgICBjb25zdCB0MzogbnVtYmVyID0gMC41IC0geDMgKiB4MyAtIHkzICogeTMgLSB6MyAqIHozIC0gdzMgKiB3MztcclxuICAgICAgICBjb25zdCBuMzogbnVtYmVyID0gdDMgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MywgNCkgKiAoZzNbMF0gKiB4MyArIGczWzFdICogeTMgKyBnM1syXSAqIHozICsgZzNbM10gKiB3Myk7XHJcbiAgICAgICAgY29uc3QgdDQ6IG51bWJlciA9IDAuNSAtIHg0ICogeDQgLSB5NCAqIHk0IC0gejQgKiB6NCAtIHc0ICogdzQ7XHJcbiAgICAgICAgY29uc3QgbjQ6IG51bWJlciA9IHQ0IDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDQsIDQpICogKGc0WzBdICogeDQgKyBnNFsxXSAqIHk0ICsgZzRbMl0gKiB6NCArIGc0WzNdICogdzQpO1xyXG5cclxuICAgICAgICAvLyBTdW0gdXAgYW5kIHNjYWxlIHRoZSByZXN1bHQgdG8gY292ZXIgdGhlIHJhbmdlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA3Mi4zNzg1NTc2NTE1MzY2NSAqIChuMCArIG4xICsgbjIgKyBuMyArIG40KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2FtcGxlKF94LCBfeSwgX3osIF93KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIFN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyByb3RhdGlvbnMgaW4gdGhlIGZvcm0gb2YgcXVhdGVybmlvbnMuXHJcbiAgICAqIENvbnN0cnVjdGVkIG91dCBvZiB0aGUgNCBjb21wb25lbnRzOiAoeCwgeSwgeiwgdykuIE1hdGhlbWF0aWNhbCBub3RhdGlvbjogdyArIHhpICsgeWogKyB6ay5cclxuICAgICogQSBRdWF0ZXJuaW9uIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhbiBheGlzIGFuZCBhbmdsZTogKHgsIHksIHopID0gc2luKGFuZ2xlLzIpKmF4aXM7IHcgPSBjb3MoYW5nbGUvMikuXHJcbiAgICAqIHJvbGw6IHgsIHBpdGNoOiB5LCB5YXc6IHouIE5vdGUgdGhhdCBvcGVyYXRpb25zIGFyZSBhZGFwdGVkIHRvIHdvcmsgd2l0aCB2ZWN0b3JzIHdoZXJlIHkgaXMgdXAgYW5kIHogaXMgZm9yd2FyZC5cclxuICAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgejogbnVtYmVyO1xyXG4gICAgcHVibGljIHc6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI2V1bGVyQW5nbGVzOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7IC8vIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVhdGVybmlvbiBpbiBkZWdyZWVzLlxyXG4gICAgI2V1bGVyQW5nbGVzRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDAsIF93OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSwgX3osIF93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBxdWF0ZXJuaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSURFTlRJVFkoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBzY2FsZWQgdG8gbGVuZ3RoIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYW5nbGVzIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2V1bGVyQW5nbGVzOiBWZWN0b3IzKTogUXVhdGVybmlvbjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHF1YXRlcm5pb24gdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIGF4aXMgYW5kIGFuZ2xlIGdpdmVuLlxyXG4gICAgICogQXhpcyBtdXN0IGJlIG5vcm1hbGl6ZWQuIEFuZ2xlIGlzIGluIGRlZ3JlZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2F4aXM6IFZlY3RvcjMsIF9hbmdsZTogbnVtYmVyKTogUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2FuZ2xlPzogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgaWYgKF9hbmdsZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXN1bHQuZXVsZXJBbmdsZXMgPSBfdmVjdG9yO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBoYWxmQW5nbGU6IG51bWJlciA9IF9hbmdsZSAqIENhbGMuZGVnMnJhZCAvIDI7XHJcbiAgICAgICAgbGV0IHNpbkhhbGZBbmdsZTogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXN1bHQuc2V0KFxyXG4gICAgICAgICAgX3ZlY3Rvci54ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgX3ZlY3Rvci55ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgX3ZlY3Rvci56ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgTWF0aC5jb3MoaGFsZkFuZ2xlKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYXhpcyBhbmQgYW5nbGUgZ2l2ZW4uXHJcbiAgICAgKiDimqDvuI8gVU5URVNURUQhXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2F4aXM6IFZlY3RvcjMsIF9hbmdsZTogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAvLyAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuXHJcbiAgICAvLyAgIC8vIE5vcm1hbGl6ZSB0aGUgYXhpc1xyXG4gICAgLy8gICBjb25zdCBheGlzOiBWZWN0b3IzID0gX2F4aXMuY2xvbmU7XHJcbiAgICAvLyAgIGF4aXMubm9ybWFsaXplKCk7XHJcblxyXG4gICAgLy8gICAvLyBDYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gY29tcG9uZW50c1xyXG4gICAgLy8gICBjb25zdCBoYWxmQW5nbGU6IG51bWJlciA9IF9hbmdsZSAvIDI7XHJcbiAgICAvLyAgIGNvbnN0IHM6IG51bWJlciA9IE1hdGguc2luKGhhbGZBbmdsZSk7XHJcbiAgICAvLyAgIHJlc3VsdC54ID0gYXhpcy54ICogcztcclxuICAgIC8vICAgcmVzdWx0LnkgPSBheGlzLnkgKiBzO1xyXG4gICAgLy8gICByZXN1bHQueiA9IGF4aXMueiAqIHM7XHJcbiAgICAvLyAgIHJlc3VsdC53ID0gTWF0aC5jb3MoaGFsZkFuZ2xlKTtcclxuXHJcbiAgICAvLyAgIFJlY3ljbGVyLnN0b3JlKGF4aXMpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHR3byBwYXNzZWQgcXVhdGVybmlvbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPRFVDVChfcUxlZnQ6IFF1YXRlcm5pb24sIF9xUmlnaHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xTGVmdC5jbG9uZS5tdWx0aXBseShfcVJpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBpbnZlcnNlIG9mIGEgcGFzc2VkIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUuaW52ZXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY29uanVnYXRlIG9mIGEgcGFzc2VkIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ09OSlVHQVRJT04oX3E6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xLmNsb25lLmNvbmp1Z2F0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXRlcm5pb25zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfcTE6IFF1YXRlcm5pb24sIF9xMjogUXVhdGVybmlvbik6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfcTEueCAqIF9xMi54ICsgX3ExLnkgKiBfcTIueSArIF9xMS56ICogX3EyLnogKyBfcTEudyAqIF9xMi53O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0ZXJuaW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gX2ZhY3Rvci4gV2hlbiBfZmFjdG9yIGlzIDAgdGhlIHJlc3VsdCBpcyBfZnJvbSwgd2hlbiBfZmFjdG9yIGlzIDEgdGhlIHJlc3VsdCBpcyBfdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTEVSUChfZnJvbTogUXVhdGVybmlvbiwgX3RvOiBRdWF0ZXJuaW9uLCBfZmFjdG9yOiBudW1iZXIpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgbGV0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAoX2Zyb20ueCAqICgxIC0gX2ZhY3RvcikgKyBfdG8ueCAqIF9mYWN0b3IpLFxyXG4gICAgICAgIChfZnJvbS55ICogKDEgLSBfZmFjdG9yKSArIF90by55ICogX2ZhY3RvciksXHJcbiAgICAgICAgKF9mcm9tLnogKiAoMSAtIF9mYWN0b3IpICsgX3RvLnogKiBfZmFjdG9yKSxcclxuICAgICAgICAoX2Zyb20udyAqICgxIC0gX2ZhY3RvcikgKyBfdG8udyAqIF9mYWN0b3IpXHJcbiAgICAgICk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0ZXJuaW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gX2ZhY3Rvci4gV2hlbiBfZmFjdG9yIGlzIDAgdGhlIHJlc3VsdCBpcyBfZnJvbSwgd2hlbiBfZmFjdG9yIGlzIDEgdGhlIHJlc3VsdCBpcyBfdG8uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNMRVJQKF9mcm9tOiBRdWF0ZXJuaW9uLCBfdG86IFF1YXRlcm5pb24sIF9mYWN0b3I6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cclxuICAgICAgbGV0IGNvc0hhbGZUaGV0YTogbnVtYmVyID0gX2Zyb20udyAqIF90by53ICsgX2Zyb20ueCAqIF90by54ICsgX2Zyb20ueSAqIF90by55ICsgX2Zyb20ueiAqIF90by56O1xyXG4gICAgICBpZiAoTWF0aC5hYnMoY29zSGFsZlRoZXRhKSA+PSAxKVxyXG4gICAgICAgIHJldHVybiBfZnJvbTtcclxuICAgICAgbGV0IGhhbGZUaGV0YTogbnVtYmVyID0gTWF0aC5hY29zKGNvc0hhbGZUaGV0YSk7XHJcbiAgICAgIGxldCBzaW5IYWxmVGhldGE6IG51bWJlciA9IE1hdGguc3FydCgxIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhKTtcclxuICAgICAgaWYgKE1hdGguYWJzKHNpbkhhbGZUaGV0YSkgPCAwLjAwMSkge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAgIChfZnJvbS54ICogMC41ICsgX3RvLnggKiAwLjUpLFxyXG4gICAgICAgICAgKF9mcm9tLnkgKiAwLjUgKyBfdG8ueSAqIDAuNSksXHJcbiAgICAgICAgICAoX2Zyb20ueiAqIDAuNSArIF90by56ICogMC41KSxcclxuICAgICAgICAgIChfZnJvbS53ICogMC41ICsgX3RvLncgKiAwLjUpXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCByYXRpb0E6IG51bWJlciA9IE1hdGguc2luKCgxIC0gX2ZhY3RvcikgKiBoYWxmVGhldGEpIC8gc2luSGFsZlRoZXRhO1xyXG4gICAgICBsZXQgcmF0aW9COiBudW1iZXIgPSBNYXRoLnNpbihfZmFjdG9yICogaGFsZlRoZXRhKSAvIHNpbkhhbGZUaGV0YTtcclxuICAgICAgbGV0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAoX2Zyb20ueCAqIHJhdGlvQSArIF90by54ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20ueSAqIHJhdGlvQSArIF90by55ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20ueiAqIHJhdGlvQSArIF90by56ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20udyAqIHJhdGlvQSArIF90by53ICogcmF0aW9CKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5yZXVzZShRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LmNvcHkodGhpcyk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIHRoZSBldWxlciBhbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcm90YXRpb24gaW4gZGVncmVlcy4gXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IHNldCB0aGUgZXVsZXIgYW5nbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIGluIGRlZ3JlZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZXVsZXJBbmdsZXMoKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNldWxlckFuZ2xlc0RpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXNEaXJ0eSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy54ID09IDAgJiYgdGhpcy55ID09IDAgJiYgdGhpcy56ID09IDAgJiYgdGhpcy53ID09IDEpIHtcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgwLCAwLCAwKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLiNldWxlckFuZ2xlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJvbGwgKHgtYXhpcyByb3RhdGlvbilcclxuICAgICAgICBsZXQgc2lucmNvc3A6IG51bWJlciA9IDIgKiAodGhpcy53ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy56KTtcclxuICAgICAgICBsZXQgY29zcmNvc3A6IG51bWJlciA9IDEgLSAyICogKHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueCA9IE1hdGguYXRhbjIoc2lucmNvc3AsIGNvc3Jjb3NwKTtcclxuXHJcbiAgICAgICAgLy8gcGl0Y2ggKHktYXhpcyByb3RhdGlvbilcclxuICAgICAgICBsZXQgc2lucDogbnVtYmVyID0gMiAqICh0aGlzLncgKiB0aGlzLnkgLSB0aGlzLnogKiB0aGlzLngpO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhzaW5wKSA+PSAxKVxyXG4gICAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueSA9IHNpbnAgPCAwID8gLU1hdGguYWJzKE1hdGguUEkgLyAyKSA6IE1hdGguYWJzKE1hdGguUEkgLyAyKTsgLy8gdXNlIDkwIGRlZ3JlZXMgaWYgb3V0IG9mIHJhbmdlXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueSA9IE1hdGguYXNpbihzaW5wKTtcclxuXHJcbiAgICAgICAgLy8geWF3ICh6LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnljb3NwOiBudW1iZXIgPSAyICogKHRoaXMudyAqIHRoaXMueiArIHRoaXMueCAqIHRoaXMueSk7XHJcbiAgICAgICAgbGV0IGNvc3ljb3NwOiBudW1iZXIgPSAxIC0gMiAqICh0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnopO1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnogPSBNYXRoLmF0YW4yKHNpbnljb3NwLCBjb3N5Y29zcCk7XHJcblxyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKENhbGMucmFkMmRlZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNldWxlckFuZ2xlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGV1bGVyQW5nbGVzKF9ldWxlckFuZ2xlczogVmVjdG9yMykge1xyXG4gICAgICBjb25zdCBoYWxmQW5nbGVzSW5SYWRpYW5zOiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShfZXVsZXJBbmdsZXMsIENhbGMuZGVnMnJhZCAvIDIpO1xyXG4gICAgICBjb25zdCBjb3NYOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLngpO1xyXG4gICAgICBjb25zdCBjb3NZOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLnkpO1xyXG4gICAgICBjb25zdCBjb3NaOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLnopO1xyXG4gICAgICBjb25zdCBzaW5YOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLngpO1xyXG4gICAgICBjb25zdCBzaW5ZOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLnkpO1xyXG4gICAgICBjb25zdCBzaW5aOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLnopO1xyXG5cclxuICAgICAgdGhpcy5zZXQoXHJcbiAgICAgICAgc2luWCAqIGNvc1kgKiBjb3NaIC0gY29zWCAqIHNpblkgKiBzaW5aLFxyXG4gICAgICAgIGNvc1ggKiBzaW5ZICogY29zWiArIHNpblggKiBjb3NZICogc2luWixcclxuICAgICAgICBjb3NYICogY29zWSAqIHNpblogLSBzaW5YICogc2luWSAqIGNvc1osXHJcbiAgICAgICAgY29zWCAqIGNvc1kgKiBjb3NaICsgc2luWCAqIHNpblkgKiBzaW5aXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlcy5jb3B5KF9ldWxlckFuZ2xlcyk7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyBxdWF0ZXJuaW9uIHRvIGEgbGVuZ3RoIG9mIDEgKGEgdW5pdCBxdWF0ZXJuaW9uKSBtYWtpbmcgaXQgYSB2YWxpZCByb3RhdGlvbiByZXByZXNlbnRhdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSBNYXRoLnNxcnQodGhpcy54ICoqIDIgKyB0aGlzLnkgKiogMiArIHRoaXMueiAqKiAyICsgdGhpcy53ICoqIDIpO1xyXG4gICAgICB0aGlzLnggLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnkgLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnogLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLncgLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhpcyBxdWF0ZXJuaW9uIGFuZCByZXR1cm5zIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCAqPSAtMTtcclxuICAgICAgdGhpcy55ICo9IC0xO1xyXG4gICAgICB0aGlzLnogKj0gLTE7XHJcbiAgICAgIHRoaXMudyAqPSAtMTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBxdWF0ZXJuaW9uIHRvIHRoZSBpZGVudGl0eS1xdWF0ZXJuaW9uIGFuZCBjbGVhcnMgY2FjaGUuIFVzZWQgYnkgdGhlIHJlY3ljbGVyIHRvIHJlc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZlcnQgdGhpcyBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52ZXJ0KCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICAvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxyXG4gICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbmp1Z2F0ZXMgdGhpcyBxdWF0ZXJuaW9uIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uanVnYXRlKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggKj0gLTE7XHJcbiAgICAgIHRoaXMueSAqPSAtMTtcclxuICAgICAgdGhpcy56ICo9IC0xO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoaXMgcXVhdGVybmlvbiBhcm91bmQgdGhlIGdpdmVuIGF4aXMgYnkgdGhlIGdpdmVuIGFuZ2xlLlxyXG4gICAgICogVGhlIHJvdGF0aW9uIGlzIGFwcGVuZGVkIHRvIGFscmVhZHkgYXBwbGllZCByb3RhdGlvbnMsIHRodXMgbXVsdGlwbGllZCBmcm9tIHRoZSByaWdodC4gU2V0IF9mcm9tTGVmdCB0byB0cnVlIHRvIHN3aXRjaCBhbmQgcHV0IGl0IGluIGZyb250LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlKF9heGlzOiBWZWN0b3IzLCBfYW5nbGU6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3Qgcm90YXRpb246IFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLlJPVEFUSU9OKF9heGlzLCBfYW5nbGUpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KHJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBxdWF0ZXJuaW9uIHdpdGggdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG11bHRpcGx5KF9vdGhlcjogUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3QgYTogUXVhdGVybmlvbiA9IF9mcm9tTGVmdCA/IF9vdGhlciA6IHRoaXM7XHJcbiAgICAgIGNvbnN0IGI6IFF1YXRlcm5pb24gPSBfZnJvbUxlZnQgPyB0aGlzIDogX290aGVyO1xyXG4gICAgICAvLyBmcm9tOiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXHJcbiAgICAgIGNvbnN0IGF4OiBudW1iZXIgPSBhLng7XHJcbiAgICAgIGNvbnN0IGF5OiBudW1iZXIgPSBhLnk7XHJcbiAgICAgIGNvbnN0IGF6OiBudW1iZXIgPSBhLno7XHJcbiAgICAgIGNvbnN0IGF3OiBudW1iZXIgPSBhLnc7XHJcbiAgICAgIGNvbnN0IGJ4OiBudW1iZXIgPSBiLng7XHJcbiAgICAgIGNvbnN0IGJ5OiBudW1iZXIgPSBiLnk7XHJcbiAgICAgIGNvbnN0IGJ6OiBudW1iZXIgPSBiLno7XHJcbiAgICAgIGNvbnN0IGJ3OiBudW1iZXIgPSBiLnc7XHJcblxyXG4gICAgICB0aGlzLnNldChcclxuICAgICAgICBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnkgKyBhdyAqIGJ4LFxyXG4gICAgICAgIC1heCAqIGJ6ICsgYXkgKiBidyArIGF6ICogYnggKyBhdyAqIGJ5LFxyXG4gICAgICAgIGF4ICogYnkgLSBheSAqIGJ4ICsgYXogKiBidyArIGF3ICogYnosXHJcbiAgICAgICAgLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBieiArIGF3ICogYndcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3o6IG51bWJlciwgX3c6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggPSBfeDsgdGhpcy55ID0gX3k7IHRoaXMueiA9IF96OyB0aGlzLncgPSBfdztcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBpbnRvIHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCA9IF9vcmlnaW5hbC54OyB0aGlzLnkgPSBfb3JpZ2luYWwueTsgdGhpcy56ID0gX29yaWdpbmFsLno7IHRoaXMudyA9IF9vcmlnaW5hbC53O1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gX29yaWdpbmFsLiNldWxlckFuZ2xlc0RpcnR5O1xyXG4gICAgICBpZiAoIXRoaXMuI2V1bGVyQW5nbGVzRGlydHkpXHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfb3JpZ2luYWwuI2V1bGVyQW5nbGVzKTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuUXVhdGVybmlvbih4OiAke3RoaXMueH0sIHk6ICR7dGhpcy55fSwgejogJHt0aGlzLnp9LCB3OiAke3RoaXMud30pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjdXJyZW50bHkgcXVhdGVybmlvbnMgYXJlIG5ldmVyIHNlcmlhbGl6ZWQsIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4gQnV0IG1heWJlIGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYFske3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud31dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxRdWF0ZXJuaW9uPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMud10gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAoIXRoaXMubXV0YXRvcilcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnosIHc6IHRoaXMudyB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy54ID0gX211dGF0b3IueCA/PyB0aGlzLng7XHJcbiAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnkgPz8gdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSBfbXV0YXRvci56ID8/IHRoaXMuejtcclxuICAgICAgdGhpcy53ID0gX211dGF0b3IudyA/PyB0aGlzLnc7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0Q2FjaGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIGZvciBjcmVhdGluZyByYW5kb20gdmFsdWVzLCBzdXBwb3J0aW5nIEphdmFzY3JpcHQncyBNYXRoLnJhbmRvbSBhbmQgYSBkZXRlcm1pbmlzdGlnIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoUFJORykgXHJcbiAgICogdGhhdCBjYW4gYmUgZmVkIHdpdGggYSBzZWVkIGFuZCB0aGVuIHJldHVybnMgYSByZXByb2R1Y2FibGUgc2V0IG9mIHJhbmRvbSBudW1iZXJzIChpZiB0aGUgcHJlY2lzaW9uIG9mIEphdmFzY3JpcHQgYWxsb3dzKSBcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJhbmRvbSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHQ6IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxuICAgIHByaXZhdGUgZ2VuZXJhdGU6IEZ1bmN0aW9uID0gTWF0aC5yYW5kb207XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJhbmRvbX0uIFxyXG4gICAgICogSWYgYSBzZWVkIGlzIGdpdmVuLCBMRklCNCBpcyB1c2VkIGFzIGdlbmVyYXRvciwgcmVwcm9kdWNpbmcgYSBzZXJpZXMgb2YgbnVtYmVycyBmcm9tIHRoYXQgc2VlZC5cclxuICAgICAqIElmIGEgZnVuY3Rpb24gcHJvZHVjaW5nIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZCBhcyBnZW5lcmF0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2VlZE9yRnVuY3Rpb24/OiBudW1iZXIgfCBGdW5jdGlvbikge1xyXG4gICAgICBpZiAoX3NlZWRPckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZSA9IF9zZWVkT3JGdW5jdGlvbjtcclxuICAgICAgZWxzZSBpZiAoX3NlZWRPckZ1bmN0aW9uID09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gTWF0aC5yYW5kb207XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gbmV3IExGSUI0KF9zZWVkT3JGdW5jdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbm9ybWVkIHJhbmRvbSBudW1iZXIsIHRodXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9ybSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIGdpdmVuIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2UoX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX21pbiArIHRoaXMuZ2VuZXJhdGUoKSAqIChfbWF4IC0gX21pbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBnaXZlbiBmbG9vcmVkIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2VGbG9vcmVkKF9taW46IG51bWJlciwgX21heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5nZXRSYW5nZShfbWluLCBfbWF4KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKCkgPCAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIC0xIG9yIDEgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbigpID8gMSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGluZGV4IGludG8gdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbmRleDxUPihfYXJyYXk6IEFycmF5PFQ+KTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJhbmdlRmxvb3JlZCgwLCBfYXJyYXkubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFbGVtZW50PFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiBfYXJyYXlbdGhpcy5nZXRJbmRleChfYXJyYXkpXTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcmFuZG9tbHkgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheSBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaWNlPFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgcmV0dXJuIF9hcnJheS5zcGxpY2UodGhpcy5nZXRJbmRleChfYXJyYXkpLCAxKVswXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb21seSBzZWxlY3RlZCBrZXkgZnJvbSB0aGUgZ2l2ZW4gTWFwLWluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXk8VCwgVT4oX21hcDogTWFwPFQsIFU+KTogVCB7XHJcbiAgICAgIGxldCBrZXlzOiBHZW5lcmFsID0gQXJyYXkuZnJvbShfbWFwLmtleXMoKSk7XHJcbiAgICAgIHJldHVybiBrZXlzW3RoaXMuZ2V0SW5kZXgoa2V5cyldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eU5hbWU8VD4oX29iamVjdDogVCk6IGtleW9mIFQge1xyXG4gICAgICBsZXQga2V5czogc3RyaW5nW10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIDxrZXlvZiBUPmtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tbHkgc2VsZWN0ZWQgc3ltYm9sIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgaWYgc3ltYm9scyBhcmUgdXNlZCBhcyBrZXlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eVN5bWJvbDxUPihfb2JqZWN0OiBUKTogc3ltYm9sIHtcclxuICAgICAgbGV0IGtleXM6IHN5bWJvbFtdID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIGtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHRocmVlLWRpbWVuc2lvbmFsIHZlY3RvciBpbiB0aGUgbGltaXRzIG9mIHRoZSBib3ggZGVmaW5lZCBieSB0aGUgdmVjdG9ycyBnaXZlbiBhcyBbX2Nvcm5lcjAsIF9jb3JuZXIxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVjdG9yMyhfY29ybmVyMDogVmVjdG9yMywgX2Nvcm5lcjE6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueCwgX2Nvcm5lcjEueCksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueSwgX2Nvcm5lcjEueSksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueiwgX2Nvcm5lcjEueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB0d28tZGltZW5zaW9uYWwgdmVjdG9yIGluIHRoZSBsaW1pdHMgb2YgdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIGdpdmVuIGFzIFtfY29ybmVyMCwgX2Nvcm5lcjFbXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZWN0b3IyKF9jb3JuZXIwOiBWZWN0b3IyLCBfY29ybmVyMTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy5nZXRSYW5nZShfY29ybmVyMC54LCBfY29ybmVyMS54KSwgdGhpcy5nZXRSYW5nZShfY29ybmVyMC55LCBfY29ybmVyMS55KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFuZGFyZCB7QGxpbmsgUmFuZG9tfS1pbnN0YW5jZSB1c2luZyBNYXRoLnJhbmRvbSgpLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCByYW5kb206IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0aHJlZWRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSBhbmQgelxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICt5XHJcbiAgICogICAgICAgICAgICAgfF9fICt4XHJcbiAgICogICAgICAgICAgICAvXHJcbiAgICogICAgICAgICAgK3ogICBcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjIgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXQoX3gsIF95LCBfeik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB4LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB5LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFkoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB6LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFooX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDAsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIHZhbHVlIDAgb24gZWFjaCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IzIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCwgMCk7IC8vIHNob3VsZCBiZSBzZXQgdG8gMCBieSByZWN5Y2xlciBhbHJlYWR5P1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciBvZiB0aGUgZ2l2ZW4gc2l6ZSBvbiBlYWNoIG9mIHRoZSB0aHJlZSBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXggb3Igcm90YXRpb24gcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IzLCBfdHJhbnNmb3JtOiBNYXRyaXg0eDQgfCBRdWF0ZXJuaW9uLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuXHJcbiAgICAgIGlmIChfdHJhbnNmb3JtIGluc3RhbmNlb2YgTWF0cml4NHg0KSB7XHJcbiAgICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF90cmFuc2Zvcm0uZ2V0KCk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueSArIG1bOF0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs1XSAqIF92ZWN0b3IueSArIG1bOV0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzJdICogX3ZlY3Rvci54ICsgbVs2XSAqIF92ZWN0b3IueSArIG1bMTBdICogX3ZlY3Rvci56XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICByZXN1bHQuYWRkKF90cmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy90cmFuc2Zvcm1zL2luZGV4Lmh0bVxyXG4gICAgICAgIC8vIHJlc3VsdCA9IHEgKiBxdWF0ZXJuaW9uKHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIDApICogY29uaihxKVxyXG5cclxuICAgICAgICAvLyBxICogcXVhdGVybmlvbih2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCAwKSAuLi5cclxuICAgICAgICBjb25zdCBxeDogbnVtYmVyID0gX3RyYW5zZm9ybS53ICogX3ZlY3Rvci54ICsgX3RyYW5zZm9ybS55ICogX3ZlY3Rvci56IC0gX3RyYW5zZm9ybS56ICogX3ZlY3Rvci55O1xyXG4gICAgICAgIGNvbnN0IHF5OiBudW1iZXIgPSBfdHJhbnNmb3JtLncgKiBfdmVjdG9yLnkgKyBfdHJhbnNmb3JtLnogKiBfdmVjdG9yLnggLSBfdHJhbnNmb3JtLnggKiBfdmVjdG9yLno7XHJcbiAgICAgICAgY29uc3QgcXo6IG51bWJlciA9IF90cmFuc2Zvcm0udyAqIF92ZWN0b3IueiArIF90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueDtcclxuICAgICAgICBjb25zdCBxdzogbnVtYmVyID0gLV90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueCAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueiAqIF92ZWN0b3IuejtcclxuXHJcbiAgICAgICAgLy8gLi4uICogY29uaihxKVxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBxeCAqIF90cmFuc2Zvcm0udyArIHF3ICogLSBfdHJhbnNmb3JtLnggKyBxeSAqIC0gX3RyYW5zZm9ybS56IC0gcXogKiAtIF90cmFuc2Zvcm0ueSxcclxuICAgICAgICAgIHF5ICogX3RyYW5zZm9ybS53ICsgcXcgKiAtIF90cmFuc2Zvcm0ueSArIHF6ICogLSBfdHJhbnNmb3JtLnggLSBxeCAqIC0gX3RyYW5zZm9ybS56LFxyXG4gICAgICAgICAgcXogKiBfdHJhbnNmb3JtLncgKyBxdyAqIC0gX3RyYW5zZm9ybS56ICsgcXggKiAtIF90cmFuc2Zvcm0ueSAtIHF5ICogLSBfdHJhbnNmb3JtLnhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgdG8gdGhlIGdpdmVuIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yM1tdKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGZvciAobGV0IHZlY3RvciBvZiBfdmVjdG9ycylcclxuICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC54ICsgdmVjdG9yLngsIHJlc3VsdC55ICsgdmVjdG9yLnksIHJlc3VsdC56ICsgdmVjdG9yLnopO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBESUZGRVJFTkNFKF9taW51ZW5kOiBWZWN0b3IzLCBfc3VidHJhaGVuZDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoX21pbnVlbmQueCAtIF9zdWJ0cmFoZW5kLngsIF9taW51ZW5kLnkgLSBfc3VidHJhaGVuZC55LCBfbWludWVuZC56IC0gX3N1YnRyYWhlbmQueik7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIHNjYWxpbmcgZmFjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTEUoX3ZlY3RvcjogVmVjdG9yMywgX3NjYWxpbmc6IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgc2NhbGVkOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHNjYWxlZC5zZXQoX3ZlY3Rvci54ICogX3NjYWxpbmcsIF92ZWN0b3IueSAqIF9zY2FsaW5nLCBfdmVjdG9yLnogKiBfc2NhbGluZyk7XHJcbiAgICAgIHJldHVybiBzY2FsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyB0aGUgY3Jvc3Nwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDUk9TUyhfYTogVmVjdG9yMywgX2I6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KFxyXG4gICAgICAgIF9hLnkgKiBfYi56IC0gX2EueiAqIF9iLnksXHJcbiAgICAgICAgX2EueiAqIF9iLnggLSBfYS54ICogX2IueixcclxuICAgICAgICBfYS54ICogX2IueSAtIF9hLnkgKiBfYi54XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBkb3Rwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX2E6IFZlY3RvcjMsIF9iOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hLnggKiBfYi54ICsgX2EueSAqIF9iLnkgKyBfYS56ICogX2Iuejs7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSByZWZsZWN0aW9uIG9mIHRoZSBpbmNvbWluZyB2ZWN0b3IgYXQgdGhlIGdpdmVuIG5vcm1hbCB2ZWN0b3IuIFRoZSBsZW5ndGggb2Ygbm9ybWFsIHNob3VsZCBiZSAxLlxyXG4gICAgICogICAgIF9fX19fX19fX19fX19fX19fX1xyXG4gICAgICogICAgICAgICAgIC98XFxcclxuICAgICAqIGluY29taW5nIC8gfCBcXCByZWZsZWN0aW9uXHJcbiAgICAgKiAgICAgICAgIC8gIHwgIFxcICAgXHJcbiAgICAgKiAgICAgICAgICBub3JtYWxcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJFRkxFQ1RJT04oX2luY29taW5nOiBWZWN0b3IzLCBfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBkb3Q6IG51bWJlciA9IC1WZWN0b3IzLkRPVChfaW5jb21pbmcsIF9ub3JtYWwpO1xyXG4gICAgICBsZXQgcmVmbGVjdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKF9pbmNvbWluZywgVmVjdG9yMy5TQ0FMRShfbm9ybWFsLCAyICogZG90KSk7XHJcbiAgICAgIHJldHVybiByZWZsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyB0aGUgZGl2aWRlbmQgYnkgdGhlIGRpdmlzb3IgY29tcG9uZW50IGJ5IGNvbXBvbmVudCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU8oX2RpdmlkZW5kOiBWZWN0b3IzLCBfZGl2aXNvcjogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoX2RpdmlkZW5kLnggLyBfZGl2aXNvci54LCBfZGl2aWRlbmQueSAvIF9kaXZpc29yLnksIF9kaXZpZGVuZC56IC8gX2Rpdmlzb3Iueik7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2FydGVzaWFuIHZlY3RvciBmcm9tIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHRU8oX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLnJldXNlKEdlbzMpO1xyXG4gICAgICBnZW8uc2V0KF9sb25naXR1ZGUsIF9sYXRpdHVkZSwgX21hZ25pdHVkZSk7XHJcbiAgICAgIHZlY3Rvci5nZW8gPSBnZW87XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGdlbyk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGFuZ2xlIGluIGRlZ3JlZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBBTkdMRShfZnJvbTogVmVjdG9yMywgX3RvOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSBNYXRoLmFjb3MoQ2FsYy5jbGFtcChWZWN0b3IzLkRPVChfZnJvbSwgX3RvKSAvIChfZnJvbS5tYWduaXR1ZGUgKiBfdG8ubWFnbml0dWRlKSwgLTEsIDEpKTsgLy8gY2xhbXAgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBlcnJvcnMgd2hlbiBmcm9tID09IHRvXHJcbiAgICAgIHJldHVybiBhbmdsZSAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcHJvamVjdGlvbiBvZiBhIG9udG8gYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0pFQ1RJT04oX2E6IFZlY3RvcjMsIF9iOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBfYS5jbG9uZS5wcm9qZWN0KF9iKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnksIHRoaXMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMy5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJucyBhIGdlb2dyYXBoaWMgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IgIFxyXG4gICAgICogLSBzZXQ6IGFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBnZW8oX2dlbzogR2VvMykge1xyXG4gICAgICB0aGlzLnNldCgwLCAwLCBfZ2VvLm1hZ25pdHVkZSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9YKC1fZ2VvLmxhdGl0dWRlKSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9nZW8ubG9uZ2l0dWRlKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGdlbygpOiBHZW8zIHtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLmdldChHZW8zKTtcclxuICAgICAgZ2VvLm1hZ25pdHVkZSA9IHRoaXMubWFnbml0dWRlO1xyXG5cclxuICAgICAgaWYgKGdlby5tYWduaXR1ZGUgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIGdlbztcclxuXHJcbiAgICAgIGdlby5sb25naXR1ZGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueCAvIGdlby5tYWduaXR1ZGUsIHRoaXMueiAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgZ2VvLmxhdGl0dWRlID0gMTgwICogTWF0aC5hc2luKHRoaXMueSAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55LCBfb3JpZ2luYWwueik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yIGFyZSB0byBiZSBjb25zaWRlcmVkIGlkZW50aWNhbCB3aXRoaW4gdGhlIGdpdmVuIHRvbGVyYW5jZVxyXG4gICAgICogVE9ETzogZXhhbWluZSwgaWYgdG9sZXJhbmNlIGFzIGNyaXRlcml1bSBmb3IgdGhlIGRpZmZlcmVuY2UgaXMgYXBwcm9wcmlhdGUgd2l0aCB2ZXJ5IGxhcmdlIGNvb3JkaW5hdGUgdmFsdWVzIG9yIGlmIF90b2xlcmFuY2Ugc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgY29vcmRpbmF0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXF1YWxzKF9jb21wYXJlOiBWZWN0b3IzLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy54IC0gX2NvbXBhcmUueCkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnkgLSBfY29tcGFyZS55KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueiAtIF9jb21wYXJlLnopID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9zaXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgaXMgd2l0aGluIGEgY3ViZSB3aXRoIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIDEgYW5kIDJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlQ3ViZShfY29ybmVyMTogVmVjdG9yMywgX2Nvcm5lcjI6IFZlY3RvcjMpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGRpYWdvbmFsOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9jb3JuZXIyLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByZWxhdGl2ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByYXRpbzogVmVjdG9yMyA9IFZlY3RvcjMuUkFUSU8ocmVsYXRpdmUsIGRpYWdvbmFsKTtcclxuICAgICAgaWYgKHJhdGlvLnggPiAxIHx8IHJhdGlvLnggPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnkgPiAxIHx8IHJhdGlvLnkgPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnogPiAxIHx8IHJhdGlvLnogPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvc2l0aW9uIGRlc2NyaWJlZCBieSB0aGlzIGlzIHdpdGhpbiBhIHNwaGVyZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXIgYW5kIHJhZGl1c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGVTcGhlcmUoX2NlbnRlcjogVmVjdG9yMywgX3JhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMsIF9jZW50ZXIpO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZS5tYWduaXR1ZGVTcXVhcmVkIDwgKF9yYWRpdXMgKiBfcmFkaXVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHRoaXMueiArPSBfYWRkZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54O1xyXG4gICAgICB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTtcclxuICAgICAgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnogKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGVzIHRoaXMgdmVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBzaWducyBvZiBpdHMgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSAtdGhpcy54O1xyXG4gICAgICB0aGlzLnkgPSAtdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2plY3RzIHRoaXMgdmVjdG9yIG9udG8gdGhlIGdpdmVuIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvamVjdChfb246IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHNjYWxhcjogbnVtYmVyID0gVmVjdG9yMy5ET1QodGhpcywgX29uKSAvIF9vbi5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICB0aGlzLnggPSBfb24ueCAqIHNjYWxhcjtcclxuICAgICAgdGhpcy55ID0gX29uLnkgKiBzY2FsYXI7XHJcbiAgICAgIHRoaXMueiA9IF9vbi56ICogc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHRoaXMueiA9IF96O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3RoaXMueCwgdGhpcy55LCB0aGlzLnpdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCBvciByb3RhdGlvbiBxdWF0ZXJuaW9uLiBcclxuICAgICAqIEluY2x1ZGluZyBvciBleGx1ZGluZyB0aGUgdHJhbnNsYXRpb24gaWYgYSBtYXRyaXggaXMgcGFzc2VkLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX3RyYW5zZm9ybTogTWF0cml4NHg0IHwgUXVhdGVybmlvbiwgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTih0aGlzLCBfdHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyb3BzIHRoZSB6LWNvbXBvbmVudCBhbmQgcmV0dXJucyBhIFZlY3RvcjIgY29uc2lzdGluZyBvZiB0aGUgeC0gYW5kIHktY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IyKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmbGVjdHMgdGhpcyB2ZWN0b3IgYXQgYSBnaXZlbiBub3JtYWwuIFNlZSB7QGxpbmsgVmVjdG9yMy5SRUZMRUNUSU9OfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmbGVjdChfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHJlZmxlY3RlZDogVmVjdG9yMyA9IFZlY3RvcjMuUkVGTEVDVElPTih0aGlzLCBfbm9ybWFsKTtcclxuICAgICAgdGhpcy5zZXQocmVmbGVjdGVkLngsIHJlZmxlY3RlZC55LCByZWZsZWN0ZWQueik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlZmxlY3RlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNodWZmbGUoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBhOiBudW1iZXJbXSA9IFt0aGlzLngsIHRoaXMueSwgdGhpcy56XTtcclxuICAgICAgdGhpcy5zZXQoUmFuZG9tLmRlZmF1bHQuc3BsaWNlKGEpLCBSYW5kb20uZGVmYXVsdC5zcGxpY2UoYSksIGFbMF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGJld3R3ZWVuIHRoaXMgdmVjdG9yIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZShfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZGlmZmVyZW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfdG8pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShkaWZmZXJlbmNlKTtcclxuICAgICAgcmV0dXJuIGRpZmZlcmVuY2UubWFnbml0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICB0aGlzLnogPSBNYXRoLm1pbih0aGlzLnosIF9jb21wYXJlLnopO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgdGhpcy56ID0gTWF0aC5tYXgodGhpcy56LCBfY29tcGFyZS56KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKF92YWx1ZTogbnVtYmVyLCBfaW5kZXg6IG51bWJlciwgX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnksIHRoaXMuel0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIChtb2RpZnlpbmcgaXQpIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHkoX2Z1bmN0aW9uOiAoX3ZhbHVlOiBudW1iZXIsIF9pbmRleDogbnVtYmVyLCBfY29tcG9uZW50OiBcInhcIiB8IFwieVwiIHwgXCJ6XCIpID0+IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfZnVuY3Rpb24odGhpcy54LCAwLCBcInhcIik7XHJcbiAgICAgIHRoaXMueSA9IF9mdW5jdGlvbih0aGlzLnksIDEsIFwieVwiKTtcclxuICAgICAgdGhpcy56ID0gX2Z1bmN0aW9uKHRoaXMueiwgMiwgXCJ6XCIpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgKCR7dGhpcy54LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnkudG9QcmVjaXNpb24oNSl9LCAke3RoaXMuei50b1ByZWNpc2lvbig1KX0pYDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFZlY3RvcjM+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX3NlcmlhbGl6YXRpb24pID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBbdGhpcy54LCB0aGlzLnksIHRoaXMuel0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLnggPSBfbXV0YXRvci54O1xyXG4gICAgICBpZiAoX211dGF0b3IueSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnk7XHJcbiAgICAgIGlmIChfbXV0YXRvci56ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy56ID0gX211dGF0b3IuejtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnogfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gVHJhbnNmZXJcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgZm91cmRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSwgeiBhbmQgdy5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yNCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF96OiBudW1iZXIgPSAwLCBfdzogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3ksIF96LCBfdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIHRoZSB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBNYXRoLmh5cG90KHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3F1YXJlZCBtYWduaXR1ZGUgKGxlbmd0aCkgb2YgdGhlIHZlY3Rvci4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5kb3QodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShWZWN0b3I0KS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnksIF9vcmlnaW5hbC56LCBfb3JpZ2luYWwudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgdGhpcy54ID0gX3g7IHRoaXMueSA9IF95OyB0aGlzLnogPSBfejsgdGhpcy53ID0gX3c7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgIHJldHVybiBbdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7IHRoaXMueSArPSBfYWRkZW5kLnk7IHRoaXMueiArPSBfYWRkZW5kLno7IHRoaXMudyArPSBfYWRkZW5kLnc7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54OyB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTsgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7IHRoaXMudyAtPSBfc3VidHJhaGVuZC53O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyOyB0aGlzLnkgKj0gX3NjYWxhcjsgdGhpcy56ICo9IF9zY2FsYXI7IHRoaXMudyAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKF9sZW5ndGg6IG51bWJlciA9IDEpOiBWZWN0b3I0IHtcclxuICAgICAgbGV0IG1hZ25pdHVkZVNxdWFyZWQ6IG51bWJlciA9IHRoaXMubWFnbml0dWRlU3F1YXJlZDtcclxuICAgICAgaWYgKG1hZ25pdHVkZVNxdWFyZWQgPT0gMClcclxuICAgICAgICB0aHJvdyAobmV3IFJhbmdlRXJyb3IoXCJJbXBvc3NpYmxlIG5vcm1hbGl6YXRpb25cIikpO1xyXG4gICAgICB0aGlzLnNjYWxlKF9sZW5ndGggLyBNYXRoLnNxcnQobWFnbml0dWRlU3F1YXJlZCkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgaW5zdGFuY2UgYW5kIGFub3RoZXIgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG90KF9vdGhlcjogVmVjdG9yNCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnggKiBfb3RoZXIueCArIHRoaXMueSAqIF9vdGhlci55ICsgdGhpcy56ICogX290aGVyLnogKyB0aGlzLncgKiBfb3RoZXIudztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHsgdG9KU09OOiAoKSA9PiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0sICR7dGhpcy53fV1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3I0PiB7XHJcbiAgICAgIFt0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLnddID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsgLyoqICovIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgZmFjZSBvZiBhIHtAbGluayBNZXNofSBieSByZWZlcmVuY2luZyB0aHJlZSB7QGxpbmsgVmVydGljZXN9IHdpdGggdGhlaXIgaW5kaXplc1xyXG4gICAqIGFuZCBjYWxjdWxhdGVzIGZhY2Ugbm9ybWFscy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGYWNlIHtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGFuZ2xlczogbnVtYmVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBub3JtYWxVbnNjYWxlZDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHZlcnRpY2VzOiBWZXJ0aWNlcztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmluZGljZXMgPSBbX2luZGV4MCwgX2luZGV4MSwgX2luZGV4Ml07XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBfdmVydGljZXM7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTm9ybWFscygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIHZlcnRleCByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmVydGljZXMucG9zaXRpb24odGhpcy5pbmRpY2VzW19pbmRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogbXVzdCBiZSBjb3BsYW5hclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IzKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGluZGV4IG9mIHRoaXMuaW5kaWNlcykge1xyXG4gICAgICAgIGxldCBkaWZmOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMudmVydGljZXMucG9zaXRpb24oaW5kZXgpLCBfcG9pbnQpO1xyXG4gICAgICAgIGRpZmZzLnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG4wOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhkaWZmc1sxXSwgZGlmZnNbMF0pO1xyXG4gICAgICBsZXQgbjE6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKGRpZmZzWzJdLCBkaWZmc1sxXSk7XHJcbiAgICAgIGxldCBuMjogVmVjdG9yMyA9IFZlY3RvcjMuQ1JPU1MoZGlmZnNbMF0sIGRpZmZzWzJdKTtcclxuXHJcbiAgICAgIGxldCBkb3QxOiBudW1iZXIgPSBWZWN0b3IzLkRPVChuMCwgbjEpO1xyXG4gICAgICBsZXQgZG90MjogbnVtYmVyID0gVmVjdG9yMy5ET1QobjAsIG4yKTtcclxuXHJcbiAgICAgIHJldHVybiAhKGRvdDEgPCAwIHx8IGRvdDIgPCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZU5vcm1hbHMoKTogdm9pZCB7XHJcbiAgICAgIGxldCB0cmlnb246IFZlY3RvcjNbXSA9IHRoaXMuaW5kaWNlcy5tYXAoKF9pbmRleDogbnVtYmVyKSA9PiB0aGlzLnZlcnRpY2VzLnBvc2l0aW9uKF9pbmRleCkpO1xyXG4gICAgICBsZXQgdjE6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzFdLCB0cmlnb25bMF0pO1xyXG4gICAgICBsZXQgdjI6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMF0pO1xyXG4gICAgICB0aGlzLm5vcm1hbFVuc2NhbGVkID0gVmVjdG9yMy5DUk9TUyh2MSwgdjIpO1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLm5vcm1hbFVuc2NhbGVkKTtcclxuICAgICAgdGhpcy5hbmdsZXMucHVzaChcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKHYxLCB2MiksXHJcbiAgICAgICAgVmVjdG9yMy5BTkdMRShWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMV0pLCBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzBdLCB0cmlnb25bMV0pKSxcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMF0sIHRyaWdvblsyXSksIFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMV0sIHRyaWdvblsyXSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBzaW1wbGUgY3ViZSB3aXRoIGVkZ2VzIG9mIGxlbmd0aCAxLCBlYWNoIGZhY2UgY29uc2lzdGluZyBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAoMTIpIDRfX19fNyAgKDExKVxyXG4gICAqICAgICAgICg4KSAwL19fMy98ICgxMClcclxuICAgKiAgICAgICAoMTUpIHx8NV98fDYgKDE0KVxyXG4gICAqICAgICAgICg5KSAxfC9fMnwvICgxMylcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoQ3ViZSBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoQ3ViZSk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hDdWJlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG5cclxuICAgICAgLy8gbm8gc2hhcmVkIHZlcnRpY2VzLCBjb3JuZXJzIG5lZWQgdGhyZWUgbm9ybWFscyBmb3IgUGhvbmcgYW5kIEdvdXJhdWRcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcyhcclxuICAgICAgICAvLyBmcm9udCB2ZXJ0aWNlc1xyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC41LCAwLjUpLCBuZXcgVmVjdG9yMigwLCAwKSksIC8vIDBcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIC0wLjUsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDEpKSwgLy8gMVxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAtMC41LCAwLjUpLCBuZXcgVmVjdG9yMigxLCAxKSksIC8vIDJcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpLCBuZXcgVmVjdG9yMigxLCAwKSkgLy8zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBvbiBzaWRlc1xyXG4gICAgICBmb3IgKGxldCBhbmdsZTogbnVtYmVyID0gOTA7IGFuZ2xlIDwgMzYwOyBhbmdsZSArPSA5MCkge1xyXG4gICAgICAgIGxldCB0cmFuc2Zvcm06IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihWZWN0b3IzLlkoYW5nbGUpKTtcclxuICAgICAgICBsZXQgc2lkZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLnNsaWNlKDAsIDQpLm1hcCgoX3Y6IFZlcnRleCkgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgdHJhbnNmb3JtKSwgX3YudXYpKTtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2goLi4uc2lkZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMgZm9yIHRvcCBhbmQgYm90dG9tXHJcbiAgICAgIGZvciAobGV0IGFuZ2xlOiBudW1iZXIgPSA5MDsgYW5nbGUgPCAzNjA7IGFuZ2xlICs9IDE4MCkge1xyXG4gICAgICAgIGxldCB0cmFuc2Zvcm06IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihWZWN0b3IzLlgoYW5nbGUpKTtcclxuICAgICAgICBsZXQgc2lkZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLnNsaWNlKDAsIDQpLm1hcCgoX3Y6IFZlcnRleCkgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgdHJhbnNmb3JtKSwgX3YudXYpKTtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2goLi4uc2lkZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDI0OyBpICs9IDQpXHJcbiAgICAgICAgLy8gZ2VuZXJhdGUgZmFjZXNcclxuICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ubmV3IFF1YWQodGhpcy52ZXJ0aWNlcywgaSArIDAsIGkgKyAxLCBpICsgMiwgaSArIDMpLmZhY2VzKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIGZsYXQgcG9seWdvbi4gQWxsIHRyaWdvbnMgc2hhcmUgdmVydGV4IDAsIHNvIGNhcmVmdWwgZGVzaWduIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBjb25jYXZlIHBvbHlnb25zLiBcclxuICAgKiBWZXJ0ZXggMCBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFjZSBub3JtYWwuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICAgIDAgXHJcbiAgICogICAgICAgICAgIDHilbF84pWyICA0IC4uLlxyXG4gICAqICAgICAgICAgICAg4pWyfF/ilbLilbEgXHJcbiAgICogICAgICAgICAgICAyICAgM1xyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFBvbHlnb24gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFBvbHlnb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBzaGFwZURlZmF1bHQ6IFZlY3RvcjJbXSA9IFsgLy8gdHJpZ29uIGlzIHRoZSBtaW5pbWFsIHNoYXBlXHJcbiAgICAgIG5ldyBWZWN0b3IyKC0xLCAtMSksXHJcbiAgICAgIG5ldyBWZWN0b3IyKDEsIC0xKSxcclxuICAgICAgbmV3IFZlY3RvcjIoMCwgMSlcclxuICAgIF07XHJcbiAgICBwcm90ZWN0ZWQgc2hhcGU6IE11dGFibGVBcnJheTxWZWN0b3IyPiA9IG5ldyBNdXRhYmxlQXJyYXk8VmVjdG9yMj4oVmVjdG9yMik7XHJcbiAgICBwcm90ZWN0ZWQgZml0VGV4dHVyZTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFBvbHlnb25cIiwgX3NoYXBlOiBWZWN0b3IyW10gPSBNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9zaGFwZSwgX2ZpdFRleHR1cmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXQgbWluVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgdGhpcyBtZXNoIGZyb20gdGhlIGdpdmVuIHZlcnRpY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9zaGFwZTogVmVjdG9yMltdID0gW10sIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNoYXBlID0gPE11dGFibGVBcnJheTxWZWN0b3IyPj5NdXRhYmxlQXJyYXkuZnJvbShfc2hhcGUubWFwKF92ZXJ0ZXggPT4gX3ZlcnRleC5jbG9uZSkpO1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuZml0VGV4dHVyZSA9IF9maXRUZXh0dXJlO1xyXG5cclxuICAgICAgaWYgKF9zaGFwZS5sZW5ndGggPCB0aGlzLm1pblZlcnRpY2VzKSB7XHJcbiAgICAgICAgRGVidWcud2FybihgQXQgbGVhc3QgJHt0aGlzLm1pblZlcnRpY2VzfSB2ZXJ0aWNlcyBuZWVkZWQgdG8gY29uc3RydWN0IE1lc2hQb2x5Z29uLCBkZWZhdWx0IHRyaWdvbiB1c2VkYCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGUoTWVzaFBvbHlnb24uc2hhcGVEZWZhdWx0LCB0cnVlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gX3NoYXBlO1xyXG5cclxuICAgICAgbGV0IG1pbjogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgICBsZXQgbWF4OiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgICAgZm9yIChsZXQgdmVydGV4IG9mIHNoYXBlKSB7XHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgodmVydGV4LnRvVmVjdG9yMygpKSk7XHJcblxyXG4gICAgICAgIG1pbi54ID0gTWF0aC5taW4obWluLngsIHZlcnRleC54KTtcclxuICAgICAgICBtYXgueCA9IE1hdGgubWF4KG1heC54LCB2ZXJ0ZXgueCk7XHJcbiAgICAgICAgbWluLnkgPSBNYXRoLm1pbihtaW4ueSwgdmVydGV4LnkpO1xyXG4gICAgICAgIG1heC55ID0gTWF0aC5tYXgobWF4LnksIHZlcnRleC55KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKG1heC54IC0gbWluLngsIG1heC55IC0gbWluLnkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZml0VGV4dHVyZSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRleHR1cmVVVjogVmVjdG9yMiA9IFZlY3RvcjIuRElGRkVSRU5DRShzaGFwZVtpXSwgbWluKTtcclxuICAgICAgICAgIHRoaXMudmVydGljZXNbaV0udXYgPSBuZXcgVmVjdG9yMih0ZXh0dXJlVVYueCAvIHNpemUueCwgMSAtIHRleHR1cmVVVi55IC8gc2l6ZS55KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX3NoYXBlLmZvckVhY2goKF92ZXJ0ZXgsIF9pKSA9PiB0aGlzLnZlcnRpY2VzW19pXS51diA9IG5ldyBWZWN0b3IyKF92ZXJ0ZXgueCwgLV92ZXJ0ZXgueSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmZhY2VzID0gW107XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCBpIC0gMSwgaSwgMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zaGFwZSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoVmVjdG9yMiwgdGhpcy5zaGFwZSk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uZml0VGV4dHVyZSA9IHRoaXMuZml0VGV4dHVyZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCB2ZWN0b3JzOiBWZWN0b3IyW10gPSA8VmVjdG9yMltdPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbi5zaGFwZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHZlY3RvcnMsIF9zZXJpYWxpemF0aW9uLmZpdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnNoYXBlLCB0aGlzLmZpdFRleHR1cmUpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiTWVzaFBvbHlnb24udHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBleHRydXNpb24gb2YgYSBwb2x5Z29uIGJ5IGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uc1xyXG4gICAqIGBgYHRleHQgIFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgIF9fX19cclxuICAgKiBQb2x5Z29uICAgICAgICAgX19fX+KVseKVsiAgIOKVsiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAqIFRyYW5zZm9ybSAwICDihpIg4pWxIOKVsl9f4pWyX+KVsl9fX+KVsiDihpAgVHJhbnNmb3JtIDIgICAgICAgICAgeiBfX+KUglxyXG4gICAqIChiYXNlKSAgICAgICAgIOKVsl/ilbFfX+KVsSDilbEgICDilbEgICAobGlkKSAgICAgICAgICAgICAgICAgICAgIOKVsiAgICAgICBcclxuICAgKiAgICAgVHJhbnNmb3JtIDEgIOKGkiAg4pWy4pWxX19f4pWxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hFeHRydXNpb24gZXh0ZW5kcyBNZXNoUG9seWdvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hFeHRydXNpb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBtdHhEZWZhdWx0czogTWF0cml4NHg0W10gPSBbIC8vIG9mZnNldCBvZiArMC41eiBhbmQgLTAuNXogYXMgZGVmYXVsdFxyXG4gICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oVmVjdG9yMy5aKDAuNSkpLFxyXG4gICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oVmVjdG9yMy5aKC0wLjUpKVxyXG4gICAgXTtcclxuICAgIHByaXZhdGUgbXR4VHJhbnNmb3JtczogTXV0YWJsZUFycmF5PE1hdHJpeDR4ND4gPSBuZXcgTXV0YWJsZUFycmF5KE1hdHJpeDR4NCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hFeHRydXNpb25cIiwgX3ZlcnRpY2VzOiBWZWN0b3IyW10gPSBNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIF9tdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXSA9IE1lc2hFeHRydXNpb24ubXR4RGVmYXVsdHMsIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICBzdXBlcihfbmFtZSwgX3ZlcnRpY2VzLCBfZml0VGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZShfbXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiTXV0YXRvclwiLCB0aGlzLmdldE11dGF0b3IoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMgPSBTZXJpYWxpemVyLnNlcmlhbGl6ZUFycmF5KE1hdHJpeDR4NCwgdGhpcy5tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBsZXQgbXR4VHJhbnNmb3JtczogTWF0cml4NHg0W107XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi50cmFuc2Zvcm1zKVxyXG4gICAgICAgIG10eFRyYW5zZm9ybXMgPSA8TWF0cml4NHg0W10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMpO1xyXG4gICAgICB0aGlzLmV4dHJ1ZGUobXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZSh0aGlzLm10eFRyYW5zZm9ybXMpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBleHRydWRlKF9tdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXSA9IE1lc2hFeHRydXNpb24ubXR4RGVmYXVsdHMpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tdHhUcmFuc2Zvcm1zID0gPE11dGFibGVBcnJheTxNYXRyaXg0eDQ+Pk11dGFibGVBcnJheS5mcm9tKDxNdXRhYmxlQXJyYXk8TWF0cml4NHg0Pj5fbXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIGxldCBuVHJhbnNmb3JtczogbnVtYmVyID0gX210eFRyYW5zZm9ybXMubGVuZ3RoO1xyXG4gICAgICBsZXQgblZlcnRpY2VzU2hhcGU6IG51bWJlciA9IHRoaXMudmVydGljZXMubGVuZ3RoO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIG5ldyB2ZXJ0ZXggY2xvdWQsIGN1cnJlbnQgY2xvdWQgaG9sZHMgTWVzaFBvbHlnb25cclxuICAgICAgbGV0IHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGJhc2UgYnkgdHJhbnNmb3JtYXRpb24gb2YgcG9seWdvbiB3aXRoIGZpcnN0IHRyYW5zZm9ybVxyXG4gICAgICBsZXQgYmFzZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCkgPT4gbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCBfbXR4VHJhbnNmb3Jtc1swXSwgdHJ1ZSksIF92LnV2KSk7XHJcbiAgICAgIHZlcnRpY2VzLnB1c2goLi4uYmFzZSk7XHJcbiAgICAgIC8vIGNyZWF0ZSBsaWQgYnkgdHJhbnNmb3JtYXRpb24gb2YgcG9seWdvbiB3aXRoIGxhc3QgdHJhbnNmb3JtXHJcbiAgICAgIGxldCBsaWQ6IFZlcnRleFtdID0gdGhpcy52ZXJ0aWNlcy5tYXAoKF92OiBWZXJ0ZXgpID0+IG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgX210eFRyYW5zZm9ybXNbblRyYW5zZm9ybXMgLSAxXSwgdHJ1ZSksIF92LnV2KSk7XHJcbiAgICAgIHZlcnRpY2VzLnB1c2goLi4ubGlkKTtcclxuXHJcbiAgICAgIC8vIHJlY3JlYXRlIGJhc2UgZmFjZXMgdG8gcmVjYWxjdWxhdGUgbm9ybWFsc1xyXG4gICAgICB0aGlzLmZhY2VzID0gdGhpcy5mYWNlcy5tYXAoKF9mYWNlOiBGYWNlKSA9PiBuZXcgRmFjZSh2ZXJ0aWNlcywgX2ZhY2UuaW5kaWNlc1swXSwgX2ZhY2UuaW5kaWNlc1sxXSwgX2ZhY2UuaW5kaWNlc1syXSkpO1xyXG4gICAgICAvLyBjcmVhdGUgdGhlIGxpZCBmYWNlcyB1c2luZyB0aGUgaW5kaWNlcyBvZiB0aGUgYmFzZSBmYWNlcywgYnV0IHdpdGggYW4gaW5kZXggb2Zmc2V0IGFuZCByZXZlcnNlIG9yZGVyIG9mIGluZGljZXNcclxuICAgICAgdGhpcy5mYWNlcy5wdXNoKC4uLnRoaXMuZmFjZXMubWFwKF9mYWNlID0+XHJcbiAgICAgICAgbmV3IEZhY2UodmVydGljZXMsIF9mYWNlLmluZGljZXNbMl0gKyBuVmVydGljZXNTaGFwZSwgX2ZhY2UuaW5kaWNlc1sxXSArIG5WZXJ0aWNlc1NoYXBlLCBfZmFjZS5pbmRpY2VzWzBdICsgblZlcnRpY2VzU2hhcGUpXHJcbiAgICAgICkpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdDogbnVtYmVyID0gMDsgdCA8IG5UcmFuc2Zvcm1zOyB0KyspIHtcclxuICAgICAgICBsZXQgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBfbXR4VHJhbnNmb3Jtc1t0XTtcclxuICAgICAgICBsZXQgcmVmZXJUb0Nsb3NlOiBudW1iZXIgPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHdyYXA6IFZlcnRleFtdID0gdGhpcy52ZXJ0aWNlcy5tYXAoKF92OiBWZXJ0ZXgsIF9pOiBudW1iZXIpID0+XHJcbiAgICAgICAgICBuZXcgVmVydGV4KFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3YucG9zaXRpb24sIG10eFRyYW5zZm9ybSwgdHJ1ZSksIG5ldyBWZWN0b3IyKF9pIC8gblZlcnRpY2VzU2hhcGUsIHQgLyBuVHJhbnNmb3JtcykpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB2ZXJ0aWNlcy5wdXNoKC4uLndyYXApO1xyXG4gICAgICAgIHZlcnRpY2VzLnB1c2gobmV3IFZlcnRleChyZWZlclRvQ2xvc2UsIG5ldyBWZWN0b3IyKDEsIHQgLyBuVHJhbnNmb3JtcykpKTtcclxuICAgICAgICAvLyBpZiAoaSA+IDAgJiYgaSA8IG5UcmFuc2Zvcm1zIC0gMSlcclxuICAgICAgICAvLyAgIHZlcnRpY2VzLnB1c2goLi4ud3JhcC5tYXAoKF92ZWN0b3I6IFZlY3RvcjMpID0+IF92ZWN0b3IuY2xvbmUpKTsgPC0gbm8gc2xpY2luZyBmb3IgZmxhdCBzaGFkaW5nIHlldC4uLlxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjcmVhdGUgaW5kaXplcyBmb3Igd3JhcHBlclxyXG4gICAgICBmb3IgKGxldCB0OiBudW1iZXIgPSAwOyB0IDwgblRyYW5zZm9ybXMgLSAxOyB0KyspXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WZXJ0aWNlc1NoYXBlOyBpKyspIHtcclxuICAgICAgICAgIGxldCBpbmRleDogbnVtYmVyID1cclxuICAgICAgICAgICAgKyAyICogblZlcnRpY2VzU2hhcGUgLy8gYmFzZSAmIGxpZCBhcmUgb2Zmc2V0cyBcclxuICAgICAgICAgICAgKyB0ICogKG5WZXJ0aWNlc1NoYXBlICsgMSkgLy8gb2Zmc2V0IGZvciBlYWNoIHRyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgICAgICsgaTtcclxuICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQodmVydGljZXMsIGluZGV4LCBpbmRleCArIG5WZXJ0aWNlc1NoYXBlICsgMSwgaW5kZXggKyBuVmVydGljZXNTaGFwZSArIDIsIGluZGV4ICsgMSwgUVVBRFNQTElULkFUXzApO1xyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKC4uLnF1YWQuZmFjZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlcztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBwcml2YXRlIGNhbGN1bGF0ZVBvbHlnb25MZW5ndGhzKCk6IG51bWJlcltdIHtcclxuICAgIC8vICAgbGV0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuICAgIC8vICAgbGV0IGZpcnN0OiBWZWN0b3IzO1xyXG4gICAgLy8gICBsZXQgcHJldjogVmVjdG9yMztcclxuICAgIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgIC8vICAgICBsZXQgY3VycmVudDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKHRoaXMudmVydGljZXNbaV0sIHRoaXMudmVydGljZXNbaSArIDFdLCB0aGlzLnZlcnRpY2VzW2kgKyAyXSk7XHJcbiAgICAvLyAgICAgaWYgKHByZXYpXHJcbiAgICAvLyAgICAgICByZXN1bHQucHVzaChWZWN0b3IzLkRJRkZFUkVOQ0UoY3VycmVudCwgcHJldikubWFnbml0dWRlKTtcclxuICAgIC8vICAgICBlbHNlXHJcbiAgICAvLyAgICAgICBmaXJzdCA9IGN1cnJlbnQ7XHJcbiAgICAvLyAgICAgcHJldiA9IGN1cnJlbnQ7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgcmVzdWx0LnB1c2goVmVjdG9yMy5ESUZGRVJFTkNFKGZpcnN0LCBwcmV2KS5tYWduaXR1ZGUpO1xyXG4gICAgLy8gICByZXR1cm4gcmVzdWx0O1xyXG4gICAgLy8gfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIG1lc2ggbG9hZGVkIGZyb20gYW4gRkJYLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaEZCWCBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChNZXNoKSB7XHJcbiAgICAvLyBwdWJsaWMgdXJsOiBSZXF1ZXN0SW5mbztcclxuICAgIHB1YmxpYyBpTWVzaDogbnVtYmVyO1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX2lNZXNoOiBudW1iZXIgPSB0aGlzLmlNZXNoKTogUHJvbWlzZTxNZXNoRkJYPiB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLmlNZXNoID0gX2lNZXNoO1xyXG4gICAgICBjb25zdCBsb2FkZXI6IEZCWExvYWRlciA9IGF3YWl0IEZCWExvYWRlci5MT0FEKHRoaXMudXJsLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjb25zdCBnZW9tZXRyeUZCWDogRkJYLkdlb21ldHJ5ID0gKFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5nZW9tZXRyaWVzW19pTWVzaF0gfHxcclxuICAgICAgICBsb2FkZXIuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5maW5kKF9vYmplY3QgPT4gX29iamVjdC5uYW1lID09IHRoaXMubmFtZSkgfHxcclxuICAgICAgICBsb2FkZXIuZmJ4Lm9iamVjdHMubW9kZWxzLmZpbmQoX29iamVjdCA9PiBfb2JqZWN0Lm5hbWUgPT0gdGhpcy5uYW1lICYmIF9vYmplY3Quc3VidHlwZSA9PSBcIk1lc2hcIikuY2hpbGRyZW5bMF1cclxuICAgICAgKS5sb2FkKCk7XHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWClcclxuICAgICAgICB0aGlzLm5hbWUgPSBnZW9tZXRyeUZCWC5uYW1lLmxlbmd0aCA+IDAgPyBnZW9tZXRyeUZCWC5uYW1lIDogZ2VvbWV0cnlGQlgucGFyZW50c1swXS5uYW1lO1xyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGxldCB2ZXJ0ZXhCdWZmZXI6IEZsb2F0MzJBcnJheSA9IGdlb21ldHJ5RkJYLlZlcnRpY2VzO1xyXG4gICAgICBmb3IgKGxldCBpVmVydGV4OiBudW1iZXIgPSAwOyBpVmVydGV4IDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaVZlcnRleCArPSAzKSB7XHJcbiAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjModmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAwXSwgdmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAxXSwgdmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAyXSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgdXZzOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgaWYgKGdlb21ldHJ5RkJYLkxheWVyRWxlbWVudFVWKSB7XHJcbiAgICAgICAgbGV0IHV2QnVmZmVyOiBGbG9hdDMyQXJyYXkgPSBnZW9tZXRyeUZCWC5MYXllckVsZW1lbnRVVi5VVjtcclxuICAgICAgICBmb3IgKGxldCBpdXY6IG51bWJlciA9IDA7IGl1diA8IHV2QnVmZmVyLmxlbmd0aDsgaXV2ICs9IDIpIHtcclxuICAgICAgICAgIHV2cy5wdXNoKG5ldyBWZWN0b3IyKHV2QnVmZmVyW2l1dl0sIDEgLSB1dkJ1ZmZlcltpdXYgKyAxXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG5vcm1hbHM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBpZiAoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsKSB7XHJcbiAgICAgICAgbGV0IG5vcm1hbEJ1ZmZlcjogRmxvYXQzMkFycmF5ID0gZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLk5vcm1hbHM7XHJcbiAgICAgICAgZm9yIChsZXQgaU5vcm1hbDogbnVtYmVyID0gMDsgaU5vcm1hbCA8IG5vcm1hbEJ1ZmZlci5sZW5ndGg7IGlOb3JtYWwgKz0gMykge1xyXG4gICAgICAgICAgbm9ybWFscy5wdXNoKG5ldyBWZWN0b3IzKG5vcm1hbEJ1ZmZlcltpTm9ybWFsXSwgbm9ybWFsQnVmZmVyW2lOb3JtYWwgKyAxXSwgbm9ybWFsQnVmZmVyW2lOb3JtYWwgKyAyXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG1hcFZlcnRleFRvSW5kZXg6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcbiAgICAgIGxldCBuZXdWZXJ0ZXhJbmRpY2VzOiBudW1iZXJbXVtdID0gW107XHJcbiAgICAgIGxldCBpUG9seWdvbjogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGlzRW5kT2ZQb2x5Z29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBwb2x5Z29uOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgZ2VvbWV0cnlGQlguUG9seWdvblZlcnRleEluZGV4LmZvckVhY2goKF9pVmVydGV4LCBfaVBvbHlnb25WZXJ0ZXgpID0+IHtcclxuICAgICAgICBpZiAoX2lWZXJ0ZXggPCAwKSB7XHJcbiAgICAgICAgICBfaVZlcnRleCA9IF9pVmVydGV4IF4gLSAxO1xyXG4gICAgICAgICAgaXNFbmRPZlBvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gcG9zaXRpb25zW19pVmVydGV4XTtcclxuICAgICAgICBsZXQgdXY6IFZlY3RvcjIgPSB1dnNbdGhpcy5nZXREYXRhSW5kZXgoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50VVYsIF9pVmVydGV4LCBpUG9seWdvbiwgX2lQb2x5Z29uVmVydGV4KV07XHJcblxyXG4gICAgICAgIGxldCB2ZXJ0ZXhLZXk6IHN0cmluZyA9IHBvc2l0aW9uLnRvU3RyaW5nKCkgKyB1di50b1N0cmluZygpO1xyXG4gICAgICAgIGlmICghbWFwVmVydGV4VG9JbmRleC5oYXModmVydGV4S2V5KSkge1xyXG4gICAgICAgICAgbGV0IG5vcm1hbDogVmVjdG9yMyA9IG5vcm1hbHNbdGhpcy5nZXREYXRhSW5kZXgoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLCBfaVZlcnRleCwgaVBvbHlnb24sIF9pUG9seWdvblZlcnRleCldO1xyXG5cclxuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChuZXcgVmVydGV4KHBvc2l0aW9uLCB1diwgbm9ybWFsKSk7XHJcbiAgICAgICAgICBtYXBWZXJ0ZXhUb0luZGV4LnNldCh2ZXJ0ZXhLZXksIHRoaXMudmVydGljZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICBpZiAoIW5ld1ZlcnRleEluZGljZXNbX2lWZXJ0ZXhdKVxyXG4gICAgICAgICAgICBuZXdWZXJ0ZXhJbmRpY2VzW19pVmVydGV4XSA9IFtdO1xyXG4gICAgICAgICAgbmV3VmVydGV4SW5kaWNlc1tfaVZlcnRleF0ucHVzaCh0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwb2x5Z29uLnB1c2gobWFwVmVydGV4VG9JbmRleC5nZXQodmVydGV4S2V5KSk7XHJcblxyXG4gICAgICAgIGlmIChpc0VuZE9mUG9seWdvbikge1xyXG4gICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID09IDMpIHtcclxuICAgICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKHRoaXMudmVydGljZXMsIHBvbHlnb25bMF0sIHBvbHlnb25bMV0sIHBvbHlnb25bMl0pKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocG9seWdvbi5sZW5ndGggPT0gNCkge1xyXG4gICAgICAgICAgICBsZXQgcXVhZDogUXVhZCA9IG5ldyBRdWFkKHRoaXMudmVydGljZXMsIHBvbHlnb25bMF0sIHBvbHlnb25bMV0sIHBvbHlnb25bMl0sIHBvbHlnb25bM10pO1xyXG4gICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvbltpIC0gMV0sIHBvbHlnb25baSAtIDBdKSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgJHtNZXNoTG9hZGVyRkJYLm5hbWV9OiBQb2x5Z29ucyB3aXRoIG1vcmUgdGhhbiA0IHZlcnRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9seWdvbiA9IFtdO1xyXG4gICAgICAgICAgaXNFbmRPZlBvbHlnb24gPSBmYWxzZTtcclxuICAgICAgICAgIGlQb2x5Z29uKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWC5jaGlsZHJlbj8uWzBdLnR5cGUgPT0gXCJEZWZvcm1lclwiKSB7XHJcbiAgICAgICAgY29uc3QgZmJ4RGVmb3JtZXI6IEZCWC5EZWZvcm1lciA9IGdlb21ldHJ5RkJYLmNoaWxkcmVuWzBdO1xyXG4gICAgICAgIGNvbnN0IHNrZWxldG9uOiBDb21wb25lbnRTa2VsZXRvbiA9IGF3YWl0IGxvYWRlci5nZXRTa2VsZXRvbihmYnhEZWZvcm1lci5jaGlsZHJlblswXS5jaGlsZHJlblswXSk7IC8vIERlZm9ybWVyLlN1YkRlZm9ybWVyLkxpbWJOb2RlXHJcbiAgICAgICAgdGhpcy5jcmVhdGVCb25lcyhmYnhEZWZvcm1lciwgc2tlbGV0b24sIHRoaXMudmVydGljZXMsIG5ld1ZlcnRleEluZGljZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pTWVzaCA9IHRoaXMuaU1lc2g7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuaU1lc2ggPSBfc2VyaWFsaXphdGlvbi5pTWVzaDtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldERhdGFJbmRleChfbGF5ZXJFbGVtZW50OiBGQlguTGF5ZXJFbGVtZW50VVYgfCBGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLCBfaVZlcnRleDogbnVtYmVyLCBfaVBvbHlnb246IG51bWJlciwgX2lQb2x5Z29uVmVydGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9XHJcbiAgICAgICAgX2xheWVyRWxlbWVudC5NYXBwaW5nSW5mb3JtYXRpb25UeXBlID09IFwiQnlWZXJ0ZXhcIiA/XHJcbiAgICAgICAgICBfaVZlcnRleCA6XHJcbiAgICAgICAgICBfbGF5ZXJFbGVtZW50Lk1hcHBpbmdJbmZvcm1hdGlvblR5cGUgPT0gXCJCeVBvbHlnb25cIiA/XHJcbiAgICAgICAgICAgIF9pUG9seWdvbiA6XHJcbiAgICAgICAgICAgIF9pUG9seWdvblZlcnRleDtcclxuXHJcbiAgICAgIGlmIChfbGF5ZXJFbGVtZW50LlJlZmVyZW5jZUluZm9ybWF0aW9uVHlwZSA9PT0gJ0luZGV4VG9EaXJlY3QnKSB7XHJcbiAgICAgICAgbGV0IGluZGljZXM6IFVpbnQxNkFycmF5ID0gKF9sYXllckVsZW1lbnQgYXMgRkJYLkxheWVyRWxlbWVudFVWKS5VVkluZGV4IHx8IChfbGF5ZXJFbGVtZW50IGFzIEZCWC5MYXllckVsZW1lbnROb3JtYWwpLk5vcm1hbHNJbmRleDtcclxuICAgICAgICBpbmRleCA9IGluZGljZXNbaW5kZXhdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVCb25lcyhfZGVmb3JtZXJGQlg6IEZCWC5EZWZvcm1lciwgX3NrZWxldG9uOiBDb21wb25lbnRTa2VsZXRvbiwgX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX25ld1ZlcnRleEluZGljZXM/OiBudW1iZXJbXVtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAoY29uc3QgZmJ4U3ViRGVmb3JtZXIgb2YgX2RlZm9ybWVyRkJYLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgZmJ4U3ViRGVmb3JtZXIubG9hZCgpO1xyXG4gICAgICAgIGlmIChmYnhTdWJEZWZvcm1lci5JbmRleGVzKVxyXG4gICAgICAgICAgZm9yIChsZXQgaUJvbmVJbmZsdWVuY2U6IG51bWJlciA9IDA7IGlCb25lSW5mbHVlbmNlIDwgZmJ4U3ViRGVmb3JtZXIuSW5kZXhlcy5sZW5ndGg7IGlCb25lSW5mbHVlbmNlKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaVZlcnRleDogbnVtYmVyID0gZmJ4U3ViRGVmb3JtZXIuSW5kZXhlc1tpQm9uZUluZmx1ZW5jZV07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaVZlcnRleE5ldyBvZiBfbmV3VmVydGV4SW5kaWNlcyA/IF9uZXdWZXJ0ZXhJbmRpY2VzW2lWZXJ0ZXhdIDogW2lWZXJ0ZXhdKSB7XHJcbiAgICAgICAgICAgICAgKF92ZXJ0aWNlc1tpVmVydGV4TmV3XS5ib25lcyB8fCAoX3ZlcnRpY2VzW2lWZXJ0ZXhOZXddLmJvbmVzID0gW10pKS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGluZGV4OiBfc2tlbGV0b24uaW5kZXhPZihmYnhTdWJEZWZvcm1lci5jaGlsZHJlblswXS5uYW1lKSxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogZmJ4U3ViRGVmb3JtZXIuV2VpZ2h0c1tpQm9uZUluZmx1ZW5jZV0gfHwgMVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKiogQWxsb3dzIHRvIGNyZWF0ZSBjdXN0b20gbWVzaGVzIGZyb20gZ2l2ZW4gRGF0YSAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoRnJvbURhdGEgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHByb3RlY3RlZCB2ZXJ0aWNlc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBwcm90ZWN0ZWQgdGV4dHVyZVVWc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBwcm90ZWN0ZWQgaW5kaWNlc1RvU2V0OiBVaW50MTZBcnJheTtcclxuICAgIHByb3RlY3RlZCBmYWNlTm9ybWFsc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF92ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBfdGV4dHVyZVVWczogRmxvYXQzMkFycmF5LCBfaW5kaWNlczogVWludDE2QXJyYXksIF9mYWNlTm9ybWFsczogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMudmVydGljZXNUb1NldCA9IF92ZXJ0aWNlcztcclxuICAgICAgdGhpcy50ZXh0dXJlVVZzVG9TZXQgPSBfdGV4dHVyZVVWcztcclxuICAgICAgdGhpcy5pbmRpY2VzVG9TZXQgPSBfaW5kaWNlcztcclxuICAgICAgdGhpcy5mYWNlTm9ybWFsc1RvU2V0ID0gX2ZhY2VOb3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVUZXh0dXJlVVZzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRleHR1cmVVVnNUb1NldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSW5kaWNlcygpOiBVaW50MTZBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZGljZXNUb1NldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlRmxhdE5vcm1hbHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmFjZU5vcm1hbHNUb1NldDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1lc2h9IGxvYWRlZCBmcm9tIGEgZ2xURi1GaWxlLlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoR0xURiBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChNZXNoKSB7XHJcbiAgICBwdWJsaWMgaVByaW1pdGl2ZTogbnVtYmVyOyAvLyBtb3N0IGxpa2VseSB3aWxsIG5vdCBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUgZ2xURiBmaWxlLi4uXHJcblxyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSwgX2lQcmltaXRpdmU6IG51bWJlciA9IHRoaXMuaVByaW1pdGl2ZSk6IFByb21pc2U8TWVzaEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5pUHJpbWl0aXZlID0gX2lQcmltaXRpdmU7XHJcbiAgICAgIHJldHVybiBHTFRGTG9hZGVyLmxvYWRSZXNvdXJjZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBjb25zdCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaVByaW1pdGl2ZSA9IHRoaXMuaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5pUHJpbWl0aXZlID0gX3NlcmlhbGl6YXRpb24uaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIG1lc2ggbG9hZGVkIGZyb20gYW4gT0JKLWZpbGUuXHJcbiAgICogU2ltcGxlIFdhdmVmcm9udCBPQkogaW1wb3J0LiBUYWtlcyBhIHdhdmVmcm9udCBvYmogc3RyaW5nLiBUbyBMb2FkIGZyb20gYSBmaWxlIHVybCwgdXNlIHRoZVxyXG4gICAqIHN0YXRpYyBMT0FEIE1ldGhvZC4gQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCB0cmlhbmd1bGF0ZWQgTWVzaGVzXHJcbiAgICogKGFjdGl2YXRlICdHZW9tZW50cnkg4oaSIFRyaWFuZ3VsYXRlIEZhY2VzJyBpbiBCbGVuZGVycyBvYmogZXhwb3J0ZXIpXHJcbiAgICogQHRvZG8gTG9hZCBNYXRlcmlhbHMsIFN1cHBvcnQgUXVhZHNcclxuICAgKiBAYXV0aG9ycyBTaW1vbiBTdG9ybC1TY2h1bGtlIDIwMjEgfCBMdWlzIEtlY2ssIEhGVSwgMjAyMSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjIgfCBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoT0JKIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsKTogUHJvbWlzZTxNZXNoT0JKPiB7XHJcbiAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gbmV3IFVSTChfdXJsLnRvU3RyaW5nKCksIFByb2plY3QuYmFzZVVSTCkudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgZGF0YTogc3RyaW5nID0gYXdhaXQgKGF3YWl0IGZldGNoKHVybCkpLnRleHQoKTtcclxuICAgICAgdGhpcy5uYW1lID0gdXJsLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG5cclxuICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gZGF0YS5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGNvbnN0IHV2czogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGNvbnN0IG5vcm1hbHM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBjb25zdCBub3JtczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAgIGNvbnN0IHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBjb25zdCBmYWNlczogRmFjZVtdID0gW107XHJcbiAgICAgIGNvbnN0IG1hcFBvc2l0aW9uVVZOb3JtYWxUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgIGNvbnN0IG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgY3JlYXRpbmcgdGhlIG5lZWRlZCBidWZmZXJzIGZvciByZW5kZXJtZXNoIGhlcmUgYWxyZWFkeS4uLlxyXG4gICAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gbGluZS50cmltKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIHN3aXRjaCAocGFydHMuc2hpZnQoKSkge1xyXG4gICAgICAgICAgY2FzZSBcInZcIjogLy9WZXJ0ZXggLSBleGFtcGxlOiB2IDAuNzAgLTAuNDUgLTAuNTIgICAgICAgICBcclxuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjMoLi4ucGFydHMubWFwKF92YWx1ZSA9PiArX3ZhbHVlKSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJ2blwiOiAvL05vcm1hbCAtIGV4YW1wbGU6IHZuIDAuMDAgMC4wMCAxLjAwXHJcbiAgICAgICAgICAgIG5vcm1hbHMucHVzaChuZXcgVmVjdG9yMyguLi5wYXJ0cy5tYXAoX3ZhbHVlID0+ICtfdmFsdWUpKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInZ0XCI6IC8vVGV4Y29vcmQgLSBleGFtcGxlOiB2dCAwLjU0NTQ1NCAwLjQ3MjM4MlxyXG4gICAgICAgICAgICB1dnMucHVzaChuZXcgVmVjdG9yMiguLi5wYXJ0cy5tYXAoKF92YWx1ZSwgX2luZGV4KSA9PiArX3ZhbHVlICogKF9pbmRleCA9PSAxID8gLTEgOiAxKSkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZlwiOiAvKkZhY2UgSW5kaWNlcyAtIGV4YW1wbGU6IGYgMS8xLzEgMi8yLzEgMy8zLzEgLS0+IHZlcnRleDEvdGV4Y29vcmQxL25vcm1hbDEgdmVydGV4Mi90ZXhjb29yZDIvbm9ybWFsMiB2ZXJ0ZXgzL3RleGNvb3JkMy9ub3JtYWwzKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDM7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBrZXk6IHN0cmluZyA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICAgIGxldCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXhba2V5XTtcclxuICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhJbmZvOiBzdHJpbmdbXSA9IHBhcnRzW2ldLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IHBvc2l0aW9uc1srdmVydGV4SW5mb1swXSAtIDFdOyAvLyBvYmogdXNlcyAxLWJhc2VkIGluZGljZXNcclxuICAgICAgICAgICAgICAgIGxldCB1djogVmVjdG9yMiA9IHV2c1srdmVydGV4SW5mb1sxXSAtIDFdID8/IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSBub3JtYWxzWyt2ZXJ0ZXhJbmZvWzJdIC0gMV0gPz8gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWwpXHJcbiAgICAgICAgICAgICAgICAgIG5vcm1zLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGtleVBvc05vcm06IHN0cmluZyA9IGAke3ZlcnRleEluZm9bMF19LyR7dmVydGV4SW5mb1syXX1gO1xyXG4gICAgICAgICAgICAgICAgdmVydGljZXMucHVzaChuZXcgVmVydGV4KG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA/PyBwb3NpdGlvbiwgdXYsIG5vcm1hbCkpO1xyXG4gICAgICAgICAgICAgICAgbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXhba2V5XSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgIG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgZmFjZXMucHVzaChuZXcgRmFjZSh2ZXJ0aWNlcywgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDJdLCBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0sIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAzXSkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xyXG4gICAgICB0aGlzLmZhY2VzID0gZmFjZXM7XHJcbiAgICAgIGlmIChub3Jtcy5sZW5ndGggPiAwKSAvLyBUT0RPOiByZW5kZXJtZXNoIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSB1bmRlZmluZWQgbm9ybWFscyBjb3JyZWN0bHksIGkuZS4gY2FsY3VsYXRlIHRoZW0gb25seSBpZiB0aGV5IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgdmVydGljZXNcclxuICAgICAgICB0aGlzLnJlbmRlck1lc2gubm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkobm9ybXMpO1xyXG4gICAgICAvLyBfbWVzaC5yZW5kZXJNZXNoLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoaW5kaWNlcyk7IC8vIGRvZW5zJ3Qgc2VlbSB0byBhZmZlY3Qgc2NlbmUgbG9hZGluZyB0aW1lLi4uXHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIHNpbXBsZSBweXJhbWlkIHdpdGggZWRnZXMgYXQgdGhlIGJhc2Ugb2YgbGVuZ3RoIDEgYW5kIGEgaGVpZ2h0IG9mIDEuIFRoZSBzaWRlcyBjb25zaXN0aW5nIG9mIG9uZSwgdGhlIGJhc2Ugb2YgdHdvIHRyaWdvbnNcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAgICA0XHJcbiAgICogICAgICAgICAgICAgIC9cXGAuXHJcbiAgICogICAgICAgICAgICAzL19fXFxfXFwgMlxyXG4gICAqICAgICAgICAgICAwL19fX19cXC8xXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFB5cmFtaWQgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFB5cmFtaWQpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUHlyYW1pZFwiKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgLy8gdGhpcy5jcmVhdGUoKTtcclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoXHJcbiAgICAgICAgLy8gZ3JvdW5kIHZlcnRpY2VzXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjAsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC4wLCAwLjUpLCBuZXcgVmVjdG9yMigxLCAxKSksXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygwLjUsIDAuMCwgLTAuNSksIG5ldyBWZWN0b3IyKDEsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIDAuMCwgLTAuNSksIG5ldyBWZWN0b3IyKDAsIDApKSxcclxuICAgICAgICAvLyB0aXAgKHZlcnRleCAjNClcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuMCwgMS4wLCAwLjApLCBuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxyXG4gICAgICAgIC8vIGZsb29yIGFnYWluIGZvciBkb3duc2lkZSB0ZXh0dXJlXHJcbiAgICAgICAgbmV3IFZlcnRleCgwLCBuZXcgVmVjdG9yMigwLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgxLCBuZXcgVmVjdG9yMigxLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgyLCBuZXcgVmVjdG9yMigxLCAxKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgzLCBuZXcgVmVjdG9yMigwLCAxKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAwLCAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAxLCAyKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAyLCAzKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAzLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA1ICsgMCwgNSArIDIsIDUgKyAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA1ICsgMCwgNSArIDMsIDUgKyAyKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc2ltcGxlIHF1YWQgd2l0aCBlZGdlcyBvZiBsZW5ndGggMSwgdGhlIGZhY2UgY29uc2lzdGluZyBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgMCBfXyAzXHJcbiAgICogICAgICAgICB8X1xcfFxyXG4gICAqICAgICAgICAxICAgIDIgICAgICAgICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFF1YWQgZXh0ZW5kcyBNZXNoUG9seWdvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hRdWFkKTtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgc2hhcGU6IFZlY3RvcjJbXSA9IFtcclxuICAgICAgbmV3IFZlY3RvcjIoLTAuNSwgMC41KSwgbmV3IFZlY3RvcjIoLTAuNSwgLTAuNSksIG5ldyBWZWN0b3IyKDAuNSwgLTAuNSksIG5ldyBWZWN0b3IyKDAuNSwgMC41KVxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFF1YWRcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSwgTWVzaFF1YWQuc2hhcGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8vIGZsYXQgZXF1YWxzIHNtb290aFxyXG4gICAgLy8gcHVibGljIGdldCB2ZXJ0aWNlc0ZsYXQoKTogRmxvYXQzMkFycmF5IHsgcmV0dXJuIHRoaXMudmVydGljZXM7IH1cclxuICAgIC8vIHB1YmxpYyBnZXQgaW5kaWNlc0ZsYXQoKTogVWludDE2QXJyYXkgeyByZXR1cm4gdGhpcy5pbmRpY2VzOyB9XHJcbiAgICAvLyBwdWJsaWMgZ2V0IG5vcm1hbHNGbGF0KCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLm5vcm1hbHNWZXJ0ZXg7IH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNnZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmNyZWF0ZShNZXNoUXVhZC5zaGFwZSwgdHJ1ZSk7IC8vIHRoaXMgc2VlbXMgdG8gYmUgZGlzcGF0Y2hlZCBkb3VibGVkIHdoaWxlIGRlc2VyaWFsaXppbmcgdGhlIHJlc291cmNlc1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5maXRUZXh0dXJlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKiogXHJcbiAgICogVGhpcyBmdW5jdGlvbiB0eXBlIHRha2VzIHggYW5kIHogYXMgUGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIG51bWJlciBiZXR3ZWVuIC0xIGFuZCAxIHRvIGJlIHVzZWQgYXMgYSBoZWlnaHRtYXAuIFxyXG4gICAqIHggKiB6ICogMiByZXByZXNlbnQgdGhlIGFtb3V0IG9mIGZhY2VzIHdoaWNoIGFyZSBjcmVhdGVkLiBBcyBhIHJlc3VsdCB5b3UgZ2V0IDEgdmVydGV4IG1vcmUgaW4gZWFjaCBkaXJlY3Rpb24gKHggYW5kIHogYXhpcylcclxuICAgKiBUaGUgeS1jb21wb25lbnQgb2YgdGhlIHJlc3VsdGluZyBtZXNoIG1heSBiZSBtb3ZlZCB0byB2YWx1ZXMgYmV0d2VlbiAwIGFuZCBhIG1heGltdW0gaGVpZ2h0LlxyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgdHlwZSBIZWlnaHRNYXBGdW5jdGlvbiA9ICh4OiBudW1iZXIsIHo6IG51bWJlcikgPT4gbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVydGljYWwgcHJvamVjdGlvbiBvZiBhIGdpdmVuIHBvc2l0aW9uIG9udG8gdGhlIHRlcnJhaW5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGVycmFpbkluZm8ge1xyXG4gICAgLyoqIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9pbnQgdmVydGljYWxseSBwcm9qZWN0ZWQgb24gdGhlIHRlcnJhaW4gaW4gd29ybGQgY29vcmRpbmF0ZXMgKi9cclxuICAgIHB1YmxpYyBwb3NpdGlvbjogVmVjdG9yMztcclxuICAgIC8qKiB0aGUgbm9ybWFsIG9mIHRoZSBmYWNlIG9mIHRoZSB0ZXJyYWluIHVuZGVyIHRoZSBwb2ludCBpbiB3b3JsZCBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIG5vcm1hbDogVmVjdG9yMztcclxuICAgIC8qKiB2ZXJ0aWNhbCBkaXN0YW5jZSBvZiB0aGUgcG9pbnQgdG8gdGhlIHRlcnJhaW4sIG5lZ2F0aXZlIGlmIGJlbG93ICovXHJcbiAgICBwdWJsaWMgZGlzdGFuY2U6IG51bWJlcjtcclxuICAgIC8qKiB0aGUgcG9zaXRpb24gaW4gZmFjZSBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uRmFjZTogVmVjdG9yMztcclxuICAgIC8qKiB0aGUgaW5kZXggb2YgdGhlIGZhY2UgdGhlIHBvc2l0aW9uIGlzIGluc2lkZSAqL1xyXG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XHJcbiAgICAvKiogdGhlIGdyaWQgY29vcmRpbmF0ZXMgb2YgdGhlIHF1YWQgdGhlIGZhY2UgYmVsb25ncyB0byAqL1xyXG4gICAgcHVibGljIGdyaWQ6IFZlY3RvcjI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHRlcnJhaW4gc3ByZWFkcyBvdXQgaW4gdGhlIHgtei1wbGFuZSwgeSBpcyB0aGUgaGVpZ2h0IGRlcml2ZWQgZnJvbSB0aGUgaGVpZ2h0bWFwIGZ1bmN0aW9uLiBcclxuICAgKiBUaGUgdGVycmFpbiBpcyBhbHdheXMgMSBpbiBzaXplIGluIGFsbCBkaW1lbnNpb25zLCBmaXR0aW5nIGludG8gdGhlIHVuaXQtY3ViZS4gXHJcbiAgICogUmVzb2x1dGlvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcXVhZHMgaW4geCBhbmQgeiBkaW1lbnNpb24sIHNjYWxlIHRoZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgeCx6LWNvb3JkaW5hdGVzIHBhc3NlZCB0byB0aGUgaGVpZ2h0bWFwIGZ1bmN0aW9uLlxyXG4gICAqIFN0YW5kYXJkIGZ1bmN0aW9uIGlzIHRoZSBzaW1wbGV4IG5vaXNlIGltcGxlbWVudGVkIHdpdGggRlVER0UsIGJ1dCBhbm90aGVyIGZ1bmN0aW9uIGNhbiBiZSBnaXZlbi5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyIHwgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgTW9yaXR6IEJlYXVncmFuZCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hUZXJyYWluIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hUZXJyYWluKTtcclxuICAgIHByb3RlY3RlZCByZXNvbHV0aW9uOiBWZWN0b3IyO1xyXG4gICAgcHJvdGVjdGVkIHNjYWxlOiBWZWN0b3IyO1xyXG4gICAgcHJvdGVjdGVkIHNlZWQ6IG51bWJlcjtcclxuICAgIHByb3RlY3RlZCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoVGVycmFpblwiLCBfcmVzb2x1dGlvbjogVmVjdG9yMiA9IFZlY3RvcjIuT05FKDIpLCBfc2NhbGVJbnB1dDogVmVjdG9yMiA9IFZlY3RvcjIuT05FKCksIF9mdW5jdGlvbk9yU2VlZDogSGVpZ2h0TWFwRnVuY3Rpb24gfCBudW1iZXIgPSAwKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3Jlc29sdXRpb24sIF9zY2FsZUlucHV0LCBfZnVuY3Rpb25PclNlZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgbWVzaCBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3Jlc29sdXRpb246IFZlY3RvcjIgPSBWZWN0b3IyLk9ORSgyKSwgX3NjYWxlSW5wdXQ6IFZlY3RvcjIgPSBWZWN0b3IyLk9ORSgpLCBfZnVuY3Rpb25PclNlZWQ6IEhlaWdodE1hcEZ1bmN0aW9uIHwgbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuc2VlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5yZXNvbHV0aW9uID0gbmV3IFZlY3RvcjIoTWF0aC5yb3VuZChfcmVzb2x1dGlvbi54KSwgTWF0aC5yb3VuZChfcmVzb2x1dGlvbi55KSk7XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2NhbGVJbnB1dC5jbG9uZTtcclxuXHJcbiAgICAgIGlmIChfZnVuY3Rpb25PclNlZWQgaW5zdGFuY2VvZiBGdW5jdGlvbilcclxuICAgICAgICB0aGlzLmhlaWdodE1hcEZ1bmN0aW9uID0gX2Z1bmN0aW9uT3JTZWVkO1xyXG4gICAgICBlbHNlIGlmICh0eXBlb2YgKF9mdW5jdGlvbk9yU2VlZCkgPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgIHRoaXMuc2VlZCA9IF9mdW5jdGlvbk9yU2VlZDtcclxuICAgICAgICBsZXQgcHJuZzogUmFuZG9tID0gbmV3IFJhbmRvbSh0aGlzLnNlZWQpO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBuZXcgTm9pc2UyKCgpID0+IHBybmcuZ2V0Tm9ybSgpKS5zYW1wbGU7IC8vIFRPRE8gY2FsbCBQUk5HXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBuZXcgTm9pc2UyKCkuc2FtcGxlO1xyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICAvL0l0ZXJhdGUgb3ZlciBlYWNoIGNlbGwgdG8gZ2VuZXJhdGUgZ3JpZCBvZiB2ZXJ0aWNlc1xyXG4gICAgICBmb3IgKGxldCB6OiBudW1iZXIgPSAwOyB6IDw9IHRoaXMucmVzb2x1dGlvbi55OyB6KyspIHtcclxuICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDw9IHRoaXMucmVzb2x1dGlvbi54OyB4KyspIHtcclxuICAgICAgICAgIGxldCB4Tm9ybTogbnVtYmVyID0geCAvIHRoaXMucmVzb2x1dGlvbi54O1xyXG4gICAgICAgICAgbGV0IHpOb3JtOiBudW1iZXIgPSB6IC8gdGhpcy5yZXNvbHV0aW9uLnk7XHJcbiAgICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IFZlcnRleChcclxuICAgICAgICAgICAgbmV3IFZlY3RvcjMoeE5vcm0gLSAwLjUsIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24oeE5vcm0gKiB0aGlzLnNjYWxlLngsIHpOb3JtICogdGhpcy5zY2FsZS55KSwgek5vcm0gLSAwLjUpLFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMih4Tm9ybSwgek5vcm0pXHJcbiAgICAgICAgICApKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBxdWFkczogUXVhZFtdID0gW107XHJcbiAgICAgIGxldCBzcGxpdDogUVVBRFNQTElUID0gUVVBRFNQTElULkFUXzA7XHJcbiAgICAgIGZvciAobGV0IHo6IG51bWJlciA9IDA7IHogPCB0aGlzLnJlc29sdXRpb24ueTsgeisrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgeDogbnVtYmVyID0gMDsgeCA8IHRoaXMucmVzb2x1dGlvbi54OyB4KyspIHtcclxuICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFF1YWQoXHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXMsXHJcbiAgICAgICAgICAgICh4ICsgMCkgKyAoeiArIDApICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMCkgKyAoeiArIDEpICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMSkgKyAoeiArIDEpICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMSkgKyAoeiArIDApICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgIHNwbGl0XHJcbiAgICAgICAgICApKTtcclxuICAgICAgICAgIHNwbGl0ID0gKHNwbGl0ID09IFFVQURTUExJVC5BVF8wKSA/IFFVQURTUExJVC5BVF8xIDogUVVBRFNQTElULkFUXzA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlc29sdXRpb24ueCAlIDIgPT0gMCkgLy8gcmV2ZXJzZSBsYXN0IHNwbGl0IGNoYW5nZSBpZiB4LXJlc29sdXRpb24gaXMgZXZlblxyXG4gICAgICAgICAgc3BsaXQgPSAoc3BsaXQgPT0gUVVBRFNQTElULkFUXzApID8gUVVBRFNQTElULkFUXzEgOiBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZhY2VzID0gcXVhZHMuZmxhdE1hcCgoX3F1YWQ6IFF1YWQpID0+IF9xdWFkLmZhY2VzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnRpY2FsIHByb2plY3Rpb24gb2YgdGhlIGdpdmVuIHBvc2l0aW9uIG9udG8gdGhlIHRlcnJhaW4uXHJcbiAgICAgKiBQYXNzIHRoZSBvdmVyYWxsIHdvcmxkIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSB0ZXJyYWluIGlmIHRoZSBwb3NpdGlvbiBpcyBnaXZlbiBpbiB3b3JsZCBjb29yZGluYXRlcy5cclxuICAgICAqIElmIGF0IGhhbmQsIHBhc3MgdGhlIGludmVyc2UgdG9vIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGN1bGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VGVycmFpbkluZm8oX3Bvc2l0aW9uOiBWZWN0b3IzLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfbXR4SW52ZXJzZT86IE1hdHJpeDR4NCk6IFRlcnJhaW5JbmZvIHtcclxuICAgICAgaWYgKCFfbXR4SW52ZXJzZSlcclxuICAgICAgICBfbXR4SW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKF9tdHhXb3JsZCk7XHJcblxyXG4gICAgICBsZXQgdGVycmFpbkluZm86IFRlcnJhaW5JbmZvID0gbmV3IFRlcnJhaW5JbmZvO1xyXG5cclxuICAgICAgbGV0IHBvc0xvY2FsOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9zaXRpb24sIF9tdHhJbnZlcnNlLCB0cnVlKTtcclxuXHJcblxyXG4gICAgICBsZXQgejogbnVtYmVyID0gTWF0aC5mbG9vcigocG9zTG9jYWwueiArIDAuNSkgKiB0aGlzLnJlc29sdXRpb24ueSk7XHJcbiAgICAgIGxldCB4OiBudW1iZXIgPSBNYXRoLmZsb29yKChwb3NMb2NhbC54ICsgMC41KSAqIHRoaXMucmVzb2x1dGlvbi54KTtcclxuICAgICAgaWYgKHogPCAwIHx8IHogPiB0aGlzLnJlc29sdXRpb24ueSAtIDEgfHwgeCA8IDAgfHwgeCA+IHRoaXMucmVzb2x1dGlvbi54IC0gMSlcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gKHogKiB0aGlzLnJlc29sdXRpb24ueCArIHgpICogMjtcclxuICAgICAgbGV0IGZhY2U6IEZhY2UgPSB0aGlzLmZhY2VzW2luZGV4XTtcclxuXHJcbiAgICAgIGxldCByYXk6IFJheSA9IG5ldyBSYXkoVmVjdG9yMy5ZKCksIHBvc0xvY2FsKTtcclxuICAgICAgbGV0IHBvaW50OiBWZWN0b3IzID0gcmF5LmludGVyc2VjdEZhY2VQbGFuZShmYWNlKTtcclxuICAgICAgaWYgKCFmYWNlLmlzSW5zaWRlKHBvaW50KSkge1xyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgZmFjZSA9IHRoaXMuZmFjZXNbaW5kZXhdO1xyXG4gICAgICAgIHBvaW50ID0gcmF5LmludGVyc2VjdEZhY2VQbGFuZShmYWNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGVycmFpbkluZm8uaW5kZXggPSBpbmRleDtcclxuICAgICAgdGVycmFpbkluZm8ucG9zaXRpb25GYWNlID0gcG9pbnQ7XHJcbiAgICAgIHRlcnJhaW5JbmZvLnBvc2l0aW9uID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludCwgX210eFdvcmxkLCB0cnVlKTtcclxuICAgICAgdGVycmFpbkluZm8ubm9ybWFsID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihmYWNlLm5vcm1hbCwgTWF0cml4NHg0LlRSQU5TUE9TRShfbXR4SW52ZXJzZSksIGZhbHNlKTtcclxuICAgICAgdGVycmFpbkluZm8uZGlzdGFuY2UgPSBfcG9zaXRpb24ueSAtIHRlcnJhaW5JbmZvLnBvc2l0aW9uLnk7XHJcbiAgICAgIHRlcnJhaW5JbmZvLmdyaWQgPSB0aGlzLmdldEdyaWRGcm9tRmFjZUluZGV4KGluZGV4KTtcclxuICAgICAgcmV0dXJuIHRlcnJhaW5JbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ3JpZCBjb29yZGluYXRlcyBvZiB0aGUgcXVhZCB0aGUgZ2l2ZW4gZmFjZSBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0R3JpZEZyb21GYWNlSW5kZXgoX2luZGV4OiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuICAgICAgbGV0IGlRdWFkOiBudW1iZXIgPSBNYXRoLmZsb29yKF9pbmRleCAvIDIpO1xyXG4gICAgICByZXN1bHQuc2V0KGlRdWFkICUgdGhpcy5yZXNvbHV0aW9uLnksIE1hdGguZmxvb3IoaVF1YWQgLyB0aGlzLnJlc29sdXRpb24ueCkpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgdHdvIGZhY2VzIGZvcm1pbmcgdGhlIHF1YWQgdGhlIGdpdmVuIGdyaWQgcG9zaXRpb24gYmVsb25ncyB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZhY2VJbmRpY2VzRnJvbUdyaWQoX2dyaWQ6IFZlY3RvcjIpOiBudW1iZXJbXSB7XHJcbiAgICAgIGxldCBpUXVhZDogbnVtYmVyID0gX2dyaWQueSAqIDIgKiB0aGlzLnJlc29sdXRpb24ueCArIF9ncmlkLnggKiAyO1xyXG4gICAgICByZXR1cm4gW2lRdWFkLCBpUXVhZCArIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zZWVkID0gdGhpcy5zZWVkO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNjYWxlID0gdGhpcy5zY2FsZS5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHV0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJlc29sdXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLnNjYWxlLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnNjYWxlKTtcclxuICAgICAgdGhpcy5zZWVkID0gX3NlcmlhbGl6YXRpb24uc2VlZDtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5yZXNvbHV0aW9uLCB0aGlzLnNjYWxlLCB0aGlzLnNlZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnJlc29sdXRpb24sIHRoaXMuc2NhbGUsIHRoaXMuc2VlZCk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJNZXNoVGVycmFpbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcGxhbmFyIEdyaWQgYW5kIGFwcGxpZXMgYSBIZWlnaHRtYXAtRnVuY3Rpb24gdG8gaXQuXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBNb3JpdHogQmVhdWdyYW5kLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBAZW51bWVyYWJsZVxyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUmVsaWVmIGV4dGVuZHMgTWVzaFRlcnJhaW4ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUmVsaWVmKTtcclxuXHJcbiAgICAjdGV4dHVyZTogVGV4dHVyZUltYWdlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUmVsaWVmXCIsIF90ZXh0dXJlPzogVGV4dHVyZUltYWdlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBWZWN0b3IyLk9ORSgyKSwgdW5kZWZpbmVkLCAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4gMCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IF90ZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUhlaWdodE1hcEZ1bmN0aW9uKF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBIZWlnaHRNYXBGdW5jdGlvbiB7XHJcbiAgICAgIGxldCBhcnJheTogVWludDhDbGFtcGVkQXJyYXkgPSBNZXNoUmVsaWVmLnRleHR1cmVUb0NsYW1wZWRBcnJheShfdGV4dHVyZSk7XHJcbiAgICAgIGxldCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBwaXhlbDogbnVtYmVyID0gTWF0aC5yb3VuZChfeiAqIF90ZXh0dXJlLmltYWdlLndpZHRoICsgX3gpO1xyXG4gICAgICAgIHJldHVybiBhcnJheVtwaXhlbCAqIDRdIC8gMjU1O1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gaGVpZ2h0TWFwRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4dHVyZVRvQ2xhbXBlZEFycmF5KF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgY2FudmFzLndpZHRoID0gX3RleHR1cmUuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBfdGV4dHVyZS5pbWFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgY3JjOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjcmMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNyYy5kcmF3SW1hZ2UoX3RleHR1cmUuaW1hZ2UsIDAsIDApO1xyXG5cclxuICAgICAgcmV0dXJuIGNyYy5nZXRJbWFnZURhdGEoMCwgMCwgX3RleHR1cmUuaW1hZ2Uud2lkdGgsIF90ZXh0dXJlLmltYWdlLmhlaWdodCkuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgdGV4dHVyZSB0byBiZSB1c2VkIGFzIHRoZSBoZWlnaHRtYXAuXHJcbiAgICAgKiAqKkNhdXRpb24hKiogU2V0dGluZyB0aGlzIGNhdXNlcyB0aGUgbWVzaCB0byBiZSByZWNyZWF0ZWQgd2hpY2ggY2FuIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBlbnVtZXJhYmxlXHJcbiAgICBAdHlwZShUZXh0dXJlSW1hZ2UpXHJcbiAgICBwdWJsaWMgZ2V0IHRleHR1cmUoKTogVGV4dHVyZUltYWdlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RleHR1cmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmUoX3RleHR1cmU6IFRleHR1cmVJbWFnZSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlID0gX3RleHR1cmU7XHJcbiAgICAgIGlmICghX3RleHR1cmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcmVzb2x1dGlvbjogVmVjdG9yMiA9IF90ZXh0dXJlID8gbmV3IFZlY3RvcjIoX3RleHR1cmUuaW1hZ2Uud2lkdGggLSAxLCBfdGV4dHVyZS5pbWFnZS5oZWlnaHQgLSAxKSA6IHVuZGVmaW5lZDtcclxuICAgICAgc3VwZXIuY3JlYXRlKHJlc29sdXRpb24sIHJlc29sdXRpb24sIE1lc2hSZWxpZWYuY3JlYXRlSGVpZ2h0TWFwRnVuY3Rpb24oX3RleHR1cmUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNjYWxlO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3RleHR1cmUpXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbi5pZFRleHR1cmUgPSB0aGlzLnRleHR1cmUuaWRSZXNvdXJjZTtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKSBcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZUltYWdlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2VlZDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNjYWxlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVzb2x1dGlvbjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vIC88cmVmZXJlbmNlIHBhdGg9XCJNZXNoUG9seWdvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcm90YXRpb24gb2YgYSBwb2x5Z29uIGFyb3VuZCB0aGUgeS1heGlzXHJcbiAgICogYGBgdGV4dCAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgKiAgICAgICAgICAgICAgICAgIF8gIOKGkSAwXzFcclxuICAgKiAgICAgICAgICAgICAgICAg4pSCICAg4pSC4oaSeCDilIIyICAgICAgICAgXHJcbiAgICogICAgICAgICAgICAgICAgICDilbIgIOKUgiAg4pWxMyAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgICAg4pWxICDilIIgIOKVsiAgIFxyXG4gICAqICAgICAgICAgICAgICAgICDilbFfX1/ilIJfX1/ilbI0IFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgIDVcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hSb3RhdGlvbiBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUm90YXRpb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJ0aWNlc0RlZmF1bHQ6IFZlY3RvcjJbXSA9IFsgLy8gbGluZSBpcyB0aGUgbWluaW1hbCBzaGFwZVxyXG4gICAgICBuZXcgVmVjdG9yMigwLjUsIDAuNSksXHJcbiAgICAgIG5ldyBWZWN0b3IyKDAuNSwgLTAuNSlcclxuICAgIF07XHJcbiAgICBwcm90ZWN0ZWQgc2hhcGU6IE11dGFibGVBcnJheTxWZWN0b3IyPiA9IG5ldyBNdXRhYmxlQXJyYXk8VmVjdG9yMj4oVmVjdG9yMik7XHJcbiAgICBwcm90ZWN0ZWQgbG9uZ2l0dWRlczogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUm90YXRpb25cIiwgX3NoYXBlOiBWZWN0b3IyW10gPSBNZXNoUm90YXRpb24udmVydGljZXNEZWZhdWx0LCBfbG9uZ2l0dWRlczogbnVtYmVyID0gMykge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMucm90YXRlKF9zaGFwZSwgX2xvbmdpdHVkZXMpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIk11dGF0b3JcIiwgdGhpcy5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXQgbWluVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNoYXBlID0gU2VyaWFsaXplci5zZXJpYWxpemVBcnJheShWZWN0b3IyLCB0aGlzLnNoYXBlKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzID0gdGhpcy5sb25naXR1ZGVzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gPFZlY3RvcjJbXT5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplQXJyYXkoX3NlcmlhbGl6YXRpb24uc2hhcGUpO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBfc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzO1xyXG4gICAgICB0aGlzLnJvdGF0ZShzaGFwZSwgdGhpcy5sb25naXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5yb3RhdGUodGhpcy5zaGFwZSwgdGhpcy5sb25naXR1ZGVzKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEUpKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCByb3RhdGUoX3NoYXBlOiBWZWN0b3IyW10sIF9sb25naXR1ZGVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnNoYXBlID0gPE11dGFibGVBcnJheTxWZWN0b3IyPj5NdXRhYmxlQXJyYXkuZnJvbShfc2hhcGUubWFwKF92ZXJ0ZXggPT4gX3ZlcnRleC5jbG9uZSkpO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBNYXRoLnJvdW5kKF9sb25naXR1ZGVzKTtcclxuICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSAzNjAgLyB0aGlzLmxvbmdpdHVkZXM7XHJcbiAgICAgIGxldCBtdHhSb3RhdGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9ZKGFuZ2xlKTtcclxuICAgICAgLy8gY29weSBvcmlnaW5hbCBwb2x5Z29uIGFzIFZlY3RvcjMgYXJyYXlcclxuICAgICAgbGV0IHBvbHlnb246IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBsZXQgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFswXTtcclxuICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5zaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvbHlnb24ucHVzaCh0aGlzLnNoYXBlW2ldLnRvVmVjdG9yMygpKTtcclxuICAgICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICAgIGxldCBkaXN0YW5jZTogbnVtYmVyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHRoaXMuc2hhcGVbaV0sIHRoaXMuc2hhcGVbaSAtIDFdKS5tYWduaXR1ZGU7XHJcbiAgICAgICAgICB0b3RhbCArPSBkaXN0YW5jZTtcclxuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHRvdGFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGlzdGFuY2VzLmZvckVhY2goKF9lbnRyeSwgX2luZGV4KSA9PiB7IGRpc3RhbmNlc1tfaW5kZXhdID0gX2VudHJ5IC8gdG90YWw7IH0pO1xyXG5cclxuICAgICAgbGV0IG5WZXJ0aWNlc1BvbHlnb246IG51bWJlciA9IHBvbHlnb24ubGVuZ3RoO1xyXG5cclxuICAgICAgbGV0IGNsb3VkOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBmb3IgKGxldCBsb25naXR1ZGU6IG51bWJlciA9IDA7IGxvbmdpdHVkZSA8PSB0aGlzLmxvbmdpdHVkZXM7IGxvbmdpdHVkZSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WZXJ0aWNlc1BvbHlnb247IGkrKykge1xyXG4gICAgICAgICAgbGV0IHV2OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIobG9uZ2l0dWRlIC8gdGhpcy5sb25naXR1ZGVzLCBkaXN0YW5jZXNbaV0pO1xyXG4gICAgICAgICAgLy8gVE9ETzogbGFzdCBzZWN0b3Igc2hvdWxkIG9ubHkgYmUgcmVmZXJlbmNlcyB0byB0aGUgZmlyc3QgbWVyaWRpYW5cclxuICAgICAgICAgIGlmIChsb25naXR1ZGUgPT0gdGhpcy5sb25naXR1ZGVzKVxyXG4gICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgoaSwgdXYpKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9uZ2l0dWRlID4gMCAmJiB0aGlzLnNoYXBlW2ldLnggPT0gMCkgLy8gdXNlIGEgc2luZ2xlIHZlcnRleCB3aGVuIGl0J3Mgb24gdGhlIHJvdGF0aW9uIGF4aXNcclxuICAgICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgoaSwgdXYpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGNsb3VkLnB1c2gobmV3IFZlcnRleChwb2x5Z29uW2ldLmNsb25lLCB1dikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb2x5Z29uLmZvckVhY2goKF92ZWN0b3I6IFZlY3RvcjMpID0+IF92ZWN0b3IudHJhbnNmb3JtKG10eFJvdGF0ZSkpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gY29weSBpbmRpY2VzIHRvIG5ldyBpbmRleCBhcnJheVxyXG4gICAgICBsZXQgZmFjZXM6IEZhY2VbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgbG9uZ2l0dWRlOiBudW1iZXIgPSAwOyBsb25naXR1ZGUgPCB0aGlzLmxvbmdpdHVkZXM7IGxvbmdpdHVkZSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDwgblZlcnRpY2VzUG9seWdvbiAtIDE7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gbG9uZ2l0dWRlICogblZlcnRpY2VzUG9seWdvbiArIGxhdGl0dWRlO1xyXG4gICAgICAgICAgbGV0IHF1YWQ6IFF1YWQgPSBuZXcgUXVhZChjbG91ZCwgc3RhcnQgKyAxLCBzdGFydCArIDEgKyBuVmVydGljZXNQb2x5Z29uLCBzdGFydCArIG5WZXJ0aWNlc1BvbHlnb24sIHN0YXJ0KTtcclxuICAgICAgICAgIGZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgICAvLyBUT0RPOiBjYXRjaCBpbnZhbGlkIGZhY2VzIHJpZ2h0IGhlcmUuLi5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBjbG91ZDtcclxuICAgICAgdGhpcy5mYWNlcyA9IGZhY2VzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgVVYgU3BoZXJlIHdpdGggYSBnaXZlbiBudW1iZXIgb2Ygc2VjdG9ycyBhbmQgc3RhY2tzIChjbGFtcGVkIGF0IDEyOCoxMjgpXHJcbiAgICogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gaHR0cDovL3d3dy5zb25naG8uY2Evb3BlbmdsL2dsX3NwaGVyZS5odG1sXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFNwaGVyZSBleHRlbmRzIE1lc2hSb3RhdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hTcGhlcmUpO1xyXG4gICAgcHJpdmF0ZSBsYXRpdHVkZXM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFNwaGVyZVwiLCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gOCkge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9sb25naXR1ZGVzLCBfbGF0aXR1ZGVzKTsgLy8gVE9ETzogd2hlbiBkZXNlcmlhbGl6ZWQgdGhpcyBjYXVzZXMgdGhpcyBjYXVzZXMgdGhlIG1lc2ggdG8gYmUgY3JlYXRlZCB0d2ljZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgc3BoZXJlIHdpdGggYSBnaXZlbiBudW1iZXIgb2YgbG9uZ2l0dWRlcyBhbmQgbGF0aXR1ZGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX2xvbmdpdHVkZXM6IG51bWJlciA9IDMsIF9sYXRpdHVkZXM6IG51bWJlciA9IDIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAvL0NsYW1wIHJlc29sdXRpb24gdG8gcHJldmVudCBwZXJmb3JtYW5jZSBpc3N1ZXNcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5taW4oTWF0aC5yb3VuZChfbG9uZ2l0dWRlcyksIDEyOCk7XHJcbiAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5taW4oTWF0aC5yb3VuZChfbGF0aXR1ZGVzKSwgMTI4KTtcclxuXHJcbiAgICAgIGlmIChfbG9uZ2l0dWRlcyA8IDMgfHwgX2xhdGl0dWRlcyA8IDIpIHtcclxuICAgICAgICBEZWJ1Zy53YXJuKFwiVVYgU3BoZXJlIG11c3QgaGF2ZSBhdCBsZWFzdCAzIGxvbmdpdHVkZXMgYW5kIDIgbGF0aXR1ZGVzIHRvIGZvcm0gYSAzLWRpbWVuc2lvbmFsIHNoYXBlLlwiKTtcclxuICAgICAgICB0aGlzLmxvbmdpdHVkZXMgPSBNYXRoLm1heCgzLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgyLCBfbGF0aXR1ZGVzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgbGV0IHN0ZXA6IG51bWJlciA9IE1hdGguUEkgLyB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8PSB0aGlzLmxhdGl0dWRlczsgKytpKSB7XHJcbiAgICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSBNYXRoLlBJIC8gMiAtIGkgKiBzdGVwO1xyXG4gICAgICAgIGxldCB4OiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgbGV0IHk6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgc2hhcGUucHVzaChuZXcgVmVjdG9yMih4IC8gMiwgeSAvIDIpKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBwbGFjZSBmaXJzdCBhbmQgbGFzdCB2ZXJ0ZXggZXhhY3RseSBvbiByb3RhdGlvbiBheGlzXHJcbiAgICAgIHNoYXBlWzBdLnggPSAwO1xyXG4gICAgICBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXS54ID0gMDtcclxuXHJcbiAgICAgIHN1cGVyLnJvdGF0ZShzaGFwZSwgX2xvbmdpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNoYXBlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxhdGl0dWRlcyA9IHRoaXMubGF0aXR1ZGVzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9zZXJpYWxpemF0aW9uLmxvbmdpdHVkZXMsIF9zZXJpYWxpemF0aW9uLmxhdGl0dWRlcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMubG9uZ2l0dWRlcywgdGhpcy5sYXRpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSB0d28gcXVhZHMgcGxhY2VkIGJhY2sgdG8gYmFjaywgdGhlIG9uZSBmYWNpbmcgaW4gbmVnYXRpdmUgWi1kaXJlY3Rpb24gaXMgdGV4dHVyZWQgcmV2ZXJzZWRcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgIDAgX18gM1xyXG4gICAqICAgICAgICAgfF9ffFxyXG4gICAqICAgICAgICAxICAgIDIgICAgICAgICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hTcHJpdGUgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFNwcml0ZSk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hTcHJpdGVcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjUsIDApLCBuZXcgVmVjdG9yMigwLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAtMC41LCAwKSwgbmV3IFZlY3RvcjIoMCwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAtMC41LCAwKSwgbmV3IFZlY3RvcjIoMSwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjUsIDApLCBuZXcgVmVjdG9yMigxLCAwKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAxLCAyLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAyLCAzLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAwLCAzLCAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAzLCAyLCAxKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZsYXQgaXMgc3RhbmRhcmQgaGVyZSAvLyBUT0RPOiBpcyB0aGlzIHN0aWxsIG5lZWRlZD9cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXNGbGF0KCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLnJlbmRlck1lc2gudmVydGljZXM7IH1cclxuICAgIHB1YmxpYyBnZXQgaW5kaWNlc0ZsYXQoKTogVWludDE2QXJyYXkgeyByZXR1cm4gdGhpcy5yZW5kZXJNZXNoLmluZGljZXM7IH1cclxuXHJcbiAgICAvLyBpbnN0ZWFkLCBzbW9vdGggc2hhZGluZyB3b3VsZCBuZWVkIGV4dHJhIGF0dGVudGlvbiBidXQgaXMgbm90IHJlbGV2YW50Li4uXHJcblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgdG9ydXMgd2l0aCBhIGdpdmVuIHJpbmcgcmFkaXVzLCB0dWJlIHJhZGl1cyBhbmQgdGhlIG51bWJlciBvZiBtYWpvci0gYW5kIG1pbm9yIHNlZ21lbnRzXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFRvcnVzIGV4dGVuZHMgTWVzaFJvdGF0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFRvcnVzKTtcclxuICAgIHByaXZhdGUgbGF0aXR1ZGVzOiBudW1iZXIgPSAxMjtcclxuICAgIHByaXZhdGUgcmFkaXVzUmluZzogbnVtYmVyID0gMC41IC0gMC4xMjU7XHJcbiAgICBwcml2YXRlIHJhZGl1c1R1YmU6IG51bWJlciA9IDAuMTI1O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoVG9ydXNcIiwgX3JhZGl1c1Jpbmc6IG51bWJlciA9IDAuNSAtIDAuMTI1LCBfcmFkaXVzVHViZTogbnVtYmVyID0gMC4xMjUgLCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gNikge1xyXG4gICAgICBzdXBlcihfbmFtZSwgTWVzaFRvcnVzLmdldFNoYXBlKF9yYWRpdXNSaW5nLCBfcmFkaXVzVHViZSwgTWF0aC5tYXgoMywgX2xhdGl0dWRlcykpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMucmFkaXVzVHViZSA9IF9yYWRpdXNUdWJlO1xyXG4gICAgICB0aGlzLnJhZGl1c1JpbmcgPSBfcmFkaXVzUmluZztcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gX2xvbmdpdHVkZXM7XHJcbiAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5tYXgoMywgX2xhdGl0dWRlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0U2hhcGUoX3JhZGl1c1Jpbmc6IG51bWJlciwgX3JhZGl1c1R1YmU6IG51bWJlciwgX2xhdGl0dWRlczogbnVtYmVyKTogVmVjdG9yMltdIHtcclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgbGV0IGNlbnRlcjogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKF9yYWRpdXNSaW5nLCAwKTtcclxuICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDw9IF9sYXRpdHVkZXM7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICBsZXQgYW5nbGU6IG51bWJlciA9IDIgKiBNYXRoLlBJICogbGF0aXR1ZGUgLyBfbGF0aXR1ZGVzO1xyXG4gICAgICAgIHNoYXBlLnB1c2goVmVjdG9yMi5TVU0oY2VudGVyLCBuZXcgVmVjdG9yMihfcmFkaXVzVHViZSAqIC1NYXRoLmNvcyhhbmdsZSksIF9yYWRpdXNUdWJlICogTWF0aC5zaW4oYW5nbGUpKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzaGFwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIHRvcnVzIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfcmFkaXVzUmluZzogbnVtYmVyID0gMC41IC0gMC4xMjUsIF9yYWRpdXNUdWJlOiBudW1iZXIgPSAwLjEyNSwgIF9sb25naXR1ZGVzOiBudW1iZXIgPSA4LCBfbGF0aXR1ZGVzOiBudW1iZXIgPSA2KTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmFkaXVzVHViZSA9IF9yYWRpdXNUdWJlO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlcyA9IE1hdGgubWF4KDMsIF9sYXRpdHVkZXMpO1xyXG4gICAgICB0aGlzLnJhZGl1c1JpbmcgPSBfcmFkaXVzUmluZztcclxuICAgICAgc3VwZXIucm90YXRlKE1lc2hUb3J1cy5nZXRTaGFwZShfcmFkaXVzUmluZywgX3JhZGl1c1R1YmUsIF9sYXRpdHVkZXMpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMgPSB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgc2VyaWFsaXphdGlvbi5yYWRpdXNSaW5nID0gdGhpcy5yYWRpdXNSaW5nO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnJhZGl1c1R1YmUgPSB0aGlzLnJhZGl1c1R1YmU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NlcmlhbGl6YXRpb24ucmFkaXVzUmluZywgX3NlcmlhbGl6YXRpb24ucmFkaXVzVHViZSwgX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcywgX3NlcmlhbGl6YXRpb24ubGF0aXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5yYWRpdXNSaW5nLCB0aGlzLnJhZGl1c1R1YmUsIHRoaXMubG9uZ2l0dWRlcywgdGhpcy5sYXRpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgZW51bSBRVUFEU1BMSVQge1xyXG4gICAgUExBTkFSLCBBVF8wLCBBVF8xXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHN1cmZhY2UgY3JlYXRlZCB3aXRoIGZvdXIgdmVydGljZXMgd2hpY2ggaW1tZWRpYXRlbHkgY3JlYXRlcyBub25lLCBvbmUgb3IgdHdvIHtAbGluayBGYWNlfXMgZGVwZW5kaW5nIG9uIHZlcnRpY2VzIGF0IGlkZW50aWNhbCBwb3NpdGlvbnMuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqIFFVQURTUExJVDogIFBMQU5BUiAgICAgICAgICAgICAgICAgIEFUXzAgICAgICAgICAgICAgICAgICAgICBBVF8xXHJcbiAgICogICAgICAgICAgICAgMCBfIDMgICAgICAgICAgICAgICAgICAgMCBfIDMgICAgICAgICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICB8XFx8ICAgICAgICAgICAgICAgICAgICAgfFxcfCAgICAgICAgICAgICAgICAgICAgICB8L3wgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICogICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAxIOKAviAyICAgICAgICAgICAgICAgICAgICAxIOKAviAyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICogIHNoYXJlZCBsYXN0IHZlcnRleCAyICAgICAgbGFzdCB2ZXJ0aWNlcyAyICsgMyAgICAgIGxhc3QgdmVydGljZXMgMyArIDAgXHJcbiAgICogICAgICBcclxuICAgKiBgYGAgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUXVhZCB7XHJcbiAgICBwdWJsaWMgZmFjZXM6IEZhY2VbXTtcclxuICAgICNzcGxpdDogUVVBRFNQTElUO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdmVydGljZXM6IFZlcnRpY2VzLCBfaW5kZXgwOiBudW1iZXIsIF9pbmRleDE6IG51bWJlciwgX2luZGV4MjogbnVtYmVyLCBfaW5kZXgzOiBudW1iZXIsIF9zcGxpdDogUVVBRFNQTElUID0gUVVBRFNQTElULlBMQU5BUikge1xyXG4gICAgICB0aGlzLmZhY2VzID0gW107XHJcbiAgICAgIHRoaXMuI3NwbGl0ID0gX3NwbGl0O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChfc3BsaXQgIT0gUVVBRFNQTElULkFUXzEpXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgwLCBfaW5kZXgxLCBfaW5kZXgyKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MSwgX2luZGV4MiwgX2luZGV4MykpO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChfc3BsaXQgPT0gUVVBRFNQTElULlBMQU5BUilcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDMsIF9pbmRleDAsIF9pbmRleDIpKTtcclxuICAgICAgICBlbHNlIGlmIChfc3BsaXQgPT0gUVVBRFNQTElULkFUXzApXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgwLCBfaW5kZXgyLCBfaW5kZXgzKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MSwgX2luZGV4MywgX2luZGV4MCkpO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc3BsaXQoKTogUVVBRFNQTElUIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwbGl0O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEJvbmUge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIHdlaWdodDogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogdGhlIHJlZmVyIHRvICBkZXNjcmlwdGlvbiBpcyBubyBsb25nZXIgY29ycmVjdCBhcyByZWZlciB0byBhbHNvIHdvcmtzIGZvciBib25lIGluZGljZXNcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgdmVydGV4IG9mIGEgbWVzaCB3aXRoIGV4dGVuZGVkIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHV2IGNvb3JkaW5hdGVzIGFuZCB0aGUgdmVydGV4IG5vcm1hbC5cclxuICAgKiBJdCBtYXkgcmVmZXIgdG8gYW5vdGhlciB2ZXJ0ZXggdmlhIGFuIGluZGV4IGludG8gc29tZSBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgcG9zaXRpb24gYW5kIHRoZSBub3JtYWwgYXJlIHN0b3JlZCB0aGVyZS5cclxuICAgKiBUaGlzIHdheSwgdmVydGV4IHBvc2l0aW9uIGFuZCBub3JtYWwgaXMgYSAxOjEgYXNzb2NpYXRpb24sIHZlcnRleCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVzIGEgMTpuIGFzc29jaWF0aW9uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFZlcnRleCB7XHJcbiAgICBwdWJsaWMgcG9zaXRpb246IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgdXY6IFZlY3RvcjIgfCBudWxsO1xyXG4gICAgcHVibGljIG5vcm1hbDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBjb2xvcjogQ29sb3I7XHJcbiAgICBwdWJsaWMgdGFuZ2VudDogVmVjdG9yNCB8IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJUbzogbnVtYmVyO1xyXG4gICAgcHVibGljIGJvbmVzOiBCb25lW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXByZXNlbnRzIGEgdmVydGV4IG9mIGEgbWVzaCB3aXRoIGV4dGVuZGVkIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHV2IGNvb3JkaW5hdGVzIHRoZSB2ZXJ0ZXggbm9ybWFsIGFuZCBpdHMgdGFuZ2VudHMuXHJcbiAgICAgKiBJdCBtYXkgcmVmZXIgdG8gYW5vdGhlciB2ZXJ0ZXggdmlhIGFuIGluZGV4IGludG8gc29tZSBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgcG9zaXRpb24gYW5kIHRoZSBub3JtYWwgYXJlIHN0b3JlZCB0aGVyZS5cclxuICAgICAqIFRoaXMgd2F5LCB2ZXJ0ZXggcG9zaXRpb24gYW5kIG5vcm1hbCBpcyBhIDE6MSBhc3NvY2lhdGlvbiwgdmVydGV4IHRvIHRleHR1cmUgY29vcmRpbmF0ZXMgYSAxOm4gYXNzb2NpYXRpb24uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9wb3NpdGlvbk9ySW5kZXg6IFZlY3RvcjMgfCBudW1iZXIsIF91djogVmVjdG9yMiA9IG51bGwsIF9ub3JtYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKSwgX3RhbmdlbnQ6IFZlY3RvcjQgPSBudWxsLCBfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpLCBfYm9uZXM6IEJvbmVbXSA9IG51bGwpIHtcclxuICAgICAgaWYgKF9wb3NpdGlvbk9ySW5kZXggaW5zdGFuY2VvZiBWZWN0b3IzKVxyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBfcG9zaXRpb25PckluZGV4O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5yZWZlclRvID0gX3Bvc2l0aW9uT3JJbmRleDtcclxuXHJcbiAgICAgIHRoaXMudXYgPSBfdXY7XHJcbiAgICAgIHRoaXMubm9ybWFsID0gX25vcm1hbDtcclxuICAgICAgdGhpcy50YW5nZW50ID0gX3RhbmdlbnQ7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMuYm9uZXMgPSBfYm9uZXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXJyYXkgd2l0aCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHRvIHNlcnZlIGFzIGEge0BsaW5rIFZlcnRleH0tY2xvdWQuIFxyXG4gICAqIEFjY2Vzc29ycyB5aWVsZCBwb3NpdGlvbiBvciBub3JtYWwgYWxzbyBmb3IgdmVydGljZXMgcmVmZXJlbmNpbmcgb3RoZXIgdmVydGljZXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWZXJ0aWNlcyBleHRlbmRzIEFycmF5PFZlcnRleD4ge1xyXG4gICAgLy8gVE9ETzogdGhpcyBjbGFzcyBtYXkgYmVjb21lIG1vcmUgcG93ZXJmdWwgYnkgaGlkaW5nIHRoZSBhcnJheSBhbmQgYWRkIG1vcmUgc2VydmljZSBtZXRob2RzIGxpa2UgY2FsY3VsYXRpbmcgYm91bmRpbmcgYm94LCByYWRpdXMgZXRjLlxyXG4gICAgLy8gc2VlIGlmIGEgcHJveHkgb2YgdGhlIGFycmF5IGludGVyZmFjaW5nIFtdIHdvdWxkIGRvIGEgZ29vZCBqb2IgLT4gdGVzdGVkOiBwcm94eSBpcyBhYm91dCAyMCB0aW1lcyBzbG93ZXIhXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzdWJzZXQgb2YgdmVydGljZXMgdGhhdCBkbyBub3QgcmVmZXIgdG8gb3RoZXIgdmVydGljZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBvcmlnaW5hbHMoKTogQXJyYXk8VmVydGV4PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgcG9zaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXgucG9zaXRpb24gOiB0aGlzW3ZlcnRleC5yZWZlclRvXS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIG5vcm1hbCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWQsIHJlc29sdmluZyByZWZlcmVuY2VzIGJldHdlZW4gdmVydGljZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWwoX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXgubm9ybWFsIDogdGhpc1t2ZXJ0ZXgucmVmZXJUb10ubm9ybWFsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgdGFuZ2VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRhbmdlbnQoX2luZGV4OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgcmV0dXJuIHRoaXNbX2luZGV4XS50YW5nZW50OyAvLyB0YW5nZW50cyBjYW4gbm90IGJlIHNoYXJlZCBhcyB0aGV5IGFyZSBkZXBlbmRlbnQgb24gdGhlIHV2LWNvb3JkaW5hdGVzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSB1di1jb29yZGluYXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHV2KF9pbmRleDogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzW19pbmRleF0udXY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSBjb2xvciBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbG9yKF9pbmRleDogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICByZXR1cm4gdGhpc1tfaW5kZXhdLmNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgYm9uZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYm9uZXMoX2luZGV4OiBudW1iZXIpOiBCb25lW10ge1xyXG4gICAgICBsZXQgdmVydGV4OiBWZXJ0ZXggPSB0aGlzW19pbmRleF07XHJcbiAgICAgIHJldHVybiAodmVydGV4LnJlZmVyVG8gPT0gdW5kZWZpbmVkKSA/IHZlcnRleC5ib25lcyA6IHRoaXNbdmVydGV4LnJlZmVyVG9dLmJvbmVzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIFdlYkdMIHNoYWRlcnByb2dyYW0gZm9yIGEgcGFydGljbGUgc3lzdGVtLiBNYW5hZ2VkIGJ5IGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfS4gSXQgdXNlcyB7QGxpbmsgUGFydGljbGVTeXN0ZW0uZGF0YX0gdG8gZ2VuZXJhdGUgYW5kIGluamVjdCBjb2RlIGludG8gYSBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlIChHTFNMKSB0aHVzIGNyZWF0aW5nIGEgc2hhZGVyIHBhcnRpY2xlIHN5c3RlbSBmcm9tIGEgc3VwcGxpZWQge0BsaW5rIFNoYWRlcn1zIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZSBjb2RlLlxyXG4gICAqIEBhdXRob3IgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgU2hhZGVyUGFydGljbGVTeXN0ZW0gaW1wbGVtZW50cyBTaGFkZXJJbnRlcmZhY2Uge1xyXG4gICAgcHVibGljIGRhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW07XHJcbiAgICBwdWJsaWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcIlBBUlRJQ0xFXCJdO1xyXG4gICAgcHVibGljIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG4gICAgcHVibGljIGZyYWdtZW50U2hhZGVyU291cmNlOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIHB1YmxpYyBhdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICAgIHB1YmxpYyB1bmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyAvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJcIjsgLyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUHJvZ3JhbSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VQcm9ncmFtKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZVByb2dyYW0oKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFbmFibGVzIHRoaXMgbm9kZSB0byBhY2Nlc3MgdGhlIHdheXBvaW50IGdyaWQgZXN0YWJsaXNoZWQgdGhyb3VnaCB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9cyBhbmQgdGhlaXIge0BsaW5rIENvbm5lY3Rpb259cyxcclxuICAgKiBmaW5kIGEgcGF0aCB0aHJvdWdoIHRoZW0gYW5kIGV2ZW4gd2FsayBkb3duIHRoZSBwYXRoLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50V2Fsa2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRXYWxrZXIpO1xyXG4gICAgLyoqIFRoZSBzcGVlZCB0aGUgd2Fsa2VyIHNob3VsZCBtb3ZlIHdpdGguIENvcnJlc3BvbmRzIHRvIHVuaXRzL3MuICovXHJcbiAgICBwdWJsaWMgc3BlZWQ6IG51bWJlciA9IDE7XHJcbiAgICAvKiogSWYgdHJ1ZSwgbW92ZSB0aGUgbm9kZSB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0byB0aHJvdWdoIGZvcmNlcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHRocm91Z2ggdGhlIHRyYW5zZm9ybS4gUmVxdWlyZXMgYSBbW0NvbXBvbmVudFJpZ2lkYm9keV1dIGlmIHRydWUuICovXHJcbiAgICAvLyBwdWJsaWMgbW92ZVRocm91Z2hQaHlzaWNzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGtlZXBzIHRoZSBkYXRhIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgd2FsayAqL1xyXG4gICAgI3dhbGtEYXRhOiBXYWxrRGF0YSA9IHsgcGF0aDogW10sIHRvdGFsUHJvZ3Jlc3M6IC0xIH07XHJcbiAgICAvKioga2VlcHMgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSB3aGVuIHRoZSB3YWxrZXIgaGFzIHJlYWNoZWQgdGhlIGdvYWwgKi9cclxuICAgICNwcm9taXNlUmVzb2x2ZXJPbldhbGtGaW5pc2hlZDogKCkgPT4gdm9pZDtcclxuICAgIC8qKiBzdGF0dXMgb2Ygd2hldGhlciBpdCBzaG91bGQgcm90YXRlIHRoZSB3YWxrZXIgdG8gdGhlIHdhbGtpbmcgZGlyZWN0aW9uICovXHJcbiAgICAjcm90YXRlSW5XYWxrRGlyZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgIGlmIChQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy4jaGFuZGxlQXR0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy4jaGFuZGxlRGV0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgc3BlZWQ6IHRoaXMuc3BlZWRcclxuICAgICAgICAvLyBtb3ZlVGhyb3VnaFBoeXNpY3M6IHRoaXMubW92ZVRocm91Z2hQaHlzaWNzLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5zcGVlZCA9IF9zZXJpYWxpemF0aW9uLnNwZWVkO1xyXG4gICAgICAvLyB0aGlzLm1vdmVUaHJvdWdoUGh5c2ljcyA9IF9zZXJpYWxpemF0aW9uLm1vdmVUaHJvdWdoUGh5c2ljcztcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGVwb3J0cyAobW92ZXMgaW5zdGFudGx5KSB0byB0aGUgX3RhcmdldCBXYXlwb2ludC5cclxuICAgICAqIEBwYXJhbSBfdGFyZ2V0XHJcbiAgICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfdGFyZ2V0OiBXYXlwb2ludCk6IFByb21pc2U8dm9pZD47XHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSB3YWxrZXIgZnJvbSB0aGUgX3N0YXJ0IHRvIHRoZSBfZW5kIFdheXBvaW50LlxyXG4gICAgICogVGVsZXBvcnRzIChtb3ZlcyBpbnN0YW50bHkpIHRvIHRoZSBfc3RhcnQgcG9pbnQsIHRoZW4gbW92ZXMgdGhyb3VnaCB0aGUgd2F5cG9pbnQgY29ubmVjdGlvbnMgdG8gdGhlIF9lbmQgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0gX3N0YXJ0IFxyXG4gICAgICogQHBhcmFtIF9lbmRcclxuICAgICAqIEBwYXJhbSBfcm90YXRlIFJvdGF0ZXMgdGhlIHdhbGtlciB0byBsb29rIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHdheXBvaW50XHJcbiAgICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBfZW5kIHBvaW50IGlzIHJlYWNoZWQuIFJlamVjdHMgaWYgX2VuZCBjYW4ndCBiZSByZWFjaGVkIChubyBwYXRoIGZvdW5kKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfc3RhcnQ6IFdheXBvaW50LCBfZW5kOiBXYXlwb2ludCwgX3JvdGF0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfc3RhcnQ6IFdheXBvaW50LCBfZW5kPzogV2F5cG9pbnQsIF9yb3RhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoIV9zdGFydCkgcmV0dXJuO1xyXG4gICAgICBsZXQgdHJhbnNsYXRlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9zdGFydC5tdHhXb3JsZC50cmFuc2xhdGlvbiwgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZSh0cmFuc2xhdGUpO1xyXG4gICAgICBpZiAoIV9lbmQgfHwgX3N0YXJ0ID09PSBfZW5kKSB7XHJcbiAgICAgICAgdGhpcy4jd2Fsa0RhdGEgPSB7IHBhdGg6IFtdLCB0b3RhbFByb2dyZXNzOiAtMSB9O1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiNyb3RhdGVJbldhbGtEaXJlY3Rpb24gPSBfcm90YXRlO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIGxldCBwYXRoOiBQYXRoaW5nTm9kZVtdIHwgbnVsbCA9IHRoaXMuZ2V0UGF0aChfc3RhcnQsIF9lbmQpO1xyXG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgX3JlamVjdCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLiN3YWxrRGF0YSA9IHsgcGF0aCwgdG90YWxQcm9ncmVzczogMCB9O1xyXG4gICAgICAgIHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkID0gX3Jlc29sdmU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLiNyb3RhdGVJbldhbGtEaXJlY3Rpb24gJiYgdGhpcy4jd2Fsa0RhdGEucGF0aC5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgdGhpcy5yb3RhdGVUb3dhcmRzKHRoaXMuI3dhbGtEYXRhLnBhdGhbMF0ud2F5cG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRha2VzIGNhcmUgb2YgdGhlIG1vdmluZyBhbGdvcml0aG0gYnkgY2FsY3VsYXRpbmcgdGhlIG5leHQgc3RlcCBhbmQgbW92aW5nIGFsb25nIHRoaXMgc3RlcCAqL1xyXG4gICAgcHJvdGVjdGVkIG1vdmluZygpOiB2b2lkIHtcclxuICAgICAgLy8gYXJlIHdlIGN1cnJlbnRseSBtb3Zpbmc/XHJcbiAgICAgIGlmICh0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzIDwgMCB8fCB0aGlzLiN3YWxrRGF0YS5wYXRoLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICAgIC8vIGRvIHdlIGhhdmUgYSBjdXJyZW50IHBhdGggd2UgY2FuIGZvbGxvd1xyXG4gICAgICBsZXQgY3VycmVudFBhdGg6IFBhdGhpbmdOb2RlID0gdGhpcy4jd2Fsa0RhdGEucGF0aFt0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzXTtcclxuICAgICAgaWYgKCFjdXJyZW50UGF0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gaG93IGJpZyBvZiBhIHN0ZXAgYXJlIHdlIHRha2luZyB0aGlzIGZyYW1lP1xyXG4gICAgICBsZXQgZGVsdGE6IG51bWJlciA9IHRoaXMuc3BlZWQgKiBjdXJyZW50UGF0aC5wcmV2aW91c0Nvbm5lY3Rpb24uc3BlZWRNb2RpZmllciAqIExvb3AudGltZUZyYW1lR2FtZSAvIDEwMDA7XHJcbiAgICAgIC8vIGhvdyBmYXIgYXdheSBhcmUgd2UgZnJvbSB0aGUgbmV4dCB3YXlwb2ludD9cclxuICAgICAgbGV0IHN0ZXA6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoXHJcbiAgICAgICAgY3VycmVudFBhdGgud2F5cG9pbnQubXR4V29ybGQudHJhbnNsYXRpb24sXHJcbiAgICAgICAgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBsZXQgc3RlcFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09OU1RSVUNUSU9OKHN0ZXApO1xyXG4gICAgICAvLyBzdGVwUm90YXRpb24ucm90YXRlKHRoaXMubm9kZS5tdHhXb3JsZC5yb3RhdGlvbik7XHJcbiAgICAgIC8vIHN0ZXAgPSBzdGVwUm90YXRpb24udHJhbnNsYXRpb247XHJcblxyXG4gICAgICBsZXQgc2NhbGU6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoXHJcbiAgICAgICAgY3VycmVudFBhdGgud2F5cG9pbnQubXR4V29ybGQuc2NhbGluZyxcclxuICAgICAgICB0aGlzLm5vZGUubXR4V29ybGQuc2NhbGluZ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGRlbHRhICogZGVsdGEgPCBzdGVwLm1hZ25pdHVkZVNxdWFyZWQpIHsgLy8gd29uJ3QgcmVhY2ggbmV4dCB3YXlwb2ludCB5ZXQuIFVzaW5nIHNxdWFyZXMgYmVjYXVzZSB0aGF0J3MgZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBzcXJ0XHJcbiAgICAgICAgc3RlcC5ub3JtYWxpemUoZGVsdGEpO1xyXG4gICAgICAgIHRoaXMubm9kZS5tdHhMb2NhbC50cmFuc2xhdGUoc3RlcCwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChzY2FsZS5tYWduaXR1ZGVTcXVhcmVkID4gMCkge1xyXG4gICAgICAgICAgc2NhbGUubm9ybWFsaXplKGRlbHRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcgPSBWZWN0b3IzLlNVTShzY2FsZSwgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcpO1xyXG4gICAgICAgIC8vIHRoaXMubm9kZS5tdHhMb2NhbC5zY2FsZShWZWN0b3IzLlNVTShzY2FsZSwgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcpKTtcclxuICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBtb3ZlbWVudCB0aHJvdWdoIHBoeXNpY3NcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gcmVhY2hlZCBuZXh0IHBvaW50XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuV0FZUE9JTlRfUkVBQ0hFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IGN1cnJlbnRQYXRoLndheXBvaW50IH0pKTtcclxuICAgICAgKDxDb21wb25lbnRXYXlwb2ludD5jdXJyZW50UGF0aC53YXlwb2ludCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuV0FZUE9JTlRfUkVBQ0hFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHRoaXMgfSkpO1xyXG4gICAgICBcclxuICAgICAgbGV0IHRyYW5zbGF0ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbiwgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZSh0cmFuc2xhdGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcgPSBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC5zY2FsaW5nO1xyXG4gICAgICB0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzKys7XHJcblxyXG4gICAgICAvLyByZWFjaGVkIGZpbmFsIHBvaW50LCBmaW5pc2hlZCB3YWxraW5nXHJcbiAgICAgIGlmICh0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzID49IHRoaXMuI3dhbGtEYXRhLnBhdGgubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkKSB0aGlzLiNwcm9taXNlUmVzb2x2ZXJPbldhbGtGaW5pc2hlZCgpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuUEFUSElOR19DT05DTFVERUQsIHsgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiBjdXJyZW50UGF0aC53YXlwb2ludCB9KSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzaG91bGQgd2Ugcm90YXRlIHdhbGtlcj9cclxuICAgICAgaWYgKHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbikge1xyXG4gICAgICAgIHRoaXMucm90YXRlVG93YXJkcyh0aGlzLiN3YWxrRGF0YS5wYXRoW3RoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3NdLndheXBvaW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBmaW5kIHRoZSBwYXRoIGJldHdlZW4gdHdvIGdpdmVuIHdheXBvaW50cyAqL1xyXG4gICAgcHJvdGVjdGVkIGdldFBhdGgoX3N0YXJ0OiBXYXlwb2ludCwgX2VuZDogV2F5cG9pbnQpOiBQYXRoaW5nTm9kZVtdIHtcclxuICAgICAgLy8gVE9ETzogdXNlIGEgbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtIGxpa2UgQSogaW5zdGVhZCBvZiBEaWprc3RyYVxyXG4gICAgICAvLyBzZXR1cCB0aGUgZ3JhcGggb2YgcGF0aHMgYmFzZWQgb24gdGhlIHN0YXJ0IG5vZGVcclxuICAgICAgbGV0IHVudmlzaXRlZE5vZGVzOiBQYXRoaW5nTm9kZVtdID0gW107XHJcbiAgICAgIGxldCBwcm9jZXNzZWRXYXlwb2ludHM6IFdheXBvaW50W10gPSBbX3N0YXJ0XTtcclxuICAgICAgbGV0IHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaDogV2F5cG9pbnRbXSA9IFtfc3RhcnRdO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgbGV0IHdheXBvaW50OiBXYXlwb2ludCA9IHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaC5wb3AoKTtcclxuICAgICAgICBmb3IgKGxldCBjb25uZWN0aW9uIG9mIHdheXBvaW50LmNvbm5lY3Rpb25zKSB7XHJcbiAgICAgICAgICBpZiAoIXByb2Nlc3NlZFdheXBvaW50cy5pbmNsdWRlcyhjb25uZWN0aW9uLmVuZCkgJiYgY29ubmVjdGlvbi5zdGFydC5pc0FjdGl2ZSAmJiBjb25uZWN0aW9uLmVuZC5pc0FjdGl2ZSkge1xyXG4gICAgICAgICAgICB3YXlwb2ludHNUb1NlYXJjaFRocm91Z2gucHVzaChjb25uZWN0aW9uLmVuZCk7XHJcbiAgICAgICAgICAgIHByb2Nlc3NlZFdheXBvaW50cy5wdXNoKGNvbm5lY3Rpb24uZW5kKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdW52aXNpdGVkTm9kZXMucHVzaCh7IHdheXBvaW50LCBkaXN0YW5jZTogd2F5cG9pbnQgPT09IF9zdGFydCA/IDAgOiBJbmZpbml0eSwgcHJldmlvdXM6IG51bGwsIHByZXZpb3VzQ29ubmVjdGlvbjogbnVsbCB9KTtcclxuICAgICAgfSB3aGlsZSAod2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgLy8gZG8gdGhlIGRpamtzdHJhXHJcbiAgICAgIHdoaWxlICh1bnZpc2l0ZWROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdW52aXNpdGVkTm9kZXMuc29ydCgoX2E6IFBhdGhpbmdOb2RlLCBfYjogUGF0aGluZ05vZGUpID0+IF9hLmRpc3RhbmNlIC0gX2IuZGlzdGFuY2UpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTogUGF0aGluZ05vZGUgPSB1bnZpc2l0ZWROb2Rlcy5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS53YXlwb2ludCA9PT0gX2VuZCkgcmV0dXJuIHRoaXMucGF0aGluZ05vZGVUb1BhdGgoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb24gb2YgY3VycmVudE5vZGUud2F5cG9pbnQuY29ubmVjdGlvbnMpIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3Rpb25Vc2FibGUoY29uKSkgY29udGludWU7XHJcbiAgICAgICAgICBsZXQgZW5kTm9kZTogUGF0aGluZ05vZGUgPSB1bnZpc2l0ZWROb2Rlcy5maW5kKF9uID0+IF9uLndheXBvaW50ID09PSBjb24uZW5kKTtcclxuICAgICAgICAgIGlmICghZW5kTm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICBsZXQgbmV3RGlzdGFuY2U6IG51bWJlciA9IGN1cnJlbnROb2RlLmRpc3RhbmNlICsgdGhpcy5jYWxjdWxhdGVDb25uZWN0aW9uQ29zdChjb24pO1xyXG4gICAgICAgICAgaWYgKG5ld0Rpc3RhbmNlID49IGVuZE5vZGUuZGlzdGFuY2UpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgZW5kTm9kZS5kaXN0YW5jZSA9IG5ld0Rpc3RhbmNlO1xyXG4gICAgICAgICAgZW5kTm9kZS5wcmV2aW91cyA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgZW5kTm9kZS5wcmV2aW91c0Nvbm5lY3Rpb24gPSBjb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIGEgY29ubmVjdGlvbiBpcyB1c2FibGUgYnkgdGhpcyBzcGVjaWZpYyB3YWxrZXIuXHJcbiAgICAgKiAqKkFsd2F5cyByZXR1cm5zIHRydWUsIHVubGVzcyBvdmVyd3JpdHRlbiBpbiBhIGN1c3RvbSBXYWxrZXIgc3ViY2xhc3MuKipcclxuICAgICAqIENhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgcGF0aGZpbmRpbmcgYWxnb3JpdGhtIGZvciBjdXN0b20gd2F5cG9pbnQgLyBjb25uZWN0aW9uIHN5c3RlbXMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvbm5lY3Rpb24gQSBjb25uZWN0aW9uIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHVzYWJsZSBieSB0aGlzIHdhbGtlciwgZmFsc2UgaWYgbm90XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBpc0Nvbm5lY3Rpb25Vc2FibGUoX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBuZXcgZGlzdGFuY2UgYmFzZWQgb24gYSBjb25uZWN0aW9uLlxyXG4gICAgICogKipBbHdheXMgcmV0dXJucyB0aGUgcGxhaW4gY29ubmVjdGlvbnMgY29zdCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gYSBjdXN0b20gd2Fsa2VyIHN1YmNsYXNzLioqXHJcbiAgICAgKiBDYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgdGhlIHBhdGhmaW5kaW5nIGFsZ29yaXRobSBmb3IgY3VzdG9tIHdheXBvaW50IC8gY29ubmVjdGlvbiBzeXN0ZW1zLlxyXG4gICAgICogQHBhcmFtIF9jb25uZWN0aW9uIEEgY29ubmVjdGlvbiB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMgdGhlIGFtb3VudCBvZiBjb3N0IGEgY29ubmVjdGlvbiBlbmN1cnMgdG8gdGhlIGN1cnJlbnQgd2Fsa2VyIG9yIDAgaWYgY29zdCBpcyBuZWdhdGl2ZS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUNvbm5lY3Rpb25Db3N0KF9jb25uZWN0aW9uOiBDb25uZWN0aW9uKTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9jb25uZWN0aW9uLmNvc3QgPj0gMClcclxuICAgICAgICByZXR1cm4gX2Nvbm5lY3Rpb24uY29zdDtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXRoaW5nTm9kZVRvUGF0aChfbm9kZTogUGF0aGluZ05vZGUpOiBQYXRoaW5nTm9kZVtdIHtcclxuICAgICAgbGV0IHBhdGg6IFBhdGhpbmdOb2RlW10gPSBbXTtcclxuICAgICAgaWYgKCFfbm9kZSkgcmV0dXJuIHBhdGg7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBwYXRoLnB1c2goX25vZGUpO1xyXG4gICAgICAgIF9ub2RlID0gX25vZGUucHJldmlvdXM7XHJcbiAgICAgIH0gd2hpbGUgKF9ub2RlPy5wcmV2aW91cyk7XHJcbiAgICAgIHJldHVybiBwYXRoLnJldmVyc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJvdGF0ZVRvd2FyZHMoX3dheXBvaW50OiBXYXlwb2ludCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4TG9vazogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uLCBfd2F5cG9pbnQubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwucm90YXRpb24gPSBtdHhMb29rLnJvdGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVBdHRhY2goKTogdm9pZCB7XHJcbiAgICAgIExvb3AuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5MT09QX0ZSQU1FLCB0aGlzLm1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAjaGFuZGxlRGV0YWNoKCk6IHZvaWQge1xyXG4gICAgICBMb29wLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTE9PUF9GUkFNRSwgdGhpcy5tb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIG1hbmFnZSBwYXRoaW5nIGRhdGEgaW5zaWRlIHRoZSBXYWxrZXJcclxuICAgKi9cclxuICBpbnRlcmZhY2UgUGF0aGluZ05vZGUge1xyXG4gICAgd2F5cG9pbnQ6IFdheXBvaW50O1xyXG4gICAgZGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHByZXZpb3VzOiBQYXRoaW5nTm9kZTtcclxuICAgIHByZXZpb3VzQ29ubmVjdGlvbjogQ29ubmVjdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGludGVybmFsIGludGVyZmFjZSB0byBtYW5hZ2UgdGhlIGRhdGEgb2YgdGhlIGN1cnJlbnRseSB3YWxrZWQgcGF0aFxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBXYWxrRGF0YSB7XHJcbiAgICBwYXRoOiBQYXRoaW5nTm9kZVtdO1xyXG4gICAgdG90YWxQcm9ncmVzczogbnVtYmVyO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBVbmlmaWVzIFdheXBvaW50cyBvZiB0aGUgcGF0aGluZyBhbGdvcml0aG1zXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgV2F5cG9pbnQge1xyXG4gICAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXTtcclxuICAgIG10eExvY2FsOiBNYXRyaXg0eDQ7XHJcbiAgICBtdHhXb3JsZDogTWF0cml4NHg0O1xyXG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgcG9zaXRpb24gdGhhdCBhIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IGNhbiB1c2UgYXMgYSB0YXJnZXQgcG9pbnQuXHJcbiAgICogSW1wbGVtZW50cyB7QGxpbmsgV2F5cG9pbnR9LlxyXG4gICAqIFJlZ2lzdGVycyBpdHNlbGYgdG8gYSBzdGF0aWMgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHdheXBvaW50c1xyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50V2F5cG9pbnQgZXh0ZW5kcyBDb21wb25lbnQgaW1wbGVtZW50cyBXYXlwb2ludCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3ModGhpcyk7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgI3dheXBvaW50czogQ29tcG9uZW50V2F5cG9pbnRbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBtdHhMb2NhbDogTWF0cml4NHg0O1xyXG5cclxuICAgICNjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbXR4SW5pdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCksIF9jb25uZWN0aW9uczogQ29ubmVjdGlvbltdID0gW10pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMgPSBfY29ubmVjdGlvbnM7XHJcbiAgICAgIHRoaXMubXR4TG9jYWwgPSBfbXR4SW5pdDtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuI2hhbmRsZUF0dGFjaC5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuI2hhbmRsZURldGFjaC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWxsIHRoZSB3YXlwb2ludHMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBpbiB0aGUgc2NlbmUuICoqRG8gbm90IGVkaXQsIHRyZWF0IGFzIHJlYWRvbmx5ISoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB3YXlwb2ludHMoKTogQ29tcG9uZW50V2F5cG9pbnRbXSB7XHJcbiAgICAgIHJldHVybiBDb21wb25lbnRXYXlwb2ludC4jd2F5cG9pbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaG9ydGhhbmQgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9c1xyXG4gICAgICogQHBhcmFtIF9zdGFydCBUaGUge0BsaW5rIENvbXBvbmVudFdheXBvaW50fSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uLlxyXG4gICAgICogQHBhcmFtIF9lbmQgVGhlIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gdG8gd2hpY2ggdGhlIGNvbm5lY3Rpb24gbGVhZHMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvc3QgVGhlIGNvc3Qgb2YgdGhlIGNvbm5lY3Rpb24uIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbGVzcyBsaWtlbHkgaXQgaXMgdG8gYmUgdGFrZW4uIENhbm5vdCBiZSBuZWdhdGl2ZS5cclxuICAgICAqIEBwYXJhbSBfc3BlZWRNb2RpZmllciBIb3cgZmFzdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgd2Fsa2VkIG9uLiBEZWZhdWx0cyB0byAxXHJcbiAgICAgKiBAcGFyYW0gX2JvdGhXYXlzIElmIHRydWUsIGNyZWF0ZXMgYSBjb25uZWN0aW9uIGluIGJvdGggZGlyZWN0aW9ucy4gRGVmYXVsdDogZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRDb25uZWN0aW9uKF9zdGFydDogQ29tcG9uZW50V2F5cG9pbnQsIF9lbmQ6IENvbXBvbmVudFdheXBvaW50LCBfY29zdDogbnVtYmVyLCBfc3BlZWRNb2RpZmllcjogbnVtYmVyID0gMSwgX2JvdGhXYXlzOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgX3N0YXJ0LmFkZENvbm5lY3Rpb24oeyBjb3N0OiBfY29zdCwgZW5kOiBfZW5kLCBzdGFydDogX3N0YXJ0LCBzcGVlZE1vZGlmaWVyOiBfc3BlZWRNb2RpZmllciB9KTtcclxuICAgICAgaWYgKF9ib3RoV2F5cylcclxuICAgICAgICBfZW5kLmFkZENvbm5lY3Rpb24oeyBjb3N0OiBfY29zdCwgZW5kOiBfc3RhcnQsIHN0YXJ0OiBfZW5kLCBzcGVlZE1vZGlmaWVyOiBfc3BlZWRNb2RpZmllciB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBDb25uZWN0aW9uW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBjdXJyZW50IHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBXYXlwb2ludC4gUmV0dXJucyBhIG5ldyBNYXRyaXggd2l0aG91dCBjb25uZWN0aW9uIHRvIHRoZSBXYXlwb2ludCAqL1xyXG4gICAgcHVibGljIGdldCBtdHhXb3JsZCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5tdHhMb2NhbCwgdGhpcy5ub2RlLm10eFdvcmxkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkcyBhIG5ldyB7QGxpbmsgQ29ubmVjdGlvbn0gdG8gdGhpcyB3YXlwb2ludCAqL1xyXG4gICAgcHVibGljIGFkZENvbm5lY3Rpb24oX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMucHVzaChfY29ubmVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlbW92ZXMgYSB7QGxpbmsgQ29ubmVjdGlvbn0gZnJvbSB0aGlzIHdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29ubmVjdGlvbihfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuI2Nvbm5lY3Rpb25zLmluZGV4T2YoX2Nvbm5lY3Rpb24pO1xyXG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcbiAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBtYXRyaXg6IHRoaXMubXR4TG9jYWwuc2VyaWFsaXplKCksXHJcbiAgICAgICAgY29ubmVjdGlvbnM6IHRoaXMuI2Nvbm5lY3Rpb25zLm1hcChfY29uID0+IHtcclxuICAgICAgICAgIGxldCBjb25uZWN0aW9uOiBTZXJpYWxpemVkQ29ubmVjdGlvbiA9IHsgY29zdDogX2Nvbi5jb3N0LCBlbmQ6IF9jb24uZW5kLCBzcGVlZE1vZGlmaWVyOiBfY29uLnNwZWVkTW9kaWZpZXIgfTtcclxuICAgICAgICAgIGlmIChjb25uZWN0aW9uLmVuZCBpbnN0YW5jZW9mIENvbXBvbmVudFdheXBvaW50KSB7XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uZW5kID0gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgY29ubmVjdGlvbi5lbmQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XHJcbiAgICAgICAgfSlcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdHhMb2NhbC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5tYXRyaXgpO1xyXG4gICAgICBjb25zdCBobmROb2RlRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLiNjb25uZWN0aW9ucyA9IF9zZXJpYWxpemF0aW9uLmNvbm5lY3Rpb25zLm1hcCgoX2NvbjogU2VyaWFsaXplZENvbm5lY3Rpb24pID0+IHtcclxuICAgICAgICAgIGxldCBjb25uZWN0aW9uOiBDb25uZWN0aW9uID0geyBjb3N0OiBfY29uLmNvc3QsIGVuZDogdGhpcy5zZXJpYWxpemVkV2F5cG9pbnRUb1dheXBvaW50KF9jb24uZW5kKSwgc3BlZWRNb2RpZmllcjogX2Nvbi5zcGVlZE1vZGlmaWVyLCBzdGFydDogdGhpcyB9O1xyXG4gICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IHNjYWxlVmVjdG9yOiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLk9ORSgpLCAwLjEpO1xyXG4gICAgICBsZXQgbXR4OiBNYXRyaXg0eDQgPSB0aGlzLm10eFdvcmxkO1xyXG4gICAgICBHaXptb3MuZHJhd1NwaGVyZShNYXRyaXg0eDQuQ09NUE9TSVRJT04obXR4LnRyYW5zbGF0aW9uLCBWZWN0b3IzLlpFUk8oKSwgc2NhbGVWZWN0b3IpLCBDb2xvci5DU1MoXCJvcmFuZ2VcIikpO1xyXG4gICAgICAvLyByZXR1cm47XHJcbiAgICAgIGxldCBsaW5lczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNvbm5lY3Rpb24gb2YgdGhpcy5jb25uZWN0aW9ucykge1xyXG4gICAgICAgIC8vIGlmIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50IGFyZSBvbiB0aGUgc2FtZSBwb2ludCwgZG9uJ3QgZHJhdyBsaW5lLlxyXG4gICAgICAgIGxldCB0bXBNdHg6IE1hdHJpeDR4NCA9IGNvbm5lY3Rpb24uZW5kLm10eFdvcmxkLmNsb25lO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb25WZWN0b3I6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UobXR4LnRyYW5zbGF0aW9uLCB0bXBNdHgudHJhbnNsYXRpb24pO1xyXG4gICAgICAgIGlmIChkaXJlY3Rpb25WZWN0b3IubWFnbml0dWRlU3F1YXJlZCA9PT0gMCkgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIGlmIG9uZSBvZiB0aGUgd2F5cG9pbnRzIGlzIGluYWN0aXZlLCBkb24ndCBkcmF3IGdpem1vc1xyXG4gICAgICAgIGlmICghY29ubmVjdGlvbi5lbmQuaXNBY3RpdmUgfHwgIWNvbm5lY3Rpb24uc3RhcnQuaXNBY3RpdmUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBhY3R1YWwgbGluZVxyXG4gICAgICAgIGxpbmVzLnB1c2gobXR4LnRyYW5zbGF0aW9uKTtcclxuICAgICAgICBsaW5lcy5wdXNoKHRtcE10eC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIC8vIGFycm93IGhlYWRzXHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbk10eDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odG1wTXR4LnRyYW5zbGF0aW9uLCBkaXJlY3Rpb25WZWN0b3IpO1xyXG4gICAgICAgIGRpcmVjdGlvbk10eC5zY2FsZShzY2FsZVZlY3Rvcik7XHJcbiAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShkaXJlY3Rpb25NdHgsIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICAgIH1cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhsaW5lcywgTWF0cml4NHg0LklERU5USVRZKCksIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGhlbHAgdGhlIGRlc2VyaWFsaXphenRpb24gcHJvY2Vzcy4gKi9cclxuICAgIHByaXZhdGUgc2VyaWFsaXplZFdheXBvaW50VG9XYXlwb2ludChfcG9pbnQ6IHN0cmluZyB8IFdheXBvaW50KTogV2F5cG9pbnQge1xyXG4gICAgICBpZiAodHlwZW9mIF9wb2ludCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIF9wb2ludDtcclxuICAgICAgcmV0dXJuIE5vZGUuRklORCh0aGlzLCBfcG9pbnQpIGFzIENvbXBvbmVudFdheXBvaW50O1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVBdHRhY2goKTogdm9pZCB7XHJcbiAgICAgIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAjaGFuZGxlRGV0YWNoKCk6IHZvaWQge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMuaW5kZXhPZih0aGlzKTtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICBDb21wb25lbnRXYXlwb2ludC4jd2F5cG9pbnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBEZWZpbmVzIGEgQ29ubmVjdGlvbiBpbiB0aGUgd2F5IGl0J3Mgc2VyaWFsaXplZCBpbiByZXNvdXJjZXMgQGludGVybmFsICovXHJcbiAgaW50ZXJmYWNlIFNlcmlhbGl6ZWRDb25uZWN0aW9uIHtcclxuICAgIGVuZDogV2F5cG9pbnQgfCBzdHJpbmc7XHJcbiAgICBjb3N0OiBudW1iZXI7XHJcbiAgICBzcGVlZE1vZGlmaWVyOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEgZGlyZWN0ZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB3YXlwb2ludHNcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICAgIC8qKiBUaGUgc3RhcnQgLyBvcmlnaW4gd2F5cG9pbnQgb2YgdGhpcyBjb25uZWN0aW9uLiAqL1xyXG4gICAgc3RhcnQ6IFdheXBvaW50O1xyXG4gICAgLyoqIFRoZSBlbmQgLyB0YXJnZXQgd2F5cG9pbnQgb2YgdGhpcyBjb25uZWN0aW9uLiAqL1xyXG4gICAgZW5kOiBXYXlwb2ludDtcclxuICAgIC8qKiBUaGUgY29zdCBvZiB0aGUgY29ubmVjdGlvbiwgdGhlIGhpZ2hlciB0aGUgbGVzcyBsaWtlbHkgdG8gYmUgdGFrZW4uIENhbm5vdCBiZSBuZWdhdGl2ZS4gKi9cclxuICAgIGNvc3Q6IG51bWJlcjtcclxuICAgIC8qKiBNb2RpZmllcyB0aGUgc3BlZWQgdGhhdCBhIHdhbGtlciBjYW4gd2FsayBwYXN0IHRoaXMgY29ubmVjdGlvbiBieSBtdWx0aXBseWluZyB0aGUgc3BlZWQgd2l0aCB0aGlzIHZhbHVlLiBOZWVkcyB0byBiZSA+MCAqL1xyXG4gICAgc3BlZWRNb2RpZmllcjogbnVtYmVyO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGF1dG9tYXRpYyBhZGp1c3RtZW50IG9mIHRoZSBjb2xsaWRlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEJPRFlfSU5JVCB7XHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyB0aGUgcGl2b3Qgb2YgdGhlIG1lc2ggZm9yIGluaXRpbGlhbGl6YXRpb24gKi9cclxuICAgIFRPX01FU0gsXHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyB0aGUgdHJhbnNmb3JtIG9mIHRoZSBub2RlIGZvciBpbml0aWxpYWxpemF0aW9uICovXHJcbiAgICBUT19OT0RFLFxyXG4gICAgLyoqIENvbGxpZGVyIHVzZXMgaXRzIG93biBwaXZvdCBmb3IgaW5pdGlsaWFsaXphdGlvbiAqL1xyXG4gICAgVE9fUElWT1RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdHMgYXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgTm9kZX0gaXQncyBhdHRhY2hlZCB0by5cclxuICAgKiBJdCdzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIEZVREdFIHJlbmRlcmVkIHdvcmxkIGFuZCB0aGUgUGh5c2ljcyB3b3JsZC5cclxuICAgKiBGb3IgdGhlIHBoeXNpY3MgdG8gY29ycmVjdGx5IGdldCB0aGUgdHJhbnNmb3JtYXRpb25zIHJvdGF0aW9ucyBuZWVkIHRvIGJlIGFwcGxpZWQgd2l0aCBmcm9tIGxlZnQgPSB0cnVlLlxyXG4gICAqIE9yIHJvdGF0aW9ucyBuZWVkIHRvIGhhcHBlbiBiZWZvcmUgc2NhbGluZy5cclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFJpZ2lkYm9keSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuICAgIHByaXZhdGUgc3RhdGljIG1hcEJvZHlUeXBlOiB7IFt0eXBlOiBudW1iZXJdOiBudW1iZXIgfSA9ICh0eXBlb2YgT0lNTyA9PSBcInVuZGVmaW5lZFwiKSA/XHJcbiAgICAgIHtcclxuICAgICAgICBbQk9EWV9UWVBFLkRZTkFNSUNdOiBCT0RZX1RZUEUuRFlOQU1JQywgW0JPRFlfVFlQRS5TVEFUSUNdOiBCT0RZX1RZUEUuU1RBVElDLCBbQk9EWV9UWVBFLktJTkVNQVRJQ106IEJPRFlfVFlQRS5LSU5FTUFUSUNcclxuICAgICAgfSA6IHtcclxuICAgICAgICBbQk9EWV9UWVBFLkRZTkFNSUNdOiBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQywgW0JPRFlfVFlQRS5TVEFUSUNdOiBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDLCBbQk9EWV9UWVBFLktJTkVNQVRJQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5LSU5FTUFUSUNcclxuICAgICAgfTtcclxuXHJcbiAgICAvKiogVHJhbnNmb3JtYXRpb24gb2YgdGhlIGNvbGxpZGVyIHJlbGF0aXZlIHRvIHRoZSBub2RlJ3MgdHJhbnNmb3JtLiBPbmNlIHNldCBtb3N0bHkgcmVtYWlucyBjb25zdGFudC4gXHJcbiAgICAgKiBJZiBhbHRlcmVkLCB7QGxpbmsgaXNJbml0aWFsaXplZH0gbXVzdCBiZSByZXNldCB0byBmYWxzZSB0byByZWNyZWF0ZSB0aGUgY29sbGlkZXIgaW4gdGhlIG5leHQge0BsaW5rIFJlbmRlci5wcmVwYXJlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFZlcnRpY2VzIHRoYXQgYnVpbGQgYSBjb252ZXggbWVzaCAoZm9ybSB0aGF0IGlzIGluIGl0c2VsZiBjbG9zZWQpLiBOZWVkcyB0byBzZXQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgcmIgaWYgbm9uZSBvZiB0aGUgc3RhbmRhcmQgY29sbGlkZXJzIGlzIHVzZWQuIFxyXG4gICAgICogVW50ZXN0ZWQgYW5kIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkIGJ5IHNlcmlhbGl6YXRpb24gYW5kIG11dGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udmV4TWVzaDogRmxvYXQzMkFycmF5ID0gbnVsbDtcclxuXHJcbiAgICAvKiogQ29sbGlzaW9ucyB3aXRoIHJpZ2lkYm9kaWVzIGhhcHBlbmluZyB0byB0aGlzIGJvZHksIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgY3VzdG9tIG9uQ29sbGlzaW9uU3RheSBmdW5jdGlvbmFsaXR5LiAqL1xyXG4gICAgcHVibGljIGNvbGxpc2lvbnM6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcbiAgICAvKiogVHJpZ2dlcnMgdGhhdCBhcmUgY3VycmVudGx5IHRyaWdnZXJpbmcgdGhpcyBib2R5ICovXHJcbiAgICBwdWJsaWMgdHJpZ2dlcmluZ3M6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogVGhlIGdyb3VwcyB0aGlzIG9iamVjdCBjb2xsaWRlcyB3aXRoLiBHcm91cHMgbXVzdCBiZSB3cml0ZW4gaW4gZm9ybSBvZlxyXG4gICAgICogIGUuZy4gY29sbGlzaW9uTWFzayA9IHtAbGluayBDT0xMSVNJT05fR1JPVVAuREVGQVVMVH0gfCB7QGxpbmsgQ09MTElTSU9OX0dST1VQfS4uLi4gYW5kIHNvIG9uIHRvIGNvbGxpZGUgd2l0aCBtdWx0aXBsZSBncm91cHMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uTWFzazogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEF1dG9tYXRpYyBhZGp1c3RtZW50IG9mIHRoZSBwaXZvdCB3aGVuIHtAbGluayBSZW5kZXIucHJlcGFyZX0gaXMgY2FsbGVkIGFjY29yZGluZyB0byB7QGxpbmsgQk9EWV9JTklUfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6YXRpb246IEJPRFlfSU5JVCA9IEJPRFlfSU5JVC5UT19QSVZPVDtcclxuICAgIC8qKiBNYXJrcyBpZiBjb2xsaWRlciB3YXMgaW5pdGlhbGl6ZWQuIFJlc2V0IHRvIGZhbHNlIHRvIGluaXRpYWxpemUgYWdhaW4gZS5nLiBhZnRlciBtYW5pcHVsYXRpb24gb2YgbXR4UGl2b3QgKi9cclxuICAgIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIElEIHRvIHJlZmVyZW5jZSB0aGlzIHNwZWNpZmljIENvbXBvbmVudFJpZ2lkYm9keSAqL1xyXG4gICAgI2lkOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vUHJpdmF0ZSBpbmZvcm1hdGlvbnMgLSBNb3N0bHkgT2ltb1BoeXNpY3MgdmFyaWFibGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkIHRvIHRoZSBGVURHRSBVc2VyIGFuZCBtYW5pcHVsYXRlZCBieSB0aGVtXHJcbiAgICAjY29sbGlkZXI6IE9JTU8uU2hhcGU7XHJcbiAgICAjY29sbGlkZXJJbmZvOiBPSU1PLlNoYXBlQ29uZmlnO1xyXG4gICAgI2NvbGxpc2lvbkdyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVDtcclxuICAgICN0eXBlQ29sbGlkZXI6IENPTExJREVSX1RZUEUgPSBDT0xMSURFUl9UWVBFLkNVQkU7XHJcblxyXG4gICAgI3JpZ2lkYm9keTogT0lNTy5SaWdpZEJvZHk7XHJcbiAgICAjcmlnaWRib2R5SW5mbzogT0lNTy5SaWdpZEJvZHlDb25maWcgPSBuZXcgT0lNTy5SaWdpZEJvZHlDb25maWcoKTtcclxuICAgICN0eXBlQm9keTogQk9EWV9UWVBFID0gQk9EWV9UWVBFLkRZTkFNSUM7XHJcblxyXG4gICAgI21hc3NEYXRhOiBPSU1PLk1hc3NEYXRhID0gbmV3IE9JTU8uTWFzc0RhdGEoKTtcclxuICAgICNyZXN0aXR1dGlvbjogbnVtYmVyO1xyXG4gICAgI2ZyaWN0aW9uOiBudW1iZXI7XHJcbiAgICAjZGFtcGluZ0xpbmVhcjogbnVtYmVyID0gMC4xO1xyXG4gICAgI2RhbXBpbmdBbmd1bGFyOiBudW1iZXIgPSAwLjE7XHJcbiAgICAjZWZmZWN0Um90YXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgpO1xyXG4gICAgI2VmZmVjdEdyYXZpdHk6IG51bWJlciA9IDE7XHJcbiAgICAjaXNUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAjbXR4UGl2b3RVbnNjYWxlZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAjbXR4UGl2b3RJbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICAjY2FsbGJhY2tzOiBPSU1PLkNvbnRhY3RDYWxsYmFjazsgLy9DYWxsYmFjayBNZXRob2RzIHdoZW4gd2l0aGluIHRoZSBvaW1vU3lzdGVtIGEgZXZlbnQgaXMgaGFwcGVuaW5nXHJcblxyXG4gICAgLy8gI3BoeXNpY3M6IFBoeXNpY3M7IC8vVE9ETzoga2VlcCBhIHBvaW50ZXIgdG8gdGhlIHBoeXNpY3MgaW5zdGFuY2UgdXNlZCBieSB0aGlzIGNvbXBvbmVudFxyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIG5ldyByaWdpZGJvZHkgd2l0aCBhIHdlaWdodCBpbiBrZywgYSBwaHlzaWNzIHR5cGUgKGRlZmF1bHQgPSBkeW5hbWljKSwgYSBjb2xsaWRlciB0eXBlIHdoYXQgcGh5c2ljYWwgZm9ybSBoYXMgdGhlIGNvbGxpZGVyLCB0byB3aGF0IGdyb3VwIGRvZXMgaXQgYmVsb25nLCBpcyB0aGVyZSBhIHRyYW5zZm9ybSBNYXRyaXggdGhhdCBzaG91bGQgYmUgdXNlZCwgYW5kIGlzIHRoZSBjb2xsaWRlciBkZWZpbmVkIGFzIGEgZ3JvdXAgb2YgcG9pbnRzIHRoYXQgcmVwcmVzZW50IGEgY29udmV4IG1lc2guICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX21hc3M6IG51bWJlciA9IDEsIF90eXBlOiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0ID0gbnVsbCwgX2NvbnZleE1lc2g6IEZsb2F0MzJBcnJheSA9IG51bGwpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX21hc3MsIF90eXBlLCBfY29sbGlkZXJUeXBlLCBfZ3JvdXAsIF9tdHhUcmFuc2Zvcm0sIF9jb252ZXhNZXNoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIEFjY2Vzc29yc1xyXG4gICAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSBnZW9tZXRyaWNhbCByZWxhdGlvbnNoaXAgb2Ygbm9kZSBhbmQgY29sbGlkZXIgYnkge0BsaW5rIFJlbmRlcn0qL1xyXG4gICAgcHVibGljIGdldCBtdHhQaXZvdEludmVyc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eFBpdm90SW52ZXJzZTtcclxuICAgIH1cclxuICAgIC8qKiBVc2VkIGZvciBjYWxjdWxhdGlvbiBvZiB0aGUgZ2VvbWV0cmljYWwgcmVsYXRpb25zaGlwIG9mIG5vZGUgYW5kIGNvbGxpZGVyIGJ5IHtAbGluayBSZW5kZXJ9Ki9cclxuICAgIHB1YmxpYyBnZXQgbXR4UGl2b3RVbnNjYWxlZCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4UGl2b3RVbnNjYWxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmV0cmlldmUgdGhlIGJvZHkgdHlwZS4gU2VlIHtAbGluayBCT0RZX1RZUEV9ICovXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGVCb2R5KCk6IEJPRFlfVFlQRSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0eXBlQm9keTtcclxuICAgIH1cclxuICAgIC8qKiBTZXQgdGhlIGJvZHkgdHlwZS4gU2VlIHtAbGluayBCT0RZX1RZUEV9ICovXHJcbiAgICBwdWJsaWMgc2V0IHR5cGVCb2R5KF92YWx1ZTogQk9EWV9UWVBFKSB7XHJcbiAgICAgIHRoaXMuI3R5cGVCb2R5ID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0VHlwZShDb21wb25lbnRSaWdpZGJvZHkubWFwQm9keVR5cGVbdGhpcy4jdHlwZUJvZHldKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTsgLy9oYXZlIHRvIHJlc2V0IG1hc3MgYWZ0ZXIgY2hhbmdpbmcgdGhlIHR5cGUsIHNpbmNlIE9pbW8gaXMgaGFuZGxpbmcgbWFzcyBpbnRlcm5hbGx5IHdyb25nIHdoZW4gc3dpdGNoaW5nIHR5cGVzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgd29ybGQuIERlZmF1bHQgaXMgYSBDdWJlLiAqL1xyXG4gICAgcHVibGljIGdldCB0eXBlQ29sbGlkZXIoKTogQ09MTElERVJfVFlQRSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0eXBlQ29sbGlkZXI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHR5cGVDb2xsaWRlcihfdmFsdWU6IENPTExJREVSX1RZUEUpIHtcclxuICAgICAgaWYgKF92YWx1ZSAhPSB0aGlzLiN0eXBlQ29sbGlkZXIgJiYgdGhpcy4jcmlnaWRib2R5ICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLiN0eXBlQ29sbGlkZXIgPSBfdmFsdWU7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGNvbGxpc2lvbiBncm91cCB0aGlzIHtAbGluayBOb2RlfSBiZWxvbmdzIHRvIGl0J3MgdGhlIGRlZmF1bHQgZ3JvdXAgbm9ybWFsbHkgd2hpY2ggbWVhbnMgaXQgcGh5c2ljYWxseSBjb2xsaWRlcyB3aXRoIGV2ZXJ5IGdyb3VwIGJlc2lkZXMgdHJpZ2dlci4gKi9cclxuICAgIHB1YmxpYyBnZXQgY29sbGlzaW9uR3JvdXAoKTogQ09MTElTSU9OX0dST1VQIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbGxpc2lvbkdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBjb2xsaXNpb25Hcm91cChfdmFsdWU6IENPTExJU0lPTl9HUk9VUCkge1xyXG4gICAgICB0aGlzLiNjb2xsaXNpb25Hcm91cCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5zZXRDb2xsaXNpb25Hcm91cCh0aGlzLiNjb2xsaXNpb25Hcm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1hcmtpbmcgdGhlIEJvZHkgYXMgYSB0cmlnZ2VyIHRoZXJlZm9yZSBub3QgaW5mbHVlbmNpbmcgdGhlIGNvbGxpc2lvbiBzeXN0ZW0gYnV0IG9ubHkgc2VuZGluZyB0cmlnZ2VyRXZlbnRzICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzVHJpZ2dlcigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2lzVHJpZ2dlcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaXNUcmlnZ2VyKF92YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLiNpc1RyaWdnZXIgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmdldE9pbW9SaWdpZGJvZHkoKSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5nZXRPaW1vUmlnaWRib2R5KCkuX2lzVHJpZ2dlciA9IHRoaXMuI2lzVHJpZ2dlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGh5c2ljYWwgd2VpZ2h0IG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXNzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0TWFzcygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0aW5nIHRoZSBwaHlzaWNhbCB3ZWlnaHQgb2YgdGhlIHtAbGluayBOb2RlfSBpbiBrZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1hc3MoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWFzc0RhdGEubWFzcyA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMubm9kZSAhPSBudWxsKVxyXG4gICAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkgIT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRNYXNzRGF0YSh0aGlzLiNtYXNzRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERyYWcgb2YgbGluZWFyIG1vdmVtZW50LiBBIEJvZHkgZG9lcyBzbG93IGRvd24gZXZlbiBvbiBhIHN1cmZhY2Ugd2l0aG91dCBmcmljdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGFtcFRyYW5zbGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0TGluZWFyRGFtcGluZygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkYW1wVHJhbnNsYXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZGFtcGluZ0xpbmVhciA9IF92YWx1ZTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldExpbmVhckRhbXBpbmcoX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhZyBvZiByb3RhdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGFtcFJvdGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0QW5ndWxhckRhbXBpbmcoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGFtcFJvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2RhbXBpbmdBbmd1bGFyID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QW5ndWxhckRhbXBpbmcoX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGZhY3RvciB0aGlzIHJpZ2lkYm9keSByZWFjdHMgcm90YXRpb25zIHRoYXQgaGFwcGVuIGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gMCB0byBsb2NrIHJvdGF0aW9uIHRoaXMgYXhpcy4gKi9cclxuICAgIHB1YmxpYyBnZXQgZWZmZWN0Um90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNlZmZlY3RSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZWZmZWN0Um90YXRpb24oX2VmZmVjdDogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNlZmZlY3RSb3RhdGlvbiA9IF9lZmZlY3Q7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRSb3RhdGlvbkZhY3RvcihuZXcgT0lNTy5WZWMzKHRoaXMuI2VmZmVjdFJvdGF0aW9uLngsIHRoaXMuI2VmZmVjdFJvdGF0aW9uLnksIHRoaXMuI2VmZmVjdFJvdGF0aW9uLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGZhY3RvciB0aGlzIHJpZ2lkYm9keSByZWFjdHMgdG8gd29ybGQgZ3Jhdml0eS4gRGVmYXVsdCA9IDEgZS5nLiAxKjkuODEgbS9zLiAqL1xyXG4gICAgcHVibGljIGdldCBlZmZlY3RHcmF2aXR5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNlZmZlY3RHcmF2aXR5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBlZmZlY3RHcmF2aXR5KF9lZmZlY3Q6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNlZmZlY3RHcmF2aXR5ID0gX2VmZmVjdDtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKSB0aGlzLiNyaWdpZGJvZHkuc2V0R3Jhdml0eVNjYWxlKHRoaXMuI2VmZmVjdEdyYXZpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mIHNsaWRpbmcgcmVzaXN0YW5jZSBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZyaWN0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmcmljdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnJpY3Rpb24gb2YgdGhlIHJpZ2lkYm9keSwgd2hpY2ggaXMgdGhlIGZhY3RvciBvZiAgc2xpZGluZyByZXNpc3RhbmNlIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgZnJpY3Rpb24oX2ZyaWN0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZnJpY3Rpb24gPSBfZnJpY3Rpb247XHJcbiAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkgIT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByZXN0aXR1dGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mIGJvdW5jaW5lc3Mgb2YgdGhpcyByaWdpZGJvZHkgb24gc3VyZmFjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZXN0aXR1dGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcmVzdGl0dXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHJlc3RpdHV0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2YgYm91bmNpbmVzcyBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHJlc3RpdHV0aW9uKF9yZXN0aXR1dGlvbjogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3Jlc3RpdHV0aW9uID0gX3Jlc3RpdHV0aW9uO1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJpZ2lkYm9keSBpbiB0aGUgZm9ybSB0aGUgcGh5c2ljcyBlbmdpbmUgaXMgdXNpbmcgaXQsIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgYSBmdW5jdGlvbmFsaXR5XHJcbiAgICAgKiBpcyBub3QgcHJvdmlkZWQgdGhyb3VnaCB0aGUgRlVER0UgSW50ZWdyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vUmlnaWRib2R5KCk6IE9JTU8uUmlnaWRCb2R5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUm90YXRpbmcgdGhlIHJpZ2lkYm9keSB0aGVyZWZvcmUgY2hhbmdpbmcgaXQncyByb3RhdGlvbiBvdmVyIHRpbWUgZGlyZWN0bHkgaW4gcGh5c2ljcy4gVGhpcyB3YXkgcGh5c2ljcyBpcyBjaGFuZ2luZyBpbnN0ZWFkIG9mIHRyYW5zZm9ybS4gXHJcbiAgICAgKiAgQnV0IHlvdSBhcmUgYWJsZSB0byBpbmNyZW1lbnRhbCBjaGFuZ2luZyBpdCBpbnN0ZWFkIG9mIGEgZGlyZWN0IHJvdGF0aW9uLiAgQWx0aG91Z2ggaXQncyBhbHdheXMgcHJlZmVyZWQgdG8gdXNlIGZvcmNlcyBpbiBwaHlzaWNzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlQm9keShfcm90YXRpb25DaGFuZ2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnJvdGF0ZVh5eihuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbkNoYW5nZS54ICogQ2FsYy5kZWcycmFkLCBfcm90YXRpb25DaGFuZ2UueSAqIENhbGMuZGVnMnJhZCwgX3JvdGF0aW9uQ2hhbmdlLnogKiBDYWxjLmRlZzJyYWQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJhbnNsYXRpbmcgdGhlIHJpZ2lkYm9keSB0aGVyZWZvcmUgY2hhbmdpbmcgaXQncyBwbGFjZSBvdmVyIHRpbWUgZGlyZWN0bHkgaW4gcGh5c2ljcy4gVGhpcyB3YXkgcGh5c2ljcyBpcyBjaGFuZ2luZyBpbnN0ZWFkIG9mIHRyYW5zZm9ybS4gXHJcbiAgICAgKiAgQnV0IHlvdSBhcmUgYWJsZSB0byBpbmNyZW1lbnRhbGx5IGNoYW5naW5nIGl0IGluc3RlYWQgb2YgYSBkaXJlY3QgcG9zaXRpb24uIEFsdGhvdWdoIGl0J3MgYWx3YXlzIHByZWZlcmVkIHRvIHVzZSBmb3JjZXMgaW4gcGh5c2ljcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVCb2R5KF90cmFuc2xhdGlvbkNoYW5nZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkudHJhbnNsYXRlKG5ldyBPSU1PLlZlYzMoX3RyYW5zbGF0aW9uQ2hhbmdlLngsIF90cmFuc2xhdGlvbkNoYW5nZS55LCBfdHJhbnNsYXRpb25DaGFuZ2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjdXJyZW50IFBPU0lUSU9OIG9mIHRoZSB7QGxpbmsgTm9kZX0gaW4gdGhlIHBoeXNpY2FsIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NpdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRtcFBvczogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldFBvc2l0aW9uKCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0bXBQb3MueCwgdG1wUG9zLnksIHRtcFBvcy56KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgUE9TSVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFBvc2l0aW9uKF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0UG9zaXRpb24obmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgUk9UQVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2UuIE5vdGUgdGhpcyByYW5nZSBmcm9tIC1waSB0byBwaSwgc28gLTkwIHRvIDkwLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Um90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbjogT0lNTy5RdWF0ID0gdGhpcy4jcmlnaWRib2R5LmdldE9yaWVudGF0aW9uKCk7XHJcbiAgICAgIGxldCB0bXBRdWF0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICB0bXBRdWF0LnNldChvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCBvcmllbnRhdGlvbi53KTtcclxuICAgICAgbGV0IGV1bGVyQW5nbGVzOiBWZWN0b3IzID0gdG1wUXVhdC5ldWxlckFuZ2xlcy5jbG9uZTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodG1wUXVhdCk7XHJcbiAgICAgIHJldHVybiBldWxlckFuZ2xlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgUk9UQVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2UsIGluIGRlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFJvdGF0aW9uKF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgcXVhdDogT0lNTy5RdWF0ID0gbmV3IE9JTU8uUXVhdCgpO1xyXG4gICAgICBsZXQgbXR4Um90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICAgbXR4Um90LnJvdGF0ZShuZXcgVmVjdG9yMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICAgIGxldCBhcnJheTogRmxvYXQzMkFycmF5ID0gbXR4Um90LmdldCgpO1xyXG4gICAgICBsZXQgcm90OiBPSU1PLk1hdDMgPSBuZXcgT0lNTy5NYXQzKGFycmF5WzBdLCBhcnJheVs0XSwgYXJyYXlbOF0sIGFycmF5WzFdLCBhcnJheVs1XSwgYXJyYXlbOV0sIGFycmF5WzJdLCBhcnJheVs2XSwgYXJyYXlbMTBdKTtcclxuICAgICAgcXVhdC5mcm9tTWF0Myhyb3QpO1xyXG4gICAgICAvLyBxdWF0Lm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0T3JpZW50YXRpb24ocXVhdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCB0aGUgY3VycmVudCBTQ0FMSU5HIGluIHRoZSBwaHlzaWNhbCBzcGFjZS4gKi9cclxuICAgIHB1YmxpYyBnZXRTY2FsaW5nKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nLmNsb25lO1xyXG4gICAgICBzY2FsaW5nLnggKj0gdGhpcy5tdHhQaXZvdC5zY2FsaW5nLng7XHJcbiAgICAgIHNjYWxpbmcueSAqPSB0aGlzLm10eFBpdm90LnNjYWxpbmcueTtcclxuICAgICAgc2NhbGluZy56ICo9IHRoaXMubXR4UGl2b3Quc2NhbGluZy56O1xyXG4gICAgICByZXR1cm4gc2NhbGluZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2NhbGluZyByZXF1aXJlcyB0aGUgY29sbGlkZXIgdG8gYmUgY29tcGxldGVseSByZWNyZWF0ZWQgYW5ldyAqL1xyXG4gICAgcHVibGljIHNldFNjYWxpbmcoX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIC8vIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gX3ZhbHVlLmNsb25lOyAgIFxyXG4gICAgICB0aGlzLmNyZWF0ZUNvbGxpZGVyKG5ldyBPSU1PLlZlYzMoX3ZhbHVlLnggLyAyLCBfdmFsdWUueSAvIDIsIF92YWx1ZS56IC8gMiksIHRoaXMuI3R5cGVDb2xsaWRlcik7IC8vcmVjcmVhdGUgdGhlIGNvbGxpZGVyXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyID0gbmV3IE9JTU8uU2hhcGUodGhpcy4jY29sbGlkZXJJbmZvKTtcclxuICAgICAgbGV0IG9sZENvbGxpZGVyOiBPSU1PLlNoYXBlID0gdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkU2hhcGUodGhpcy4jY29sbGlkZXIpOyAvL2FkZCBuZXcgY29sbGlkZXIsIGJlZm9yZSByZW1vdmluZyB0aGUgb2xkLCBzbyB0aGUgcmIgaXMgbmV2ZXIgYWN0aXZlIHdpdGggMCBjb2xsaWRlcnNcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnJlbW92ZVNoYXBlKG9sZENvbGxpZGVyKTsgLy9yZW1vdmUgdGhlIG9sZCBjb2xsaWRlclxyXG4gICAgICB0aGlzLiNjb2xsaWRlci51c2VyRGF0YSA9IHRoaXM7IC8vcmVzZXQgdGhlIGV4dHJhIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhpcyBjb2xsaWRlciBrbm93cyB0byB3aGljaCBGVURHRSBDb21wb25lbnQgaXQncyBjb25uZWN0ZWRcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uR3JvdXAodGhpcy5jb2xsaXNpb25Hcm91cCk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbk1hc2sodGhpcy5jb2xsaXNpb25NYXNrKTtcclxuXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRDb250YWN0Q2FsbGJhY2sodGhpcy4jY2FsbGJhY2tzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSByaWdpZGJvZHkgYWNjb3JkaW5nIHRvIGl0cyBpbml0aWFsaXphdGlvbiBzZXR0aW5nIHRvIG1hdGNoIHRoZSBtZXNoLCB0aGUgbm9kZSBvciBpdHMgb3duIHBpdm90IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpIC8vIGRlbGF5IGluaXRpYWxpemF0aW9uIHVudGlsIHRoaXMgcmlnaWRib2R5IGlzIGF0dGFjaGVkIHRvIGEgbm9kZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgc3dpdGNoIChOdW1iZXIodGhpcy5pbml0aWFsaXphdGlvbikpIHtcclxuICAgICAgICBjYXNlIEJPRFlfSU5JVC5UT19OT0RFOlxyXG4gICAgICAgICAgdGhpcy5tdHhQaXZvdCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX0lOSVQuVE9fTUVTSDpcclxuICAgICAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICAgIGlmIChjbXBNZXNoKVxyXG4gICAgICAgICAgICB0aGlzLm10eFBpdm90ID0gY21wTWVzaC5tdHhQaXZvdC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQk9EWV9JTklULlRPX1BJVk9UOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gbXR4V29ybGQudHJhbnNsYXRpb247IC8vQWRkaW5nIHRoZSBvZmZzZXRzIGZyb20gdGhlIHBpdm90XHJcbiAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyA9IG10eFdvcmxkLnJvdGF0aW9uO1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IG10eFdvcmxkLnNjYWxpbmc7XHJcbiAgICAgIC8vc2NhbGluZyByZXF1aXJlcyBjb2xsaWRlciB0byBiZSByZWNyZWF0ZWRcclxuICAgICAgdGhpcy5zZXRTY2FsaW5nKHNjYWxpbmcpO1xyXG5cclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb3NpdGlvbik7IC8vc2V0IHRoZSBhY3R1YWwgbmV3IHJvdGF0aW9uL3Bvc2l0aW9uIGZvciB0aGlzIFJiIGFnYWluIHNpbmNlIGl0J3Mgbm93IHVwZGF0ZWRcclxuICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbik7XHJcblxyXG4gICAgICBsZXQgc2NhbGluZ0ludmVyc2U6IFZlY3RvcjMgPSB0aGlzLm5vZGUubXR4V29ybGQuc2NhbGluZy5tYXAoX2kgPT4gMSAvIF9pKTtcclxuICAgICAgdGhpcy4jbXR4UGl2b3RVbnNjYWxlZCA9IE1hdHJpeDR4NC5DT01QT1NJVElPTih0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLCB0aGlzLm10eFBpdm90LnJvdGF0aW9uLCBzY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgIHRoaXMuI210eFBpdm90SW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMuI210eFBpdm90VW5zY2FsZWQpO1xyXG5cclxuICAgICAgdGhpcy5hZGRSaWdpZGJvZHlUb1dvcmxkKCk7XHJcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVmVsb2NpdHkgYW5kIEZvcmNlc1xyXG4gICAgLyoqXHJcbiAgICAqIEdldCB0aGUgY3VycmVudCBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldFZlbG9jaXR5KCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IHRoaXMuI3JpZ2lkYm9keS5nZXRMaW5lYXJWZWxvY2l0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHZlbG9jaXR5OiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyVmVsb2NpdHkodmVsb2NpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjdXJyZW50IEFOR1VMQVIgLSBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBbmd1bGFyVmVsb2NpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldEFuZ3VsYXJWZWxvY2l0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBBTkdVTEFSIC0gVkVMT0NJVFkgb2YgdGhlIHtAbGluayBOb2RlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QW5ndWxhclZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRBbmd1bGFyVmVsb2NpdHkodmVsb2NpdHkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGNvbnRpbm91cyBGT1JDRSBhdCB0aGUgY2VudGVyIG9mIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTLlxyXG4gICAgKiBUaGUgZm9yY2UgaXMgbWVhc3VyZWQgaW4gbmV3dG9uLCAxa2cgbmVlZHMgYWJvdXQgMTAgTmV3dG9uIHRvIGZpZ2h0IGFnYWluc3QgZ3Jhdml0eS5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlGb3JjZShfZm9yY2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5Rm9yY2VUb0NlbnRlcihuZXcgT0lNTy5WZWMzKF9mb3JjZS54LCBfZm9yY2UueSwgX2ZvcmNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGNvbnRpbm91cyBGT1JDRSBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSB3b3JsZCB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUZvcmNlQXRQb2ludChfZm9yY2U6IFZlY3RvcjMsIF93b3JsZFBvaW50OiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUZvcmNlKG5ldyBPSU1PLlZlYzMoX2ZvcmNlLngsIF9mb3JjZS55LCBfZm9yY2UueiksIG5ldyBPSU1PLlZlYzMoX3dvcmxkUG9pbnQueCwgX3dvcmxkUG9pbnQueSwgX3dvcmxkUG9pbnQueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIFJPVEFUSU9OQUwgRk9SQ0UgKFRvcnF1ZSkgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1NcclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlUb3JxdWUoX3JvdGF0aW9uYWxGb3JjZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlUb3JxdWUobmV3IE9JTU8uVmVjMyhfcm90YXRpb25hbEZvcmNlLngsIF9yb3RhdGlvbmFsRm9yY2UueSwgX3JvdGF0aW9uYWxGb3JjZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBpbnN0YW50IEZPUkNFIGF0IGEgcG9pbnQvcmlnaWRib2R5Y2VudGVyIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZCdzIE1BU1NcclxuICAgICogSW5mbHVlbmNpbmcgdGhlIGFuZ3VsYXIgc3BlZWQgYW5kIHRoZSBsaW5lYXIgc3BlZWQuIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUltcHVsc2VBdFBvaW50KF9pbXB1bHNlOiBWZWN0b3IzLCBfd29ybGRQb2ludDogVmVjdG9yMyA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgX3dvcmxkUG9pbnQgPSBfd29ybGRQb2ludCAhPSBudWxsID8gX3dvcmxkUG9pbnQgOiB0aGlzLmdldFBvc2l0aW9uKCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUltcHVsc2UobmV3IE9JTU8uVmVjMyhfaW1wdWxzZS54LCBfaW1wdWxzZS55LCBfaW1wdWxzZS56KSwgbmV3IE9JTU8uVmVjMyhfd29ybGRQb2ludC54LCBfd29ybGRQb2ludC55LCBfd29ybGRQb2ludC56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBpbnN0YW50IEZPUkNFIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAqIE9ubHkgaW5mbHVlbmNpbmcgaXQncyBzcGVlZCBub3Qgcm90YXRpb24uXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5TGluZWFySW1wdWxzZShfaW1wdWxzZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlMaW5lYXJJbXB1bHNlKG5ldyBPSU1PLlZlYzMoX2ltcHVsc2UueCwgX2ltcHVsc2UueSwgX2ltcHVsc2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhIGluc3RhbnQgUk9UQVRJT05BTC1GT1JDRSB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgICogT25seSBpbmZsdWVuY2luZyBpdCdzIHJvdGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlBbmd1bGFySW1wdWxzZShfcm90YXRpb25hbEltcHVsc2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5QW5ndWxhckltcHVsc2UobmV3IE9JTU8uVmVjMyhfcm90YXRpb25hbEltcHVsc2UueCwgX3JvdGF0aW9uYWxJbXB1bHNlLnksIF9yb3RhdGlvbmFsSW1wdWxzZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgVkVMT0NJVFkgb2YgdGhlIFJJR0lEQk9EWS4gT25seSBpbmZsdWVuY2luZyB0aGUgbGluZWFyIHNwZWVkIG5vdCBhbmd1bGFyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZExpbmVhclZlbG9jaXR5KG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdpbmcgdGhlIFZFTE9DSVRZIG9mIHRoZSBSSUdJREJPRFkuIE9ubHkgaW5mbHVlbmNpbmcgdGhlIGFuZ3VsYXIgc3BlZWQgbm90IHRoZSBsaW5lYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZEFuZ3VsYXJWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZEFuZ3VsYXJWZWxvY2l0eShuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoZSByaWdpZGJvZGllcyBhdXRvLXNsZWVwaW5nIGZ1bmN0aW9uLlxyXG4gICAgICogSWYgYWN0aXZhdGVkIHRoZSByaWdpZGJvZHkgd2lsbCBhdXRvbWF0aWNhbGx5IHNsZWVwIHdoZW4gbmVlZGVkLCBpbmNyZWFzaW5nIHBlcmZvcm1hbmNlLlxyXG4gICAgICogSWYgZGVhY3RpdmF0ZWQgdGhlIHJpZ2lkYm9keSBnZXRzIHN0b3BwZWQgZnJvbSBzbGVlcGluZyB3aGVuIG1vdmVtZW50IGlzIHRvbyBtaW5pbWFsLiBEZWNyZWFzaW5nIHBlcmZvcm1hbmNlLCBmb3IgcmFyZWx5IG1vcmUgcHJlY2lzZSBwaHlzaWNzIHJlc3VsdHMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZUF1dG9TbGVlcChfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEF1dG9TbGVlcChfb24pO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIENvbGxpc2lvblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBDaGVja2luZyBmb3IgQ29sbGlzaW9uIHdpdGggb3RoZXIgQ29sbGlkZXJzIGFuZCBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxpZGVyLlxyXG4gICAgLy8gICogQXV0b21hdGljYWxseSBjYWxsZWQgaW4gdGhlIFJlbmRlck1hbmFnZXIsIG5vIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGNoZWNrQ29sbGlzaW9uRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgLy8gICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkgLy8gY2hlY2sgY29sbGlzaW9ucyBvbmx5IGlmIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZFxyXG4gICAgLy8gICAgIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGxldCBjb250YWN0TGluazogT0lNTy5Db250YWN0TGluayA9IHRoaXMuI3JpZ2lkYm9keS5nZXRDb250YWN0TGlua0xpc3QoKTsgLy8gYWxsIHBoeXNpY2FsIGNvbnRhY3RzIGJldHdlZW4gY29sbGlkaW5nIGJvZGllcyBvbiB0aGlzIHJiXHJcbiAgICAvLyAgIHdoaWxlIChjb250YWN0TGluayAhPSBudWxsKSB7XHJcbiAgICAvLyAgICAgbGV0IG90aGVyOiBDb21wb25lbnRSaWdpZGJvZHkgPSBjb250YWN0TGluay5nZXRPdGhlcigpLnVzZXJEYXRhOyAvLyBnZXQgdGhlIG90aGVyIGNvbXBvbmVudCByaWdpZGJvZHkgaW52b2x2ZWQgaW4gdGhlIGNvbGxpc2lvblxyXG4gICAgLy8gICAgIGlmICghb3RoZXIuaXNJbml0aWFsaXplZCkge1xyXG4gICAgLy8gICAgICAgY29udGFjdExpbmsgPSBjb250YWN0TGluay5nZXROZXh0KCk7XHJcbiAgICAvLyAgICAgICBjb250aW51ZTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGxldCBjb250YWN0OiBPSU1PLkNvbnRhY3QgPSBjb250YWN0TGluay5nZXRDb250YWN0KCk7XHJcbiAgICAvLyAgICAgbGV0IHdhc1RvdWNoaW5nOiBib29sZWFuID0gdGhpcy5jb2xsaXNpb25zLmluY2x1ZGVzKG90aGVyKTtcclxuICAgIC8vICAgICBsZXQgaXNUb3VjaGluZzogYm9vbGVhbiA9IGNvbnRhY3QuaXNUb3VjaGluZygpO1xyXG5cclxuICAgIC8vICAgICBpZiAoIXdhc1RvdWNoaW5nICYmIGlzVG91Y2hpbmcpIHsgLy8gRU5URVJcclxuICAgIC8vICAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IGNvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgIC8vICAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IC8vIEFsbCBwb2ludHMgaW4gdGhlIGNvbGxpc2lvbiB3aGVyZSB0aGUgdHdvIGJvZGllcyBhcmUgdG91Y2hpbmcsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIGltcGFjdFxyXG4gICAgLy8gICAgICAgbGV0IG5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBsZXQgYmlub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgbGV0IHRhbmdlbnRJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgZm9yIChsZXQgbWFuaWZvbGRQb2ludCBvZiBwb2ludHMpIHsgLy8gVGhlIGltcGFjdCBvZiB0aGUgY29sbGlzaW9uIGludm9sdmluZyBhbGwgdG91Y2hpbmcgcG9pbnRzXHJcbiAgICAvLyAgICAgICAgIG5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXROb3JtYWxJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICAgIGJpbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldEJpbm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgLy8gICAgICAgICB0YW5nZW50SW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldFRhbmdlbnRJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgIC8vICAgICAgIGxldCBjb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyhub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56KTtcclxuICAgIC8vICAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IHRoaXMuY29sbGlzaW9uQ2VudGVyUG9pbnQocG9pbnRzLCBtYW5pZm9sZC5nZXROdW1Qb2ludHMoKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLmNvbGxpc2lvbnMucHVzaChvdGhlcik7XHJcbiAgICAvLyAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FTlRFUiwgb3RoZXIsIG5vcm1hbEltcHVsc2UsIHRhbmdlbnRJbXB1bHNlLCBiaW5vcm1hbEltcHVsc2UsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTsgLy8gU2VuZGluZyB0aGUgZ2l2ZW4gZXZlbnRcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKHdhc1RvdWNoaW5nICYmICFpc1RvdWNoaW5nKSB7IC8vIEVYSVRcclxuICAgIC8vICAgICAgIHRoaXMuY29sbGlzaW9ucy5zcGxpY2UodGhpcy5jb2xsaXNpb25zLmluZGV4T2Yob3RoZXIpLCAxKTtcclxuICAgIC8vICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VYSVQsIG90aGVyLCAwLCAwLCAwKSk7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb250YWN0TGluayA9IGNvbnRhY3RMaW5rLmdldE5leHQoKTsgLy8gU3RhcnQgdGhlIHNhbWUgcm91dGluZSB3aXRoIHRoZSBuZXh0IGNvbGxpc2lvbiBpbiB0aGUgbGlzdFxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyBhIHJheSB0aHJvdWdoIHRoaXMgc3BlY2lmaWMgYm9keSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgd29ybGQgYW5kIGNoZWNrcyBpZiB0aGlzIGJvZHkgd2FzIGhpdCBieSB0aGUgcmF5LFxyXG4gICAgICogcmV0dXJuaW5nIGluZm8gYWJvdXQgdGhlIGhpdC4gUHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhbmQgaW5mb3JtYXRpb24gYSByZWd1bGFyIHJheWNhc3QgZG9lcyBidXQgdGhlIHJheSBpcyBvbmx5IHRlc3RpbmcgYWdhaW5zdCB0aGlzIHNwZWNpZmljIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByYXljYXN0VGhpc0JvZHkoX29yaWdpbjogVmVjdG9yMywgX2RpcmVjdGlvbjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyLCBfZGVidWdEcmF3OiBib29sZWFuID0gZmFsc2UpOiBSYXlIaXRJbmZvIHtcclxuICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBuZXcgUmF5SGl0SW5mbygpO1xyXG4gICAgICBsZXQgZ2VvbWV0cnk6IE9JTU8uR2VvbWV0cnkgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgbGV0IHRyYW5zZm9ybTogT0lNTy5UcmFuc2Zvcm0gPSB0aGlzLiNyaWdpZGJvZHkuZ2V0VHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCBzY2FsZWREaXJlY3Rpb246IFZlY3RvcjMgPSBfZGlyZWN0aW9uLmNsb25lO1xyXG4gICAgICBzY2FsZWREaXJlY3Rpb24uc2NhbGUoX2xlbmd0aCk7XHJcbiAgICAgIGxldCBlbmRwb2ludDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHNjYWxlZERpcmVjdGlvbiwgX29yaWdpbi5jbG9uZSk7XHJcbiAgICAgIGxldCBvaW1vUmF5OiBPSU1PLlJheUNhc3RIaXQgPSBuZXcgT0lNTy5SYXlDYXN0SGl0KCk7XHJcbiAgICAgIGxldCBoaXQ6IGJvb2xlYW4gPSBnZW9tZXRyeS5yYXlDYXN0KG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueiksIG5ldyBPSU1PLlZlYzMoZW5kcG9pbnQueCwgZW5kcG9pbnQueSwgZW5kcG9pbnQueiksIHRyYW5zZm9ybSwgb2ltb1JheSk7IC8vdGhlIGFjdHVhbCBPaW1vUGh5c2ljcyBSYXljYXN0XHJcbiAgICAgIGlmIChoaXQpIHsgIC8vSWYgaGl0IHJldHVybiBhIGJ1bmNoIG9mIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgaGl0XHJcbiAgICAgICAgaGl0SW5mby5oaXQgPSB0cnVlO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhvaW1vUmF5LnBvc2l0aW9uLngsIG9pbW9SYXkucG9zaXRpb24ueSwgb2ltb1JheS5wb3NpdGlvbi56KTtcclxuICAgICAgICBoaXRJbmZvLmhpdE5vcm1hbCA9IG5ldyBWZWN0b3IzKG9pbW9SYXkubm9ybWFsLngsIG9pbW9SYXkubm9ybWFsLnksIG9pbW9SYXkubm9ybWFsLnopO1xyXG4gICAgICAgIGxldCBkeDogbnVtYmVyID0gX29yaWdpbi54IC0gaGl0SW5mby5oaXRQb2ludC54OyAgLy9jYWxjdWxhdGUgaGl0IGRpc3RhbmNlXHJcbiAgICAgICAgbGV0IGR5OiBudW1iZXIgPSBfb3JpZ2luLnkgLSBoaXRJbmZvLmhpdFBvaW50Lnk7XHJcbiAgICAgICAgbGV0IGR6OiBudW1iZXIgPSBfb3JpZ2luLnogLSBoaXRJbmZvLmhpdFBvaW50Lno7XHJcbiAgICAgICAgaGl0SW5mby5oaXREaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHopO1xyXG4gICAgICAgIGhpdEluZm8ucmlnaWRib2R5Q29tcG9uZW50ID0gdGhpcztcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgICAgaGl0SW5mby5yYXlFbmQgPSBlbmRwb2ludDtcclxuICAgICAgfSBlbHNlIHsgLy9Pbmx5IHRlbGwgdGhlIG9yaWdpbiwgYW5kIHRoZSBoaXQgcG9pbnQgaXMgdGhlIGVuZCBvZiB0aGUgcmF5LlxyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgICBoaXRJbmZvLmhpdFBvaW50ID0gbmV3IFZlY3RvcjMoZW5kcG9pbnQueCwgZW5kcG9pbnQueSwgZW5kcG9pbnQueik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKF9kZWJ1Z0RyYXcpIHtcclxuICAgICAgICBQaHlzaWNzLmRlYnVnRHJhdy5kZWJ1Z1JheShoaXRJbmZvLnJheU9yaWdpbiwgaGl0SW5mby5oaXRQb2ludCwgbmV3IENvbG9yKDAsIDEsIDAsIDEpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaGl0SW5mbztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmcgLSBTb21lIHByb3BlcnRpZXMgbWlnaHQgYmUgbWlzc2luZywgZS5nLiBjb252ZXhNZXNoIChGbG9hdDMyQXJyYXkpXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuZ2V0TXV0YXRvcigpO1xyXG5cclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24ubXR4UGl2b3Q7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmFjdGl2ZTtcclxuXHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHlwZUJvZHkgPSBCT0RZX1RZUEVbdGhpcy4jdHlwZUJvZHldO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnR5cGVDb2xsaWRlciA9IENPTExJREVSX1RZUEVbdGhpcy4jdHlwZUNvbGxpZGVyXTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbiA9IEJPRFlfSU5JVFt0aGlzLmluaXRpYWxpemF0aW9uXTtcclxuXHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWQgPSB0aGlzLiNpZDtcclxuICAgICAgc2VyaWFsaXphdGlvbi5waXZvdCA9IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLm10eFBpdm90LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnBpdm90KTtcclxuICAgICAgdGhpcy4jaWQgPSBfc2VyaWFsaXphdGlvbi5pZDtcclxuICAgICAgdGhpcy5tYXNzID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24ubWFzcywgdGhpcy5tYXNzKTtcclxuICAgICAgdGhpcy5kYW1wVHJhbnNsYXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5kYW1wVHJhbnNsYXRpb24sIHRoaXMuZGFtcFRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5kYW1wUm90YXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5kYW1wUm90YXRpb24sIHRoaXMuZGFtcFJvdGF0aW9uKTtcclxuICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cCA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmNvbGxpc2lvbkdyb3VwLCB0aGlzLmNvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy5lZmZlY3RSb3RhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmVmZmVjdFJvdGF0aW9uIHx8IHRoaXMuZWZmZWN0Um90YXRpb247XHJcbiAgICAgIHRoaXMuZWZmZWN0R3Jhdml0eSA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmVmZmVjdEdyYXZpdHksIHRoaXMuZWZmZWN0R3Jhdml0eSk7XHJcbiAgICAgIHRoaXMuZnJpY3Rpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5mcmljdGlvbiwgdGhpcy5mcmljdGlvbik7XHJcbiAgICAgIHRoaXMucmVzdGl0dXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5yZXN0aXR1dGlvbiwgdGhpcy5yZXN0aXR1dGlvbik7XHJcbiAgICAgIHRoaXMuaXNUcmlnZ2VyID0gX3NlcmlhbGl6YXRpb24uaXNUcmlnZ2VyIHx8IHRoaXMuaXNUcmlnZ2VyO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb24uaW5pdGlhbGl6YXRpb247XHJcblxyXG4gICAgICB0aGlzLmluaXRpYWxpemF0aW9uID0gPG51bWJlcj48dW5rbm93bj5CT0RZX0lOSVRbX3NlcmlhbGl6YXRpb24uaW5pdGlhbGl6YXRpb25dO1xyXG4gICAgICB0aGlzLnR5cGVCb2R5ID0gPG51bWJlcj48dW5rbm93bj5CT0RZX1RZUEVbX3NlcmlhbGl6YXRpb24udHlwZUJvZHldO1xyXG4gICAgICB0aGlzLnR5cGVDb2xsaWRlciA9IDxudW1iZXI+PHVua25vd24+Q09MTElERVJfVFlQRVtfc2VyaWFsaXphdGlvbi50eXBlQ29sbGlkZXJdO1xyXG4gICAgICAvLyB0aGlzLmNyZWF0ZSh0aGlzLm1hc3MsIHRoaXMuI3R5cGVCb2R5LCB0aGlzLiN0eXBlQ29sbGlkZXIsIHRoaXMuY29sbGlzaW9uR3JvdXAsIG51bGwsIHRoaXMuY29udmV4TWVzaCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGFuZ2UgcHJvcGVydGllcyBieSBhbiBhc3NvY2lhdGl2ZSBhcnJheSAqL1xyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmIChfbXV0YXRvci50eXBlQm9keSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IudHlwZUJvZHkgPSBwYXJzZUludChfbXV0YXRvci50eXBlQm9keSk7XHJcbiAgICAgIGlmIChfbXV0YXRvci50eXBlQ29sbGlkZXIgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIF9tdXRhdG9yLnR5cGVDb2xsaWRlciA9IHBhcnNlSW50KF9tdXRhdG9yLnR5cGVDb2xsaWRlcik7XHJcbiAgICAgIGlmIChfbXV0YXRvci5pbml0aWFsaXphdGlvbiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IuaW5pdGlhbGl6YXRpb24gPSBwYXJzZUludChfbXV0YXRvci5pbml0aWFsaXphdGlvbik7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgaWYgKF9tdXRhdG9yLmluaXRpYWxpemF0aW9uICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzQWN0aXZlKVxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAvLyBUT0RPOiBzZWUgaWYgdGhpcyBhbHRlcm5hdGl2ZSBzaG91bGQgYmUsIGF0IGxlYXN0IHBhcnRpYWxseSwgZG9uZSB3aXRoIG11dGF0ZVNlbGVjdGlvblxyXG4gICAgICAvLyBsZXQgY2FsbElmRXhpc3Q6IEZ1bmN0aW9uID0gKF9rZXk6IHN0cmluZywgX3NldHRlcjogRnVuY3Rpb24pID0+IHtcclxuICAgICAgLy8gICBpZiAoX211dGF0b3JbX2tleV0pXHJcbiAgICAgIC8vICAgICBfc2V0dGVyKF9tdXRhdG9yW19rZXldKTtcclxuICAgICAgLy8gfTtcclxuXHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZnJpY3Rpb25cIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmZyaWN0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJyZXN0aXR1dGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMucmVzdGl0dXRpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcIm1hc3NcIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLm1hc3MgPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcImRhbXBUcmFuc2xhdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZGFtcFRyYW5zbGF0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJkYW1wUm90YXRpb25cIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmRhbXBSb3RhdGlvbiA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZWZmZWN0R3Jhdml0eVwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZWZmZWN0R3Jhdml0eSA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiY29sbGlzaW9uR3JvdXBcIiwgKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSA9PiB0aGlzLmNvbGxpc2lvbkdyb3VwID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJ0eXBlQm9keVwiLCAoX3ZhbHVlOiBzdHJpbmcpID0+IHRoaXMudHlwZUJvZHkgPSBwYXJzZUludChfdmFsdWUpKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJ0eXBlQ29sbGlkZXJcIiwgKF92YWx1ZTogc3RyaW5nKSA9PiB0aGlzLnR5cGVDb2xsaWRlciA9IHBhcnNlSW50KF92YWx1ZSkpO1xyXG5cclxuICAgICAgLy8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG5cclxuICAgICAgbXV0YXRvci5mcmljdGlvbiA9IHRoaXMuZnJpY3Rpb247XHJcbiAgICAgIG11dGF0b3IucmVzdGl0dXRpb24gPSB0aGlzLnJlc3RpdHV0aW9uO1xyXG4gICAgICBtdXRhdG9yLm1hc3MgPSB0aGlzLm1hc3M7XHJcbiAgICAgIG11dGF0b3IuZGFtcFRyYW5zbGF0aW9uID0gdGhpcy5kYW1wVHJhbnNsYXRpb247XHJcbiAgICAgIG11dGF0b3IuZGFtcFJvdGF0aW9uID0gdGhpcy5kYW1wUm90YXRpb247XHJcbiAgICAgIG11dGF0b3IuZWZmZWN0R3Jhdml0eSA9IHRoaXMuZWZmZWN0R3Jhdml0eTtcclxuICAgICAgbXV0YXRvci50eXBlQm9keSA9IHRoaXMuI3R5cGVCb2R5O1xyXG4gICAgICBtdXRhdG9yLnR5cGVDb2xsaWRlciA9IHRoaXMuI3R5cGVDb2xsaWRlcjtcclxuICAgICAgbXV0YXRvci5pc1RyaWdnZXIgPSB0aGlzLiNpc1RyaWdnZXI7XHJcblxyXG4gICAgICAvLyBPYmplY3QucHJldmVudEV4dGVuc2lvbnMobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlQm9keSlcclxuICAgICAgICB0eXBlcy50eXBlQm9keSA9IEJPRFlfVFlQRTtcclxuICAgICAgaWYgKHR5cGVzLnR5cGVDb2xsaWRlcilcclxuICAgICAgICB0eXBlcy50eXBlQ29sbGlkZXIgPSBDT0xMSURFUl9UWVBFO1xyXG4gICAgICBpZiAodHlwZXMuaW5pdGlhbGl6YXRpb24pXHJcbiAgICAgICAgdHlwZXMuaW5pdGlhbGl6YXRpb24gPSBCT0RZX0lOSVQ7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmNvbnZleE1lc2g7IC8vQ29udmV4IE1lc2ggY2FuJ3QgYmUgc2hvd24gaW4gdGhlIGVkaXRvciBiZWNhdXNlIGZsb2F0MzJBcnJheSBpcyBub3QgYSB2aWFibGUgbXV0YXRvclxyXG4gICAgICBkZWxldGUgX211dGF0b3IuY29sbGlzaW9uTWFzaztcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmlzSW5pdGlhbGl6ZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyBBY3RpdmF0ZSB0aGUgZnVuY3Rpb25zIG9mIHRoaXMgY29tcG9uZW50IGFzIHJlc3BvbnNlIHRvIGV2ZW50c1xyXG4gICAgcHJpdmF0ZSBobmRFdmVudCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9BREQ6XHJcbiAgICAgICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFLCB0aGlzLnJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCk7XHJcbiAgICAgICAgICAvLyB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQsIHRydWUpOyAvLyB1c2UgY2FwdHVyZSB0byByZWFjdCB0byBicm9hZGNhc3QhXHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkLCB0cnVlKTtcclxuICAgICAgICAgIGlmICghdGhpcy5ub2RlLmNtcFRyYW5zZm9ybSlcclxuICAgICAgICAgICAgRGVidWcud2FybihcIkNvbXBvbmVudFJpZ2lkYm9keSBhdHRhY2hlZCB0byBub2RlIG1pc3NpbmcgQ29tcG9uZW50VHJhbnNmb3JtXCIsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9SRU1PVkU6XHJcbiAgICAgICAgICAvLyB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5hZGRSaWdpZGJvZHlUb1dvcmxkKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLnJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCk7XHJcbiAgICAgICAgICAvLyB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQsIHRydWUpOyAvLyB1c2UgY2FwdHVyZSB0byByZWFjdCB0byBicm9hZGNhc3QhXHJcbiAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULk5PREVfREVTRVJJQUxJWkVEOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLm5vZGUuY21wVHJhbnNmb3JtKVxyXG4gICAgICAgICAgICBEZWJ1Zy5lcnJvcihcIkNvbXBvbmVudFJpZ2lkYm9keSBhdHRhY2hlZCB0byBub2RlIG1pc3NpbmcgQ29tcG9uZW50VHJhbnNmb3JtXCIsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gQ3JlYXRpb25cclxuICAgIHByaXZhdGUgY3JlYXRlKF9tYXNzOiBudW1iZXIgPSAxLCBfdHlwZTogQk9EWV9UWVBFID0gQk9EWV9UWVBFLkRZTkFNSUMsIF9jb2xsaWRlclR5cGU6IENPTExJREVSX1RZUEUgPSBDT0xMSURFUl9UWVBFLkNVQkUsIF9ncm91cDogQ09MTElTSU9OX0dST1VQID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0Q29sbGlzaW9uR3JvdXAsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCA9IG51bGwsIF9jb252ZXhNZXNoOiBGbG9hdDMyQXJyYXkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIC8vU2V0dGluZyB1cCBhbGwgaW5jb21pbmcgdmFsdWVzIHRvIGJlIGludGVybmFsIHZhbHVlc1xyXG4gICAgICB0aGlzLmNvbnZleE1lc2ggPSBfY29udmV4TWVzaDtcclxuICAgICAgdGhpcy4jdHlwZUJvZHkgPSBfdHlwZTtcclxuICAgICAgdGhpcy4jY29sbGlzaW9uR3JvdXAgPSBfZ3JvdXA7XHJcbiAgICAgIHRoaXMuI3R5cGVDb2xsaWRlciA9IF9jb2xsaWRlclR5cGU7XHJcbiAgICAgIHRoaXMubWFzcyA9IF9tYXNzO1xyXG4gICAgICB0aGlzLiNyZXN0aXR1dGlvbiA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdFJlc3RpdHV0aW9uO1xyXG4gICAgICB0aGlzLiNmcmljdGlvbiA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdEZyaWN0aW9uO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbk1hc2sgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25NYXNrO1xyXG4gICAgICAvL0NyZWF0ZSB0aGUgYWN0dWFsIHJpZ2lkYm9keSBpbiB0aGUgT2ltb1BoeXNpY3MgU3BhY2VcclxuICAgICAgdGhpcy5jcmVhdGVSaWdpZGJvZHkoX21hc3MsIF90eXBlLCB0aGlzLiN0eXBlQ29sbGlkZXIsIF9tdHhUcmFuc2Zvcm0sIHRoaXMuI2NvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jaWQgPSBQaHlzaWNzLmRpc3RyaWJ1dGVCb2R5SUQoKTtcclxuXHJcbiAgICAgIC8vIEV2ZW50IENhbGxiYWNrcyBkaXJlY3RseSBmcm9tIE9JTU8gUGh5c2ljc1xyXG4gICAgICB0aGlzLiNjYWxsYmFja3MgPSBuZXcgT0lNTy5Db250YWN0Q2FsbGJhY2soKTsgLy9mZWhtXHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5iZWdpblRyaWdnZXJDb250YWN0ID0gdGhpcy50cmlnZ2VyRW50ZXI7XHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5lbmRUcmlnZ2VyQ29udGFjdCA9IHRoaXMudHJpZ2dlckV4aXQ7XHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5wb3N0U29sdmUgPSB0aGlzLmNvbGxpc2lvbkVudGVyOyAvLyB1c2UgcG9zdFNvbHZlIGZvciBjb2xsaXNpb25FbnRlciB0byBnZXQgdGhlIGltcHVsc2VcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmVuZENvbnRhY3QgPSB0aGlzLmNvbGxpc2lvbkV4aXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgdGhlIGFjdHVhbCBPaW1vUGh5c2ljcyBSaWdpZGJvZHkgb3V0IG9mIGluZm9ybWF0aW9ucyB0aGUgRlVER0UgQ29tcG9uZW50IGhhcy4gKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUmlnaWRib2R5KF9tYXNzOiBudW1iZXIsIF90eXBlOiBCT0RZX1RZUEUsIF9jb2xsaWRlclR5cGU6IENPTExJREVSX1RZUEUsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCwgX2NvbGxpc2lvbkdyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVCk6IHZvaWQge1xyXG4gICAgICBsZXQgb2ltb1R5cGU6IG51bWJlcjsgLy9OZWVkIHRoZSBjb252ZXJzaW9uIGZyb20gc2ltcGxlIGVudW0gdG8gbnVtYmVyIGJlY2F1c2UgaWYgZW51bSBpcyBkZWZpbmVkIGFzIE9pbW8uUmlnaWR5Qm9keVR5cGUgeW91IGhhdmUgdG8gaW5jbHVkZSBPaW1vIHRvIHVzZSBGVURHRSBhdCBhbGxcclxuICAgICAgc3dpdGNoIChfdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQk9EWV9UWVBFLkRZTkFNSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5EWU5BTUlDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuU1RBVElDOlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuS0lORU1BVElDOlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuS0lORU1BVElDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG9pbW9UeXBlID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGFsbCBwcmV2aW91cyBzaGFwZXMgZnJvbSB3b3JsZC4gTmVjZXNzYXJ5P1xyXG4gICAgICAvLyB3aGlsZSAodGhpcy4jcmlnaWRib2R5ICYmIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSAhPSBudWxsKVxyXG4gICAgICAvLyAgIHRoaXMuI3JpZ2lkYm9keS5yZW1vdmVTaGFwZSh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkpO1xyXG5cclxuICAgICAgbGV0IHRtcFRyYW5zZm9ybTogTWF0cml4NHg0ID0gX210eFRyYW5zZm9ybSA9PSBudWxsID8gc3VwZXIubm9kZSAhPSBudWxsID8gc3VwZXIubm9kZS5tdHhXb3JsZCA6IE1hdHJpeDR4NC5JREVOVElUWSgpIDogX210eFRyYW5zZm9ybTsgLy9HZXQgdHJhbnNmb3JtIGluZm9ybWF0aW9ucyBmcm9tIHRoZSB3b3JsZCwgc2luY2UgcGh5c2ljcyBkb2VzIG5vdCBjYXJlIGFib3V0IGhpZXJhcmNoeVxyXG4gICAgICAvL0NvbnZlcnQgaW5mb3JtYXRpb25zIGZyb20gRlVER0UgdG8gT2ltb1BoeXNpY3MgYW5kIGNyZWF0aW5nIGEgY29sbGlkZXIgd2l0aCBpdCwgd2hpbGUgYWxzbyBhZGRpbmcgYSBwaXZvdCB0byBkZXJpdmF0ZSBmcm9tIHRoZSB0cmFuc2Zvcm0gaW5mb3JtYXRpb25zIGlmIG5lZWRlZFxyXG4gICAgICBsZXQgc2NhbGU6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoKHRtcFRyYW5zZm9ybS5zY2FsaW5nLnggKiB0aGlzLm10eFBpdm90LnNjYWxpbmcueCkgLyAyLCAodG1wVHJhbnNmb3JtLnNjYWxpbmcueSAqIHRoaXMubXR4UGl2b3Quc2NhbGluZy55KSAvIDIsICh0bXBUcmFuc2Zvcm0uc2NhbGluZy56ICogdGhpcy5tdHhQaXZvdC5zY2FsaW5nLnopIC8gMik7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyh0bXBUcmFuc2Zvcm0udHJhbnNsYXRpb24ueCArIHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24ueCwgdG1wVHJhbnNmb3JtLnRyYW5zbGF0aW9uLnkgKyB0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLnksIHRtcFRyYW5zZm9ybS50cmFuc2xhdGlvbi56ICsgdGhpcy5tdHhQaXZvdC50cmFuc2xhdGlvbi56KTtcclxuICAgICAgbGV0IHJvdGF0aW9uOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKHRtcFRyYW5zZm9ybS5yb3RhdGlvbi54ICsgdGhpcy5tdHhQaXZvdC5yb3RhdGlvbi54LCB0bXBUcmFuc2Zvcm0ucm90YXRpb24ueSArIHRoaXMubXR4UGl2b3Qucm90YXRpb24ueSwgdG1wVHJhbnNmb3JtLnJvdGF0aW9uLnogKyB0aGlzLm10eFBpdm90LnJvdGF0aW9uLnopO1xyXG4gICAgICB0aGlzLmNyZWF0ZUNvbGxpZGVyKHNjYWxlLCBfY29sbGlkZXJUeXBlKTtcclxuICAgICAgLy9TZXR0aW5nIGluZm9ybWF0aW9ucyBhYm91dCBtYXNzLCBwb3NpdGlvbi9yb3RhdGlvbiBhbmQgcGh5c2ljYWwgcmVhY3Rpb24gdHlwZVxyXG4gICAgICB0aGlzLiNtYXNzRGF0YS5tYXNzID0gX21hc3M7IC8vX3R5cGUgIT0gUEhZU0lDU19UWVBFLlNUQVRJQyA/IF9tYXNzIDogMDsgLy9JZiBhIG9iamVjdCBpcyBzdGF0aWMgaXQgYWN0cyBhcyBpZiBpdCBoYXMgbm8gbWFzc1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnR5cGUgPSBvaW1vVHlwZTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5SW5mby5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnJvdGF0aW9uLmZyb21FdWxlclh5eihuZXcgT0lNTy5WZWMzKHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopKTsgLy9Db252ZXJ0IGV1bGVyQW5nbGVzIGluIGRlZ3JlZSB0byB0aGUgaW50ZXJuYWxseSB1c2VkIHF1YXRlcm5pb25zXHJcbiAgICAgIC8vQ3JlYXRpbmcgdGhlIGFjdHVhbCByaWdpZGJvZHkgYW5kIGl0J3MgY29sbGlkZXJcclxuICAgICAgdGhpcy4jcmlnaWRib2R5ID0gbmV3IE9JTU8uUmlnaWRCb2R5KHRoaXMuI3JpZ2lkYm9keUluZm8pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlciA9IG5ldyBPSU1PLlNoYXBlKHRoaXMuI2NvbGxpZGVySW5mbyk7XHJcbiAgICAgIC8vRmlsbGluZyB0aGUgYWRkaXRpb25hbCBzZXR0aW5ncyBhbmQgaW5mb3JtYXRpb25zIHRoZSByaWdpZGJvZHkgbmVlZHMuIFdobyBpcyBjb2xsaWRpbmcsIGhvdyBpcyB0aGUgY29sbGlzaW9uIGhhbmRsZWQgKGRhbXBpbmcsIGluZmx1ZW5jZSBmYWN0b3JzKVxyXG4gICAgICB0aGlzLiNjb2xsaWRlci51c2VyRGF0YSA9IHRoaXM7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbkdyb3VwKF9jb2xsaXNpb25Hcm91cCk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbk1hc2sodGhpcy5jb2xsaXNpb25NYXNrKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZFNoYXBlKHRoaXMuI2NvbGxpZGVyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldEZyaWN0aW9uKHRoaXMuI2ZyaWN0aW9uKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldENvbnRhY3RDYWxsYmFjayh0aGlzLiNjYWxsYmFja3MpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyRGFtcGluZyh0aGlzLiNkYW1waW5nTGluZWFyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEFuZ3VsYXJEYW1waW5nKHRoaXMuI2RhbXBpbmdBbmd1bGFyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEdyYXZpdHlTY2FsZSh0aGlzLiNlZmZlY3RHcmF2aXR5KTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldFJvdGF0aW9uRmFjdG9yKG5ldyBPSU1PLlZlYzModGhpcy4jZWZmZWN0Um90YXRpb24ueCwgdGhpcy4jZWZmZWN0Um90YXRpb24ueSwgdGhpcy4jZWZmZWN0Um90YXRpb24ueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGVzIGEgY29sbGlkZXIgYSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCBpbiB0aGUgcGh5c2ljYWwgd29ybGQuICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb2xsaWRlcihfc2NhbGU6IE9JTU8uVmVjMywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSk6IHZvaWQge1xyXG4gICAgICBsZXQgc2hhcGVDb25mOiBPSU1PLlNoYXBlQ29uZmlnID0gbmV3IE9JTU8uU2hhcGVDb25maWcoKTsgLy9Db2xsaWRlciB3aXRoIGdlb21ldHJ5IGFuZCBpbmZvcyBsaWtlIGZyaWN0aW9uL3Jlc3RpdHV0aW9uIGFuZCBtb3JlXHJcbiAgICAgIGxldCBnZW9tZXRyeTogT0lNTy5HZW9tZXRyeTtcclxuICAgICAgaWYgKHRoaXMudHlwZUNvbGxpZGVyICE9IF9jb2xsaWRlclR5cGUpIC8vSWYgdGhlIGNvbGxpZGVyIHR5cGUgd2FzIGNoYW5nZWQgc2V0IHRoZSBpbnRlcm5hbCBvbmUgbmV3LCBlbHNlIGRvbid0IHNvIHRoZXJlIGlzIG5vdCBpbmZpbml0ZSBzZXQgY2FsbHNcclxuICAgICAgICB0aGlzLnR5cGVDb2xsaWRlciA9IF9jb2xsaWRlclR5cGU7XHJcbiAgICAgIHN3aXRjaCAoX2NvbGxpZGVyVHlwZSkgeyAgLy9DcmVhdGUgYSBkaWZmZXJlbnQgT2ltb1BoeXNpY3MgZ2VvbWV0cnkgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUuIFRoYXQgaXMgb25seSB0aGUgbWF0aGVtYXRpY2FsIHNoYXBlIG9mIHRoZSBjb2xsaWRlclxyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DVUJFOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5Cb3hHZW9tZXRyeShfc2NhbGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLlNQSEVSRTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uU3BoZXJlR2VvbWV0cnkoX3NjYWxlLngpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNBUFNVTEU6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkNhcHN1bGVHZW9tZXRyeShfc2NhbGUueCwgX3NjYWxlLnkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNZTElOREVSOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5DeWxpbmRlckdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ09ORTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uQ29uZUdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuUFlSQU1JRDpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gdGhpcy5jcmVhdGVDb252ZXhHZW9tZXRyeUNvbGxpZGVyKHRoaXMuY3JlYXRlUHlyYW1pZFZlcnRpY2VzKCksIF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ09OVkVYOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSB0aGlzLmNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIodGhpcy5jb252ZXhNZXNoLCBfc2NhbGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgc2hhcGVDb25mLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVySW5mbyA9IHNoYXBlQ29uZjsgLy90aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbnMgdGhhdCBhcmUgdXNlZCB0byBhZGQgYW4gYWN0dWFsIGNvbGxpZGVyIHRvIHRoZSByaWdpZGJvZHkgaW4gY3JlYXRlUmlnaWRib2R5XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgc2hhcGUgdGhhdCByZXByZXNlbnRzIGEgaW4gaXRzZWxmIGNsb3NlZCBmb3JtLCBvdXQgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb252ZXhHZW9tZXRyeUNvbGxpZGVyKF92ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBfc2NhbGU6IE9JTU8uVmVjMyk6IE9JTU8uQ29udmV4SHVsbEdlb21ldHJ5IHtcclxuICAgICAgbGV0IHZlcnRpY2VzQXNWZWMzOiBPSU1PLlZlYzNbXSA9IG5ldyBBcnJheSgpOyAvL0NvbnZlcnQgRlVER0UgVmVjdG9yMyB0byBPaW1vVmVjM1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX3ZlcnRpY2VzLmxlbmd0aDsgaSArPSAzKSB7IC8vMyBWYWx1ZXMgZm9yIG9uZSBwb2ludFxyXG4gICAgICAgIHZlcnRpY2VzQXNWZWMzLnB1c2gobmV3IE9JTU8uVmVjMyhfdmVydGljZXNbaV0gKiBfc2NhbGUueCwgX3ZlcnRpY2VzW2kgKyAxXSAqIF9zY2FsZS55LCBfdmVydGljZXNbaSArIDJdICogX3NjYWxlLnopKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3IE9JTU8uQ29udmV4SHVsbEdlb21ldHJ5KHZlcnRpY2VzQXNWZWMzKTsgLy9UZWxsIE9pbW9QaHlzaWNzIHRvIGNyZWF0ZSBhIGh1bGwgdGhhdCBpbnZvbHZlcyBhbGwgcG9pbnRzIGJ1dCBjbG9zZSBpdCBvZi4gQSBjb252ZXggc2hhcGUgY2FuIG5vdCBoYXZlIGEgaG9sZSBpbiBpdC5cclxuICAgIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdmVydGljZXMgdGhhdCBjb25zdHJ1Y3QgYSBweXJhbWlkLiBUaGUgdmVydGljZXMgb2YgdGhlIGltcGxlbWVudGVkIHB5cmFtaWQgbWVzaCBjYW4gYmUgdXNlZCB0b28uIEJ1dCB0aGV5IGFyZSBoYWxmZWQgYW5kIGRvdWJsZSBzaWRlZCwgc28gaXQncyBtb3JlIHBlcmZvcm1hbnQgdG8gdXNlIHRoaXMuICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVB5cmFtaWRWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICBsZXQgdmVydGljZXM6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgIC8qMCovLTEsIDAsIDEsIC8qMSovIDEsIDAsIDEsICAvKjIqLyAxLCAwLCAtMSwgLyozKi8gLTEsIDAsIC0xLFxyXG4gICAgICAgIC8qNCovIDAsIDIsIDBcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB2ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkaW5nIHRoaXMgQ29tcG9uZW50UmlnaWRib2R5IHRvIHRoZSBQaHlzaXNjcy53b3JsZCBnaXZpbmcgdGhlIG9pbW9QaHlzaWNzIHN5c3RlbSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkICovXHJcbiAgICBwcml2YXRlIGFkZFJpZ2lkYm9keVRvV29ybGQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy4jcmlnaWRib2R5Ll93b3JsZClcclxuICAgICAgICBQaHlzaWNzLmFkZFJpZ2lkYm9keSh0aGlzKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIFJlbW92aW5nIHRoaXMgQ29tcG9uZW50UmlnaWRib2R5IGZyb20gdGhlIFBoeXNpc2NzLndvcmxkIHRha2luZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIG9pbW9QaHlzaWNzIHN5c3RlbSAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIFBoeXNpY3MucmVtb3ZlUmlnaWRib2R5KHRoaXMpO1xyXG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBwcml2YXRlIEVWRU5UIGZ1bmN0aW9uc1xyXG4gICAgLy9DYWxjdWxhdGluZyB0aGUgY2VudGVyIG9mIGEgY29sbGlzaW9uIGFzIGEgc2luZ3VsYXIgcG9pbnQgLSBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcG9pbnQgLSBieSBnZXR0aW5nIHRoZSBnZW9tZXRyaWNhbCBjZW50ZXIgb2YgYWxsIGNvbGxpZGluZyBwb2ludHNcclxuICAgIHByaXZhdGUgY29sbGlzaW9uQ2VudGVyUG9pbnQoX2NvbFBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10sIF9udW1Qb2ludHM6IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdG90YWxQb2ludHM6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFg6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFk6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFo6IG51bWJlciA9IDA7XHJcbiAgICAgIF9jb2xQb2ludHMuZm9yRWFjaCgoX3ZhbHVlOiBPSU1PLk1hbmlmb2xkUG9pbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAodG90YWxQb2ludHMgPCBfbnVtUG9pbnRzKSB7XHJcbiAgICAgICAgICB0b3RhbFBvaW50cysrO1xyXG4gICAgICAgICAgdG90YWxYICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS54O1xyXG4gICAgICAgICAgdG90YWxZICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS55O1xyXG4gICAgICAgICAgdG90YWxaICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS56O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0b3RhbFggLyBfbnVtUG9pbnRzLCB0b3RhbFkgLyBfbnVtUG9pbnRzLCB0b3RhbFogLyBfbnVtUG9pbnRzKTs7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGNvbGxpc2lvbkVudGVyKF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgYm9keUEuY29sbGlzaW9ucy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZW50ZXJlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLmNvbGxpc2lvbnMucHVzaChib2R5Qik7XHJcbiAgICAgIGJvZHlCLmNvbGxpc2lvbnMucHVzaChib2R5QSk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBtYXliZSByYXRoZXIgZXhwb3NlIHRoZSBtYW5pZm9sZCB0byB0aGUgZXZlbnQgb3Igc29tZXRoaW5nXHJcbiAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IF9jb250YWN0LmdldE1hbmlmb2xkKCk7XHJcbiAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IC8vIEFsbCBwb2ludHMgaW4gdGhlIGNvbGxpc2lvbiB3aGVyZSB0aGUgdHdvIGJvZGllcyBhcmUgdG91Y2hpbmcsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIGltcGFjdFxyXG4gICAgICBsZXQgbm9ybWFsSW1wdWxzZTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRhbmdlbnRJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgYmlub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBtYW5pZm9sZFBvaW50IG9mIHBvaW50cykgeyAvLyBUaGUgaW1wYWN0IG9mIHRoZSBjb2xsaXNpb24gaW52b2x2aW5nIGFsbCB0b3VjaGluZyBwb2ludHNcclxuICAgICAgICBub3JtYWxJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0Tm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgICAgIHRhbmdlbnRJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0VGFuZ2VudEltcHVsc2UoKTtcclxuICAgICAgICBiaW5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXRCaW5vcm1hbEltcHVsc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgICBsZXQgY29sbGlzaW9uQ2VudGVyUG9pbnQ6IFZlY3RvcjMgPSBib2R5QS5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VOVEVSLCBib2R5Qiwgbm9ybWFsSW1wdWxzZSwgdGFuZ2VudEltcHVsc2UsIGJpbm9ybWFsSW1wdWxzZSwgY29sbGlzaW9uQ2VudGVyUG9pbnQsIGNvbGxpc2lvbk5vcm1hbCkpO1xyXG4gICAgICBib2R5Qi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRU5URVIsIGJvZHlBLCBub3JtYWxJbXB1bHNlLCB0YW5nZW50SW1wdWxzZSwgYmlub3JtYWxJbXB1bHNlLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb2xsaXNpb25FeGl0KF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgIWJvZHlBLmNvbGxpc2lvbnMuaW5jbHVkZXMoYm9keUIpKSAvLyBhbHJlYWR5IGV4aXRlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLmNvbGxpc2lvbnMuc3BsaWNlKGJvZHlBLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QiksIDEpO1xyXG4gICAgICBib2R5Qi5jb2xsaXNpb25zLnNwbGljZShib2R5Qi5jb2xsaXNpb25zLmluZGV4T2YoYm9keUEpLCAxKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FWElULCBib2R5QiwgMCwgMCwgMCkpO1xyXG4gICAgICBib2R5Qi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRVhJVCwgYm9keUEsIDAsIDAsIDApKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVHJpZ2dlciBFbnRlcmluZ0V2ZW50IENhbGxiYWNrLCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBPSU1PIFBoeXNpY3Mgd2l0aGluIHRoZWlyIGNhbGN1bGF0aW9ucy5cclxuICAgICogU2luY2UgdGhlIGV2ZW50IGRvZXMgbm90IGtub3cgd2hpY2ggYm9keSBpcyB0aGUgdHJpZ2dlciBpbmlhdG9yLCB0aGUgZXZlbnQgY2FuIGJlIGxpc3RlbmVkIHRvXHJcbiAgICAqIG9uIGVpdGhlciB0aGUgdHJpZ2dlciBvciB0aGUgdHJpZ2dlcmVkLiAoVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggdGhlIEZVREdFIE9JTU8gRm9yayEpXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmlnZ2VyRW50ZXIoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCBib2R5QS50cmlnZ2VyaW5ncy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZW50ZXJlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLnRyaWdnZXJpbmdzLnB1c2goYm9keUIpO1xyXG4gICAgICBib2R5Qi50cmlnZ2VyaW5ncy5wdXNoKGJvZHlBKTtcclxuXHJcbiAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IF9jb250YWN0LmdldE1hbmlmb2xkKCk7XHJcbiAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IFxyXG4gICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgICBsZXQgY29sbGlzaW9uQ2VudGVyUG9pbnQ6IFZlY3RvcjMgPSBib2R5QS5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRU5URVIsIGJvZHlCLCAwLCAwLCAwLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRU5URVIsIGJvZHlBLCAwLCAwLCAwLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRyaWdnZXIgTGVhdmluZ0V2ZW50IENhbGxiYWNrLCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBPSU1PIFBoeXNpY3Mgd2l0aGluIHRoZWlyIGNhbGN1bGF0aW9ucy5cclxuICAgICogU2luY2UgdGhlIGV2ZW50IGRvZXMgbm90IGtub3cgd2hpY2ggYm9keSBpcyB0aGUgdHJpZ2dlciBpbmlhdG9yLCB0aGUgZXZlbnQgY2FuIGJlIGxpc3RlbmVkIHRvXHJcbiAgICAqIG9uIGVpdGhlciB0aGUgdHJpZ2dlciBvciB0aGUgdHJpZ2dlcmVkLiAoVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggdGhlIEZVREdFIE9JTU8gRm9yayEpXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmlnZ2VyRXhpdChfY29udGFjdDogT0lNTy5Db250YWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBib2R5QTogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUxKCk/LnVzZXJEYXRhO1xyXG4gICAgICBsZXQgYm9keUI6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMigpPy51c2VyRGF0YTtcclxuXHJcbiAgICAgIGlmICghYm9keUEgfHwgIWJvZHlCIHx8ICFib2R5QS50cmlnZ2VyaW5ncy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZXhpdGVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEudHJpZ2dlcmluZ3Muc3BsaWNlKGJvZHlBLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QiksIDEpO1xyXG4gICAgICBib2R5Qi50cmlnZ2VyaW5ncy5zcGxpY2UoYm9keUIuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlBKSwgMSk7XHJcblxyXG4gICAgICBib2R5QS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5UUklHR0VSX0VYSVQsIGJvZHlCLCAwLCAwLCAwKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRVhJVCwgYm9keUEsIDAsIDAsIDApKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIGhvbGRpbmcgZGF0YSBhYm91dCBwaHlzaWNzIGRlYnVnIHZlcnRpY2VzLiovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlciB7XHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICBwdWJsaWMgbnVtVmVydGljZXM6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgYXR0cmliczogQXJyYXk8UGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlPjtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG9mZnNldHM6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgc3RyaWRlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBkYXRhTGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIFNldHVwIHRoZSByZW5kZXJpbmcgY29udGV4dCBmb3IgdGhpcyBidWZmZXIgYW5kIGNyZWF0ZSB0aGUgYWN0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb250ZXh0LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yZW5kZXJpbmdDb250ZXh0OiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KSB7XHJcbiAgICAgIHRoaXMuZ2wgPSBfcmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGaWxsIHRoZSBib3VuZCBidWZmZXIgd2l0aCBkYXRhLiBVc2VkIGF0IGJ1ZmZlciBpbml0aWFsaXphdGlvbiAqL1xyXG4gICAgcHVibGljIHNldERhdGEoX2FycmF5OiBBcnJheTxudW1iZXI+KTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLmF0dHJpYnMgPT0gbnVsbCkgdGhyb3cgXCJzZXQgYXR0cmlidXRlcyBmaXJzdFwiO1xyXG4gICAgICB0aGlzLm51bVZlcnRpY2VzID0gX2FycmF5Lmxlbmd0aCAvICh0aGlzLnN0cmlkZSAvIDQpO1xyXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KF9hcnJheSksIHRoaXMuZ2wuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgLy9ub3QgbmVjZXNzYXJ5IGFuIGluIHdlYmdsMiBhbnltb3JlIHRvIHJlYmluZCB0aGUgc2FtZSBsYXN0IGJ1ZmZlciAod2hpY2ggaXMgYWNoaWV2ZWQgYnkgZ2l2aW5nIGEgbnVsbCBidWZmZXIpLCBhZnRlciBidWZmZXIgaXMgY2hhbmdlZC4gUmVtb3ZlZCBpdCBvbiBhbGwgb3RoZXIgb2NjYXNpb25zXHJcbiAgICAgIC8vIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTZXQgU2hhZGVyIEF0dHJpYnV0ZXMgaW5mb3JtYXRpb25zIGJ5IGdldHRpbmcgdGhlaXIgcG9zaXRpb24gaW4gdGhlIHNoYWRlciwgc2V0dGluZyB0aGUgb2Zmc2V0LCBzdHJpZGUgYW5kIHNpemUuIEZvciBsYXRlciB1c2UgaW4gdGhlIGJpbmRpbmcgcHJvY2VzcyAqL1xyXG4gICAgcHVibGljIHNldEF0dHJpYnMoX2F0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4pOiB2b2lkIHtcclxuICAgICAgdGhpcy5hdHRyaWJzID0gX2F0dHJpYnM7XHJcbiAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xyXG4gICAgICB0aGlzLnN0cmlkZSA9IDA7XHJcbiAgICAgIGxldCBuOiBudW1iZXIgPSBfYXR0cmlicy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICB0aGlzLm9mZnNldHMucHVzaCh0aGlzLnN0cmlkZSk7XHJcbiAgICAgICAgdGhpcy5zdHJpZGUgKz0gX2F0dHJpYnNbaV0uZmxvYXQzMkNvdW50ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyAzMmJpdCBmbG9hdCBCeXRlcyBhcmUgYSBjb25zdGFudCBvZiA0XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSBzaGFkZXIgKi9cclxuICAgIHB1YmxpYyBsb2FkQXR0cmliSW5kaWNlcyhfcHJvZ3JhbTogUGh5c2ljc0RlYnVnU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuaW5kaWNlcyA9IF9wcm9ncmFtLmdldEF0dHJpYkluZGljZXModGhpcy5hdHRyaWJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRW5hYmxlIGEgYXR0cmlidXRlIGluIGEgc2hhZGVyIGZvciB0aGlzIGNvbnRleHQsICovXHJcbiAgICBwdWJsaWMgYmluZEF0dHJpYnMoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLmluZGljZXMgPT0gbnVsbCkgdGhyb3cgXCJpbmRpY2VzIGFyZSBub3QgbG9hZGVkXCI7XHJcbiAgICAgIGxldCBuOiBudW1iZXIgPSB0aGlzLmF0dHJpYnMubGVuZ3RoO1xyXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTsgLy9tYWtpbmcgdGhlIGJ1ZmZlciBvZiB0aGlzIGNsYXNzIHRoZSBjdXJyZW50IGJ1ZmZlclxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLmluZGljZXNbaV0pOyAvL2VuYWJsZSB0aGUgQXR0cmlidXRlXHJcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuaW5kaWNlc1tpXSwgdGhpcy5hdHRyaWJzW2ldLmZsb2F0MzJDb3VudCwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIHRoaXMuc3RyaWRlLCB0aGlzLm9mZnNldHNbaV0pOyAvL2NyZWF0ZXMgYSBwb2ludGVyIGFuZCBzdHJ1Y3R1cmUgZm9yIHRoaXMgYXR0cmlidXRlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBJbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBkYXRhIGFib3V0IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcnMgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIge1xyXG4gICAgcHVibGljIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgcHVibGljIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XHJcbiAgICBwdWJsaWMgY291bnQ6IG51bWJlcjtcclxuXHJcbiAgICAvKiogU2V0dXAgdGhlIHJlbmRlcmluZyBjb250ZXh0IGZvciB0aGlzIGJ1ZmZlciBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGlzIGNvbnRleHQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZpbGwgdGhlIGJvdW5kIGJ1ZmZlciB3aXRoIGRhdGEgYW1vdW50LiBVc2VkIGF0IGJ1ZmZlciBpbml0aWFsaXphdGlvbiAqL1xyXG4gICAgcHVibGljIHNldERhdGEoX2FycmF5OiBBcnJheTxudW1iZXI+KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuZXcgSW50MTZBcnJheShfYXJyYXkpLCB0aGlzLmdsLkRZTkFNSUNfRFJBVyk7XHJcbiAgICAgIHRoaXMuY291bnQgPSBfYXJyYXkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgYWN0dWFsIERyYXdDYWxsIGZvciBwaHlzaWNzRGVidWdEcmF3IEJ1ZmZlcnMuIFRoaXMgaXMgd2hlcmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGRlYnVnIGlzIGFjdHVhbGx5IGRyYXduLiAqL1xyXG4gICAgcHVibGljIGRyYXcoX21vZGU6IG51bWJlciA9IHRoaXMuZ2wuVFJJQU5HTEVTLCBfY291bnQ6IG51bWJlciA9IC0xKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKF9tb2RlLCBfY291bnQgPj0gMCA/IF9jb3VudCA6IHRoaXMuY291bnQsIHRoaXMuZ2wuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBtYW5hZ2luZyBkYXRhIGFib3V0IHdlYkdMIEF0dHJpYnV0ZXMgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlIHtcclxuICAgIHB1YmxpYyBmbG9hdDMyQ291bnQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9mbG9hdDMyQ291bnQ6IG51bWJlciwgX25hbWU6IHN0cmluZykge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5mbG9hdDMyQ291bnQgPSBfZmxvYXQzMkNvdW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBTaGFkZXJzIHVzZWQgb25seSBieSB0aGUgcGh5c2ljcyBkZWJ1Z0RyYXcgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnU2hhZGVyIHtcclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgIHB1YmxpYyBwcm9ncmFtOiBXZWJHTFByb2dyYW07XHJcbiAgICBwdWJsaWMgdmVydGV4U2hhZGVyOiBXZWJHTFNoYWRlcjtcclxuICAgIHB1YmxpYyBmcmFnbWVudFNoYWRlcjogV2ViR0xTaGFkZXI7XHJcbiAgICBwdWJsaWMgdW5pZm9ybUxvY2F0aW9uTWFwOiBNYXA8c3RyaW5nLCBXZWJHTFVuaWZvcm1Mb2NhdGlvbj47XHJcblxyXG4gICAgLyoqIEludHJvZHVjZSB0aGUgRlVER0UgUmVuZGVyaW5nIENvbnRleHQgdG8gdGhpcyBjbGFzcywgY3JlYXRpbmcgYSBwcm9ncmFtIGFuZCB2ZXJ0ZXgvZnJhZ21lbnQgc2hhZGVyIGluIHRoaXMgY29udGV4dCAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yZW5kZXJpbmdDb250ZXh0OiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KSB7XHJcbiAgICAgIHRoaXMuZ2wgPSBfcmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgdGhpcy5wcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XHJcbiAgICAgIHRoaXMudmVydGV4U2hhZGVyID0gdGhpcy5nbC5jcmVhdGVTaGFkZXIodGhpcy5nbC5WRVJURVhfU0hBREVSKTtcclxuICAgICAgdGhpcy5mcmFnbWVudFNoYWRlciA9IHRoaXMuZ2wuY3JlYXRlU2hhZGVyKHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGFrZSBnbHNsIHNoYWRlcnMgYXMgc3RyaW5ncyBhbmQgY29tcGlsZSB0aGVtLCBhdHRhY2hpbmcgdGhlIGNvbXBpbGVkIHNoYWRlcnMgdG8gYSBwcm9ncmFtIHRoYXRzIHVzZWQgYnkgdGhpcyByZW5kZXJpbmcgY29udGV4dC4gKi9cclxuICAgIHB1YmxpYyBjb21waWxlKF92ZXJ0ZXhTb3VyY2U6IHN0cmluZywgX2ZyYWdtZW50U291cmNlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy51bmlmb3JtTG9jYXRpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgV2ViR0xVbmlmb3JtTG9jYXRpb24+KCk7XHJcbiAgICAgIHRoaXMuY29tcGlsZVNoYWRlcih0aGlzLnZlcnRleFNoYWRlciwgX3ZlcnRleFNvdXJjZSk7XHJcbiAgICAgIHRoaXMuY29tcGlsZVNoYWRlcih0aGlzLmZyYWdtZW50U2hhZGVyLCBfZnJhZ21lbnRTb3VyY2UpO1xyXG4gICAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMudmVydGV4U2hhZGVyKTtcclxuICAgICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB0aGlzLmZyYWdtZW50U2hhZGVyKTtcclxuICAgICAgdGhpcy5nbC5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgICBpZiAoIXRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuTElOS19TVEFUVVMpKSB7ICAvL21ha2Ugc3VyZSB0aGUgbGlua2luZyB3b3JrZWQsIHNvIHRoZSBwcm9ncmFtIGlzIHZhbGlkLCBhbmQgc2hhZGVycyBhcmUgd29ya2luZ1xyXG4gICAgICAgIERlYnVnLmxvZyh0aGlzLmdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5WQUxJREFURV9TVEFUVVMpKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVSUk9SIHZhbGlkYXRpbmcgcHJvZ3JhbSFcIiwgdGhpcy5nbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IGluZGV4IG9mIGEgYXR0cmlidXRlIGluIGEgc2hhZGVyIGluIHRoaXMgcHJvZ3JhbSAqL1xyXG4gICAgcHVibGljIGdldEF0dHJpYkluZGV4KF9uYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIF9uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHVuaWZvcm0gaW4gYSBzaGFkZXIgaW4gdGhpcyBwcm9ncmFtICovXHJcbiAgICBwdWJsaWMgZ2V0VW5pZm9ybUxvY2F0aW9uKF9uYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XHJcbiAgICAgIGlmICh0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5oYXMoX25hbWUpKSByZXR1cm4gdGhpcy51bmlmb3JtTG9jYXRpb25NYXAuZ2V0KF9uYW1lKTtcclxuICAgICAgbGV0IGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgX25hbWUpO1xyXG4gICAgICB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5zZXQoX25hbWUsIGxvY2F0aW9uKTtcclxuICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgYWxsIGluZGljZXMgZm9yIGV2ZXJ5IGF0dHJpYnV0ZSBpbiB0aGUgc2hhZGVycyBvZiB0aGlzIHByb2dyYW0gKi9cclxuICAgIHB1YmxpYyBnZXRBdHRyaWJJbmRpY2VzKF9hdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+KTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgIGxldCBpbmRpY2VzOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICAgIF9hdHRyaWJzLmZvckVhY2goX3ZhbHVlID0+IHtcclxuICAgICAgICBpbmRpY2VzLnB1c2godGhpcy5nZXRBdHRyaWJJbmRleChfdmFsdWUubmFtZSkpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRlbGwgdGhlIEZVREdFIFJlbmRlcmluZyBDb250ZXh0IHRvIHVzZSB0aGlzIHByb2dyYW0gdG8gZHJhdy4gKi9cclxuICAgIHB1YmxpYyB1c2UoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb21waWxlIGEgc2hhZGVyIG91dCBvZiBhIHN0cmluZyBhbmQgdmFsaWRhdGUgaXQuICovXHJcbiAgICBwdWJsaWMgY29tcGlsZVNoYWRlcihfc2hhZGVyOiBXZWJHTFNoYWRlciwgX3NvdXJjZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKF9zaGFkZXIsIF9zb3VyY2UpO1xyXG4gICAgICB0aGlzLmdsLmNvbXBpbGVTaGFkZXIoX3NoYWRlcik7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRTaGFkZXJQYXJhbWV0ZXIoX3NoYWRlciwgdGhpcy5nbC5DT01QSUxFX1NUQVRVUykpIHtcclxuICAgICAgICBEZWJ1Zy5sb2codGhpcy5nbC5nZXRTaGFkZXJJbmZvTG9nKF9zaGFkZXIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIENsYXNzIHVzZWQgdG8gZHJhdyBkZWJ1Z0luZm9ybWF0aW9ucyBhYm91dCB0aGUgcGh5c2ljcyBzaW11bGF0aW9uIG9udG8gdGhlIHJlbmRlckNvbnRleHQuIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwIC8vQmFzZWQgb24gT2ltb1BoeXNpY3MgSGF4ZSBEZWJ1Z0RyYXdEZW1vIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdEcmF3IGV4dGVuZHMgUmVuZGVyV2ViR0wge1xyXG4gICAgcHVibGljIG9pbW9EZWJ1Z0RyYXc6IE9JTU8uRGVidWdEcmF3OyAvL3RoZSBvcmlnaW5hbCBwaHlzaWNzIGVuZ2luZSBkZWJ1Z0RyYXcgY2xhc3MgcmVjZWl2aW5nIGNhbGxzIGZyb20gdGhlIG9pbW9QaHlzaWNzLldvcmxkLCBhbmQgcHJvdmlkaW5nIGluZm9ybWF0aW9ucyBpbiBmb3JtIG9mIHBvaW50cy9saW5lcy90cmlhbmdsZXMgd2hhdCB0aGUgcGh5c2ljcyB3b3JsZCBsb29rcyBsaWtlXHJcbiAgICBwdWJsaWMgc3R5bGU6IE9JTU8uRGVidWdEcmF3U3R5bGU7IC8vY29sb3JzIG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbnMsIHVuY2hhbmdlZCBpbiBGVURHRSBpbnRlZ3JhdGlvbiwgYmFzaWNhbGx5IGNvbG9yaW5nIHRoaW5ncyBsaWtlIHNsZWVwaW5nL2FjdGl2ZSByYidzIGRpZmZlcmVudGx5LCBqb2ludHMgd2hpdGUgYW5kIHN1Y2guIE5vIG5lZWQgdG8gaGF2ZSB1c2VycyBjaGFuZ2UgYW55dGhpbmcuXHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcblxyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTsgLy9wcm9ncmFtIHRoYXQgaXMgdXNlZCBpbiB0aGUgRlVER0UgcmVuZGVyaW5nIGNvbnRleHQgY29udGFpbmluZyBzaGFkZXJzIGFuZCB1c2UgaW5mb3JtYXRpb25zIGZvciB0aGUgY29udGV4dCB0byBrbm93IGhvdyB0byBkcmF3XHJcbiAgICBwdWJsaWMgc2hhZGVyOiBQaHlzaWNzRGVidWdTaGFkZXI7XHJcblxyXG4gICAgLy9CdWZmZXJzIGZvciBwb2ludHMvbGluZXMvdHJpYW5nbGVzLiBJbmRleCBCdWZmZXIgZm9yIHRoZSBhbW91bnQgb2YgZHJhd0NhbGxzIGFuZCBWZXJ0ZXggQnVmZmVyIGZvciB0aGUgaW5mb3JtYXRpb25zXHJcbiAgICBwdWJsaWMgcG9pbnRWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBwb2ludElCTzogUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXI7XHJcblxyXG4gICAgcHVibGljIGxpbmVWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBsaW5lSUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgdHJpVkJPOiBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXI7XHJcbiAgICBwdWJsaWMgdHJpSUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgcG9pbnREYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIHBvaW50SWJvRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBudW1Qb2ludERhdGE6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgbGluZURhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbGluZUlib0RhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbnVtTGluZURhdGE6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgdHJpRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyB0cmlJYm9EYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG51bVRyaURhdGE6IG51bWJlcjtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgdGhlIGRlYnVnIGZvciBwaHlzaWNzIGluIEZVREdFLiBUZWxsIGl0IHRvIGRyYXcgb25seSB3aXJlZnJhbWUgb2JqZWN0cywgc2luY2UgRlVER0UgaXMgaGFuZGxpbmcgcmVuZGVyaW5nIG9mIHRoZSBvYmplY3RzIGJlc2lkZXMgcGh5c2ljcy4gXHJcbiAgICAgKiBPdmVycmlkZSBPaW1vUGh5c2ljcyBGdW5jdGlvbnMgd2l0aCBvd24gcmVuZGVyaW5nLiBJbml0aWFsaXplIGJ1ZmZlcnMgYW5kIGNvbm5lY3QgdGhlbSB3aXRoIHRoZSBjb250ZXh0IGZvciBsYXRlciB1c2UuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICB0aGlzLnN0eWxlID0gbmV3IE9JTU8uRGVidWdEcmF3U3R5bGUoKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3ID0gbmV3IE9JTU8uRGVidWdEcmF3KCk7XHJcbiAgICAgIHRoaXMub2ltb0RlYnVnRHJhdy53aXJlZnJhbWUgPSB0cnVlOyAvL1RyaWFuZ2xlIFJlbmRlcmluZyBpcyBoYW5kbGVkIGJ5IEZVREdFIHNvLCBvbmx5IHRoZSBwaHlzaWNzIGxpbmVzL3BvaW50cyBuZWVkIHRvIGJlIHJlbmRlcmVkLCBhbHRob3VnaCB0cmlhbmdsZSBpcyBzdGlsbCBpbXBsZW1lbnRlZFxyXG5cclxuICAgICAgdGhpcy5nbCA9IFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU92ZXJyaWRlKCk7XHJcbiAgICAgIHRoaXMuc2hhZGVyID0gbmV3IFBoeXNpY3NEZWJ1Z1NoYWRlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5zaGFkZXIuY29tcGlsZSh0aGlzLnZlcnRleFNoYWRlclNvdXJjZSgpLCB0aGlzLmZyYWdtZW50U2hhZGVyU291cmNlKCkpO1xyXG5cclxuICAgICAgdGhpcy5pbml0aWFsaXplQnVmZmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZWNlaXZlIHRoZSBjdXJyZW50IERlYnVnTW9kZSBmcm9tIHRoZSBwaHlzaWNzIHNldHRpbmdzIGFuZCBzZXQgdGhlIE9pbW9QaHlzaWNzLkRlYnVnRHJhdyBib29sZWFucyB0byBzaG93IG9ubHkgY2VydGFpbiBpbmZvcm1hdGlvbnMuXHJcbiAgICAgKiBOZWVkZWQgc2luY2Ugc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbnMgZXhjbHVkZSBvdGhlcnMsIGFuZCBjYW4ndCBiZSBkcmF3biBhdCB0aGUgc2FtZSB0aW1lLCBieSBPaW1vUGh5c2ljcy4gQW5kIGZvciB1c2VycyBpdCBwcm92aWRlcyBtb3JlIHJlYWRhYmlsaXR5XHJcbiAgICAgKiB0byBkZWJ1ZyBvbmx5IHdoYXQgdGhleSBuZWVkIGFuZCBpcyBjb21tb25seSBkZWJ1Z2dlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldERlYnVnTW9kZShfbW9kZTogUEhZU0lDU19ERUJVR01PREUgPSBQSFlTSUNTX0RFQlVHTU9ERS5OT05FKTogdm9pZCB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICBsZXQgZHJhdyA9IHsgZHJhd0FhYmJzOiBmYWxzZSwgZHJhd0Jhc2VzOiBmYWxzZSwgZHJhd0J2aDogZmFsc2UsIGRyYXdDb250YWN0QmFzZXM6IGZhbHNlLCBkcmF3Q29udGFjdHM6IGZhbHNlLCBkcmF3Sm9pbnRMaW1pdHM6IGZhbHNlLCBkcmF3Sm9pbnRzOiBmYWxzZSwgZHJhd1BhaXJzOiBmYWxzZSwgZHJhd1NoYXBlczogZmFsc2UgfTtcclxuXHJcbiAgICAgIHN3aXRjaCAoX21vZGUpIHtcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkNPTExJREVSUzogLy9Db2xsaWRlcnMgYW5kIEJhc2VzXHJcbiAgICAgICAgICBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd1NoYXBlcyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkpPSU5UU19BTkRfQ09MTElERVI6IC8vQ29sbGlkZXJzIGFuZCBqb2ludHNcclxuICAgICAgICAgIGRyYXcuZHJhd0pvaW50cyA9IGRyYXcuZHJhd0pvaW50TGltaXRzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuUEhZU0lDX09CSkVDVFNfT05MWTogLy9QaHlzaWNzIE9iamVjdHMgb25seSwgc2hvd3Mgc2FtZSBhcyBDb2xsaWRlciAvIEpvaW50cyBidXQgYWxzbyBoaWRpbmcgZXZlcnkgb3RoZXIgZnVkZ2Ugb2JqZWN0XHJcbiAgICAgICAgICBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd0pvaW50TGltaXRzID0gZHJhdy5kcmF3Sm9pbnRzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQ09OVEFDVFM6IC8vQ29udGFjdHNcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3Q29udGFjdEJhc2VzID0gZHJhdy5kcmF3Q29udGFjdHMgPSBkcmF3LmRyYXdQYWlycyA9IGRyYXcuZHJhd1NoYXBlcyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkJPVU5ESU5HX0JPWEVTOiAvL0JvdW5kaW5nIEJveCAvIEJyb2FkcGhhc2UgQnZoIC8gQmFzZXNcclxuICAgICAgICAgIGRyYXcuZHJhd0FhYmJzID0gZHJhdy5kcmF3QmFzZXMgPSBkcmF3LmRyYXdCdmggPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9pbW9EZWJ1Z0RyYXcsIGRyYXcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGluZyB0aGUgZW1wdHkgcmVuZGVyIGJ1ZmZlcnMuIERlZmluaW5nIHRoZSBhdHRyaWJ1dGVzIHVzZWQgaW4gc2hhZGVycy5cclxuICAgICAqIE5lZWRzIHRvIGNyZWF0ZSBlbXB0eSBidWZmZXJzIHRvIGFscmVhZHkgaGF2ZSB0aGVtIHJlYWR5IHRvIGRyYXcgbGF0ZXIgb24sIGxpbmtpbmcgaXMgb25seSBwb3NzaWJsZSB3aXRoIGV4aXN0aW5nIGJ1ZmZlcnMuICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZUJ1ZmZlcnMoKTogdm9pZCB7XHJcbiAgICAgIGxldCBhdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+ID0gW1xyXG4gICAgICAgIG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGUoMywgXCJhUG9zaXRpb25cIiksXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFOb3JtYWxcIiksXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFDb2xvclwiKVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgdGhpcy5wb2ludFZCTyA9IG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMucG9pbnRJQk8gPSBuZXcgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMucG9pbnRWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy5wb2ludFZCTy5sb2FkQXR0cmliSW5kaWNlcyh0aGlzLnNoYWRlcik7XHJcbiAgICAgIHRoaXMubGluZVZCTyA9IG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMubGluZUlCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5saW5lVkJPLnNldEF0dHJpYnMoYXR0cmlicyk7XHJcbiAgICAgIHRoaXMubGluZVZCTy5sb2FkQXR0cmliSW5kaWNlcyh0aGlzLnNoYWRlcik7XHJcbiAgICAgIHRoaXMudHJpVkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy50cmlJQk8gPSBuZXcgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMudHJpVkJPLnNldEF0dHJpYnMoYXR0cmlicyk7XHJcbiAgICAgIHRoaXMudHJpVkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuXHJcbiAgICAgIHRoaXMuY2xlYXJCdWZmZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEJlZm9yZSBPaW1vUGh5c2ljcy53b3JsZCBpcyBmaWxsaW5nIHRoZSBkZWJ1Zy4gTWFrZSBzdXJlIHRoZSBidWZmZXJzIGFyZSByZXNldC4gQWxzbyByZWNlaXZpbmcgdGhlIGRlYnVnTW9kZSBmcm9tIHNldHRpbmdzIGFuZCB1cGRhdGluZyB0aGUgY3VycmVudCBwcm9qZWN0aW9uIGZvciB0aGUgdmVydGV4U2hhZGVyLiAqL1xyXG4gICAgcHVibGljIGNsZWFyQnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5saW5lV2lkdGgoMi4wKTsgLy9Eb2VzIG5vdCBhZmZlY3QgYW55dGhpbmcgYmVjYXVzZSBsaW5lV2lkdGggaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IE1pY3Jvc29mdCBFZGdlIGFuZCBGVURHRSBpcyBvcHRpbWl6ZWQgZm9yIENocm9tZVxyXG5cclxuICAgICAgdGhpcy5wb2ludERhdGEgPSBbXTsgLy9SZXNldHRpbmcgdGhlIGRhdGEgdG8gYmUgZmlsbGVkIGFnYWluXHJcbiAgICAgIHRoaXMubGluZURhdGEgPSBbXTtcclxuICAgICAgdGhpcy50cmlEYXRhID0gW107XHJcblxyXG4gICAgICB0aGlzLm51bVBvaW50RGF0YSA9IDA7IC8vUmVzZXR0aW5nIHRoZSBhbW91bnQgb2YgZGF0YSBjYWxsc1xyXG4gICAgICB0aGlzLm51bUxpbmVEYXRhID0gMDtcclxuICAgICAgdGhpcy5udW1UcmlEYXRhID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWZ0ZXIgT2ltb1BoeXNpY3Mud29ybGQgZmlsbGVkIHRoZSBkZWJ1Zy4gUmVuZGVyaW5nIGNhbGxzLiBTZXR0aW5nIHRoaXMgcHJvZ3JhbSB0byBiZSB1c2VkIGJ5IHRoZSBGVURHRSByZW5kZXJpbmcgY29udGV4dC4gQW5kIGRyYXcgZWFjaCB1cGRhdGVkIGJ1ZmZlciBhbmQgcmVzZXR0aW5nIHRoZW0uICovXHJcbiAgICBwdWJsaWMgZHJhd0J1ZmZlcnMoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhZGVyLnVzZSgpO1xyXG4gICAgICBsZXQgcHJvamVjdGlvbjogRmxvYXQzMkFycmF5ID0gUGh5c2ljcy5tYWluQ2FtLm10eFdvcmxkVG9WaWV3LmdldCgpO1xyXG4gICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5zaGFkZXIuZ2V0VW5pZm9ybUxvY2F0aW9uKFwidV9tdHhNZXNoVG9WaWV3XCIpLCBmYWxzZSwgcHJvamVjdGlvbik7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMubnVtUG9pbnREYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMucG9pbnRJYm9EYXRhID0gW107ICAvL0J1ZmZlciBzaXplIG1hdGNoaW5nIHRvIHdoYXRzIG5lZWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVBvaW50RGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnBvaW50SWJvRGF0YS5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvaW50SUJPLnNldERhdGEodGhpcy5wb2ludElib0RhdGEpOyAvL1NldCBJbmRleCBidWZmZXIgdG8gY29ycmVjdCBzaXplXHJcbiAgICAgICAgdGhpcy5wb2ludFZCTy5zZXREYXRhKHRoaXMucG9pbnREYXRhKTsgLy9TZXQgVmVydGV4IEJ1ZmZlciB0byBjdXJyZW50IERhdGFcclxuICAgICAgICB0aGlzLnBvaW50VkJPLmJpbmRBdHRyaWJzKCk7XHJcbiAgICAgICAgdGhpcy5wb2ludElCTy5kcmF3KHRoaXMuZ2wuUE9JTlRTLCB0aGlzLm51bVBvaW50RGF0YSk7IC8vVGhlIGFjdHVhbCBkcmF3IGNhbGwgZm9yIGVhY2ggaW5kZXggaW4gaWJvXHJcbiAgICAgICAgdGhpcy5udW1Qb2ludERhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm51bUxpbmVEYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMubGluZUlib0RhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5udW1MaW5lRGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLmxpbmVJYm9EYXRhLnB1c2goaSAqIDIpO1xyXG4gICAgICAgICAgdGhpcy5saW5lSWJvRGF0YS5wdXNoKGkgKiAyICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZUlCTy5zZXREYXRhKHRoaXMubGluZUlib0RhdGEpO1xyXG4gICAgICAgIHRoaXMubGluZVZCTy5zZXREYXRhKHRoaXMubGluZURhdGEpO1xyXG4gICAgICAgIHRoaXMubGluZVZCTy5iaW5kQXR0cmlicygpO1xyXG4gICAgICAgIHRoaXMubGluZUlCTy5kcmF3KHRoaXMuZ2wuTElORVMsIHRoaXMubnVtTGluZURhdGEgKiAyKTtcclxuICAgICAgICB0aGlzLm51bUxpbmVEYXRhID0gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5udW1UcmlEYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMudHJpSWJvRGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVRyaURhdGE7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMpO1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMgKyAxKTtcclxuICAgICAgICAgIHRoaXMudHJpSWJvRGF0YS5wdXNoKGkgKiAzICsgMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJpSUJPLnNldERhdGEodGhpcy50cmlJYm9EYXRhKTtcclxuICAgICAgICB0aGlzLnRyaVZCTy5zZXREYXRhKHRoaXMudHJpRGF0YSk7XHJcbiAgICAgICAgdGhpcy50cmlWQk8uYmluZEF0dHJpYnMoKTtcclxuICAgICAgICB0aGlzLnRyaUlCTy5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLCB0aGlzLm51bVRyaURhdGEgKiAzKTtcclxuICAgICAgICB0aGlzLm51bVRyaURhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERyYXdpbmcgdGhlIHJheSBpbnRvIHRoZSBkZWJ1Z0RyYXcgQ2FsbC4gQnkgdXNpbmcgdGhlIG92ZXJ3cml0dGVuIGxpbmUgcmVuZGVyaW5nIGZ1bmN0aW9ucyBhbmQgZHJhd2luZyBhIHBvaW50IChwb2ludFNpemUgZGVmaW5lZCBpbiB0aGUgc2hhZGVyKSBhdCB0aGUgZW5kIG9mIHRoZSByYXkuICovXHJcbiAgICBwdWJsaWMgZGVidWdSYXkoX29yaWdpbjogVmVjdG9yMywgX2VuZDogVmVjdG9yMywgX2NvbG9yOiBDb2xvcik6IHZvaWQge1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcubGluZShuZXcgT0lNTy5WZWMzKF9vcmlnaW4ueCwgX29yaWdpbi55LCBfb3JpZ2luLnopLCBuZXcgT0lNTy5WZWMzKF9lbmQueCwgX2VuZC55LCBfZW5kLnopLCBuZXcgT0lNTy5WZWMzKF9jb2xvci5yLCBfY29sb3IuZywgX2NvbG9yLmIpKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3LnBvaW50KG5ldyBPSU1PLlZlYzMoX2VuZC54LCBfZW5kLnksIF9lbmQueiksIG5ldyBPSU1PLlZlYzMoX2NvbG9yLnIsIF9jb2xvci5nLCBfY29sb3IuYikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBPdmVycmlkaW5nIHRoZSBleGlzdGluZyBmdW5jdGlvbnMgZnJvbSBPaW1vUGh5c2ljcy5EZWJ1Z0RyYXcgd2l0aG91dCBhY3R1YWxseSBpbmhlcml0IGZyb20gdGhlIGNsYXNzLCB0byBhdm9pZCBjb21waWxlciBwcm9ibGVtcy4gXHJcbiAgICAgKiBPdmVycmlkaW5nIHRoZW0gdG8gcmVjZWl2ZSBkZWJ1Z0luZm9ybWF0aW9ucyBpbiB0aGUgZm9ybWF0IHRoZSBwaHlzaWMgZW5naW5lIHByb3ZpZGVzIHRoZW0gYnV0IGhhbmRsaW5nIHRoZSByZW5kZXJpbmcgaW4gdGhlIGZ1ZGdlIGNvbnRleHQuICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVPdmVycmlkZSgpOiB2b2lkIHtcclxuICAgICAgLy9PdmVycmlkZSBwb2ludC9saW5lL3RyaWFuZ2xlIGZ1bmN0aW9ucyBvZiBPaW1vUGh5c2ljcyB3aGljaCBhcmUgdXNlZCB0byBkcmF3IHdpcmVmcmFtZXMgb2Ygb2JqZWN0cywgbGluZXMgb2YgcmF5Y2FzdHMgb3IgdHJpYW5nbGVzIHdoZW4gdGhlIG9iamVjdHMgYXJlIHJlbmRlcmVkIGJ5IHRoZSBwaHlzaWNzIG5vdCBGVURHRSAodW51c2VkKVxyXG5cclxuICAgICAgT0lNTy5EZWJ1Z0RyYXcucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gKF92OiBPSU1PLlZlYzMsIF9jb2xvcjogT0lNTy5WZWMzKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGRlYnVnV3JhcHBlcjogUGh5c2ljc0RlYnVnRHJhdyA9IFBoeXNpY3MuZGVidWdEcmF3OyAvL0dldCB0aGUgY3VzdG9tIHBoeXNpY3MgZGVidWcgY2xhc3MgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGRhdGEuXHJcbiAgICAgICAgaWYgKFBoeXNpY3MubWFpbkNhbSAhPSBudWxsKSB7IC8vb25seSBhY3Qgd2hlbiB0aGVyZSBpcyBhIGNhbWVyYSB0aGF0IGlzIHJlbmRlcmluZ1xyXG4gICAgICAgICAgbGV0IGRhdGE6IEFycmF5PE51bWJlcj4gPSBkZWJ1Z1dyYXBwZXIucG9pbnREYXRhOyAvL2dldCB0aGUgYWxyZWFkeSB3cml0dGVuIGJ1ZmZlciBpbmZvcm1hdGlvbnNcclxuICAgICAgICAgIGRhdGEucHVzaChfdi54LCBfdi55LCBfdi56KTsgLy9Db29yZGluYXRlcyBvZiB0aGUgcG9pbnRcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTsgLy9Qb2ludCBOb3JtYWxzIC0gRW1wdHkgc2luY2UgaXQncyBub3QgYSBwb2x5Z29uXHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7IC8vQ29sb3Igb2YgdGhlIHBvaW50XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtUG9pbnREYXRhKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgT0lNTy5EZWJ1Z0RyYXcucHJvdG90eXBlLmxpbmUgPSBmdW5jdGlvbiAoX3YxOiBPSU1PLlZlYzMsIF92MjogT0lNTy5WZWMzLCBfY29sb3I6IE9JTU8uVmVjMyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkZWJ1Z1dyYXBwZXI6IFBoeXNpY3NEZWJ1Z0RyYXcgPSBQaHlzaWNzLmRlYnVnRHJhdztcclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBkYXRhOiBBcnJheTxudW1iZXI+ID0gZGVidWdXcmFwcGVyLmxpbmVEYXRhO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92MS54LCBfdjEueSwgX3YxLnopOyAvL1BvaW50IDEgQ29vcmRpbmF0ZXNcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTsgLy9QMSBOb3JtYWxzIC0gRW1wdHkgc2luY2UgaXQncyBub3QgYSBwb2x5Z29uXHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7IC8vUDEgQ29sb3JcclxuICAgICAgICAgIGRhdGEucHVzaChfdjIueCwgX3YyLnksIF92Mi56KTsgLy9Qb2ludCAyIENvb3JkaW5hdGVzXHJcbiAgICAgICAgICBkYXRhLnB1c2goMCwgMCwgMCk7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtTGluZURhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUudHJpYW5nbGUgPSBmdW5jdGlvbiAoX3YxOiBPSU1PLlZlYzMsIF92MjogT0lNTy5WZWMzLCBfdjM6IE9JTU8uVmVjMywgX24xOiBPSU1PLlZlYzMsIF9uMjogT0lNTy5WZWMzLCBfbjM6IE9JTU8uVmVjMywgX2NvbG9yOiBPSU1PLlZlYzMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZGVidWdXcmFwcGVyOiBQaHlzaWNzRGVidWdEcmF3ID0gUGh5c2ljcy5kZWJ1Z0RyYXc7XHJcbiAgICAgICAgaWYgKFBoeXNpY3MubWFpbkNhbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YTogQXJyYXk8bnVtYmVyPiA9IGRlYnVnV3JhcHBlci50cmlEYXRhO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92MS54LCBfdjEueSwgX3YxLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMS54LCBfbjEueSwgX24xLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92Mi54LCBfdjIueSwgX3YyLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMi54LCBfbjIueSwgX24yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92My54LCBfdjMueSwgX3YzLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMy54LCBfbjMueSwgX24zLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGVidWdXcmFwcGVyLm51bVRyaURhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzb3VyY2UgY29kZSAoc3RyaW5nKSBvZiB0aGUgaW4gcGh5c2ljc0RlYnVnIHVzZWQgdmVyeSBzaW1wbGUgdmVydGV4U2hhZGVyLlxyXG4gICAgICogIEhhbmRsaW5nIHRoZSBwcm9qZWN0aW9uICh3aGljaCBpbmNsdWRlcywgdmlldy93b3JsZFtpcyBhbHdheXMgaWRlbnRpdHkgaW4gdGhpcyBjYXNlXS9wcm9qZWN0aW9uIGluIEZVREdFKS4gSW5jcmVhc2luZyB0aGUgc2l6ZSBvZiBzaW5nbGUgcG9pbnRzIGRyYXduLlxyXG4gICAgICogIEFuZCB0cmFuc2ZlciBwb3NpdGlvbiBjb2xvciB0byB0aGUgZnJhZ21lbnRTaGFkZXIuICovXHJcbiAgICBwcml2YXRlIHZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYFxyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0YXR0cmlidXRlIHZlYzMgYVBvc2l0aW9uO1xyXG5cdFx0XHRhdHRyaWJ1dGUgdmVjMyBhQ29sb3I7XHJcblx0XHRcdGF0dHJpYnV0ZSB2ZWMzIGFOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG5cdFx0XHR1bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3O1xyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cdFx0XHRcdHZQb3NpdGlvbiA9IGFQb3NpdGlvbjtcclxuXHRcdFx0XHR2Q29sb3IgPSBhQ29sb3I7XHJcblx0XHRcdFx0dk5vcm1hbCA9IGFOb3JtYWw7XHJcblx0XHRcdFx0Z2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFQb3NpdGlvbiwxLjApO1xyXG5cdFx0XHRcdGdsX1BvaW50U2l6ZSA9IDYuMDtcclxuXHRcdFx0fWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzb3VyY2UgY29kZSAoc3RyaW5nKSBvZiB0aGUgaW4gcGh5c2ljc0RlYnVnIHVzZWQgc3VwZXIgc2ltcGxlIGZyYWdtZW50U2hhZGVyLiBVbmxpdCAtIG9ubHkgY29sb3JpemluZyB0aGUgZHJhd24gcGl4ZWxzLCBub3JtYWxzL3Bvc2l0aW9uIGFyZSBnaXZlbiB0byBtYWtlIGl0IGV4cGFuZGFibGUgKi9cclxuICAgIHByaXZhdGUgZnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBcclxuICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQodkNvbG9yLCAxLjApO1xyXG5cdFx0XHR9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgb2YgdHJhbnNsYXRpb24gYW5kIHJvdGF0aW9uLiBUd28gRGVncmVlcyBvZiBGcmVlZG9tIGluIHRoZSBkZWZpbmVkIGF4aXMuXHJcbiAgICogVHdvIFJpZ2lkQm9kaWVzIG5lZWQgdG8gYmUgZGVmaW5lZCB0byB1c2UgaXQuIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgZm9yIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGlvbiwgYWxvbmcgd2l0aCBzcHJpbmcgc2V0dGluZ3MuXHJcbiAgICogXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIEpvaW50SG9sZGVyIC0gYm9keUFuY2hvclxyXG4gICAqICAgICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilJBcclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICogICAgICAgICAgIDzilIDilIDilIDilIDilIDilIDilIDilIDilIIgICDilILilIDilIDilIDilIDilIDilIA+IHRpZWQgYm9keSwgc2xpZGluZyBvbiBheGlzID0gMXN0IGRlZ3JlZSBvZiBmcmVlZG9tXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUgiAgICAgICAgcm90YXRpbmcgYXJvdW5kIGF4aXMgPSAybmQgZGVncmVlIG9mIGZyZWVkb20gXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxyXG4gICAqIGBgYCAgXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludEN5bGluZHJpY2FsIGV4dGVuZHMgSm9pbnRBeGlhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludEN5bGluZHJpY2FsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uQ3lsaW5kcmljYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uQ3lsaW5kcmljYWxKb2ludENvbmZpZyA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnRDb25maWcoKTtcclxuICAgIHByb3RlY3RlZCBtb3RvcjogT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcjtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1JvdGF0aW9uOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvckZvcmNlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvcjogbnVtYmVyID0gMzYwO1xyXG4gICAgI21pblJvdG9yOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI3JvdG9yOiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI3JvdG9yU3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBjeWxpbmRyaWNhbCBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBtb3Zpbmcgb24gb25lIGF4aXMgYW5kIHJvdGF0aW5nIGFyb3VuZCBhbm90aGVyIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5zcHJpbmdEYW1waW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3koX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIuc3ByaW5nRnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuIEluZmx1ZW5jaW5nIFRPUlFVRSAvIFJPVEFUSU9OXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nUm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ1JvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdSb3RhdGlvbiA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsU3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIEluZmx1ZW5jaW5nIFRPUlFVRSAvIFJPVEFUSU9OXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5Um90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhSb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heFJvdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Sb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pblJvdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgcm90YXRpb25hbCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RvclNwZWVkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclNwZWVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3JvdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWF4TW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWF4TW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLmxvd2VyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciBmb3JjZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvckZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvckZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvckZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5tb3RvckZvcmNlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLiNnZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyb3RvclNwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uLCB0aGlzLnNwcmluZ0RhbXBpbmdSb3RhdGlvbik7XHJcblxyXG4gICAgICB0aGlzLm1vdG9yID0gbmV3IE9JTU8uVHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHMoc3VwZXIubWluTW90b3IsIHN1cGVyLm1heE1vdG9yKTtcclxuICAgICAgdGhpcy5tb3Rvci5zZXRNb3RvcihzdXBlci5tb3RvclNwZWVkLCB0aGlzLm1vdG9yRm9yY2UpO1xyXG4gICAgICB0aGlzLiNyb3RvciA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluUm90b3IgKiBDYWxjLmRlZzJyYWQsIHRoaXMubWF4Um90b3IgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNyb3Rvci5zZXRNb3Rvcih0aGlzLnJvdG9yU3BlZWQsIHRoaXMucm90b3JUb3JxdWUpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5DeWxpbmRyaWNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy50cmFuc2xhdGlvbmFsU3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yID0gdGhpcy5tb3RvcjtcclxuICAgICAgdGhpcy5jb25maWcucm90YXRpb25hbExpbWl0TW90b3IgPSB0aGlzLiNyb3RvcjtcclxuICAgICAgdGhpcy5jb25maWcucm90YXRpb25hbFNwcmluZ0RhbXBlciA9IHRoaXMuI3JvdG9yU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIG1vdG9yRm9yY2U6IHRoaXMubW90b3JGb3JjZSxcclxuICAgICAgICBzcHJpbmdEYW1waW5nUm90YXRpb246IHRoaXMuc3ByaW5nRGFtcGluZ1JvdGF0aW9uLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uOiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uLFxyXG4gICAgICAgIG1heFJvdG9yOiB0aGlzLm1heFJvdG9yLFxyXG4gICAgICAgIG1pblJvdG9yOiB0aGlzLm1pblJvdG9yLFxyXG4gICAgICAgIHJvdG9yVG9ycXVlOiB0aGlzLnJvdG9yVG9ycXVlLFxyXG4gICAgICAgIHJvdG9yU3BlZWQ6IHRoaXMucm90b3JTcGVlZFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcIm1vdG9yRm9yY2VcIiwgXCJyb3RvclRvcnF1ZVwiLCBcInJvdG9yU3BlZWRcIiwgXCJtYXhSb3RvclwiLCBcIm1pblJvdG9yXCIsIFwic3ByaW5nRGFtcGluZ1JvdGF0aW9uXCIsIFwic3ByaW5nRnJlcXVlbmN5Um90YXRpb25cIiwgXCJzcHJpbmdGcmVxdWVuY3lcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMgd2l0aCBhIGRlZmluZWQgYXhlIG1vdmVtZW50LlxyXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSBzbGlkaW5nIGpvaW50IGFsb25nIG9uZSBheGlzLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC5cclxuICAgICAqIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgdG8gbW92ZSB0aGUgY29ubmVjdGVkIGFsb25nIHRoZSBkZWZpbmVkIGF4aXMuIEdyZWF0IHRvIGNvbnN0cnVjdCBzdGFuZGFyZCBzcHJpbmdzIG9yIHBoeXNpY2FsIHNsaWRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIGBgYHRleHRcclxuICAgICAqICAgICAgICAgIEpvaW50SG9sZGVyIC0gYm9keUFuY2hvclxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUglxyXG4gICAgICogICAgICAgICAgIDzilIDilIDilIDilIDilIDilIDilIDilIDilIIgICDilILilIDilIDilIDilIDilIDilIA+IHRpZWQgYm9keSwgc2xpZGluZyBvbiBvbmUgQXhpcywgMSBEZWdyZWUgb2YgRnJlZWRvbVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUglxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxyXG4gICAgICogYGBgXHJcbiAgICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRQcmlzbWF0aWMgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UHJpc21hdGljKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUHJpc21hdGljSm9pbnQ7XHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBPSU1PLlByaXNtYXRpY0pvaW50Q29uZmlnID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcoKTtcclxuICAgIHByb3RlY3RlZCBtb3RvcjogT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcjtcclxuICAgIC8vSW50ZXJuYWxseSB1c2VkIHZhcmlhYmxlcyAtIEpvaW50IFByb3BlcnRpZXMgdGhhdCBhcmUgdXNlZCBldmVuIHdoZW4gbm8gYWN0dWFsIGpvaW50IGlzIGN1cnJlbnRseSBleGlzdGVudFxyXG5cclxuICAgICNtb3RvckZvcmNlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIHByaXNtYXRpYyBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBvbmx5IG1vdmluZyBvbiBvbmUgYXhpcyBib3VuZCBvbiBhIGxvY2FsIGFuY2hvcnBvaW50LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQsIF9heGlzLCBfbG9jYWxBbmNob3IpO1xyXG5cclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDEwO1xyXG4gICAgICB0aGlzLm1pbk1vdG9yID0gLTEwO1xyXG4gICAgfVxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFRoaXMgaXMgdGhlIGZvcmNlIHRoYXQgdGhlIG1vdG9yIGlzIHVzaW5nIHRvIGhvbGQgdGhlIHBvc2l0aW9uLCBvciByZWFjaCBpdCBpZiBhIG1vdG9yU3BlZWQgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvckZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvckZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvckZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLm1vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG1vdG9yRm9yY2U6IHRoaXMubW90b3JGb3JjZSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubW90b3JGb3JjZSA9IF9zZXJpYWxpemF0aW9uLm1vdG9yRm9yY2U7XHJcbiAgICAgIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLm1vdG9yRm9yY2UgPSB0aGlzLm1vdG9yRm9yY2U7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tb3RvckZvcmNlKSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLm1vdG9yRm9yY2UgPSBfbXV0YXRvci5tb3RvckZvcmNlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3JGb3JjZTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqIEFjdHVhbCBjcmVhdGlvbiBvZiBhIGpvaW50IGluIHRoZSBPaW1vUGh5c2ljcyBzeXN0ZW0gKi9cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tb3RvciA9IG5ldyBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluTW90b3IsIHRoaXMubWF4TW90b3IpOyAvL0NyZWF0ZSBtb3RvciBzZXR0aW5ncywgdG8gaG9sZCBwb3NpdGlvbnMsIHNldCBjb25zdHJhaW50IG1pbi9tYXhcclxuICAgICAgdGhpcy5tb3Rvci5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWQsIHRoaXMubW90b3JGb3JjZSk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlByaXNtYXRpY0pvaW50Q29uZmlnKCk7IC8vQ3JlYXRlIGEgc3BlY2lmaWMgY29uZmlnIGZvciB0aGlzIGpvaW50IHR5cGUgdGhhdCBpcyBjYWxjdWxhdGluZyB0aGUgbG9jYWwgYXhpcyBmb3IgYm90aCBib2RpZXNcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQoKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLnNwcmluZ0RhbXBlciA9IHRoaXMuc3ByaW5nRGFtcGVyOyAvL1RlbGxpbmcgdGhlIGNvbmZpZyB0byB1c2UgdGhlIG1vdG9yL3NwcmluZyBvZiB0aGUgRlVER0UgQ29tcG9uZW50XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IgPSB0aGlzLm1vdG9yO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLlByaXNtYXRpY0pvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgdGhpcy5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzLCBkZXNpZ25lZCB0byBzaW11bGF0ZSBiZWhhdmlvdXIgd2l0aGluIGEgcmVhbCBib2R5LiBJdCBoYXMgdHdvIGF4aXMsIGEgc3dpbmcgYW5kIHR3aXN0IGF4aXMsIGFuZCBhbHNvIHRoZSBwZXJwZW5kaWN1bGFyIGF4aXMsIFxyXG4gICAgKiBzaW1pbGFyIHRvIGEgU3BoZXJpY2FsIGpvaW50LCBidXQgbW9yZSByZXN0cmljdGl2ZSBpbiBpdCdzIGFuZ2xlcyBhbmQgb25seSB0d28gZGVncmVlcyBvZiBmcmVlZG9tLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gTW9zdGx5IHVzZWQgdG8gY3JlYXRlIGh1bWFubGlrZSBqb2ludHMgdGhhdCBiZWhhdmUgbGlrZSBhIFxyXG4gICAgKiBsaWZlbGVzcyBib2R5LlxyXG4gICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIC0gaXQgY2FuIHR3aXN0IG9uIG9uZSBheGlzIGFuZCBzd2luZyBvbiBhbm90aGVyXHJcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAgKiAgICAgICAgIHogICAgICAgICAgICDilIzilIDilIDilIDilJAg4pSCIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAgKiAgICAgICAgIOKGkSAgICAgICAgICAgIOKUgiAgIOKUgiDihpMg4pSCICAg4pSCICAgICAgICBlLmcuIHogPSBUd2lzdEF4aXMsIGl0IGNhbiByb3RhdGUgaW4taXRzZWxmIGFyb3VuZCB0aGlzIGF4aXMgXHJcbiAgICAqICAgIC14IOKGkOKUgOKUvOKUgOKGkiB4ICAgICAgICDilIIgICDilIIgeCDilIIgICDilIIgICAgICAgIGUuZy4geCA9IFN3aW5nQXhpcywgaXQgY2FuIHJvdGF0ZSBhbmNob3JlZCBhcm91bmQgdGhlIGJhc2Ugb24gdGhpcyBheGlzICAgXHJcbiAgICAqICAgICAgICAg4oaTICAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICAgICAgICBcclxuICAgICogICAgICAgIC16ICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSYICAgICAgICAgZS5nLiB5b3UgY2FuIHR3aXN0IHRoZSBsZWcgaW4taXRzZWxmIHRvIGEgY2VydGFpbiBkZWdyZWUsXHJcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgYWxzbyByb3RhdGUgaXQgZm9yd2FyZC9iYWNrd2FyZC9sZWZ0L3JpZ2h0IHRvIGEgY2VydGFpbiBkZWdyZWVcclxuICAgICogICAgICAgICAgICAgICAgYm9keUFuY2hvciAgICAgICAgICBib2R5VGllZFxyXG4gICAgKiAgICAgICAgICAgICAgKGUuZy4gcGVsdmlzKSAgICAgICAgIChlLmcuIHVwcGVyLWxlZylcclxuICAgICogXHJcbiAgICAqIGBgYFxyXG4gICAgKiBUd2lzdCBlcXVhbHMgYSByb3RhdGlvbiBhcm91bmQgYSBwb2ludCB3aXRob3V0IG1vdmluZyBvbiBhbiBheGlzLlxyXG4gICAgKiBTd2luZyBlcXVhbHMgYSByb3RhdGlvbiBvbiBhIHBvaW50IHdpdGggYSBtb3ZpbmcgbG9jYWwgYXhpcy5cclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50UmFnZG9sbCBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UmFnZG9sbCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLlJhZ2RvbGxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdUd2lzdDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lUd2lzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1N3aW5nOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVN3aW5nOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhNb3RvclR3aXN0OiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluTW90b3JUd2lzdDogbnVtYmVyID0gMDtcclxuICAgICNtb3RvclRvcnF1ZVR3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21vdG9yU3BlZWRUd2lzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbW90b3JUd2lzdDogT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcjtcclxuICAgICNzcHJpbmdEYW1wZXJUd2lzdDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjc3ByaW5nRGFtcGVyU3dpbmc6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG4gICAgI2F4aXNGaXJzdDogT0lNTy5WZWMzO1xyXG4gICAgI2F4aXNTZWNvbmQ6IE9JTU8uVmVjMztcclxuXHJcbiAgICAjbWF4QW5nbGVGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNtYXhBbmdsZVNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXNGaXJzdDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDEsIDAsIDApLCBfYXhpc1NlY29uZDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDEpLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkKTtcclxuICAgICAgdGhpcy5heGlzRmlyc3QgPSBfYXhpc0ZpcnN0O1xyXG4gICAgICB0aGlzLmF4aXNTZWNvbmQgPSBfYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy5hbmNob3IgPSBfbG9jYWxBbmNob3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgICogIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXhpc0ZpcnN0KCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpc0ZpcnN0LngsIHRoaXMuI2F4aXNGaXJzdC55LCB0aGlzLiNheGlzRmlyc3Queik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXNGaXJzdChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc0ZpcnN0ID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNTZWNvbmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzU2Vjb25kLngsIHRoaXMuI2F4aXNTZWNvbmQueSwgdGhpcy4jYXhpc1NlY29uZC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc1NlY29uZChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc1NlY29uZCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSBhbmdsZSBvZiByb3RhdGlvbiBhbG9uZyB0aGUgZmlyc3QgYXhpcy4gVmFsdWUgbmVlZHMgdG8gYmUgcG9zaXRpdmUuIENoYW5nZXMgZG8gcmVidWlsZCB0aGUgam9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhBbmdsZUZpcnN0QXhpcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4QW5nbGVGaXJzdCAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4QW5nbGVGaXJzdEF4aXMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4QW5nbGVGaXJzdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIGFuZ2xlIG9mIHJvdGF0aW9uIGFsb25nIHRoZSBzZWNvbmQgYXhpcy4gVmFsdWUgbmVlZHMgdG8gYmUgcG9zaXRpdmUuIENoYW5nZXMgZG8gcmVidWlsZCB0aGUgam9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhBbmdsZVNlY29uZEF4aXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heEFuZ2xlU2Vjb25kICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhBbmdsZVNlY29uZEF4aXMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4QW5nbGVTZWNvbmQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ1R3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1R3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5VHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZ1N3aW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nU3dpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdTd2luZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nU3dpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3dpbmdTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lTd2luZygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5U3dpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVN3aW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVN3aW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFN3aW5nU3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhNb3RvclR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhNb3RvclR3aXN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhNb3RvclR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuI21heE1vdG9yVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Nb3RvclR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Nb3RvclR3aXN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtaW5Nb3RvclR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuI21pbk1vdG9yVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JTcGVlZFR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclNwZWVkVHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yU3BlZWRUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclNwZWVkVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JUb3JxdWVUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbW90b3JUb3JxdWVUd2lzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JUb3JxdWVUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclRvcnF1ZVR3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0TGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzRmlyc3QgPSB0aGlzLmF4aXNGaXJzdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXhpc0ZpcnN0LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNGaXJzdCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXhpc1NlY29uZC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc0ZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmF4aXNGaXJzdCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzRmlyc3QpKSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXNTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc1NlY29uZCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzU2Vjb25kKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc0ZpcnN0O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBlclR3aXN0ID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5VHdpc3QsIHRoaXMuc3ByaW5nRGFtcGluZ1R3aXN0KTtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyU3dpbmcgPSBuZXcgT0lNTy5TcHJpbmdEYW1wZXIoKS5zZXRTcHJpbmcodGhpcy5zcHJpbmdGcmVxdWVuY3lTd2luZywgdGhpcy5zcHJpbmdEYW1waW5nU3dpbmcpO1xyXG5cclxuICAgICAgdGhpcy4jbW90b3JUd2lzdCA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluTW90b3JUd2lzdCwgdGhpcy5tYXhNb3RvclR3aXN0KTtcclxuICAgICAgdGhpcy4jbW90b3JUd2lzdC5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWRUd2lzdCwgdGhpcy5tb3RvclRvcnF1ZVR3aXN0KTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuYXhpc0ZpcnN0LCB0aGlzLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zd2luZ1NwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlclN3aW5nO1xyXG4gICAgICB0aGlzLmNvbmZpZy50d2lzdFNwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlclR3aXN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy50d2lzdExpbWl0TW90b3IgPSB0aGlzLiNtb3RvclR3aXN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5tYXhTd2luZ0FuZ2xlMSA9IHRoaXMuI21heEFuZ2xlRmlyc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLm1heFN3aW5nQW5nbGUyID0gdGhpcy4jbWF4QW5nbGVTZWNvbmQ7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgc3VwZXIuY29uZmlndXJlSm9pbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbWF4QW5nbGVGaXJzdDogdGhpcy4jbWF4QW5nbGVGaXJzdCxcclxuICAgICAgICBtYXhBbmdsZVNlY29uZDogdGhpcy4jbWF4QW5nbGVTZWNvbmQsXHJcbiAgICAgICAgc3ByaW5nRGFtcGluZ1R3aXN0OiB0aGlzLnNwcmluZ0RhbXBpbmdUd2lzdCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lUd2lzdDogdGhpcy5zcHJpbmdGcmVxdWVuY3lUd2lzdCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nU3dpbmc6IHRoaXMuc3ByaW5nRGFtcGluZ1N3aW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVN3aW5nOiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVN3aW5nLFxyXG4gICAgICAgIG1heE1vdG9yVHdpc3Q6IHRoaXMuI21heE1vdG9yVHdpc3QsXHJcbiAgICAgICAgbWluTW90b3JUd2lzdDogdGhpcy4jbWluTW90b3JUd2lzdCxcclxuICAgICAgICBtb3RvclNwZWVkVHdpc3Q6IHRoaXMubW90b3JTcGVlZFR3aXN0LFxyXG4gICAgICAgIG1vdG9yVG9ycXVlVHdpc3Q6IHRoaXMubW90b3JUb3JxdWVUd2lzdFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tYXhBbmdsZUZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLiNtYXhBbmdsZUZpcnN0ID0gX211dGF0b3IubWF4QW5nbGVGaXJzdDtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IubWF4QW5nbGVTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuI21heEFuZ2xlU2Vjb25kID0gX211dGF0b3IubWF4QW5nbGVTZWNvbmQ7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1xyXG4gICAgICAgIFwic3ByaW5nRGFtcGluZ1R3aXN0XCIsIFwic3ByaW5nRnJlcXVlbmN5VHdpc3RcIiwgXCJzcHJpbmdEYW1waW5nU3dpbmdcIiwgXCJzcHJpbmdGcmVxdWVuY3lTd2luZ1wiLCBcIm1heE1vdG9yVHdpc3RcIiwgXCJtaW5Nb3RvclR3aXN0XCIsIFwibW90b3JTcGVlZFR3aXN0XCIsIFwibW90b3JUb3JxdWVUd2lzdFwiXHJcbiAgICAgIF0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMgd2l0aCBhIGRlZmluZWQgYXhlIG9mIHJvdGF0aW9uLiBBbHNvIGtub3duIGFzIEhJTkdFIGpvaW50LlxyXG4gICAgICogVHdvIFJpZ2lkQm9kaWVzIG5lZWQgdG8gYmUgZGVmaW5lZCB0byB1c2UgaXQuIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgdG8gcm90YXRlIHRoZSBjb25uZWN0ZWQgYWxvbmcgdGhlIGRlZmluZWQgYXhpcy5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dCAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uIGF4aXMsIDFzdCBEZWdyZWUgb2YgZnJlZWRvbVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKGkVxyXG4gICAgICogICAgICAgICAgICAgICDilIzilIDilIDilIDilJDilILilIzilIDilIDilIDilIDilJAgICAgIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCICBcclxuICAgICAqICAgICAgICAgICAgICAg4pSCICAg4pSC4pSC4pSCICAgIOKUgiBcclxuICAgICAqICAgICAgICAgICAgICAg4pSCICAg4pSC4pSC4pSCICAgIOKUgiBcclxuICAgICAqICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSY4pSC4pSU4pSA4pSA4pSA4pSA4pSYXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAgXHJcbiAgICAgKiAgICAgIGJvZHlBbmNob3IgICAgICAgICBib2R5VGllZFxyXG4gICAgICogICAoZS5nLiBEb29yaGluZ2UpICAgICAgIChlLmcuIERvb3IpXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFJldm9sdXRlIGV4dGVuZHMgSm9pbnRBeGlhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludFJldm9sdXRlKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUmV2b2x1dGVKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZyA9IG5ldyBPSU1PLlJldm9sdXRlSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjbW90b3JUb3JxdWU6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3I6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQsIF9heGlzLCBfbG9jYWxBbmNob3IpO1xyXG5cclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDM2MDtcclxuICAgICAgdGhpcy5taW5Nb3RvciA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1heE1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICBfdmFsdWUgKj0gQ2FsYy5kZWcycmFkO1xyXG4gICAgICBpZiAodGhpcy5qb2ludClcclxuICAgICAgICB0aGlzLmpvaW50LmdldExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1pbk1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludClcclxuICAgICAgICB0aGlzLmpvaW50LmdldExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclRvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBtb3RvclRvcnF1ZTogdGhpcy5tb3RvclRvcnF1ZSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubW90b3JUb3JxdWUgPSBfc2VyaWFsaXphdGlvbi5tb3RvclRvcnF1ZTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3IubW90b3JUb3JxdWUgPSB0aGlzLm1vdG9yVG9ycXVlO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IubW90b3JUb3JxdWUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMubW90b3JUb3JxdWUgPSBfbXV0YXRvci5tb3RvclRvcnF1ZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1vdG9yVG9ycXVlO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JvdG9yID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHMoc3VwZXIubWluTW90b3IgKiBDYWxjLmRlZzJyYWQsIHN1cGVyLm1heE1vdG9yICogQ2FsYy5kZWcycmFkKTtcclxuICAgICAgdGhpcy4jcm90b3Iuc2V0TW90b3IodGhpcy5tb3RvclNwZWVkLCB0aGlzLm1vdG9yVG9ycXVlKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZygpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IgPSB0aGlzLiNyb3RvcjtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5SZXZvbHV0ZUpvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgdGhpcy5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIHRocmVlIERlZ3JlZXMgb2YgRnJlZWRvbSwgYWxzbyBrbm93biBhcyBiYWxsIGFuZCBzb2NrZXQgam9pbnQuIFR3byBib2RpZXMgY29ubmVjdGVkIGF0IHRoZWlyIGFuY2hvciBidXQgZnJlZSB0byByb3RhdGUuXHJcbiAgICAgKiBVc2VkIGZvciB0aGluZ3MgbGlrZSB0aGUgY29ubmVjdGlvbiBvZiBib25lcyBpbiB0aGUgaHVtYW4gc2hvdWxkZXIgKGlmIHNpbXBsaWZpZWQsIGVsc2UgYmV0dGVyIHVzZSBKb2ludFJhZ2RvbGwpLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gT25seSBzcHJpbmcgc2V0dGluZ3MgY2FuIGJlIGRlZmluZWQuXHJcbiAgICAgKiAzIERlZ3JlZXMgYXJlIHN3aW5nIGhvcml6b250YWwsIHN3aW5nIHZlcnRpY2FsIGFuZCB0d2lzdC5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICogICAgICAgICAgICAgIEpvaW50SG9sZGVyXHJcbiAgICAgKiAgICAgICAgIHogICAgICBib2R5QW5jaG9yIChlLmcuIEh1bWFuLVNob3VsZGVyKSAgICAgXHJcbiAgICAgKiAgICAgIHkgIOKGkSAgICAgICAgICBcclxuICAgICAqICAgICAgICBcXHwgICAgICAgICAg4pSA4pSA4pSAKOKXj+KUgOKUgOKUgFxyXG4gICAgICogIC14IDwtLS18LS0tPiB4ICAgICAgICAgICBib2R5VGllZCAgICAgICAgXHJcbiAgICAgKiAgICAgICAgIHxcXCAgICAgICAgICAgICAgICAoZS5nLiBVcHBlci1Bcm0pIFxyXG4gICAgICogICAgICAgICDihpMgLXkgICAgICAgXHJcbiAgICAgKiAgICAgICAgLXogICAgICAgICAgXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFNwaGVyaWNhbCBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50U3BoZXJpY2FsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uU3BoZXJpY2FsSm9pbnQ7XHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBPSU1PLlNwaGVyaWNhbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uU3BoZXJpY2FsSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZzogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3k6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gbmV3IFZlY3RvcjMoX2xvY2FsQW5jaG9yLngsIF9sb2NhbEFuY2hvci55LCBfbG9jYWxBbmNob3Iueik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3koX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc3ByaW5nRGFtcGluZzogdGhpcy5zcHJpbmdEYW1waW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeTogdGhpcy5zcHJpbmdGcmVxdWVuY3ksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLnNwcmluZ0RhbXBpbmcgPSBfc2VyaWFsaXphdGlvbi5zcHJpbmdEYW1waW5nO1xyXG4gICAgICB0aGlzLnNwcmluZ0ZyZXF1ZW5jeSA9IF9zZXJpYWxpemF0aW9uLnNwcmluZ0ZyZXF1ZW5jeTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3Iuc3ByaW5nRGFtcGluZyA9IHRoaXMuc3ByaW5nRGFtcGluZztcclxuICAgICAgbXV0YXRvci5zcHJpbmdGcmVxdWVuY3kgPSB0aGlzLnNwcmluZ0ZyZXF1ZW5jeTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wic3ByaW5nRGFtcGluZ1wiLCBcInNwcmluZ0ZyZXF1ZW5jeVwiXSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdEYW1waW5nO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeSwgdGhpcy5zcHJpbmdEYW1waW5nKTtcclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludENvbmZpZygpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIgPSB0aGlzLiNzcHJpbmdEYW1wZXI7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uU3BoZXJpY2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIHR3byBkZWZpbmVkIGF4aXMgKG5vcm1hbGx5IGUuZy4gKDAsMCwxKSBhbmQgcm90YXRpb24oMSwwLDApKSwgdGhleSBzaGFyZSB0aGUgc2FtZSBhbmNob3IgYW5kIGhhdmUgZnJlZSByb3RhdGlvbiwgYnV0IHRyYW5zZmVyIHRoZSB0d2lzdC5cclxuICAgICAqIEluIHJlYWxpdHkgdXNlZCBpbiBjYXJzIHRvIHRyYW5zZmVyIHRoZSBtb3JlIHN0YWJsZSBzdGF0aW9uYXJ5IGZvcmNlIG9uIHRoZSB2ZWxvY2l0eSBheGlzIHRvIHRoZSBidW1waW5nLCBkYW1wZWQgbW92aW5nIHdoZWVsLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC5cclxuICAgICAqIFRoZSB0d28gbW90b3JzIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgdHdvIHJvdGF0aW9uIGF4aXMsIGFsb25nIHdpdGggc3ByaW5ncy4gXHJcbiAgICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgLSB0d2lzdCBpcyB0cmFuc2ZlcmVkIGJldHdlZW4gYm9kaWVzXHJcbiAgICAgKiAgICAgICAgIHogICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogICAgICAgICDihpEgICAgICAgICAgICAtLS0tLSAgfCAgLS0tLS0tLS0tLS0tXHJcbiAgICAgKiAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwg4oaTIHwgICAgICAgICAgICB8IFxyXG4gICAgICogIC14IDwtLS18LS0tPiB4ICAgICB8ICAgICB8IHggfCAgICAgICAgICAgIHwgICAgICAgICAgIGUuZy4gd2hlZWwgY2FuIHN0aWxsIHR1cm4gdXAvZG93biwgXHJcbiAgICAgKiAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgbGVmdCByaWdodCBidXQgdHJhbnNmZXJpbmcgaXQncyByb3RhdGlvbiBvbiB0byB0aGUgd2hlZWwtYXhpcy5cclxuICAgICAqICAgICAgICAg4oaTICAgICAgICAgICAgLS0tLS0gICAgIC0tLS0tLS0tLS0tLVxyXG4gICAgICogICAgICAgIC16ICAgIFxyXG4gICAgICogICAgICAgICAgICAgICAgIGF0dGFjaGVkUkIgICAgICAgICAgY29ubmVjdGVkUkJcclxuICAgICAqICAgICAgICAgICAgICAgIChlLmcuIHdoZWVsKSAgICAgICAoZS5nLiB3aGVlbC1heGlzKVxyXG4gICAgICogYGBgXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50VW5pdmVyc2FsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRVbml2ZXJzYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5Vbml2ZXJzYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uVW5pdmVyc2FsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5Vbml2ZXJzYWxKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nRmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5Rmlyc3Q6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdTZWNvbmQ6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5U2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvckZpcnN0OiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluUm90b3JGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclRvcnF1ZUZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWRGaXJzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbWF4Um90b3JTZWNvbmQ6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Sb3RvclNlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclRvcnF1ZVNlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclNwZWVkU2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvckZpcnN0OiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI21vdG9yU2Vjb25kOiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI2F4aXNTcHJpbmdEYW1wZXJGaXJzdDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc1NwcmluZ0RhbXBlclNlY29uZDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc0ZpcnN0OiBPSU1PLlZlYzM7XHJcbiAgICAjYXhpc1NlY29uZDogT0lNTy5WZWMzO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpc0ZpcnN0OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMSwgMCwgMCksIF9heGlzU2Vjb25kOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMSksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IF9heGlzRmlyc3Q7XHJcbiAgICAgIHRoaXMuYXhpc1NlY29uZCA9IF9heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzRmlyc3QoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzRmlyc3QueCwgdGhpcy4jYXhpc0ZpcnN0LnksIHRoaXMuI2F4aXNGaXJzdC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc0ZpcnN0KF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzRmlyc3QgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICogIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzU2Vjb25kKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpc1NlY29uZC54LCB0aGlzLiNheGlzU2Vjb25kLnksIHRoaXMuI2F4aXNTZWNvbmQueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXNTZWNvbmQoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXNTZWNvbmQgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ0ZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIxKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5Rmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIxKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyMigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heFJvdG9yRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3JGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLnVwcGVyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pblJvdG9yRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pblJvdG9yRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluUm90b3JGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWRGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcm90b3JTcGVlZEZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclNwZWVkRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZEZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIHRvcnF1ZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RvclRvcnF1ZUZpcnN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZUZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3JvdG9yVG9ycXVlRmlyc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjEoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhSb3RvclNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3JTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heFJvdG9yU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWluUm90b3JTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pblJvdG9yU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtaW5Sb3RvclNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtaW5Sb3RvclNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWRTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yU3BlZWRTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWRTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZFNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZVNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JUb3JxdWVTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWVTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjIoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBJZiB0aGUgdHdvIGNvbm5lY3RlZCBSaWdpZEJvZGllcyBjb2xsaWRlIHdpdGggZWF0aCBvdGhlci4gKERlZmF1bHQgPSBmYWxzZSlcclxuICAgICAqL1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLiNnZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uZmlyc3RBeGlzID0gdGhpcy5heGlzRmlyc3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2Vjb25kQXhpcyA9IHRoaXMuYXhpc1NlY29uZC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpc0ZpcnN0KTtcclxuICAgICAgdGhpcy5heGlzU2Vjb25kID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc0ZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmF4aXNGaXJzdCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzRmlyc3QpKSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXNTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc1NlY29uZCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzU2Vjb25kKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc0ZpcnN0O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJGaXJzdCA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCwgdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0KTtcclxuICAgICAgdGhpcy4jYXhpc1NwcmluZ0RhbXBlclNlY29uZCA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQsIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQpO1xyXG5cclxuICAgICAgdGhpcy4jbW90b3JGaXJzdCA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMuI21pblJvdG9yRmlyc3QgKiBDYWxjLmRlZzJyYWQsIHRoaXMuI21heFJvdG9yRmlyc3QgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNtb3RvckZpcnN0LnNldE1vdG9yKHRoaXMuI3JvdG9yU3BlZWRGaXJzdCwgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCk7XHJcbiAgICAgIHRoaXMuI21vdG9yU2Vjb25kID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy4jbWluUm90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCwgdGhpcy4jbWF4Um90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI21vdG9yU2Vjb25kLnNldE1vdG9yKHRoaXMuI3JvdG9yU3BlZWRGaXJzdCwgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlVuaXZlcnNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuI2F4aXNGaXJzdCwgdGhpcy4jYXhpc1NlY29uZCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IxID0gdGhpcy4jbW90b3JGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvcjIgPSB0aGlzLiNtb3RvclNlY29uZDtcclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyMSA9IHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyMiA9IHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJTZWNvbmQ7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uVW5pdmVyc2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nRmlyc3Q6IHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lGaXJzdDogdGhpcy4jc3ByaW5nRnJlcXVlbmN5Rmlyc3QsXHJcbiAgICAgICAgc3ByaW5nRGFtcGluZ1NlY29uZDogdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lTZWNvbmQ6IHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVNlY29uZCxcclxuICAgICAgICBtYXhSb3RvckZpcnN0OiB0aGlzLiNtYXhSb3RvckZpcnN0LFxyXG4gICAgICAgIG1pblJvdG9yRmlyc3Q6IHRoaXMuI21pblJvdG9yRmlyc3QsXHJcbiAgICAgICAgcm90b3JTcGVlZEZpcnN0OiB0aGlzLiNyb3RvclNwZWVkRmlyc3QsXHJcbiAgICAgICAgcm90b3JUb3JxdWVGaXJzdDogdGhpcy4jcm90b3JUb3JxdWVGaXJzdCxcclxuICAgICAgICBtYXhSb3RvclNlY29uZDogdGhpcy4jbWF4Um90b3JTZWNvbmQsXHJcbiAgICAgICAgbWluUm90b3JTZWNvbmQ6IHRoaXMuI21pblJvdG9yU2Vjb25kLFxyXG4gICAgICAgIHJvdG9yU3BlZWRTZWNvbmQ6IHRoaXMuI3JvdG9yU3BlZWRTZWNvbmQsXHJcbiAgICAgICAgcm90b3JUb3JxdWVTZWNvbmQ6IHRoaXMuI3JvdG9yVG9ycXVlU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1xyXG4gICAgICAgIFwic3ByaW5nRGFtcGluZ0ZpcnN0XCIsIFwic3ByaW5nRnJlcXVlbmN5Rmlyc3RcIiwgXCJzcHJpbmdEYW1waW5nU2Vjb25kXCIsIFwic3ByaW5nRnJlcXVlbmN5U2Vjb25kXCIsXHJcbiAgICAgICAgXCJtYXhSb3RvckZpcnN0XCIsIFwibWluUm90b3JGaXJzdFwiLCBcInJvdG9yU3BlZWRGaXJzdFwiLCBcInJvdG9yVG9ycXVlRmlyc3RcIixcclxuICAgICAgICBcIm1heFJvdG9yU2Vjb25kXCIsIFwibWluUm90b3JTZWNvbmRcIiwgXCJyb3RvclNwZWVkU2Vjb25kXCIsIFwiLnJvdG9yVG9ycXVlU2Vjb25kXCJdXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIG5vIG1vdmVtZW50LiBcclxuICAgICAqIEJlc3Qgd2F5IHRvIHNpbXVsYXRlIGNvbnZleCBvYmplY3RzIGxpa2UgYSBjaGFpciBzZWF0IGNvbm5lY3RlZCB0byBjaGFpciBsZWdzLlxyXG4gICAgICogVGhlIGFjdHVhbCBhbmNob3IgcG9pbnQgZG9lcyBub3QgbWF0dGVyIHRoYXQgbXVjaCwgb25seSBpbiB2ZXJ5IHNwZWNpZmljIGVkZ2UgY2FzZXMuXHJcbiAgICAgKiBCZWNhdXNlIHdlbGRpbmcgbWVhbnMgdGhleSBzaW1wbHkgZG8gbm90IGRpc2Nvbm5lY3QuICh1bmxlc3MgeW91IGFkZCBCcmVha2FiaWxpdHkpXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50V2VsZGluZyBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50V2VsZGluZyk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLkdlbmVyaWNKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnID0gbmV3IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG5cclxuICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyhfbG9jYWxBbmNob3IueCwgX2xvY2FsQW5jaG9yLnksIF9sb2NhbEFuY2hvci56KTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KG5ldyBPSU1PLk1hdDMoKSwgbmV3IE9JTU8uTWF0MygpKTtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmpvaW50LnNldEFsbG93Q29sbGlzaW9uKHRoaXMuaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9EaXN0cmlidXRpb24vT2ltb1BoeXNpY3MuZC50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgKiBNYW5hZ2VzIHRoZSBPSU1PIHBoeXNpY3MgZW5naW5lIGZvciBGVURHRS4gTXVsdGlwbGUgaW5zdGFuY2VzIG1heSBiZSBjcmVhdGVkLCBvbmUgaXMgYWN0aXZlIGF0IGEgdGltZS5cclxuICAgICogQWxsIG1ldGhvZHMgYXJlIHN0YXRpYyBhbmQgdXNlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGluc3RhbmNlLiBBdCBzdGFydHVwLCBhIGRlZmF1bHQgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgYmVjb21lIHRoZSBhY3RpdmUgaW5zdGFuY2VcclxuICAgICogQXR0YWNoaW5nIGEge0BsaW5rIENvbXBvbmVudFJpZ2lkYm9keX0gdG8gYSB7QGxpbmsgTm9kZX0gcGxhY2VzIGEgcGh5c2ljcyBjb2xsaWRlciBpbiB0aGUgcGh5c2ljcyBpbnN0YW5jZSBhY3RpdmUgYXQgdGhhdCB0aW1lLlxyXG4gICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwXHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzIHtcclxuICAgIC8qKiBUaGUgU0VUVElOR1MgdGhhdCBhcHBseSB0byB0aGUgcGh5c2ljYWwgd29ybGQuIFJhbmdpbmcgZnJvbSB0aGluZ3MgbGlrZSBzbGVlcGluZywgY29sbGlzaW9uU2hhcGVUaGlja25lc3MgYW5kIG90aGVycyAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXR0aW5nczogUGh5c2ljc1NldHRpbmdzID0gbmV3IFBoeXNpY3NTZXR0aW5ncyhDT0xMSVNJT05fR1JPVVAuREVGQVVMVCwgKENPTExJU0lPTl9HUk9VUC5ERUZBVUxUIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzEgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfMiB8IENPTExJU0lPTl9HUk9VUC5HUk9VUF8zIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzQpKTtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSYWN0aXZlOiBQaHlzaWNzID0gbmV3IFBoeXNpY3MoKTtcclxuXHJcbiAgICBwcml2YXRlIG9pbW9Xb3JsZDogT0lNTy5Xb3JsZDtcclxuICAgIHByaXZhdGUgYm9keUxpc3Q6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcbiAgICBwcml2YXRlIGpvaW50TGlzdDogSm9pbnRbXSA9IG5ldyBBcnJheSgpO1xyXG5cclxuICAgIC8qKiBUaGUgcmVuZGVyaW5nIG9mIHBoeXNpY2FsIGRlYnVnIGluZm9ybWF0aW9ucy4gVXNlZCBpbnRlcm5hbGx5IG5vIGludGVyYWN0aW9uIG5lZWRlZC4qL1xyXG4gICAgI2RlYnVnRHJhdzogUGh5c2ljc0RlYnVnRHJhdztcclxuICAgIC8qKiBUaGUgY2FtZXJhL3ZpZXdwb3J0IHRoZSBwaHlzaWNzIGFyZSBkZWJ1Z2dlZCB0by4gVXNlZCBpbnRlcm5hbGx5IG5vIGludGVyYWN0aW9uIG5lZWRlZC4gKi9cclxuICAgICNtYWluQ2FtOiBDb21wb25lbnRDYW1lcmE7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBpZiAodHlwZW9mIE9JTU8gPT0gXCJ1bmRlZmluZWRcIikgey8vIENoZWNrIGlmIE9JTU8gTmFtZXNwYWNlIHdhcyBsb2FkZWQsIGVsc2UgZG8gbm90IHVzZSBhbnkgcGh5c2ljcy4gQ2hlY2sgaXMgbmVlZGVkIHRvIGVuc3VyZSBGVURHRSBjYW4gYmUgdXNlZCB3aXRob3V0IFBoeXNpY3NcclxuICAgICAgICBEZWJ1Zy5lcnJvcihcIk9JTU8gcGh5c2ljcyBlbmdpbmUgbm90IGNvbm5lY3RlZCFcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vaW1vV29ybGQgPSBuZXcgT0lNTy5Xb3JsZCgpO1xyXG4gICAgICB0aGlzLiNkZWJ1Z0RyYXcgPSBuZXcgUGh5c2ljc0RlYnVnRHJhdygpOyAgLy9DcmVhdGUgYSBGVURHRSBQaHlzaWNzIGRlYnVnZ2luZyBoYW5kbGluZyBvYmplY3RcclxuICAgICAgdGhpcy5vaW1vV29ybGQuc2V0RGVidWdEcmF3KHRoaXMuI2RlYnVnRHJhdy5vaW1vRGVidWdEcmF3KTsgLy9UZWxsIE9pbW9QaHlzaWNzIHdoZXJlIHRvIGRlYnVnIHRvIGFuZCBob3cgaXQgd2lsbCBiZSBoYW5kbGVkXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBQaHlzaWNzIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IGFjdGl2ZUluc3RhbmNlKF9waHlzaWNzOiBQaHlzaWNzKSB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUgPSBfcGh5c2ljcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIFBoeXNpY3MgaW5zdGFuY2UgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGFjdGl2ZUluc3RhbmNlKCk6IFBoeXNpY3Mge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWJ1Z0RyYXcoKTogUGh5c2ljc0RlYnVnRHJhdyB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBtYWluQ2FtKCk6IENvbXBvbmVudENhbWVyYSB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLiNtYWluQ2FtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDYXN0IGEgUkFZIGludG8gdGhlIHBoeXNpY2FsIHdvcmxkIGZyb20gYSBvcmlnaW4gcG9pbnQgaW4gYSBjZXJ0YWluIGRpcmVjdGlvbi4gUmVjZWl2aW5nIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgaGl0IG9iamVjdCBhbmQgdGhlXHJcbiAgICAqIGhpdCBwb2ludC4gRG8gbm90IHNwZWNpZnkgYSBfZ3JvdXAgdG8gcmF5Y2FzdCB0aGUgd2hvbGUgd29ybGQsIGVsc2Ugb25seSBib2RpZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCBjYW4gYmUgaGl0LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmF5Y2FzdChfb3JpZ2luOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfbGVuZ3RoOiBudW1iZXIgPSAxLCBfZGVidWdEcmF3OiBib29sZWFuID0gZmFsc2UsIF9ncm91cDogQ09MTElTSU9OX0dST1VQID0gQ09MTElTSU9OX0dST1VQLkRFRkFVTFQpOiBSYXlIaXRJbmZvIHtcclxuICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBuZXcgUmF5SGl0SW5mbygpO1xyXG4gICAgICBsZXQgcmF5OiBPSU1PLlJheUNhc3RDbG9zZXN0ID0gbmV3IE9JTU8uUmF5Q2FzdENsb3Nlc3QoKTtcclxuICAgICAgbGV0IGJlZ2luOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF9vcmlnaW4ueCwgX29yaWdpbi55LCBfb3JpZ2luLnopO1xyXG4gICAgICBsZXQgZW5kOiBPSU1PLlZlYzMgPSB0aGlzLmdldFJheUVuZFBvaW50KGJlZ2luLCBuZXcgVmVjdG9yMyhfZGlyZWN0aW9uLngsIF9kaXJlY3Rpb24ueSwgX2RpcmVjdGlvbi56KSwgX2xlbmd0aCk7XHJcbiAgICAgIHJheS5jbGVhcigpO1xyXG4gICAgICBpZiAoX2dyb3VwID09IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUKSB7IC8vQ2FzZSAxOiBSYXljYXN0aW5nIHRoZSB3aG9sZSB3b3JsZCwgbm9ybWFsIG1vZGVcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5yYXlDYXN0KGJlZ2luLCBlbmQsIHJheSk7XHJcbiAgICAgIH0gZWxzZSB7IC8vQ2FzZTI6IFJheWNhc3Rpbmcgb24gZWFjaCBib2R5IGluIGEgc3BlY2lmaWMgZ3JvdXBcclxuICAgICAgICBsZXQgYWxsSGl0czogUmF5SGl0SW5mb1tdID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChfdmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICAgICAgaWYgKF92YWx1ZS5jb2xsaXNpb25Hcm91cCA9PSBfZ3JvdXApIHtcclxuICAgICAgICAgICAgaGl0SW5mbyA9IF92YWx1ZS5yYXljYXN0VGhpc0JvZHkoX29yaWdpbiwgX2RpcmVjdGlvbiwgX2xlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChoaXRJbmZvLmhpdCA9PSB0cnVlKSB7IC8vRXZlcnkgaGl0IGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIHRoZSBjbG9zZXN0XHJcbiAgICAgICAgICAgICAgYWxsSGl0cy5wdXNoKGhpdEluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYWxsSGl0cy5mb3JFYWNoKGZ1bmN0aW9uIChfdmFsdWU6IFJheUhpdEluZm8pOiB2b2lkIHsgLy9nZXQgdGhlIGNsb3Nlc3QgaGl0SW5mb1xyXG4gICAgICAgICAgaWYgKF92YWx1ZS5oaXREaXN0YW5jZSA8IGhpdEluZm8uaGl0RGlzdGFuY2UgfHwgaGl0SW5mby5oaXQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaGl0SW5mbyA9IF92YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmF5LmhpdCkgeyAvL0ZpbGwgaW4gaW5mb3JtYXRpb25zIG9uIHRoZSBoaXRcclxuICAgICAgICBoaXRJbmZvLmhpdCA9IHRydWU7XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKHJheS5wb3NpdGlvbi54LCByYXkucG9zaXRpb24ueSwgcmF5LnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGhpdEluZm8uaGl0Tm9ybWFsID0gbmV3IFZlY3RvcjMocmF5Lm5vcm1hbC54LCByYXkubm9ybWFsLnksIHJheS5ub3JtYWwueik7XHJcbiAgICAgICAgaGl0SW5mby5oaXREaXN0YW5jZSA9IHRoaXMuZ2V0UmF5RGlzdGFuY2UoX29yaWdpbiwgaGl0SW5mby5oaXRQb2ludCk7XHJcbiAgICAgICAgaGl0SW5mby5yaWdpZGJvZHlDb21wb25lbnQgPSByYXkuc2hhcGUudXNlckRhdGE7XHJcbiAgICAgICAgaGl0SW5mby5yYXlFbmQgPSBuZXcgVmVjdG9yMyhlbmQueCwgZW5kLnksIGVuZC56KTtcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGl0SW5mby5yYXlPcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhlbmQueCwgZW5kLnksIGVuZC56KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX2RlYnVnRHJhdykgeyAvL0hhbmRsZSBkZWJ1Z2dpbmdcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXcuZGVidWdSYXkoaGl0SW5mby5yYXlPcmlnaW4sIGhpdEluZm8uaGl0UG9pbnQsIG5ldyBDb2xvcigwLCAxLCAwLCAxKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGhpdEluZm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTaW11bGF0ZXMgdGhlIHBoeXNpY2FsIHdvcmxkLiBfZGVsdGFUaW1lIGlzIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHBoeXNpY2FsIHN0ZXBzIGluIHNlY29uZHMuIERlZmF1bHQgaXMge0BsaW5rIExvb3AudGltZUZyYW1lR2FtZX0gLyAxMDAwIHRvIHJ1biBpbiBzeW5jIHdpdGggdGhlIHtAbGluayBMb29wfS5cclxuICAgICogVGhlIG1heGltdW0gdmFsdWUgaXMgMS8zMCBvZiBhIHNlY29uZCwgdG8gaGF2ZSBtb3JlIGNvbnNpc3RlbnQgZnJhbWUgY2FsY3VsYXRpb25zLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2ltdWxhdGUoX2RlbHRhVGltZTogbnVtYmVyID0gTG9vcC50aW1lRnJhbWVHYW1lIC8gMTAwMCk6IHZvaWQge1xyXG4gICAgICBpZiAoUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QubGVuZ3RoID4gMClcclxuICAgICAgICBQaHlzaWNzLmNvbm5lY3RKb2ludHMoKTsgLy8gQ29ubmVjdCBqb2ludHMgaWYgYW55dGhpbmcgaGFzIGhhcHBlbmVkIGJldHdlZW4gdGhlIGxhc3QgY2FsbCB0byBhbnkgb2YgdGhlIHR3byBwYWlyZWQgcmlnaWRib2RpZXNcclxuICAgICAgaWYgKF9kZWx0YVRpbWUgPT0gMCkgLy8gTm8gdGltZSBwYXNzZWQsIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBwaHlzaWNzIHdvcmxkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgX2RlbHRhVGltZSA9IF9kZWx0YVRpbWUgPiAxIC8gMzAgPyAxIC8gMzAgOiBfZGVsdGFUaW1lOyAvLyBJZiBpbnN0ZWFkIG9mIGEgZml4ZWQgcmF0ZSB0aGUgZ2FtZSBmcmFtZXJhdGUgaXMgdXNlZCwgbWFrZSBzdXJlIGlycmVndWxhciB0aW1pbmdzIGFyZSBmaXhlZCB0byAzMGZwc1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5zdGVwKF9kZWx0YVRpbWUpOyAgLy8gVXBkYXRlIHRoZSBzaW11bGF0aW9uIGJ5IHRoZSBnaXZlbiBkZWx0YVRpbWVcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGluc3RhbmNlIHVzaW5nIHRoZSB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSBnaXZlblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfbW9kZT86IFBIWVNJQ1NfREVCVUdNT0RFKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5zZXREZWJ1Z01vZGUoX21vZGUpO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLiNtYWluQ2FtID0gX2NtcENhbWVyYTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZGVidWdEcmF3KCk7IC8vRmlsbGluZyB0aGUgcGh5c2ljcyB3b3JsZCBkZWJ1ZyBpbmZvcm1hdGlvbnMgaW50byB0aGUgZGVidWcgcmVuZGVyaW5nIGhhbmRsZXJcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LmRyYXdCdWZmZXJzKCk7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5jbGVhckJ1ZmZlcnMoKTsgIC8vVXBkYXRlcyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IHByb2plY3Rpb24sIHJlc2V0dGluZyB0aGUgcG9pbnRzL2xpbmVzL3RyaWFuZ2xlcyB0aGF0IG5lZWQgdG8gYmUgZHJhd24gZnJvbSBkZWJ1Z1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIEFkanVzdHMgdGhlIHRyYW5zZm9ybXMgb2YgdGhlIHtAbGluayBDb21wb25lbnRSaWdpZGJvZHl9cyBpbiB0aGUgZ2l2ZW4gYnJhbmNoIHRvIG1hdGNoIHRoZWlyIG5vZGVzIG9yIG1lc2hlc1xyXG4gICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGp1c3RUcmFuc2Zvcm1zKF9icmFuY2g6IE5vZGUsIF90b01lc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBSZW5kZXIucHJlcGFyZShfYnJhbmNoLCB7IGlnbm9yZVBoeXNpY3M6IHRydWUgfSk7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgUmVuZGVyLm5vZGVzUGh5c2ljcylcclxuICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpLmluaXRpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogR2V0IHRoZSBhcHBsaWVkIGdyYXZpdGF0aW9uYWwgZm9yY2Ugb2YgdGhlIGFjdGl2ZSBpbnN0YW5jZS4gRGVmYXVsdCBlYXJ0aCBncmF2aXR5ID0gOS44MSBtL3NcclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEdyYXZpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB0bXBWZWM6IE9JTU8uVmVjMyA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLmdldEdyYXZpdHkoKTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRtcFZlYy54LCB0bXBWZWMueSwgdG1wVmVjLnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXQgdGhlIGFwcGxpZWQgZ3Jhdml0YXRpb25hbCBmb3JjZSBvZiB0aGUgYWN0aXZlIGluc3RhbmNlLiBEZWZhdWx0IGVhcnRoIGdyYXZpdHkgPSA5LjgxIG0vc1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0R3Jhdml0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHRtcFZlYzogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuc2V0R3Jhdml0eSh0bXBWZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGQgYSBuZXcgT0lNTyBSaWdpZGJvZHkgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gYWRkaW5nIGEgRlVER0UgUmlnaWRib2R5IENvbXBvbmVudC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZFJpZ2lkYm9keShfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LnB1c2goX2NtcFJCKTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuYWRkUmlnaWRCb2R5KF9jbXBSQi5nZXRPaW1vUmlnaWRib2R5KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZW1vdmUgdGhlIE9JTU8gUmlnaWRib2R5IHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UsIGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHJlbW92aW5nIGEgRlVER0UgUmlnaWRib2R5IENvbXBvbmVudFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUmlnaWRib2R5KF9jbXBSQjogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgIC8vIFRPRE86IHR3byBsaXN0cyBhcmUgYmVpbmcgbWFuYWdlZCwgaW5mbyBtaWdodCBkZXZpYXRlLiBDbGVhbnVwIVxyXG4gICAgICBsZXQgb2ltb1JpZ2lkQm9keTogT0lNTy5SaWdpZEJvZHkgPSBfY21wUkIuZ2V0T2ltb1JpZ2lkYm9keSgpO1xyXG4gICAgICBpZiAob2ltb1JpZ2lkQm9keS5fd29ybGQpXHJcbiAgICAgICAgb2ltb1JpZ2lkQm9keS5fd29ybGQucmVtb3ZlUmlnaWRCb2R5KG9pbW9SaWdpZEJvZHkpO1xyXG4gICAgICAvLyB3aGF0IGlmIHRoZSByaWdpZGJvZHlzIG9pbW8td29ybGQgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBhY3RpdmUgaW5zdGFuY2U/XHJcbiAgICAgIGxldCBpZDogbnVtYmVyID0gUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5pbmRleE9mKF9jbXBSQik7XHJcbiAgICAgIGlmIChpZCA+IC0xKVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3Quc3BsaWNlKGlkLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQWRkIGEgbmV3IE9JTU8gSm9pbnQvQ29uc3RyYWludCB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgYSBGVURHRSBKb2ludCBDb21wb25lbnRcclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEpvaW50KF9jbXBKb2ludDogSm9pbnQpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuYWRkSm9pbnQoX2NtcEpvaW50LmdldE9pbW9Kb2ludCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gaW5mb3JtIHRoZSBwaHlzaWNzIHN5c3RlbSB0aGF0IGEgam9pbnQgaGFzIGEgY2hhbmdlIG9mIGNvcmUgcHJvcGVydGllcyBhbmQgbmVlZHMgdG8gYmUgcmVjcmVhdGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hhbmdlSm9pbnRTdGF0dXMoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICBpZiAoUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QuaW5kZXhPZihfY21wSm9pbnQpIDwgMClcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5wdXNoKF9jbXBKb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogUmVtb3ZlIHRoZSBPSU1PIEpvaW50L0NvbnN0cmFpbnQgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gcmVtb3ZpbmcgYSBGVURHRSBKb2ludCBDb21wb25lbnRcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlSm9pbnQoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnJlbW92ZUpvaW50KF9jbXBKb2ludC5nZXRPaW1vSm9pbnQoKSk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKF9lcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmV0dXJucyBhbGwgdGhlIENvbXBvbmVudFJpZ2lkYm9kaWVzIHRoYXQgYXJlIGtub3duIHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UuICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEJvZHlMaXN0KCk6IENvbXBvbmVudFJpZ2lkYm9keVtdIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdpdmluZyBhIENvbXBvbmVudFJpZ2lkYm9keSBhIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uIG51bWJlciBzbyBpdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgbG9hZGluZyBwcm9jZXNzLiBBbmQgcmVtb3ZlZCByYidzIGNhbiByZWNlaXZlIGEgbmV3IGlkLiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkaXN0cmlidXRlQm9keUlEKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBmcmVlSWQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBmcmVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QuZm9yRWFjaCgoX3ZhbHVlOiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoX3ZhbHVlLmlkICE9IGZyZWVJZCkge1xyXG4gICAgICAgICAgZnJlZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZyZWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmcmVlKSB7XHJcbiAgICAgICAgICBmcmVlSWQrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZyZWVJZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBDb25uZWN0IGFsbCBqb2ludHMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB5ZXQuIFVzZWQgaW50ZXJuYWxseSBubyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNhbGxlZCBhbmQgbmVlZGVkIHRvIG1ha2Ugc3VyZSBqb2ludHMgY29ubmVjdC9kaXNjb25uZWN0XHJcbiAgICAgKiBpZiBhbnkgb2YgdGhlIHR3byBwYWlyZWQgQ29tcG9uZW50UmlnaWRib2RpZXMgY2hhbmdlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbm5lY3RKb2ludHMoKTogdm9pZCB7IC8vVHJ5IHRvIGNvbm5lY3QgZGlydHkgam9pbnRzIHVudGlsIHRoZXkgYXJlIGNvbm5lY3RlZFxyXG4gICAgICBsZXQgam9pbnRzVG9Db25uZWN0OiBKb2ludFtdID0gUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3Q7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuam9pbnRMaXN0ID0gW107XHJcbiAgICAgIGpvaW50c1RvQ29ubmVjdC5mb3JFYWNoKChfam9pbnQ6IEpvaW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKF9qb2ludC5pc0Nvbm5lY3RlZCgpID09IGZhbHNlKVxyXG4gICAgICAgICAgaWYgKF9qb2ludC5pc0FjdGl2ZSlcclxuICAgICAgICAgICAgX2pvaW50LmNvbm5lY3QoKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QucHVzaChfam9pbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlIGFsbCBvaW1vIGpvaW50cyBhbmQgcmlnaWRib2RpZXMsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgd29ybGQgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFudXAoKTogdm9pZCB7XHJcbiAgICAgIGxldCBvaW1vV29ybGQ6IE9JTU8uV29ybGQgPSBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZDtcclxuICAgICAgaWYgKG9pbW9Xb3JsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy9SZXNldHRpbmcgdGhlIHdvcmxkIHNvIGEgbmV3IHdvcmxkIGNhbiBiZSBjcmVhdGVkLCBmaXggZm9yIHJlLW9wZW5pbmcgYSBwcm9qZWN0IGluIGVkaXRvciwgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIG9sZCB0aGluZ3MgY2FsY3VsYXRlZFxyXG4gICAgICAgIGxldCBqb2ludHNXb3JsZDogbnVtYmVyID0gb2ltb1dvcmxkLmdldE51bUpvaW50cygpO1xyXG4gICAgICAgIGxldCBib2RpZXNXb3JsZDogbnVtYmVyID0gb2ltb1dvcmxkLmdldE51bVJpZ2lkQm9kaWVzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgYm9keSBvZiBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0KVxyXG4gICAgICAgICAgYm9keS5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QgPSBuZXcgQXJyYXkoKTsgLy8gVE9ETzogc2VlIGlmIGl0IHdvdWxkIGJlIHNtYXJ0ZXIsIGRvIHVzZSB0aGVzZSBhcnJheXMuIERlZmluaXRlbHkgbW9yZSBpbnR1aXRpdmUuLi5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgam9pbnRzV29ybGQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG9pbW9Kb2ludDogT0lNTy5Kb2ludCA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLmdldEpvaW50TGlzdCgpO1xyXG4gICAgICAgICAgb2ltb1dvcmxkLnJlbW92ZUpvaW50KG9pbW9Kb2ludCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBib2RpZXNXb3JsZDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb2ltb0JvZHk6IE9JTU8uUmlnaWRCb2R5ID0gb2ltb1dvcmxkLmdldFJpZ2lkQm9keUxpc3QoKTtcclxuICAgICAgICAgIG9pbW9Xb3JsZC5yZW1vdmVSaWdpZEJvZHkob2ltb0JvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKiBSZXR1cm5zIHRoZSBDb21wb25lbnRSaWdpZGJvZHkgd2l0aCB0aGUgZ2l2ZW4gaWQuIFVzZWQgaW50ZXJuYWxseSB0byByZWNvbm5lY3Qgam9pbnRzIG9uIGxvYWRpbmcgaW4gdGhlIGVkaXRvci4gKi9cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGdldEJvZHlCeUlEKF9pZDogbnVtYmVyKTogQ29tcG9uZW50UmlnaWRib2R5IHtcclxuICAgIC8vICAgbGV0IGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGw7XHJcbiAgICAvLyAgIFBoeXNpY3MuI2FjdGl2ZVBoeXNpY3MuYm9keUxpc3QuZm9yRWFjaCgodmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQgPT4ge1xyXG4gICAgLy8gICAgIGlmICh2YWx1ZS5pZCA9PSBfaWQpIHtcclxuICAgIC8vICAgICAgIGJvZHkgPSB2YWx1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gICByZXR1cm4gYm9keTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBlbmRwb2ludCBvZiBtYXRoZW1hdGljYWwgcmF5LiBCeSBhZGRpbmcgdGhlIG11bHRpcGxpZWQgZGlyZWN0aW9uIHRvIHRoZSBvcmlnaW4uIFxyXG4gICAgICAgKiBVc2VkIGJlY2F1c2UgT2ltb1BoeXNpY3MgZGVmaW5lcyByYXkgYnkgc3RhcnQvZW5kLiBCdXQgR2FtZUVuZ2luZXMgY29tbW9ubHkgdXNlIG9yaWdpbi9kaXJlY3Rpb24uXHJcbiAgICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmF5RW5kUG9pbnQoX3N0YXJ0OiBPSU1PLlZlYzMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlcik6IE9JTU8uVmVjMyB7XHJcbiAgICAgIGxldCBvcmlnaW46IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIG9yaWdpbi5zZXQoX3N0YXJ0LngsIF9zdGFydC55LCBfc3RhcnQueik7XHJcbiAgICAgIGxldCBzY2FsZWREaXJlY3Rpb246IFZlY3RvcjMgPSBfZGlyZWN0aW9uLmNsb25lO1xyXG4gICAgICBzY2FsZWREaXJlY3Rpb24uc2NhbGUoX2xlbmd0aCk7XHJcbiAgICAgIGxldCBlbmRwb2ludDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHNjYWxlZERpcmVjdGlvbiwgb3JpZ2luKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGVkRGlyZWN0aW9uKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZW5kcG9pbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShvcmlnaW4pO1xyXG4gICAgICByZXR1cm4gbmV3IE9JTU8uVmVjMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkaXN0YW5jZSBpbiB3aGljaCBhIHJheSBoaXQgYnkgc3VidHJhY3RpbmcgcG9pbnRzIGZyb20gZWFjaCBvdGhlciBhbmQgZ2V0IHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc3F1YXJlZCBwcm9kdWN0IG9mIGVhY2ggY29tcG9uZW50LiAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmF5RGlzdGFuY2UoX29yaWdpbjogVmVjdG9yMywgX2hpdFBvaW50OiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGR4OiBudW1iZXIgPSBfb3JpZ2luLnggLSBfaGl0UG9pbnQueDtcclxuICAgICAgbGV0IGR5OiBudW1iZXIgPSBfb3JpZ2luLnkgLSBfaGl0UG9pbnQueTtcclxuICAgICAgbGV0IGR6OiBudW1iZXIgPSBfb3JpZ2luLnogLSBfaGl0UG9pbnQuejtcclxuICAgICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBhY3R1YWwgdXNlZCB3b3JsZCBvZiB0aGUgT0lNTyBwaHlzaWNzIGVuZ2luZS4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQgLSBPbmx5IGZvciBhZHZhbmNlZCB1c2VycyB0aGF0IG5lZWQgdG8gYWNjZXNzIGl0IGRpcmVjdGx5ICovXHJcbiAgICBwdWJsaWMgZ2V0T2ltb1dvcmxkKCk6IE9JTU8uV29ybGQge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqIFVwZGF0ZXMgYWxsIHtAbGluayBSaWdpZGJvZGllc30ga25vd24gdG8gdGhlIFBoeXNpY3Mud29ybGQgdG8gbWF0Y2ggdGhlaXIgY29udGFpbmVycyBvciBtZXNoZXMgdHJhbnNmb3JtYXRpb25zICovXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVdvcmxkRnJvbVdvcmxkTWF0cml4KF90b01lc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy8gICBmb3IgKGxldCBib2R5IG9mIHRoaXMuYm9keUxpc3QpXHJcbiAgICAvLyAgICAgYm9keS51cGRhdGVGcm9tV29ybGQoX3RvTWVzaCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBhIHRocmVlZGltZW5zaW9uYWwgYm94IGJ5IHR3byBjb3JuZXItcG9pbnRzLCBvbmUgd2l0aCBtaW5pbWFsIHZhbHVlcyBhbmQgb25lIHdpdGggbWF4aW11bSB2YWx1ZXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQm94IGltcGxlbWVudHMgUmVjeWNhYmxlIHtcclxuICAgIHB1YmxpYyBtaW46IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgbWF4OiBWZWN0b3IzO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWluOiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoSW5maW5pdHkpLCBfbWF4OiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoLUluZmluaXR5KSkge1xyXG4gICAgICB0aGlzLnNldChfbWluLCBfbWF4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSB0aGUgY29ybmVycyBvZiB0aGlzIGJveCwgc3RhbmRhcmQgdmFsdWVzIGFyZSBJbmZpbml0eSBmb3IgbWluLCBhbmQgLUluZmluaXR5IGZvciBtYXgsIFxyXG4gICAgICogY3JlYXRpbmcgYW4gaW1wb3NzaWJsZSBpbnZlcnRlZCBib3ggdGhhdCBjYW4gbm90IGNvbnRhaW4gYW55IHBvaW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF9taW46IFZlY3RvcjMgPSBWZWN0b3IzLk9ORShJbmZpbml0eSksIF9tYXg6IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgtSW5maW5pdHkpKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWluID0gX21pbjtcclxuICAgICAgdGhpcy5tYXggPSBfbWF4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXhwYW5kIHRoZSBib3ggaWYgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIGdpdmVuIHBvaW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBhbmQoX2luY2x1ZGU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4ubWluKF9pbmNsdWRlKTtcclxuICAgICAgdGhpcy5tYXgubWF4KF9pbmNsdWRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4uc2V0KEluZmluaXR5LCBJbmZpbml0eSwgSW5maW5pdHkpO1xyXG4gICAgICB0aGlzLm1heC5zZXQoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHtAbGluayBSZW5kZXJ9LXBpY2tpbmcgZS5nLiB1c2luZyB7QGxpbmsgUGlja2VyfSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgZnVydGhlciBjYWxjdWxhdGlvbiBvZiBwb3NpdGlvbnMgYW5kIG5vcm1hbHMgZXRjLlxyXG4gICAqIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2sge1xyXG4gICAgcHVibGljIG5vZGU6IE5vZGU7XHJcbiAgICBwdWJsaWMgekJ1ZmZlcjogbnVtYmVyO1xyXG4gICAgcHVibGljIGNvbG9yOiBDb2xvcjtcclxuICAgIHB1YmxpYyB0ZXh0dXJlVVY6IFZlY3RvcjI7XHJcbiAgICBwdWJsaWMgZ2l6bW8/OiBHaXptbztcclxuICAgICNtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0O1xyXG4gICAgI3Bvc1dvcmxkOiBWZWN0b3IzO1xyXG4gICAgI3Bvc01lc2g6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ub2RlOiBOb2RlKSB7XHJcbiAgICAgIHRoaXMubm9kZSA9IF9ub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB3b3JsZCBwb3NpdGlvbiBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NXb3JsZCgpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3Bvc1dvcmxkKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNwb3NXb3JsZDtcclxuICAgICAgbGV0IHBvaW50SW5DbGlwU3BhY2U6IFZlY3RvcjMgPSBWZWN0b3IzLloodGhpcy56QnVmZmVyKTtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuI210eFZpZXdUb1dvcmxkLmdldCgpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludEluQ2xpcFNwYWNlLCB0aGlzLiNtdHhWaWV3VG9Xb3JsZCwgdHJ1ZSk7XHJcbiAgICAgIGxldCB3OiBudW1iZXIgPSBtWzNdICogcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIHBvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogcG9pbnRJbkNsaXBTcGFjZS56ICsgbVsxNV07XHJcbiAgICAgIHJlc3VsdC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICB0aGlzLiNwb3NXb3JsZCA9IHJlc3VsdDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2Vzc29yIHRvIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcG9zaXRpb24gaW4gbWVzaC1zcGFjZSBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NNZXNoKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcG9zTWVzaClcclxuICAgICAgICByZXR1cm4gdGhpcy4jcG9zTWVzaDtcclxuICAgICAgbGV0IG10eFdvcmxkVG9NZXNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRSh0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpLm10eFdvcmxkKTtcclxuICAgICAgbGV0IHBvc01lc2g6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMucG9zV29ybGQsIG10eFdvcmxkVG9NZXNoKTtcclxuICAgICAgdGhpcy4jcG9zTWVzaCA9IHBvc01lc2g7XHJcbiAgICAgIHJldHVybiBwb3NNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgZmFjZSBub3JtYWwgaW4gd29ybGQtc3BhY2UgYXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB7QGxpbmsgUmF5fSBhbmQge0BsaW5rIE1lc2h9IG9ubHkgd2hlbiB1c2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG5cclxuICAgICAgZm9yIChsZXQgZmFjZSBvZiBjbXBNZXNoLm1lc2guZmFjZXMpIHtcclxuICAgICAgICBpZiAoZmFjZS5pc0luc2lkZSh0aGlzLnBvc01lc2gpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBmYWNlLm5vcm1hbC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzdWx0LnRyYW5zZm9ybShjbXBNZXNoLm10eFdvcmxkLCBmYWxzZSk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBzb2xlbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGVuYWJsZSBjYWxjdWxhdGlvbiBvZiB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhpcyB7QGxpbmsgUGlja31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtdHhWaWV3VG9Xb3JsZChfbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCkge1xyXG4gICAgICB0aGlzLiNtdHhWaWV3VG9Xb3JsZCA9IF9tdHhWaWV3VG9Xb3JsZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBQcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgcGlja2luZyB1c2luZyB7QGxpbmsgUmVuZGVyfVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2tlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmF5IHBsdXMgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgbmVhciBhbmQgZmFyIHBsYW5lcyB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX25vZGVzOiBOb2RlW10sIF9yYXk6IFJheSwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBQaWNrW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX2dpem1vczogR2l6bW9bXSwgX3JheTogUmF5LCBfbWluOiBudW1iZXIsIF9tYXg6IG51bWJlcik6IFBpY2tbXTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja1JheShfZnJvbTogTm9kZVtdIHwgR2l6bW9bXSwgX3JheTogUmF5LCBfbWluOiBudW1iZXIsIF9tYXg6IG51bWJlcik6IFBpY2tbXSB7XHJcbiAgICAgIGlmIChfZnJvbS5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gW107XHJcblxyXG4gICAgICBsZXQgY21wQ2FtZXJhUGljazogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG4gICAgICBjbXBDYW1lcmFQaWNrLm10eFBpdm90LnRyYW5zbGF0aW9uID0gX3JheS5vcmlnaW47XHJcbiAgICAgIGNtcENhbWVyYVBpY2subXR4UGl2b3QubG9va0F0KFZlY3RvcjMuU1VNKF9yYXkub3JpZ2luLCBfcmF5LmRpcmVjdGlvbikpO1xyXG4gICAgICBjbXBDYW1lcmFQaWNrLnByb2plY3RDZW50cmFsKDEsIDAuMDAxLCBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMLCBfbWluLCBfbWF4KTtcclxuXHJcbiAgICAgIGlmIChfZnJvbVswXSBpbnN0YW5jZW9mIE5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFJlbmRlci5waWNrKDxOb2RlW10+X2Zyb20sIGNtcENhbWVyYVBpY2spO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIEdpem1vcy5waWNrKDxHaXptb1tdPl9mcm9tLCBjbXBDYW1lcmFQaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY2FtZXJhIGFuZCBhIHBvaW50IG9uIGl0cyB2aXJ0dWFsIG5vcm1lZCBwcm9qZWN0aW9uIHBsYW5lIChkaXN0YW5jZSAxKSB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tDYW1lcmEoX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3Bvc1Byb2plY3Rpb246IFZlY3RvcjIpOiBQaWNrW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tDYW1lcmEoX25vZGVzOiBHaXptb1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9wb3NQcm9qZWN0aW9uOiBWZWN0b3IyKTogUGlja1tdO1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrQ2FtZXJhKF9mcm9tOiBOb2RlW10gfCBHaXptb1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9wb3NQcm9qZWN0aW9uOiBWZWN0b3IyKTogUGlja1tdIHtcclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShuZXcgVmVjdG9yMygtX3Bvc1Byb2plY3Rpb24ueCwgX3Bvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSByYXkuZGlyZWN0aW9uLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChfY21wQ2FtZXJhLm5vZGUpIHtcclxuICAgICAgICBsZXQgbXR4Q2FtZXJhOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfY21wQ2FtZXJhLm5vZGUubXR4V29ybGQsIF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG4gICAgICAgIHJheS50cmFuc2Zvcm0obXR4Q2FtZXJhKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhDYW1lcmEpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByYXkudHJhbnNmb3JtKF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja1JheSg8R2VuZXJhbD5fZnJvbSwgcmF5LCBsZW5ndGggKiBfY21wQ2FtZXJhLmdldE5lYXIoKSwgbGVuZ3RoICogX2NtcENhbWVyYS5nZXRGYXIoKSk7XHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIHRoZSBjYW1lcmEgb2YgdGhlIGdpdmVuIHZpZXdwb3J0IGFuZCBhIHBvaW50IHRoZSBjbGllbnQgc3VyZmFjZSB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tWaWV3cG9ydChfdmlld3BvcnQ6IFZpZXdwb3J0LCBfcG9zQ2xpZW50OiBWZWN0b3IyKTogUGlja1tdIHtcclxuICAgICAgbGV0IHBvc1Byb2plY3Rpb246IFZlY3RvcjIgPSBfdmlld3BvcnQucG9pbnRDbGllbnRUb1Byb2plY3Rpb24oX3Bvc0NsaWVudCk7XHJcbiAgICAgIGxldCBub2RlczogTm9kZVtdID0gQXJyYXkuZnJvbShfdmlld3BvcnQuZ2V0QnJhbmNoKCkuZ2V0SXRlcmF0b3IodHJ1ZSkpO1xyXG4gICAgICBsZXQgcGlja3M6IFBpY2tbXSA9IFBpY2tlci5waWNrQ2FtZXJhKG5vZGVzLCBfdmlld3BvcnQuY2FtZXJhLCBwb3NQcm9qZWN0aW9uKTtcclxuICAgICAgaWYgKF92aWV3cG9ydC5naXptb3NFbmFibGVkKSBcclxuICAgICAgICBwaWNrcyA9IHBpY2tzLmNvbmNhdChQaWNrZXIucGlja0NhbWVyYShfdmlld3BvcnQuZ2V0R2l6bW9zKG5vZGVzKSwgX3ZpZXdwb3J0LmNhbWVyYSwgcG9zUHJvamVjdGlvbikpOyAvLyB0aGlzIGlzIGtpbmQgb2Ygd2FzdGVmdWwgYmVjYXVzZSB3ZSBkbyB0aGUgc2FtZSBjYWxjdWxhdGlvbnMgdHdpY2VcclxuICAgICAgXHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lZCBieSBhbiBvcmlnaW4gYW5kIGEgZGlyZWN0aW9uIG9mIHR5cGUge0BsaW5rIFBpY2t9LCByYXlzIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBwaWNraW5nIGFuZCBpbnRlcnNlY3Rpb25zXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmF5IHtcclxuICAgIHB1YmxpYyBvcmlnaW46IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgZGlyZWN0aW9uOiBWZWN0b3IzO1xyXG4gICAgLyoqIFRPRE86IHN1cHBvcnQgbGVuZ3RoICovXHJcbiAgICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9kaXJlY3Rpb246IFZlY3RvcjMgPSBWZWN0b3IzLlooMSksIF9vcmlnaW46IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKSwgX2xlbmd0aDogbnVtYmVyID0gMSkge1xyXG4gICAgICB0aGlzLm9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX2RpcmVjdGlvbjtcclxuICAgICAgdGhpcy5sZW5ndGggPSBfbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmF5IHdpdGggYSBwbGFuZSBkZWZpbmVkIGJ5IFxyXG4gICAgICogdGhlIGdpdmVuIHBvaW50IG9mIG9yaWdpbiBhbmQgdGhlIHBsYW5lcyBub3JtYWwuIEFsbCB2YWx1ZXMgYW5kIGNhbGN1bGF0aW9uc1xyXG4gICAgICogbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSwgcHJlZmVyYWJseSB0aGUgd29ybGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVyc2VjdFBsYW5lKF9vcmlnaW46IFZlY3RvcjMsIF9ub3JtYWw6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX29yaWdpbiwgdGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgZmFjdG9yOiBudW1iZXIgPSBWZWN0b3IzLkRPVChkaWZmZXJlbmNlLCBfbm9ybWFsKSAvIFZlY3RvcjMuRE9UKHRoaXMuZGlyZWN0aW9uLCBfbm9ybWFsKTtcclxuICAgICAgbGV0IGludGVyc2VjdDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHRoaXMub3JpZ2luLCBWZWN0b3IzLlNDQUxFKHRoaXMuZGlyZWN0aW9uLCBmYWN0b3IpKTtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0aGlzIHJheSB3aXRoIGEgcGxhbmUgZGVmaW5lZCBieSB0aGUgZmFjZS4gXHJcbiAgICAgKiBBbGwgdmFsdWVzIGFuZCBjYWxjdWxhdGlvbnMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSwgcHJlZmVyYWJseSB0aGUgd29ybGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVyc2VjdEZhY2VQbGFuZShfZmFjZTogRmFjZSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RQbGFuZShfZmFjZS5nZXRQb3NpdGlvbigwKSwgX2ZhY2Uubm9ybWFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIGZyb20gdGhlIHJheSB0byB0aGUgZ2l2ZW4gdGFyZ2V0IHBvaW50LlxyXG4gICAgICogQWxsIHZhbHVlcyBhbmQgY2FsY3VsYXRpb25zIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGlzdGFuY2UoX3RhcmdldDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgb3JpZ2luVG9UYXJnZXQ6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgcmF5U2VjdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmRpcmVjdGlvbiwgMSk7XHJcbiAgICAgIGxldCBwcm9qZWN0ZWRMZW5ndGg6IG51bWJlciA9IFZlY3RvcjMuRE9UKG9yaWdpblRvVGFyZ2V0LCByYXlTZWN0aW9uKTtcclxuICAgICAgcmF5U2VjdGlvbi5zY2FsZShwcm9qZWN0ZWRMZW5ndGgpO1xyXG4gICAgICByYXlTZWN0aW9uLmFkZCh0aGlzLm9yaWdpbik7XHJcbiAgICAgIGxldCBkaXN0YW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCByYXlTZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIGRpc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtIHRoZSByYXkgYnkgdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm9yaWdpbi50cmFuc2Zvcm0oX210eFRyYW5zZm9ybSk7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybShfbXR4VHJhbnNmb3JtLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYG9yaWdpbjogJHt0aGlzLm9yaWdpbi50b1N0cmluZygpfSwgZGlyZWN0aW9uOiAke3RoaXMuZGlyZWN0aW9uLnRvU3RyaW5nKCl9LCBsZW5ndGg6ICR7dGhpcy5sZW5ndGgudG9QcmVjaXNpb24oNSl9YDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGludGVyZmFjZSB0byByZW5kZXIgdmlzdWFsIGFpZHMgaW4gdGhlIGVkaXRvci4gSW1wbGVtZW50ZWQgYnkge0BsaW5rIENvbXBvbmVudH1zLiBDYW4gYmUgdXNlZCBvbiBpdHMgb3duIHRvIGRyYXcgYW5kIHBpY2sgdmlzdWFsIGFpZHMgaW5kZXBlbmRlbnQgb2YgYSBzY2VuZSBncmFwaC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEdpem1vIHtcclxuICAgIG5vZGU/OiBOb2RlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnQgdGhpcyB0byBkcmF3IHZpc3VhbCBhaWRzIGluc2lkZSB0aGUgZWRpdG9ycyByZW5kZXIgdmlldy4gVXNlIHtAbGluayBHaXptb3N9IGluc2lkZSB0aGUgb3ZlcnJpZGUgdG8gZHJhdyBzdHVmZi5cclxuICAgICAqL1xyXG4gICAgZHJhd0dpem1vcz8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSwgX3BpY2tpbmc/OiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgZHJhd0dpem1vc30uIE9ubHkgZGlzcGxheWVkIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIGRyYXdHaXptb3NTZWxlY3RlZD8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSk6IHZvaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZ2l6bW9zIGRyYXdpbmcgaW50ZXJmYWNlLiB7QGxpbmsgQ29tcG9uZW50fXMgY2FuIHVzZSB0aGlzIHRvIGRyYXcgdmlzdWFsIGFpZHMgaW5zaWRlIHtAbGluayBDb21wb25lbnQuZHJhd0dpem1vc30gYW5kIHtAbGluayBDb21wb25lbnQuZHJhd0dpem1vc1NlbGVjdGVkfS5cclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgR2l6bW9zIHtcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSBkZWZhdWx0IG9wYWNpdHkgb2Ygb2NjbHVkZWQgZ2l6bW8gcGFydHMuIFVzZSB0aGlzIHRvIGNvbnRyb2wgdGhlIHZpc2liaWxpdHkgb2YgZ2l6bW9zIGJlaGluZCBvYmplY3RzLlxyXG4gICAgICogU2V0IHRvIDAgdG8gbWFrZSBvY2NsdWRlZCBnaXptbyBwYXJ0cyBkaXNhcHBlYXIuIFNldCB0byAxIHRvIG1ha2Ugb2NjbHVkZWQgZ2l6bW8gcGFydHMgZnVsbHkgdmlzaWJsZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gMC4zOyAvLyBjdXJyZW50bHkgZ2l6bW9zIGNhbiBhbHdheXMgYmUgcGlja2VkIGV2ZW4gaWYgdGhpcyBpcyBzZXQgdG8gMC4uLlxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGFycmF5QnVmZmVyOiBXZWJHTEJ1ZmZlciA9IFJlbmRlcldlYkdMLmFzc2VydChSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkuY3JlYXRlQnVmZmVyKCkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW5kZXhCdWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5jcmVhdGVCdWZmZXIoKSk7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGlja0lkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwb3NJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIGNhY2hlIHRoZSBwb3NpdGlvbnMgb2YgaWNvbnMgdG8gYXZvaWQgZHJhd2luZyB0aGVtIHdpdGhpbiBlYWNoIG90aGVyXHJcblxyXG4gICAgc3RhdGljICNjYW1lcmE6IENvbXBvbmVudENhbWVyYTtcclxuXHJcbiAgICBzdGF0aWMgI21lc2hlczogeyBba2V5OiBzdHJpbmddOiBNZXNoIH0gPSB7fTtcclxuXHJcbiAgICAvLyBUT0RPOiB0aGluayBhYm91dCBkcmF3aW5nIHRoZXNlIG9uIHRoZSBmbHkgaW5zdGVhZCBvZiBjYWNoaW5nIHRoZW0uIFRoZW4gd2UgY291bGQgYWNjZXB0IGEgcG9zaXRpb24sIHJhZGl1cyBldGMuIHBhcmFtZXRlciBhbmQgZHJhdyB0aGVtIGluZGVwZW5kZW50IGZyb20gdGhlIG10eFdvcmxkXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZUNpcmNsZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3Qgc2VnbWVudHM6IG51bWJlciA9IDQ1O1xyXG4gICAgICBjb25zdCBjaXJjbGU6IFZlY3RvcjNbXSA9IG5ldyBBcnJheShzZWdtZW50cykuZmlsbChudWxsKS5tYXAoKCkgPT4gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspIHtcclxuICAgICAgICBjb25zdCBhbmdsZTogbnVtYmVyID0gKGkgLyBzZWdtZW50cykgKiAyICogTWF0aC5QSTtcclxuICAgICAgICBjb25zdCB4OiBudW1iZXIgPSByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgY29uc3QgeTogbnVtYmVyID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xyXG4gICAgICAgIGNpcmNsZVtpXS5zZXQoeCwgeSwgMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspXHJcbiAgICAgICAgbGluZXMucHVzaChjaXJjbGVbaV0sIGNpcmNsZVsoaSArIDEpICUgc2VnbWVudHNdKTtcclxuXHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcIndpcmVDaXJjbGVcIiwgeyB2YWx1ZTogbGluZXMgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Mud2lyZUNpcmNsZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZVNwaGVyZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBsZXQgbGluZXM6IFZlY3RvcjNbXSA9IEdpem1vcy53aXJlQ2lyY2xlLmNvbmNhdCgpO1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9YKDkwKTtcclxuICAgICAgbGluZXMucHVzaCguLi5HaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIG10eFJvdGF0aW9uKSkpO1xyXG4gICAgICBtdHhSb3RhdGlvbi5yb3RhdGVZKDkwKTtcclxuICAgICAgbGluZXMucHVzaCguLi5HaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIG10eFJvdGF0aW9uKSkpO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZVNwaGVyZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlU3BoZXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ29uZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAxO1xyXG4gICAgICBjb25zdCBhcGV4OiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGNvbnN0IHF1YWQ6IFZlY3RvcjNbXSA9IFtcclxuICAgICAgICBuZXcgVmVjdG9yMyhyYWRpdXMsIDAsIGhlaWdodCksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoLXJhZGl1cywgMCwgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygwLCByYWRpdXMsIGhlaWdodCksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoMCwgLXJhZGl1cywgaGVpZ2h0KVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgbGV0IGxpbmVzOiBWZWN0b3IzW10gPSBHaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooMSkpKSk7XHJcblxyXG4gICAgICBsaW5lcy5wdXNoKC4uLlthcGV4LCBxdWFkWzBdLCBhcGV4LCBxdWFkWzFdLCBhcGV4LCBxdWFkWzJdLCBhcGV4LCBxdWFkWzNdXSk7XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlQ29uZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ29uZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZUN1YmUoKTogVmVjdG9yM1tdIHtcclxuICAgICAgY29uc3QgaGFsZlNpemU6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3QgY3ViZTogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIG5ldyBWZWN0b3IzKGhhbGZTaXplLCBoYWxmU2l6ZSwgaGFsZlNpemUpLCBuZXcgVmVjdG9yMygtaGFsZlNpemUsIGhhbGZTaXplLCBoYWxmU2l6ZSksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoLWhhbGZTaXplLCAtaGFsZlNpemUsIGhhbGZTaXplKSwgbmV3IFZlY3RvcjMoaGFsZlNpemUsIC1oYWxmU2l6ZSwgaGFsZlNpemUpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKGhhbGZTaXplLCBoYWxmU2l6ZSwgLWhhbGZTaXplKSwgbmV3IFZlY3RvcjMoLWhhbGZTaXplLCBoYWxmU2l6ZSwgLWhhbGZTaXplKSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtaGFsZlNpemUsIC1oYWxmU2l6ZSwgLWhhbGZTaXplKSwgbmV3IFZlY3RvcjMoaGFsZlNpemUsIC1oYWxmU2l6ZSwgLWhhbGZTaXplKVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgbGluZXM6IFZlY3RvcjNbXSA9IFtcclxuICAgICAgICBjdWJlWzBdLCBjdWJlWzFdLCBjdWJlWzFdLCBjdWJlWzJdLCBjdWJlWzJdLCBjdWJlWzNdLCBjdWJlWzNdLCBjdWJlWzBdLFxyXG4gICAgICAgIGN1YmVbNF0sIGN1YmVbNV0sIGN1YmVbNV0sIGN1YmVbNl0sIGN1YmVbNl0sIGN1YmVbN10sIGN1YmVbN10sIGN1YmVbNF0sXHJcbiAgICAgICAgY3ViZVswXSwgY3ViZVs0XSwgY3ViZVsxXSwgY3ViZVs1XSwgY3ViZVsyXSwgY3ViZVs2XSwgY3ViZVszXSwgY3ViZVs3XVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZUN1YmVcIiwgeyB2YWx1ZTogbGluZXMgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Mud2lyZUN1YmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgd2UgY3VycmVudGx5IHJlbmRlcmluZyBmb3IgcGlja2luZz9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldCAjcGlja2luZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGlja0lkICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGUgZ2l2ZW4gZ2l6bW9zIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3KF9naXptb3M6IEdpem1vW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3NlbGVjdGVkPzogTm9kZVtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAoY29uc3QgZ2l6bW8gb2YgX2dpem1vcylcclxuICAgICAgICBpZiAoZ2l6bW8ubm9kZSlcclxuICAgICAgICAgIFJlZmxlY3Quc2V0KGdpem1vLm5vZGUsIFwiekNhbWVyYVwiLCBfY21wQ2FtZXJhLnBvaW50V29ybGRUb0NsaXAoZ2l6bW8ubm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBfZ2l6bW9zID0gX2dpem1vcy5zb3J0KChfYSwgX2IpID0+XHJcbiAgICAgICAgKF9iLm5vZGUgPyBSZWZsZWN0LmdldChfYi5ub2RlLCBcInpDYW1lcmFcIikgOiAyKSAtXHJcbiAgICAgICAgKF9hLm5vZGUgPyBSZWZsZWN0LmdldChfYS5ub2RlLCBcInpDYW1lcmFcIikgOiAyKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgR2l6bW9zLiNjYW1lcmEgPSBfY21wQ2FtZXJhO1xyXG4gICAgICBHaXptb3MucG9zSWNvbnMuY2xlYXIoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgZ2l6bW8gb2YgX2dpem1vcykge1xyXG4gICAgICAgIGdpem1vLmRyYXdHaXptb3M/LihfY21wQ2FtZXJhLCBHaXptb3MuI3BpY2tpbmcpO1xyXG4gICAgICAgIGlmIChfc2VsZWN0ZWQ/LmluY2x1ZGVzKGdpem1vLm5vZGUpKVxyXG4gICAgICAgICAgZ2l6bW8uZHJhd0dpem1vc1NlbGVjdGVkPy4oX2NtcENhbWVyYSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIGFsbCBnaXptb3MgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybnMgYW4gdW5zb3J0ZWQgYXJyYXkgb2Yge0BsaW5rIFBpY2t9cyBlYWNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l6bW8gdGhlIHBpY2sgcmF5IGhpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrKF9naXptb3M6IEdpem1vc1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiBQaWNrW10ge1xyXG4gICAgICByZXR1cm4gUmVuZGVyV2ViR0wucGlja0Zyb20oX2dpem1vcywgX2NtcENhbWVyYSwgcGljayk7XHJcblxyXG4gICAgICBmdW5jdGlvbiBwaWNrKF9naXptb3M6IEdpem1vW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7XHJcbiAgICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoU2hhZGVyUGlja1RleHR1cmVkLnVuaWZvcm1zW1widV9tdHhQaXZvdFwiXSwgZmFsc2UsIE1hdHJpeDN4My5JREVOVElUWSgpLmdldCgpKTsgLy8gb25seSBuZWVkZWQgZm9yIHRleHR1cmVkIHBpY2sgc2hhZGVyLCBidXQgZ2l6bW9zIGhhdmUgbm8gcGl2b3RcclxuXHJcbiAgICAgICAgR2l6bW9zLiNjYW1lcmEgPSBfY21wQ2FtZXJhO1xyXG4gICAgICAgIEdpem1vcy5wb3NJY29ucy5jbGVhcigpO1xyXG5cclxuICAgICAgICBsZXQgcGlja3M6IFBpY2tbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGdpem1vIG9mIF9naXptb3MpIHtcclxuICAgICAgICAgIGlmICghZ2l6bW8uZHJhd0dpem1vcylcclxuICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgR2l6bW9zLnBpY2tJZCA9IHBpY2tzLmxlbmd0aDtcclxuICAgICAgICAgIGdpem1vLmRyYXdHaXptb3MoX2NtcENhbWVyYSwgR2l6bW9zLiNwaWNraW5nKTtcclxuICAgICAgICAgIGxldCBwaWNrOiBQaWNrID0gbmV3IFBpY2soZ2l6bW8ubm9kZSk7XHJcbiAgICAgICAgICBwaWNrLmdpem1vID0gZ2l6bW87XHJcbiAgICAgICAgICBwaWNrcy5wdXNoKHBpY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR2l6bW9zLnBpY2tJZCA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBwaWNrcztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBjYW1lcmEgZnJ1c3R1bSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFRoZSBmcnVzdHVtIGlzIG9yaWVudGVkIGFsb25nIHRoZSB6LWF4aXMsIHdpdGggdGhlIHRpcCBvZiB0aGUgdHJ1bmNhdGVkIHB5cmFtaWQgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUZydXN0dW0oX2FzcGVjdDogbnVtYmVyLCBfZm92OiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVywgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBmOiBudW1iZXIgPSBNYXRoLnRhbihDYWxjLmRlZzJyYWQgKiBfZm92IC8gMik7XHJcblxyXG4gICAgICBsZXQgc2NhbGVYOiBudW1iZXIgPSBmO1xyXG4gICAgICBsZXQgc2NhbGVZOiBudW1iZXIgPSBmO1xyXG5cclxuICAgICAgc3dpdGNoIChfZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZVkgPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5WRVJUSUNBTDpcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMOlxyXG4gICAgICAgICAgY29uc3QgZGlhZ29uYWxBc3BlY3Q6IG51bWJlciA9IE1hdGguc3FydChfYXNwZWN0KTtcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIHNjYWxlWSA9IGYgLyBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZWFyWDogbnVtYmVyID0gX25lYXIgKiBzY2FsZVg7XHJcbiAgICAgIGNvbnN0IG5lYXJZOiBudW1iZXIgPSBfbmVhciAqIHNjYWxlWTtcclxuICAgICAgY29uc3QgZmFyWDogbnVtYmVyID0gX2ZhciAqIHNjYWxlWDtcclxuICAgICAgY29uc3QgZmFyWTogbnVtYmVyID0gX2ZhciAqIHNjYWxlWTtcclxuXHJcbiAgICAgIGNvbnN0IGZydXN0dW06IFZlY3RvcjNbXSA9IG5ldyBBcnJheSg4KS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG5cclxuICAgICAgZnJ1c3R1bVswXS5zZXQoLW5lYXJYLCBuZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzFdLnNldChuZWFyWCwgbmVhclksIF9uZWFyKTtcclxuICAgICAgZnJ1c3R1bVsyXS5zZXQobmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzNdLnNldCgtbmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG5cclxuICAgICAgZnJ1c3R1bVs0XS5zZXQoLWZhclgsIGZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzVdLnNldChmYXJYLCBmYXJZLCBfZmFyKTtcclxuICAgICAgZnJ1c3R1bVs2XS5zZXQoZmFyWCwgLWZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzddLnNldCgtZmFyWCwgLWZhclksIF9mYXIpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhbXHJcbiAgICAgICAgZnJ1c3R1bVswXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVswXSwgLy8gbmVhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bNF0sIGZydXN0dW1bNV0sIGZydXN0dW1bNV0sIGZydXN0dW1bNl0sIGZydXN0dW1bNl0sIGZydXN0dW1bN10sIGZydXN0dW1bN10sIGZydXN0dW1bNF0sIC8vIGZhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bMF0sIGZydXN0dW1bNF0sIGZydXN0dW1bMV0sIGZydXN0dW1bNV0sIGZydXN0dW1bMl0sIGZydXN0dW1bNl0sIGZydXN0dW1bM10sIGZydXN0dW1bN10gIC8vIHNpZGVzXHJcbiAgICAgIF0sIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKC4uLmZydXN0dW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgY3ViZS4gVGhlIGN1YmUgaGFzIGEgc2lkZS1sZW5ndGggb2YgMSBhbmQgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhHaXptb3Mud2lyZUN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgc3BoZXJlLiBUaGUgc3BoZXJlIGhhcyBhIGRpYW1ldGVyIG9mIDEgYW5kIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgb3JpZ2luLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdXaXJlU3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlU3BoZXJlLCBtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tBdChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIEdpem1vcy5kcmF3V2lyZUNpcmNsZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGNvbmUgd2l0aCBhIGhlaWdodCBhbmQgZGlhbWV0ZXIgb2YgMS4gVGhlIGNvbmUgaXMgb3JpZW50ZWQgYWxvbmcgdGhlIHotYXhpcyB3aXRoIHRoZSB0aXAgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUNvbmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ29uZSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgY2lyY2xlIHdpdGggYSBkaWFtZXRlciBvZiAxLiBUaGUgY2lyY2xlIGxpZXMgaW4gdGhlIHgteSBwbGFuZSwgd2l0aCBpdHMgY2VudGVyIGF0IHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDaXJjbGUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ2lyY2xlLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiBcclxuICAgICAqIFZlcnRpY2VzIGFyZSBwYWlyZWQgc2VxdWVudGlhbGx5LCBzbyBmb3IgZXhhbXBsZSwgbGluZXMgd2lsbCBiZSBkcmF3biBiZXR3ZWVuIHZlcnRpY2VzIDAgYW5kIDEsIDIgYW5kIDMsIDQgYW5kIDUsIGV0Yy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TGluZXMoX3ZlcnRpY2VzOiBWZWN0b3IzW10sIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgc2hhZGVyOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyR2l6bW87XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICBjb25zdCBsaW5lRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShfdmVydGljZXMubGVuZ3RoICogMyk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwb2ludDogVmVjdG9yMyA9IF92ZXJ0aWNlc1tpXTtcclxuICAgICAgICBsaW5lRGF0YS5zZXQocG9pbnQuZ2V0KCksIGkgKiAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIEdpem1vcy5hcnJheUJ1ZmZlcik7XHJcbiAgICAgIEdpem1vcy5idWZmZXJNYXRyaXgoc2hhZGVyLCBfbXR4V29ybGQpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIGxpbmVEYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3QXJyYXlzLCBfdmVydGljZXMubGVuZ3RoLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgd2lyZWZyYW1lIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVNZXNoKF9tZXNoOiBNZXNoLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNvbnN0IHNoYWRlcjogdHlwZW9mIFNoYWRlciA9IFNoYWRlckdpem1vO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IF9tZXNoLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuICAgICAgY29uc3QgcmVuZGVyTWVzaDogUmVuZGVyTWVzaCA9IF9tZXNoLnJlbmRlck1lc2g7IC8vIFRPRE86IGRvbid0IGJyZWFjaCBlbmNhcHN1bGF0aW9uIGhlcmUuLi5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgeyAvLyBUT0RPOiB0aGluayBhYm91dCBjYWNoaW5nIHRoaXMgaW4gdGhlIG1lc2hcclxuICAgICAgICBjb25zdCBhOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaV07XHJcbiAgICAgICAgY29uc3QgYjogbnVtYmVyID0gcmVuZGVyTWVzaC5pbmRpY2VzW2kgKyAxXTtcclxuICAgICAgICBjb25zdCBjOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaSArIDJdO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIGxpbmUgc2VnbWVudHMgZm9yIHRoZSB0cmlhbmdsZSB0byB0aGUgbGluZSBpbmRpY2VzXHJcbiAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGIsIGMsIGMsIGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgR2l6bW9zLmluZGV4QnVmZmVyKTtcclxuICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMpO1xyXG4gICAgICBHaXptb3MuYnVmZmVyTWF0cml4KHNoYWRlciwgX210eFdvcmxkKTtcclxuXHJcbiAgICAgIEdpem1vcy5kcmF3R2l6bW9zKHNoYWRlciwgR2l6bW9zLmRyYXdFbGVtZW50c0xpbmVzLCBpbmRpY2VzLmxlbmd0aCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhbiBhcnJvdyBhdCB0aGUgZ2l2ZW4gd29ybGQgcG9zaXRpb24sIGZhY2luZyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBhbmQgd2lkdGguIFxyXG4gICAgICogU2l6ZSByZWZlcnMgdG8gdGhlIHNpemUgb2YgdGhlIGFycm93IGhlYWQ6IHRoZSBoZWlnaHQgb2YgdGhlIHB5cmFtaWQ7IHRoZSBzaXplIG9mIHRoZSBjdWJlOyB0aGUgZGlhbWV0ZXIgb2YgdGhlIHNwaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3QXJyb3coX3Bvc2l0aW9uOiBWZWN0b3IzLCBfY29sb3I6IENvbG9yLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9zaXplOiBudW1iZXIsIF9oZWFkOiB0eXBlb2YgTWVzaEN1YmUgfCB0eXBlb2YgTWVzaFB5cmFtaWQgfCB0eXBlb2YgTWVzaFNwaGVyZSB8IG51bGwgPSBNZXNoUHlyYW1pZCwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IHNjYWxpbmc6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKS5zZXQoX3dpZHRoLCBfd2lkdGgsIF9sZW5ndGggLSBfc2l6ZSk7XHJcbiAgICAgIGNvbnN0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09NUE9TSVRJT04oX3Bvc2l0aW9uKTtcclxuICAgICAgbXR4V29ybGQuc2NhbGluZyA9IHNjYWxpbmc7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tJbihfZGlyZWN0aW9uLCBfdXApO1xyXG4gICAgICBtdHhXb3JsZC50cmFuc2xhdGVaKDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3Q3ViZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLnRyYW5zbGF0ZVooMC41KTtcclxuXHJcbiAgICAgIGlmIChfaGVhZCA9PSBNZXNoUHlyYW1pZCkge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoSGVhZDogbnVtYmVyID0gX3NpemUgLyAyO1xyXG4gICAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBzY2FsaW5nLnNldCh3aWR0aEhlYWQsIHdpZHRoSGVhZCwgX3NpemUpO1xyXG4gICAgICAgIG10eFdvcmxkLnJvdGF0ZVgoOTApOyAvLyByb3RhdGUgdGhlIHB5cmFtaWQgc28gaXQgcG9pbnRzIGluIHRoZSByaWdodCBkaXJlY3Rpb25cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtdHhXb3JsZC5zY2FsaW5nID0gc2NhbGluZy5zZXQoX3NpemUsIF9zaXplLCBfc2l6ZSk7XHJcbiAgICAgICAgbXR4V29ybGQudHJhbnNsYXRlWigwLjUpOyAvLyB0cmFuc2xhdGUgY3ViZS9zcGhlcmUgc28gaXQgc2l0cyBvbiB0b3Agb2YgdGhlIGFycm93XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5kcmF3TWVzaChHaXptb3MuZ2V0TWVzaChfaGVhZCksIG10eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIHNjYWxpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBjdWJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hDdWJlKSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgc29saWQgc3BoZXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdTcGhlcmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmdldE1lc2goTWVzaFNwaGVyZSksIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIHF1YWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1F1YWQoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmdldE1lc2goTWVzaFF1YWQpLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBkb3VibGUgc2lkZWQgcXVhZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3U3ByaXRlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hTcHJpdGUpLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBweXJhbWlkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdQeXJhbWlkKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hQeXJhbWlkKSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgc29saWQgbWVzaC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TWVzaChfbWVzaDogTWVzaCwgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IEdpem1vcy4jcGlja2luZyA/IFNoYWRlclBpY2sgOiBTaGFkZXJHaXptbztcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gX21lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIF9tdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCksIEdpem1vcy5waWNrSWQpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGFuIGljb24gZnJvbSBhIHtAbGluayBUZXh0dXJlfSBvbiBhIHtAbGluayBNZXNoUXVhZH0uIFRoZSBpY29uIGlzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2Zvcm0gYW5kIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdJY29uKF90ZXh0dXJlOiBUZXh0dXJlLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogc3RyaW5nID0gX210eFdvcmxkLnRyYW5zbGF0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmIChHaXptb3MucG9zSWNvbnMuaGFzKHBvc2l0aW9uKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5hZGQocG9zaXRpb24pO1xyXG5cclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gR2l6bW9zLiNwaWNraW5nID8gU2hhZGVyUGlja1RleHR1cmVkIDogU2hhZGVyR2l6bW9UZXh0dXJlZDtcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCBtdHhXb3JsZDogTWF0cml4NHg0ID0gX210eFdvcmxkLmNsb25lO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gX2NvbG9yLmNsb25lO1xyXG5cclxuICAgICAgbGV0IGJhY2s6IFZlY3RvcjMgPSBHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC5mb3J3YXJkLm5lZ2F0ZSgpO1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSBHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC51cDtcclxuICAgICAgbXR4V29ybGQubG9va0luKGJhY2ssIHVwKTtcclxuXHJcbiAgICAgIGxldCBkaXN0YW5jZTogbnVtYmVyID0gVmVjdG9yMy5ESUZGRVJFTkNFKEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLCBtdHhXb3JsZC50cmFuc2xhdGlvbikubWFnbml0dWRlO1xyXG4gICAgICBsZXQgZmFkZUZhcjogbnVtYmVyID0gNDtcclxuICAgICAgbGV0IGZhZGVOZWFyOiBudW1iZXIgPSAxLjU7XHJcbiAgICAgIGlmIChkaXN0YW5jZSA+IDAgJiYgZGlzdGFuY2UgPCBmYWRlRmFyKSB7XHJcbiAgICAgICAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgLSBmYWRlTmVhcikgLyAoZmFkZUZhciAtIGZhZGVOZWFyKTtcclxuICAgICAgICBjb2xvci5hID0gQ2FsYy5sZXJwKDAsIGNvbG9yLmEsIGRpc3RhbmNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSBHaXptb3MuZ2V0TWVzaChNZXNoUXVhZCkudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIG10eFdvcmxkLCBNYXRyaXg0eDQuUFJPRFVDVChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZFRvVmlldywgbXR4V29ybGQpLCBHaXptb3MucGlja0lkKTtcclxuICAgICAgX3RleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShzaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5JTkRFWCk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3RWxlbWVudHNUcmlhbmxnZXMsIHJlbmRlckJ1ZmZlcnMubkluZGljZXMsIGNvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFdvcmxkLCBjb2xvciwgYmFjaywgdXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJ1ZmZlclBvc2l0aW9ucyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9idWZmZXI6IFdlYkdMQnVmZmVyKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIF9idWZmZXIpO1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBudW1iZXIgPSBfc2hhZGVyLmF0dHJpYnV0ZXNbXCJhX3ZjdFBvc2l0aW9uXCJdO1xyXG4gICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYnV0ZSk7XHJcbiAgICAgIGNyYzMudmVydGV4QXR0cmliUG9pbnRlcihhdHRyaWJ1dGUsIDMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIGZhbHNlLCAwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBidWZmZXJDb2xvcihfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9jb2xvcjogQ29sb3IpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm00ZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfdmN0Q29sb3JcIl0sIF9jb2xvci5nZXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyTWF0cml4KF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX210eFdvcmxkOiBNYXRyaXg0eDQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtTWF0cml4NGZ2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1ZpZXdcIl0sIGZhbHNlLCBtdHhNZXNoVG9WaWV3LmdldCgpKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4TWVzaFRvVmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0dpem1vcyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9kcmF3OiBGdW5jdGlvbiwgX2NvdW50OiBudW1iZXIsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgaWYgKF9hbHBoYU9jY2x1ZGVkID4gMCkge1xyXG4gICAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBfY29sb3IuY2xvbmU7XHJcbiAgICAgICAgY29sb3IuYSAqPSBfYWxwaGFPY2NsdWRlZDtcclxuICBcclxuICAgICAgICAvLyBkcmF3IG9jY2x1ZGVkIHBhcnRzIHdoZXJlIHRoZSBkZXB0aCB0ZXN0IGZhaWxlZCAoYnkgaW52ZXJ0aW5nIHRoZSBkZXB0aCB0ZXN0ICsgbm8gZGVwdGggd3JpdGUpXHJcbiAgICAgICAgY3JjMy5kZXB0aEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5HRVFVQUwpO1xyXG4gICAgICAgIGNyYzMuZGVwdGhNYXNrKGZhbHNlKTtcclxuICAgICAgICBHaXptb3MuYnVmZmVyQ29sb3IoX3NoYWRlciwgY29sb3IpO1xyXG4gICAgICAgIF9kcmF3KF9jb3VudCk7XHJcbiAgICAgICAgY3JjMy5kZXB0aEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MRVNTKTtcclxuICAgICAgICBjcmMzLmRlcHRoTWFzayh0cnVlKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5idWZmZXJDb2xvcihfc2hhZGVyLCBfY29sb3IpO1xyXG4gICAgICBfZHJhdyhfY291bnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdFbGVtZW50c1RyaWFubGdlcyhfY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCBfY291bnQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdFbGVtZW50c0xpbmVzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FUywgX2NvdW50LCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBkcmF3QXJyYXlzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORVMsIDAsIF9jb3VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVzaChfY29uc3RydWN0b3I6IG5ldyAoX25hbWU6IHN0cmluZykgPT4gTWVzaCk6IE1lc2gge1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgbGV0IG1lc2g6IE1lc2ggPSBHaXptb3MuI21lc2hlc1trZXldO1xyXG4gICAgICBpZiAobWVzaClcclxuICAgICAgICByZXR1cm4gbWVzaDtcclxuXHJcbiAgICAgIG1lc2ggPSBuZXcgX2NvbnN0cnVjdG9yKGtleSk7XHJcbiAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgR2l6bW9zLiNtZXNoZXNba2V5XSA9IG1lc2g7XHJcbiAgICAgIHJldHVybiBtZXNoO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCB0eXBlIE1hcExpZ2h0VHlwZVRvTGlnaHRMaXN0ID0gTWFwPFR5cGVPZkxpZ2h0LCBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4+O1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlclByZXBhcmVPcHRpb25zIHtcclxuICAgIGlnbm9yZVBoeXNpY3M/OiBib29sZWFuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSByZW5kZXIgZW5naW5lLCBoZXJlIFdlYkdMIChzZWUgc3VwZXJjbGFzcyB7QGxpbmsgUmVuZGVyV2ViR0x9IGFuZCB0aGUgUmVuZGVySW5qZWN0b3JzXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlciBleHRlbmRzIFJlbmRlcldlYkdMIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjdENsaXA6IFJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUoLTEsIDEsIDIsIC0yKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja0J1ZmZlcjogSW50MzJBcnJheTsgICAvLyBUT0RPOiByZXNlYXJjaCBpZiBwaWNraW5nIHNob3VsZCBiZSBvcHRpbWl6ZWQgdXNpbmcgcmFkaXVzIHBpY2tpbmcgdG8gZmlsdGVyXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5vZGVzUGh5c2ljczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29tcG9uZW50c1BpY2s6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFBpY2s+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpZ2h0czogTWFwTGlnaHRUeXBlVG9MaWdodExpc3QgPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBub2Rlc1NpbXBsZTogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG5vZGVzQWxwaGE6IFJlY3ljYWJsZUFycmF5PE5vZGU+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzU2tlbGV0b246IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFNrZWxldG9uPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGltZXN0YW1wVXBkYXRlOiBudW1iZXI7XHJcblxyXG4gICAgLy8jcmVnaW9uIFByZXBhcmVcclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYnJhbmNoIHN0YXJ0aW5nIHdpdGggdGhlIG5vZGUgZ2l2ZW4sIHJlY2FsY3VsYXRlcyBhbGwgd29ybGQgdHJhbnNmb3JtcywgXHJcbiAgICAgKiBjb2xsZWN0cyBhbGwgbGlnaHRzIGFuZCBmZWVkcyBhbGwgc2hhZGVycyB1c2VkIGluIHRoZSBncmFwaCB3aXRoIHRoZXNlIGxpZ2h0cy4gU29ydHMgbm9kZXMgZm9yIGRpZmZlcmVudFxyXG4gICAgICogcmVuZGVyIHBhc3Nlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwcmVwYXJlKF9icmFuY2g6IE5vZGUsIF9vcHRpb25zOiBSZW5kZXJQcmVwYXJlT3B0aW9ucyA9IHt9LCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfc2hhZGVyc1VzZWQ6IChTaGFkZXJJbnRlcmZhY2UpW10gPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBmaXJzdExldmVsOiBib29sZWFuID0gKF9zaGFkZXJzVXNlZCA9PSBudWxsKTtcclxuICAgICAgaWYgKGZpcnN0TGV2ZWwpIHtcclxuICAgICAgICBfc2hhZGVyc1VzZWQgPSBbXTtcclxuICAgICAgICBSZW5kZXIudGltZXN0YW1wVXBkYXRlID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzQWxwaGEucmVzZXQoKTtcclxuICAgICAgICBSZW5kZXIubm9kZXNQaHlzaWNzLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNTa2VsZXRvbi5yZXNldCgpO1xyXG4gICAgICAgIFJlbmRlci5saWdodHMuZm9yRWFjaChfYXJyYXkgPT4gX2FycmF5LnJlc2V0KCkpO1xyXG4gICAgICAgIF9icmFuY2guZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkVfU1RBUlQpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFfYnJhbmNoLmlzQWN0aXZlKVxyXG4gICAgICAgIHJldHVybjsgLy8gZG9uJ3QgYWRkIGJyYW5jaCB0byByZW5kZXIgbGlzdCBpZiBub3QgYWN0aXZlXHJcblxyXG4gICAgICBfYnJhbmNoLm5Ob2Rlc0luQnJhbmNoID0gMTtcclxuICAgICAgX2JyYW5jaC5yYWRpdXMgPSAwO1xyXG5cclxuICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50VG9UYXJnZXRPbmx5KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRSkpO1xyXG4gICAgICBfYnJhbmNoLnRpbWVzdGFtcFVwZGF0ZSA9IFJlbmRlci50aW1lc3RhbXBVcGRhdGU7XHJcblxyXG4gICAgICBpZiAoX2JyYW5jaC5jbXBUcmFuc2Zvcm0gJiYgX2JyYW5jaC5jbXBUcmFuc2Zvcm0uaXNBY3RpdmUpIHtcclxuICAgICAgICBsZXQgbXR4V29ybGRCcmFuY2g6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9tdHhXb3JsZCwgX2JyYW5jaC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwpO1xyXG4gICAgICAgIF9icmFuY2gubXR4V29ybGQuY29weShtdHhXb3JsZEJyYW5jaCk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4V29ybGRCcmFuY2gpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBfYnJhbmNoLm10eFdvcmxkLmNvcHkoX210eFdvcmxkKTsgLy8gb3ZlcndyaXRlIHJlYWRvbmx5IG10eFdvcmxkIG9mIHRoZSBjdXJyZW50IG5vZGVcclxuXHJcbiAgICAgIGxldCBjbXBSaWdpZGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSk7XHJcbiAgICAgIGlmIChjbXBSaWdpZGJvZHkgJiYgY21wUmlnaWRib2R5LmlzQWN0aXZlKSB7IC8vVE9ETzogc3VwcG9ydCBkZS0vYWN0aXZhdGlvbiB0aHJvdWdob3V0XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzUGh5c2ljcy5wdXNoKF9icmFuY2gpOyAvLyBhZGQgdGhpcyBub2RlIHRvIHBoeXNpY3MgbGlzdFxyXG4gICAgICAgIGlmICghX29wdGlvbnM/Lmlnbm9yZVBoeXNpY3MpXHJcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJ5UGh5c2ljcyhfYnJhbmNoLCBjbXBSaWdpZGJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY21wUGljazogQ29tcG9uZW50UGljayA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFBpY2spO1xyXG4gICAgICBpZiAoY21wUGljayAmJiBjbXBQaWNrLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnB1c2goY21wUGljayk7IC8vIGFkZCB0aGlzIGNvbXBvbmVudCB0byBwaWNrIGxpc3RcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcExpZ2h0czogQ29tcG9uZW50TGlnaHRbXSA9IF9icmFuY2guZ2V0Q29tcG9uZW50cyhDb21wb25lbnRMaWdodCk7XHJcbiAgICAgIFJlbmRlci5hZGRMaWdodHMoY21wTGlnaHRzKTtcclxuXHJcbiAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcblxyXG4gICAgICBpZiAoY21wTWVzaCAmJiBjbXBNZXNoLmlzQWN0aXZlICYmIGNtcE1hdGVyaWFsICYmIGNtcE1hdGVyaWFsLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eFdvcmxkTWVzaDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoX2JyYW5jaC5tdHhXb3JsZCwgY21wTWVzaC5tdHhQaXZvdCk7XHJcbiAgICAgICAgY21wTWVzaC5tdHhXb3JsZC5jb3B5KG10eFdvcmxkTWVzaCk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4V29ybGRNZXNoKTsgLy8gVE9ETzogZXhhbWluZSwgd2h5IHJlY3ljbGluZyB0aGlzIGNhdXNlcyBtZXNoZXMgdG8gYmUgbWlzcGxhY2VkLi4uXHJcbiAgICAgICAgbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuZ2V0U2hhZGVyKCk7XHJcbiAgICAgICAgbGV0IGNtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTtcclxuICAgICAgICBpZiAoY21wUGFydGljbGVTeXN0ZW0gJiYgY21wUGFydGljbGVTeXN0ZW0uaXNBY3RpdmUgJiYgY21wUGFydGljbGVTeXN0ZW0ucGFydGljbGVTeXN0ZW0gIT0gbnVsbClcclxuICAgICAgICAgIHNoYWRlciA9IGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtLmdldFNoYWRlckZyb20oc2hhZGVyKTtcclxuICAgICAgICBpZiAoX3NoYWRlcnNVc2VkLmluZGV4T2Yoc2hhZGVyKSA8IDApXHJcbiAgICAgICAgICBfc2hhZGVyc1VzZWQucHVzaChzaGFkZXIpO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gY21wTWVzaC5yYWRpdXM7XHJcbiAgICAgICAgaWYgKGNtcE1hdGVyaWFsLnNvcnRGb3JBbHBoYSB8fCBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRUZXh0KSkgLy8gYWx3YXlzIHNvcnQgdGV4dCBmb3IgYWxwaGFcclxuICAgICAgICAgIFJlbmRlci5ub2Rlc0FscGhhLnB1c2goX2JyYW5jaCk7IC8vIGFkZCB0aGlzIG5vZGUgdG8gcmVuZGVyIGxpc3RcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBSZW5kZXIubm9kZXNTaW1wbGUucHVzaChfYnJhbmNoKTsgLy8gYWRkIHRoaXMgbm9kZSB0byByZW5kZXIgbGlzdFxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY21wU2tlbGV0b25zOiBDb21wb25lbnRTa2VsZXRvbltdID0gX2JyYW5jaC5nZXRDb21wb25lbnRzKENvbXBvbmVudFNrZWxldG9uKTtcclxuICAgICAgZm9yIChsZXQgY21wU2tlbGV0b24gb2YgY21wU2tlbGV0b25zKVxyXG4gICAgICAgIGlmIChjbXBTa2VsZXRvbiAmJiBjbXBTa2VsZXRvbi5pc0FjdGl2ZSlcclxuICAgICAgICAgIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24ucHVzaChjbXBTa2VsZXRvbik7XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIHtcclxuICAgICAgICBSZW5kZXIucHJlcGFyZShjaGlsZCwgX29wdGlvbnMsIF9icmFuY2gubXR4V29ybGQsIF9zaGFkZXJzVXNlZCk7XHJcblxyXG4gICAgICAgIF9icmFuY2gubk5vZGVzSW5CcmFuY2ggKz0gY2hpbGQubk5vZGVzSW5CcmFuY2g7XHJcbiAgICAgICAgbGV0IGNtcE1lc2hDaGlsZDogQ29tcG9uZW50TWVzaCA9IGNoaWxkLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBjbXBNZXNoQ2hpbGQgPyBjbXBNZXNoQ2hpbGQubXR4V29ybGQudHJhbnNsYXRpb24gOiBjaGlsZC5tdHhXb3JsZC50cmFuc2xhdGlvbjtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gTWF0aC5tYXgoX2JyYW5jaC5yYWRpdXMsIHBvc2l0aW9uLmdldERpc3RhbmNlKF9icmFuY2gubXR4V29ybGQudHJhbnNsYXRpb24pICsgY2hpbGQucmFkaXVzKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShwb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaXJzdExldmVsKSB7XHJcbiAgICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNtcFNrZWxldG9uIG9mIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24pIHtcclxuICAgICAgICAgIGNtcFNrZWxldG9uLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgY21wU2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlbmRlci5idWZmZXJMaWdodHMoUmVuZGVyLmxpZ2h0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZExpZ2h0cyhfY21wTGlnaHRzOiBDb21wb25lbnRMaWdodFtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGNtcExpZ2h0IG9mIF9jbXBMaWdodHMpIHtcclxuICAgICAgICBpZiAoIWNtcExpZ2h0LmlzQWN0aXZlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCB0eXBlOiBUeXBlT2ZMaWdodCA9IGNtcExpZ2h0LmxpZ2h0LmdldFR5cGUoKTtcclxuICAgICAgICBsZXQgbGlnaHRzT2ZUeXBlOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4gPSBSZW5kZXIubGlnaHRzLmdldCh0eXBlKTtcclxuICAgICAgICBpZiAoIWxpZ2h0c09mVHlwZSkge1xyXG4gICAgICAgICAgbGlnaHRzT2ZUeXBlID0gbmV3IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PigpO1xyXG4gICAgICAgICAgUmVuZGVyLmxpZ2h0cy5zZXQodHlwZSwgbGlnaHRzT2ZUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlnaHRzT2ZUeXBlLnB1c2goY21wTGlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIG5vZGUgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybiB0aGF0IGFzIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2soX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7IC8vIFRPRE86IHNlZSBpZiB0aGlyZCBwYXJhbWV0ZXIgX3dvcmxkPzogTWF0cml4NHg0IHdvdWxkIGJlIHVzZWZ1bGxcclxuICAgICAgcmV0dXJuIFJlbmRlci5waWNrRnJvbShfbm9kZXMsIF9jbXBDYW1lcmEsIHN1cGVyLnBpY2spO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIERyYXdpbmdcclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIHNjZW5lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGdpdmVuIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgUmVuZGVyLm5vZGVzQWxwaGEpXHJcbiAgICAgICAgUmVmbGVjdC5zZXQobm9kZSwgXCJ6Q2FtZXJhXCIsIF9jbXBDYW1lcmEucG9pbnRXb3JsZFRvQ2xpcChub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWQ6IE5vZGVbXSA9IFJlbmRlci5ub2Rlc0FscGhhLmdldFNvcnRlZCgoX2E6IE5vZGUsIF9iOiBOb2RlKSA9PiBSZWZsZWN0LmdldChfYiwgXCJ6Q2FtZXJhXCIpIC0gUmVmbGVjdC5nZXQoX2EsIFwiekNhbWVyYVwiKSk7XHJcblxyXG4gICAgICBSZW5kZXIuZHJhd05vZGVzKFJlbmRlci5ub2Rlc1NpbXBsZSwgc29ydGVkLCBfY21wQ2FtZXJhKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQaHlzaWNzXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0cmFuc2Zvcm1CeVBoeXNpY3MoX25vZGU6IE5vZGUsIF9jbXBSaWdpZGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICBpZiAoIV9jbXBSaWdpZGJvZHkuaXNJbml0aWFsaXplZCkgLy8gfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SKVxyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgICAgaWYgKCFQaHlzaWNzLmdldEJvZHlMaXN0KCkubGVuZ3RoKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGlmICghX25vZGUubXR4TG9jYWwpIHtcclxuICAgICAgICB0aHJvdyAobmV3IEVycm9yKFwiQ29tcG9uZW50UmlnaWRib2R5IHJlcXVpcmVzIENvbXBvbmVudFRyYW5zZm9ybSBhdCB0aGUgc2FtZSBOb2RlXCIpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gX2NtcFJpZ2lkYm9keS5jaGVja0NvbGxpc2lvbkV2ZW50cygpO1xyXG5cclxuICAgICAgaWYgKF9jbXBSaWdpZGJvZHkudHlwZUJvZHkgPT0gQk9EWV9UWVBFLktJTkVNQVRJQyB8fCBQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpIHsgLy9DYXNlIG9mIEtpbmVtYXRpYyBSaWdpZGJvZHlcclxuICAgICAgICBsZXQgbXR4UGl2b3RXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoX25vZGUubXR4V29ybGQsIF9jbXBSaWdpZGJvZHkubXR4UGl2b3RVbnNjYWxlZCk7XHJcbiAgICAgICAgX2NtcFJpZ2lkYm9keS5zZXRQb3NpdGlvbihtdHhQaXZvdFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgICBfY21wUmlnaWRib2R5LnNldFJvdGF0aW9uKG10eFBpdm90V29ybGQucm90YXRpb24pO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFBpdm90V29ybGQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09NUE9TSVRJT04oX2NtcFJpZ2lkYm9keS5nZXRQb3NpdGlvbigpLCBfY21wUmlnaWRib2R5LmdldFJvdGF0aW9uKCkpO1xyXG4gICAgICBtdHhXb3JsZC5tdWx0aXBseShfY21wUmlnaWRib2R5Lm10eFBpdm90SW52ZXJzZSk7XHJcbiAgICAgIF9ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uID0gbXR4V29ybGQudHJhbnNsYXRpb247XHJcbiAgICAgIF9ub2RlLm10eFdvcmxkLnJvdGF0aW9uID0gbXR4V29ybGQucm90YXRpb247XHJcbiAgICAgIGxldCBwYXJlbnQ6IE5vZGUgPSBfbm9kZS5nZXRQYXJlbnQoKTtcclxuICAgICAgbGV0IG10eExvY2FsOiBNYXRyaXg0eDQgPSBwYXJlbnQgP1xyXG4gICAgICAgIE1hdHJpeDR4NC5SRUxBVElWRShfbm9kZS5tdHhXb3JsZCwgcGFyZW50Lm10eFdvcmxkLCBwYXJlbnQubXR4V29ybGRJbnZlcnNlKSA6XHJcbiAgICAgICAgX25vZGUubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIF9ub2RlLm10eExvY2FsLmNvcHkobXR4TG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eExvY2FsKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgdmVydGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGluZGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRleHR1cmVVVnM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIG5vcm1hbHM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGNvbG9ycz86IFdlYkdMQnVmZmVyO1xyXG4gICAgYm9uZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRhbmdlbnRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICB3ZWlnaHRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICBuSW5kaWNlcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydGVkIGludG8gYSB7QGxpbmsgTWVzaH0sIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FsY3VsYXRlcyBhbmQgcmVwcmVzZW50cyB0aGUgbWVzaCBkYXRhIGluIHRoZSBmb3JtIG5lZWRlZCBieSB0aGUgcmVuZGVyIGVuZ2luZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJNZXNoIHtcclxuICAgIHB1YmxpYyBidWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbnVsbDtcclxuICAgIHB1YmxpYyBtZXNoOiBNZXNoO1xyXG5cclxuICAgIC8qKiB2ZXJ0aWNlcyBvZiB0aGUgYWN0dWFsIHBvaW50IGNsb3VkLCBzb21lIHBvaW50cyBtaWdodCBiZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiBvcmRlciB0byByZWZlciB0byBkaWZmZXJlbnQgdGV4ZWxzICovXHJcbiAgICAjdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiBpbmRpY2VzIHRvIGNyZWF0ZSBmYWNlcyBmcm9tIHRoZSB2ZXJ0aWNlcywgcm90YXRpb24gZGV0ZXJtaW5lcyBkaXJlY3Rpb24gb2YgZmFjZS1ub3JtYWwgKi9cclxuICAgICNpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgIC8qKiB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGljZXMgYnkgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSAqL1xyXG4gICAgI3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggbm9ybWFscyBmb3Igc21vb3RoIHNoYWRpbmcsIGludGVycG9sYXRlZCBiZXR3ZWVuIHZlcnRpY2VzIGR1cmluZyByZW5kZXJpbmcgKi9cclxuICAgICNub3JtYWxzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiBjb2xvcnMgKi9cclxuICAgICNjb2xvcnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggdGFuZ2VudHMgZm9yIG5vcm1hbCBtYXBwaW5nLCBiYXNlZCBvbiB0aGUgdmVydGV4IG5vcm1hbHMgYW5kIHRoZSBVViBjb29yZGluYXRlcyAqL1xyXG4gICAgI3RhbmdlbnRzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiogYm9uZXMgKi9cclxuICAgICNib25lczogVWludDhBcnJheTtcclxuICAgICN3ZWlnaHRzOiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tZXNoOiBNZXNoKSB7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3ZlcnRpY2VzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIC8vIC4uLiBmbGF0dGVuIGFsbCB2ZXJ0ZXggcG9zaXRpb25zIGZyb20gY2xvdWQgaW50byBhIHR5cGVkIGFycmF5XHJcbiAgICAgICAgdGhpcy4jdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihfaW5kZXgpLmdldCgpXTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2ZXJ0aWNlcyhfdmVydGljZXM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN2ZXJ0aWNlcyA9IF92ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW5kaWNlcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgaW5kaWNlcyBmcm9tIHRoZSBmYWNlcyBpbnRvIGEgdHlwZWQgYXJyYXlcclxuICAgICAgICB0aGlzLiNpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubWVzaC5mYWNlcy5mbGF0TWFwKChfZmFjZTogRmFjZSkgPT4gWy4uLl9mYWNlLmluZGljZXNdKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbmRpY2VzKF9pbmRpY2VzOiBVaW50MTZBcnJheSkge1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gX2luZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3JtYWxzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGlmICh0aGlzLiNub3JtYWxzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgY2hlY2sgc2ltaWxpYXIgdG8gdGhlIG9uZSBmb3IgdGFuZ2VudHMgYmVsb3csIHRvIHNlZSBpZiBub3JtYWxzIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHZlcnRpY2VzXHJcblxyXG4gICAgICAgIC8vIHN1bSB1cCBhbGwgdW5zY2FsZWQgbm9ybWFscyBvZiBmYWNlcyBjb25uZWN0ZWQgdG8gb25lIHZlcnRleCwgd2VpZ2h0ZWQgYnkgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBuZWlnaGJvdXIgdmVydGljZXMuLi5cclxuICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaChfdmVydGV4ID0+IF92ZXJ0ZXgubm9ybWFsLnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGZhY2Ugb2YgdGhpcy5tZXNoLmZhY2VzKVxyXG4gICAgICAgICAgZmFjZS5pbmRpY2VzLmZvckVhY2goKF9pVmVydGV4LCBfaUZhY2VWZXJ0ZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZXNoLnZlcnRpY2VzLm5vcm1hbChfaVZlcnRleCkuYWRkKFZlY3RvcjMuU0NBTEUoZmFjZS5ub3JtYWxVbnNjYWxlZCwgZmFjZS5hbmdsZXNbX2lGYWNlVmVydGV4XSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBub3JtYWxpemUgdGhlbVxyXG4gICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4ge1xyXG4gICAgICAgICAgLy8gc29tZSB2ZXJ0aWNlcyBtaWdodCBiZSB1bnVzZWQgYW5kIHlpZWxkIGEgemVyby1ub3JtYWwuLi5cclxuICAgICAgICAgIGlmIChfdmVydGV4Lm5vcm1hbC5tYWduaXR1ZGVTcXVhcmVkID4gMClcclxuICAgICAgICAgICAgX3ZlcnRleC5ub3JtYWwubm9ybWFsaXplKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuxpJub3JtYWxzVmVydGV4ID0gbmV3IEZsb2F0MzJBcnJheShub3JtYWxzVmVydGV4LmZsYXRNYXAoKF9ub3JtYWw6IFZlY3RvcjMpID0+IFsuLi5fbm9ybWFsLmdldCgpXSkpO1xyXG5cclxuICAgICAgICB0aGlzLiNub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShcclxuICAgICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4LCBfaW5kZXgpID0+IFsuLi50aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCkuZ2V0KCldKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNub3JtYWxzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBub3JtYWxzKF9ub3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jbm9ybWFscyA9IF9ub3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGFuZ2VudHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgaWYgKHRoaXMuI3RhbmdlbnRzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudXYpKSB7IC8vIGFzc3VtZSBhbGwgdmVydGljZXMgaGF2ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9yIG5vbmVcclxuICAgICAgICAgIHRoaXMuI3RhbmdlbnRzID0gbmV3IEZsb2F0MzJBcnJheSgpOyAvLyBubyB0ZXh0dXJlIGNvb3JkaW5hdGVzLCBubyB0YW5nZW50c1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuI3RhbmdlbnRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudGFuZ2VudCkpIHsgLy8gYXNzdW1lIGFsbCB2ZXJ0aWNlcyBoYXZlIHRhbmdlbnRzIG9yIG5vbmVcclxuICAgICAgICAgIGNvbnN0IHRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBjb25zdCBiaXRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaV0gPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpXSA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4gX3ZlcnRleC50YW5nZW50LnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmFjZSBvZiB0aGlzLm1lc2guZmFjZXMpIHtcclxuICAgICAgICAgICAgbGV0IGkwOiBudW1iZXIgPSBmYWNlLmluZGljZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpMTogbnVtYmVyID0gZmFjZS5pbmRpY2VzWzFdO1xyXG4gICAgICAgICAgICBsZXQgaTI6IG51bWJlciA9IGZhY2UuaW5kaWNlc1syXTtcclxuXHJcbiAgICAgICAgICAgIC8vdmVydGljZXMgc3Vycm91bmRpbmcgb25lIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxldCB2MDogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMCk7XHJcbiAgICAgICAgICAgIGxldCB2MTogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMSk7XHJcbiAgICAgICAgICAgIGxldCB2MjogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMik7XHJcblxyXG4gICAgICAgICAgICAvL3RoZWlyIFVWc1xyXG4gICAgICAgICAgICBsZXQgdXYwOiBWZWN0b3IyID0gdGhpcy5tZXNoLnZlcnRpY2VzLnV2KGkwKTtcclxuICAgICAgICAgICAgbGV0IHV2MTogVmVjdG9yMiA9IHRoaXMubWVzaC52ZXJ0aWNlcy51dihpMSk7XHJcbiAgICAgICAgICAgIGxldCB1djI6IFZlY3RvcjIgPSB0aGlzLm1lc2gudmVydGljZXMudXYoaTIpO1xyXG5cclxuICAgICAgICAgICAgLy9XZSBjb21wdXRlIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUuLi5cclxuICAgICAgICAgICAgbGV0IGRlbHRhUG9zMDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh2MSwgdjApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFQb3MxOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHYyLCB2MCk7XHJcblxyXG4gICAgICAgICAgICAvLy4uLmFuZCB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlcyBpbiBVViBzcGFjZS4uLlxyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjA6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYxLCB1djApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjE6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYyLCB1djApO1xyXG5cclxuICAgICAgICAgICAgLy8uLi5hbmQgY29tcHV0ZSB0aGUgdGFuZ2VudFxyXG4gICAgICAgICAgICBsZXQgcjogbnVtYmVyID0gMSAvIFZlY3RvcjIuQ1JPU1MoZGVsdGFVVjAsIGRlbHRhVVYxKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VUYW5nZW50OiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLkRJRkZFUkVOQ0UoVmVjdG9yMy5TQ0FMRShkZWx0YVBvczAsIGRlbHRhVVYxLnkpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgZGVsdGFVVjAueSkpLCByKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VCaXRhbmdlbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgLWRlbHRhVVYwLngpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMCwgLWRlbHRhVVYxLngpKSwgcik7IC8vIGZvciB3aW5kaW5nIG9yZGVyIGNvdW50ZXIgY2xvY2t3aXNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZVRhbmdlbnQsIGZhY2UuYW5nbGVzWzBdKSk7XHJcbiAgICAgICAgICAgIHRhbmdlbnRzW2kxXS5hZGQoVmVjdG9yMy5TQ0FMRShmYWNlVGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaTJdLmFkZChWZWN0b3IzLlNDQUxFKGZhY2VUYW5nZW50LCBmYWNlLmFuZ2xlc1syXSkpO1xyXG5cclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMF0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMV0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMl0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMl0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaCgoX3ZlcnRleCwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSB0aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCk7XHJcbiAgICAgICAgICAgIGxldCB0YW5nZW50OiBWZWN0b3IzID0gdGFuZ2VudHNbX2luZGV4XTtcclxuICAgICAgICAgICAgbGV0IGJpdGFuZ2VudDogVmVjdG9yMyA9IGJpdGFuZ2VudHNbX2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlb3J0aG9nb25hbGl6ZVxyXG4gICAgICAgICAgICB0YW5nZW50LmFkZChWZWN0b3IzLlNDQUxFKG5vcm1hbCwgLSBWZWN0b3IzLkRPVChub3JtYWwsIHRhbmdlbnQpKSk7XHJcbiAgICAgICAgICAgIGlmICh0YW5nZW50Lm1hZ25pdHVkZVNxdWFyZWQgPiAwKSAvLyBzb21lIHZlcnRpY2VzIG1pZ2h0IGJlIHVudXNlZCBhbmQgeWllbGQgYSB6ZXJvLXRhbmdlbnQuLi5cclxuICAgICAgICAgICAgICB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGhhbmRlZG5lc3M6IG51bWJlciA9IChWZWN0b3IzLkRPVChWZWN0b3IzLkNST1NTKG5vcm1hbCwgdGFuZ2VudCksIGJpdGFuZ2VudCkgPCAwKSA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgICAgIF92ZXJ0ZXgudGFuZ2VudCA9IG5ldyBWZWN0b3I0KHRhbmdlbnQueCwgdGFuZ2VudC55LCB0YW5nZW50LnosIGhhbmRlZG5lc3MpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiN0YW5nZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZmxhdE1hcChfdmVydGV4ID0+IF92ZXJ0ZXgudGFuZ2VudC5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jdGFuZ2VudHM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhbmdlbnRzKF90YW5nZW50czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3RhbmdlbnRzID0gX3RhbmdlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dHVyZVVWcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dHVyZVVWcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgdXZzIGZyb20gdGhlIGNsb3VzIGludG8gYSB0eXBlZCBhcnJheVxyXG4gICAgICAgIHRoaXMuI3RleHR1cmVVVnMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlc1xyXG4gICAgICAgICAgLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgudXYpXHJcbiAgICAgICAgICAuZmxhdE1hcCgoX3ZlcnRleDogVmVydGV4KSA9PiBbLi4uX3ZlcnRleC51di5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmVVVnMoX3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlVVZzID0gX3RleHR1cmVVVnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb2xvcnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbG9ycyB8fCAoXHJcbiAgICAgICAgdGhpcy4jY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm1lc2gudmVydGljZXNcclxuICAgICAgICAgIC5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LmNvbG9yKVxyXG4gICAgICAgICAgLmZsYXRNYXAoX3ZlcnRleCA9PiBbLi4uX3ZlcnRleC5jb2xvci5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbG9ycyhfY29sb3JzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jY29sb3JzID0gX2NvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvbmVzKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9uZXMgfHwgKCAvLyByZXR1cm4gY2FjaGUgb3IgLi4uXHJcbiAgICAgICAgdGhpcy4jYm9uZXMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvbmVzOiBCb25lW10gPSB0aGlzLm1lc2gudmVydGljZXMuYm9uZXMoX2luZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIFtib25lcz8uWzBdPy5pbmRleCB8fCAwLCBib25lcz8uWzFdPy5pbmRleCB8fCAwLCBib25lcz8uWzJdPy5pbmRleCB8fCAwLCBib25lcz8uWzNdPy5pbmRleCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9uZXMoX2lCb25lczogVWludDhBcnJheSkge1xyXG4gICAgICB0aGlzLiNib25lcyA9IF9pQm9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3ZWlnaHRzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN3ZWlnaHRzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIHRoaXMuI3dlaWdodHMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmZsYXRNYXAoKF92ZXJ0ZXg6IFZlcnRleCwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYm9uZXM6IEJvbmVbXSA9IHRoaXMubWVzaC52ZXJ0aWNlcy5ib25lcyhfaW5kZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gW2JvbmVzPy5bMF0/LndlaWdodCB8fCAwLCBib25lcz8uWzFdPy53ZWlnaHQgfHwgMCwgYm9uZXM/LlsyXT8ud2VpZ2h0IHx8IDAsIGJvbmVzPy5bM10/LndlaWdodCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgd2VpZ2h0cyhfd2VpZ2h0czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBfd2VpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGlzIHJlbmRlciBtZXNoIGFuZCBhbGwgaXRzIGJ1ZmZlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmJ1ZmZlcnMgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy4jdmVydGljZXMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gbnVsbDtcclxuICAgICAgdGhpcy4jdGV4dHVyZVVWcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI25vcm1hbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNjb2xvcnMgPSBudWxsO1xyXG4gICAgICB0aGlzLiN0YW5nZW50cyA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLiNib25lcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSByZW5kZXJpbmcgb2YgYSBicmFuY2gsIHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSxcclxuICAgKiBhbmQgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSByZW5kZXJlZCBpbWFnZSBmcm9tIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHRvIHRoZSB0YXJnZXQgY2FudmFzXHJcbiAgICogdGhyb3VnaCBhIHNlcmllcyBvZiB7QGxpbmsgRnJhbWluZ30gb2JqZWN0cy4gVGhlIHN0YWdlcyBpbnZvbHZlZCBhcmUgaW4gb3JkZXIgb2YgcmVuZGVyaW5nXHJcbiAgICoge0BsaW5rIFJlbmRlcn0udmlld3BvcnQgLT4ge0BsaW5rIFZpZXdwb3J0fS5zb3VyY2UgLT4ge0BsaW5rIFZpZXdwb3J0fS5kZXN0aW5hdGlvbiAtPiBET00tQ2FudmFzIC0+IENsaWVudChDU1MpXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS0yMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9WaWV3cG9ydFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmb2N1czogVmlld3BvcnQ7XHJcblxyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiVmlld3BvcnRcIjsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIHZpZXdwb3J0IGJ5LlxyXG4gICAgcHVibGljIGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbnVsbDsgLy8gVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIHZpZXcgcGFyYW1ldGVycyB0byByZW5kZXIgdGhlIGJyYW5jaC5cclxuICAgIHB1YmxpYyByZWN0U291cmNlOiBSZWN0YW5nbGU7XHJcbiAgICBwdWJsaWMgcmVjdERlc3RpbmF0aW9uOiBSZWN0YW5nbGU7XHJcblxyXG4gICAgLy8gVE9ETzogdmVyaWZ5IGlmIGNsaWVudCB0byBjYW52YXMgc2hvdWxkIGJlIGluIFZpZXdwb3J0IG9yIHNvbWV3aGVyZSBlbHNlIChXaW5kb3csIENvbnRhaW5lcj8pXHJcbiAgICAvLyBNdWx0aXBsZSB2aWV3cG9ydHMgdXNpbmcgdGhlIHNhbWUgY2FudmFzIHNob3VsZG4ndCBkaWZmZXIgaGVyZS4uLlxyXG4gICAgLy8gZGlmZmVyZW50IGZyYW1pbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gICAgcHVibGljIGZyYW1lQ2xpZW50VG9DYW52YXM6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lQ2FudmFzVG9EZXN0aW5hdGlvbjogRnJhbWluZ0NvbXBsZXggPSBuZXcgRnJhbWluZ0NvbXBsZXgoKTtcclxuICAgIHB1YmxpYyBmcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2U6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lU291cmNlVG9SZW5kZXI6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG5cclxuICAgIHB1YmxpYyBhZGp1c3RpbmdGcmFtZXM6IGJvb2xlYW4gPSB0cnVlOyAvLyBUT0RPOiBtYXliZSBvbmx5IGFkanVzdCBmcmFtZXMgd2hlbiBhbnl0aGluZyBjaGFuZ2VzIGluc3RlYWQgb2YgZXZlcnkgZHJhd24gZnJhbWU/XHJcbiAgICBwdWJsaWMgYWRqdXN0aW5nQ2FtZXJhOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwaHlzaWNzRGVidWdNb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkU7XHJcblxyXG4gICAgcHVibGljIGdpem1vc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBnaXptb3NTZWxlY3RlZDogTm9kZVtdO1xyXG4gICAgcHVibGljIGdpem1vc0ZpbHRlcjogeyBbX2dpem1vOiBzdHJpbmddOiBib29sZWFuIH0gPSBPYmplY3QuZnJvbUVudHJpZXMoQ29tcG9uZW50LnN1YmNsYXNzZXMgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIGxhenkgVE9ETzogY2hhbmdlIHRvIGpzIG9iamVjdFxyXG4gICAgICAuZmlsdGVyKChfY2xhc3M6IHR5cGVvZiBDb21wb25lbnQpID0+IChfY2xhc3MucHJvdG90eXBlKS5kcmF3R2l6bW9zIHx8IChfY2xhc3MucHJvdG90eXBlKS5kcmF3R2l6bW9zU2VsZWN0ZWQpXHJcbiAgICAgIC5tYXAoKF9jbGFzczogdHlwZW9mIENvbXBvbmVudCkgPT4gW19jbGFzcy5uYW1lLCB0cnVlXSlcclxuICAgICk7XHJcblxyXG4gICAgcHVibGljIGNvbXBvbmVudHNQaWNrOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRQaWNrPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG5cclxuICAgICNicmFuY2g6IE5vZGUgPSBudWxsOyAvLyBUaGUgdG8gcmVuZGVyIHdpdGggYWxsIGl0cyBkZXNjZW5kYW50cy5cclxuICAgICNjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBudWxsO1xyXG4gICAgI2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBudWxsO1xyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBFdmVudHMgKHBhc3NpbmcgZnJvbSBjYW52YXMgdG8gdmlld3BvcnQgYW5kIGZyb20gdGhlcmUgaW50byBicmFuY2gpXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZpZXdwb3J0IGN1cnJlbnRseSBoYXMgZm9jdXMgYW5kIHRodXMgcmVjZWl2ZXMga2V5Ym9hcmQgZXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGFzRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoVmlld3BvcnQuZm9jdXMgPT0gdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVzdGluYXRpb24gY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NhbnZhcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIDJELWNvbnRleHQgYXR0YWNoZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NyYzI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGUgdmlld3BvcnQgdG8gdGhlIGdpdmVuIGNhbnZhcyB0byByZW5kZXIgdGhlIGdpdmVuIGJyYW5jaCB0byB1c2luZyB0aGUgZ2l2ZW4gY2FtZXJhLWNvbXBvbmVudCwgYW5kIG5hbWVzIHRoZSB2aWV3cG9ydCBhcyBnaXZlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXRpYWxpemUoX25hbWU6IHN0cmluZywgX2JyYW5jaDogTm9kZSwgX2NhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5jYW1lcmEgPSBfY2FtZXJhO1xyXG4gICAgICB0aGlzLiNjYW52YXMgPSBfY2FudmFzO1xyXG4gICAgICB0aGlzLiNjcmMyID0gX2NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy50YWJJbmRleCA9IDA7IC8vIGNhbiBnZXQgZm9jdXMgYW5kIHJlY2VpdmUga2V5Ym9hcmQgZXZlbnRzXHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UgPSBSZW5kZXIuZ2V0Q2FudmFzUmVjdCgpO1xyXG4gICAgICB0aGlzLnJlY3REZXN0aW5hdGlvbiA9IHRoaXMuZ2V0Q2xpZW50UmVjdGFuZ2xlKCk7XHJcblxyXG4gICAgICB0aGlzLnNldEJyYW5jaChfYnJhbmNoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGNhbnZhcyBhcyBhIHJlY3RhbmdsZSwgeCBhbmQgeSBhcmUgYWx3YXlzIDAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDYW52YXNSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGhpcy4jY2FudmFzLndpZHRoLCB0aGlzLiNjYW52YXMuaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIGNsaWVudCByZWN0YW5nbGUgdGhlIGNhbnZhcyBpcyBkaXNwbGF5ZWQgYW5kIGZpdCBpbiwgeCBhbmQgeSBhcmUgYWx3YXlzIDAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDbGllbnRSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgLy8gRlVER0UgZG9lc24ndCBjYXJlIGFib3V0IHdoZXJlIHRoZSBjbGllbnQgcmVjdCBpcywgb25seSBhYm91dCB0aGUgc2l6ZSBtYXR0ZXJzLlxyXG4gICAgICAvLyByZXR1cm4gUmVjdGFuZ2xlLkdFVCh0aGlzLmNhbnZhcy5vZmZzZXRMZWZ0LCB0aGlzLmNhbnZhcy5vZmZzZXRUb3AsIHRoaXMuY2FudmFzLmNsaWVudFdpZHRoLCB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLiNjYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuI2NhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBicmFuY2ggdG8gYmUgZHJhd24gaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnJhbmNoKF9icmFuY2g6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKF9icmFuY2gpIHtcclxuICAgICAgICBfYnJhbmNoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVC5BVFRBQ0hfQlJBTkNIKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy4jYnJhbmNoID0gX2JyYW5jaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBicmFuY2ggdGhpcyB2aWV3cG9ydCByZW5kZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCcmFuY2goKTogTm9kZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmFuY2g7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBEcmF3aW5nXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgdGhpcyB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhdyhfcHJlcGFyZUJyYW5jaDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wcmVwYXJlKF9wcmVwYXJlQnJhbmNoKTtcclxuXHJcbiAgICAgIFJlbmRlci5yZXNldEZyYW1lYnVmZmVyKCk7XHJcbiAgICAgIFJlbmRlci5jbGVhcih0aGlzLmNhbWVyYS5jbHJCYWNrZ3JvdW5kKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuUEhZU0lDX09CSkVDVFNfT05MWSkge1xyXG4gICAgICAgIFJlbmRlci5kcmF3KHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2l6bW9zRW5hYmxlZClcclxuICAgICAgICAgIEdpem1vcy5kcmF3KHRoaXMuZ2V0R2l6bW9zKCksIHRoaXMuY2FtZXJhLCB0aGlzLmdpem1vc1NlbGVjdGVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5OT05FKSB7XHJcbiAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlJFTkRFUl9FTkQpKTtcclxuXHJcbiAgICAgIHRoaXMuI2NyYzIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuI2NyYzIuZHJhd0ltYWdlKFxyXG4gICAgICAgIFJlbmRlci5nZXRDYW52YXMoKSxcclxuICAgICAgICB0aGlzLnJlY3RTb3VyY2UueCwgdGhpcy5yZWN0U291cmNlLnksIHRoaXMucmVjdFNvdXJjZS53aWR0aCwgdGhpcy5yZWN0U291cmNlLmhlaWdodCxcclxuICAgICAgICB0aGlzLnJlY3REZXN0aW5hdGlvbi54LCB0aGlzLnJlY3REZXN0aW5hdGlvbi55LCB0aGlzLnJlY3REZXN0aW5hdGlvbi53aWR0aCwgdGhpcy5yZWN0RGVzdGluYXRpb24uaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkanVzdHMgYWxsIGZyYW1lcyBhbmQgdGhlIGNhbWVyYSB0byBmaXQgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FudmFzLiBQcmVwYXJlcyB0aGUgYnJhbmNoIGZvciByZW5kZXJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHByZXBhcmUoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy4jYnJhbmNoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgaWYgKCF0aGlzLmNhbWVyYS5pc0FjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBpZiAodGhpcy5hZGp1c3RpbmdGcmFtZXMpXHJcbiAgICAgICAgdGhpcy5hZGp1c3RGcmFtZXMoKTtcclxuICAgICAgaWYgKHRoaXMuYWRqdXN0aW5nQ2FtZXJhKVxyXG4gICAgICAgIHRoaXMuYWRqdXN0Q2FtZXJhKCk7XHJcbiAgICAgIGlmIChfcHJlcGFyZUJyYW5jaClcclxuICAgICAgICB0aGlzLnByZXBhcmVCcmFuY2goKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBhcmVzIGFsbCBub2RlcyBpbiB0aGUgYnJhbmNoIGZvciByZW5kZXJpbmcgYnkgdXBkYXRpbmcgdGhlaXIgd29ybGQgdHJhbnNmb3JtcyBldGMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmVwYXJlQnJhbmNoKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4Um9vdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAgIGlmICh0aGlzLiNicmFuY2guZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgbXR4Um9vdCA9IHRoaXMuI2JyYW5jaC5nZXRQYXJlbnQoKS5tdHhXb3JsZDtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9TVEFSVCkpO1xyXG4gICAgICBSZW5kZXIucHJlcGFyZSh0aGlzLiNicmFuY2gsIHt9LCBtdHhSb290KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRzUGljayA9IFJlbmRlci5jb21wb25lbnRzUGljaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgcGljayBvbiBhbGwge0BsaW5rIENvbXBvbmVudFBpY2t9cyBpbiB0aGUgYnJhbmNoIG9mIHRoaXMgdmlld3BvcnRcclxuICAgICAqIHVzaW5nIGEgcmF5IGZyb20gaXRzIGNhbWVyYSB0aHJvdWdoIHRoZSBjbGllbnQgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4gdGhlIGV2ZW50LlxyXG4gICAgICogRGlzcGF0Y2hlcyB0aGUgZXZlbnQgdG8gYWxsIG5vZGVzIGhpdC4gIFxyXG4gICAgICogSWYge0BsaW5rIFBJQ0suQ0FNRVJBfSB3YXMgY2hvc2VuIGFzIHRoZSBtZXRob2QgdG8gcGljaywgYSBwaWNrIHByb3BlcnR5IGdldHMgYWRkZWQgdG8gdGhlIGV2ZW50LCBcclxuICAgICAqIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgYnV0IGlzIG92ZXJ3cml0dGVuIGZvciBlYWNoIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwYXRjaFBvaW50ZXJFdmVudChfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQ2xpZW50OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LmNsaWVudFgsIF9ldmVudC5jbGllbnRZKTtcclxuICAgICAgbGV0IHJheTogUmF5ID0gdGhpcy5nZXRSYXlGcm9tQ2xpZW50KHBvc0NsaWVudCk7XHJcbiAgICAgIC8vIGxldCBjYW1lcmFQaWNrczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBSZWN5Y2xlci5nZXQoUmVjeWNhYmxlQXJyYXkpOyAvL1RPRE86IHRoaW5rIGFib3V0IG9wdGltaXphdGlvbiBsYXRlclxyXG4gICAgICBsZXQgY2FtZXJhUGlja3M6IE5vZGVbXSA9IFtdO1xyXG4gICAgICBsZXQgb3RoZXJQaWNrczogQ29tcG9uZW50UGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNtcFBpY2sgb2YgdGhpcy5jb21wb25lbnRzUGljaylcclxuICAgICAgICBpZiAoY21wUGljay5waWNrID09IFBJQ0suQ0FNRVJBKVxyXG4gICAgICAgICAgY2FtZXJhUGlja3MucHVzaChjbXBQaWNrLm5vZGUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG90aGVyUGlja3MucHVzaChjbXBQaWNrKTtcclxuXHJcblxyXG4gICAgICBpZiAoY2FtZXJhUGlja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja0NhbWVyYShjYW1lcmFQaWNrcywgdGhpcy5jYW1lcmEsIHRoaXMucG9pbnRDbGllbnRUb1Byb2plY3Rpb24ocG9zQ2xpZW50KSk7XHJcbiAgICAgICAgZm9yIChsZXQgcGljayBvZiBwaWNrcykge1xyXG4gICAgICAgICAgUmVmbGVjdC5zZXQoX2V2ZW50LCBcInBpY2tcIiwgcGljayk7XHJcbiAgICAgICAgICBwaWNrLm5vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgY21wUGljayBvZiBvdGhlclBpY2tzKSB7XHJcbiAgICAgICAgY21wUGljay5waWNrQW5kRGlzcGF0Y2gocmF5LCBfZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgYWxsIGZyYW1lcyBpbnZvbHZlZCBpbiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MgZnJvbSB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBjbGllbnQgdXAgdG8gdGhlIHJlbmRlcmVyIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRqdXN0RnJhbWVzKCk6IHZvaWQge1xyXG4gICAgICAvLyBnZXQgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY2FudmFzIGFyZWEgYXMgZGlzcGxheWVkIChjb25zaWRlciBjc3MpXHJcbiAgICAgIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGNhbnZhcyBzaXplIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZnJhbWluZyBhcHBsaWVkIHRvIGNsaWVudFxyXG4gICAgICBsZXQgcmVjdENhbnZhczogUmVjdGFuZ2xlID0gdGhpcy5mcmFtZUNsaWVudFRvQ2FudmFzLmdldFJlY3QocmVjdENsaWVudCk7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy53aWR0aCA9IHJlY3RDYW52YXMud2lkdGg7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy5oZWlnaHQgPSByZWN0Q2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGxldCByZWN0VGVtcDogUmVjdGFuZ2xlO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGRlc3RpbmF0aW9uIGFyZWEgb24gdGhlIHRhcmdldC1jYW52YXMgdG8gcmVuZGVyIHRvIGJ5IGFwcGx5aW5nIHRoZSBmcmFtaW5nIHRvIGNhbnZhc1xyXG4gICAgICByZWN0VGVtcCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFJlY3QocmVjdENhbnZhcyk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uLmNvcHkocmVjdFRlbXApO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0VGVtcCk7XHJcbiAgICAgIC8vIGFkanVzdCB0aGUgYXJlYSBvbiB0aGUgc291cmNlLWNhbnZhcyB0byByZW5kZXIgZnJvbSBieSBhcHBseWluZyB0aGUgZnJhbWluZyB0byBkZXN0aW5hdGlvbiBhcmVhXHJcbiAgICAgIHJlY3RUZW1wID0gdGhpcy5mcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2UuZ2V0UmVjdCh0aGlzLnJlY3REZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UuY29weShyZWN0VGVtcCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RUZW1wKTtcclxuXHJcbiAgICAgIC8vIGhhdmluZyBhbiBvZmZzZXQgc291cmNlIGRvZXMgbWFrZSBzZW5zZSBvbmx5IHdoZW4gbXVsdGlwbGUgdmlld3BvcnRzIGRpc3BsYXkgcGFydHMgb2YgdGhlIHNhbWUgcmVuZGVyaW5nLiBGb3Igbm93OiBzaGlmdCBpdCB0byAwLDBcclxuICAgICAgdGhpcy5yZWN0U291cmNlLnggPSB0aGlzLnJlY3RTb3VyY2UueSA9IDA7XHJcbiAgICAgIC8vIHN0aWxsLCBhIHBhcnRpYWwgaW1hZ2Ugb2YgdGhlIHJlbmRlcmluZyBtYXkgYmUgcmV0cmlldmVkIGJ5IG1vdmluZyBhbmQgcmVzaXppbmcgdGhlIHJlbmRlciB2aWV3cG9ydC4gRm9yIG5vdywgaXQncyBhbHdheXMgYWRqdXN0ZWQgdG8gdGhlIGN1cnJlbnQgdmlld3BvcnRcclxuICAgICAgbGV0IHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IHRoaXMuZnJhbWVTb3VyY2VUb1JlbmRlci5nZXRSZWN0KHRoaXMucmVjdFNvdXJjZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUocmVjdFJlbmRlcik7XHJcblxyXG4gICAgICBsZXQgcmVjdE9mZnNjcmVlbkNhbnZhczogUmVjdGFuZ2xlID0gUmVuZGVyLmdldENhbnZhc1JlY3QoKTsgLy8gdGhlcmUgYXJlIGZhciB0byBtYW55IHJlY3RhbmdsZXMgaW52b2x2ZWQgaGVyZS4uLlxyXG5cclxuICAgICAgLy8gbm8gbW9yZSB0cmFuc2Zvcm1hdGlvbiBhZnRlciB0aGlzIGZvciBub3csIG9mZnNjcmVlbiBjYW52YXMgYW5kIHJlbmRlci12aWV3cG9ydCBoYXZlIHRoZSBzYW1lIHNpemVcclxuICAgICAgUmVuZGVyLnNldENhbnZhc1NpemUocmVjdFJlbmRlci53aWR0aCwgcmVjdFJlbmRlci5oZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHJlY3RSZW5kZXIud2lkdGggIT0gcmVjdE9mZnNjcmVlbkNhbnZhcy53aWR0aCB8fCByZWN0UmVuZGVyLmhlaWdodCAhPSByZWN0T2Zmc2NyZWVuQ2FudmFzLmhlaWdodClcclxuICAgICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RDbGllbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0Q2FudmFzKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUocmVjdFJlbmRlcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RPZmZzY3JlZW5DYW52YXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0IHRoZSBjYW1lcmEgcGFyYW1ldGVycyB0byBmaXQgdGhlIHJlbmRlcmluZyBpbnRvIHRoZSByZW5kZXIgdmlld3BvcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdENhbWVyYSgpOiB2b2lkIHtcclxuICAgICAgbGV0IHJlY3Q6IFJlY3RhbmdsZSA9IFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKTtcclxuICAgICAgLy8gaWYgKHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb24oKSA9PSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQylcclxuICAgICAgLy8gICB0aGlzLmNhbWVyYS5wcm9qZWN0T3J0aG9ncmFwaGljKC1yZWN0LndpZHRoIC8gMjAsIHJlY3Qud2lkdGggLyAyMCwgcmVjdC5oZWlnaHQgLyAyMCwgLXJlY3QuaGVpZ2h0IC8gMjApO1xyXG4gICAgICAvLyBlbHNlXHJcbiAgICAgIHRoaXMuY2FtZXJhLnByb2plY3RDZW50cmFsKFxyXG4gICAgICAgIHJlY3Qud2lkdGggLyByZWN0LmhlaWdodCwgdGhpcy5jYW1lcmEuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5jYW1lcmEuZ2V0RGlyZWN0aW9uKCksIHRoaXMuY2FtZXJhLmdldE5lYXIoKSwgdGhpcy5jYW1lcmEuZ2V0RmFyKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jYW1lcmEucmVzZXRXb3JsZFRvVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQb2ludHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSYXl9IGluIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhpcyBjYW1lcmEgdGhyb3VnaCB0aGUgcG9pbnQgZ2l2ZW4gaW4gY2xpZW50IHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSYXlGcm9tQ2xpZW50KF9wb2ludDogVmVjdG9yMik6IFJheSB7XHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gdGhpcy5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9pbnQpO1xyXG4gICAgICBsZXQgcmF5OiBSYXkgPSBuZXcgUmF5KG5ldyBWZWN0b3IzKC1wb3NQcm9qZWN0aW9uLngsIHBvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG5cclxuICAgICAgLy8gcmF5LmRpcmVjdGlvbi5zY2FsZShjYW1lcmEuZGlzdGFuY2UpO1xyXG4gICAgICByYXkudHJhbnNmb3JtKHRoaXMuY2FtZXJhLm10eFBpdm90KTtcclxuICAgICAgbGV0IGNhbWVyYU5vZGU6IE5vZGUgPSB0aGlzLmNhbWVyYS5ub2RlO1xyXG4gICAgICBpZiAoY2FtZXJhTm9kZSlcclxuICAgICAgICByYXkudHJhbnNmb3JtKGNhbWVyYU5vZGUubXR4V29ybGQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZSBtYXRjaGluZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9pbnQgaW4gd29ybGQgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaWVudChfcG9zaXRpb246IFZlY3RvcjMpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHByb2plY3Rpb246IFZlY3RvcjMgPSB0aGlzLmNhbWVyYS5wb2ludFdvcmxkVG9DbGlwKF9wb3NpdGlvbik7XHJcbiAgICAgIGxldCBwb3NDbGllbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpcFRvQ2xpZW50KHByb2plY3Rpb24udG9WZWN0b3IyKCkpO1xyXG4gICAgICByZXR1cm4gcG9zQ2xpZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBzb3VyY2UtcmVjdGFuZ2xlIG1hdGNoaW5nIHRoZSBnaXZlbiBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NvdXJjZShfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lQ2xpZW50VG9DYW52YXMuZ2V0UG9pbnQoX2NsaWVudCwgdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFBvaW50KHJlc3VsdCwgdGhpcy5nZXRDYW52YXNSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVEZXN0aW5hdGlvblRvU291cmNlLmdldFBvaW50KHJlc3VsdCwgdGhpcy5yZWN0U291cmNlKTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFNvdXJjZSwgUmVuZGVyIGFuZCBSZW5kZXJWaWV3cG9ydCBkZXZpYXRlLCBjb250aW51ZSB0cmFuc2Zvcm1hdGlvbiBcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIHNvdXJjZSByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50U291cmNlVG9SZW5kZXIoX3NvdXJjZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcHJvamVjdGlvblJlY3RhbmdsZTogUmVjdGFuZ2xlID0gdGhpcy5jYW1lcmEuZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UG9pbnQoX3NvdXJjZSwgcHJvamVjdGlvblJlY3RhbmdsZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHByb2plY3Rpb25SZWN0YW5nbGUudG9TdHJpbmcoKSk7XHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9Tb3VyY2UoX2NsaWVudCk7XHJcbiAgICAgIHBvaW50ID0gdGhpcy5wb2ludFNvdXJjZVRvUmVuZGVyKHBvaW50KTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFJlbmRlciBhbmQgUmVuZGVyVmlld3BvcnQgZGV2aWF0ZSwgY29udGludWUgdHJhbnNmb3JtYXRpb24gXHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYSAgXHJcbiAgICAgKiBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgY2FtZXJhLW1ldGhvZC4gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgY2VudHJhbC1wcm9qZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaWVudFRvUHJvamVjdGlvbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb3NSZW5kZXI6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudCk7XHJcbiAgICAgIGxldCByZWN0UmVuZGVyOiBSZWN0YW5nbGUgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UmVjdCh0aGlzLnJlY3RTb3VyY2UpO1xyXG4gICAgICBsZXQgcmVjdFByb2plY3Rpb246IFJlY3RhbmdsZSA9IHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb25SZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24ud2lkdGggKiBwb3NSZW5kZXIueCAvIHJlY3RSZW5kZXIud2lkdGgsXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24uaGVpZ2h0ICogcG9zUmVuZGVyLnkgLyByZWN0UmVuZGVyLmhlaWdodFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcG9zUHJvamVjdGlvbi5zdWJ0cmFjdChuZXcgVmVjdG9yMihyZWN0UHJvamVjdGlvbi53aWR0aCAvIDIsIHJlY3RQcm9qZWN0aW9uLmhlaWdodCAvIDIpKTtcclxuICAgICAgcG9zUHJvamVjdGlvbi55ICo9IC0xO1xyXG5cclxuICAgICAgcmV0dXJuIHBvc1Byb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NsaWVudChfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIC8vIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBsZXQgcmVzdWx0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMC41KTtcclxuICAgICAgLy8gcmVzdWx0LnggKj0gKF9ub3JtZWQueCArIDEpICogcmVjdENsaWVudC53aWR0aDtcclxuICAgICAgLy8gcmVzdWx0LnkgKj0gKDEgLSBfbm9ybWVkLnkpICogcmVjdENsaWVudC5oZWlnaHQ7XHJcbiAgICAgIC8vIHJlc3VsdC5hZGQocmVjdENsaWVudC5wb3NpdGlvbik7XHJcbiAgICAgIC8vVE9ETzogY2hlY2sgaWYgcmVjdERlc3RpbmF0aW9uIGNhbiBzYWZlbHkgKGFuZCBtb3JlIHBlcmZvbWFudCkgYmUgdXNlZCBpbnN0ZWFkIGdldENsaWVudFJlY3RhbmdsZVxyXG4gICAgICBsZXQgcG9pbnRDbGllbnQ6IFZlY3RvcjIgPSBSZW5kZXIucmVjdENsaXAucG9pbnRUb1JlY3QoX25vcm1lZCwgdGhpcy5yZWN0RGVzdGluYXRpb24pO1xyXG4gICAgICByZXR1cm4gcG9pbnRDbGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NhbnZhcyhfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb2ludENhbnZhczogVmVjdG9yMiA9IFJlbmRlci5yZWN0Q2xpcC5wb2ludFRvUmVjdChfbm9ybWVkLCB0aGlzLmdldENhbnZhc1JlY3RhbmdsZSgpKTtcclxuICAgICAgcmV0dXJuIHBvaW50Q2FudmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IGluIHRoZSBicm93c2VyIHBhZ2UgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IG9mIHRoZSB2aWV3cG9ydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NjcmVlbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBzY3JlZW46IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0aGlzLiNjYW52YXMub2Zmc2V0TGVmdCArIF9jbGllbnQueCwgdGhpcy4jY2FudmFzLm9mZnNldFRvcCArIF9jbGllbnQueSk7XHJcbiAgICAgIHJldHVybiBzY3JlZW47XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgZ2l6bW9zIGluIHRoZSBicmFuY2ggb2YgdGhpcyB2aWV3cG9ydCB0aGF0IGFyZSBhY3RpdmUsIGZpbHRlcmVkIGJ5IHtAbGluayBnaXptb3NGaWx0ZXJ9XHJcbiAgICAgKi8gXHJcbiAgICBwdWJsaWMgZ2V0R2l6bW9zKF9ub2RlczogTm9kZVtdID0gQXJyYXkuZnJvbSh0aGlzLiNicmFuY2guZ2V0SXRlcmF0b3IodHJ1ZSkpKTogR2l6bW9bXSB7XHJcbiAgICAgIHJldHVybiBfbm9kZXNcclxuICAgICAgICAuZmxhdE1hcChfbm9kZSA9PiBfbm9kZS5nZXRBbGxDb21wb25lbnRzKCkpXHJcbiAgICAgICAgLmZpbHRlcihfY29tcG9uZW50ID0+IF9jb21wb25lbnQuaXNBY3RpdmUgJiYgKF9jb21wb25lbnQuZHJhd0dpem1vcyB8fCBfY29tcG9uZW50LmRyYXdHaXptb3NTZWxlY3RlZCkgJiYgdGhpcy5naXptb3NGaWx0ZXJbX2NvbXBvbmVudC50eXBlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERpZmZlcmVudCB4ciBzZXNzaW9uIG1vZGVzIGF2YWlsYWJsZS4gQ291bGQgYmUgZXhwYW5kIHdpdGggbW9yZSBtb2RlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEBhdXRob3JzIFZhbGVudGluIFNjaG1pZGJlcmdlciwgSEZVLCAyMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gWFJfU0VTU0lPTl9NT0RFIHtcclxuICAgIElNTUVSU0lWRV9WUiA9IFwiaW1tZXJzaXZlLXZyXCJcclxuICAgIC8vSU1NRVJTSVZFX0FSID0gXCJpbW1lcnNpdmUtYXJcIixcclxuICAgIC8vSU5MSU5FID0gXCJpbmxpbmVcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlmZmVyZW50IHJlZmVyZW5jZSB2ci1zcGFjZXMgYXZhaWxhYmxlLCBjcmVhdG9yIGhhcyB0byBjaGVjayBpZiB0aGUgc3BhY2UgaXMgc3VwcG9ydGVkIHdpdGggaXRzIGRldmljZS5cclxuICAgKiBDb3VsZCBiZSBleHBhbmQgd2l0aCBtb3JlIGF2YWlsYWJsZSBzcGFjZSB0eXBlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFhSX1JFRkVSRU5DRV9TUEFDRSB7XHJcbiAgICBWSUVXRVIgPSBcInZpZXdlclwiLFxyXG4gICAgTE9DQUwgPSBcImxvY2FsXCJcclxuICAgIC8vIExPQ0FMX0ZMT09SID0gXCJsb2NhbC1mbG9vclwiLFxyXG4gICAgLy8gQk9VTkRFRF9GTE9PUiA9IFwiYm91bmRlZC1mbG9vclwiLFxyXG4gICAgLy8gVU5CT1VOREVEID0gXCJ1bmJvdW5kZWRcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogWFJWaWV3cG9ydCAod2ViWFIpLWV4dGVuc2lvbiBvZiBWaWV3cG9ydCwgdG8gZGlzcGxheWluZyBpdHMgYnJhbmNoIG9uIEhlYWQgTW91bnRlZCBhbmQgQVIgKG5vdCBpbXBsZW10ZWQgeWV0KSBEZXZpY2VzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBYUlZpZXdwb3J0IGV4dGVuZHMgVmlld3BvcnQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgeHJWaWV3cG9ydEluc3RhbmNlOiBYUlZpZXdwb3J0ID0gbnVsbDtcclxuICAgIHB1YmxpYyB2ckRldmljZTogQ29tcG9uZW50VlJEZXZpY2UgPSBudWxsO1xyXG4gICAgcHVibGljIHNlc3Npb246IFhSU2Vzc2lvbiA9IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlU3BhY2U6IFhSUmVmZXJlbmNlU3BhY2UgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VWUkNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcml2YXRlIHBvc2VNdHg6IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQoKTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgWFJWaWV3cG9ydC54clZpZXdwb3J0SW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG8gcmV0cmlldmUgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2Ugb2YgeHIgdmlld3BvcnQsIHJlYWRvbmx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0KCk6IFhSVmlld3BvcnQge1xyXG4gICAgICByZXR1cm4gdGhpcy54clZpZXdwb3J0SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ29ubmVjdHMgdGhlIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjYW52YXMgdG8gcmVuZGVyIHRoZSBnaXZlbiBicmFuY2ggdG8gdXNpbmcgdGhlIGdpdmVuIGNhbWVyYS1jb21wb25lbnQsIGFuZCBuYW1lcyB0aGUgdmlld3BvcnQgYXMgZ2l2ZW4uXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhWFI6IENvbXBvbmVudFZSRGV2aWNlIC8qIHwgQ29tcG9uZW50Q2FtZXJhQVIqLywgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuaW5pdGlhbGl6ZShfbmFtZSwgX2JyYW5jaCwgX2NhbWVyYVhSLCBfY2FudmFzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBWUiBTZXNzaW9uIGlzIGluaXRpYWxpemVkIGhlcmUsIGFsc28gVlIgLSBDb250cm9sbGVyIGFyZSBpbml0aWFsaXplZCwgaWYgYm9vbGVhbiBpcyB0cnVlLlxyXG4gICAgICogQ3JlYXRvciBoYXMgdG8gY2FsbCBGcmFtZVJlcXVlc3RYUiBhZnRlciB0aGlzIE1ldGhvZCB0byBydW4gdGhlIHZpZXdwb3J0IGluIHZpcnR1YWwgcmVhbGl0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVWUihfdnJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gWFJfU0VTU0lPTl9NT0RFLklNTUVSU0lWRV9WUiwgX3ZyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBYUl9SRUZFUkVOQ0VfU1BBQ0UuTE9DQUwsIF92ckNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2Vzc2lvbjogWFJTZXNzaW9uID0gYXdhaXQgbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKF92clNlc3Npb25Nb2RlKTtcclxuICAgICAgdGhpcy5yZWZlcmVuY2VTcGFjZSA9IGF3YWl0IHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKF92clJlZmVyZW5jZVNwYWNlVHlwZSk7XHJcbiAgICAgIGF3YWl0IFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCkubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG4gICAgICBsZXQgbmF0aXZlU2NhbGVGYWN0b3I6IG51bWJlciA9IFhSV2ViR0xMYXllci5nZXROYXRpdmVGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yKHNlc3Npb24pO1xyXG4gICAgICAvL1RPRE86ICBGaWVsZCBvZiB2aWV3IGvDtm5udGUgYW4gZGVyIFN0ZWxsZSBub2NoIHZlcsOkbmRlcnQgd2VyZGVuLlxyXG4gICAgICBsZXQgYmFzZUxheWVyOiBYUldlYkdMTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKHNlc3Npb24sIFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCksIHsgZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogbmF0aXZlU2NhbGVGYWN0b3IgfSk7XHJcbiAgICAgIGF3YWl0IHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoeyBiYXNlTGF5ZXI6IGJhc2VMYXllciB9KTtcclxuICAgICAgUmVuZGVyLnNldEZyYW1lYnVmZmVyVGFyZ2V0KGJhc2VMYXllci5mcmFtZWJ1ZmZlcik7XHJcbiAgICAgIFJlbmRlci5zZXRDYW52YXNTaXplKGJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBiYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlY3RhbmdsZS5HRVQoMCwgMCwgYmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCkpO1xyXG4gICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuICAgICAgdGhpcy5hZGp1c3RpbmdGcmFtZXMgPSBmYWxzZTsgLy8gd2ViIHhyIGhhbmRsZXMgdGhpcyBub3dcclxuICAgICAgdGhpcy52ckRldmljZSA9IDxDb21wb25lbnRWUkRldmljZT50aGlzLmNhbWVyYTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlU3BhY2UoKTtcclxuXHJcbiAgICAgIHRoaXMudXNlVlJDb250cm9sbGVyID0gX3ZyQ29udHJvbGxlcjtcclxuICAgICAgaWYgKF92ckNvbnRyb2xsZXIpIHtcclxuICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuY21wVHJhbnNmb3JtID0gbmV3IENvbXBvbmVudFRyYW5zZm9ybSgpO1xyXG4gICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybSA9IG5ldyBDb21wb25lbnRUcmFuc2Zvcm0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZUJyYW5jaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEFSIHNlc3Npb24gY291bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4gVXAgdGlsbCBub3cgbm90IGltcGxlbWVudGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVBUihfYXJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gbnVsbCwgX2FyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmVycm9yKFwiTk9UIElNUExFTUVOVEVEIFlFVCEgQ2hlY2sgb3V0IGluaXRpYWxpemVWUiFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSB4ciB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICogQ2FsbGVkIGZyb20gbG9vcCBtZXRob2Qge0BsaW5rIExvb3B9IGFnYWluIHdpdGggdGhlIHhyRnJhbWUgcGFyYW1ldGVyIGhhbmRvdmVyLCBhcyBzb29uIGFzIEZSQU1FX1JFUVVFU1RfWFIgaXMgY2FsbGVkIGZyb20gY3JlYXRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRyYXcoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlLCBfeHJGcmFtZTogWFJGcmFtZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcclxuICAgICAgICBzdXBlci5kcmF3KF9wcmVwYXJlQnJhbmNoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwb3NlOiBYUlZpZXdlclBvc2UgPSBfeHJGcmFtZT8uZ2V0Vmlld2VyUG9zZSh0aGlzLnJlZmVyZW5jZVNwYWNlKTtcclxuICAgICAgaWYgKCFwb3NlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwuc2V0KHBvc2UudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmFjayBiZWNhdXNlIHRoZSBYUiBSaWcgaXMgbG9va2luZyBpbiB0aGUgZGlyZWN0aW9uIG9mIG5lZ2F0aXZlIHpcclxuICAgICAgc3VwZXIucHJlcGFyZShfcHJlcGFyZUJyYW5jaCk7XHJcblxyXG4gICAgICBSZW5kZXIucmVzZXRGcmFtZWJ1ZmZlcigpO1xyXG4gICAgICBSZW5kZXIuY2xlYXIodGhpcy5jYW1lcmEuY2xyQmFja2dyb3VuZCk7XHJcblxyXG4gICAgICBsZXQgZ2xMYXllcjogWFJXZWJHTExheWVyID0gdGhpcy5zZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcclxuICAgICAgZm9yIChsZXQgdmlldyBvZiBwb3NlLnZpZXdzKSB7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0OiBnbG9iYWxUaGlzLlhSVmlld3BvcnQgPSBnbExheWVyLmdldFZpZXdwb3J0KHZpZXcpO1xyXG4gICAgICAgIFJlbmRlci5zZXRWaWV3cG9ydCh2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcclxuICAgICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QodHJ1ZSwgdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZVZSQ29udHJvbGxlcilcclxuICAgICAgICAgIHRoaXMuc2V0Q29udHJvbGxlckNvbmZpZ3MoX3hyRnJhbWUpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnJlc2V0V29ybGRUb1ZpZXcoKTsgLy8gVE9ETzogZmluZCBhIGxlc3MgZXhwZW5zaXZlIHdheSB0byBkbyB0aGlzLCBtYXliZSB1c2UgdHdvIGNhbWVyYXNcclxuICAgICAgICB0aGlzLmNhbWVyYS5tdHhQcm9qZWN0aW9uLnNldCh2aWV3LnByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLm10eENhbWVyYUludmVyc2Uuc2V0KHZpZXcudHJhbnNmb3JtLmludmVyc2UubWF0cml4KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKSBcclxuICAgICAgICAgIFJlbmRlci5kcmF3KHRoaXMuY2FtZXJhKTtcclxuICAgICAgICBpZiAodGhpcy5waHlzaWNzRGVidWdNb2RlICE9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkUpIFxyXG4gICAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXNldCBmb3Igb3RoZXIgcmVuZGVyIG9wZXJhdGlvbnMgZS5nLiBwaWNraW5nXHJcbiAgICAgIFJlbmRlci5zZXRTY2lzc29yVGVzdChmYWxzZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUoUmVuZGVyLmdldFJlbmRlclJlY3RhbmdsZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgdGhlIHJlZmVyZW5jZSBzcGFjZSB0byBzZXQgdGhlIGluaXRpYWwgcG9zaXRpb24vb3JpZW50YXRpb24gb2YgdGhlIHZyIGRldmljZSBpbiBhY2NvcmRhbmNlIHRvIHRoZSBub2RlIHRoZSB2ciBkZXZpY2UgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVJlZmVyZW5jZVNwYWNlKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMudnJEZXZpY2Uubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudFZSRGV2aWNlKT8ubXR4V29ybGQ7XHJcbiAgICAgIGlmICghbXR4V29ybGQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbXR4V29ybGQgPSBtdHhXb3JsZC5jbG9uZTtcclxuICAgICAgbXR4V29ybGQucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmVjYXVzZSB0aGUgWFIgUmlnIGlzIGxvb2tpbmcgaW4gdGhlIGRpcmVjdGlvbiBvZiBuZWdhdGl2ZSB6XHJcbiAgICAgIGxldCBpbnZNdHhUcmFuc2ZvbTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UobXR4V29ybGQpOyAvLyBpbnZlcnNlIGJlY2F1c2Ugd2UgYXJlIG1vdmluZyB0aGUgcmVmZXJlbmNlIHNwYWNlXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShpbnZNdHhUcmFuc2ZvbS50cmFuc2xhdGlvbiwgaW52TXR4VHJhbnNmb20ucXVhdGVybmlvbikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vU2V0cyBjb250cm9sbGVyIG1hdHJpY2VzIGFuZCB0aHVtYnN0aWNrcyBtb3ZlbWVudHMuXHJcbiAgICBwcml2YXRlIHNldENvbnRyb2xsZXJDb25maWdzKF94ckZyYW1lOiBYUkZyYW1lKTogdm9pZCB7XHJcbiAgICAgIGlmIChfeHJGcmFtZSkge1xyXG4gICAgICAgIGlmIChYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbi5pbnB1dFNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24uaW5wdXRTb3VyY2VzLmZvckVhY2goX2NvbnRyb2xsZXIgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRyb2xsZXIuaGFuZGVkbmVzcykge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAoXCJyaWdodFwiKTpcclxuICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLmNtcFRyYW5zZm9ybS5tdHhMb2NhbC5zZXQoX3hyRnJhbWUuZ2V0UG9zZShfY29udHJvbGxlci50YXJnZXRSYXlTcGFjZSwgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuZ2FtZVBhZClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuZ2FtZVBhZCA9IF9jb250cm9sbGVyLmdhbWVwYWQ7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UucmlnaHRDbnRybC50aHVtYnN0aWNrWCA9IF9jb250cm9sbGVyLmdhbWVwYWQuYXhlc1syXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwudGh1bWJzdGlja1kgPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbM107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIChcImxlZnRcIik6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybS5tdHhMb2NhbC5zZXQoX3hyRnJhbWUuZ2V0UG9zZShfY29udHJvbGxlci50YXJnZXRSYXlTcGFjZSwgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52ckRldmljZS5sZWZ0Q250cmwuZ2FtZVBhZClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLmxlZnRDbnRybC5nYW1lUGFkID0gX2NvbnRyb2xsZXIuZ2FtZXBhZDtcclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwudGh1bWJzdGlja1ggPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbMl07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwudGh1bWJzdGlja1kgPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbM107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuZXJyb3IoXCJJbnB1dCBTb3VyY2VzIEVycm9yOiBcIiArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEZpbGVuYW1lVG9Db250ZW50IHtcclxuICAgIFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGZpbGUgdHJhbnNmZXIgZnJvbSBhIEZVREdFLUJyb3dzZXJhcHAgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gd2l0aG91dCBhIGxvY2FsIHNlcnZlci4gIFxyXG4gICAqIFNhdmVzIHRvIHRoZSBkb3dubG9hZC1wYXRoIGdpdmVuIGJ5IHRoZSBicm93c2VyLCBsb2FkcyBmcm9tIHRoZSBwbGF5ZXIncyBjaG9pY2UuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZpbGVJb0Jyb3dzZXJMb2NhbCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdG9yOiBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdG8gYXN5bmMgZnVuY3Rpb24gdG8gYmUgaGFuZGxlZCB1c2luZyBwcm9taXNlLCBpbnN0ZWFkIG9mIHVzaW5nIGV2ZW50IHRhcmdldFxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIGZpbGUgc2VsZWN0IGRpYWxvZyB0byBsb2FkIGZpbGVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbSBpbnRvIGJyb3dzZXIgYXBwbGljYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8TWFwRmlsZW5hbWVUb0NvbnRlbnQ+IHtcclxuICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IubXVsdGlwbGUgPSBfbXVsdGlwbGU7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC5zZWxlY3Rvci5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBGaWxlSW9Ccm93c2VyTG9jYWwuaGFuZGxlRmlsZVNlbGVjdCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNYXBGaWxlbmFtZVRvQ29udGVudD4oX3Jlc29sdmUgPT4ge1xyXG4gICAgICAgIGZ1bmN0aW9uIGhuZExvYWRlZChfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgICBGaWxlSW9Ccm93c2VyTG9jYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX0xPQURFRCwgaG5kTG9hZGVkKTtcclxuICAgICAgICAgIF9yZXNvbHZlKCg8Q3VzdG9tRXZlbnQ+X2V2ZW50KS5kZXRhaWwubWFwRmlsZW5hbWVUb0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9MT0FERUQsIGhuZExvYWRlZCk7XHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yLmNsaWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIGhhbmRsZWQgdXNpbmcgcHJvbWlzZSwgaW5zdGVhZCBvZiB1c2luZyBldmVudCB0YXJnZXRcclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBhIGZpbGUgZG93bmxvYWQgZGlhbG9nIHRvIHNhdmUgZmlsZXMgdG8gbG9jYWwgZmlsZXN5c3RlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzYXZlKF90b1NhdmU6IE1hcEZpbGVuYW1lVG9Db250ZW50LCBfdHlwZTogc3RyaW5nID0gXCJ0ZXh0L3BsYWluXCIpOiBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGVuYW1lIGluIF90b1NhdmUpIHtcclxuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nID0gX3RvU2F2ZVtmaWxlbmFtZV07XHJcbiAgICAgICAgbGV0IGJsb2I6IEJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogX3R5cGUgfSk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgLy8qLyB1c2luZyBhbmNob3IgZWxlbWVudCBmb3IgZG93bmxvYWRcclxuICAgICAgICBsZXQgZG93bmxvYWRlcjogSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgZG93bmxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCB1cmwpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgZG93bmxvYWRlci5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PihfcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgX3Jlc29sdmUoX3RvU2F2ZSk7XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gaG5kU2F2ZWQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8vICAgRmlsZUlvQnJvd3NlckxvY2FsLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9TQVZFRCwgaG5kU2F2ZWQpO1xyXG4gICAgICAgIC8vICAgX3Jlc29sdmUoKDxDdXN0b21FdmVudD5fZXZlbnQpLmRldGFpbCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBGaWxlSW9Ccm93c2VyTG9jYWwuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX1NBVkVELCBobmRTYXZlZCk7XHJcbiAgICAgICAgLy8gbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVC5GSUxFX1NBVkVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogX3RvU2F2ZSB9IH0pO1xyXG4gICAgICAgIC8vIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgdGhlIGZpbGVzIHJlZmVyZW5jZWQgaW4ge0BsaW5rIEZpbGVMaXN0fSBpbnRvIHRoZSBwcm92aWRlZCB7QGxpbmsgTWFwRmlsZW5hbWVUb0NvbnRlbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZEZpbGVzKF9maWxlTGlzdDogRmlsZUxpc3QsIF9sb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGUgb2YgX2ZpbGVMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgbmV3IFJlc3BvbnNlKGZpbGUpLnRleHQoKTtcclxuICAgICAgICBfbG9hZGVkW2ZpbGUubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaGFuZGxlRmlsZVNlbGVjdChfZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFuZGxlRmlsZVNlbGVjdFwiKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IpO1xyXG4gICAgICBsZXQgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gKDxIVE1MSW5wdXRFbGVtZW50Pl9ldmVudC50YXJnZXQpLmZpbGVzO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShmaWxlTGlzdCwgZmlsZUxpc3QubGVuZ3RoKTtcclxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBsb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50ID0ge307XHJcbiAgICAgIGF3YWl0IEZpbGVJb0Jyb3dzZXJMb2NhbC5sb2FkRmlsZXMoZmlsZUxpc3QsIGxvYWRlZCk7XHJcblxyXG4gICAgICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWRU5ULkZJTEVfTE9BREVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogbG9hZGVkIH0gfSk7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59ICIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIE11dGFibGUgYXJyYXkgb2Yge0BsaW5rIE11dGFibGV9cy4gVGhlIHtAbGluayBNdXRhdG9yfXMgb2YgdGhlIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIGFycmF5IGluIHRoZSB7QGxpbmsgTXV0YXRvcn1cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE11dGFibGVBcnJheTxUIGV4dGVuZHMgTXV0YWJsZT4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICAjdHlwZTogbmV3ICgpID0+IFQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKCkgPT4gVCwgLi4uX2FyZ3M6IFRbXSkge1xyXG4gICAgICBzdXBlciguLi5fYXJncyk7XHJcbiAgICAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogbmV3ICgpID0+IFQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYXJyYW5nZSB0aGUgZW50cmllcyBvZiB0aGUgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBpbmRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFycmFuZ2UoX3NlcXVlbmNlOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaW5kZXggb2YgX3NlcXVlbmNlKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsOiBUID0gdGhpc1tpbmRleF07XHJcbiAgICAgICAgLy8gVE9ETzogb3B0aW1pemUsIGNvcHkgb25seSBkb3VibGUgZW50cmllc1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGxldCBjb3B5OiBUID0gbmV3IG9yaWdpbmFsLmNvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgY29weS5tdXRhdGUob3JpZ2luYWwuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgICB0aGlzLnB1c2goY29weSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zcGxpY2UoMCwgbGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGlzIGFycmF5cyBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHR5cGVzIGFzIHN0cmluZy12YWx1ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpXHJcbiAgICAgICAgdHlwZXNbZW50cnldID0gdGhpc1tlbnRyeV0uY29uc3RydWN0b3IubmFtZTtcclxuXHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBlYWNoIGVsZW1lbnRzIG11dGF0b3IgYnkgaW52b2tpbmcge0BsaW5rIE11dGFibGUuZ2V0TXV0YXRvcn0gb24gdGhlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWFwKChfdmFsdWUpID0+IF92YWx1ZS5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBNdXRhYmxlLmdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2UoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11dGF0ZSB0aGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBkZWZpbmVkIGJ5IHRoZSBfbXV0YXRvciBieSBpbnZva2luZyB7QGxpbmsgTXV0YWJsZS5tdXRhdGV9IG9uIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgaW4gX211dGF0b3IpXHJcbiAgICAgICAgYXdhaXQgdGhpc1s8R2VuZXJhbD5lbnRyeV0ubXV0YXRlKF9tdXRhdG9yW2VudHJ5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIG11dGF0b3IgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBlbnRyeSBpbiB0aGlzKSB7XHJcbiAgICAgICAgbGV0IG11dGF0b3JWYWx1ZTogT2JqZWN0ID0gX211dGF0b3JbZW50cnldO1xyXG4gICAgICAgIGlmICghbXV0YXRvclZhbHVlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKHRoaXNbZW50cnldIGluc3RhbmNlb2YgTXV0YWJsZSlcclxuICAgICAgICAgIF9tdXRhdG9yW2VudHJ5XSA9IHRoaXNbZW50cnldLmdldE11dGF0b3IoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBfbXV0YXRvcltlbnRyeV0gPSB0aGlzW2VudHJ5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIE1PREUge1xyXG4gICAgRURJVE9SLCBSVU5USU1FXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBSRVNPVVJDRV9TVEFUVVMge1xyXG4gICAgUEVORElORywgUkVBRFksIEVSUk9SXHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgZXh0ZW5kcyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICB1cmw6IFJlcXVlc3RJbmZvO1xyXG4gICAgc3RhdHVzOiBSRVNPVVJDRV9TVEFUVVM7XHJcbiAgICBsb2FkKCk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD47XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZVJlc291cmNlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGlkUmVzb3VyY2U6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VzIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBTZXJpYWxpemFibGVSZXNvdXJjZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBTZXJpYWxpemF0aW9uO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBTY3JpcHROYW1lc3BhY2VzIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBPYmplY3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFNjcmlwdHMge1xyXG4gICAgW25hbWVzcGFjZTogc3RyaW5nXTogQ29tcG9uZW50U2NyaXB0W107XHJcbiAgfVxyXG5cclxuICBpbnRlcmZhY2UgR3JhcGhJbnN0YW5jZXNUb1Jlc3luYyB7XHJcbiAgICBbaWRSZXNvdXJjZTogc3RyaW5nXTogR3JhcGhJbnN0YW5jZVtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhdGljIGNsYXNzIGhhbmRsaW5nIHRoZSByZXNvdXJjZXMgdXNlZCB3aXRoIHRoZSBjdXJyZW50IEZVREdFLWluc3RhbmNlLiAgXHJcbiAgICogS2VlcHMgYSBsaXN0IG9mIHRoZSByZXNvdXJjZXMgYW5kIGdlbmVyYXRlcyBpZHMgdG8gcmV0cmlldmUgdGhlbS4gIFxyXG4gICAqIFJlc291cmNlcyBhcmUgb2JqZWN0cyByZWZlcmVuY2VkIG11bHRpcGxlIHRpbWVzIGJ1dCBzdXBwb3NlZCB0byBiZSBzdG9yZWQgb25seSBvbmNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFByb2plY3QgZXh0ZW5kcyBFdmVudFRhcmdldFN0YXRpYyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlc291cmNlczogUmVzb3VyY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb25PZlJlc291cmNlcyA9IHt9O1xyXG4gICAgcHVibGljIHN0YXRpYyBzY3JpcHROYW1lc3BhY2VzOiBTY3JpcHROYW1lc3BhY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIGJhc2VVUkw6IFVSTCA9IG5ldyBVUkwobG9jYXRpb24udG9TdHJpbmcoKSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIG1vZGU6IE1PREUgPSBNT0RFLlJVTlRJTUU7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdyYXBoSW5zdGFuY2VzVG9SZXN5bmM6IEdyYXBoSW5zdGFuY2VzVG9SZXN5bmMgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyB0aGUgcmVzb3VyY2UgYW5kIGdlbmVyYXRlcyBhbiBpZCBmb3IgaXQgYnkgZGVmYXVsdC4gIFxyXG4gICAgICogSWYgdGhlIHJlc291cmNlIGFscmVhZHkgaGFzIGFuIGlkLCB0aHVzIGhhdmluZyBiZWVuIHJlZ2lzdGVyZWQsIGl0cyBkZWxldGVkIGZyb20gdGhlIGxpc3QgYW5kIHJlZ2lzdGVyZWQgYW5ldy5cclxuICAgICAqIEl0J3MgcG9zc2libGUgdG8gcGFzcyBhbiBpZCwgYnV0IHNob3VsZCBub3QgYmUgZG9uZSBleGNlcHQgYnkgdGhlIFNlcmlhbGl6ZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIoX3Jlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSwgX2lkUmVzb3VyY2U/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9yZXNvdXJjZS5pZFJlc291cmNlICYmIF9yZXNvdXJjZS5pZFJlc291cmNlID09IF9pZFJlc291cmNlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGlmIChfcmVzb3VyY2UuaWRSZXNvdXJjZSkgLy8gZGVyZWdpc3RlciB0aGUgb2xkIGlkXHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyKF9yZXNvdXJjZSk7XHJcblxyXG4gICAgICBpZiAoX2lkUmVzb3VyY2UpIHtcclxuICAgICAgICBfcmVzb3VyY2UuaWRSZXNvdXJjZSA9IF9pZFJlc291cmNlO1xyXG4gICAgICAgIHRoaXMuZGVyZWdpc3RlcihfcmVzb3VyY2UpOyAvLyBkZXJlZ2lzdGVyIHRoZSBuZXcgaWRcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFfcmVzb3VyY2UuaWRSZXNvdXJjZSlcclxuICAgICAgICBfcmVzb3VyY2UuaWRSZXNvdXJjZSA9IFByb2plY3QuZ2VuZXJhdGVJZChfcmVzb3VyY2UpO1xyXG5cclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXNbX3Jlc291cmNlLmlkUmVzb3VyY2VdID0gX3Jlc291cmNlO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoKVxyXG4gICAgICAgIF9yZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX01VVEFURUQsIChfZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEVWRU5ULkdSQVBIX01VVEFURUQsIHsgZGV0YWlsOiBfcmVzb3VyY2UgfSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIHJlc291cmNlIGZyb20gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlcmVnaXN0ZXIoX3Jlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgKFByb2plY3QucmVzb3VyY2VzW19yZXNvdXJjZS5pZFJlc291cmNlXSk7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5zZXJpYWxpemF0aW9uW19yZXNvdXJjZS5pZFJlc291cmNlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIGFuZCB0aGVpciBzZXJpYWxpemF0aW9uLCB0aHVzIHJlbW92aW5nIGFsbCByZXNvdXJjZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIFByb2plY3QucmVzb3VyY2VzID0ge307XHJcbiAgICAgIFByb2plY3Quc2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBQcm9qZWN0LmNsZWFyU2NyaXB0TmFtZXNwYWNlcygpO1xyXG4gICAgICAvLyBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA8VCBleHRlbmRzIENvbXBvbmVudD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFRbXSB7XHJcbiAgICAvLyAgIHJldHVybiA8VFtdPih0aGlzLmNvbXBvbmVudHNbX2NsYXNzLm5hbWVdIHx8IFtdKS5zbGljZSgwKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHJlc291cmNlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb3VyY2VzQnlUeXBlPFQ+KF90eXBlOiBuZXcgKF9hcmdzOiBHZW5lcmFsKSA9PiBUKTogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCByZXNvdXJjZUlkIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlSWRdO1xyXG4gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIF90eXBlKVxyXG4gICAgICAgICAgZm91bmQucHVzaChyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVzb3VyY2VzIHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFJlc291cmNlc0J5TmFtZShfbmFtZTogc3RyaW5nKTogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCByZXNvdXJjZUlkIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlSWRdO1xyXG4gICAgICAgIGlmIChyZXNvdXJjZS5uYW1lID09IF9uYW1lKVxyXG4gICAgICAgICAgZm91bmQucHVzaChyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGEgdXNlciByZWFkYWJsZSBhbmQgdW5pcXVlIGlkIHVzaW5nIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSwgdGhlIGRhdGUgYW5kIHJhbmRvbSBudW1iZXJzXHJcbiAgICAgKiBAcGFyYW0gX3Jlc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVJZChfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlKTogc3RyaW5nIHtcclxuICAgICAgLy8gVE9ETzogYnVpbGQgaWQgYW5kIGludGVncmF0ZSBpbmZvIGZyb20gcmVzb3VyY2UsIG5vdCBqdXN0IGRhdGVcclxuICAgICAgbGV0IGlkUmVzb3VyY2U6IHN0cmluZztcclxuICAgICAgZG9cclxuICAgICAgICBpZFJlc291cmNlID0gX3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWUgKyBcInxcIiArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArIFwifFwiICsgTWF0aC5yYW5kb20oKS50b1ByZWNpc2lvbig1KS5zdWJzdHIoMiwgNSk7XHJcbiAgICAgIHdoaWxlIChQcm9qZWN0LnJlc291cmNlc1tpZFJlc291cmNlXSk7XHJcbiAgICAgIHJldHVybiBpZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMsIGlmIGFuIG9iamVjdCBpcyBhIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZX1cclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IFRoZSBvYmplY3QgdG8gZXhhbWluZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUmVzb3VyY2UoX29iamVjdDogU2VyaWFsaXphYmxlKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoUmVmbGVjdC5oYXMoX29iamVjdCwgXCJpZFJlc291cmNlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgcmVzb3VyY2Ugc3RvcmVkIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0UmVzb3VyY2UoX2lkUmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+IHtcclxuICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW19pZFJlc291cmNlXTtcclxuICAgICAgaWYgKCFyZXNvdXJjZSkge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gUHJvamVjdC5zZXJpYWxpemF0aW9uW19pZFJlc291cmNlXTtcclxuICAgICAgICBpZiAoIXNlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIsIF9pZFJlc291cmNlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvdXJjZSA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemVSZXNvdXJjZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjbG9uZVJlc291cmNlKF9yZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlPiB7XHJcbiAgICAgIGlmICghX3Jlc291cmNlKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShfcmVzb3VyY2UpO1xyXG4gICAgICBsZXQgdHlwZTogc3RyaW5nID0gPHN0cmluZz5SZWZsZWN0Lm93bktleXMoc2VyaWFsaXphdGlvbilbMF07XHJcbiAgICAgIGRlbGV0ZSAoc2VyaWFsaXphdGlvblt0eXBlXS5pZFJlc291cmNlKTtcclxuICAgICAgbGV0IGNsb25lOiB0eXBlb2YgX3Jlc291cmNlID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZVJlc291cmNlKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKGNsb25lKTtcclxuICAgICAgY2xvbmUubmFtZSArPSBcIl9jbG9uZVwiO1xyXG4gICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSByZXNvdXJjZSBmcm9tIGEge0BsaW5rIE5vZGV9LCBjb3B5aW5nIHRoZSBjb21wbGV0ZSBncmFwaCBzdGFydGluZyB3aXRoIGl0XHJcbiAgICAgKiBAcGFyYW0gX25vZGUgQSBub2RlIHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgZnJvbVxyXG4gICAgICogQHBhcmFtIF9yZXBsYWNlV2l0aEluc3RhbmNlIGlmIHRydWUgKGRlZmF1bHQpLCB0aGUgbm9kZSB1c2VkIGFzIG9yaWdpbiBpcyByZXBsYWNlZCBieSBhIHtAbGluayBHcmFwaEluc3RhbmNlfSBvZiB0aGUge0BsaW5rIEdyYXBofSBjcmVhdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVnaXN0ZXJBc0dyYXBoKF9ub2RlOiBOb2RlLCBfcmVwbGFjZVdpdGhJbnN0YW5jZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPEdyYXBoPiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gX25vZGUuc2VyaWFsaXplKCk7XHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSBuZXcgR3JhcGgoX25vZGUubmFtZSk7XHJcbiAgICAgIGF3YWl0IGdyYXBoLmRlc2VyaWFsaXplKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKGdyYXBoKTtcclxuXHJcbiAgICAgIGlmIChfcmVwbGFjZVdpdGhJbnN0YW5jZSAmJiBfbm9kZS5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgIGxldCBpbnN0YW5jZTogR3JhcGhJbnN0YW5jZSA9IGF3YWl0IFByb2plY3QuY3JlYXRlR3JhcGhJbnN0YW5jZShncmFwaCk7XHJcbiAgICAgICAgX25vZGUuZ2V0UGFyZW50KCkucmVwbGFjZUNoaWxkKF9ub2RlLCBpbnN0YW5jZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBncmFwaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gb2YgdGhlIGdpdmVuIHtAbGluayBHcmFwaH0gXHJcbiAgICAgKiBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIGdyYXBoIGZvciBzeW5jaHJvbmlzYXRpb24gb2YgbXV0YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlR3JhcGhJbnN0YW5jZShfZ3JhcGg6IEdyYXBoKTogUHJvbWlzZTxHcmFwaEluc3RhbmNlPiB7XHJcbiAgICAgIGxldCBpbnN0YW5jZTogR3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaEluc3RhbmNlKF9ncmFwaCk7IC8vIFRPRE86IGNsZWFudXAgc2luY2UgY3JlYXRpb24gbW92ZWQgaGVyZVxyXG4gICAgICBhd2FpdCBpbnN0YW5jZS5jb25uZWN0VG9HcmFwaCgpO1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciB0aGUgZ2l2ZW4ge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHRvIGJlIHJlc3luY2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJHcmFwaEluc3RhbmNlRm9yUmVzeW5jKF9pbnN0YW5jZTogR3JhcGhJbnN0YW5jZSk6IHZvaWQge1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBHcmFwaEluc3RhbmNlW10gPSBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2luc3RhbmNlLmlkU291cmNlXSB8fCBbXTtcclxuICAgICAgaW5zdGFuY2VzLnB1c2goX2luc3RhbmNlKTtcclxuICAgICAgUHJvamVjdC5ncmFwaEluc3RhbmNlc1RvUmVzeW5jW19pbnN0YW5jZS5pZFNvdXJjZV0gPSBpbnN0YW5jZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN5bmMgYWxsIHtAbGluayBHcmFwaEluc3RhbmNlfSByZWdpc3RlcmVkIHRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVzeW5jR3JhcGhJbnN0YW5jZXMoX2dyYXBoOiBHcmFwaCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBHcmFwaEluc3RhbmNlW10gPSBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2dyYXBoLmlkUmVzb3VyY2VdO1xyXG4gICAgICBpZiAoIWluc3RhbmNlcylcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGZvciAobGV0IGluc3RhbmNlIG9mIGluc3RhbmNlcylcclxuICAgICAgICBhd2FpdCBpbnN0YW5jZS5jb25uZWN0VG9HcmFwaCgpO1xyXG4gICAgICBkZWxldGUgKFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfZ3JhcGguaWRSZXNvdXJjZV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgdGhlIGdpdmVuIG5hbWVzcGFjZSB0byB0aGUgbGlzdCBvZiBzY3JpcHQtbmFtZXNwYWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlclNjcmlwdE5hbWVzcGFjZShfbmFtZXNwYWNlOiBPYmplY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IFNlcmlhbGl6ZXIucmVnaXN0ZXJOYW1lc3BhY2UoX25hbWVzcGFjZSk7XHJcbiAgICAgIGlmICghUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdKVxyXG4gICAgICAgIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lXSA9IF9uYW1lc3BhY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBzY3JpcHQtbmFtZXNwYWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhclNjcmlwdE5hbWVzcGFjZXMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgUmVmbGVjdC5zZXQod2luZG93LCBuYW1lLCB1bmRlZmluZWQpO1xyXG4gICAgICAgIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBkZWxldGUgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0cyBhbGwge0BsaW5rIENvbXBvbmVudFNjcmlwdH1zIHJlZ2lzdGVyZWQgaW4ge0BsaW5rIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc30gYW5kIHJldHVybnMgdGhlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb21wb25lbnRTY3JpcHRzKCk6IENvbXBvbmVudFNjcmlwdHMge1xyXG4gICAgICBsZXQgY29tcG9tZW50czogQ29tcG9uZW50U2NyaXB0cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lc3BhY2UgaW4gUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgY29tcG9tZW50c1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZXNwYWNlXSkge1xyXG4gICAgICAgICAgbGV0IHNjcmlwdDogQ29tcG9uZW50U2NyaXB0ID0gUmVmbGVjdC5nZXQoUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVzcGFjZV0sIG5hbWUpO1xyXG4gICAgICAgICAgLy8gVXNpbmcgT2JqZWN0LmNyZWF0ZSBkb2Vzbid0IGNhbGwgdGhlIGNvbnN0cnVjdG9yLCBidXQgaW5zdGFuY2VvZiBjYW4gYmUgdXNlZC4gTW9yZSBlbGVnYW50IHRoYW4gdGhlIGxvb3AgYWJvdmUsIHRob3VnaCBtYXliZSBub3QgYXMgcGVyZm9ybWFudC4gXHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IG86IEdlbmVyYWwgPSBPYmplY3QuY3JlYXRlKHNjcmlwdCk7XHJcbiAgICAgICAgICAgIGlmIChvLnByb3RvdHlwZSBpbnN0YW5jZW9mIENvbXBvbmVudFNjcmlwdClcclxuICAgICAgICAgICAgICBjb21wb21lbnRzW25hbWVzcGFjZV0ucHVzaChzY3JpcHQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoX2UpIHsgLyogKi8gfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcG9tZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgc2NyaXB0IGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgaW50ZWdyYXRlcyBpdCBpbnRvIGEge0BsaW5rIEhUTUxTY3JpcHRFbGVtZW50fSBpbiB0aGUge0BsaW5rIGRvY3VtZW50LmhlYWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFNjcmlwdChfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcbiAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuICAgICAgLy8gc2NyaXB0LnR5cGUgPSBcIm1vZHVsZVwiO1xyXG4gICAgICBzY3JpcHQuYXN5bmMgPSBmYWxzZTtcclxuICAgICAgLy8gc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGhhbmRsZUxvYWRlZFNjcmlwdClcclxuICAgICAgbGV0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQ7XHJcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxuICAgICAgRGVidWcubG9nKFwiTG9hZGluZzogXCIsIF91cmwpO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiBfcmVzb2x2ZSgpKTtcclxuICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsICgpID0+IHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiTG9hZGluZyBzY3JpcHRcIiwgX3VybCk7XHJcbiAgICAgICAgICBfcmVqZWN0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IF91cmwudG9TdHJpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHtAbGluayBSZXNvdXJjZXN9IGZyb20gdGhlIGdpdmVuIHVybFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZXMoX3VybDogUmVxdWVzdEluZm8pOiBQcm9taXNlPFJlc291cmNlcz4ge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChfdXJsKTtcclxuICAgICAgY29uc3QgcmVzb3VyY2VGaWxlQ29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBTZXJpYWxpemVyLnBhcnNlKHJlc291cmNlRmlsZUNvbnRlbnQpO1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Rpb246IFJlc291cmNlcyA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIFByb2plY3QuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuUkVTT1VSQ0VTX0xPQURFRCwgeyBkZXRhaWw6IHsgdXJsOiBfdXJsLCByZXNvdXJjZXM6IHJlY29uc3RydWN0aW9uIH0gfSkpO1xyXG4gICAgICByZXR1cm4gcmVjb25zdHJ1Y3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGFsbCByZXNvdXJjZXMgZnJvbSB0aGUge0BsaW5rIGRvY3VtZW50LmhlYWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFJlc291cmNlc0Zyb21IVE1MKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBoZWFkOiBIVE1MSGVhZEVsZW1lbnQgPSBkb2N1bWVudC5oZWFkO1xyXG4gICAgICBsZXQgbGlua3M6IE5vZGVMaXN0T2Y8SFRNTExpbmtFbGVtZW50PiA9IGhlYWQucXVlcnlTZWxlY3RvckFsbChcImxpbmtbdHlwZT1yZXNvdXJjZXNdXCIpO1xyXG4gICAgICBmb3IgKGxldCBsaW5rIG9mIGxpbmtzKSB7XHJcbiAgICAgICAgbGV0IHVybDogUmVxdWVzdEluZm8gPSBsaW5rLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcclxuICAgICAgICBhd2FpdCBQcm9qZWN0LmxvYWRSZXNvdXJjZXModXJsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplIGFsbCByZXNvdXJjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb25PZlJlc291cmNlcyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBpZFJlc291cmNlIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGlmIChpZFJlc291cmNlICE9IHJlc291cmNlLmlkUmVzb3VyY2UpXHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihcIlJlc291cmNlLWlkIG1pc21hdGNoXCIsIHJlc291cmNlKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uW2lkUmVzb3VyY2VdID0gU2VyaWFsaXplci5zZXJpYWxpemUocmVzb3VyY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHJlc291cmNlcyBmcm9tIGEgc2VyaWFsaXphdGlvbiwgZGVsZXRpbmcgYWxsIHJlc291cmNlcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWRcclxuICAgICAqIEBwYXJhbSBfc2VyaWFsaXphdGlvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzKTogUHJvbWlzZTxSZXNvdXJjZXM+IHtcclxuICAgICAgUHJvamVjdC5zZXJpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb247XHJcbiAgICAgIFByb2plY3QucmVzb3VyY2VzID0ge307XHJcbiAgICAgIGZvciAobGV0IGlkUmVzb3VyY2UgaW4gX3NlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IF9zZXJpYWxpemF0aW9uW2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGxldCByZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UgPSBhd2FpdCBQcm9qZWN0LmRlc2VyaWFsaXplUmVzb3VyY2Uoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgaWYgKHJlc291cmNlKVxyXG4gICAgICAgICAgUHJvamVjdC5yZXNvdXJjZXNbaWRSZXNvdXJjZV0gPSByZXNvdXJjZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUHJvamVjdC5yZXNvdXJjZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemVSZXNvdXJjZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+IHtcclxuICAgICAgcmV0dXJuIDxQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlPj5TZXJpYWxpemVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRkJYIHtcclxuICAvKipcclxuICAgKiBSZWFkZXIgdG8gcmVhZCBkYXRhIGZyb20gYW4gYXJyYXkgYnVmZmVyIG1vcmUgY29udmVuaWVudGx5LlxyXG4gICAqIEl0IHNhdmVzIGEgY3VycmVudCBvZmZzZXQgd2hpY2ggaXMgdXBkYXRlZCB3aGVuIGRhdGEgaXMgcmVhZCBkdWUgdG8gaXRzIGJ5dGVsZW5ndGguXHJcbiAgICogZGVzcGl0ZSBnZXRTZXF1ZW5jZSBpdCBpcyBtb3N0bHkgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9waWNvZGU3L2JpbmFyeS1yZWFkZXJcclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEJ1ZmZlclJlYWRlciB7XHJcbiAgICBwdWJsaWMgb2Zmc2V0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmlldzogRGF0YVZpZXc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9idWZmZXI6IEFycmF5QnVmZmVyKSB7XHJcbiAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhfYnVmZmVyKTtcclxuICAgICAgdGhpcy5vZmZzZXQgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFyKF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5nZXRVaW50OChfb2Zmc2V0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEJvb2woX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VWludDgoX29mZnNldCkgIT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VWludDgoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyAxO1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQ4KF9vZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQzMihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VWludDY0KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogYmlnaW50IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgODtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdVaW50NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEludDE2KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogbnVtYmVyIHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgMjtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRJbnQxNihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbnQ2NChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IGJpZ2ludCB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDg7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QmlnSW50NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEZsb2F0MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0MzIoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEZsb2F0NjQoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA4O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFN0cmluZyhfbGVuZ3RoOiBudW1iZXIsIF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4udGhpcy5nZXRTZXF1ZW5jZSh0aGlzLmdldFVpbnQ4LCBfbGVuZ3RoLCBfb2Zmc2V0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljICpnZXRTZXF1ZW5jZTxUIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihfZ2V0dGVyOiAoKSA9PiBULCBfbGVuZ3RoOiBudW1iZXIsIF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogR2VuZXJhdG9yPFQ+IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0O1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgeWllbGQgX2dldHRlci5jYWxsKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYnggZmlsZXMgY29udGFpbmluZyBpdHMgZG9jdW1lbnRzLCBkZWZpbml0aW9ucywgb2JqZWN0cyBhbmQgY29ubmVjdGlvbnMuXHJcbiAgICogSXRzIG9iamVjdHMgYXJlIGRldmlkZWQgaW4gYWxsIGFuZCB0aGUgZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBGQlgge1xyXG4gICAgZG9jdW1lbnRzOiBEb2N1bWVudFtdO1xyXG4gICAgZGVmaW5pdGlvbnM/OiBEZWZpbml0aW9ucztcclxuICAgIG9iamVjdHM6IHtcclxuICAgICAgYWxsOiBPYmplY3RbXTtcclxuICAgICAgbW9kZWxzOiBNb2RlbFtdO1xyXG4gICAgICBnZW9tZXRyaWVzOiBHZW9tZXRyeVtdO1xyXG4gICAgICBwb3NlczogT2JqZWN0W107XHJcbiAgICAgIG1hdGVyaWFsczogTWF0ZXJpYWxbXTtcclxuICAgICAgdGV4dHVyZXM6IFRleHR1cmVbXTtcclxuICAgICAgYW5pbVN0YWNrczogT2JqZWN0W107XHJcbiAgICB9O1xyXG4gICAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXTtcclxuICB9XHJcblxyXG4gIGludGVyZmFjZSBPYmplY3RCYXNlIHtcclxuICAgIHVpZDogbnVtYmVyO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZT86IHN0cmluZztcclxuICAgIHN1YnR5cGU/OiBzdHJpbmc7XHJcbiAgICBjaGlsZHJlbj86IE9iamVjdFtdO1xyXG4gICAgcGFyZW50cz86IE9iamVjdFtdO1xyXG5cclxuICAgIGxvYWRlZDogYm9vbGVhbjtcclxuICAgIGxvYWQ6ICgpID0+IE9iamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVyZmFjZSB0byByZXByZXNlbnQgZmJ4LW9iamVjdHMuXHJcbiAgICogQWxsIGZpZWxkcyBvdGhlciB0aGFuIHVpZCwgbmFtZSwgdHlwZSwgc3VidHlwZSwgY2hpbGRyZW4gYW5kIHBhcmVudHMgYXJlIGxvYWRlZCB3aXRoIHRoZSBsb2FkLW1ldGhvZC5cclxuICAgKiBFYWNoIG9iamVjdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwbGljaXQgZmJ4IG9iamVjdCB0eXBlIGRlZmluZWQgaW4gRnVkZ2VDb3JlLkZCWC4gRXhwbGljaXQgdHlwZXMgaGF2ZSBiZWVuIGRlZmluZWRcclxuICAgKiB3aXRoIHRoZSBoZWxwIG9mIGZvbGxvd2luZyByZWZlcmVuY2U6XHJcbiAgICogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE9iamVjdCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE5vZGVQcm9wZXJ0eSB8IHsgW25hbWU6IHN0cmluZ106IE5vZGVQcm9wZXJ0eSB9IHwgUHJvcGVydHk3MCB8IE9iamVjdCB8IE9iamVjdFtdIHwgKCgpID0+IE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIERvY3VtZW50IGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBTb3VyY2VPYmplY3Q/OiB1bmRlZmluZWQ7XHJcbiAgICBBY3RpdmVBbmltU3RhY2tOYW1lPzogc3RyaW5nO1xyXG4gICAgUm9vdE5vZGU/OiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE5vZGVBdHRyaWJ1dGUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFR5cGVGbGFncz86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgR2VvbWV0cnkgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEdlb21ldHJ5VmVyc2lvbj86IG51bWJlcjtcclxuICAgIFZlcnRpY2VzPzogRmxvYXQzMkFycmF5O1xyXG4gICAgUG9seWdvblZlcnRleEluZGV4PzogSW50MzJBcnJheTtcclxuICAgIExheWVyRWxlbWVudE5vcm1hbD86IExheWVyRWxlbWVudE5vcm1hbDtcclxuICAgIExheWVyRWxlbWVudFVWPzogTGF5ZXJFbGVtZW50VVY7IC8vIHwgTGF5ZXJFbGVtZW50VVZbXTsgLy8gVE9ETzogbWlnaHQgbmVlZCB0byByZWFkZCB0aGlzXHJcbiAgICBMYXllckVsZW1lbnRNYXRlcmlhbD86IExheWVyRWxlbWVudE1hdGVyaWFsO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIExjbFRyYW5zbGF0aW9uPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBBbmltQ3VydmVOb2RlO1xyXG4gICAgTGNsUm90YXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBMY2xTY2FsaW5nPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBBbmltQ3VydmVOb2RlO1xyXG4gICAgUHJlUm90YXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIFBvc3RSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU2NhbGluZ09mZnNldD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU2NhbGluZ1Bpdm90PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBSb3RhdGlvbk9mZnNldD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgUm90YXRpb25QaXZvdD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgSW5oZXJpdFR5cGU/OiBudW1iZXI7XHJcbiAgICBFdWxlck9yZGVyPzogc3RyaW5nO1xyXG4gICAgY3VycmVudFVWU2V0Pzogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIFNoYWRpbmdNb2RlbD86IHN0cmluZztcclxuXHJcbiAgICBEaWZmdXNlPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBEaWZmdXNlQ29sb3I/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IFRleHR1cmU7XHJcbiAgICBEaWZmdXNlRmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIEFtYmllbnQ/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIEFtYmllbnRDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuXHJcbiAgICBTaGluaW5lc3M/OiBudW1iZXI7XHJcbiAgICBTaGluaW5lc3NFeHBvbmVudD86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuXHJcbiAgICBTcGVjdWxhcj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU3BlY3VsYXJDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuICAgIFNwZWN1bGFyRmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIFJlZmxlY3Rpdml0eT86IG51bWJlcjtcclxuICAgIFJlZmxlY3Rpb25GYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgT3BhY2l0eT86IG51bWJlcjtcclxuICAgIFRyYW5zcGFyZW5jeUZhY3Rvcj86IG51bWJlcjtcclxuXHJcbiAgICBFbWlzc2l2ZT86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgTm9ybWFsTWFwPzogVGV4dHVyZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRGVmb3JtZXIgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFZlcnNpb24/OiBudW1iZXI7XHJcbiAgICBTa2lubmluZ1R5cGU/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFN1YkRlZm9ybWVyIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgVHJhbnNmb3JtPzogRmxvYXQzMkFycmF5O1xyXG4gICAgVHJhbnNmb3JtTGluaz86IEZsb2F0MzJBcnJheTtcclxuICAgIEluZGV4ZXM/OiBVaW50MTZBcnJheTtcclxuICAgIFdlaWdodHM/OiBGbG9hdDMyQXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gICAgUmVsYXRpdmVGaWxlbmFtZT86IHN0cmluZztcclxuICAgIE1vZGVsVVZTY2FsaW5nPzogbnVtYmVyO1xyXG4gICAgTW9kZWxVVlRyYW5zbGF0aW9uPzogbnVtYmVyO1xyXG4gICAgVVZTZXQ/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFZpZGVvIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBGaWxlTmFtZT86IHN0cmluZztcclxuICAgIFJlbGF0aXZlRmlsZW5hbWU/OiBzdHJpbmc7XHJcbiAgICBVc2VNaXBNYXA/OiBudW1iZXI7XHJcbiAgICBDb250ZW50PzogVWludDhBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbUN1cnZlTm9kZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgZFg/OiBudW1iZXIgfCBBbmltQ3VydmU7XHJcbiAgICBkWT86IG51bWJlciB8IEFuaW1DdXJ2ZTtcclxuICAgIGRaPzogbnVtYmVyIHwgQW5pbUN1cnZlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltQ3VydmUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEtleVZlcj86IG51bWJlcjtcclxuICAgIERlZmF1bHQ/OiBudW1iZXI7XHJcbiAgICBLZXlUaW1lPzogQmlnSW50NjRBcnJheTtcclxuICAgIEtleVZhbHVlRmxvYXQ/OiBGbG9hdDMyQXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExheWVyRWxlbWVudCB7XHJcbiAgICBOYW1lOiBzdHJpbmc7XHJcbiAgICBWZXJzaW9uOiBudW1iZXI7XHJcbiAgICBNYXBwaW5nSW5mb3JtYXRpb25UeXBlOiBzdHJpbmc7XHJcbiAgICBSZWZlcmVuY2VJbmZvcm1hdGlvblR5cGU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50Tm9ybWFsIGV4dGVuZHMgTGF5ZXJFbGVtZW50IHtcclxuICAgIE5vcm1hbHM6IEZsb2F0MzJBcnJheTtcclxuICAgIE5vcm1hbHNXOiBGbG9hdDMyQXJyYXk7XHJcbiAgICBOb3JtYWxzSW5kZXg/OiBVaW50MTZBcnJheTsgLy8gVE9ETzogZmluZCBhbiBGQlggZmlsZSB3aGljaCB1c2VzIG5vcm1hbHMgaW5kZXhcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50VVYgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgVVY/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBVVkluZGV4PzogVWludDE2QXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExheWVyRWxlbWVudE1hdGVyaWFsIGV4dGVuZHMgTGF5ZXJFbGVtZW50IHtcclxuICAgIE1hdGVyaWFscz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIE1BUFBJTkdfSU5GT1JNQVRJT05fVFlQRSB7XHJcbiAgICBCWV9WRVJURVgsIEJZX1BPTFlHT04sIEJZX1BPTFlHT05fVkVSVEVYLCBCWV9FREdFLCBBTExfU0FNRVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gUkVGRVJFTkNFX0lORk9STUFUSU9OX1RZUEUge1xyXG4gICAgRElSRUNULCBJTkRFWF9UT19ESVJFQ1RcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbiB7XHJcbiAgICBwYXJlbnRVSUQ6IG51bWJlcjtcclxuICAgIGNoaWxkVUlEOiBudW1iZXI7XHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRGVmaW5pdGlvbnMge1xyXG4gICAgdmVyc2lvbjogbnVtYmVyO1xyXG4gICAgb2JqZWN0VHlwZXM6IE9iamVjdFR5cGVbXTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBjb3VudDogbnVtYmVyO1xyXG4gICAgcHJvcGVydHlUZW1wbGF0ZTogUHJvcGVydHlUZW1wbGF0ZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlUZW1wbGF0ZSB7XHJcbiAgICBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBQcm9wZXJ0eTcwO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFzc2V0IGxvYWRlciBmb3IgRmlsbWJveCBmaWxlcy5cclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZCWExvYWRlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb2FkZXJzOiB7IFt1cmk6IHN0cmluZ106IEZCWExvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IGZieDogRkJYLkZCWDtcclxuICAgIHB1YmxpYyByZWFkb25seSBub2RlczogRkJYLk5vZGVbXTtcclxuICAgIHB1YmxpYyByZWFkb25seSB1cmk6IHN0cmluZztcclxuXHJcbiAgICAjc2NlbmVzOiBHcmFwaFtdO1xyXG4gICAgI25vZGVzOiBOb2RlW107XHJcbiAgICAjbWVzaGVzOiBNZXNoRkJYW107XHJcbiAgICAjbWF0ZXJpYWxzOiBNYXRlcmlhbFtdO1xyXG4gICAgI3NraW5NYXRlcmlhbHM6IE1hdGVyaWFsW10gPSBbXTtcclxuICAgICN0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuICAgICNhbmltYXRpb25zOiBBbmltYXRpb25bXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2J1ZmZlcjogQXJyYXlCdWZmZXIsIF91cmk6IHN0cmluZykge1xyXG4gICAgICB0aGlzLnVyaSA9IF91cmk7XHJcbiAgICAgIHRoaXMubm9kZXMgPSBGQlgucGFyc2VOb2Rlc0Zyb21CaW5hcnkoX2J1ZmZlcik7XHJcbiAgICAgIERlYnVnLmxvZyh0aGlzLm5vZGVzKTtcclxuICAgICAgdGhpcy5mYnggPSBGQlgubG9hZEZyb21Ob2Rlcyh0aGlzLm5vZGVzKTtcclxuICAgICAgRGVidWcubG9nKHRoaXMuZmJ4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbCB8fCAodGhpcy4jZGVmYXVsdE1hdGVyaWFsID1cclxuICAgICAgICBuZXcgTWF0ZXJpYWwoXCJGQlhEZWZhdWx0TWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZCwgbmV3IENvYXRSZW1pc3NpdmUoQ29sb3IuQ1NTKFwid2hpdGVcIikpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBkZWZhdWx0U2tpbk1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgfHwgKHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPVxyXG4gICAgICAgIG5ldyBNYXRlcmlhbChcIkZCWERlZmF1bHRTa2luTWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZFNraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIExPQUQoX3VyaTogc3RyaW5nKTogUHJvbWlzZTxGQlhMb2FkZXI+IHtcclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnMpXHJcbiAgICAgICAgdGhpcy5sb2FkZXJzID0ge307XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzW191cmldKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goX3VyaSk7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5OiBBcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXJzW191cmldID0gbmV3IEZCWExvYWRlcihiaW5hcnksIF91cmkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlcnNbX3VyaV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFNjZW5lKF9pbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNzY2VuZXMpXHJcbiAgICAgICAgdGhpcy4jc2NlbmVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jc2NlbmVzW19pbmRleF0pIHtcclxuICAgICAgICBjb25zdCBkb2N1bWVudEZCWDogRkJYLkRvY3VtZW50ID0gdGhpcy5mYnguZG9jdW1lbnRzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGNvbnN0IHNjZW5lOiBHcmFwaCA9IG5ldyBHcmFwaChkb2N1bWVudEZCWC5uYW1lKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkRkJYIG9mIGRvY3VtZW50RkJYLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1vZGVsXCIpIHtcclxuICAgICAgICAgICAgc2NlbmUuYWRkQ2hpbGQoYXdhaXQgdGhpcy5nZXROb2RlKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzLmluZGV4T2YoY2hpbGRGQlgpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mYngub2JqZWN0cy5hbmltU3RhY2tzICYmIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBhbmltYXRpb246IEFuaW1hdGlvbiA9IGF3YWl0IHRoaXMuZ2V0QW5pbWF0aW9uKGRvY3VtZW50RkJYLkFjdGl2ZUFuaW1TdGFja05hbWUubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5maW5kSW5kZXgoX2FuaW1TdGFjayA9PiBfYW5pbVN0YWNrLm5hbWUgPT0gZG9jdW1lbnRGQlguQWN0aXZlQW5pbVN0YWNrTmFtZSkgOiAwKTtcclxuICAgICAgICAgIGlmIChhbmltYXRpb24pXHJcbiAgICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50QW5pbWF0b3IoYW5pbWF0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNrZWxldG9uIG9mIHRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChza2VsZXRvbik7XHJcblxyXG4gICAgICAgIFByb2plY3QucmVnaXN0ZXIoc2NlbmUpO1xyXG4gICAgICAgIHRoaXMuI3NjZW5lc1tfaW5kZXhdID0gc2NlbmU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjZW5lc1tfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXMpXHJcbiAgICAgICAgdGhpcy4jbm9kZXMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNub2Rlc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5vZGUgd2l0aCB0cmFuc2Zvcm1cclxuICAgICAgICBjb25zdCBtb2RlbEZCWDogRkJYLk1vZGVsID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHNbX2luZGV4XS5sb2FkKCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKG1vZGVsRkJYLm5hbWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUcmFuc2Zvcm0obW9kZWxGQlgsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMuI25vZGVzW19pbmRleF0gPSBub2RlO1xyXG5cclxuICAgICAgICAvLyBhdHRhY2ggY2hpbGRyZW4gYW5kIGNvbXBvbmVudHNcclxuICAgICAgICBpZiAobW9kZWxGQlguY2hpbGRyZW4pIGZvciAoY29uc3QgY2hpbGRGQlggb2YgbW9kZWxGQlguY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChjaGlsZEZCWC50eXBlID09IFwiTW9kZWxcIikge1xyXG4gICAgICAgICAgICBub2RlLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZSh0aGlzLmZieC5vYmplY3RzLm1vZGVscy5pbmRleE9mKGNoaWxkRkJYKSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZEZCWC50eXBlID09IFwiR2VvbWV0cnlcIikge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNoOiBNZXNoRkJYID0gYXdhaXQgdGhpcy5nZXRNZXNoKHRoaXMuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5pbmRleE9mKGNoaWxkRkJYKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBuZXcgQ29tcG9uZW50TWVzaChtZXNoKTtcclxuICAgICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudE1hdGVyaWFsKEZCWExvYWRlci5kZWZhdWx0TWF0ZXJpYWwpKTtcclxuICAgICAgICAgICAgaWYgKG1lc2gucmVuZGVyTWVzaC5ib25lcykge1xyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uKGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTtcclxuICAgICAgICAgICAgICAvLyBmb3IgKGNvbnN0IHN1YkRlZm9ybWVyRkJYIG9mIGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjb25zdCBib25lOiBOb2RlID0gY21wTWVzaC5za2VsZXRvbi5ib25lc1tzdWJEZWZvcm1lckZCWC5jaGlsZHJlblswXS5uYW1lXTtcclxuICAgICAgICAgICAgICAvLyAgIGJvbmUubXR4TG9jYWwuc2V0KHN1YkRlZm9ybWVyRkJYLlRyYW5zZm9ybUxpbmspO1xyXG4gICAgICAgICAgICAgIC8vICAgaWYgKGJvbmUuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgICAgICAgLy8gICAgIGJvbmUubXR4TG9jYWwubXVsdGlwbHkoYm9uZS5nZXRQYXJlbnQoKS5tdHhXb3JsZEludmVyc2UpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCkubWF0ZXJpYWwgPSBGQlhMb2FkZXIuZGVmYXVsdFNraW5NYXRlcmlhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChjbXBNZXNoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1hdGVyaWFsXCIpIHtcclxuICAgICAgICAgICAgLy8gVE9ETzogYWRkaXRpb25hbCBza2luIG1hdGVyaWFscyBnZXQgY3JlYXRlZCBoZXJlLCBjaGVjayBpZiB0aGUgb3JpZ2luYWwgbWF0ZXJpYWwgaXMgc3RpbGwgbmVlZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tYXRlcmlhbHMuaW5kZXhPZihjaGlsZEZCWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoaU1hdGVyaWFsKTtcclxuICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpLm1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubWVzaC5yZW5kZXJNZXNoLmJvbmVzID9cclxuICAgICAgICAgICAgICB0aGlzLiNza2luTWF0ZXJpYWxzW2lNYXRlcmlhbF0gfHwgKHRoaXMuI3NraW5NYXRlcmlhbHNbaU1hdGVyaWFsXSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5nZXRTaGFkZXIoKSA9PSBTaGFkZXJQaG9uZyA/XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nU2tpbiA6XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWRTa2luLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuY29hdFxyXG4gICAgICAgICAgICAgICkpIDpcclxuICAgICAgICAgICAgICBtYXRlcmlhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNtZXNoZXMpXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jbWVzaGVzW19pbmRleF0pXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzW19pbmRleF0gPSBhd2FpdCBuZXcgTWVzaEZCWCgpLmxvYWQodGhpcy51cmksIF9pbmRleCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXNoZXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWF0ZXJpYWwoX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbWF0ZXJpYWxzKVxyXG4gICAgICAgIHRoaXMuI21hdGVyaWFscyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI21hdGVyaWFsc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxGQlg6IEZCWC5NYXRlcmlhbCA9IHRoaXMuZmJ4Lm9iamVjdHMubWF0ZXJpYWxzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGlmICghKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpKVxyXG4gICAgICAgICAgbWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yPy5jaGlsZHJlblswXS5sb2FkKCk7XHJcbiAgICAgICAgLy8gRkJYIHN1cHBvcnRzIGxhbWJlcnQgYW5kIHBob25nIHNoYWRpbmcsIGVpdGhlciB3YXkgZnVkZ2UgaGFzIG5vIGxhbWJlcnQgc2hhZGVyIHNvIHdlIGFsd2F5cyB1c2UgcGhvbmcuXHJcbiAgICAgICAgLy8gSW4gRGlmZnVzZUNvbG9yIHRoZSB0ZXh0dXJlIG9mIHRoZSBtYXRlcmlhbCBjb2xvciBpcyBzdG9yZWQsIGlmIGl0J3MgZGVmaW5lZCB3ZSB1c2UgYSB0ZXh0dXJlIHNoYWRlci5cclxuICAgICAgICAvLyBUT0RPOiBtYXRlcmlhbEZCWCBhbHNvIGNvbnRhaW5zIGFkZGl0aW9uYWwgdmFsdWVzIGxpa2Ugc2hpbmluZXNzIGFuZCByZWZsZWN0aXZpdHkgKGFuZCBvdGhlcnMpIHdoaWNoIGFyZSBub3Qgc3VwcHBvcnRlZC5cclxuICAgICAgICB0aGlzLiNtYXRlcmlhbHNbX2luZGV4XSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLm5hbWUsXHJcbiAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgJiYgIShtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgaW5zdGFuY2VvZiBWZWN0b3IzKSA/XHJcbiAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWQgOlxyXG4gICAgICAgICAgICBTaGFkZXJQaG9uZyxcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciAmJiAhKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpID9cclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChcclxuICAgICAgICAgICAgICBuZXcgQ29sb3IoLi4ubWF0ZXJpYWxGQlguRGlmZnVzZS5nZXQoKSksXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXMuaW5kZXhPZihtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IpKSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlRmFjdG9yID8/IDEsXHJcbiAgICAgICAgICAgICAgbWF0ZXJpYWxGQlguU3BlY3VsYXJGYWN0b3IgPz8gYXZlcmFnZShtYXRlcmlhbEZCWC5TcGVjdWxhcj8uZ2V0KCkpID8/IDBcclxuICAgICAgICAgICAgKSA6XHJcbiAgICAgICAgICAgIG5ldyBDb2F0UmVtaXNzaXZlKFxyXG4gICAgICAgICAgICAgIG5ldyBDb2xvciguLi4obWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yIGFzIFZlY3RvcjMgPz8gbWF0ZXJpYWxGQlguRGlmZnVzZSkuZ2V0KCkpLFxyXG4gICAgICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VGYWN0b3IgPz8gMSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5TcGVjdWxhckZhY3RvciA/PyBhdmVyYWdlKG1hdGVyaWFsRkJYLlNwZWN1bGFyPy5nZXQoKSkgPz8gMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jbWF0ZXJpYWxzW19pbmRleF07XHJcblxyXG4gICAgICBmdW5jdGlvbiBhdmVyYWdlKF9hcnJheTogRmxvYXQzMkFycmF5KTogbnVtYmVyIHsgLy8gVE9ETzogc3BlY3VsYXIgZmFjdG9yIHZlY3RvciAodG9nZXRoZXIgd2l0aCBzcGVjdWxhciBjb2xvciB0ZXh0dXJlKSBpcyBub3Qgc3VwcG9ydGVkIHNvIHdlIHVzZSB0aGUgYXZlcmFnZSBvZiB0aGUgdmVjdG9yIHRvIGFwcHJveGltYXRlIGEgc2luZ3VsYXIgc3BlY3VsYXIgZmFjdG9yLlxyXG4gICAgICAgIGlmIChfYXJyYXkpXHJcbiAgICAgICAgICByZXR1cm4gX2FycmF5LnJlZHVjZSgoX2EsIF9iKSA9PiBfYSArIF9iKSAvIF9hcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXh0dXJlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxUZXh0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuI3RleHR1cmVzKVxyXG4gICAgICAgICAgdGhpcy4jdGV4dHVyZXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy4jdGV4dHVyZXNbX2luZGV4XSlcclxuICAgICAgICAgIHJldHVybiBfcmVzb2x2ZSh0aGlzLiN0ZXh0dXJlc1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9GQlg6IEZCWC5WaWRlbyA9IHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXNbX2luZGV4XS5jaGlsZHJlblswXTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIHRleHR1cmUuaW1hZ2Uub25sb2FkID0gKCkgPT4gX3Jlc29sdmUodGV4dHVyZSk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZS5vbmVycm9yID0gX3JlamVjdDtcclxuICAgICAgICB0ZXh0dXJlLmltYWdlLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZpZGVvRkJYLkNvbnRlbnRdLCB7IHR5cGU6IFwiaW1hZ2UvcG5nXCIgfSkpO1xyXG4gICAgICAgIHRoaXMuI3RleHR1cmVzW19pbmRleF0gPSB0ZXh0dXJlO1xyXG4gICAgICAgIC8vIFRPRE86IGdldCBhbmQgc2V0IG1pcG1hcCBpbmZvcm1hdGlvbiA/Pz9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvYmxlbTogbWVocmVyZSBEZWZvcm1lciB2ZXJ3ZWlzZW4gYXVmIGRhcyBzZWxiZSBTa2VsZXR0IGFiZXIgbnV0emVuIGRhYmVpIG5pY2h0IGltbWVyIGFsbGUgS25vY2hlblxyXG4gICAgLy8gPT4gUHJvYmxlbSBiZXN0ZWh0IGF1Y2ggaW0gR0xURkxvYWRlclxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWVmcyB0aGUgc2tlbGV0b24gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGltYiBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX2ZieExpbWJOb2RlOiBGQlguTW9kZWwpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9ucyA9IFtdO1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zLmZpbmQoX3NrZWxldG9uID0+IF9mYnhMaW1iTm9kZS5uYW1lIGluIF9za2VsZXRvbi5ib25lcykgfHwgYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBza2VsZXRvbjogQ29tcG9uZW50U2tlbGV0b24gPSBuZXcgQ29tcG9uZW50U2tlbGV0b24oKTsgLy8gbmV3IFNrZWxldG9uKGBTa2VsZXRvbiR7dGhpcy4jc2tlbGV0b25zLmxlbmd0aH1gKTtcclxuICAgICAgICBsZXQgcm9vdE5vZGU6IEZCWC5Nb2RlbCA9IF9mYnhMaW1iTm9kZTtcclxuICAgICAgICB3aGlsZSAocm9vdE5vZGUucGFyZW50cyAmJiByb290Tm9kZS5wYXJlbnRzLnNvbWUoX3BhcmVudCA9PiBfcGFyZW50LnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSlcclxuICAgICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC5zdWJ0eXBlID09IFwiTGltYk5vZGVcIik7XHJcbiAgICAgICAgY29uc3QgaVJvb3ROb2RlOiBudW1iZXIgPSB0aGlzLmZieC5vYmplY3RzLm1vZGVscy5maW5kSW5kZXgoX21vZGVsID0+IF9tb2RlbC5uYW1lID09IHJvb3ROb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYXdhaXQgdGhpcy5nZXROb2RlKGlSb290Tm9kZSkpIHtcclxuICAgICAgICAgIC8vIFRPRE86IG1heWJlIG1vdmUgdGhpcyBpbnRvIHRoZSBjb21wb25lbnQsIGFzIHRoaXMgaXMgcHJvYmFibHkgbmVlZGVkIGluIGdsdGYgaW1wb3J0IGFzd2VsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzW3RoaXMuI25vZGVzLmluZGV4T2Yobm9kZSldLnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhXb3JsZC5jb3B5KFxyXG4gICAgICAgICAgICAgICAgbm9kZS5jbXBUcmFuc2Zvcm0gP1xyXG4gICAgICAgICAgICAgICAgICBNYXRyaXg0eDQuUFJPRFVDVChwYXJlbnQubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpIDpcclxuICAgICAgICAgICAgICAgICAgcGFyZW50Lm10eFdvcmxkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgbm9kZS5tdHhXb3JsZEludmVyc2UuY29weShNYXRyaXg0eDQuSU5WRVJTRShub2RlLm10eFdvcmxkKSk7XHJcbiAgICAgICAgICAgIHNrZWxldG9uLmFkZEJvbmUobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMucHVzaChza2VsZXRvbik7XHJcbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xyXG4gICAgICB9KSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb24oX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnMpXHJcbiAgICAgICAgdGhpcy4jYW5pbWF0aW9ucyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnNbX2luZGV4XSkge1xyXG4gICAgICAgIGNvbnN0IGFuaW1TdGFjazogRkJYLk9iamVjdCA9IHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrc1tfaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGFuaW1Ob2Rlc0ZCWDogRkJYLkFuaW1DdXJ2ZU5vZGVbXSA9IGFuaW1TdGFjay5jaGlsZHJlblswXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgICAgbGV0IGZieEFuaW1Ob2RlR3JvdXBlZDogTWFwPEZCWC5Nb2RlbCwgRkJYLkFuaW1DdXJ2ZU5vZGVbXT4gPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmYnhBbmltTm9kZSBvZiBhbmltTm9kZXNGQlgpIHtcclxuICAgICAgICAgIGNvbnN0IGtleTogRkJYLk1vZGVsID0gZmJ4QW5pbU5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICBpZiAoa2V5ID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBpZiAoIWZieEFuaW1Ob2RlR3JvdXBlZC5oYXMoa2V5KSlcclxuICAgICAgICAgICAgZmJ4QW5pbU5vZGVHcm91cGVkLnNldChrZXksIFtdKTtcclxuICAgICAgICAgIGZieEFuaW1Ob2RlR3JvdXBlZC5nZXQoa2V5KS5wdXNoKGZieEFuaW1Ob2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvblN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2ZieE1vZGVsLCBmYnhBbmltTm9kZXNdIG9mIGZieEFuaW1Ob2RlR3JvdXBlZCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50OiBGQlguTW9kZWwgPSBmYnhNb2RlbC5wYXJlbnRzLmZpbmQoX3BhcmVudCA9PiBfcGFyZW50LnR5cGUgPT0gXCJNb2RlbFwiKTtcclxuICAgICAgICAgIGxldCBwYXRoOiBGQlguTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgcGF0aC5wdXNoKGZieE1vZGVsKTtcclxuICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChwYXJlbnQpO1xyXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCBmYnhQYXRoTW9kZWwgb2YgcGF0aC5yZXZlcnNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoY3VycmVudFN0cnVjdHVyZS5jaGlsZHJlbiBhcyBBbmltYXRpb25TdHJ1Y3R1cmUpW2ZieFBhdGhNb2RlbC5uYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gYXMgQW5pbWF0aW9uU3RydWN0dXJlKVtmYnhQYXRoTW9kZWwubmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZSA9IChjdXJyZW50U3RydWN0dXJlLmNoaWxkcmVuIGFzIEFuaW1hdGlvblN0cnVjdHVyZSlbZmJ4UGF0aE1vZGVsLm5hbWVdIGFzIEFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmYnhQYXRoTW9kZWwgPT0gZmJ4TW9kZWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtdHhMb2NhbDogQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgPSB7fTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZieEFuaW1Ob2RlIG9mIGZieEFuaW1Ob2RlcylcclxuICAgICAgICAgICAgICAgIG10eExvY2FsW3tcclxuICAgICAgICAgICAgICAgICAgVDogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgICBSOiBcInJvdGF0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFM6IFwic2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgfVtmYnhBbmltTm9kZS5uYW1lXV0gPSB0aGlzLmdldEFuaW1hdGlvblZlY3RvcjMoZmJ4QW5pbU5vZGUsIGZieFBhdGhNb2RlbCk7XHJcbiAgICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZS5jb21wb25lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50VHJhbnNmb3JtOiBbXHJcbiAgICAgICAgICAgICAgICAgIHsgbXR4TG9jYWw6IG10eExvY2FsIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNhbmltYXRpb25zW19pbmRleF0gPSBuZXcgQW5pbWF0aW9uKGFuaW1TdGFjay5uYW1lLCBhbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiNhbmltYXRpb25zW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmZXRjaGVkIGZyb20gdGhyZWUuanMsIGFkYXB0ZWQgdG8gRlVER0UgYW5kIG9wdGltaXplZFxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL2Rldi9leGFtcGxlcy9qc20vbG9hZGVycy9GQlhMb2FkZXIuanNcclxuICAgICAqIGxpbmUgMzk1MFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlVHJhbnNmb3JtKF9tb2RlbEZCWDogRkJYLk1vZGVsLCBfbm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBwYXJlbnRJbmRleDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHMuaW5kZXhPZihfbW9kZWxGQlgucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIikpO1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IE5vZGUgPSBwYXJlbnRJbmRleCA+PSAwID8gYXdhaXQgdGhpcy5nZXROb2RlKHBhcmVudEluZGV4KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eExvY2FsUm90YXRpb246IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5QcmVSb3RhdGlvbiB8fCBfbW9kZWxGQlguTGNsUm90YXRpb24gfHwgX21vZGVsRkJYLlBvc3RSb3RhdGlvbiA/XHJcbiAgICAgICAgTWF0cml4NHg0LklERU5USVRZKCkgOlxyXG4gICAgICAgIHVuZGVmaW5lZDtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5QcmVSb3RhdGlvbikge1xyXG4gICAgICAgIG10eExvY2FsUm90YXRpb24ucm90YXRlKHRoaXMuZ2V0T3JkZXJlZChfbW9kZWxGQlguUHJlUm90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsUm90YXRpb24pIHtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLnJvdGF0ZSh0aGlzLmdldE9yZGVyZWQodGhpcy5nZXRUcmFuc2Zvcm1WZWN0b3IoX21vZGVsRkJYLkxjbFJvdGF0aW9uLCBWZWN0b3IzLlpFUk8pLCBfbW9kZWxGQlgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX21vZGVsRkJYLlBvc3RSb3RhdGlvbikge1xyXG4gICAgICAgIGxldCBtdHhQb3N0Um90YXRpb25JbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04odGhpcy5nZXRPcmRlcmVkKF9tb2RlbEZCWC5Qb3N0Um90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICAgIG10eFBvc3RSb3RhdGlvbkludmVyc2UgPSBNYXRyaXg0eDQuSU5WRVJTRShtdHhQb3N0Um90YXRpb25JbnZlcnNlKTtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLm11bHRpcGx5KG10eFBvc3RSb3RhdGlvbkludmVyc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtdHhMb2NhbFNjYWxpbmc6IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5MY2xTY2FsaW5nID9cclxuICAgICAgICBNYXRyaXg0eDQuU0NBTElORyh0aGlzLmdldFRyYW5zZm9ybVZlY3RvcihfbW9kZWxGQlguTGNsU2NhbGluZywgVmVjdG9yMy5PTkUpKSA6XHJcbiAgICAgICAgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY29uc3QgbXR4UGFyZW50V29ybGRSb3RhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID8gTWF0cml4NHg0LlJPVEFUSU9OKHBhcmVudC5tdHhXb3JsZC5yb3RhdGlvbikgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBjb25zdCBtdHhQYXJlbnRXb3JsZFNjYWxlOiBNYXRyaXg0eDQgPSBwYXJlbnQgPyAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG10eFBhcmVudFdvcmxkU2NhbGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUudHJhbnNsYXRlKFZlY3RvcjMuU0NBTEUocGFyZW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCAtMSkpO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUubXVsdGlwbHkocGFyZW50Lm10eFdvcmxkKTtcclxuICAgICAgICByZXR1cm4gbXR4UGFyZW50V29ybGRTY2FsZTtcclxuICAgICAgfSkoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFdvcmxkUm90YXRpb25TY2FsZTogTWF0cml4NHg0ID0gcGFyZW50IHx8IG10eExvY2FsUm90YXRpb24gfHwgbXR4TG9jYWxTY2FsaW5nID8gTWF0cml4NHg0LklERU5USVRZKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChwYXJlbnQgfHwgbXR4TG9jYWxSb3RhdGlvbiB8fCBtdHhMb2NhbFNjYWxpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmhlcml0VHlwZTogbnVtYmVyID0gX21vZGVsRkJYLkluaGVyaXRUeXBlIHx8IDA7XHJcbiAgICAgICAgaWYgKGluaGVyaXRUeXBlID09IDApIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluaGVyaXRUeXBlID09IDEpIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsUm90YXRpb24pO1xyXG4gICAgICAgICAgaWYgKG10eExvY2FsU2NhbGluZylcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFNjYWxlKTtcclxuICAgICAgICAgICAgbGV0IG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKHBhcmVudC5tdHhMb2NhbC5zY2FsaW5nKTtcclxuICAgICAgICAgICAgbXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2UpO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeFxyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjM7XHJcbiAgICAgIHRyYW5zbGF0aW9uID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKHRoaXMuZ2V0VHJhbnNmb3JtVmVjdG9yKF9tb2RlbEZCWC5MY2xUcmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKSk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25PZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5Sb3RhdGlvbk9mZnNldCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25QaXZvdClcclxuICAgICAgICB0cmFuc2xhdGlvbi5hZGQoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG5cclxuICAgICAgY29uc3QgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuVFJBTlNMQVRJT04odHJhbnNsYXRpb24pO1xyXG4gICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcblxyXG4gICAgICB0cmFuc2xhdGlvbiA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uc3VidHJhY3QoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlNjYWxpbmdPZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nT2Zmc2V0KTtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0udHJhbnNsYXRlKHRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIGlmIChtdHhMb2NhbFNjYWxpbmcpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguU2NhbGluZ1Bpdm90KVxyXG4gICAgICAgIG10eFRyYW5zZm9ybS50cmFuc2xhdGUoVmVjdG9yMy5TQ0FMRShfbW9kZWxGQlguU2NhbGluZ1Bpdm90LCAtMSkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4V29ybGRUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID9cclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oTWF0cml4NHg0LlBST0RVQ1QoXHJcbiAgICAgICAgICBwYXJlbnQubXR4V29ybGQsXHJcbiAgICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgICkudHJhbnNsYXRpb24pIDpcclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIG10eFRyYW5zZm9ybS5jb3B5KG10eFdvcmxkVHJhbnNsYXRpb24pO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4V29ybGRSb3RhdGlvblNjYWxlKTtcclxuICAgICAgX25vZGUubXR4V29ybGQuY29weShtdHhUcmFuc2Zvcm0pO1xyXG5cclxuICAgICAgaWYgKHBhcmVudClcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkoTWF0cml4NHg0LklOVkVSU0UocGFyZW50Lm10eFdvcmxkKSwgdHJ1ZSk7XHJcbiAgICAgIF9ub2RlLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50VHJhbnNmb3JtKG10eFRyYW5zZm9ybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJhbnNmb3JtVmVjdG9yKF92ZWN0b3I6IFZlY3RvcjMgfCBGQlguQW5pbUN1cnZlTm9kZSwgX2RlZmF1bHQ6ICgpID0+IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBfdmVjdG9yID09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICBfZGVmYXVsdCgpIDpcclxuICAgICAgICAgIF92ZWN0b3IgaW5zdGFuY2VvZiBWZWN0b3IzID9cclxuICAgICAgICAgICAgX3ZlY3RvciA6XHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzKFxyXG4gICAgICAgICAgICAgIHR5cGVvZiAoX3ZlY3RvciA9IF92ZWN0b3IubG9hZCgpKS5kWCA9PSBcIm51bWJlclwiID9cclxuICAgICAgICAgICAgICAgIF92ZWN0b3IuZFggOlxyXG4gICAgICAgICAgICAgICAgKF92ZWN0b3IuZFgubG9hZCgpIGFzIEZCWC5BbmltQ3VydmUpLkRlZmF1bHQsXHJcbiAgICAgICAgICAgICAgdHlwZW9mIF92ZWN0b3IuZFkgPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICAgICAgICBfdmVjdG9yLmRZIDpcclxuICAgICAgICAgICAgICAgIChfdmVjdG9yLmRZLmxvYWQoKSBhcyBGQlguQW5pbUN1cnZlKS5EZWZhdWx0LFxyXG4gICAgICAgICAgICAgIHR5cGVvZiBfdmVjdG9yLmRaID09IFwibnVtYmVyXCIgP1xyXG4gICAgICAgICAgICAgICAgX3ZlY3Rvci5kWiA6XHJcbiAgICAgICAgICAgICAgICAoX3ZlY3Rvci5kWi5sb2FkKCkgYXMgRkJYLkFuaW1DdXJ2ZSkuRGVmYXVsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBbmltYXRpb25WZWN0b3IzKF9hbmltTm9kZTogRkJYLkFuaW1DdXJ2ZU5vZGUsIF90YXJnZXQ6IEZCWC5Nb2RlbCk6IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvclNlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCB2YWx1ZU5hbWUgaW4gX2FuaW1Ob2RlKSBpZiAodmFsdWVOYW1lID09IFwiZFhcIiB8fCB2YWx1ZU5hbWUgPT0gXCJkWVwiIHx8IHZhbHVlTmFtZSA9PSBcImRaXCIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTogRkJYLkFuaW1DdXJ2ZSB8IG51bWJlciA9IF9hbmltTm9kZVt2YWx1ZU5hbWVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmFsdWUuS2V5VGltZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlZmVyZW5jZSB0aW1lIGlzIGRlZmluZWQgYXMgYSBzaWduZWQgaW50NjQsIHVuaXQgYmVpbmcgMS80NjE4NjE1ODAwMCBzZWNvbmRzXHJcbiAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICAgICAgICAgIHNlcXVlbmNlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KFxyXG4gICAgICAgICAgICAgIE51bWJlcigodmFsdWUuS2V5VGltZVtpXSAtIHZhbHVlLktleVRpbWUucmVkdWNlKChfbWluLCBfdikgPT4gX3YgPCBfbWluID8gX3YgOiBfbWluKSkgLyBCaWdJbnQoXCI0NjE4NjE1OFwiKSksXHJcbiAgICAgICAgICAgICAgdmFsdWUuS2V5VmFsdWVGbG9hdFtpXVxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZlY3RvclNlcXVlbmNlW3ZhbHVlTmFtZVsxXS50b0xvd2VyQ2FzZSgpXSA9IHNlcXVlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKF9hbmltTm9kZS5uYW1lID09IFwiUlwiICYmIChfdGFyZ2V0LlByZVJvdGF0aW9uIHx8IF90YXJnZXQuUG9zdFJvdGF0aW9uKSkge1xyXG4gICAgICAgIGxldCBwcmVSb3RvdGF0aW9uOiBNYXRyaXg0eDQ7XHJcbiAgICAgICAgaWYgKF90YXJnZXQuUHJlUm90YXRpb24pXHJcbiAgICAgICAgICBwcmVSb3RvdGF0aW9uID0gTWF0cml4NHg0LlJPVEFUSU9OKF90YXJnZXQuUHJlUm90YXRpb24pO1xyXG4gICAgICAgIGxldCBwb3N0Um90YXRpb246IE1hdHJpeDR4NDtcclxuICAgICAgICBpZiAoX3RhcmdldC5Qb3N0Um90YXRpb24pXHJcbiAgICAgICAgICBwb3N0Um90YXRpb24gPSBNYXRyaXg0eDQuUk9UQVRJT04oX3RhcmdldC5Qb3N0Um90YXRpb24pO1xyXG5cclxuICAgICAgICBbdmVjdG9yU2VxdWVuY2UueCwgdmVjdG9yU2VxdWVuY2UueSwgdmVjdG9yU2VxdWVuY2Uuel1cclxuICAgICAgICAgIC5mbGF0TWFwKF9zZXEgPT4gX3NlcT8uZ2V0S2V5cygpKVxyXG4gICAgICAgICAgLm1hcChfa2V5ID0+IF9rZXk/LnRpbWUpXHJcbiAgICAgICAgICAuc29ydCgoX3RpbWVBLCBfdGltZUIpID0+IF90aW1lQSAtIF90aW1lQikgLy8gc29ydCB0aW1lc1xyXG4gICAgICAgICAgLmZpbHRlcigoX3RpbWUsIF9pbmRleCwgX3RpbWVzKSA9PiBfdGltZSAhPSBfdGltZXNbX2luZGV4ICsgMV0pIC8vIHJlbW92ZSBkdXBsaWNhdGVzXHJcbiAgICAgICAgICAubWFwKF90aW1lID0+IHsgLy8gZmluZCBrZXlzIGZvciBhbGwgYXhlcyBhdCB0aW1lXHJcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueCksIHk6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueSksIHo6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueikgfTtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZmluZEtleShfc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgICAgICAgICByZXR1cm4gX3NlcXVlbmNlPy5nZXRLZXlzKCkuZmluZChfa2V5ID0+IF9rZXkudGltZSA9PSBfdGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZm9yRWFjaChfZnJhbWUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmN0RXVsZXJBbmdsZXM6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgICAgICAgIHZjdEV1bGVyQW5nbGVzLnNldChcclxuICAgICAgICAgICAgICBfZnJhbWUueD8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUueT8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUuej8udmFsdWUgPz8gMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKHZjdEV1bGVyQW5nbGVzKTtcclxuICAgICAgICAgICAgaWYgKHByZVJvdG90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocHJlUm90b3RhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChwb3N0Um90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocG9zdFJvdGF0aW9uKTtcclxuICAgICAgICAgICAgdmN0RXVsZXJBbmdsZXMgPSBtdHhSb3RhdGlvbi5yb3RhdGlvbjtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS54KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS54LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueDtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS55KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS55LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueTtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS56KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS56LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMuejtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmVjdG9yU2VxdWVuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPcmRlcmVkKF9yb3RhdGlvbjogVmVjdG9yMywgX21vZGVsRkJYOiBGQlguTW9kZWwpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKCFfbW9kZWxGQlguRXVsZXJPcmRlcilcclxuICAgICAgICByZXR1cm4gX3JvdGF0aW9uO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gX3JvdGF0aW9uLmdldCgpO1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWlwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWVwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWFwiKV1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtbm9kZXMgY29udGFpbmluZyBpdHMgbmFtZSwgY2hpbGRyZW4gYW5kIHByb3BlcnRpZXMuXHJcbiAgICogQ2hpbGRyZW4gYW5kIHByb3Blcml0ZXMgYXJlIGxhenkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBOb2RlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHByaXZhdGUgbG9hZFByb3BlcnRpZXM6ICgpID0+IE5vZGVQcm9wZXJ0eVtdO1xyXG4gICAgcHJpdmF0ZSBsb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXTtcclxuICAgIFxyXG4gICAgI2NoaWxkcmVuOiBOb2RlW107XHJcbiAgICAjcHJvcGVydGllczogTm9kZVByb3BlcnR5W107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9sb2FkUHJvcGVydGllczogKCkgPT4gTm9kZVByb3BlcnR5W10sIF9sb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXSkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5sb2FkUHJvcGVydGllcyA9IF9sb2FkUHJvcGVydGllcztcclxuICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4gPSBfbG9hZENoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBOb2RlUHJvcGVydHlbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0aWVzIHx8ICh0aGlzLiNwcm9wZXJ0aWVzID0gdGhpcy5sb2FkUHJvcGVydGllcygpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IE5vZGVbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbiB8fCAodGhpcy4jY2hpbGRyZW4gPSB0aGlzLmxvYWRDaGlsZHJlbigpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCB0eXBlIFByb3BlcnR5NzAgPSBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgRnVkZ2VDb3JlLlZlY3RvcjM7XHJcblxyXG4gIGV4cG9ydCB0eXBlIE5vZGVQcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBGbG9hdDMyQXJyYXk7XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFSUkFZX0VOQ09ESU5HIHtcclxuICAgIFVOQ09NUFJFU1NFRCwgQ09NUFJFU1NFRFxyXG4gIH1cclxuICBcclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFuIGZieCBmaWxlIGZyb20gaXRzIGZieC1ub2RlIGFycmF5IHdoaWNoIG1heSBiZSByZXRyaWV2ZWQgYnkgcGFyc2VOb2Rlc0Zyb21CaW5hcnkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBsb2FkRnJvbU5vZGVzKF9ub2RlczogTm9kZVtdKTogRkJYIHtcclxuICAgIGNvbnN0IGZieDogRkJYID0ge1xyXG4gICAgICBkb2N1bWVudHM6IHVuZGVmaW5lZCxcclxuICAgICAgb2JqZWN0czoge1xyXG4gICAgICAgIGFsbDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vZGVsczogW10sXHJcbiAgICAgICAgZ2VvbWV0cmllczogW10sXHJcbiAgICAgICAgbWF0ZXJpYWxzOiBbXSxcclxuICAgICAgICBwb3NlczogW10sXHJcbiAgICAgICAgdGV4dHVyZXM6IFtdLFxyXG4gICAgICAgIGFuaW1TdGFja3M6IFtdXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbm5lY3Rpb25zOiB1bmRlZmluZWRcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIF9ub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5uYW1lID09IFwiRG9jdW1lbnRzXCIpXHJcbiAgICAgICAgZmJ4LmRvY3VtZW50cyA9IG5vZGUuY2hpbGRyZW5cclxuICAgICAgICAgIC5maWx0ZXIoX2RvY3VtZW50Tm9kZSA9PiBfZG9jdW1lbnROb2RlLm5hbWUgPT0gXCJEb2N1bWVudFwiKVxyXG4gICAgICAgICAgLm1hcChfZG9jdW1lbnROb2RlID0+IGdldERvY3VtZW50KF9kb2N1bWVudE5vZGUpKTtcclxuICAgICAgZWxzZSBpZiAobm9kZS5uYW1lID09IFwiT2JqZWN0c1wiKVxyXG4gICAgICAgIGZieC5vYmplY3RzLmFsbCA9IG5vZGUuY2hpbGRyZW4ubWFwKF9vYmplY3ROb2RlID0+IGdldE9iamVjdChfb2JqZWN0Tm9kZSwgZmJ4KSk7XHJcbiAgICAgIGVsc2UgaWYgKG5vZGUubmFtZSA9PSBcIkNvbm5lY3Rpb25zXCIpXHJcbiAgICAgICAgZmJ4LmNvbm5lY3Rpb25zID0gbm9kZS5jaGlsZHJlbi5tYXAoX2Nvbm5lY3Rpb25Ob2RlID0+IGdldENvbm5lY3Rpb24oX2Nvbm5lY3Rpb25Ob2RlKSk7XHJcbiAgICAgIGlmIChmYnguZG9jdW1lbnRzICYmIGZieC5vYmplY3RzLmFsbCAmJiBmYnguY29ubmVjdGlvbnMpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXBPYmplY3RzKGZieCk7XHJcbiAgICBhcHBseUNvbm5lY3Rpb25zKGZieC5jb25uZWN0aW9ucywgZmJ4LmRvY3VtZW50cywgZmJ4Lm9iamVjdHMuYWxsKTtcclxuXHJcbiAgICByZXR1cm4gZmJ4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoX25vZGU6IE5vZGUpOiBEb2N1bWVudCB7XHJcbiAgICBjb25zdCBkb2N1bWVudDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBfbm9kZS5wcm9wZXJ0aWVzWzJdIGFzIHN0cmluZyxcclxuICAgICAgbG9hZGVkOiBmYWxzZSxcclxuICAgICAgbG9hZDogKCkgPT4gbG9hZE9iamVjdFByb3BlcnRpZXMoX25vZGUsIGRvY3VtZW50KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBkb2N1bWVudDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldE9iamVjdChfbm9kZTogTm9kZSwgX2ZieDogRkJYKTogT2JqZWN0IHtcclxuICAgIGNvbnN0IG5hbWVBbmRUeXBlOiBzdHJpbmdbXSA9IChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykuc3BsaXQoXCI6OlwiKTtcclxuICAgIGNvbnN0IG9iamVjdDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBuYW1lQW5kVHlwZVswXSxcclxuICAgICAgdHlwZTogbmFtZUFuZFR5cGVbMV0sXHJcbiAgICAgIHN1YnR5cGU6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgc3RyaW5nLFxyXG4gICAgICBsb2FkZWQ6IGZhbHNlLFxyXG4gICAgICBsb2FkOiAoKSA9PiBsb2FkT2JqZWN0UHJvcGVydGllcyhfbm9kZSwgb2JqZWN0KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBncm91cE9iamVjdHMoX2ZieDogRkJYKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBfZmJ4Lm9iamVjdHMuYWxsKSB7XHJcbiAgICAgIGlmIChvYmplY3QudHlwZSA9PSBcIk1vZGVsXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLm1vZGVscy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiR2VvbWV0cnlcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiTWF0ZXJpYWxcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMubWF0ZXJpYWxzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJQb3NlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnBvc2VzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJUZXh0dXJlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnRleHR1cmVzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJBbmltU3RhY2tcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5wdXNoKG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKF9ub2RlOiBOb2RlKTogQ29ubmVjdGlvbiB7XHJcbiAgICBpZiAoIShfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT09cIiB8fCBfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT1BcIikpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBDb25uZWN0aW9uIHR5cGUgJHtfbm9kZS5wcm9wZXJ0aWVzWzBdfSBpcyBub3Qgc3VwcG9ydGVkYCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2hpbGRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMV0gYXMgbnVtYmVyLFxyXG4gICAgICBwYXJlbnRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgbnVtYmVyLFxyXG4gICAgICBwcm9wZXJ0eU5hbWU6IF9ub2RlLnByb3BlcnRpZXNbMF0gPT0gXCJPUFwiID8gX25vZGUucHJvcGVydGllc1szXSBhcyBzdHJpbmcgOiBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXBwbHlDb25uZWN0aW9ucyhfY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXSwgX2RvY3VtZW50czogRG9jdW1lbnRbXSwgX29iamVjdHM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgX2Nvbm5lY3Rpb25zKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IE9iamVjdCA9IF9kb2N1bWVudHMuZmluZChfZG9jdW1lbnQgPT4gX2RvY3VtZW50LmxvYWQoKS5Sb290Tm9kZSA9PSBjb25uZWN0aW9uLnBhcmVudFVJRCkgYXMgT2JqZWN0O1xyXG4gICAgICBsZXQgY2hpbGQ6IE9iamVjdDtcclxuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgX29iamVjdHMpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09IHVuZGVmaW5lZCAmJiBvYmplY3QudWlkID09IGNvbm5lY3Rpb24ucGFyZW50VUlEKVxyXG4gICAgICAgICAgcGFyZW50ID0gb2JqZWN0O1xyXG4gICAgICAgIGlmIChjaGlsZCA9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnVpZCA9PSBjb25uZWN0aW9uLmNoaWxkVUlEKVxyXG4gICAgICAgICAgY2hpbGQgPSBvYmplY3Q7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQgJiYgY2hpbGQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkKVxyXG4gICAgICAgIChjaGlsZC5wYXJlbnRzIHx8IChjaGlsZC5wYXJlbnRzID0gW10pKS5wdXNoKHBhcmVudCk7XHJcbiAgICAgIGlmIChjb25uZWN0aW9uLnByb3BlcnR5TmFtZSA9PSBudWxsKVxyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgKHBhcmVudC5jaGlsZHJlbiA9IFtdKSkucHVzaChjaGlsZCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAocGFyZW50IGFzIE9iamVjdClbZm9ybWF0UHJvcGVydHlOYW1lKGNvbm5lY3Rpb24ucHJvcGVydHlOYW1lKV0gPSBjaGlsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxvYWRPYmplY3RQcm9wZXJ0aWVzKF9ub2RlOiBOb2RlLCBfb2JqZWN0OiBPYmplY3QpOiBPYmplY3Qge1xyXG4gICAgaWYgKF9vYmplY3QubG9hZGVkKVxyXG4gICAgICByZXR1cm4gX29iamVjdDtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgX25vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLm5hbWUgPT0gXCJQcm9wZXJ0aWVzNzBcIilcclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5NzAgb2YgY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShwcm9wZXJ0eTcwLnByb3BlcnRpZXNbMF0gYXMgc3RyaW5nKTtcclxuICAgICAgICAgIGlmICghX29iamVjdFtuYW1lXSlcclxuICAgICAgICAgICAgX29iamVjdFtuYW1lXSA9IGdldFByb3BlcnR5NzBWYWx1ZShwcm9wZXJ0eTcwKTtcclxuICAgICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShjaGlsZC5uYW1lKTtcclxuICAgICAgICBpZiAoIV9vYmplY3RbbmFtZV0pXHJcbiAgICAgICAgICBfb2JqZWN0W25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIF9vYmplY3QubG9hZGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBfb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShfbm9kZTogTm9kZSk6IE5vZGVQcm9wZXJ0eSB8IE9iamVjdCB7XHJcbiAgICByZXR1cm4gX25vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxyXG4gICAgICA/IF9ub2RlLmNoaWxkcmVuLnJlZHVjZShcclxuICAgICAgICAoX3N1YlByb3BlcnRpZXMsIF9zdWJQcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gZm9ybWF0UHJvcGVydHlOYW1lKF9zdWJQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgIGlmIChfc3ViUHJvcGVydGllc1tuYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShfc3ViUHJvcGVydHkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKF9zdWJQcm9wZXJ0aWVzW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpKVxyXG4gICAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gW19zdWJQcm9wZXJ0aWVzW25hbWVdIGFzIE9iamVjdF07XHJcbiAgICAgICAgICAgIChfc3ViUHJvcGVydGllc1tuYW1lXSBhcyBPYmplY3RbXSkucHVzaChnZXRQcm9wZXJ0eVZhbHVlKF9zdWJQcm9wZXJ0eSkgYXMgT2JqZWN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfc3ViUHJvcGVydGllcztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHt9IGFzIE9iamVjdFxyXG4gICAgICApXHJcbiAgICAgIDogX25vZGUucHJvcGVydGllc1swXTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFByb3BlcnR5NzBWYWx1ZShfbm9kZTogTm9kZSk6IFByb3BlcnR5NzAge1xyXG4gICAgc3dpdGNoIChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykge1xyXG4gICAgICBjYXNlIFwiYm9vbFwiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIGJvb2xlYW47XHJcblxyXG4gICAgICBjYXNlIFwiaW50XCI6XHJcbiAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgIGNhc2UgXCJVTG9uZ0xvbmdcIjpcclxuICAgICAgY2FzZSBcImRvdWJsZVwiOlxyXG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XHJcbiAgICAgIGNhc2UgXCJGaWVsZE9mVmlld1wiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIG51bWJlcjtcclxuXHJcbiAgICAgIGNhc2UgXCJDb2xvclwiOlxyXG4gICAgICBjYXNlIFwiQ29sb3JSR0JcIjpcclxuICAgICAgY2FzZSBcIlZlY3RvcjNEXCI6XHJcbiAgICAgIGNhc2UgXCJMY2wgVHJhbnNsYXRpb25cIjpcclxuICAgICAgY2FzZSBcIkxjbCBSb3RhdGlvblwiOlxyXG4gICAgICBjYXNlIFwiTGNsIFNjYWxpbmdcIjpcclxuICAgICAgICByZXR1cm4gbmV3IEZ1ZGdlQ29yZS5WZWN0b3IzKC4uLl9ub2RlLnByb3BlcnRpZXMuc2xpY2UoNCwgNykgYXMgbnVtYmVyW10pO1xyXG5cclxuICAgICAgY2FzZSBcIktTdHJpbmdcIjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gX25vZGUucHJvcGVydGllc1s0XSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eU5hbWUoX25hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX25hbWUucmVwbGFjZSgvW15hLXpBLVpdLywgXCJcIik7XHJcbiAgfVxyXG5cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBmYngtbm9kZXMgYXJyYXkgZnJvbSBhIGJpbmFyeSBmYngtZmlsZS5cclxuICAgKiBkZXNwaXRlIHRoZSBsYXp5IG5vZGUgaW1wbGVtZW50YXRpb24gaXQgaXMgbW9zdGx5IGEgY29weSBvZiB0aGUgcmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vcGljb2RlNy9mYngtcGFyc2VyXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyOiBBcnJheUJ1ZmZlcik6IE5vZGVbXSB7XHJcbiAgICBpZiAoX2J1ZmZlci5ieXRlTGVuZ3RoIDwgYmluYXJ5U3RhcnRDaGFycy5sZW5ndGgpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgZGF0YTogQnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihfYnVmZmVyKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcnM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmdldFNlcXVlbmNlKGRhdGEuZ2V0VWludDgsIGJpbmFyeVN0YXJ0Q2hhcnMubGVuZ3RoKSk7XHJcbiAgICBjb25zdCBtYXRjaGVzRkJYQmluYXJ5Rmlyc3RDaGFyczogYm9vbGVhblxyXG4gICAgICA9IGZpcnN0Q2hhcnMuZXZlcnkoKF92YWx1ZSwgX2luZGV4KSA9PiBfdmFsdWUgPT0gYmluYXJ5U3RhcnRDaGFyc1tfaW5kZXhdKTtcclxuICAgIGlmICghbWF0Y2hlc0ZCWEJpbmFyeUZpcnN0Q2hhcnMpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQ6IGJvb2xlYW4gPSB2ZXJzaW9uID49IDc1MDA7IC8vIFdhcnVtID49IDc1MDA/XHJcbiAgICBjb25zdCBub2RlczogTm9kZVtdID0gW107XHJcblxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHJlYWROb2RlKGRhdGEsIG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQpO1xyXG4gICAgICBpZiAobm9kZSA9PSBudWxsKSBicmVhaztcclxuICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkTm9kZShfZGF0YTogQnVmZmVyUmVhZGVyLCBfYXR0cmlidXRlc0FzVWludDY0OiBib29sZWFuKTogTm9kZSB7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBpZiAoZW5kT2Zmc2V0ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHByb3BlcnRpZXNMZW5ndGg6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzQnl0ZUxlbmd0aDogbnVtYmVyID0gX2F0dHJpYnV0ZXNBc1VpbnQ2NCA/IE51bWJlcihfZGF0YS5nZXRVaW50NjQoKSkgOiBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5hbWVMZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQ4KCk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBfZGF0YS5nZXRTdHJpbmcobmFtZUxlbmd0aCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzT2Zmc2V0OiBudW1iZXIgPSBfZGF0YS5vZmZzZXQ7XHJcbiAgICBjb25zdCBjaGlsZHJlbk9mZnNldDogbnVtYmVyID0gcHJvcGVydGllc09mZnNldCArIHByb3BlcnRpZXNCeXRlTGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSBuZXcgTm9kZShcclxuICAgICAgbmFtZSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIF9kYXRhLm9mZnNldCA9IHByb3BlcnRpZXNPZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllczogTm9kZVByb3BlcnR5W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpUHJvcGVydHk6IG51bWJlciA9IDA7IGlQcm9wZXJ0eSA8IHByb3BlcnRpZXNMZW5ndGg7IGlQcm9wZXJ0eSsrKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocmVhZFByb3BlcnR5KF9kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgX2RhdGEub2Zmc2V0ID0gY2hpbGRyZW5PZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVbXSA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbmRPZmZzZXQgLSBfZGF0YS5vZmZzZXQgPiBudWxsQ291bnRBdE5vZGVFbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkOiBGQlguTm9kZSA9IHJlYWROb2RlKF9kYXRhLCBfYXR0cmlidXRlc0FzVWludDY0KTtcclxuICAgICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBfZGF0YS5vZmZzZXQgPSBlbmRPZmZzZXQ7XHJcblxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUHJvcGVydHkoX2RhdGE6IEJ1ZmZlclJlYWRlcik6IEZCWC5Ob2RlUHJvcGVydHkge1xyXG4gICAgY29uc3QgdHlwZUNvZGU6IHN0cmluZyA9IF9kYXRhLmdldENoYXIoKTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZTogRkJYLk5vZGVQcm9wZXJ0eSA9IHtcclxuICAgICAgQzogX2RhdGEuZ2V0Qm9vbCxcclxuICAgICAgWTogX2RhdGEuZ2V0SW50MTYsXHJcbiAgICAgIEk6IF9kYXRhLmdldEludDMyLFxyXG4gICAgICBMOiBfZGF0YS5nZXRJbnQ2NCxcclxuICAgICAgRjogX2RhdGEuZ2V0RmxvYXQzMixcclxuICAgICAgRDogX2RhdGEuZ2V0RmxvYXQ2NCxcclxuICAgICAgUzogKCkgPT4gX2RhdGEuZ2V0U3RyaW5nKF9kYXRhLmdldFVpbnQzMigpKS5yZXBsYWNlKFwiXFx4MDBcXHgwMVwiLCBcIjo6XCIpLFxyXG4gICAgICBzOiAoKSA9PiBfZGF0YS5nZXRTdHJpbmcoX2RhdGEuZ2V0VWludDMyKCkpLnJlcGxhY2UoXCJcXHgwMFxceDAxXCIsIFwiOjpcIiksXHJcbiAgICAgIFI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRSYXcoX2RhdGEsIF9kYXRhLmdldFVpbnQ4KSksXHJcbiAgICAgIHI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0VWludDgpKSxcclxuICAgICAgYjogKCkgPT4gbmV3IFVpbnQ4QXJyYXkocmVhZEFycmF5KF9kYXRhLCBfZGF0YS5nZXRVaW50OCkpLFxyXG4gICAgICBpOiAoKSA9PiBuZXcgSW50MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEludDMyKSksXHJcbiAgICAgIGw6ICgpID0+IG5ldyBCaWdJbnQ2NEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0SW50NjQpKSxcclxuICAgICAgZjogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0MzIpKSxcclxuICAgICAgZDogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0NjQpKVxyXG4gICAgfVt0eXBlQ29kZV0/LmNhbGwoX2RhdGEpO1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxyXG4gICAgICBGdWRnZUNvcmUuRGVidWcud2FybihgVW5rbm93biBwcm9wZXJ0eSB0eXBlICR7dHlwZUNvZGUuY2hhckNvZGVBdCgwKX1gKTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkQXJyYXk8VCBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oX2RhdGE6IEJ1ZmZlclJlYWRlciwgX2dldHRlcjogKCkgPT4gVCk6IEdlbmVyYXRvcjxUPiB7XHJcbiAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgZW5jb2Rpbmc6IEZCWC5BUlJBWV9FTkNPRElORyA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9kYXRhLm9mZnNldCArIGJ5dGVMZW5ndGg7XHJcblxyXG4gICAgY29uc3QgaXRlcmFibGU6IEdlbmVyYXRvcjxUPiA9IGVuY29kaW5nID09IEZCWC5BUlJBWV9FTkNPRElORy5DT01QUkVTU0VEID9cclxuICAgICAgKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheURhdGE6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShfZGF0YS52aWV3LmJ1ZmZlciwgX2RhdGEub2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBpbmZsYXRlZERhdGE6IFVpbnQ4QXJyYXkgPSAoUmVmbGVjdC5nZXQoZ2xvYmFsVGhpcywgXCJwYWtvXCIpID8gcGFrby5pbmZsYXRlIDogZmZsYXRlLmluZmxhdGVTeW5jKShhcnJheURhdGEpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyUmVhZGVyKGluZmxhdGVkRGF0YS5idWZmZXIpLmdldFNlcXVlbmNlKF9nZXR0ZXIsIGxlbmd0aCk7XHJcbiAgICAgIH0pKCkgOlxyXG4gICAgICBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpO1xyXG5cclxuICAgIF9kYXRhLm9mZnNldCA9IGVuZE9mZnNldDtcclxuXHJcbiAgICByZXR1cm4gaXRlcmFibGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUmF3PFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9kYXRhOiBCdWZmZXJSZWFkZXIsIF9nZXR0ZXI6ICgpID0+IFQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgLy8gcmF3IGJpbmFyeSBkYXRhIG5lZWRzIHRvIGJlIGludGVycHJldGVkIGluIGEgc3BlY2lhbCB3YXkgc2VlOlxyXG4gICAgLy8gaHR0cHM6Ly9jb2RlLmJsZW5kZXIub3JnLzIwMTMvMDgvZmJ4LWJpbmFyeS1maWxlLWZvcm1hdC1zcGVjaWZpY2F0aW9uL1xyXG4gICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIHJldHVybiBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpOztcclxuICB9XHJcblxyXG4gIGNvbnN0IGJpbmFyeVN0YXJ0Q2hhcnM6IFVpbnQ4QXJyYXlcclxuICAgID0gVWludDhBcnJheS5mcm9tKFwiS2F5ZGFyYSBGQlggQmluYXJ5XFx4MjBcXHgyMFxceDAwXFx4MWFcXHgwMFwiLnNwbGl0KFwiXCIpLCBfdiA9PiBfdi5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgY29uc3QgbnVsbENvdW50QXROb2RlRW5kOiBudW1iZXIgPSAxMztcclxuXHJcbn0iLCJuYW1lc3BhY2UgR0xURiB7XHJcbiAgZXhwb3J0IHR5cGUgR2xUZklkID0gbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFuIG9iamVjdCBwb2ludGluZyB0byBhIGJ1ZmZlciB2aWV3IGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBpbmRpY2VzIGlzIGVxdWFsIHRvIGBhY2Nlc3Nvci5zcGFyc2UuY291bnRgLiBJbmRpY2VzICoqTVVTVCoqIHN0cmljdGx5IGluY3JlYXNlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3JTcGFyc2VJbmRpY2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBidWZmZXIgdmlldyB3aXRoIHNwYXJzZSBpbmRpY2VzLiBUaGUgcmVmZXJlbmNlZCBidWZmZXIgdmlldyAqKk1VU1QgTk9UKiogaGF2ZSBpdHMgYHRhcmdldGAgb3IgYGJ5dGVTdHJpZGVgIHByb3BlcnRpZXMgZGVmaW5lZC4gVGhlIGJ1ZmZlciB2aWV3IGFuZCB0aGUgb3B0aW9uYWwgYGJ5dGVPZmZzZXRgICoqTVVTVCoqIGJlIGFsaWduZWQgdG8gdGhlIGBjb21wb25lbnRUeXBlYCBieXRlIGxlbmd0aC5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJWaWV3XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciB2aWV3IGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVPZmZzZXRcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgZGF0YSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBcImNvbXBvbmVudFR5cGVcIjogQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSB8IENPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUIHwgQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpcyBlcXVhbCB0byBgYWNjZXNzb3Iuc3BhcnNlLmNvdW50YCB0aW1lcyBudW1iZXIgb2YgY29tcG9uZW50cy4gVGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIGJhc2UgYWNjZXNzb3IuIFRoZSBlbGVtZW50cyBhcmUgdGlnaHRseSBwYWNrZWQuIERhdGEgKipNVVNUKiogYmUgYWxpZ25lZCBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGJhc2UgYWNjZXNzb3IuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZVZhbHVlcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYnVmZmVyVmlldyB3aXRoIHNwYXJzZSB2YWx1ZXMuIFRoZSByZWZlcmVuY2VkIGJ1ZmZlciB2aWV3ICoqTVVTVCBOT1QqKiBoYXZlIGl0cyBgdGFyZ2V0YCBvciBgYnl0ZVN0cmlkZWAgcHJvcGVydGllcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyVmlldyBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTcGFyc2Ugc3RvcmFnZSBvZiBhY2Nlc3NvciB2YWx1ZXMgdGhhdCBkZXZpYXRlIGZyb20gdGhlaXIgaW5pdGlhbGl6YXRpb24gdmFsdWUuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZSB7XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgc3BhcnNlIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBcImNvdW50XCI6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIGluZGljZXMgaXMgZXF1YWwgdG8gYGNvdW50YC4gSW5kaWNlcyAqKk1VU1QqKiBzdHJpY3RseSBpbmNyZWFzZS5cclxuICAgICAqL1xyXG4gICAgXCJpbmRpY2VzXCI6IEFjY2Vzc29yU3BhcnNlSW5kaWNlcztcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJ2YWx1ZXNcIjogQWNjZXNzb3JTcGFyc2VWYWx1ZXM7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHR5cGVkIHZpZXcgaW50byBhIGJ1ZmZlciB2aWV3IHRoYXQgY29udGFpbnMgcmF3IGJpbmFyeSBkYXRhLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyVmlld1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZU9mZnNldFwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YXR5cGUgb2YgdGhlIGFjY2Vzc29yJ3MgY29tcG9uZW50cy5cclxuICAgICAqL1xyXG4gICAgXCJjb21wb25lbnRUeXBlXCI6IENPTVBPTkVOVF9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBpbnRlZ2VyIGRhdGEgdmFsdWVzIGFyZSBub3JtYWxpemVkIGJlZm9yZSB1c2FnZS5cclxuICAgICAqL1xyXG4gICAgXCJub3JtYWxpemVkXCI/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBhY2Nlc3Nvci5cclxuICAgICAqL1xyXG4gICAgXCJjb3VudFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYWNjZXNzb3IncyBlbGVtZW50cyBhcmUgc2NhbGFycywgdmVjdG9ycywgb3IgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBBQ0NFU1NPUl9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXhpbXVtIHZhbHVlIG9mIGVhY2ggY29tcG9uZW50IGluIHRoaXMgYWNjZXNzb3IuXHJcbiAgICAgKi9cclxuICAgIFwibWF4XCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogTWluaW11bSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCBpbiB0aGlzIGFjY2Vzc29yLlxyXG4gICAgICovXHJcbiAgICBcIm1pblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFNwYXJzZSBzdG9yYWdlIG9mIGVsZW1lbnRzIHRoYXQgZGV2aWF0ZSBmcm9tIHRoZWlyIGluaXRpYWxpemF0aW9uIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBcInNwYXJzZVwiPzogQWNjZXNzb3JTcGFyc2U7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjYWNjZXNzb3ItZGF0YS10eXBlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTVBPTkVOVF9UWVBFIHtcclxuICAgIEJZVEUgPSA1MTIwLFxyXG4gICAgVU5TSUdORURfQllURSA9IDUxMjEsXHJcbiAgICBTSE9SVCA9IDUxMjIsXHJcbiAgICBVTlNJR05FRF9TSE9SVCA9IDUxMjMsXHJcbiAgICBVTlNJR05FRF9JTlQgPSA1MTI1LFxyXG4gICAgRkxPQVQgPSA1MTI2XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBQ0NFU1NPUl9UWVBFIHtcclxuICAgIFNDQUxBUiA9IFwiU0NBTEFSXCIsXHJcbiAgICBWRUMyID0gXCJWRUMyXCIsXHJcbiAgICBWRUMzID0gXCJWRUMzXCIsXHJcbiAgICBWRUM0ID0gXCJWRUM0XCIsXHJcbiAgICBNQVQyID0gXCJNQVQyXCIsXHJcbiAgICBNQVQzID0gXCJNQVQzXCIsXHJcbiAgICBNQVQ0ID0gXCJNQVQ0XCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gYW5pbWF0ZS4gV2hlbiB1bmRlZmluZWQsIHRoZSBhbmltYXRlZCBvYmplY3QgKipNQVkqKiBiZSBkZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJub2RlXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlJ3MgVFJTIHByb3BlcnR5IHRvIGFuaW1hdGUsIG9yIHRoZSBgXCJ3ZWlnaHRzXCJgIG9mIHRoZSBNb3JwaCBUYXJnZXRzIGl0IGluc3RhbnRpYXRlcy4gRm9yIHRoZSBgXCJ0cmFuc2xhdGlvblwiYCBwcm9wZXJ0eSwgdGhlIHZhbHVlcyB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUgc2FtcGxlciBhcmUgdGhlIHRyYW5zbGF0aW9uIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLiBGb3IgdGhlIGBcInJvdGF0aW9uXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSBhIHF1YXRlcm5pb24gaW4gdGhlIG9yZGVyICh4LCB5LCB6LCB3KSwgd2hlcmUgdyBpcyB0aGUgc2NhbGFyLiBGb3IgdGhlIGBcInNjYWxlXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInBhdGhcIjogXCJ0cmFuc2xhdGlvblwiIHwgXCJyb3RhdGlvblwiIHwgXCJzY2FsZVwiIHwgXCJ3ZWlnaHRzXCI7IC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNhbmltYXRpb25zXHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbiBhbmltYXRpb24gY2hhbm5lbCBjb21iaW5lcyBhbiBhbmltYXRpb24gc2FtcGxlciB3aXRoIGEgdGFyZ2V0IHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiBhIHNhbXBsZXIgaW4gdGhpcyBhbmltYXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRhcmdldC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldFwiOiBBbmltYXRpb25DaGFubmVsVGFyZ2V0O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvblNhbXBsZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IgY29udGFpbmluZyBrZXlmcmFtZSB0aW1lc3RhbXBzLlxyXG4gICAgICovXHJcbiAgICBcImlucHV0XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJwb2xhdGlvbiBhbGdvcml0aG0uXHJcbiAgICAgKi9cclxuICAgIFwiaW50ZXJwb2xhdGlvblwiPzogXCJMSU5FQVJcIiB8IFwiU1RFUFwiIHwgXCJDVUJJQ1NQTElORVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IsIGNvbnRhaW5pbmcga2V5ZnJhbWUgb3V0cHV0IHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJvdXRwdXRcIjogR2xUZklkO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBrZXlmcmFtZSBhbmltYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBhbmltYXRpb24gY2hhbm5lbHMuIEFuIGFuaW1hdGlvbiBjaGFubmVsIGNvbWJpbmVzIGFuIGFuaW1hdGlvbiBzYW1wbGVyIHdpdGggYSB0YXJnZXQgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIERpZmZlcmVudCBjaGFubmVscyBvZiB0aGUgc2FtZSBhbmltYXRpb24gKipNVVNUIE5PVCoqIGhhdmUgdGhlIHNhbWUgdGFyZ2V0cy5cclxuICAgICAqL1xyXG4gICAgXCJjaGFubmVsc1wiOiBBbmltYXRpb25DaGFubmVsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGFuaW1hdGlvbiBzYW1wbGVycy4gQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyc1wiOiBBbmltYXRpb25TYW1wbGVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1ldGFkYXRhIGFib3V0IHRoZSBnbFRGIGFzc2V0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHlyaWdodCBtZXNzYWdlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIGNyZWRpdCB0aGUgY29udGVudCBjcmVhdG9yLlxyXG4gICAgICovXHJcbiAgICBcImNvcHlyaWdodFwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUb29sIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZ2xURiBtb2RlbC4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxyXG4gICAgICovXHJcbiAgICBcImdlbmVyYXRvclwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2xURiB2ZXJzaW9uIGluIHRoZSBmb3JtIG9mIGA8bWFqb3I+LjxtaW5vcj5gIHRoYXQgdGhpcyBhc3NldCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInZlcnNpb25cIjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBnbFRGIHZlcnNpb24gaW4gdGhlIGZvcm0gb2YgYDxtYWpvcj4uPG1pbm9yPmAgdGhhdCB0aGlzIGFzc2V0IHRhcmdldHMuIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGdyZWF0ZXIgdGhhbiB0aGUgYXNzZXQgdmVyc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJtaW5WZXJzaW9uXCI/OiBzdHJpbmc7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIGJ1ZmZlciBwb2ludHMgdG8gYmluYXJ5IGdlb21ldHJ5LCBhbmltYXRpb24sIG9yIHNraW5zLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVSSSAob3IgSVJJKSBvZiB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgdmlldyBpbnRvIGEgYnVmZmVyIGdlbmVyYWxseSByZXByZXNlbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGJ1ZmZlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEJ1ZmZlclZpZXcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlclZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdHJpZGUsIGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVTdHJpZGVcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpbnQgcmVwcmVzZW50aW5nIHRoZSBpbnRlbmRlZCBHUFUgYnVmZmVyIHR5cGUgdG8gdXNlIHdpdGggdGhpcyBidWZmZXIgdmlldy5cclxuICAgICAqL1xyXG4gICAgXCJ0YXJnZXRcIj86IG51bWJlciB8IG51bWJlciB8IG51bWJlcjtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb3J0aG9ncmFwaGljIGNhbWVyYSBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYU9ydGhvZ3JhcGhpYyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBob3Jpem9udGFsIG1hZ25pZmljYXRpb24gb2YgdGhlIHZpZXcuIFRoaXMgdmFsdWUgKipNVVNUIE5PVCoqIGJlIGVxdWFsIHRvIHplcm8uIFRoaXMgdmFsdWUgKipTSE9VTEQgTk9UKiogYmUgbmVnYXRpdmUuXHJcbiAgICAgKi9cclxuICAgIFwieG1hZ1wiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBtYWduaWZpY2F0aW9uIG9mIHRoZSB2aWV3LiBUaGlzIHZhbHVlICoqTVVTVCBOT1QqKiBiZSBlcXVhbCB0byB6ZXJvLiBUaGlzIHZhbHVlICoqU0hPVUxEIE5PVCoqIGJlIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBcInltYWdcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIGZhciBjbGlwcGluZyBwbGFuZS4gVGhpcyB2YWx1ZSAqKk1VU1QgTk9UKiogYmUgZXF1YWwgdG8gemVyby4gYHpmYXJgICoqTVVTVCoqIGJlIGdyZWF0ZXIgdGhhbiBgem5lYXJgLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuXHJcbiAgICAgKi9cclxuICAgIFwiem5lYXJcIjogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2FtZXJhUGVyc3BlY3RpdmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgYXNwZWN0IHJhdGlvIG9mIHRoZSBmaWVsZCBvZiB2aWV3LlxyXG4gICAgICovXHJcbiAgICBcImFzcGVjdFJhdGlvXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnMuIFRoaXMgdmFsdWUgKipTSE9VTEQqKiBiZSBsZXNzIHRoYW4gz4AuXHJcbiAgICAgKi9cclxuICAgIFwieWZvdlwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBkaXN0YW5jZSB0byB0aGUgZmFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZsb2F0aW5nLXBvaW50IGRpc3RhbmNlIHRvIHRoZSBuZWFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpuZWFyXCI6IG51bWJlcjtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2FtZXJhJ3MgcHJvamVjdGlvbi4gIEEgbm9kZSAqKk1BWSoqIHJlZmVyZW5jZSBhIGNhbWVyYSB0byBhcHBseSBhIHRyYW5zZm9ybSB0byBwbGFjZSB0aGUgY2FtZXJhIGluIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYSB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIG9ydGhvZ3JhcGhpYyBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgcGVyc3BlY3RpdmVgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwib3J0aG9ncmFwaGljXCI/OiBDYW1lcmFPcnRob2dyYXBoaWM7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjcmVhdGUgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBwcm9wZXJ0eSAqKk1VU1QgTk9UKiogYmUgZGVmaW5lZCB3aGVuIGBvcnRob2dyYXBoaWNgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwicGVyc3BlY3RpdmVcIj86IENhbWVyYVBlcnNwZWN0aXZlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNhbWVyYSB1c2VzIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBhbnkgfCBhbnkgfCBzdHJpbmc7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEltYWdlIGRhdGEgdXNlZCB0byBjcmVhdGUgYSB0ZXh0dXJlLiBJbWFnZSAqKk1BWSoqIGJlIHJlZmVyZW5jZWQgYnkgYW4gVVJJIChvciBJUkkpIG9yIGEgYnVmZmVyIHZpZXcgaW5kZXguXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVUkkgKG9yIElSSSkgb2YgdGhlIGltYWdlLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW1hZ2UncyBtZWRpYSB0eXBlLiBUaGlzIGZpZWxkICoqTVVTVCoqIGJlIGRlZmluZWQgd2hlbiBgYnVmZmVyVmlld2AgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJtaW1lVHlwZVwiPzogYW55IHwgYW55IHwgc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcgdGhhdCBjb250YWlucyB0aGUgaW1hZ2UuIFRoaXMgZmllbGQgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgdXJpYCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIGEgdGV4dHVyZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmVJbmZvIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImluZGV4XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNldCBpbmRleCBvZiB0ZXh0dXJlJ3MgVEVYQ09PUkQgYXR0cmlidXRlIHVzZWQgZm9yIHRleHR1cmUgY29vcmRpbmF0ZSBtYXBwaW5nLlxyXG4gICAgICovXHJcbiAgICBcInRleENvb3JkXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5LUJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsUGJyTWV0YWxsaWNSb3VnaG5lc3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmFjdG9ycyBmb3IgdGhlIGJhc2UgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImJhc2VDb2xvckZhY3RvclwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBiYXNlIGNvbG9yIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwiYmFzZUNvbG9yVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcIm1ldGFsbGljRmFjdG9yXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSByb3VnaG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcInJvdWdobmVzc0ZhY3RvclwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWV0YWxsaWMtcm91Z2huZXNzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlXCI/OiBUZXh0dXJlSW5mbztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbyB7XHJcbiAgICBcImluZGV4XCI/OiBhbnk7XHJcbiAgICBcInRleENvb3JkXCI/OiBhbnk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2FsYXIgcGFyYW1ldGVyIGFwcGxpZWQgdG8gZWFjaCBub3JtYWwgdmVjdG9yIG9mIHRoZSBub3JtYWwgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgXCJzY2FsZVwiPzogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbE9jY2x1c2lvblRleHR1cmVJbmZvIHtcclxuICAgIFwiaW5kZXhcIj86IGFueTtcclxuICAgIFwidGV4Q29vcmRcIj86IGFueTtcclxuICAgIC8qKlxyXG4gICAgICogQSBzY2FsYXIgbXVsdGlwbGllciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIG9jY2x1c2lvbiBhcHBsaWVkLlxyXG4gICAgICovXHJcbiAgICBcInN0cmVuZ3RoXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgbWF0ZXJpYWwgYXBwZWFyYW5jZSBvZiBhIHByaW1pdGl2ZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIHtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS4gV2hlbiB1bmRlZmluZWQsIGFsbCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgYHBick1ldGFsbGljUm91Z2huZXNzYCAqKk1VU1QqKiBhcHBseS5cclxuICAgICAqL1xyXG4gICAgXCJwYnJNZXRhbGxpY1JvdWdobmVzc1wiPzogTWF0ZXJpYWxQYnJNZXRhbGxpY1JvdWdobmVzcztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibm9ybWFsVGV4dHVyZVwiPzogTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9jY2x1c2lvbiB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcIm9jY2x1c2lvblRleHR1cmVcIj86IE1hdGVyaWFsT2NjbHVzaW9uVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBlbWlzc2l2ZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3JzIGZvciB0aGUgZW1pc3NpdmUgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlRmFjdG9yXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHJlbmRlcmluZyBtb2RlIG9mIHRoZSBtYXRlcmlhbC5cclxuICAgICAqL1xyXG4gICAgXCJhbHBoYU1vZGVcIj86IFwiT1BBUVVFXCIgfCBcIk1BU0tcIiB8IFwiQkxFTkRcIjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIGN1dG9mZiB2YWx1ZSBvZiB0aGUgbWF0ZXJpYWwuXHJcbiAgICAgKi9cclxuICAgIFwiYWxwaGFDdXRvZmZcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGRvdWJsZSBzaWRlZC5cclxuICAgICAqL1xyXG4gICAgXCJkb3VibGVTaWRlZFwiPzogYm9vbGVhbjtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlb21ldHJ5IHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaFByaW1pdGl2ZSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGxhaW4gSlNPTiBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgbWVzaCBhdHRyaWJ1dGUgc2VtYW50aWMgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBhY2Nlc3NvciBjb250YWluaW5nIGF0dHJpYnV0ZSdzIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIFwiYXR0cmlidXRlc1wiOiB7XHJcbiAgICAgIFtrOiBzdHJpbmddOiBHbFRmSWQ7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIHRoYXQgY29udGFpbnMgdGhlIHZlcnRleCBpbmRpY2VzLlxyXG4gICAgICovXHJcbiAgICBcImluZGljZXNcIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBtYXRlcmlhbCB0byBhcHBseSB0byB0aGlzIHByaW1pdGl2ZSB3aGVuIHJlbmRlcmluZy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wb2xvZ3kgdHlwZSBvZiBwcmltaXRpdmVzIHRvIHJlbmRlci5cclxuICAgICAqL1xyXG4gICAgXCJtb2RlXCI/OiBNRVNIX1BSSU1JVElWRV9NT0RFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBtb3JwaCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldHNcIj86IHtcclxuICAgICAgW2s6IHN0cmluZ106IEdsVGZJZDtcclxuICAgIH1bXTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBNRVNIX1BSSU1JVElWRV9NT0RFIHtcclxuICAgIFBPSU5UUyxcclxuICAgIExJTkVTLFxyXG4gICAgTElORV9MT09QLFxyXG4gICAgTElORV9TVFJJUCxcclxuICAgIFRSSUFOR0xFUyxcclxuICAgIFRSSUFOR0xFX1NUUklQLFxyXG4gICAgVFJJQU5HTEVfRkFOXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwcmltaXRpdmVzIHRvIGJlIHJlbmRlcmVkLiAgSXRzIGdsb2JhbCB0cmFuc2Zvcm0gaXMgZGVmaW5lZCBieSBhIG5vZGUgdGhhdCByZWZlcmVuY2VzIGl0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIGVhY2ggZGVmaW5pbmcgZ2VvbWV0cnkgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIFwicHJpbWl0aXZlc1wiOiBNZXNoUHJpbWl0aXZlW107XHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIHdlaWdodHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbW9ycGggdGFyZ2V0cy4gVGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqKk1VU1QqKiBtYXRjaCB0aGUgbnVtYmVyIG9mIG1vcnBoIHRhcmdldHMuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgbm9kZSBpbiB0aGUgbm9kZSBoaWVyYXJjaHkuICBXaGVuIHRoZSBub2RlIGNvbnRhaW5zIGBza2luYCwgYWxsIGBtZXNoLnByaW1pdGl2ZXNgICoqTVVTVCoqIGNvbnRhaW4gYEpPSU5UU18wYCBhbmQgYFdFSUdIVFNfMGAgYXR0cmlidXRlcy4gIEEgbm9kZSAqKk1BWSoqIGhhdmUgZWl0aGVyIGEgYG1hdHJpeGAgb3IgYW55IGNvbWJpbmF0aW9uIG9mIGB0cmFuc2xhdGlvbmAvYHJvdGF0aW9uYC9gc2NhbGVgIChUUlMpIHByb3BlcnRpZXMuIFRSUyBwcm9wZXJ0aWVzIGFyZSBjb252ZXJ0ZWQgdG8gbWF0cmljZXMgYW5kIHBvc3RtdWx0aXBsaWVkIGluIHRoZSBgVCAqIFIgKiBTYCBvcmRlciB0byBjb21wb3NlIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXg7IGZpcnN0IHRoZSBzY2FsZSBpcyBhcHBsaWVkIHRvIHRoZSB2ZXJ0aWNlcywgdGhlbiB0aGUgcm90YXRpb24sIGFuZCB0aGVuIHRoZSB0cmFuc2xhdGlvbi4gSWYgbm9uZSBhcmUgcHJvdmlkZWQsIHRoZSB0cmFuc2Zvcm0gaXMgdGhlIGlkZW50aXR5LiBXaGVuIGEgbm9kZSBpcyB0YXJnZXRlZCBmb3IgYW5pbWF0aW9uIChyZWZlcmVuY2VkIGJ5IGFuIGFuaW1hdGlvbi5jaGFubmVsLnRhcmdldCksIGBtYXRyaXhgICoqTVVTVCBOT1QqKiBiZSBwcmVzZW50LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2FtZXJhIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBcImNhbWVyYVwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kaWNlcyBvZiB0aGlzIG5vZGUncyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgXCJjaGlsZHJlblwiPzogR2xUZklkW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2tpbiByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgXCJza2luXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEEgZmxvYXRpbmctcG9pbnQgNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzdG9yZWQgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hdHJpeFwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWVzaCBpbiB0aGlzIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibWVzaFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIHVuaXQgcXVhdGVybmlvbiByb3RhdGlvbiBpbiB0aGUgb3JkZXIgKHgsIHksIHosIHcpLCB3aGVyZSB3IGlzIHRoZSBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIFwicm90YXRpb25cIj86IG51bWJlcltdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIG5vbi11bmlmb3JtIHNjYWxlLCBnaXZlbiBhcyB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInNjYWxlXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5vZGUncyB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhlcy5cclxuICAgICAqL1xyXG4gICAgXCJ0cmFuc2xhdGlvblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3ZWlnaHRzIG9mIHRoZSBpbnN0YW50aWF0ZWQgbW9ycGggdGFyZ2V0LiBUaGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICoqTVVTVCoqIG1hdGNoIHRoZSBudW1iZXIgb2YgbW9ycGggdGFyZ2V0cyBvZiB0aGUgcmVmZXJlbmNlZCBtZXNoLiBXaGVuIGRlZmluZWQsIGBtZXNoYCAqKk1VU1QqKiBhbHNvIGJlIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IHN0cmluZztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIHBhcmVudD86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUGF0aCBmcm9tIHRoZSByb290IG5vZGUgdG8gdGhpcyBub2RlLlxyXG4gICAgICogQ3VzdG9tIHByb3BlcnR5IHNldCBieSBGVURHRSBsb2FkZXIuIE5vdCBwYXJ0IG9mIGdsVEYgc3RhbmRhcmQgMi4wLlxyXG4gICAgICovXHJcbiAgICBwYXRoPzogbnVtYmVyW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgc2FtcGxlciBwcm9wZXJ0aWVzIGZvciBmaWx0ZXJpbmcgYW5kIHdyYXBwaW5nIG1vZGVzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlciB7XHJcbiAgICAvKipcclxuICAgICAqIE1hZ25pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hZ0ZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaW5pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1pbkZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX05FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSX01JUE1BUF9ORUFSRVNUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX0xJTkVBUlwiXSB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHRbXCJMSU5FQVJfTUlQTUFQX0xJTkVBUlwiXTtcclxuICAgIC8qKlxyXG4gICAgICogUyAoVSkgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwU1wiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIC8qKlxyXG4gICAgICogVCAoVikgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwVFwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIFwibmFtZVwiPzogc3RyaW5nO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgbm9kZXMgb2YgYSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjZW5lIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgb2YgZWFjaCByb290IG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IEdsVGZJZFtdO1xyXG4gICAgXCJuYW1lXCI/OiBhbnk7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBKb2ludHMgYW5kIG1hdHJpY2VzIGRlZmluaW5nIGEgc2tpbi5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNraW4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIGNvbnRhaW5pbmcgdGhlIGZsb2F0aW5nLXBvaW50IDR4NCBpbnZlcnNlLWJpbmQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwiaW52ZXJzZUJpbmRNYXRyaWNlc1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdXNlZCBhcyBhIHNrZWxldG9uIHJvb3QuXHJcbiAgICAgKi9cclxuICAgIFwic2tlbGV0b25cIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNlcyBvZiBza2VsZXRvbiBub2RlcywgdXNlZCBhcyBqb2ludHMgaW4gdGhpcyBza2luLlxyXG4gICAgICovXHJcbiAgICBcImpvaW50c1wiOiBHbFRmSWRbXTtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSB0ZXh0dXJlIGFuZCBpdHMgc2FtcGxlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNhbXBsZXIgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhIHNhbXBsZXIgd2l0aCByZXBlYXQgd3JhcHBpbmcgYW5kIGF1dG8gZmlsdGVyaW5nICoqU0hPVUxEKiogYmUgdXNlZC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhbiBleHRlbnNpb24gb3Igb3RoZXIgbWVjaGFuaXNtICoqU0hPVUxEKiogc3VwcGx5IGFuIGFsdGVybmF0ZSB0ZXh0dXJlIHNvdXJjZSwgb3RoZXJ3aXNlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJzb3VyY2VcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgb2JqZWN0IGZvciBhIGdsVEYgYXNzZXQuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHbFRmIHtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgZ2xURiBleHRlbnNpb25zIHVzZWQgaW4gdGhpcyBhc3NldC5cclxuICAgICAqL1xyXG4gICAgXCJleHRlbnNpb25zVXNlZFwiPzogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIGdsVEYgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBsb2FkIHRoaXMgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiZXh0ZW5zaW9uc1JlcXVpcmVkXCI/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzb3JzLlxyXG4gICAgICovXHJcbiAgICBcImFjY2Vzc29yc1wiPzogQWNjZXNzb3JbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Yga2V5ZnJhbWUgYW5pbWF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgXCJhbmltYXRpb25zXCI/OiBBbmltYXRpb25bXTtcclxuICAgIC8qKlxyXG4gICAgICogTWV0YWRhdGEgYWJvdXQgdGhlIGdsVEYgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiYXNzZXRcIjogQXNzZXQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlcnMuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyc1wiPzogQnVmZmVyW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlclZpZXdzLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdzXCI/OiBCdWZmZXJWaWV3W107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNhbWVyYXMuXHJcbiAgICAgKi9cclxuICAgIFwiY2FtZXJhc1wiPzogQ2FtZXJhW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGltYWdlcy5cclxuICAgICAqL1xyXG4gICAgXCJpbWFnZXNcIj86IEltYWdlW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1hdGVyaWFscy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbHNcIj86IE1hdGVyaWFsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1lc2hlcy5cclxuICAgICAqL1xyXG4gICAgXCJtZXNoZXNcIj86IE1lc2hbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygbm9kZXMuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IE5vZGVbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygc2FtcGxlcnMuXHJcbiAgICAgKi9cclxuICAgIFwic2FtcGxlcnNcIj86IFNhbXBsZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IHNjZW5lLlxyXG4gICAgICovXHJcbiAgICBcInNjZW5lXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNjZW5lcy5cclxuICAgICAqL1xyXG4gICAgXCJzY2VuZXNcIj86IFNjZW5lW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNraW5zLlxyXG4gICAgICovXHJcbiAgICBcInNraW5zXCI/OiBTa2luW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHRleHR1cmVzLlxyXG4gICAgICovXHJcbiAgICBcInRleHR1cmVzXCI/OiBUZXh0dXJlW107XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBc3NldCBsb2FkZXIgZm9yIGdsIFRyYW5zZmVyIEZvcm1hdCBmaWxlcy5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMiB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHTFRGTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VybDogc3RyaW5nXTogR0xURkxvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcmVhZG9ubHkgI3VybDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgI2dsdGY6IEdMVEYuR2xUZjtcclxuXHJcbiAgICAjcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuXHJcbiAgICAjbm9kZXM6IE5vZGVbXSA9IFtdO1xyXG4gICAgI2NhbWVyYXM6IENvbXBvbmVudENhbWVyYVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuXHJcbiAgICAjYnVmZmVyczogQXJyYXlCdWZmZXJbXTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZywgX2J1ZmZlckNodW5rPzogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy4jZ2x0ZiA9IF9nbHRmO1xyXG4gICAgICB0aGlzLiN1cmwgPSBfdXJsO1xyXG4gICAgICBpZiAoX2J1ZmZlckNodW5rKVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnMgPSBbX2J1ZmZlckNodW5rXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgaWYgKCF0aGlzLiNkZWZhdWx0TWF0ZXJpYWwpIHtcclxuICAgICAgICB0aGlzLiNkZWZhdWx0TWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdE1hdGVyaWFsXCIsIFNoYWRlclBob25nLCBuZXcgQ29hdFJlbWlzc2l2ZShDb2xvci5DU1MoXCJ3aGl0ZVwiKSwgMSwgMC41KSk7XHJcbiAgICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHRoaXMuI2RlZmF1bHRNYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdFNraW5NYXRlcmlhbCgpOiBNYXRlcmlhbCB7XHJcbiAgICAgIGlmICghdGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCkge1xyXG4gICAgICAgIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdFNraW5NYXRlcmlhbFwiLCBTaGFkZXJQaG9uZ1NraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpLCAxLCAwLjUpKTtcclxuICAgICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIHJlc291cmNlIGZyb20gYSBnbFRGIGZpbGUuIFVzZWQgYnkgdGhlIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfUdMVEYgc3BlY2lhbGl6YXRpb25zIHRvIGxvYWQgdGhlbXNlbHZlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZTxUIGV4dGVuZHMgR3JhcGhHTFRGIHwgTWVzaEdMVEYgfCBNYXRlcmlhbEdMVEYgfCBBbmltYXRpb25HTFRGIHwgR3JhcGhJbnN0YW5jZT4oX3Jlc291cmNlOiBULCBfdXJsPzogUmVxdWVzdEluZm8pOiBQcm9taXNlPFQ+IHtcclxuICAgICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gYXdhaXQgR0xURkxvYWRlci5MT0FEKCgoPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+X3Jlc291cmNlKS51cmwgPz8gX3VybCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoIWxvYWRlcikge1xyXG4gICAgICAgIGlmICghKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKVxyXG4gICAgICAgICAgX3Jlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5FUlJPUjtcclxuICAgICAgICByZXR1cm4gX3Jlc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG9hZGVkOiBUO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5nZXQoKS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBNZXNoR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWVzaChfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlLmlQcmltaXRpdmUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWF0ZXJpYWwoX3Jlc291cmNlLm5hbWUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEFuaW1hdGlvbkdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEFuaW1hdGlvbihfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmICghbG9hZGVkKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoYCR7X3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IHwgJHtfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlID8gX3Jlc291cmNlLmlkU291cmNlIDogX3Jlc291cmNlLmlkUmVzb3VyY2V9OiBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZS5gKTtcclxuICAgICAgICBpZiAoIShfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSlcclxuICAgICAgICAgIF9yZXNvdXJjZS5zdGF0dXMgPSBSRVNPVVJDRV9TVEFUVVMuRVJST1I7XHJcblxyXG4gICAgICAgIHJldHVybiBfcmVzb3VyY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghKGxvYWRlZCBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgbG9hZGVkLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKGNhY2hlZCAmJiAhKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcblxyXG4gICAgICAvLyAgIGlmICghUHJvamVjdC5yZXNvdXJjZXNbY2FjaGVkLmlkUmVzb3VyY2VdKVxyXG4gICAgICAvLyAgICAgY2FjaGVkLmlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuaWRSZXNvdXJjZTsgLy8gY2hhbmdlIHRoZSBpZCBvZiB0aGUgY2FjaGVkIHJlc291cmNlIHRvIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgdGhhdCByZXF1ZXN0ZWQgaXRcclxuXHJcbiAgICAgIC8vICAgaWYgKGNhY2hlZC5pZFJlc291cmNlICE9IF9yZXNvdXJjZS5pZFJlc291cmNlKSB7XHJcbiAgICAgIC8vICAgICAvLyB0d28gZGlmZmVyZW50IHJlc291cmNlcyBoYXZlIHJlcXVlc3RlZCB0aGUgc2FtZSBjYWNoZWQgcmVzb3VyY2VcclxuICAgICAgLy8gICAgIERlYnVnLmVycm9yKGAke19yZXNvdXJjZS5pZFJlc291cmNlfTogRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UuICR7X3Jlc291cmNlLnR5cGV9IHdpdGggbmFtZSAnJHtfcmVzb3VyY2UubmFtZX0nIGZyb20gJyR7bG9hZGVyLm5hbWV9JyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSAnJHtjYWNoZWQuaWRSZXNvdXJjZX0nLiBQbGVhc2UgZGVsZXRlIHRoZSBkdXBsaWNhdGUgJyR7X3Jlc291cmNlLmlkUmVzb3VyY2V9JyBmcm9tIHRoZSBwcm9qZWN0LmApO1xyXG4gICAgICAvLyAgICAgcmV0dXJuIF9yZXNvdXJjZTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICByZXR1cm4gbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHTFRGTG9hZGVyfSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHVybCBvciBudWxsIGlmIHRoZSB1cmwgY2FuJ3QgYmUgcmVzb2x2ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgTE9BRChfdXJsOiBzdHJpbmcsIF9yZWdpc3RlclJlc291cmNlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxHTFRGTG9hZGVyPiB7XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzKVxyXG4gICAgICAgIEdMVEZMb2FkZXIubG9hZGVycyA9IHt9O1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnNbX3VybF0pIHtcclxuICAgICAgICBsZXQgZ2x0ZjogR0xURi5HbFRmO1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKF91cmwsIFByb2plY3QuYmFzZVVSTCkpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbjogc3RyaW5nID0gX3VybC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2x0ZlwiKVxyXG4gICAgICAgICAgICBnbHRmID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2xiXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hZ2ljOiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYWdpYyAhPT0gMHg0NjU0NkM2NylcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IEludmFsaWQgbWFnaWMgbnVtYmVyIGluIEdMQiBmaWxlLmApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvbiAhPSAyKVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVW5zdXBwb3J0ZWQgdmVyc2lvbiBpbiBHTEIgZmlsZS5gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25MZW5ndGg6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxMiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25Gb3JtYXQ6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoanNvbkZvcm1hdCAhPT0gMHg0RTRGNTM0QSlcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0LiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIEpTT04gZm9ybWF0LicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QganNvbkNodW5rOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgMjAsIGpzb25MZW5ndGgpKTtcclxuICAgICAgICAgICAgZ2x0ZiA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID49IDIwICsganNvbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUxlbmd0aDogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDIwICsganNvbkxlbmd0aCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmluYXJ5Rm9ybWF0OiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMjQgKyBqc29uTGVuZ3RoLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJpbmFyeUZvcm1hdCAhPT0gMHgwMDRFNDk0MilcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQuIFRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIGJpbmFyeSBmb3JtYXQuJyk7XHJcblxyXG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5QnVmZmVyLnNsaWNlKDI4ICsganNvbkxlbmd0aCwgMjggKyBqc29uTGVuZ3RoICsgYmluYXJ5TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogRmFpbGVkIHRvIGxvYWQgZmlsZS4gJHtlcnJvcn1gKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR0xURkxvYWRlci5jaGVja0NvbXBhdGliaWxpdHkoZ2x0ZiwgX3VybCk7XHJcbiAgICAgICAgR0xURkxvYWRlci5wcmVQcm9jZXNzKGdsdGYsIF91cmwpO1xyXG5cclxuICAgICAgICBHTFRGTG9hZGVyLmxvYWRlcnNbX3VybF0gPSBuZXcgR0xURkxvYWRlcihnbHRmLCBfdXJsLCBidWZmZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkZXJzW191cmxdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrQ29tcGF0aWJpbGl0eShfZ2x0ZjogR0xURi5HbFRmLCBfdXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9nbHRmLmFzc2V0LnZlcnNpb24gIT0gXCIyLjBcIilcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke0dMVEZMb2FkZXIubmFtZX0gfCAke191cmx9OiBUaGlzIGxvYWRlciB3YXMgZGV2ZWxvcGVkIGZvciBnbFRGIDIuMC4gSXQgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkIHdpdGggdmVyc2lvbiAke19nbHRmLmFzc2V0LnZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSB1bmRlZmluZWQgJiYgX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSBcIjIuMFwiKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgd2FzIGRldmVsb3BlZCBmb3IgZ2xURiAyLjAuIEl0IGRvZXMgbm90IHdvcmsgd2l0aCByZXF1aXJlZCBtaW4gdmVyc2lvbiAke19nbHRmLmFzc2V0Lm1pblZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuZXh0ZW5zaW9uc1VzZWQ/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgRGVidWcud2FybihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnbFRGIGV4dGVuc2lvbnMuIEl0IG1heSBub3Qgd29yayBhcyBpbnRlbmRlZCB3aXRoIGV4dGVuc2lvbnMgJHtfZ2x0Zi5leHRlbnNpb25zVXNlZC50b1N0cmluZygpfS5gKTtcclxuICAgICAgaWYgKF9nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZD8ubGVuZ3RoID4gMClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IFRoaXMgbG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xURiBleHRlbnNpb25zLiBJdCBkb2VzIG5vdCB3b3JrIHdpdGggcmVxdWlyZWQgZXh0ZW5zaW9ucyAke19nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZC50b1N0cmluZygpfS5gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBwcmVQcm9jZXNzKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAvLyBhZGQgYSBuYW1lIHRvIGVhY2ggc2NlbmVcclxuICAgICAgaWYgKF9nbHRmLnNjZW5lcykge1xyXG4gICAgICAgIF9nbHRmLnNjZW5lID0gX2dsdGYuc2NlbmUgPz8gMDtcclxuICAgICAgICBhZGROYW1lcyhcIlNjZW5lXCIsIF9nbHRmLnNjZW5lcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5ub2Rlcykge1xyXG4gICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIHRoYXQgYXJlIGFuaW1hdGVkXHJcbiAgICAgICAgX2dsdGYuYW5pbWF0aW9ucz8uZm9yRWFjaChfYW5pbWF0aW9uID0+IHtcclxuICAgICAgICAgIF9hbmltYXRpb24uY2hhbm5lbHMuZm9yRWFjaChfY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlOb2RlOiBudW1iZXIgPSBfY2hhbm5lbC50YXJnZXQubm9kZTtcclxuICAgICAgICAgICAgaWYgKGlOb2RlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICBfZ2x0Zi5ub2Rlc1tpTm9kZV0uaXNBbmltYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbWFyayBwYXJlbnQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4gX25vZGUuY2hpbGRyZW4/LmZvckVhY2goX2lDaGlsZCA9PiBfZ2x0Zi5ub2Rlc1tfaUNoaWxkXS5wYXJlbnQgPSBfaU5vZGUpKTtcclxuXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4ge1xyXG4gICAgICAgICAgLy8gYWRkIG5hbWVzIHRvIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmVcclxuICAgICAgICAgIGlmIChfbm9kZS5uYW1lID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgX25vZGUubmFtZSA9IGBOb2RlJHtfaU5vZGV9YDtcclxuXHJcbiAgICAgICAgICBpZiAoX25vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgcGF0aCB0byBlYWNoIGFuaW1hdGVkIG5vZGVcclxuICAgICAgICAgICAgbGV0IGlQYXJlbnQ6IG51bWJlciA9IF9ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgbGV0IHBhdGg6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChfaU5vZGUpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaVBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBwYXRoLnB1c2goaVBhcmVudCk7XHJcbiAgICAgICAgICAgICAgaVBhcmVudCA9IF9nbHRmLm5vZGVzW2lQYXJlbnRdLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbm9kZS5wYXRoID0gcGF0aC5yZXZlcnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX2dsdGYubWF0ZXJpYWxzKVxyXG4gICAgICAgIGFkZE5hbWVzKFwiTWF0ZXJpYWxcIiwgX2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5tZXNoZXMpXHJcbiAgICAgICAgYWRkTmFtZXMoXCJNZXNoXCIsIF9nbHRmLm1lc2hlcyk7XHJcblxyXG4gICAgICBpZiAoX2dsdGYuYW5pbWF0aW9ucylcclxuICAgICAgICBhZGROYW1lcyhcIkFuaW1hdGlvblwiLCBfZ2x0Zi5hbmltYXRpb25zKTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGFkZE5hbWVzKF90ZW1wbGF0ZTogc3RyaW5nLCBfdGFyZ2V0OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogdm9pZCB7XHJcbiAgICAgICAgX3RhcmdldC5mb3JFYWNoKChfaXRlbSwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoX2l0ZW0ubmFtZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9pdGVtLm5hbWUgPSBgJHtfdGVtcGxhdGV9JHtfaW5kZXh9YDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ2xURiBmaWxlIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdXJsLnNwbGl0KFwiXFxcXFwiKS5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbmV3IGluc3RhbmNlcyBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZFJlc291cmNlczxUIGV4dGVuZHMgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFByb21pc2U8VFtdPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZXM6IFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWxbXSA9IFtdO1xyXG4gICAgICBzd2l0Y2ggKF9jbGFzcy5uYW1lKSB7XHJcbiAgICAgICAgY2FzZSBHcmFwaC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaVNjZW5lOiBudW1iZXIgPSAwOyBpU2NlbmUgPCB0aGlzLiNnbHRmLnNjZW5lcz8ubGVuZ3RoOyBpU2NlbmUrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRHcmFwaChpU2NlbmUsIG5ldyBHcmFwaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZXNoLm5hbWU6XHJcbiAgICAgICAgICBmb3IgKGxldCBpTWVzaDogbnVtYmVyID0gMDsgaU1lc2ggPCB0aGlzLiNnbHRmLm1lc2hlcz8ubGVuZ3RoOyBpTWVzaCsrKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgdGhpcy4jZ2x0Zi5tZXNoZXNbaU1lc2hdLnByaW1pdGl2ZXMubGVuZ3RoOyBpUHJpbWl0aXZlKyspXHJcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNZXNoKGlNZXNoLCBpUHJpbWl0aXZlLCBuZXcgTWVzaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNYXRlcmlhbC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaU1hdGVyaWFsOiBudW1iZXIgPSAwOyBpTWF0ZXJpYWwgPCB0aGlzLiNnbHRmLm1hdGVyaWFscz8ubGVuZ3RoOyBpTWF0ZXJpYWwrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNYXRlcmlhbChpTWF0ZXJpYWwsIG5ldyBNYXRlcmlhbEdMVEYoXCJIaSA6KVwiKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBbmltYXRpb24ubmFtZTpcclxuICAgICAgICAgIGZvciAobGV0IGlBbmltYXRpb246IG51bWJlciA9IDA7IGlBbmltYXRpb24gPCB0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aDsgaUFuaW1hdGlvbisrKVxyXG4gICAgICAgICAgICByZXNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmdldEFuaW1hdGlvbihpQW5pbWF0aW9uLCBuZXcgQW5pbWF0aW9uR0xURigpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcclxuICAgICAgICBpZiAoIVByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlLmlkUmVzb3VyY2VdKVxyXG4gICAgICAgICAgUHJvamVjdC5yZWdpc3RlcihyZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIHJlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDxUW10+cmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHcmFwaH0gZm9yIHRoZSBnaXZlbiBzY2VuZSBuYW1lIG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIG5hbWUgaXMgZ2l2ZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaChfbmFtZT86IHN0cmluZyk6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEdyYXBofSBmb3IgdGhlIGdpdmVuIHNjZW5lIGluZGV4IG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIGluZGV4IGlzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0R3JhcGgoX2lTY2VuZT86IG51bWJlcik6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIHNjZW5lIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaDxUIGV4dGVuZHMgTm9kZT4oX2lTY2VuZTogbnVtYmVyIHwgc3RyaW5nLCBfZ3JhcGg6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldEdyYXBoKF9pU2NlbmU6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuI2dsdGYuc2NlbmUsIF9ncmFwaD86IE5vZGUpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgX2lTY2VuZSA9IHRoaXMuZ2V0SW5kZXgoX2lTY2VuZSwgdGhpcy4jZ2x0Zi5zY2VuZXMpO1xyXG5cclxuICAgICAgaWYgKF9pU2NlbmUgPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7R3JhcGhHTFRGLm5hbWV9fCR7X2lTY2VuZX1gO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE5vZGU+PHVua25vd24+dGhpcy4jcmVzb3VyY2VzW2lkXTtcclxuXHJcbiAgICAgIHRoaXMuI25vZGVzID0gW107XHJcbiAgICAgIHRoaXMuI2NhbWVyYXMgPSBbXTtcclxuICAgICAgdGhpcy4jc2tlbGV0b25zID0gW107XHJcblxyXG4gICAgICBjb25zdCBnbHRmU2NlbmU6IEdMVEYuU2NlbmUgPSB0aGlzLiNnbHRmLnNjZW5lc1tfaVNjZW5lXTtcclxuICAgICAgY29uc3QgZ3JhcGg6IE5vZGUgPSBfZ3JhcGggPz8gbmV3IEdyYXBoR0xURigpO1xyXG4gICAgICBncmFwaC5uYW1lID0gZ2x0ZlNjZW5lLm5hbWU7XHJcbiAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICBncmFwaC51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmIChfZ3JhcGgpIHtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQ29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaU5vZGUgb2YgZ2x0ZlNjZW5lLm5vZGVzKVxyXG4gICAgICAgIGdyYXBoLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoaU5vZGUpKTtcclxuXHJcbiAgICAgIC8vIGlmICh0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aCA+IDAgJiYgIWdyYXBoLmdldENvbXBvbmVudChDb21wb25lbnRBbmltYXRvcikpIHtcclxuICAgICAgLy8gICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBhd2FpdCB0aGlzLmdldEFuaW1hdGlvbigwKTtcclxuICAgICAgLy8gICBQcm9qZWN0LnJlZ2lzdGVyKGFuaW1hdGlvbik7XHJcbiAgICAgIC8vICAgZ3JhcGguYWRkQ29tcG9uZW50KG5ldyBDb21wb25lbnRBbmltYXRvcihhbmltYXRpb24pKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gVE9ETzogbG9hZCBvbmx5IHNrZWxldG9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNjZW5lPz8/XHJcbiAgICAgIC8vIGlmICh0aGlzLmdsdGYuc2tpbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVNraW46IG51bWJlciA9IDA7IGlTa2luIDwgdGhpcy5nbHRmLnNraW5zLmxlbmd0aDsgaVNraW4rKylcclxuICAgICAgLy8gICAgIHNjZW5lLmFkZENvbXBvbmVudChhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChpU2tpbikpO1xyXG4gICAgICBpZiAodGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIGZvciAoY29uc3Qgc2tlbGV0b24gb2YgdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgICAgZ3JhcGguYWRkQ29tcG9uZW50KHNrZWxldG9uKTtcclxuXHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSA8R3JhcGhHTFRGPmdyYXBoO1xyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIE5vZGV9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9uYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgY29uc3QgaU5vZGU6IG51bWJlciA9IHRoaXMuI2dsdGYubm9kZXMuZmluZEluZGV4KF9ub2RlID0+IF9ub2RlLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaU5vZGUgPT0gLTEpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWV9JyBpbiBnbFRGIG5vZGVzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROb2RlQnlJbmRleChpTm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTm9kZX0gZm9yIHRoZSBnaXZlbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE5vZGVCeUluZGV4KF9pTm9kZTogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXNbX2lOb2RlXSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZOb2RlOiBHTFRGLk5vZGUgPSB0aGlzLiNnbHRmLm5vZGVzW19pTm9kZV07XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKGdsdGZOb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICB0aGlzLiNub2Rlc1tfaU5vZGVdID0gbm9kZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNoaWxkcmVuKVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpTm9kZSBvZiBnbHRmTm9kZS5jaGlsZHJlbilcclxuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChhd2FpdCB0aGlzLmdldE5vZGVCeUluZGV4KGlOb2RlKSk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciB0cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXggfHwgZ2x0Zk5vZGUucm90YXRpb24gfHwgZ2x0Zk5vZGUuc2NhbGUgfHwgZ2x0Zk5vZGUudHJhbnNsYXRpb24gfHwgZ2x0Zk5vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudFRyYW5zZm9ybSgpKTtcclxuICAgICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXgpIHtcclxuICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zZXQoZ2x0Zk5vZGUubWF0cml4KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS50cmFuc2xhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uLnNldChnbHRmTm9kZS50cmFuc2xhdGlvblswXSwgZ2x0Zk5vZGUudHJhbnNsYXRpb25bMV0sIGdsdGZOb2RlLnRyYW5zbGF0aW9uWzJdKTtcclxuICAgICAgICAgICAgICBub2RlLm10eExvY2FsLnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS5yb3RhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgICAgICAgIHJvdGF0aW9uLnNldChnbHRmTm9kZS5yb3RhdGlvblswXSwgZ2x0Zk5vZGUucm90YXRpb25bMV0sIGdsdGZOb2RlLnJvdGF0aW9uWzJdLCBnbHRmTm9kZS5yb3RhdGlvblszXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZ2x0Zk5vZGUuc2NhbGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzY2FsZTogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgICAgICAgICBzY2FsZS5zZXQoZ2x0Zk5vZGUuc2NhbGVbMF0sIGdsdGZOb2RlLnNjYWxlWzFdLCBnbHRmTm9kZS5zY2FsZVsyXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zY2FsaW5nID0gc2NhbGU7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgY2FtZXJhXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNhbWVyYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGF3YWl0IHRoaXMuZ2V0Q2FtZXJhQnlJbmRleChnbHRmTm9kZS5jYW1lcmEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBtZXNoIGFuZCBtYXRlcmlhbFxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tZXNoICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgZ2x0Zk1lc2g6IEdMVEYuTWVzaCA9IHRoaXMuI2dsdGYubWVzaGVzPy5bZ2x0Zk5vZGUubWVzaF07XHJcbiAgICAgICAgICAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gICAgICAgICAgY29uc3Qgc3ViQ29tcG9uZW50czogW0NvbXBvbmVudE1lc2gsIENvbXBvbmVudE1hdGVyaWFsXVtdID0gW107XHJcbiAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgZ2x0Zk1lc2gucHJpbWl0aXZlcy5sZW5ndGg7IGlQcmltaXRpdmUrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gbmV3IENvbXBvbmVudE1lc2goYXdhaXQgdGhpcy5nZXRNZXNoKGdsdGZOb2RlLm1lc2gsIGlQcmltaXRpdmUpKTtcclxuICAgICAgICAgICAgY29uc3QgaXNTa2luOiBib29sZWFuID0gZ2x0Zk5vZGUuc2tpbiAhPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNTa2luKVxyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChnbHRmTm9kZS5za2luKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWw7XHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gZ2x0Zk1lc2gucHJpbWl0aXZlcz8uW2lQcmltaXRpdmVdPy5tYXRlcmlhbDtcclxuICAgICAgICAgICAgaWYgKGlNYXRlcmlhbCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChpc1NraW4gP1xyXG4gICAgICAgICAgICAgICAgR0xURkxvYWRlci5kZWZhdWx0U2tpbk1hdGVyaWFsIDpcclxuICAgICAgICAgICAgICAgIEdMVEZMb2FkZXIuZGVmYXVsdE1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBpc0ZsYXQ6IGJvb2xlYW4gPSBnbHRmTWVzaC5wcmltaXRpdmVzW2lQcmltaXRpdmVdLmF0dHJpYnV0ZXMuTk9STUFMID09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChhd2FpdCB0aGlzLmdldE1hdGVyaWFsKGlNYXRlcmlhbCwgbnVsbCwgaXNTa2luLCBpc0ZsYXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogbWF5YmUgdGhpcyBzaG91bGQgYmUgYSBmdWRnZSBtYXRlcmlhbCBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgIGNvbnN0IGdsdGZNYXRlcmlhbDogR0xURi5NYXRlcmlhbCA9IHRoaXMuI2dsdGYubWF0ZXJpYWxzW2lNYXRlcmlhbF07XHJcbiAgICAgICAgICAgICAgaWYgKGdsdGZNYXRlcmlhbCkgXHJcbiAgICAgICAgICAgICAgICBjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgPSBnbHRmTWF0ZXJpYWwuYWxwaGFNb2RlID09IFwiQkxFTkRcIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3ViQ29tcG9uZW50cy5wdXNoKFtjbXBNZXNoLCBjbXBNYXRlcmlhbF0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChzdWJDb21wb25lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KHN1YkNvbXBvbmVudHNbMF1bMF0pO1xyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChzdWJDb21wb25lbnRzWzBdWzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YkNvbXBvbmVudHMuZm9yRWFjaCgoW19jbXBNZXNoLCBfY21wTWF0ZXJpYWxdLCBfaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVQYXJ0OiBOb2RlID0gbmV3IE5vZGUoYCR7bm9kZS5uYW1lfV9QcmltaXRpdmUke19pfWApO1xyXG4gICAgICAgICAgICAgIG5vZGVQYXJ0LmFkZENvbXBvbmVudChfY21wTWVzaCk7XHJcbiAgICAgICAgICAgICAgbm9kZVBhcnQuYWRkQ29tcG9uZW50KF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChub2RlUGFydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pTm9kZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB3aXRoIHRoZSBnaXZlbiBjYW1lcmEgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldENhbWVyYShfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRDYW1lcmE+IHtcclxuICAgICAgY29uc3QgaUNhbWVyYTogbnVtYmVyID0gdGhpcy4jZ2x0Zi5jYW1lcmFzLmZpbmRJbmRleChfY2FtZXJhID0+IF9jYW1lcmEubmFtZSA9PSBfbmFtZSk7XHJcbiAgICAgIGlmIChpQ2FtZXJhID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBjYW1lcmFzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDYW1lcmFCeUluZGV4KGlDYW1lcmEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudENhbWVyYX0gZm9yIHRoZSBnaXZlbiBjYW1lcmEgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFCeUluZGV4KF9pQ2FtZXJhOiBudW1iZXIpOiBQcm9taXNlPENvbXBvbmVudENhbWVyYT4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXMpXHJcbiAgICAgICAgdGhpcy4jY2FtZXJhcyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXNbX2lDYW1lcmFdKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZkNhbWVyYTogR0xURi5DYW1lcmEgPSB0aGlzLiNnbHRmLmNhbWVyYXNbX2lDYW1lcmFdO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZSlcclxuICAgICAgICAgIGNhbWVyYS5wcm9qZWN0Q2VudHJhbChcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS5hc3BlY3RSYXRpbyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS55Zm92ICogQ2FsYy5yYWQyZGVnLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpuZWFyLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpmYXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgY2FtZXJhLnByb2plY3RPcnRob2dyYXBoaWMoXHJcbiAgICAgICAgICAgIC1nbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICAtZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZ1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbWVyYTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jY2FtZXJhc1tfaUNhbWVyYV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQW5pbWF0aW9ufSB3aXRoIHRoZSBnaXZlbiBhbmltYXRpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5pbWF0aW9ufSBmb3IgdGhlIGdpdmVuIGFuaW1hdGlvbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfaUFuaW1hdGlvbjogbnVtYmVyKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgZ2xURiBmaWxlIGludG8gdGhlIGdpdmVuIHtAbGluayBBbmltYXRpb259LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb248VCBleHRlbmRzIEFuaW1hdGlvbj4oX2lBbmltYXRpb246IG51bWJlciB8IHN0cmluZywgX2FuaW1hdGlvbjogVCk6IFByb21pc2U8VD47XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QW5pbWF0aW9uKF9pQW5pbWF0aW9uOiBudW1iZXIgfCBzdHJpbmcsIF9hbmltYXRpb24/OiBBbmltYXRpb24pOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBfaUFuaW1hdGlvbiA9IHRoaXMuZ2V0SW5kZXgoX2lBbmltYXRpb24sIHRoaXMuI2dsdGYuYW5pbWF0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoX2lBbmltYXRpb24gPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7QW5pbWF0aW9uLm5hbWV9fCR7X2lBbmltYXRpb259YDtcclxuXHJcbiAgICAgIGlmICghX2FuaW1hdGlvbiAmJiB0aGlzLiNyZXNvdXJjZXNbaWRdKVxyXG4gICAgICAgIHJldHVybiA8QW5pbWF0aW9uPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmQW5pbWF0aW9uOiBHTFRGLkFuaW1hdGlvbiA9IHRoaXMuI2dsdGYuYW5pbWF0aW9ucz8uW19pQW5pbWF0aW9uXTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkFuaW1hdGlvbilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYW5pbWF0aW9uIHdpdGggaW5kZXggJHtfaUFuaW1hdGlvbn0uYCk7XHJcblxyXG4gICAgICBjb25zdCBhbmltYXRpb25TdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGNvbnN0IGdsdGZDaGFubmVsIG9mIGdsdGZBbmltYXRpb24uY2hhbm5lbHMpIHtcclxuICAgICAgICBjb25zdCBnbHRmTm9kZTogR0xURi5Ob2RlID0gdGhpcy4jZ2x0Zi5ub2Rlc1tnbHRmQ2hhbm5lbC50YXJnZXQubm9kZV07XHJcbiAgICAgICAgaWYgKCFnbHRmTm9kZSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZTogR2VuZXJhbCA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGlOb2RlIG9mIGdsdGZOb2RlLnBhdGgpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkTmFtZTogc3RyaW5nID0gdGhpcy4jZ2x0Zi5ub2Rlc1tpTm9kZV0ubmFtZTtcclxuICAgICAgICAgIC8vIG5vZGUuY2hpbGRyZW5bY2hpbGROYW1lXVxyXG4gICAgICAgICAgbm9kZSA9IChub2RlLmNoaWxkcmVuID8/PSB7fSlbY2hpbGROYW1lXSA/Pz0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub2RlLmNvbXBvbmVudHMuQ29tcG9uZW50VHJhbnNmb3JtWzBdLm10eExvY2FsXHJcbiAgICAgICAgbGV0IG10eExvY2FsOiBBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4NCA9IDxBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4ND4oKCgobm9kZS5jb21wb25lbnRzID8/PSB7fSkuQ29tcG9uZW50VHJhbnNmb3JtID8/PSBbXSlbMF0gPz89IHt9KS5tdHhMb2NhbCA/Pz0ge30pO1xyXG4gICAgICAgIG10eExvY2FsW3RvSW50ZXJuVHJhbnNmb3JtYXRpb25bZ2x0ZkNoYW5uZWwudGFyZ2V0LnBhdGhdXSA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKGdsdGZBbmltYXRpb24uc2FtcGxlcnNbZ2x0ZkNoYW5uZWwuc2FtcGxlcl0sIGdsdGZDaGFubmVsLnRhcmdldC5wYXRoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBfYW5pbWF0aW9uID8/IG5ldyBBbmltYXRpb25HTFRGKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUgPSBhbmltYXRpb25TdHJ1Y3R1cmU7XHJcbiAgICAgIGFuaW1hdGlvbi5jbGVhckNhY2hlKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5uYW1lID0gZ2x0ZkFuaW1hdGlvbi5uYW1lO1xyXG4gICAgICBhbmltYXRpb24uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRpb25HTFRGKVxyXG4gICAgICAgIGFuaW1hdGlvbi51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmICghX2FuaW1hdGlvbikge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihhbmltYXRpb24pO1xyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSBhbmltYXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgTWVzaEdMVEZ9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoKF9uYW1lOiBzdHJpbmcsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1lc2hHTFRGfSBmb3IgdGhlIGdpdmVuIG1lc2ggaW5kZXggYW5kIHByaW1pdGl2ZSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBtZXNoIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoPFQgZXh0ZW5kcyBNZXNoPihfaU1lc2g6IG51bWJlciB8IHN0cmluZywgX2lQcmltaXRpdmU6IG51bWJlciwgX21lc2g6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIgfCBzdHJpbmcsIF9pUHJpbWl0aXZlOiBudW1iZXIgPSAwLCBfbWVzaD86IE1lc2gpOiBQcm9taXNlPE1lc2g+IHtcclxuICAgICAgX2lNZXNoID0gdGhpcy5nZXRJbmRleChfaU1lc2gsIHRoaXMuI2dsdGYubWVzaGVzKTtcclxuXHJcbiAgICAgIGlmIChfaU1lc2ggPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7TWVzaEdMVEYubmFtZX18JHtfaU1lc2h9fCR7X2lQcmltaXRpdmV9YDtcclxuXHJcbiAgICAgIGlmICghX21lc2ggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE1lc2hHTFRGPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmTWVzaDogR0xURi5NZXNoID0gdGhpcy4jZ2x0Zi5tZXNoZXNbX2lNZXNoXTtcclxuICAgICAgY29uc3QgZ2x0ZlByaW1pdGl2ZTogR0xURi5NZXNoUHJpbWl0aXZlID0gZ2x0Zk1lc2gucHJpbWl0aXZlc1tfaVByaW1pdGl2ZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5pbmRpY2VzID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gaW5kaWNlcy4gRlVER0UgZG9lcyBub3Qgc3VwcG9ydCBub24taW5kZXhlZCBtZXNoZXMuYCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlBPU0lUSU9OID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gcG9zaXRpb24gYXR0cmlidXRlLiBQcmltaXRpdmUgd2lsbCBiZSBpZ25vcmVkLmApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUubW9kZSAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5tb2RlICE9IEdMVEYuTUVTSF9QUklNSVRJVkVfTU9ERS5UUklBTkdMRVMpXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIHRvcG9sb2d5IHR5cGUgbW9kZSAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVtnbHRmUHJpbWl0aXZlLm1vZGVdfS4gRlVER0Ugb25seSBzdXBwb3J0cyAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVs0XX0uYCk7XHJcblxyXG4gICAgICBjaGVja01heFN1cHBvcnQodGhpcywgXCJURVhDT09SRFwiLCAyKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiQ09MT1JcIiwgMSk7XHJcbiAgICAgIGNoZWNrTWF4U3VwcG9ydCh0aGlzLCBcIkpPSU5UU1wiLCAxKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiV0VJR0hUU1wiLCAxKTtcclxuXHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgICAgbGV0IG5vcm1hbHM6IEZsb2F0MzJBcnJheSwgdGFuZ2VudHM6IEZsb2F0MzJBcnJheTtcclxuICAgICAgbGV0IGNvbG9yczogRmxvYXQzMkFycmF5LCB0ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgIGxldCBib25lczogVWludDhBcnJheSwgd2VpZ2h0czogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuaW5kaWNlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpbmRpY2VzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhJbmRpY2VzKGdsdGZQcmltaXRpdmUuaW5kaWNlcyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXA6IG51bWJlciA9IGluZGljZXNbaSArIDJdO1xyXG4gICAgICAgICAgaW5kaWNlc1tpICsgMl0gPSBpbmRpY2VzW2kgKyAwXTtcclxuICAgICAgICAgIGluZGljZXNbaSArIDBdID0gaW5kaWNlc1tpICsgMV07XHJcbiAgICAgICAgICBpbmRpY2VzW2kgKyAxXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBubyBpbmRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1pbmRleGVkIG1lc2hlcy5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5QT1NJVElPTiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdmVydGljZXMgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuUE9TSVRJT04pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIG5vIHBvc2l0aW9uIGF0dHJpYnV0ZS4gUHJpbWl0aXZlIHdpbGwgYmUgaWdub3JlZC5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuTk9STUFMICE9IHVuZGVmaW5lZClcclxuICAgICAgICBub3JtYWxzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRhbmdlbnRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQpO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8xICE9IHVuZGVmaW5lZClcclxuICAgICAgICB0ZXh0dXJlVVZzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRFWENPT1JEXzEpO1xyXG4gICAgICBlbHNlIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGV4dHVyZVVWcyA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8wKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuQ09MT1JfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgY29sb3JzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhDb2xvcnMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib25lcyA9IGF3YWl0IHRoaXMuZ2V0Qm9uZUluZGljZXMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkpPSU5UU18wKTtcclxuICAgICAgICB3ZWlnaHRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1lc2g6IE1lc2ggPSBfbWVzaCA/PyBuZXcgTWVzaEdMVEYoKTtcclxuICAgICAgbWVzaC5uYW1lID0gZ2x0Zk1lc2gubmFtZTtcclxuICAgICAgaWYgKG1lc2ggaW5zdGFuY2VvZiBNZXNoR0xURikge1xyXG4gICAgICAgIG1lc2guaVByaW1pdGl2ZSA9IF9pUHJpbWl0aXZlO1xyXG4gICAgICAgIG1lc2gudXJsID0gdGhpcy4jdXJsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbWVzaCkge1xyXG4gICAgICAgIF9tZXNoLmNsZWFyKCk7XHJcbiAgICAgICAgX21lc2guZmFjZXMgPSBbXTtcclxuICAgICAgICBfbWVzaC52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQ3JlYXRlIG1lc2ggdmVydGljZXMgYW5kIGZhY2VzIHNvIHRoYXQgbm9ybWFscyBhbmQgdGFuZ2VudHMgY2FuIGJlIGNhbGN1bGF0ZWQgaWYgbWlzc2luZy4gSWYgdGhleSBhcmUgbm90IG1pc3NpbmcgdGhpcyBjb3VsZCBiZSBvbWl0dGVkLlxyXG4gICAgICBmb3IgKGxldCBpVmVjdG9yMjogbnVtYmVyID0gMCwgaVZlY3RvcjM6IG51bWJlciA9IDAsIGlWZWN0b3I0OiBudW1iZXIgPSAwOyBpVmVjdG9yMyA8IHZlcnRpY2VzPy5sZW5ndGg7IGlWZWN0b3IyICs9IDIsIGlWZWN0b3IzICs9IDMsIGlWZWN0b3I0ICs9IDQpIHtcclxuICAgICAgICBtZXNoLnZlcnRpY2VzLnB1c2goXHJcbiAgICAgICAgICBuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh2ZXJ0aWNlc1tpVmVjdG9yMyArIDBdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDFdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDJdKSxcclxuICAgICAgICAgICAgdGV4dHVyZVVWcyA/XHJcbiAgICAgICAgICAgICAgbmV3IFZlY3RvcjIodGV4dHVyZVVWc1tpVmVjdG9yMiArIDBdLCB0ZXh0dXJlVVZzW2lWZWN0b3IyICsgMV0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG5vcm1hbHMgP1xyXG4gICAgICAgICAgICAgIG5ldyBWZWN0b3IzKG5vcm1hbHNbaVZlY3RvcjMgKyAwXSwgbm9ybWFsc1tpVmVjdG9yMyArIDFdLCBub3JtYWxzW2lWZWN0b3IzICsgMl0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRhbmdlbnRzID9cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yNCh0YW5nZW50c1tpVmVjdG9yNCArIDBdLCB0YW5nZW50c1tpVmVjdG9yNCArIDFdLCB0YW5nZW50c1tpVmVjdG9yNCArIDJdLCB0YW5nZW50c1tpVmVjdG9yNCArIDNdKSA6XHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb2xvcnMgP1xyXG4gICAgICAgICAgICAgIG5ldyBDb2xvcihjb2xvcnNbaVZlY3RvcjQgKyAwXSwgY29sb3JzW2lWZWN0b3I0ICsgMV0sIGNvbG9yc1tpVmVjdG9yNCArIDJdLCBjb2xvcnNbaVZlY3RvcjQgKyAzXSkgOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYm9uZXMgJiYgd2VpZ2h0cyA/XHJcbiAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAwXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgMF0gfSxcclxuICAgICAgICAgICAgICAgIHsgaW5kZXg6IGJvbmVzW2lWZWN0b3I0ICsgMV0sIHdlaWdodDogd2VpZ2h0c1tpVmVjdG9yNCArIDFdIH0sXHJcbiAgICAgICAgICAgICAgICB7IGluZGV4OiBib25lc1tpVmVjdG9yNCArIDJdLCB3ZWlnaHQ6IHdlaWdodHNbaVZlY3RvcjQgKyAyXSB9LFxyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAzXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgM10gfVxyXG4gICAgICAgICAgICAgIF0gOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGlGYWNlVmVydGV4SW5kZXg6IG51bWJlciA9IDA7IGlGYWNlVmVydGV4SW5kZXggPCBpbmRpY2VzPy5sZW5ndGg7IGlGYWNlVmVydGV4SW5kZXggKz0gMykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtZXNoLmZhY2VzLnB1c2gobmV3IEZhY2UoXHJcbiAgICAgICAgICAgIG1lc2gudmVydGljZXMsXHJcbiAgICAgICAgICAgIGluZGljZXNbaUZhY2VWZXJ0ZXhJbmRleCArIDBdLFxyXG4gICAgICAgICAgICBpbmRpY2VzW2lGYWNlVmVydGV4SW5kZXggKyAxXSxcclxuICAgICAgICAgICAgaW5kaWNlc1tpRmFjZVZlcnRleEluZGV4ICsgMl1cclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIG1lc2gucmVuZGVyTWVzaC5pbmRpY2VzID0gaW5kaWNlcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLm5vcm1hbHMgPSBub3JtYWxzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2gudGFuZ2VudHMgPSB0YW5nZW50cztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnRleHR1cmVVVnMgPSB0ZXh0dXJlVVZzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guY29sb3JzID0gY29sb3JzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guYm9uZXMgPSBib25lcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLndlaWdodHMgPSB3ZWlnaHRzO1xyXG5cclxuICAgICAgaWYgKCFfbWVzaCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgICAvLyBtZXNoLmlkUmVzb3VyY2UgPSBpZDtcclxuICAgICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gbWVzaDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1lc2g7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjaGVja01heFN1cHBvcnQoX2xvYWRlcjogR0xURkxvYWRlciwgX2NoZWNrOiBzdHJpbmcsIF9tYXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMpLmZpbHRlcigoX2tleTogc3RyaW5nKSA9PiBfa2V5LnN0YXJ0c1dpdGgoX2NoZWNrKSkubGVuZ3RoID4gX21heClcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7X2xvYWRlcn06IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBtb3JlIHRoYW4gJHtfbWF4fSBzZXRzIG9mICcke19jaGVja30nIGFzc29jaWF0ZWQgd2l0aCBpdC4gRlVHREUgb25seSBzdXBwb3J0cyB1cCB0byAke19tYXh9ICR7X2NoZWNrfSBzZXRzIHBlciBwcmltaXRpdmUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBNYXRlcmlhbEdMVEZ9IHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbChfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNYXRlcmlhbD47XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNYXRlcmlhbH0gZm9yIHRoZSBnaXZlbiBtYXRlcmlhbCBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlcik6IFByb21pc2U8TWF0ZXJpYWw+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG1hdGVyaWFsIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWF0ZXJpYWx9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbDxUIGV4dGVuZHMgTWF0ZXJpYWw+KF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogVCwgX3NraW4/OiBib29sZWFuLCBfZmxhdD86IGJvb2xlYW4pOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogTWF0ZXJpYWwsIF9za2luOiBib29sZWFuID0gZmFsc2UsIF9mbGF0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIF9pTWF0ZXJpYWwgPSB0aGlzLmdldEluZGV4KF9pTWF0ZXJpYWwsIHRoaXMuI2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfaU1hdGVyaWFsID09IC0xKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGAke01hdGVyaWFsLm5hbWV9fCR7X2lNYXRlcmlhbH1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0gJiYgIV9tYXRlcmlhbClcclxuICAgICAgICByZXR1cm4gPE1hdGVyaWFsPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBzaGFkZXIgYmFzZWQgb24gdGhlIGdsVEYgbWF0ZXJpYWwgcHJvcGVydGllc1xyXG4gICAgICBjb25zdCBnbHRmTWF0ZXJpYWw6IEdMVEYuTWF0ZXJpYWwgPSB0aGlzLiNnbHRmLm1hdGVyaWFsc1tfaU1hdGVyaWFsXTtcclxuXHJcbiAgICAgIGlmICghZ2x0Zk1hdGVyaWFsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBtYXRlcmlhbCB3aXRoIGluZGV4ICR7X2lNYXRlcmlhbH0uYCk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgZ2xURiBtYXRlcmlhbCBwcm9wZXJ0aWVzOiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjcmVmZXJlbmNlLW1hdGVyaWFsXHJcbiAgICAgIC8vIGUuZy4gb2NjbHVzaW9uIGFuZCBlbWlzc2l2ZSB0ZXh0dXJlczsgZG91YmxlU2lkZWRcclxuICAgICAgY29uc3QgZ2x0ZkJhc2VDb2xvckZhY3RvcjogbnVtYmVyW10gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LmJhc2VDb2xvckZhY3RvciA/PyBbMSwgMSwgMSwgMV07XHJcbiAgICAgIGNvbnN0IGdsdGZNZXRhbGxpY0ZhY3RvcjogbnVtYmVyID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5tZXRhbGxpY0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmUm91Z2huZXNzRmFjdG9yOiBudW1iZXIgPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LnJvdWdobmVzc0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmRW1pc3NpdmVGYWN0b3I6IG51bWJlcltdID0gZ2x0Zk1hdGVyaWFsLmVtaXNzaXZlRmFjdG9yID8/IFswLCAwLCAwXTtcclxuXHJcbiAgICAgIGNvbnN0IGdsdGZCYXNlQ29sb3JUZXh0dXJlOiBHTFRGLlRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5iYXNlQ29sb3JUZXh0dXJlO1xyXG4gICAgICBjb25zdCBnbHRmTm9ybWFsVGV4dHVyZTogR0xURi5NYXRlcmlhbE5vcm1hbFRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLm5vcm1hbFRleHR1cmU7XHJcblxyXG4gICAgICAvLyBUaGUgZGlmZnVzZSBjb250cmlidXRpb24gaW4gdGhlIFBob25nIHNoYWRpbmcgbW9kZWwuIFJlcHJlc2VudHMgaG93IG11Y2ggbGlnaHQgaXMgc2NhdHRlcmVkIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zIGR1ZSB0byB0aGUgbWF0ZXJpYWwncyBzdXJmYWNlIHByb3BlcnRpZXMuXHJcbiAgICAgIGNvbnN0IGRpZmZ1c2U6IG51bWJlciA9IDE7XHJcbiAgICAgIC8vIFRoZSBzaGluaW5lc3Mgb2YgdGhlIG1hdGVyaWFsLiBJbmZsdWVuY2VzIHRoZSBzaGFycG5lc3Mgb3IgYnJvYWRuZXNzIG9mIHRoZSBzcGVjdWxhciBoaWdobGlnaHQuIEhpZ2hlciBzcGVjdWxhciB2YWx1ZXMgcmVzdWx0IGluIGEgc2hhcnBlciBhbmQgbW9yZSBjb25jZW50cmF0ZWQgc3BlY3VsYXIgaGlnaGxpZ2h0LlxyXG4gICAgICBjb25zdCBzcGVjdWxhcjogbnVtYmVyID0gMS44ICogKDEgLSBnbHRmUm91Z2huZXNzRmFjdG9yKSArIDAuNiAqIGdsdGZNZXRhbGxpY0ZhY3RvcjtcclxuICAgICAgLy8gVGhlIHN0cmVuZ3RoL2ludGVuc2l0eSBvZiB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvblxyXG4gICAgICBjb25zdCBpbnRlbnNpdHk6IG51bWJlciA9IDAuNyAqICgxIC0gZ2x0ZlJvdWdobmVzc0ZhY3RvcikgKyBnbHRmTWV0YWxsaWNGYWN0b3I7XHJcbiAgICAgIC8vIEluZmx1ZW5jZXMgaG93IG11Y2ggdGhlIG1hdGVyaWFsJ3MgY29sb3IgYWZmZWN0cyB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvbi4gV2hlbiBtZXRhbGxpYyBpcyBoaWdoZXIsIHRoZSBzcGVjdWxhciByZWZsZWN0aW9uIHRha2VzIG9uIHRoZSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGNyZWF0aW5nIGEgbWV0YWxsaWMgYXBwZWFyYW5jZS4gUmFuZ2UgZnJvbSAwLjAgdG8gMS4wLlxyXG4gICAgICBjb25zdCBtZXRhbGxpYzogbnVtYmVyID0gZ2x0Zk1ldGFsbGljRmFjdG9yO1xyXG5cclxuICAgICAgY29uc3QgaXNMaXQ6IGJvb2xlYW4gPSBnbHRmRW1pc3NpdmVGYWN0b3JbMF0gPT0gMSAmJiBnbHRmRW1pc3NpdmVGYWN0b3JbMV0gPT0gMSB8fCBnbHRmRW1pc3NpdmVGYWN0b3JbMl0gPT0gMTtcclxuICAgICAgY29uc3QgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKC4uLmdsdGZCYXNlQ29sb3JGYWN0b3IpO1xyXG4gICAgICBjb25zdCBjb2F0OiBDb2F0ID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgIGlzTGl0ID8gbmV3IENvYXRUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSkgOlxyXG4gICAgICAgICAgZ2x0Zk5vcm1hbFRleHR1cmUgP1xyXG4gICAgICAgICAgICBuZXcgQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyhjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZOb3JtYWxUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICBpc0xpdCA/IG5ldyBDb2F0Q29sb3JlZChjb2xvcikgOiBuZXcgQ29hdFJlbWlzc2l2ZShjb2xvciwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpO1xyXG5cclxuICAgICAgbGV0IHNoYWRlcjogdHlwZW9mIFNoYWRlcjtcclxuICAgICAgaWYgKF9mbGF0KSB7IC8vIFRPRE86IG1ha2UgZmxhdCBhIGZsYWcgaW4gdGhlIG1hdGVyaWFsIHNvIHRoYXQgd2UgY2FuIGhhdmUgZmxhdCBtZXNoIHdpdGggcGhvbmcgc2hhZGluZyBncmFkaWVudHNcclxuICAgICAgICBzaGFkZXIgPSBnbHRmQmFzZUNvbG9yVGV4dHVyZSA/XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0VGV4dHVyZWRTa2luIDogU2hhZGVyRmxhdFRleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0U2tpbiA6IFNoYWRlckZsYXQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTGl0KSB7XHJcbiAgICAgICAgc2hhZGVyID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyTGl0VGV4dHVyZWRTa2luIDogU2hhZGVyTGl0VGV4dHVyZWQpIDpcclxuICAgICAgICAgIChfc2tpbiA/IFNoYWRlckxpdFNraW4gOiBTaGFkZXJMaXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNoYWRlciA9IGdsdGZCYXNlQ29sb3JUZXh0dXJlID9cclxuICAgICAgICAgIGdsdGZOb3JtYWxUZXh0dXJlID9cclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHNTa2luIDogU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpIDpcclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4gOiBTaGFkZXJQaG9uZ1RleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJQaG9uZ1NraW4gOiBTaGFkZXJQaG9uZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IF9tYXRlcmlhbCA/PyBuZXcgTWF0ZXJpYWxHTFRGKGdsdGZNYXRlcmlhbC5uYW1lKTtcclxuICAgICAgbWF0ZXJpYWwubmFtZSA9IGdsdGZNYXRlcmlhbC5uYW1lO1xyXG4gICAgICBtYXRlcmlhbC5jb2F0ID0gY29hdDtcclxuICAgICAgaWYgKGdsdGZNYXRlcmlhbC5hbHBoYUN1dG9mZiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgbWF0ZXJpYWwuYWxwaGFDbGlwID0gZ2x0Zk1hdGVyaWFsLmFscGhhQ3V0b2ZmO1xyXG4gICAgICBSZWZsZWN0LnNldChtYXRlcmlhbCwgXCJzaGFkZXJUeXBlXCIsIHNoYWRlcik7XHJcbiAgICAgIC8vIG1hdGVyaWFsLnNldFNoYWRlcihzaGFkZXIpO1xyXG4gICAgICBpZiAobWF0ZXJpYWwgaW5zdGFuY2VvZiBNYXRlcmlhbEdMVEYpXHJcbiAgICAgICAgbWF0ZXJpYWwudXJsID0gdGhpcy4jdXJsO1xyXG5cclxuICAgICAgaWYgKCFfbWF0ZXJpYWwpIHtcclxuICAgICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIobWF0ZXJpYWwpO1xyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSBtYXRlcmlhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1hdGVyaWFsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFRleHR1cmV9IGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldFRleHR1cmUoX2lUZXh0dXJlOiBudW1iZXIpOiBQcm9taXNlPFRleHR1cmU+IHtcclxuICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGAke1RleHR1cmUubmFtZX18JHtfaVRleHR1cmV9YDtcclxuXHJcbiAgICAgIGlmICh0aGlzLiNyZXNvdXJjZXNbaWRdKVxyXG4gICAgICAgIHJldHVybiA8VGV4dHVyZT50aGlzLiNyZXNvdXJjZXNbaWRdO1xyXG5cclxuICAgICAgY29uc3QgZ2x0ZlRleHR1cmU6IEdMVEYuVGV4dHVyZSA9IHRoaXMuI2dsdGYudGV4dHVyZXNbX2lUZXh0dXJlXTtcclxuICAgICAgY29uc3QgZ2x0ZlNhbXBsZXI6IEdMVEYuU2FtcGxlciA9IHRoaXMuI2dsdGYuc2FtcGxlcnM/LltnbHRmVGV4dHVyZS5zYW1wbGVyXTtcclxuICAgICAgY29uc3QgZ2x0ZkltYWdlOiBHTFRGLkltYWdlID0gdGhpcy4jZ2x0Zi5pbWFnZXM/LltnbHRmVGV4dHVyZS5zb3VyY2VdO1xyXG5cclxuICAgICAgaWYgKGdsdGZJbWFnZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBUZXh0dXJlIHdpdGggaW5kZXggJHtfaVRleHR1cmV9IGhhcyBubyBpbWFnZS5gKTtcclxuICAgICAgICByZXR1cm4gVGV4dHVyZURlZmF1bHQuY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IG5ldyBVUkwoZ2x0ZkltYWdlLnVyaSwgbmV3IFVSTCh0aGlzLiN1cmwsIFByb2plY3QuYmFzZVVSTCkpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICBpZiAoIWdsdGZJbWFnZS51cmkgJiYgZ2x0ZkltYWdlLmJ1ZmZlclZpZXcpIHtcclxuICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGR1cGxpY2F0ZSBjb2RlIGZyb20gZ2V0QnVmZmVyRGF0YSwgbWF5YmUgcmVmYWN0b3IgZ2V0QnVmZmVyRGF0YSB0byBoYW5kbGUgYnVmZmVyVmlld0luZGV4IGlucHV0XHJcbiAgICAgICAgY29uc3QgZ2x0ZkJ1ZmZlclZpZXc6IEdMVEYuQnVmZmVyVmlldyA9IHRoaXMuI2dsdGYuYnVmZmVyVmlld3NbZ2x0ZkltYWdlLmJ1ZmZlclZpZXddO1xyXG5cclxuICAgICAgICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgdGhpcy5nZXRCdWZmZXIoZ2x0ZkJ1ZmZlclZpZXcuYnVmZmVyKTtcclxuICAgICAgICBjb25zdCBieXRlT2Zmc2V0OiBudW1iZXIgPSBnbHRmQnVmZmVyVmlldy5ieXRlT2Zmc2V0IHx8IDA7XHJcbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gZ2x0ZkJ1ZmZlclZpZXcuYnl0ZUxlbmd0aCB8fCAwO1xyXG5cclxuICAgICAgICB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFxyXG4gICAgICAgICAgW25ldyBVaW50OEFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpXSxcclxuICAgICAgICAgIHsgdHlwZTogZ2x0ZkltYWdlLm1pbWVUeXBlIH1cclxuICAgICAgICApKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdGV4dHVyZTogVGV4dHVyZUltYWdlID0gbmV3IFRleHR1cmVJbWFnZSgpO1xyXG4gICAgICBhd2FpdCB0ZXh0dXJlLmxvYWQodXJsKTtcclxuXHJcbiAgICAgIGlmIChnbHRmU2FtcGxlcikge1xyXG4gICAgICAgIGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9IGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1Q7IC8vIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPSBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPz8gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUOyAvLyBkZWZhdWx0IHZhbHVlXHJcblxyXG4gICAgICAgIGlmIChnbHRmU2FtcGxlci5tYWdGaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUICYmIGdsdGZTYW1wbGVyLm1pbkZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpXHJcbiAgICAgICAgICB0ZXh0dXJlLm1pcG1hcCA9IE1JUE1BUC5DUklTUDtcclxuICAgICAgICBlbHNlIGlmIChnbHRmU2FtcGxlci5tYWdGaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUICYmIGdsdGZTYW1wbGVyLm1pbkZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1RfTUlQTUFQX0xJTkVBUilcclxuICAgICAgICAgIHRleHR1cmUubWlwbWFwID0gTUlQTUFQLk1FRElVTTtcclxuICAgICAgICBlbHNlIGlmIChnbHRmU2FtcGxlci5tYWdGaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVIgJiYgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSX01JUE1BUF9MSU5FQVIpXHJcbiAgICAgICAgICB0ZXh0dXJlLm1pcG1hcCA9IE1JUE1BUC5CTFVSUlk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogVGV4dHVyZSB3aXRoIGluZGV4ICR7X2lUZXh0dXJlfSBoYXMgYSBtYWdGaWx0ZXIgYW5kIG1pbkZpbHRlciBvZiAnJHtnZXRXZWJHTFBhcmFtZXRlck5hbWUoZ2x0ZlNhbXBsZXIubWFnRmlsdGVyKX0nIGFuZCAnJHtnZXRXZWJHTFBhcmFtZXRlck5hbWUoZ2x0ZlNhbXBsZXIubWluRmlsdGVyKX0nIHJlc3BlY3RpdmVseS4gRlVER0Ugb25seSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbWJpbmF0aW9uczogTkVBUkVTVCBhbmQgTkVBUkVTVCB8IE5FQVJFU1QgYW5kIE5FQVJFU1RfTUlQTUFQX0xJTkVBUiB8IExJTkVBUiBhbmQgTElORUFSX01JUE1BUF9MSU5FQVIuYCk7XHJcblxyXG4gICAgICAgIGdsdGZTYW1wbGVyLndyYXBTID0gZ2x0ZlNhbXBsZXIud3JhcFMgPz8gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQ7IC8vIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBnbHRmU2FtcGxlci53cmFwVCA9IGdsdGZTYW1wbGVyLndyYXBUID8/IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUOyAvLyBkZWZhdWx0IHZhbHVlXHJcblxyXG4gICAgICAgIGlmIChnbHRmU2FtcGxlci53cmFwUyA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVCAmJiBnbHRmU2FtcGxlci53cmFwVCA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVClcclxuICAgICAgICAgIHRleHR1cmUud3JhcCA9IFdSQVAuUkVQRUFUO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLndyYXBTID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSAmJiBnbHRmU2FtcGxlci53cmFwVCA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpXHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXAgPSBXUkFQLkNMQU1QO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLndyYXBTID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTUlSUk9SRURfUkVQRUFUICYmIGdsdGZTYW1wbGVyLndyYXBUID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTUlSUk9SRURfUkVQRUFUKVxyXG4gICAgICAgICAgdGV4dHVyZS53cmFwID0gV1JBUC5NSVJST1I7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogVGV4dHVyZSB3aXRoIGluZGV4ICR7X2lUZXh0dXJlfSBoYXMgYSB3cmFwUyBhbmQgd3JhcFQgb2YgJyR7Z2V0V2ViR0xQYXJhbWV0ZXJOYW1lKGdsdGZTYW1wbGVyLndyYXBTKX0nIGFuZCAnJHtnZXRXZWJHTFBhcmFtZXRlck5hbWUoZ2x0ZlNhbXBsZXIud3JhcFQpfScgcmVzcGVjdGl2ZWx5LiBGVURHRSBvbmx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOiBSRVBFQVQgYW5kIFJFUEVBVCB8IENMQU1QX1RPX0VER0UgYW5kIENMQU1QX1RPX0VER0UgfCBNSVJST1JFRF9SRVBFQVQgYW5kIE1JUlJPUkVEX1JFUEVBVC5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHRleHR1cmUpO1xyXG4gICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gdGV4dHVyZTtcclxuXHJcbiAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQ29tcG9uZW50U2tlbGV0b259IHdpdGggdGhlIGdpdmVuIHNrZWxldG9uIG5hbWUuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldFNrZWxldG9uKF9uYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGNvbnN0IGlTa2VsZXRvbjogbnVtYmVyID0gdGhpcy4jZ2x0Zi5za2lucy5maW5kSW5kZXgoX3NrZWxldG9uID0+IF9za2VsZXRvbi5uYW1lID09IF9uYW1lKTtcclxuICAgICAgaWYgKGlTa2VsZXRvbiA9PSAtMSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgbmFtZSAnJHtfbmFtZX0nIGluIGdsVEYgc2tpbnMuYCk7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChpU2tlbGV0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudFNrZWxldG9ufSBmb3IgdGhlIGdpdmVuIHNrZWxldG9uIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b25CeUluZGV4KF9pU2tlbGV0b246IG51bWJlcik6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgaWYgKCF0aGlzLiNza2VsZXRvbnMpXHJcbiAgICAgICAgdGhpcy4jc2tlbGV0b25zID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zW19pU2tlbGV0b25dKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZlNraW46IEdMVEYuU2tpbiA9IHRoaXMuI2dsdGYuc2tpbnNbX2lTa2VsZXRvbl07XHJcbiAgICAgICAgY29uc3QgYm9uZXM6IE5vZGVbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBjb252ZXJ0IGZsb2F0IGFycmF5IHRvIGFycmF5IG9mIG1hdHJpY2VzIGFuZCByZWdpc3RlciBib25lc1xyXG4gICAgICAgIGxldCBtdHhEYXRhOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgICAgaWYgKGdsdGZTa2luLmludmVyc2VCaW5kTWF0cmljZXMgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgbXR4RGF0YSA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KGdsdGZTa2luLmludmVyc2VCaW5kTWF0cmljZXMpO1xyXG4gICAgICAgIGNvbnN0IG10eERhdGFTcGFuOiBudW1iZXIgPSAxNjsgLy8gc2l6ZSBvZiBtYXRyaXhcclxuXHJcbiAgICAgICAgY29uc3QgbXR4QmluZEludmVyc2VzOiBNYXRyaXg0eDRbXSA9IFtdO1xyXG4gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBqb2ludHMgYW5kIGdldCBjb3JyZXNwb25kaW5nIG1hdHJpeCBmcm9tIGZsb2F0IGFycmF5XHJcbiAgICAgICAgZm9yIChsZXQgaUJvbmU6IG51bWJlciA9IDA7IGlCb25lIDwgZ2x0ZlNraW4uam9pbnRzLmxlbmd0aDsgaUJvbmUrKykge1xyXG4gICAgICAgICAgbGV0IG10eEJpbmRJbnZlcnNlOiBNYXRyaXg0eDQ7XHJcbiAgICAgICAgICBpZiAobXR4RGF0YSkge1xyXG4gICAgICAgICAgICBtdHhCaW5kSW52ZXJzZSA9IG5ldyBNYXRyaXg0eDQoKTtcclxuICAgICAgICAgICAgbXR4QmluZEludmVyc2Uuc2V0KG10eERhdGEuc3ViYXJyYXkoaUJvbmUgKiBtdHhEYXRhU3BhbiwgaUJvbmUgKiBtdHhEYXRhU3BhbiArIG10eERhdGFTcGFuKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYm9uZXMucHVzaChhd2FpdCB0aGlzLmdldE5vZGVCeUluZGV4KGdsdGZTa2luLmpvaW50c1tpQm9uZV0pKTtcclxuICAgICAgICAgIG10eEJpbmRJbnZlcnNlcy5wdXNoKG10eEJpbmRJbnZlcnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9uc1tfaVNrZWxldG9uXSA9IG5ldyBDb21wb25lbnRTa2VsZXRvbihib25lcywgbXR4QmluZEludmVyc2VzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3NrZWxldG9uc1tfaVNrZWxldG9uXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGAke0dMVEZMb2FkZXIubmFtZX0gfCAke3RoaXMuI3VybH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5kZXgoX25hbWVPckluZGV4OiBzdHJpbmcgfCBudW1iZXIsIF9hcnJheTogeyBuYW1lPzogc3RyaW5nIH1bXSk6IG51bWJlciB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID1cclxuICAgICAgICB0eXBlb2YgX25hbWVPckluZGV4ID09IFwibnVtYmVyXCIgP1xyXG4gICAgICAgICAgX25hbWVPckluZGV4IDpcclxuICAgICAgICAgIF9hcnJheS5maW5kSW5kZXgoX29iamVjdCA9PiBfb2JqZWN0Lm5hbWUgPT0gX25hbWVPckluZGV4KTtcclxuICAgICAgaWYgKGluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgbGV0IGFycmF5TmFtZTogc3RyaW5nID0gT2JqZWN0LmVudHJpZXModGhpcy4jZ2x0ZikuZmluZCgoW19rZXksIF92YWx1ZV0pID0+IF92YWx1ZSA9PSBfYXJyYXkpPy5bMF07XHJcbiAgICAgICAgRGVidWcuZXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgbmFtZSAnJHtfbmFtZU9ySW5kZXh9JyBpbiBnbFRGICR7YXJyYXlOYW1lfS5gKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4QXJyYXl9IGZvciB0aGUgZ2l2ZW4gYWNjZXNzb3IgaW5kZXguXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCb25lSW5kaWNlcyhfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcclxuICAgICAgY29uc3QgYXJyYXk6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckRhdGEoX2lBY2Nlc3Nvcik7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGU6IEdMVEYuQ09NUE9ORU5UX1RZUEUgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXT8uY29tcG9uZW50VHlwZTtcclxuXHJcbiAgICAgIGlmIChjb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSlcclxuICAgICAgICByZXR1cm4gYXJyYXkgYXMgVWludDhBcnJheTtcclxuXHJcbiAgICAgIGlmIChjb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlQpIHtcclxuICAgICAgICBEZWJ1Zy5sb2coYCR7dGhpc306IEJvbmUgaW5kaWNlcyBhcmUgc3RvcmVkIGFzICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVF19Jy4gRlVER0Ugd2lsbCBjb252ZXJ0IHRoZW0gdG8gJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEVdfScuIEZVREdFIG9ubHkgc3VwcG9ydHMgc2tlbGV0b25zIHdpdGggdXAgdG8gMjU2IGJvbmVzLCBzbyBtYWtlIHN1cmUgeW91ciBza2VsZXRvbiBoYXMgbm8gbW9yZSB0aGFuIDI1NiBib25lcy5gKTtcclxuICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGFycmF5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBJbnZhbGlkIGNvbXBvbmVudCB0eXBlICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbY29tcG9uZW50VHlwZV19JyBmb3IgYm9uZSBpbmRpY2VzLiBFeHBlY3RlZCAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURV19JyBvciAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlRdfScuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZsb2F0MzJBcnJheX0gZm9yIHRoZSBnaXZlbiBhY2Nlc3NvciBpbmRleC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEZsb2F0MzJBcnJheShfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgZ2x0ZkFjY2Vzc29yOiBHTFRGLkFjY2Vzc29yID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5GTE9BVClcclxuICAgICAgICByZXR1cm4gYXJyYXkgYXMgRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5ub3JtYWxpemVkKSB7XHJcbiAgICAgICAgc3dpdGNoIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLkJZVEU6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IE1hdGgubWF4KF92YWx1ZSAvIDEyNywgLTEpKTtcclxuICAgICAgICAgIGNhc2UgR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFOlxyXG4gICAgICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXksIF92YWx1ZSA9PiBfdmFsdWUgLyAyNTUpO1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLlNIT1JUOlxyXG4gICAgICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXksIF92YWx1ZSA9PiBNYXRoLm1heChfdmFsdWUgLyAzMjc2NywgLTEpKTtcclxuICAgICAgICAgIGNhc2UgR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVDpcclxuICAgICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5LCBfdmFsdWUgPT4gX3ZhbHVlIC8gNjU1MzUpO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBJbnZhbGlkIGNvbXBvbmVudCB0eXBlICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGVdfScgZm9yIG5vcm1hbGl6ZWQgYWNjZXNzb3IuYCk7XHJcbiAgICAgICAgICAvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjX2FjY2Vzc29yX25vcm1hbGl6ZWRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IEV4cGVjdGVkIGNvbXBvbmVudCB0eXBlICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5GTE9BVF19JyBidXQgd2FzICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbZ2x0ZkFjY2Vzc29yPy5jb21wb25lbnRUeXBlXX0nLmApO1xyXG4gICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBVaW50MTZBcnJheX0gZm9yIHRoZSBnaXZlbiBhY2Nlc3NvciBpbmRleC4gT25seSB1c2VkIHRvIGdldCB0aGUgdmVydGV4IGluZGljZXMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRWZXJ0ZXhJbmRpY2VzKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8VWludDE2QXJyYXk+IHtcclxuICAgICAgY29uc3QgYXJyYXk6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckRhdGEoX2lBY2Nlc3Nvcik7XHJcbiAgICAgIGNvbnN0IGdsdGZBY2Nlc3NvcjogR0xURi5BY2Nlc3NvciA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlQpXHJcbiAgICAgICAgcmV0dXJuIGFycmF5IGFzIFVpbnQxNkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5jb3VudCA+IDY1NTM1ICYmIGdsdGZBY2Nlc3Nvci50eXBlID09IFwiU0NBTEFSXCIpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBGaWxlIGluY2x1ZGVzIGEgbWVzaCB3aXRoIG1vcmUgdGhhbiA2NTUzNSB2ZXJ0aWNlcy4gRlVER0UgZG9lcyBub3Qgc3VwcG9ydCBtZXNoZXMgd2l0aCBtb3JlIHRoYW4gNjU1MzUgdmVydGljZXMuYCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFIHx8IGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UKVxyXG4gICAgICAgIHJldHVybiBVaW50MTZBcnJheS5mcm9tKGFycmF5KTtcclxuXHJcbiAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IEV4cGVjdGVkIGFuIHVuc2lnbmVkIGludGVnZXIgY29tcG9uZW50IHR5cGUgYnV0IHdhcyAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW3RoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdPy5jb21wb25lbnRUeXBlXX0nLmApO1xyXG4gICAgICByZXR1cm4gVWludDE2QXJyYXkuZnJvbShhcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSB7QGxpbmsgRmxvYXQzMkFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LiBUaGUgYXJyYXkgY29udGFpbnMgdGhlIHZlcnRleCBjb2xvcnMgaW4gUkdCQSBmb3JtYXQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRWZXJ0ZXhDb2xvcnMoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcclxuICAgICAgY29uc3QgYXJyYXk6IEZsb2F0MzJBcnJheSA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KF9pQWNjZXNzb3IpO1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IudHlwZSA9PSBHTFRGLkFDQ0VTU09SX1RZUEUuVkVDMykge1xyXG4gICAgICAgIGNvbnN0IHJnYmFBcnJheTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShhcnJheS5sZW5ndGggKiA0IC8gMyk7XHJcbiAgICAgICAgZm9yIChsZXQgaVZlYzM6IG51bWJlciA9IDAsIGlWZWM0OiBudW1iZXIgPSAwOyBpVmVjMyA8IGFycmF5Lmxlbmd0aDsgaVZlYzMgKz0gMywgaVZlYzQgKz0gNCkge1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0XSA9IGFycmF5W2lWZWMzXTtcclxuICAgICAgICAgIHJnYmFBcnJheVtpVmVjNCArIDFdID0gYXJyYXlbaVZlYzMgKyAxXTtcclxuICAgICAgICAgIHJnYmFBcnJheVtpVmVjNCArIDJdID0gYXJyYXlbaVZlYzMgKyAyXTtcclxuICAgICAgICAgIHJnYmFBcnJheVtpVmVjNCArIDNdID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJnYmFBcnJheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPFR5cGVkQXJyYXk+IHtcclxuICAgICAgY29uc3QgZ2x0ZkFjY2Vzc29yOiBHTFRGLkFjY2Vzc29yID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl07XHJcbiAgICAgIGlmICghZ2x0ZkFjY2Vzc29yKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBhY2Nlc3NvciB3aXRoIGluZGV4ICR7X2lBY2Nlc3Nvcn0uYCk7XHJcblxyXG4gICAgICBsZXQgYXJyYXk6IFR5cGVkQXJyYXk7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGU6IEdMVEYuQ09NUE9ORU5UX1RZUEUgPSBnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZTtcclxuICAgICAgY29uc3QgYWNjZXNzb3JUeXBlOiBHTFRGLkFDQ0VTU09SX1RZUEUgPSBnbHRmQWNjZXNzb3IudHlwZTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuYnVmZmVyVmlldyAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgYXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlclZpZXdEYXRhKHRoaXMuI2dsdGYuYnVmZmVyVmlld3NbZ2x0ZkFjY2Vzc29yLmJ1ZmZlclZpZXddLCBnbHRmQWNjZXNzb3IuYnl0ZU9mZnNldCwgY29tcG9uZW50VHlwZSwgYWNjZXNzb3JUeXBlKTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3Iuc3BhcnNlKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZkJ1ZmZlclZpZXdJbmRpY2VzOiBHTFRGLkJ1ZmZlclZpZXcgPSB0aGlzLiNnbHRmLmJ1ZmZlclZpZXdzW2dsdGZBY2Nlc3Nvci5zcGFyc2UuaW5kaWNlcy5idWZmZXJWaWV3XTtcclxuICAgICAgICBjb25zdCBnbHRmQnVmZmVyVmlld1ZhbHVlczogR0xURi5CdWZmZXJWaWV3ID0gdGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmQWNjZXNzb3Iuc3BhcnNlLnZhbHVlcy5idWZmZXJWaWV3XTtcclxuXHJcbiAgICAgICAgaWYgKCFnbHRmQnVmZmVyVmlld0luZGljZXMgfHwgIWdsdGZCdWZmZXJWaWV3VmFsdWVzKVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIGJ1ZmZlciB2aWV3cyBmb3Igc3BhcnNlIGluZGljZXMgb3IgdmFsdWVzIG9mIGFjY2Vzc29yIHdpdGggaW5kZXggJHtfaUFjY2Vzc29yfS5gKTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyYXlJbmRpY2VzOiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJWaWV3RGF0YShnbHRmQnVmZmVyVmlld0luZGljZXMsIGdsdGZBY2Nlc3Nvci5zcGFyc2UuaW5kaWNlcy5ieXRlT2Zmc2V0LCBnbHRmQWNjZXNzb3Iuc3BhcnNlLmluZGljZXMuY29tcG9uZW50VHlwZSwgR0xURi5BQ0NFU1NPUl9UWVBFLlNDQUxBUik7XHJcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZXM6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlclZpZXdEYXRhKGdsdGZCdWZmZXJWaWV3VmFsdWVzLCBnbHRmQWNjZXNzb3Iuc3BhcnNlLnZhbHVlcy5ieXRlT2Zmc2V0LCBjb21wb25lbnRUeXBlLCBhY2Nlc3NvclR5cGUpO1xyXG5cclxuICAgICAgICBjb25zdCBhY2Nlc3NvclR5cGVMZW5ndGg6IG51bWJlciA9IHRvQWNjZXNzb3JUeXBlTGVuZ3RoW2dsdGZBY2Nlc3Nvci50eXBlXTtcclxuICAgICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmJ1ZmZlclZpZXcgPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgYXJyYXkgPSBuZXcgdG9BcnJheUNvbnN0cnVjdG9yW2dsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlXShnbHRmQWNjZXNzb3IuY291bnQgKiBhY2Nlc3NvclR5cGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZ2x0ZkFjY2Vzc29yLnNwYXJzZS5jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBhcnJheS5zZXQoYXJyYXlWYWx1ZXMuc2xpY2UoaSAqIGFjY2Vzc29yVHlwZUxlbmd0aCwgKGkgKyAxKSAqIGFjY2Vzc29yVHlwZUxlbmd0aCksIGFycmF5SW5kaWNlc1tpXSAqIGFjY2Vzc29yVHlwZUxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWZmZXJWaWV3RGF0YShfYnVmZmVyVmlldzogR0xURi5CdWZmZXJWaWV3LCBfYnl0ZU9mZnNldDogbnVtYmVyLCBfY29tcG9uZW50VHlwZTogR0xURi5DT01QT05FTlRfVFlQRSwgX2FjY2Vzc29yVHlwZTogR0xURi5BQ0NFU1NPUl9UWVBFKTogUHJvbWlzZTxUeXBlZEFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlcihfYnVmZmVyVmlldy5idWZmZXIpO1xyXG4gICAgICBjb25zdCBieXRlT2Zmc2V0OiBudW1iZXIgPSAoX2J1ZmZlclZpZXcuYnl0ZU9mZnNldCA/PyAwKSArIChfYnl0ZU9mZnNldCA/PyAwKTtcclxuICAgICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gX2J1ZmZlclZpZXcuYnl0ZUxlbmd0aCA/PyAwO1xyXG4gICAgICBjb25zdCBieXRlU3RyaWRlOiBudW1iZXIgPSBfYnVmZmVyVmlldy5ieXRlU3RyaWRlO1xyXG5cclxuICAgICAgY29uc3QgYXJyYXlDb25zdHJ1Y3RvcjogVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gdG9BcnJheUNvbnN0cnVjdG9yW19jb21wb25lbnRUeXBlXTtcclxuICAgICAgY29uc3QgYXJyYXk6IFR5cGVkQXJyYXkgPSBuZXcgYXJyYXlDb25zdHJ1Y3RvcihidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggLyBhcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UKTtcclxuXHJcbiAgICAgIGlmIChieXRlU3RyaWRlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vIFRPRE86IGluc3RlYWQgb2YgY3JlYXRpbmcgbmV3IGJ1ZmZlcnMgbWF5YmUgcmF0aGVyIHBhc3Mgc3RyaWRlIGludG8gdGhlIHJlbmRlciBtZXNoPyBhbmQgc2V0IGl0IHdoZW4gZGF0YSBpcyBwYXNzZWQgdG8gdGhlIGdwdT9cclxuICAgICAgICBjb25zdCBuQ29tcG9uZW50c1BlckVsZW1lbnQ6IG51bWJlciA9IHRvQWNjZXNzb3JUeXBlTGVuZ3RoW19hY2Nlc3NvclR5cGVdOyAvLyBhbW91bnQgb2YgY29tcG9uZW50cyBwZXIgZWxlbWVudCBvZiB0aGUgYWNjZXNzb3IgdHlwZSwgZS5nLiAzIGZvciBWRUMzXHJcbiAgICAgICAgY29uc3QgbkVsZW1lbnRzOiBudW1iZXIgPSBieXRlTGVuZ3RoIC8gYnl0ZVN0cmlkZTsgLy8gYW1vdW50IG9mIGVsZW1lbnRzLCBlLmcuIG4qVkVDMyBcclxuICAgICAgICBjb25zdCBzdHJpZGU6IG51bWJlciA9IGJ5dGVTdHJpZGUgLyBhcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xyXG4gICAgICAgIGNvbnN0IG5ld0FycmF5OiBUeXBlZEFycmF5ID0gbmV3IGFycmF5Q29uc3RydWN0b3IobkVsZW1lbnRzICogbkNvbXBvbmVudHNQZXJFbGVtZW50KTtcclxuICAgICAgICBmb3IgKGxldCBpTmV3RWxlbWVudDogbnVtYmVyID0gMDsgaU5ld0VsZW1lbnQgPCBuRWxlbWVudHM7IGlOZXdFbGVtZW50KyspIHtcclxuICAgICAgICAgIGNvbnN0IGlFbGVtZW50OiBudW1iZXIgPSBpTmV3RWxlbWVudCAqIHN0cmlkZTtcclxuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIGxvb3AgaXMgZmFzdGVyIHRoYW4gc2V0ICsgc2xpY2VcclxuICAgICAgICAgIGZvciAobGV0IGlDb21wb25lbnQ6IG51bWJlciA9IDA7IGlDb21wb25lbnQgPCBuQ29tcG9uZW50c1BlckVsZW1lbnQ7IGlDb21wb25lbnQrKylcclxuICAgICAgICAgICAgbmV3QXJyYXlbaU5ld0VsZW1lbnQgKiBuQ29tcG9uZW50c1BlckVsZW1lbnQgKyBpQ29tcG9uZW50XSA9IGFycmF5W2lFbGVtZW50ICsgaUNvbXBvbmVudF07XHJcbiAgICAgICAgICAvLyBuZXdBcnJheS5zZXQoYXJyYXkuc2xpY2UoaUVsZW1lbnQsIGlFbGVtZW50ICsgbkNvbXBvbmVudHNQZXJFbGVtZW50KSwgaU5ld0VsZW1lbnQgKiBuQ29tcG9uZW50c1BlckVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0FycmF5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWZmZXIoX2lCdWZmZXI6IG51bWJlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgICAgY29uc3QgZ2x0ZkJ1ZmZlcjogR0xURi5CdWZmZXIgPSB0aGlzLiNnbHRmLmJ1ZmZlcnNbX2lCdWZmZXJdO1xyXG4gICAgICBpZiAoIWdsdGZCdWZmZXIpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIGJ1ZmZlciB3aXRoIGluZGV4ICR7X2lCdWZmZXJ9LmApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLiNidWZmZXJzKVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNidWZmZXJzW19pQnVmZmVyXSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoKG5ldyBVUkwoZ2x0ZkJ1ZmZlci51cmksIG5ldyBVUkwodGhpcy4jdXJsLCBQcm9qZWN0LmJhc2VVUkwpKSk7XHJcbiAgICAgICAgdGhpcy4jYnVmZmVyc1tfaUJ1ZmZlcl0gPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jYnVmZmVyc1tfaUJ1ZmZlcl07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRBbmltYXRpb25TZXF1ZW5jZVZlY3Rvcihfc2FtcGxlcjogR0xURi5BbmltYXRpb25TYW1wbGVyLCBfdHJhbnNmb3JtYXRpb25UeXBlOiBHTFRGLkFuaW1hdGlvbkNoYW5uZWxUYXJnZXRbXCJwYXRoXCJdKTogUHJvbWlzZTxBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgfCBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjQ+IHtcclxuICAgICAgY29uc3QgaW5wdXQ6IEZsb2F0MzJBcnJheSA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KF9zYW1wbGVyLmlucHV0KTtcclxuICAgICAgY29uc3Qgb3V0cHV0OiBGbG9hdDMyQXJyYXkgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShfc2FtcGxlci5vdXRwdXQpO1xyXG5cclxuICAgICAgY29uc3QgbWlsbGlzUGVyU2Vjb25kOiBudW1iZXIgPSAxMDAwO1xyXG4gICAgICBjb25zdCBpc1JvdGF0aW9uOiBib29sZWFuID0gX3RyYW5zZm9ybWF0aW9uVHlwZSA9PSBcInJvdGF0aW9uXCI7XHJcbiAgICAgIGNvbnN0IHZlY3Rvckxlbmd0aDogbnVtYmVyID0gaXNSb3RhdGlvbiA/IDQgOiAzOyAvLyByb3RhdGlvbiBpcyBzdG9yZWQgYXMgcXVhdGVybmlvblxyXG4gICAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiA9IHRoaXMudG9JbnRlcm5JbnRlcnBvbGF0aW9uKF9zYW1wbGVyLmludGVycG9sYXRpb24pO1xyXG4gICAgICBjb25zdCBpc0N1YmljOiB0cnVlIHwgdW5kZWZpbmVkID0gaW50ZXJwb2xhdGlvbiA9PSBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQyA/IHRydWUgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGNvbnN0IHZlY3RvcnNQZXJJbnB1dDogbnVtYmVyID0gaXNDdWJpYyA/IDMgOiAxOyAvLyBjdWJpYyBpbnRlcnBvbGF0aW9uIHVzZXMgMyB2YWx1ZXMgcGVyIGlucHV0OiBpbi10YW5nZW50LCBwcm9wZXJ0eSB2YWx1ZSBhbmQgb3V0LXRhbmdlbnQuIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNpbnRlcnBvbGF0aW9uLWN1YmljXHJcblxyXG4gICAgICAvLyB1c2VkIG9ubHkgZm9yIHJvdGF0aW9uIGludGVycG9sYXRpb25cclxuICAgICAgbGV0IGxhc3RSb3RhdGlvbjogUXVhdGVybmlvbjtcclxuICAgICAgbGV0IG5leHRSb3RhdGlvbjogUXVhdGVybmlvbjtcclxuXHJcbiAgICAgIGNvbnN0IHNlcXVlbmNlczogeyB4OiBBbmltYXRpb25LZXlbXTsgeTogQW5pbWF0aW9uS2V5W107IHo6IEFuaW1hdGlvbktleVtdOyB3PzogQW5pbWF0aW9uS2V5W10gfSA9IHsgeDogW10sIHk6IFtdLCB6OiBbXSB9O1xyXG4gICAgICBpZiAoaXNSb3RhdGlvbikge1xyXG4gICAgICAgIHNlcXVlbmNlcy53ID0gW107XHJcbiAgICAgICAgbGFzdFJvdGF0aW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgIG5leHRSb3RhdGlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaUlucHV0OiBudW1iZXIgPSAwOyBpSW5wdXQgPCBpbnB1dC5sZW5ndGg7IGlJbnB1dCsrKSB7XHJcbiAgICAgICAgY29uc3QgaU91dHB1dDogbnVtYmVyID0gaUlucHV0ICogdmVjdG9yc1BlcklucHV0ICogdmVjdG9yTGVuZ3RoICsgKGlzQ3ViaWMgPyB2ZWN0b3JMZW5ndGggOiAwKTtcclxuICAgICAgICBjb25zdCBpT3V0cHV0U2xvcGVJbjogbnVtYmVyID0gaU91dHB1dCAtIHZlY3Rvckxlbmd0aDtcclxuICAgICAgICBjb25zdCBpT3V0cHV0U2xvcGVPdXQ6IG51bWJlciA9IGlPdXRwdXQgKyB2ZWN0b3JMZW5ndGg7XHJcbiAgICAgICAgY29uc3QgdGltZTogbnVtYmVyID0gbWlsbGlzUGVyU2Vjb25kICogaW5wdXRbaUlucHV0XTtcclxuXHJcbiAgICAgICAgaWYgKGlzUm90YXRpb24pIHtcclxuICAgICAgICAgIC8vIFRha2UgdGhlIHNob3J0ZXN0IHBhdGggYmV0d2VlbiB0d28gcm90YXRpb25zLCBpLmUuIGlmIHRoZSBkb3QgcHJvZHVjdCBpcyBuZWdhdGl2ZSB0aGVuIHRoZSBuZXh0IHF1YXRlcm5pb24gbmVlZHMgdG8gYmUgbmVnYXRlZC5cclxuICAgICAgICAgIC8vIHEgYW5kIC1xIHJlcHJlc2VudCB0aGUgc2FtZSByb3RhdGlvbiBidXQgaW50ZXJwb2xhdGlvbiB3aWxsIHRha2UgZWl0aGVyIHRoZSBsb25nIHdheSBvciB0aGUgc2hvcnQgd2F5IGFyb3VuZCB0aGUgc3BoZXJlIGRlcGVuZGluZyBvbiB3aGljaCB3ZSB1c2UuXHJcbiAgICAgICAgICBuZXh0Um90YXRpb24uc2V0KG91dHB1dFtpT3V0cHV0ICsgMF0sIG91dHB1dFtpT3V0cHV0ICsgMV0sIG91dHB1dFtpT3V0cHV0ICsgMl0sIG91dHB1dFtpT3V0cHV0ICsgM10pO1xyXG4gICAgICAgICAgaWYgKFF1YXRlcm5pb24uRE9UKGxhc3RSb3RhdGlvbiwgbmV4dFJvdGF0aW9uKSA8IDApXHJcbiAgICAgICAgICAgIG5leHRSb3RhdGlvbi5uZWdhdGUoKTtcclxuICAgICAgICAgIG91dHB1dFtpT3V0cHV0ICsgMF0gPSBuZXh0Um90YXRpb24ueDtcclxuICAgICAgICAgIG91dHB1dFtpT3V0cHV0ICsgMV0gPSBuZXh0Um90YXRpb24ueTtcclxuICAgICAgICAgIG91dHB1dFtpT3V0cHV0ICsgMl0gPSBuZXh0Um90YXRpb24uejtcclxuICAgICAgICAgIG91dHB1dFtpT3V0cHV0ICsgM10gPSBuZXh0Um90YXRpb24udztcclxuICAgICAgICAgIGxhc3RSb3RhdGlvbi5zZXQobmV4dFJvdGF0aW9uLngsIG5leHRSb3RhdGlvbi55LCBuZXh0Um90YXRpb24ueiwgbmV4dFJvdGF0aW9uLncpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VxdWVuY2VzLngucHVzaChuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIG91dHB1dFtpT3V0cHV0ICsgMF0sIGludGVycG9sYXRpb24sIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZUluICsgMF0gLyBtaWxsaXNQZXJTZWNvbmQsIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZU91dCArIDBdIC8gbWlsbGlzUGVyU2Vjb25kKSk7XHJcbiAgICAgICAgc2VxdWVuY2VzLnkucHVzaChuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIG91dHB1dFtpT3V0cHV0ICsgMV0sIGludGVycG9sYXRpb24sIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZUluICsgMV0gLyBtaWxsaXNQZXJTZWNvbmQsIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZU91dCArIDFdIC8gbWlsbGlzUGVyU2Vjb25kKSk7XHJcbiAgICAgICAgc2VxdWVuY2VzLnoucHVzaChuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIG91dHB1dFtpT3V0cHV0ICsgMl0sIGludGVycG9sYXRpb24sIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZUluICsgMl0gLyBtaWxsaXNQZXJTZWNvbmQsIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZU91dCArIDJdIC8gbWlsbGlzUGVyU2Vjb25kKSk7XHJcbiAgICAgICAgaWYgKGlzUm90YXRpb24pXHJcbiAgICAgICAgICBzZXF1ZW5jZXMudy5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAzXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAzXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgM10gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzUm90YXRpb24pIHtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShsYXN0Um90YXRpb24pO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG5leHRSb3RhdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2VxdWVuY2VzKS5tYXAoKFtfa2V5LCBfdmFsdWVdKSA9PiBbX2tleSwgbmV3IEFuaW1hdGlvblNlcXVlbmNlKF92YWx1ZSldKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b0ludGVybkludGVycG9sYXRpb24oX2ludGVycG9sYXRpb246IEdMVEYuQW5pbWF0aW9uU2FtcGxlcltcImludGVycG9sYXRpb25cIl0pOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICAgIHN3aXRjaCAoX2ludGVycG9sYXRpb24pIHtcclxuICAgICAgICBjYXNlIFwiTElORUFSXCI6XHJcbiAgICAgICAgICByZXR1cm4gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uTElORUFSO1xyXG4gICAgICAgIGNhc2UgXCJTVEVQXCI6XHJcbiAgICAgICAgICByZXR1cm4gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ09OU1RBTlQ7XHJcbiAgICAgICAgY2FzZSBcIkNVQklDU1BMSU5FXCI6XHJcbiAgICAgICAgICByZXR1cm4gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ1VCSUM7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChfaW50ZXJwb2xhdGlvbiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7X2ludGVycG9sYXRpb259LmApO1xyXG4gICAgICAgICAgcmV0dXJuIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0V2ViR0xQYXJhbWV0ZXJOYW1lKF92YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0KS5maW5kKF9rZXkgPT4gUmVmbGVjdC5nZXQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgX2tleSkgPT0gX3ZhbHVlKTtcclxuICB9XHJcblxyXG4gIHR5cGUgVHlwZWRBcnJheSA9IFVpbnQ4QXJyYXkgfCBVaW50MTZBcnJheSB8IFVpbnQzMkFycmF5IHwgSW50OEFycmF5IHwgSW50MTZBcnJheSB8IEZsb2F0MzJBcnJheTtcclxuICB0eXBlIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IFVpbnQ4QXJyYXlDb25zdHJ1Y3RvciB8IFVpbnQxNkFycmF5Q29uc3RydWN0b3IgfCBVaW50MzJBcnJheUNvbnN0cnVjdG9yIHwgSW50OEFycmF5Q29uc3RydWN0b3IgfCBJbnQxNkFycmF5Q29uc3RydWN0b3IgfCBGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvcjtcclxuXHJcbiAgY29uc3QgdG9JbnRlcm5UcmFuc2Zvcm1hdGlvbjogUmVjb3JkPEdMVEYuQW5pbWF0aW9uQ2hhbm5lbFRhcmdldFtcInBhdGhcIl0sIHN0cmluZz4gPSB7XHJcbiAgICBcInRyYW5zbGF0aW9uXCI6IFwidHJhbnNsYXRpb25cIixcclxuICAgIFwicm90YXRpb25cIjogXCJyb3RhdGlvblwiLFxyXG4gICAgXCJzY2FsZVwiOiBcInNjYWxpbmdcIixcclxuICAgIFwid2VpZ2h0c1wiOiBcIndlaWdodHNcIlxyXG4gIH07XHJcblxyXG4gIC8vIG51bWJlciBvZiBjb21wb25lbnRzIGRlZmluZWQgYnkgJ3R5cGUnXHJcbiAgY29uc3QgdG9BY2Nlc3NvclR5cGVMZW5ndGg6IFJlY29yZDxHTFRGLkFDQ0VTU09SX1RZUEUsIG51bWJlcj4gPSB7XHJcbiAgICBcIlNDQUxBUlwiOiAxLFxyXG4gICAgXCJWRUMyXCI6IDIsXHJcbiAgICBcIlZFQzNcIjogMyxcclxuICAgIFwiVkVDNFwiOiA0LFxyXG4gICAgXCJNQVQyXCI6IDQsXHJcbiAgICBcIk1BVDNcIjogOSxcclxuICAgIFwiTUFUNFwiOiAxNlxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRvQXJyYXlDb25zdHJ1Y3RvcjogUmVjb3JkPEdMVEYuQ09NUE9ORU5UX1RZUEUsIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj4gPSB7XHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFXTogVWludDhBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLkJZVEVdOiBJbnQ4QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVF06IFVpbnQxNkFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuU0hPUlRdOiBJbnQxNkFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UXTogVWludDMyQXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5GTE9BVF06IEZsb2F0MzJBcnJheVxyXG4gIH07XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgbGV0IHNoYWRlclNvdXJjZXM6IHtbc291cmNlOiBzdHJpbmddOiBzdHJpbmd9ID0ge307XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckFtYmllbnRPY2NsdXNpb24uZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYW1iaWVudCBvY2NsdXNpb24gZm9yIGEgZ2l2ZW4gZnJhZ21lbnRcclxuICogQGF1dGhvcnMgUm9sYW5kIEhlZXIsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKiBhZGFwdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vdHNoZXJpZi93ZWJnbDJleGFtcGxlcy9ibG9iL2RhMTE1M2ExNWViYzA5YmIxMzQ5OGU1ZjczMmVmMjAzNjUwNzc0MGMvc3Nhby5odG1sXHJcbiAqIHNlZSBoZXJlIGZvciBhbiBpbiBkZXB0aCBleHBsYW5hdGlvbjogXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxuY29uc3QgZmxvYXQgc2luNDUgPSAwLjcwNzEwNzsgLy8gNDUgZGVncmVlcyBpbiByYWRpYW5zXHJcbmNvbnN0IHZlYzIga2VybmVsWzRdID0gdmVjMls0XSh2ZWMyKDAuMCwgMS4wKSwgdmVjMigxLjAsIDAuMCksIHZlYzIoMC4wLCAtMS4wKSwgdmVjMigtMS4wLCAwLjApKTtcclxuXHJcbnVuaWZvcm0gZmxvYXQgdV9mTmVhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZGYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mU2FtcGxlUmFkaXVzO1xyXG51bmlmb3JtIGZsb2F0IHVfZkJpYXM7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25Db25zdGFudDtcclxudW5pZm9ybSBmbG9hdCB1X2ZBdHRlbnVhdGlvbkxpbmVhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZBdHRlbnVhdGlvblF1YWRyYXRpYztcclxudW5pZm9ybSB2ZWMyIHVfdmN0UmVzb2x1dGlvbjtcclxudW5pZm9ybSB2ZWMzIHVfdmN0Q2FtZXJhO1xyXG4vLyB1bmlmb3JtIG1hdDQgdV9tdHhWaWV3UHJvamVjdGlvbkludmVyc2U7XHJcblxyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleFBvc2l0aW9uO1xyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleE5vcm1hbDtcclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb2lzZTtcclxuLy8gdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhEZXB0aDtcclxuXHJcbmluIHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5vdXQgdmVjNCB2Y3RGcmFnO1xyXG5cclxubGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBGb2cge1xyXG4gIGJvb2wgdV9iRm9nQWN0aXZlO1xyXG4gIGZsb2F0IHVfZkZvZ05lYXI7XHJcbiAgZmxvYXQgdV9mRm9nRmFyO1xyXG4gIGZsb2F0IHBhZGluZztcclxuICB2ZWM0IHVfdmN0Rm9nQ29sb3I7XHJcbn07XHJcblxyXG4vLyBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBkZXB0aCB0ZXh0dXJlLCBidXQgbW9iaWxlIGRldmljZXMgc2VlbXMgdG8gbGFjayBpbiBwcmVjaXNpb24gdG8gZG8gdGhpc1xyXG4vLyB2ZWMzIGdldFBvc2l0aW9uKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICBmbG9hdCBmRGVwdGggPSB0ZXh0dXJlKHVfdGV4RGVwdGgsIF92Y3RUZXh0dXJlKS5yO1xyXG4vLyAgIHZlYzQgY2xpcFNwYWNlUG9zaXRpb24gPSB2ZWM0KF92Y3RUZXh0dXJlICogMi4wIC0gMS4wLCBmRGVwdGggKiAyLjAgLSAxLjAsIDEuMCk7XHJcbi8vICAgdmVjNCB3b3JsZFNwYWNlUG9zaXRpb24gPSB1X210eFZpZXdQcm9qZWN0aW9uSW52ZXJzZSAqIGNsaXBTcGFjZVBvc2l0aW9uO1xyXG4vLyAgIHJldHVybiB3b3JsZFNwYWNlUG9zaXRpb24ueHl6IC8gd29ybGRTcGFjZVBvc2l0aW9uLnc7XHJcbi8vIH1cclxuXHJcbmZsb2F0IGdldE9jY2x1c2lvbih2ZWMzIF92Y3RQb3NpdGlvbiwgdmVjMyBfdmN0Tm9ybWFsLCB2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbiAgdmVjMyB2Y3RPY2NsdWRlciA9IHRleHR1cmUodV90ZXhQb3NpdGlvbiwgX3ZjdFRleHR1cmUpLnh5ejtcclxuXHJcbiAgaWYgKHZjdE9jY2x1ZGVyLnggPT0gMC4wICYmIHZjdE9jY2x1ZGVyLnkgPT0gMC4wICYmIHZjdE9jY2x1ZGVyLnogPT0gMC4wKSAvLyBubyBvY2NsdWRlciBhdCB0aGlzIHBvc2l0aW9uXHJcbiAgICByZXR1cm4gMC4wO1xyXG5cclxuICB2ZWMzIHZjdERpc3RhbmNlID0gdmN0T2NjbHVkZXIgLSBfdmN0UG9zaXRpb247XHJcbiAgZmxvYXQgZkludGVuc2l0eSA9IG1heChkb3QoX3ZjdE5vcm1hbCwgbm9ybWFsaXplKHZjdERpc3RhbmNlKSkgLSB1X2ZCaWFzLCAwLjApO1xyXG5cclxuICBmbG9hdCBmRGlzdGFuY2UgPSBsZW5ndGgodmN0RGlzdGFuY2UpO1xyXG4gIGZsb2F0IGZBdHRlbnVhdGlvbiA9IDEuMCAvICh1X2ZBdHRlbnVhdGlvbkNvbnN0YW50ICsgdV9mQXR0ZW51YXRpb25MaW5lYXIgKiBmRGlzdGFuY2UgKyB1X2ZBdHRlbnVhdGlvblF1YWRyYXRpYyAqIGZEaXN0YW5jZSAqIGZEaXN0YW5jZSk7XHJcblxyXG4gIHJldHVybiBmSW50ZW5zaXR5ICogZkF0dGVudWF0aW9uO1xyXG59XHJcblxyXG5mbG9hdCBnZXRGb2codmVjMyBfdmN0UG9zaXRpb24pIHtcclxuICBmbG9hdCBmRGlzdGFuY2UgPSBsZW5ndGgoX3ZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpOyAvLyBtYXliZSB1c2Ugei1kZXB0aCBpbnN0ZWFkIG9mIGV1Y2xpZGVhbiBkZXB0aFxyXG4gIGZsb2F0IGZGb2cgPSBjbGFtcCgoZkRpc3RhbmNlIC0gdV9mRm9nTmVhcikgLyAodV9mRm9nRmFyIC0gdV9mRm9nTmVhciksIDAuMCwgMS4wKTtcclxuICBmRm9nID0gLXBvdyhmRm9nLCAyLjApICsgKDIuMCAqIGZGb2cpOyAvLyBsZXRzIGZvZyBhcHBlYXIgcXVpY2tlciBhbmQgZmFsbCBvZmYgc2xvd2VyIHJlc3VsdHMgaW4gYSBtb3JlIGdyYWR1YWwgZmFsbG9mZlxyXG4gIHJldHVybiBmRm9nICogdV92Y3RGb2dDb2xvci5hO1xyXG59XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgdmVjMyB2Y3RQb3NpdGlvbiA9IHRleHR1cmUodV90ZXhQb3NpdGlvbiwgdl92Y3RUZXh0dXJlKS54eXo7XHJcbiAgdmVjMyB2Y3ROb3JtYWwgPSB0ZXh0dXJlKHVfdGV4Tm9ybWFsLCB2X3ZjdFRleHR1cmUpLnh5ejtcclxuICB2ZWMyIHZjdFJhbmRvbSA9IG5vcm1hbGl6ZSh0ZXh0dXJlKHVfdGV4Tm9pc2UsIHZfdmN0VGV4dHVyZSkueHkgKiAyLjAgLSAxLjApO1xyXG4gIGZsb2F0IGZEZXB0aCA9IChsZW5ndGgodmN0UG9zaXRpb24gLSB1X3ZjdENhbWVyYSkgLSB1X2ZOZWFyKSAvICh1X2ZGYXIgLSB1X2ZOZWFyKTsgLy8gbGluZWFyIGV1Y2xpZGVhbiBkZXB0aCBpbiByYW5nZSBbMCwxXSwgd2hlbiBjaGFuZ2luZyB0byB2aWV3IHNwYWNlLCBkb24ndCBzdWJ0cmFjdCBjYW1lcmEgcG9zaXRpb25cclxuICBmbG9hdCBmS2VybmVsUmFkaXVzID0gdV9mU2FtcGxlUmFkaXVzICogKDEuMCAtIGZEZXB0aCk7XHJcblxyXG4gIGZsb2F0IGZPY2NsdXNpb24gPSAwLjA7XHJcbiAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHtcclxuICAgIHZlYzIgdmN0SzEgPSByZWZsZWN0KGtlcm5lbFtpXSwgdmN0UmFuZG9tKTtcclxuICAgIHZlYzIgdmN0SzIgPSB2ZWMyKHZjdEsxLnggKiBzaW40NSAtIHZjdEsxLnkgKiBzaW40NSwgdmN0SzEueCAqIHNpbjQ1ICsgdmN0SzEueSAqIHNpbjQ1KTtcclxuXHJcbiAgICB2Y3RLMSAvPSB1X3ZjdFJlc29sdXRpb247XHJcbiAgICB2Y3RLMiAvPSB1X3ZjdFJlc29sdXRpb247XHJcblxyXG4gICAgdmN0SzEgKj0gZktlcm5lbFJhZGl1cztcclxuICAgIHZjdEsyICo9IGZLZXJuZWxSYWRpdXM7XHJcblxyXG4gICAgZk9jY2x1c2lvbiArPSBnZXRPY2NsdXNpb24odmN0UG9zaXRpb24sIHZjdE5vcm1hbCwgdl92Y3RUZXh0dXJlICsgdmN0SzEpO1xyXG4gICAgZk9jY2x1c2lvbiArPSBnZXRPY2NsdXNpb24odmN0UG9zaXRpb24sIHZjdE5vcm1hbCwgdl92Y3RUZXh0dXJlICsgdmN0SzIgKiAwLjc1KTtcclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsxICogMC41KTtcclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsyICogMC4yNSk7XHJcbiAgfVxyXG5cclxuICBmT2NjbHVzaW9uID0gY2xhbXAoZk9jY2x1c2lvbiAvIDE2LjAsIDAuMCwgMS4wKTtcclxuXHJcbiAgaWYgKHVfYkZvZ0FjdGl2ZSAmJiBmT2NjbHVzaW9uID4gMC4wKSAvLyBjb3JyZWN0IG9jY2x1c2lvbiBieSBmb2cgZmFjdG9yXHJcbiAgICBmT2NjbHVzaW9uID0gbWl4KGZPY2NsdXNpb24sIDAuMCwgZ2V0Rm9nKHZjdFBvc2l0aW9uKSk7XHJcbiAgXHJcbiAgdmN0RnJhZy5yZ2IgPSB2ZWMzKGZPY2NsdXNpb24pO1xyXG4gIHZjdEZyYWcuYSA9IDEuMDtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckJsb29tLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBjb2xvcnMsIGRvd25zYW1wbGVzIGFuZCB1cHNhbXBsZXMgYSB0ZXh0dXJlXHJcbiAqIEFkYXB0aW9uIG9mIHRoZSBcImR1YWwgZmlsdGVyaW5nIGthd2FzZVwiIG1ldGhvZCBkZXNjcmliZWQgaW4gU0lHR1JBUEggMjAxNSBieSBNYXJpdXMgQmrDuHJnZVxyXG4gKiBodHRwczovL2NvbW11bml0eS5hcm0uY29tL2Nmcy1maWxlL19fa2V5L2NvbW11bml0eXNlcnZlci1ibG9ncy1jb21wb25lbnRzLXdlYmxvZ2ZpbGVzLzAwLTAwLTAwLTIwLTY2L3NpZ2dyYXBoMjAxNV8yRDAwX21tZ18yRDAwX21hcml1c18yRDAwX25vdGVzLnBkZlxyXG4gKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBpbnQgdV9pTW9kZTsgLy8gMDogZXh0cmFjdCwgMTogZG93bnNhbXBsZSwgMjogdXBzYW1wbGUsIDM6IGFwcGx5XHJcbnVuaWZvcm0gZmxvYXQgdV9mVGhyZXNob2xkO1xyXG51bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxudW5pZm9ybSBmbG9hdCB1X2ZIaWdobGlnaHREZXNhdHVyYXRpb247XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFRleGVsO1xyXG5cclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhTb3VyY2U7XHJcblxyXG5pbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbi8vIG9sZCBnYXVzc2lhbiBibHVyXHJcbi8vIGZsYXQgaW4gdmVjMls5XSB2X3ZjdE9mZnNldHM7XHJcbi8vIGNvbnN0IGZsb2F0IGdhdXNzaWFuS2VybmVsWzldID0gZmxvYXRbXSgwLjA0NSwgMC4xMjIsIDAuMDQ1LCAwLjEyMiwgMC4zMzIsIDAuMTIyLCAwLjA0NSwgMC4xMjIsIDAuMDQ1KTtcclxuLy8gdmVjNCBkb3duc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWM0IHZjdENvbG9yID0gdmVjNCgwLjApO1xyXG4vLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSBcclxuLy8gICAgIHZjdENvbG9yICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIHZfdmN0VGV4dHVyZSArIHZfdmN0T2Zmc2V0c1tpXSkgKiBnYXVzc2lhbktlcm5lbFtpXTtcclxuLy8gICByZXR1cm4gdmN0Q29sb3I7XHJcbi8vIH1cclxuLy8gdmVjNCB1cHNhbXBsZSh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgdmVjNCB2Y3RDb2xvciA9IHZlYzQoMC4wKTtcclxuLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgXHJcbi8vICAgICB2Y3RDb2xvciArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZfdmN0T2Zmc2V0c1tpXSkgKiBnYXVzc2lhbktlcm5lbFtpXTtcclxuLy8gICByZXR1cm4gdmN0Q29sb3I7XHJcbi8vIH1cclxuXHJcbi8vIHZlYzMgZXh0cmFjdCh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgdmVjMyB2Y3RDb2xvciA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKS5yZ2I7XHJcbi8vICAgaWYoYW55KGdyZWF0ZXJUaGFuKHZjdENvbG9yLCB2ZWMzKHVfZlRocmVzaG9sZCkpKSlcclxuLy8gICAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gICBkaXNjYXJkO1xyXG4vLyB9XHJcblxyXG4vLyB2ZWMzIGV4dHJhY3QodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4vLyAgIHZlYzMgdmN0Q29sb3IgPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSkucmdiO1xyXG4vLyAgIGZsb2F0IGx1bWluYW5jZSA9IGRvdCh2Y3RDb2xvciwgdmVjMygwLjI5OSwgMC41ODcsIDAuMTE0KSk7XHJcbi8vICAgaWYobHVtaW5hbmNlID4gdV9mVGhyZXNob2xkKVxyXG4vLyAgICAgcmV0dXJuIHZjdENvbG9yO1xyXG4vLyAgIGRpc2NhcmQ7XHJcbi8vIH1cclxuXHJcbi8vIG9sZCBleHRyYWN0aW9uIHdpdGggYXZlcmFnZSBicmlnaHRuZXNzXHJcbnZlYzMgZXh0cmFjdCh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbiAgdmVjMyB2Y3RDb2xvciA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKS5yZ2I7XHJcbiAgZmxvYXQgZlRocmVzaG9sZCA9IHVfZlRocmVzaG9sZDtcclxuICBpZihmVGhyZXNob2xkID49IDEuMClcclxuICAgIGZUaHJlc2hvbGQgPSAwLjk5OTk5OTtcclxuXHJcbiAgdmN0Q29sb3IgPSB2Y3RDb2xvciAtIGZUaHJlc2hvbGQ7XHJcbiAgdmN0Q29sb3IgPSB2Y3RDb2xvciAvICgxLjAgLSBmVGhyZXNob2xkKTsgLy8gbmVnYXRpdmUgdmFsdWVzIG1pZ2h0IHJlY2VpdmUgdmFsdWVzIGFib3ZlIDEuMC4uLlxyXG4gIFxyXG4gIGZsb2F0IGF2ZXJhZ2VCcmlnaHRuZXNzID0gKCgodmN0Q29sb3IuciArIHZjdENvbG9yLmcgKyB2Y3RDb2xvci5iKSAvIDMuMCkgKiAwLjIpICsgMC44OyAvL3RoZSBlZmZlY3QgaXMgcmVkdWNlZCBieSBmaXJzdCBzZXR0aW5nIGl0IHRvIGEgMC4wLTAuMiByYW5nZSBhbmQgdGhlbiBhZGRpbmcgMC44XHJcbiAgdmN0Q29sb3IgPSBjbGFtcCh2Y3RDb2xvciwgMC4wLCAxLjApICogY2xhbXAoYXZlcmFnZUJyaWdodG5lc3MsIDAuMCwgMS4wKTtcclxuICByZXR1cm4gdmN0Q29sb3I7XHJcbn1cclxuXHJcbnZlYzQgZG93bnNhbXBsZSh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbiAgdmVjNCBzdW0gPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSkgKiA0LjA7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlIC0gdV92Y3RUZXhlbC54eSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdV92Y3RUZXhlbC54eSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMih1X3ZjdFRleGVsLngsIC11X3ZjdFRleGVsLnkpKTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgLSB2ZWMyKHVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpO1xyXG5cclxuICByZXR1cm4gc3VtIC8gOC4wO1xyXG59XHJcblxyXG52ZWM0IHVwc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWM0IHN1bSA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigtdV92Y3RUZXhlbC54ICogMi4wLCAwLjApKTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKC11X3ZjdFRleGVsLngsIHVfdmN0VGV4ZWwueSkpICogMi4wO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoMC4wLCB1X3ZjdFRleGVsLnkgKiAyLjApKTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCwgdV92Y3RUZXhlbC55KSkgKiAyLjA7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMih1X3ZjdFRleGVsLnggKiAyLjAsIDAuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIodV92Y3RUZXhlbC54LCAtdV92Y3RUZXhlbC55KSkgKiAyLjA7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigwLjAsIC11X3ZjdFRleGVsLnkgKiAyLjApKTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKC11X3ZjdFRleGVsLngsIC11X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICByZXR1cm4gc3VtIC8gMTIuMDtcclxufVxyXG5cclxudmVjMyBhcHBseSh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbiAgdmVjMyB2Y3RCbG9vbSA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKS5yZ2I7XHJcbiAgaWYgKHZjdEJsb29tLnIgPj0gMS4wIHx8IHZjdEJsb29tLmcgPj0gMS4wIHx8IHZjdEJsb29tLmIgPj0gMS4wKSAvLyBtYXliZSB1c2UgdGhyZXNob2xkIGluc3RlYWQgb2YgMS4wP1xyXG4gICAgdmN0Qmxvb20gPSBtaXgodmN0Qmxvb20sIHZlYzMoMS4wKSwgdV9mSGlnaGxpZ2h0RGVzYXR1cmF0aW9uKTtcclxuICB2Y3RCbG9vbSA9IGNsYW1wKHZjdEJsb29tICogdV9mSW50ZW5zaXR5LCAwLjAsIDEuMCk7XHJcbiAgcmV0dXJuIHZjdEJsb29tO1xyXG59XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgc3dpdGNoKHVfaU1vZGUpIHtcclxuICAgIGNhc2UgMDpcclxuICAgICAgdmN0RnJhZy5yZ2IgPSBleHRyYWN0KHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHZjdEZyYWcuYSA9IDEuMDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgY2FzZSAxOlxyXG4gICAgICB2Y3RGcmFnID0gZG93bnNhbXBsZSh2X3ZjdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlIDI6XHJcbiAgICAgIHZjdEZyYWcgPSB1cHNhbXBsZSh2X3ZjdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlIDM6XHJcbiAgICAgIHZjdEZyYWcucmdiID0gYXBwbHkodl92Y3RUZXh0dXJlKTtcclxuICAgICAgdmN0RnJhZy5hID0gMS4wO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICB2Y3RGcmFnID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgdl92Y3RUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gIH1cclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIC4uLlxyXG4qIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG5cclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGhTdGVuY2lsO1xyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiNlbmRpZlxyXG5cclxuLy8gLy8gNHg0IEJheWVyIG1hdHJpeCBmb3IgZGl0aGVyaW5nXHJcbi8vIGNvbnN0IGZsb2F0IG10eERpdGhlclsxNl0gPSBmbG9hdFtdKFxyXG4vLyAgIDEuMCAvIDE3LjAsICA5LjAgLyAxNy4wLCAgMy4wIC8gMTcuMCwgMTEuMCAvIDE3LjAsXHJcbi8vICAgMTMuMCAvIDE3LjAsICA1LjAgLyAxNy4wLCAxNS4wIC8gMTcuMCwgIDcuMCAvIDE3LjAsXHJcbi8vICAgNC4wIC8gMTcuMCwgMTIuMCAvIDE3LjAsICAyLjAgLyAxNy4wLCAxMC4wIC8gMTcuMCxcclxuLy8gICAxNi4wIC8gMTcuMCwgIDguMCAvIDE3LjAsIDE0LjAgLyAxNy4wLCAgNi4wIC8gMTcuMFxyXG4vLyApO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZjdEZyYWcgPSB1X3ZjdENvbG9yO1xyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICAgICAgdmN0RnJhZyAqPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAvLyBpbnQgeCA9IGludChnbF9GcmFnQ29vcmQueCkgJSA0O1xyXG4gIC8vIGludCB5ID0gaW50KGdsX0ZyYWdDb29yZC55KSAlIDQ7XHJcbiAgLy8gaW50IGluZGV4ID0geSAqIDQgKyB4O1xyXG4gIC8vIC8vIERpc2NhcmQgdGhlIGZyYWdtZW50IGlmIGl0cyBhbHBoYSBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGRpdGhlcmluZyBtYXRyaXhcclxuICAvLyBpZiAodmN0RnJhZy5hIDwgbXR4RGl0aGVyW2luZGV4XSkgXHJcbiAgLy8gICBkaXNjYXJkO1xyXG5cclxuICAvLyAvLyBEaXNjYXJkIHRoZSBmcmFnbWVudCBpZiBpdHMgYWxwaGEgaXMgMFxyXG4gIC8vIGlmICh2Y3RGcmFnLmEgPT0gMC4wKVxyXG4gIC8vICAgZGlzY2FyZDtcclxuXHJcbiAgLy8gLy8gQ3JlYXRlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4gZm9yIGFscGhhIHZhbHVlcyBsZXNzIHRoYW4gMC41XHJcbiAgLy8gZWxzZSBpZiAodmN0RnJhZy5hIDwgMC41ICYmICgoeCArIHkpICUgMiA9PSAwKSlcclxuICAvLyAgIGRpc2NhcmQ7XHJcblxyXG4gIC8vIHZjdEZyYWcuYSA9IDEuMDtcclxuXHJcbiAgaWYgKHZjdEZyYWcuYSA8IDAuMDEpXHJcbiAgICBkaXNjYXJkO1xyXG59YDtcclxuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogLi4uXHJcbiogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb247XHJcbi8vIHVuaWZvcm0gbWF0NCB1X210eE1vZGVsO1xyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3OyAvLyBtb2RlbC12aWV3LXByb2plY3Rpb24gbWF0cml4XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcblxyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuXHJcbiAgI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuXHJcbiAgICB2X3ZjdFRleHR1cmUgPSBhX3ZjdFRleHR1cmU7XHJcblxyXG4gICNlbmRpZlxyXG59YDtcclxuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGhvbmcuZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUGhvbmcgc2hhZGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyIHwgUm9sYW5kIEhlZXIsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIHZlYzQgdV92Y3RDb2xvcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZEaWZmdXNlO1xyXG51bmlmb3JtIGZsb2F0IHVfZlNwZWN1bGFyO1xyXG51bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxudW5pZm9ybSBmbG9hdCB1X2ZNZXRhbGxpYztcclxudW5pZm9ybSB2ZWMzIHVfdmN0Q2FtZXJhO1xyXG5cclxudW5pZm9ybSBib29sIHVfYkZvZztcclxudW5pZm9ybSB2ZWM0IHVfdmN0Rm9nQ29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRm9nTmVhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZGb2dGYXI7XHJcblxyXG5pbiB2ZWM0IHZfdmN0Q29sb3I7XHJcbmluIHZlYzMgdl92Y3RQb3NpdGlvbjtcclxuXHJcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHZjdEZyYWc7XHJcbmxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWM0IHZjdEZyYWdQb3NpdGlvbjtcclxubGF5b3V0KGxvY2F0aW9uID0gMikgb3V0IHZlYzQgdmN0RnJhZ05vcm1hbDtcclxuXHJcbiNpZmRlZiBQSE9OR1xyXG5cclxuICBpbiB2ZWMzIHZfdmN0Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgRkxBVFxyXG5cclxuICBmbGF0IGluIHZlYzMgdl92Y3RQb3NpdGlvbkZsYXQ7XHJcblxyXG4jZW5kaWZcclxuXHJcbnN0cnVjdCBMaWdodCB7XHJcbiAgdmVjNCB2Y3RDb2xvcjtcclxuICBtYXQ0IG10eFNoYXBlO1xyXG4gIG1hdDQgbXR4U2hhcGVJbnZlcnNlO1xyXG59O1xyXG5cclxuY29uc3QgdWludCBNQVhfTElHSFRTX0RJUkVDVElPTkFMID0gMTV1O1xyXG5jb25zdCB1aW50IE1BWF9MSUdIVFNfUE9JTlQgPSAxMDB1O1xyXG5jb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG5sYXlvdXQoc3RkMTQwKSB1bmlmb3JtIExpZ2h0cyB7XHJcbiAgdWludCB1X25MaWdodHNEaXJlY3Rpb25hbDtcclxuICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gIHVpbnQgdV9uTGlnaHRzU3BvdDtcclxuICB1aW50IHBhZGRpbmc7IC8vIEFkZCBwYWRkaW5nIHRvIGFsaWduIHRvIDE2IGJ5dGVzXHJcbiAgTGlnaHQgdV9hbWJpZW50O1xyXG4gIExpZ2h0IHVfZGlyZWN0aW9uYWxbTUFYX0xJR0hUU19ESVJFQ1RJT05BTF07XHJcbiAgTGlnaHQgdV9wb2ludFtNQVhfTElHSFRTX1BPSU5UXTtcclxuICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxufTtcclxuXHJcbi8vIFRFWFRVUkU6IGlucHV0IFVWcyBhbmQgdGV4dHVyZVxyXG4jaWZkZWYgVEVYVFVSRVxyXG5cclxuICBpbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBOT1JNQUxNQVA6IGlucHV0IFVWcyBhbmQgdGV4dHVyZVxyXG4jaWZkZWYgTk9STUFMTUFQXHJcblxyXG4gIGluIHZlYzMgdl92Y3RUYW5nZW50O1xyXG4gIGluIHZlYzMgdl92Y3RCaXRhbmdlbnQ7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcblxyXG4jZW5kaWZcclxuXHJcbi8vIFJldHVybnMgYSB2ZWN0b3IgZm9yIHZpc3VhbGl6aW5nIG9uIG1vZGVsLiBHcmVhdCBmb3IgZGVidWdnaW5nXHJcbnZlYzQgc2hvd1ZlY3RvckFzQ29sb3IodmVjMyBfdmVjdG9yLCBib29sIF9jbGFtcCkge1xyXG4gIGlmKF9jbGFtcCkge1xyXG4gICAgX3ZlY3RvciAqPSAwLjU7XHJcbiAgICBfdmVjdG9yICs9IDAuNTtcclxuICB9XHJcbiAgcmV0dXJuIHZlYzQoX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiwgMSk7XHJcbn1cclxuXHJcbnZvaWQgaWxsdW1pbmF0ZURpcmVjdGVkKHZlYzMgX3ZjdERpcmVjdGlvbiwgdmVjMyBfdmN0VmlldywgdmVjMyBfdmN0Tm9ybWFsLCB2ZWMzIF92Y3RDb2xvciwgaW5vdXQgdmVjMyBfdmN0RGlmZnVzZSwgaW5vdXQgdmVjMyBfdmN0U3BlY3VsYXIpIHtcclxuICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICBmbG9hdCBmSWxsdW1pbmF0aW9uID0gLWRvdChfdmN0Tm9ybWFsLCB2Y3REaXJlY3Rpb24pO1xyXG4gIGlmKGZJbGx1bWluYXRpb24gPiAwLjApIHtcclxuICAgIF92Y3REaWZmdXNlICs9IHVfZkRpZmZ1c2UgKiBmSWxsdW1pbmF0aW9uICogX3ZjdENvbG9yO1xyXG5cclxuICAgIGlmKHVfZlNwZWN1bGFyIDw9IDAuMClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgICBcclxuICAgIC8vQkxJTk4tUGhvbmcgU2hhZGluZ1xyXG4gICAgdmVjMyBoYWxmd2F5RGlyID0gbm9ybWFsaXplKC12Y3REaXJlY3Rpb24gLSBfdmN0Vmlldyk7XHJcbiAgICBmbG9hdCBmYWN0b3IgPSBtYXgoZG90KC12Y3REaXJlY3Rpb24sIF92Y3ROb3JtYWwpLCAwLjApOyAvL0ZhY3RvciBmb3Igc21vb3RoaW5nIG91dCB0cmFuc2l0aW9uIGZyb20gc3VyZmFjZSBmYWNpbmcgdGhlIGxpZ2h0c291cmNlIHRvIHN1cmZhY2UgZmFjaW5nIGF3YXkgZnJvbSB0aGUgbGlnaHRzb3VyY2VcclxuICAgIGZhY3RvciA9IDEuMCAtIChwb3coZmFjdG9yIC0gMS4wLCA4LjApKTsgICAgICAgICAgICAgICAgIC8vVGhlIGZhY3RvciBpcyBhbHRlcmVkIGluIG9yZGVyIHRvIGNsZWFybHkgc2VlIHRoZSBzcGVjdWxhciBoaWdobGlnaHQgZXZlbiBhdCBzdGVlcCBhbmdsZXMsIHdoaWxlIHN0aWxsIHByZXZlbnRpbmcgYXJ0aWZhY3RzXHJcblxyXG4gICAgX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiB1X2ZTcGVjdWxhciAqIHVfZkludGVuc2l0eSAqIGZhY3RvciAqIF92Y3RDb2xvcjtcclxuICB9XHJcbn1cclxuXHJcbmZsb2F0IGdldEZvZyh2ZWMzIF92Y3RQb3NpdGlvbikge1xyXG4gIGZsb2F0IGZEaXN0YW5jZSA9IGxlbmd0aChfdmN0UG9zaXRpb24gLSB1X3ZjdENhbWVyYSk7IC8vIG1heWJlIHVzZSB6LWRlcHRoIGluc3RlYWQgb2YgZXVjbGlkZWFuIGRlcHRoXHJcbiAgZmxvYXQgZkZvZyA9IGNsYW1wKChmRGlzdGFuY2UgLSB1X2ZGb2dOZWFyKSAvICh1X2ZGb2dGYXIgLSB1X2ZGb2dOZWFyKSwgMC4wLCAxLjApO1xyXG4gIGZGb2cgPSAtcG93KGZGb2csIDIuMCkgKyAoMi4wICogZkZvZyk7IC8vIGxldHMgZm9nIGFwcGVhciBxdWlja2VyIGFuZCBmYWxsIG9mZiBzbG93ZXIgcmVzdWx0cyBpbiBhIG1vcmUgZ3JhZHVhbCBmYWxsb2ZmXHJcbiAgcmV0dXJuIGZGb2c7XHJcbn1cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICAjaWYgZGVmaW5lZChQSE9ORykgJiYgIWRlZmluZWQoRkxBVClcclxuXHJcbiAgICAjaWZkZWYgTk9STUFMTUFQXHJcblxyXG4gICAgICBtYXQzIG10eFRCTiA9IG1hdDMobm9ybWFsaXplKHZfdmN0VGFuZ2VudCksIG5vcm1hbGl6ZSh2X3ZjdEJpdGFuZ2VudCksIG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCkpO1xyXG4gICAgICB2ZWMzIHZjdE5vcm1hbCA9IHRleHR1cmUodV90ZXhOb3JtYWwsIHZfdmN0VGV4dHVyZSkueHl6ICogMi4wIC0gMS4wO1xyXG4gICAgICB2Y3ROb3JtYWwgPSBub3JtYWxpemUobXR4VEJOICogdmN0Tm9ybWFsKTtcclxuXHJcbiAgICAjZWxzZVxyXG5cclxuICAgICAgdmVjMyB2Y3ROb3JtYWwgPSBub3JtYWxpemUodl92Y3ROb3JtYWwpO1xyXG5cclxuICAgICNlbmRpZlxyXG5cclxuICAgIHZlYzMgdmN0VmlldyA9IG5vcm1hbGl6ZSh2X3ZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbiA9IHZfdmN0UG9zaXRpb247XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWZkZWYgRkxBVFxyXG5cclxuICAgIHZlYzMgdmN0RmR4ID0gZEZkeCh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0RmR5ID0gZEZkeSh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKGNyb3NzKHZjdEZkeCwgdmN0RmR5KSk7XHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbkZsYXQgLSB1X3ZjdENhbWVyYSk7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uID0gdl92Y3RQb3NpdGlvbkZsYXQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICB2ZWMzIHZjdERpZmZ1c2UgPSB1X2ZEaWZmdXNlICogdV9hbWJpZW50LnZjdENvbG9yLnJnYjtcclxuICB2ZWMzIHZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgLy8gY2FsY3VsYXRlIGRpcmVjdGlvbmFsIGxpZ2h0IGVmZmVjdFxyXG4gIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c0RpcmVjdGlvbmFsOyBpKyspIHtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmVjMyh1X2RpcmVjdGlvbmFsW2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMS4wLCAxLjApKTtcclxuICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9kaXJlY3Rpb25hbFtpXS52Y3RDb2xvci5yZ2IsIHZjdERpZmZ1c2UsIHZjdFNwZWN1bGFyKTtcclxuICB9XHJcblxyXG4gIC8vIGNhbGN1bGF0ZSBwb2ludCBsaWdodCBlZmZlY3RcclxuICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNQb2ludDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfcG9pbnRbaV0ubXR4U2hhcGUgKiB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCkpO1xyXG4gICAgdmVjMyB2Y3REaXJlY3Rpb24gPSB2Y3RQb3NpdGlvbiAtIHZjdFBvc2l0aW9uTGlnaHQ7XHJcbiAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbGVuZ3RoKG1hdDModV9wb2ludFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uKTtcclxuICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApXHJcbiAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9wb2ludFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxjdWxhdGUgc3BvdCBsaWdodCBlZmZlY3RcclxuICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNTcG90OyBpKyspIHtcclxuICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9zcG90W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgdmVjMyB2Y3REaXJlY3Rpb25JbnZlcnRlZCA9IG1hdDModV9zcG90W2ldLm10eFNoYXBlSW52ZXJzZSkgKiB2Y3REaXJlY3Rpb247XHJcbiAgICBpZih2Y3REaXJlY3Rpb25JbnZlcnRlZC56IDw9IDAuMClcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIG1pbigxLjAsIDIuMCAqIGxlbmd0aCh2Y3REaXJlY3Rpb25JbnZlcnRlZC54eSkgLyB2Y3REaXJlY3Rpb25JbnZlcnRlZC56KTsgICAgLy9Db25lc2hhcGUgdGhhdCBpcyBicmlnaHRlc3QgaW4gdGhlIGNlbnRlci4gUG9zc2libGUgVE9ETzogXCJWYXJpYWJsZSBTcG90bGlnaHRzb2Z0bmVzc1wiXHJcbiAgICBmSW50ZW5zaXR5ICo9IDEuMCAtIHBvdyh2Y3REaXJlY3Rpb25JbnZlcnRlZC56LCAyLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1ByZXZlbnRzIGhhcnNoIGxpZ2h0aW5nIGFydGlmYWN0cyBhdCBib3VuZGFyeSBvZiB0aGUgZ2l2ZW4gc3BvdGxpZ2h0XHJcbiAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICBjb250aW51ZTtcclxuXHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfc3BvdFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgfVxyXG5cclxuICB2Y3RGcmFnLnJnYiA9IHZjdERpZmZ1c2UgKyB2Y3RTcGVjdWxhciAqIHVfZk1ldGFsbGljO1xyXG4gIHZjdEZyYWcuYSA9IDEuMDtcclxuXHJcbiAgI2lmZGVmIFRFWFRVUkVcclxuXHJcbiAgICB2ZWM0IHZjdENvbG9yVGV4dHVyZSA9IHRleHR1cmUodV90ZXhDb2xvciwgdl92Y3RUZXh0dXJlKTtcclxuICAgIHZjdEZyYWcgKj0gdmN0Q29sb3JUZXh0dXJlO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmN0RnJhZyAqPSB1X3ZjdENvbG9yICogdl92Y3RDb2xvcjtcclxuICB2Y3RGcmFnLnJnYiArPSB2Y3RTcGVjdWxhciAqICgxLjAgLSB1X2ZNZXRhbGxpYyk7XHJcblxyXG4gIHZjdEZyYWdQb3NpdGlvbiA9IHZlYzQodl92Y3RQb3NpdGlvbiwgMS4wKTsgLy8gZG9uJ3QgdXNlIGZsYXQgaGVyZSwgYmVjYXVzZSB3ZSB3YW50IHRvIGludGVycG9sYXRlIHRoZSBwb3NpdGlvblxyXG4gIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KHZjdE5vcm1hbCwgMS4wKTtcclxuXHJcbiAgaWYgKHVfYkZvZykgXHJcbiAgICB2Y3RGcmFnLnJnYiA9IG1peCh2Y3RGcmFnLnJnYiwgdV92Y3RGb2dDb2xvci5yZ2IsIGdldEZvZyh2Y3RQb3NpdGlvbikgKiB1X3ZjdEZvZ0NvbG9yLmEpO1xyXG5cclxuICB2Y3RGcmFnLnJnYiAqPSB2Y3RGcmFnLmE7XHJcblxyXG4gIGlmKHZjdEZyYWcuYSA8IDAuMDEpXHJcbiAgICBkaXNjYXJkO1xyXG59YDtcclxuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGljay5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBSZW5kZXJzIGZvciBSYXljYXN0aW5nXHJcbiogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIGludCB1X2lkO1xyXG51bmlmb3JtIHZlYzIgdV92Y3RTaXplO1xyXG51bmlmb3JtIHZlYzQgdV92Y3RDb2xvcjtcclxub3V0IGl2ZWM0IHZjdEZyYWc7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgICBpbnQgcGl4ZWwgPSBpbnQodHJ1bmMoZ2xfRnJhZ0Nvb3JkLngpICsgdV92Y3RTaXplLnggKiB0cnVuYyhnbF9GcmFnQ29vcmQueSkpO1xyXG5cclxuICAgIGlmIChwaXhlbCAhPSB1X2lkKVxyXG4gICAgICBkaXNjYXJkO1xyXG5cclxuICAgIHVpbnQgaWNvbG9yID0gdWludCh1X3ZjdENvbG9yLnIgKiAyNTUuMCkgPDwgMjQgfCB1aW50KHVfdmN0Q29sb3IuZyAqIDI1NS4wKSA8PCAxNiB8IHVpbnQodV92Y3RDb2xvci5iICogMjU1LjApIDw8IDggfCB1aW50KHVfdmN0Q29sb3IuYSAqIDI1NS4wKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgdmN0RnJhZyA9IGl2ZWM0KGZsb2F0Qml0c1RvSW50KGdsX0ZyYWdDb29yZC56KSwgaWNvbG9yLCAwLCAwKTtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2sudmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbmluIHZlYzMgYV92Y3RQb3NpdGlvbjsgICAgICAgXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG52b2lkIG1haW4oKSB7ICAgXHJcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBSZW5kZXJzIGZvciBSYXljYXN0aW5nXHJcbiogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIGludCB1X2lkO1xyXG51bmlmb3JtIHZlYzIgdV92Y3RTaXplO1xyXG5pbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcblxyXG5vdXQgaXZlYzQgdmN0RnJhZztcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBpbnQgcGl4ZWwgPSBpbnQodHJ1bmMoZ2xfRnJhZ0Nvb3JkLngpICsgdV92Y3RTaXplLnggKiB0cnVuYyhnbF9GcmFnQ29vcmQueSkpO1xyXG5cclxuICBpZiAocGl4ZWwgIT0gdV9pZClcclxuICAgIGRpc2NhcmQ7XHJcbiAgXHJcbiAgdmVjNCB2Y3RDb2xvciA9IHVfdmN0Q29sb3IgKiB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcbiAgdWludCBpY29sb3IgPSB1aW50KHZjdENvbG9yLnIgKiAyNTUuMCkgPDwgMjQgfCB1aW50KHZjdENvbG9yLmcgKiAyNTUuMCkgPDwgMTYgfCB1aW50KHZjdENvbG9yLmIgKiAyNTUuMCkgPDwgOCB8IHVpbnQodmN0Q29sb3IuYSAqIDI1NS4wKTtcclxuICBcclxuICB2Y3RGcmFnID0gaXZlYzQoZmxvYXRCaXRzVG9JbnQoZ2xfRnJhZ0Nvb3JkLnopLCBpY29sb3IsIGZsb2F0Qml0c1RvSW50KHZfdmN0VGV4dHVyZS54KSwgZmxvYXRCaXRzVG9JbnQodl92Y3RUZXh0dXJlLnkpKTtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC52ZXJ0XCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBSZW5kZXJzIGZvciBSYXljYXN0aW5nXHJcbiogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuKi9cclxuaW4gdmVjMyBhX3ZjdFBvc2l0aW9uOyAgICAgICBcclxuaW4gdmVjMiBhX3ZjdFRleHR1cmU7XHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcbnVuaWZvcm0gbWF0MyB1X210eFBpdm90O1xyXG5cclxub3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxudm9pZCBtYWluKCkgeyAgIFxyXG4gIGdsX1Bvc2l0aW9uID0gdV9tdHhNZXNoVG9WaWV3ICogdmVjNChhX3ZjdFBvc2l0aW9uLCAxLjApO1xyXG4gIHZfdmN0VGV4dHVyZSA9ICh1X210eFBpdm90ICogdmVjMyhhX3ZjdFRleHR1cmUsIDEuMCkpLnh5O1xyXG59YDtcclxuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG4vKipcclxuICogQ3JlYXRlcyBhIGZ1bGxzY3JlZW4gdHJpYW5nbGUgd2hpY2ggY290YWlucyB0aGUgc2NyZWVuIHF1YWQgYW5kIHNldHMgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nbHkuXHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKlxyXG4gKiAgMiAgMyAuXHJcbiAqICAgICAgIC4gIC5cclxuICogICAgICAgLiAgICAgLiAgXHJcbiAqICAgICAgIC4gICAgICAgIC5cclxuICogIDEgIDEgLi4uLi4uLi4uLiAgLlxyXG4gKiAgICAgICAuIHNjcmVlbiAuICAgICAuXHJcbiAqICAgICAgIC4gIHF1YWQgIC4gICAgICAgIC5cclxuICogIDAgLTEgLi4uLi4uLi4uLiAgLiAgLiAgLiAgLlxyXG4gKiAgICBwIC0xICAgICAgICAxICAgICAgICAgICAzXHJcbiAqICB0ICAgIDAgICAgICAgIDEgICAgICAgICAgIDJcclxuICogIFxyXG4gKiAgcCA9PSBwb3N0aW9uXHJcbiAqICB0ID09IHRleHR1cmUgY29vcmRpbmF0ZVxyXG4gKi9cclxuXHJcbi8vIHVuaWZvcm0gdmVjMiB1X3ZjdFJlc29sdXRpb247XHJcblxyXG5vdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4vLyAjaWZkZWYgU0FNUExFXHJcblxyXG4vLyAgIGZsYXQgb3V0IHZlYzJbOV0gdl92Y3RPZmZzZXRzO1xyXG5cclxuLy8gI2VuZGlmXHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgZmxvYXQgeCA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAlIDIpICogNCk7IC8vIDAsIDQsIDBcclxuICBmbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEIC8gMikgKiA0KTsgLy8gMCwgMCwgNFxyXG4gIGdsX1Bvc2l0aW9uID0gdmVjNCh4IC0gMS4wLCB5IC0gMS4wLCAwLjAsIDEuMCk7IC8vICgtMSwgLTEpLCAoMywgLTEpLCAoLTEsIDMpXHJcbiAgdl92Y3RUZXh0dXJlID0gdmVjMih4IC8gMi4wLCB5IC8gMi4wKTsgIC8vICgwLCAwKSwgKDIsIDApLCAoMCwgMikgLT4gaW50ZXJwb2xhdGlvbiB3aWxsIHlpZWxkICgwLCAwKSwgKDEsIDApLCAoMCwgMSkgYXMgdGhlIHBvc2l0aW9ucyBhcmUgZG91YmxlIHRoZSBzaXplIG9mIHRoZSBzY3JlZW5cclxuXHJcbiAgLy8gI2lmZGVmIFNBTVBMRVxyXG5cclxuICAvLyAgIHZlYzIgb2Zmc2V0ID0gdmVjMigxLjAgLyB1X3ZjdFJlc29sdXRpb24ueCwgMS4wIC8gdV92Y3RSZXNvbHV0aW9uLnkpO1xyXG4gIC8vICAgdl92Y3RPZmZzZXRzID0gdmVjMltdKFxyXG4gIC8vICAgICB2ZWMyKC1vZmZzZXQueCwgb2Zmc2V0LnkpLCAgdmVjMigwLjAsIG9mZnNldC55KSwgIHZlYzIob2Zmc2V0LngsIG9mZnNldC55KSxcclxuICAvLyAgICAgdmVjMigtb2Zmc2V0LngsIDAuMCksICAgICAgIHZlYzIoMC4wLCAwLjApLCAgICAgICB2ZWMyKG9mZnNldC54LCAwLjApLFxyXG4gIC8vICAgICB2ZWMyKC1vZmZzZXQueCwgLW9mZnNldC55KSwgdmVjMigwLjAsIC1vZmZzZXQueSksICB2ZWMyKG9mZnNldC54LCAtb2Zmc2V0LnkpXHJcbiAgLy8gICApO1xyXG5cclxuICAvLyAjZW5kaWZcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbi8vIE1JTklNQUxcclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTsgLy8gbmVlZGVkIGZvciBmb2dcclxudW5pZm9ybSBmbG9hdCB1X2ZBbHBoYUNsaXA7XHJcblxyXG5sYXlvdXQoc3RkMTQwKSB1bmlmb3JtIEZvZyB7XHJcbiAgYm9vbCB1X2JGb2dBY3RpdmU7XHJcbiAgZmxvYXQgdV9mRm9nTmVhcjtcclxuICBmbG9hdCB1X2ZGb2dGYXI7XHJcbiAgZmxvYXQgZm9nUGFkZGluZzsgLy8gYWRkIHBhZGRpbmcgdG8gYWxpZ24gdG8gMTYgYnl0ZXNcclxuICB2ZWM0IHVfdmN0Rm9nQ29sb3I7XHJcbn07XHJcblxyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHZjdEZyYWc7XHJcbmxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWM0IHZjdEZyYWdQb3NpdGlvbjsgLy8gVE9ETzogbWFrZSB0aGVzZSBvcHRpb25hbD9cclxubGF5b3V0KGxvY2F0aW9uID0gMikgb3V0IHZlYzQgdmN0RnJhZ05vcm1hbDtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG4gIGluIHZlYzMgdl92Y3REaWZmdXNlO1xyXG4gIGluIHZlYzMgdl92Y3RTcGVjdWxhcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVE9PTilcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhUb29uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChGTEFUKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZkRpZmZ1c2U7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxuICB1bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBsaWd0aHNQYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBfdmN0TGlnaHQ6IGRpcmVjdGlvbiBmcm9tIHBvc2l0aW9uIHRvIGxpZ2h0XHJcbiAgICogX3ZjdFZpZXc6IGRpcmVjdGlvbiBmcm9tIHBvc2l0aW9uIHRvIGNhbWVyYVxyXG4gICAqIF92Y3ROb3JtYWw6IHN1cmZhY2Ugbm9ybWFsIGF0IHBvc2l0aW9uXHJcbiAgICogX3ZjdENvbG9yOiBjb2xvciBvZiB0aGUgbGlnaHRcclxuICAgKi9cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3RMaWdodERpcmVjdGlvbiwgdmVjMyBfdmN0Vmlld0RpcmVjdGlvbiwgdmVjMyBfdmN0Tm9ybWFsLCB2ZWMzIF92Y3RDb2xvciwgaW5vdXQgdmVjMyBfdmN0RGlmZnVzZSwgaW5vdXQgdmVjMyBfdmN0U3BlY3VsYXIpIHtcclxuICAgIHZlYzMgdmN0TGlnaHREaXJlY3Rpb24gPSBub3JtYWxpemUoX3ZjdExpZ2h0RGlyZWN0aW9uKTtcclxuXHJcbiAgICBmbG9hdCBmRGlmZnVzZSA9IGRvdChfdmN0Tm9ybWFsLCB2Y3RMaWdodERpcmVjdGlvbik7XHJcblxyXG4gICAgaWYoZkRpZmZ1c2UgPiAwLjApIHtcclxuXHJcbiAgICAgICNpZiBkZWZpbmVkKFRPT04pXHJcbiAgICAgIFxyXG4gICAgICAgIGZEaWZmdXNlID0gdGV4dHVyZSh1X3RleFRvb24sIHZlYzIoZkRpZmZ1c2UsIDApKS5yO1xyXG5cclxuICAgICAgI2VuZGlmXHJcblxyXG4gICAgICBfdmN0RGlmZnVzZSArPSB1X2ZEaWZmdXNlICogZkRpZmZ1c2UgKiBfdmN0Q29sb3I7XHJcblxyXG4gICAgICBpZih1X2ZTcGVjdWxhciA8PSAwLjAgfHwgdV9mSW50ZW5zaXR5IDw9IDAuMClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIFxyXG4gICAgICAvL0JMSU5OLVBob25nIFNoYWRpbmdcclxuICAgICAgdmVjMyBoYWxmd2F5RGlyID0gbm9ybWFsaXplKHZjdExpZ2h0RGlyZWN0aW9uICsgX3ZjdFZpZXdEaXJlY3Rpb24pO1xyXG4gICAgICBmbG9hdCBmYWN0b3IgPSBmRGlmZnVzZTsgICAgICAgICAgICAgICAgICAvLyBGYWN0b3IgZm9yIHNtb290aGluZyBvdXQgdHJhbnNpdGlvbiBmcm9tIHN1cmZhY2UgZmFjaW5nIHRoZSBsaWdodHNvdXJjZSB0byBzdXJmYWNlIGZhY2luZyBhd2F5IGZyb20gdGhlIGxpZ2h0c291cmNlXHJcbiAgICAgIGZhY3RvciA9IDEuMCAtIChwb3coZmFjdG9yIC0gMS4wLCA4LjApKTsgIC8vIFRoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgICAgZmxvYXQgZlNwZWN1bGFyID0gcG93KG1heChkb3QoX3ZjdE5vcm1hbCwgaGFsZndheURpciksIDAuMCksIGV4cDIodV9mU3BlY3VsYXIgKiA1LjApKSAqIGZhY3RvcjsgLy8gVE9ETzogcmVtb3ZlIG1hZ2ljIG51bWJlcnM/XHJcblxyXG4gICAgICAjaWYgZGVmaW5lZChUT09OKVxyXG4gICAgICAgIFxyXG4gICAgICAgIGZTcGVjdWxhciA9IHRleHR1cmUodV90ZXhUb29uLCB2ZWMyKGZTcGVjdWxhciwgMC4wKSkuZyAqIGZEaWZmdXNlO1xyXG5cclxuICAgICAgI2VuZGlmXHJcblxyXG4gICAgICBfdmN0U3BlY3VsYXIgKz0gZlNwZWN1bGFyICogdV9mSW50ZW5zaXR5ICogX3ZjdENvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbiAgaW4gdmVjMyB2X3ZjdFRhbmdlbnQ7XHJcbiAgaW4gdmVjMyB2X3ZjdEJpdGFuZ2VudDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoUEFSVElDTEUpXHJcblxyXG4gIHVuaWZvcm0gaW50IHVfaUJsZW5kTW9kZTtcclxuXHJcbiNlbmRpZlxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZlYzMgdmN0RmR4ID0gZEZkeCh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0RmR5ID0gZEZkeSh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKGNyb3NzKHZjdEZkeCwgdmN0RmR5KSk7XHJcbiAgICB2ZWMzIHZjdFZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodV92Y3RDYW1lcmEgLSB2X3ZjdFBvc2l0aW9uRmxhdCk7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uID0gdl92Y3RQb3NpdGlvbkZsYXQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgKGRlZmluZWQoUEhPTkcpIHx8IGRlZmluZWQoR09VUkFVRCkpICYmICFkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodV92Y3RDYW1lcmEgLSB2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIG1hdDMgbXR4VEJOID0gbWF0Myhub3JtYWxpemUodl92Y3RUYW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Qml0YW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Tm9ybWFsKSk7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IHRleHR1cmUodV90ZXhOb3JtYWwsIHZfdmN0VGV4dHVyZSkueHl6ICogMi4wIC0gMS4wO1xyXG4gICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG4gIFxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2ZWMzIHZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBkaXJlY3Rpb25hbCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c0RpcmVjdGlvbmFsOyBpKyspIHtcclxuICAgICAgdmVjMyB2Y3RMaWdodERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIC0xLjAsIDEuMCkpO1xyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0TGlnaHREaXJlY3Rpb24sIHZjdFZpZXdEaXJlY3Rpb24sIHZjdE5vcm1hbCwgdV9kaXJlY3Rpb25hbFtpXS52Y3RDb2xvci5yZ2IsIHZjdERpZmZ1c2UsIHZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwb2ludCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c1BvaW50OyBpKyspIHtcclxuICAgICAgdmVjMyB2Y3RMaWdodFBvc2l0aW9uID0gdmVjMyh1X3BvaW50W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgICAgdmVjMyB2Y3RMaWdodERpcmVjdGlvbiA9IHZjdExpZ2h0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbjtcclxuICAgICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdExpZ2h0RGlyZWN0aW9uKTtcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3RMaWdodERpcmVjdGlvbiwgdmN0Vmlld0RpcmVjdGlvbiwgdmN0Tm9ybWFsLCB1X3BvaW50W2ldLnZjdENvbG9yLnJnYiAqIGZJbnRlbnNpdHksIHZjdERpZmZ1c2UsIHZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzcG90IGxpZ2h0c1xyXG4gICAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzU3BvdDsgaSsrKSB7XHJcbiAgICAgIHZlYzMgdmN0TGlnaHRQb3NpdGlvbiA9IHZlYzModV9zcG90W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgICAgdmVjMyB2Y3RMaWdodERpcmVjdGlvbiA9IHZjdExpZ2h0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbjtcclxuICAgICAgdmVjMyB2Y3RMaWdodERpcmVjdGlvbkludmVydGVkID0gbWF0Myh1X3Nwb3RbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIC12Y3RMaWdodERpcmVjdGlvbjtcclxuICAgICAgaWYodmN0TGlnaHREaXJlY3Rpb25JbnZlcnRlZC56IDw9IDAuMClcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0TGlnaHREaXJlY3Rpb25JbnZlcnRlZC54eSkgLyB2Y3RMaWdodERpcmVjdGlvbkludmVydGVkLnopOyAgICAvLyBDb25lc2hhcGUgdGhhdCBpcyBicmlnaHRlc3QgaW4gdGhlIGNlbnRlci4gUG9zc2libGUgVE9ETzogXCJWYXJpYWJsZSBTcG90bGlnaHRzb2Z0bmVzc1wiXHJcbiAgICAgIGZJbnRlbnNpdHkgKj0gMS4wIC0gcG93KHZjdExpZ2h0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdExpZ2h0RGlyZWN0aW9uLCB2Y3RWaWV3RGlyZWN0aW9uLCB2Y3ROb3JtYWwsIHVfc3BvdFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICB2ZWM0IHZjdENvbG9yID0gdV92Y3RDb2xvciAqIHZfdmN0Q29sb3I7XHJcblxyXG4gICNpZiBkZWZpbmVkKEdPVVJBVUQpXHJcblxyXG4gICAgdmVjMyB2Y3REaWZmdXNlID0gdl92Y3REaWZmdXNlO1xyXG4gICAgdmVjMyB2Y3RTcGVjdWxhciA9IHZfdmN0U3BlY3VsYXI7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmN0RnJhZy5yZ2IgPSB2Y3REaWZmdXNlICsgdmN0U3BlY3VsYXIgKiB1X2ZNZXRhbGxpYztcclxuICAgIHZjdEZyYWcuYSA9IDEuMDtcclxuXHJcbiAgI2Vsc2VcclxuXHJcbiAgICAvLyBNSU5JTUFMOiBzZXQgdGhlIGJhc2UgY29sb3JcclxuICAgIHZjdEZyYWcgPSB2Y3RDb2xvcjtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKFRFWFRVUkUpIHx8IGRlZmluZWQoTUFUQ0FQKVxyXG4gICAgXHJcbiAgICAvLyBURVhUVVJFOiBtdWx0aXBseSB3aXRoIHRleGVsIGNvbG9yXHJcbiAgICB2ZWM0IHZjdENvbG9yVGV4dHVyZSA9IHRleHR1cmUodV90ZXhDb2xvciwgdl92Y3RUZXh0dXJlKTsgLy8gaGFzIHByZW11bHRpcGxpZWQgYWxwaGEgYnkgd2ViZ2wgZm9yIGNvcnJlY3QgZmlsdGVyaW5nXHJcbiAgICBpZiAodmN0Q29sb3JUZXh0dXJlLmEgPiAwLjApIC8vIHVucHJlbXVsdGlwbHkgYWxwaGFcclxuICAgICAgdmN0Q29sb3JUZXh0dXJlLnJnYiAvPSB2Y3RDb2xvclRleHR1cmUuYTsgXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yO1xyXG4gICAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICAgIHZjdEZyYWdQb3NpdGlvbiA9IHZlYzQodl92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KHZjdE5vcm1hbCwgMS4wKTtcclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgI2lmICFkZWZpbmVkKFBIT05HKSAmJiAhZGVmaW5lZChGTEFUKSAmJiAhZGVmaW5lZChHT1VSQVVEKSAvLyBNSU5JTUFMXHJcblxyXG4gICAgdmN0RnJhZ1Bvc2l0aW9uID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApOyAvLyAoMCwgMCwgMCkgd2lsbCB0cmVhdCBvY2NsdWRlcnMgYXMgbm9uIGV4aXN0aW5nIGluIHNzYW9cclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7IC8vICgwLCAwLCAwKSBub3JtYWwgd2lsbCB5aWVsZCBub3Qgb2NjbHVzaW9uIGluIHNzYW9cclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgLy8gZGlzY2FyZCBwaXhlbCBhbGx0b2dldGhlciB3aGVuIHRyYW5zcGFyZW50OiBkb24ndCBzaG93IGluIFotQnVmZmVyXHJcbiAgaWYodmN0RnJhZy5hIDwgdV9mQWxwaGFDbGlwKVxyXG4gICAgZGlzY2FyZDtcclxuXHJcbiAgaWYgKHVfYkZvZ0FjdGl2ZSkge1xyXG4gICAgZmxvYXQgZkZvZyA9IGdldEZvZyh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZjdEZyYWcucmdiID0gbWl4KHZjdEZyYWcucmdiLCB1X3ZjdEZvZ0NvbG9yLnJnYiwgZkZvZyk7XHJcblxyXG4gICAgI2lmIGRlZmluZWQoUEFSVElDTEUpXHJcblxyXG4gICAgICBpZiAodV9pQmxlbmRNb2RlID09IDIgfHwgdV9pQmxlbmRNb2RlID09IDMgfHwgdV9pQmxlbmRNb2RlID09IDQpICAvLyBmb3IgYmxlbmQgYWRkaXRpdmUsIHN1YnRyYWN0aXZlLCBtb2R1bGF0ZVxyXG4gICAgICAgIHZjdEZyYWcuYSA9IG1peCh2Y3RGcmFnLmEsIDAuMCwgZkZvZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWRlIG91dCBwYXJ0aWNsZSB3aGVuIGluIGZvZyB0byBtYWtlIGl0IGRpc2FwcGVhciBjb21wbGV0ZWx5XHJcblxyXG4gICAgI2VuZGlmXHJcbiAgfVxyXG59YDtcclxuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyVW5pdmVyc2FsLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFVuaXZlcnNhbCBTaGFkZXIgYXMgYmFzZSBmb3IgbWFueSBvdGhlcnMuIENvbnRyb2xsZWQgYnkgY29tcGlsZXIgZGlyZWN0aXZlc1xyXG4qIEBhdXRob3JzIDIwMjEsIEx1aXMgS2VjaywgSEZVLCAyMDIxIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9Xb3JsZDsgLy8gbmVlZGVkIGZvciBGT0dcclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvVmlldztcclxuXHJcbmluIHZlYzMgYV92Y3RQb3NpdGlvbjtcclxuaW4gdmVjNCBhX3ZjdENvbG9yOyAvLyBUT0RPOiB0aGluayBhYm91dCBtYWtpbmcgdmVydGV4IGNvbG9yIG9wdGlvbmFsXHJcblxyXG5vdXQgdmVjMyB2X3ZjdFBvc2l0aW9uO1xyXG5vdXQgdmVjNCB2X3ZjdENvbG9yO1xyXG5cclxuI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKSB8fCBkZWZpbmVkKFBBUlRJQ0xFKSB8fCBkZWZpbmVkKE1BVENBUClcclxuXHJcbiAgdW5pZm9ybSB2ZWMzIHVfdmN0Q2FtZXJhO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gIHVuaWZvcm0gbWF0NCB1X210eE5vcm1hbE1lc2hUb1dvcmxkO1xyXG5cclxuICBpbiB2ZWMzIGFfdmN0Tm9ybWFsO1xyXG4gIG91dCB2ZWMzIHZfdmN0Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICBmbGF0IG91dCB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZkRpZmZ1c2U7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxuICB1bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxuXHJcbiAgb3V0IHZlYzMgdl92Y3REaWZmdXNlO1xyXG4gIG91dCB2ZWMzIHZfdmN0U3BlY3VsYXI7XHJcblxyXG4gIHN0cnVjdCBMaWdodCB7XHJcbiAgICB2ZWM0IHZjdENvbG9yO1xyXG4gICAgbWF0NCBtdHhTaGFwZTtcclxuICAgIG1hdDQgbXR4U2hhcGVJbnZlcnNlO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHVpbnQgTUFYX0xJR0hUU19ESVJFQ1RJT05BTCA9IDE1dTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfUE9JTlQgPSAxMDB1O1xyXG4gIGNvbnN0IHVpbnQgTUFYX0xJR0hUU19TUE9UID0gMTAwdTtcclxuXHJcbiAgbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBMaWdodHMge1xyXG4gICAgdWludCB1X25MaWdodHNEaXJlY3Rpb25hbDtcclxuICAgIHVpbnQgdV9uTGlnaHRzUG9pbnQ7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1Nwb3Q7XHJcbiAgICB1aW50IHBhZGRpbmc7IC8vIEFkZCBwYWRkaW5nIHRvIGFsaWduIHRvIDE2IGJ5dGVzXHJcbiAgICBMaWdodCB1X2FtYmllbnQ7XHJcbiAgICBMaWdodCB1X2RpcmVjdGlvbmFsW01BWF9MSUdIVFNfRElSRUNUSU9OQUxdO1xyXG4gICAgTGlnaHQgdV9wb2ludFtNQVhfTElHSFRTX1BPSU5UXTtcclxuICAgIExpZ2h0IHVfc3BvdFtNQVhfTElHSFRTX1NQT1RdO1xyXG4gIH07XHJcblxyXG4gIHZvaWQgaWxsdW1pbmF0ZURpcmVjdGVkKHZlYzMgX3ZjdERpcmVjdGlvbiwgdmVjMyBfdmN0VmlldywgdmVjMyBfdmN0Tm9ybWFsLCB2ZWMzIF92Y3RDb2xvciwgaW5vdXQgdmVjMyBfdmN0RGlmZnVzZSwgaW5vdXQgdmVjMyBfdmN0U3BlY3VsYXIpIHtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gbm9ybWFsaXplKF92Y3REaXJlY3Rpb24pO1xyXG4gICAgZmxvYXQgZklsbHVtaW5hdGlvbiA9IC1kb3QoX3ZjdE5vcm1hbCwgdmN0RGlyZWN0aW9uKTtcclxuICAgIGlmKGZJbGx1bWluYXRpb24gPiAwLjApIHtcclxuICAgICAgX3ZjdERpZmZ1c2UgKz0gdV9mRGlmZnVzZSAqIGZJbGx1bWluYXRpb24gKiBfdmN0Q29sb3I7XHJcblxyXG4gICAgICBpZih1X2ZTcGVjdWxhciA8PSAwLjApXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy9CTElOTlxyXG4gICAgICB2ZWMzIGhhbGZ3YXlEaXIgPSBub3JtYWxpemUoLXZjdERpcmVjdGlvbiAtIF92Y3RWaWV3KTtcclxuICAgICAgZmxvYXQgZmFjdG9yID0gbWF4KGRvdCgtdmN0RGlyZWN0aW9uLCBfdmN0Tm9ybWFsKSwgMC4wKTsgLy9GYWN0b3IgZm9yIHNtb290aGluZyBvdXQgdHJhbnNpdGlvbiBmcm9tIHN1cmZhY2UgZmFjaW5nIHRoZSBsaWdodHNvdXJjZSB0byBzdXJmYWNlIGZhY2luZyBhd2F5IGZyb20gdGhlIGxpZ2h0c291cmNlXHJcbiAgICAgIGZhY3RvciA9IDEuMCAtIChwb3coZmFjdG9yIC0gMS4wLCA4LjApKTsgICAgICAgICAgICAgICAgIC8vVGhlIGZhY3RvciBpcyBhbHRlcmVkIGluIG9yZGVyIHRvIGNsZWFybHkgc2VlIHRoZSBzcGVjdWxhciBoaWdobGlnaHQgZXZlbiBhdCBzdGVlcCBhbmdsZXMsIHdoaWxlIHN0aWxsIHByZXZlbnRpbmcgYXJ0aWZhY3RzXHJcblxyXG4gICAgICBfdmN0U3BlY3VsYXIgKz0gcG93KG1heChkb3QoX3ZjdE5vcm1hbCwgaGFsZndheURpciksIDAuMCksIGV4cDIodV9mU3BlY3VsYXIgKiA1LjApKSAqIHVfZlNwZWN1bGFyICogdV9mSW50ZW5zaXR5ICogZmFjdG9yICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgLy9QSE9ORyAob2xkKVxyXG4gICAgICAvLyB2ZWMzIHZjdFJlZmxlY3Rpb24gPSBub3JtYWxpemUocmVmbGVjdCgtdmN0RGlyZWN0aW9uLCBfdmN0Tm9ybWFsKSk7XHJcbiAgICAgIC8vIGZsb2F0IGZIaXRDYW1lcmEgPSBkb3QodmN0UmVmbGVjdGlvbiwgX3ZjdFZpZXcpO1xyXG4gICAgICAvLyBfdmN0U3BlY3VsYXIgKz0gcG93KG1heChmSGl0Q2FtZXJhLCAwLjApLCB1X2ZTcGVjdWxhciAqIDEwLjApICogdV9mU3BlY3VsYXIgKiBfdmN0Q29sb3I7IC8vIDEwLjAgPSBtYWdpYyBudW1iZXIsIGxvb2tzIGdvb2QuLi4gXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChURVhUVVJFKSB8fCBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgdW5pZm9ybSBtYXQzIHVfbXR4UGl2b3Q7XHJcblxyXG4gIGluIHZlYzIgYV92Y3RUZXh0dXJlO1xyXG4gIG91dCB2ZWMyIHZfdmN0VGV4dHVyZTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICBpbiB2ZWM0IGFfdmN0VGFuZ2VudDtcclxuICBvdXQgdmVjMyB2X3ZjdFRhbmdlbnQ7XHJcbiAgb3V0IHZlYzMgdl92Y3RCaXRhbmdlbnQ7XHJcblxyXG4jZW5kaWZcclxuXHJcbi8vIE1BVENBUDogb2ZmZXIgYnVmZmVycyBmb3IgVVZzIGFuZCBwaXZvdCBtYXRyaXhcclxuI2lmIGRlZmluZWQoTUFUQ0FQKSAvLyBNYXRDYXAtc2hhZGVyIGdlbmVyYXRlcyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZyb20gc3VyZmFjZSBub3JtYWxzXHJcbiAgXHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4V29ybGRUb0NhbWVyYTtcclxuICB1bmlmb3JtIG1hdDQgdV9tdHhOb3JtYWxNZXNoVG9Xb3JsZDtcclxuXHJcbiAgaW4gdmVjMyBhX3ZjdE5vcm1hbDtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFNLSU4pXHJcblxyXG4gIC8vIEJvbmVzIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9kZXYvc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NraW5uaW5nX3BhcnNfdmVydGV4Lmdsc2wuanNcclxuICB1bmlmb3JtIG1hdDQgdV9tdHhXb3JsZFRvVmlldztcclxuICBpbiB1dmVjNCBhX3ZjdEJvbmVzO1xyXG4gIGluIHZlYzQgYV92Y3RXZWlnaHRzO1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9CT05FUyA9IDI1NnU7IC8vIENBVVRJT046IHRoaXMgbnVtYmVyIG11c3QgYmUgdGhlIHNhbWUgYXMgaW4gUmVuZGVySW5qZWN0b3JTa2VsZXRvbkluc3RhbmNlIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgYXJlIGNyZWF0ZWRcclxuICBsYXlvdXQoc3RkMTQwKSB1bmlmb3JtIFNraW4ge1xyXG4gICAgbWF0NCB1X210eEJvbmVzW01BWF9CT05FU107XHJcbiAgfTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoUEFSVElDTEUpXHJcblxyXG4gIHVuaWZvcm0gbWF0NCB1X210eFdvcmxkVG9WaWV3O1xyXG4gIHVuaWZvcm0gZmxvYXQgdV9mUGFydGljbGVTeXN0ZW1EdXJhdGlvbjtcclxuICB1bmlmb3JtIGZsb2F0IHVfZlBhcnRpY2xlU3lzdGVtU2l6ZTtcclxuICB1bmlmb3JtIGZsb2F0IHVfZlBhcnRpY2xlU3lzdGVtVGltZTtcclxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVycztcclxuICB1bmlmb3JtIGJvb2wgdV9iUGFydGljbGVTeXN0ZW1GYWNlQ2FtZXJhO1xyXG4gIHVuaWZvcm0gYm9vbCB1X2JQYXJ0aWNsZVN5c3RlbVJlc3RyaWN0O1xyXG5cclxuICBtYXQ0IGxvb2tBdCh2ZWMzIF92Y3RUcmFuc2xhdGlvbiwgdmVjMyBfdmN0VGFyZ2V0KSB7XHJcbiAgICB2ZWMzIHZjdFVwID0gdmVjMygwLjAsIDEuMCwgMC4wKTtcclxuICAgIHZlYzMgekF4aXMgPSBub3JtYWxpemUoX3ZjdFRhcmdldCAtIF92Y3RUcmFuc2xhdGlvbik7XHJcbiAgICB2ZWMzIHhBeGlzID0gbm9ybWFsaXplKGNyb3NzKHZjdFVwLCB6QXhpcykpO1xyXG4gICAgdmVjMyB5QXhpcyA9IHVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3QgPyB2Y3RVcCA6IG5vcm1hbGl6ZShjcm9zcyh6QXhpcywgeEF4aXMpKTtcclxuICAgIHpBeGlzID0gdV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdCA/IG5vcm1hbGl6ZShjcm9zcyh4QXhpcywgdmN0VXApKSA6IHpBeGlzO1xyXG5cclxuICAgIHJldHVybiBtYXQ0KHhBeGlzLngsIHhBeGlzLnksIHhBeGlzLnosIDAuMCwgeUF4aXMueCwgeUF4aXMueSwgeUF4aXMueiwgMC4wLCB6QXhpcy54LCB6QXhpcy55LCB6QXhpcy56LCAwLjAsIF92Y3RUcmFuc2xhdGlvbi54LCBfdmN0VHJhbnNsYXRpb24ueSwgX3ZjdFRyYW5zbGF0aW9uLnosIDEuMCk7XHJcbiAgfVxyXG5cclxuICBmbG9hdCBmZXRjaFJhbmRvbU51bWJlcihpbnQgX2lPZmZzZXQsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aCkge1xyXG4gICAgX2lPZmZzZXQgPSBnbF9JbnN0YW5jZUlEICsgX2lPZmZzZXQgJSBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aDtcclxuICAgIHJldHVybiB0ZXhlbEZldGNoKHVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzLCBpdmVjMihfaU9mZnNldCAlIF9pUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZSwgX2lPZmZzZXQgLyBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUpLCAwKS5yO1xyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuICB2ZWM0IHZjdFBvc2l0aW9uID0gdmVjNChhX3ZjdFBvc2l0aW9uLCAxLjApO1xyXG4gIG1hdDQgbXR4TWVzaFRvV29ybGQgPSB1X210eE1lc2hUb1dvcmxkO1xyXG4gIG1hdDQgbXR4TWVzaFRvVmlldyA9IHVfbXR4TWVzaFRvVmlldztcclxuXHJcbiAgI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKSAvLyBvbmx5IHRoZXNlIHdvcmsgd2l0aCBwYXJ0aWNsZSBhbmQgc2tpbm5pbmdcclxuXHJcbiAgICBtYXQ0IG10eE5vcm1hbE1lc2hUb1dvcmxkID0gdV9tdHhOb3JtYWxNZXNoVG9Xb3JsZDtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG4gIFxyXG4gICAgZmxvYXQgZlBhcnRpY2xlSWQgPSBmbG9hdChnbF9JbnN0YW5jZUlEKTtcclxuICAgIGludCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZSA9IHRleHR1cmVTaXplKHVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzLCAwKS54OyAvLyB0aGUgZGltZW5zaW9uIG9mIHRoZSBxdWFkcmF0aWMgdGV4dHVyZVxyXG4gICAgaW50IGlQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNMZW5ndGggPSBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZSAqIGlQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplOyAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHRleGVscyBpbiB0aGUgdGV4dHVyZVxyXG4gICAgLyokdmFyaWFibGVzKi9cclxuICAgIC8qJG10eExvY2FsKi9cclxuICAgIC8qJG10eFdvcmxkKi9cclxuICAgIG10eE1lc2hUb1dvcmxkID0gLyokbXR4V29ybGQqLyBtdHhNZXNoVG9Xb3JsZCAvKiRtdHhMb2NhbCovO1xyXG4gICAgaWYodV9iUGFydGljbGVTeXN0ZW1GYWNlQ2FtZXJhKSBtdHhNZXNoVG9Xb3JsZCA9IGxvb2tBdCh2ZWMzKG10eE1lc2hUb1dvcmxkWzNdWzBdLCBtdHhNZXNoVG9Xb3JsZFszXVsxXSwgbXR4TWVzaFRvV29ybGRbM11bMl0pLCB1X3ZjdENhbWVyYSkgKlxyXG4gICAgICBtYXQ0KGxlbmd0aCh2ZWMzKG10eE1lc2hUb1dvcmxkWzBdWzBdLCBtdHhNZXNoVG9Xb3JsZFsxXVswXSwgbXR4TWVzaFRvV29ybGRbMl1bMF0pKSwgMC4wLCAwLjAsIDAuMCwgMC4wLCBsZW5ndGgodmVjMyhtdHhNZXNoVG9Xb3JsZFswXVsxXSwgbXR4TWVzaFRvV29ybGRbMV1bMV0sIG10eE1lc2hUb1dvcmxkWzJdWzFdKSksIDAuMCwgMC4wLCAwLjAsIDAuMCwgbGVuZ3RoKHZlYzMobXR4TWVzaFRvV29ybGRbMF1bMl0sIG10eE1lc2hUb1dvcmxkWzFdWzJdLCBtdHhNZXNoVG9Xb3JsZFsyXVsyXSkpLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCk7XHJcbiAgICBtdHhNZXNoVG9WaWV3ID0gdV9tdHhXb3JsZFRvVmlldyAqIG10eE1lc2hUb1dvcmxkO1xyXG5cclxuICAgICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICAgIG10eE5vcm1hbE1lc2hUb1dvcmxkID0gdHJhbnNwb3NlKGludmVyc2UobXR4TWVzaFRvV29ybGQpKTtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKFNLSU4pXHJcblxyXG4gICAgbXR4TWVzaFRvV29ybGQgPSBhX3ZjdFdlaWdodHMueCAqIHVfbXR4Qm9uZXNbYV92Y3RCb25lcy54XSArXHJcbiAgICAgIGFfdmN0V2VpZ2h0cy55ICogdV9tdHhCb25lc1thX3ZjdEJvbmVzLnldICtcclxuICAgICAgYV92Y3RXZWlnaHRzLnogKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMuel0gK1xyXG4gICAgICBhX3ZjdFdlaWdodHMudyAqIHVfbXR4Qm9uZXNbYV92Y3RCb25lcy53XTtcclxuXHJcbiAgICBtdHhNZXNoVG9WaWV3ID0gdV9tdHhXb3JsZFRvVmlldyAqIG10eE1lc2hUb1dvcmxkO1xyXG5cclxuICAgICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICAgIG10eE5vcm1hbE1lc2hUb1dvcmxkID0gdHJhbnNwb3NlKGludmVyc2UobXR4TWVzaFRvV29ybGQpKTtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gIGdsX1Bvc2l0aW9uID0gbXR4TWVzaFRvVmlldyAqIHZjdFBvc2l0aW9uOyBcclxuICB2Y3RQb3NpdGlvbiA9IG10eE1lc2hUb1dvcmxkICogdmN0UG9zaXRpb247XHJcblxyXG4gIHZfdmN0Q29sb3IgPSBhX3ZjdENvbG9yO1xyXG4gIHZfdmN0UG9zaXRpb24gPSB2Y3RQb3NpdGlvbi54eXo7XHJcblxyXG4gICNpZiBkZWZpbmVkKFBBUlRJQ0xFX0NPTE9SKVxyXG5cclxuICAgIHZfdmN0Q29sb3IgKj0gLyokY29sb3IqLztcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpXHJcblxyXG4gICAgdl92Y3RQb3NpdGlvbkZsYXQgPSB2X3ZjdFBvc2l0aW9uO1xyXG4gICAgXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2X3ZjdE5vcm1hbCA9IG1hdDMobXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3ROb3JtYWw7IC8vIHVubm9ybWFsaXplZCBhcyBpdCBtdXN0IGJlIG5vcm1hbGl6ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBhbnl3YXlcclxuXHJcbiAgI2VuZGlmIFxyXG5cclxuICAjaWYgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gICAgdl92Y3RUYW5nZW50ID0gbWF0MyhtdHhOb3JtYWxNZXNoVG9Xb3JsZCkgKiBhX3ZjdFRhbmdlbnQueHl6O1xyXG4gICAgdl92Y3RCaXRhbmdlbnQgPSBjcm9zcyh2X3ZjdE5vcm1hbCwgdl92Y3RUYW5nZW50KSAqIGFfdmN0VGFuZ2VudC53O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoR09VUkFVRClcclxuICBcclxuICAgIHZlYzMgdmN0VmlldyA9IG5vcm1hbGl6ZSh2Y3RQb3NpdGlvbi54eXogLSB1X3ZjdENhbWVyYSk7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCk7XHJcbiAgICB2X3ZjdERpZmZ1c2UgPSB1X2ZEaWZmdXNlICogdV9hbWJpZW50LnZjdENvbG9yLnJnYjtcclxuICAgIHZfdmN0U3BlY3VsYXIgPSB2ZWMzKDAsIDAsIDApO1xyXG5cclxuICAgIC8vIGNhbGN1bGF0ZSBkaXJlY3Rpb25hbCBsaWdodCBlZmZlY3RcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c0RpcmVjdGlvbmFsOyBpICsrKSB7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmVjMyh1X2RpcmVjdGlvbmFsW2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMS4wLCAxLjApKTtcclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X2RpcmVjdGlvbmFsW2ldLnZjdENvbG9yLnJnYiwgdl92Y3REaWZmdXNlLCB2X3ZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgcG9pbnQgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7aSA8IHVfbkxpZ2h0c1BvaW50O2kgKyspIHtcclxuICAgICAgdmVjMyB2Y3RQb3NpdGlvbkxpZ2h0ID0gdmVjMyh1X3BvaW50W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb24gPSB2Y3RQb3NpdGlvbi54eXogLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbGVuZ3RoKG1hdDModV9wb2ludFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uKTtcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMCkgY29udGludWU7XHJcblxyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfcG9pbnRbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdl92Y3REaWZmdXNlLCB2X3ZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgc3BvdCBsaWdodCBlZmZlY3RcclxuICAgIGZvcih1aW50IGkgPSAwdTtpIDwgdV9uTGlnaHRzU3BvdDtpICsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9zcG90W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb24gPSB2Y3RQb3NpdGlvbi54eXogLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbkludmVydGVkID0gbWF0Myh1X3Nwb3RbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbjtcclxuICAgICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIG1pbigxLjAsIDIuMCAqIGxlbmd0aCh2Y3REaXJlY3Rpb25JbnZlcnRlZC54eSkgLyB2Y3REaXJlY3Rpb25JbnZlcnRlZC56KTsgICAgLy9Db25lc2hhcGUgdGhhdCBpcyBicmlnaHRlc3QgaW4gdGhlIGNlbnRlci4gUG9zc2libGUgVE9ETzogXCJWYXJpYWJsZSBTcG90bGlnaHRzb2Z0bmVzc1wiXHJcbiAgICAgIGZJbnRlbnNpdHkgKj0gMS4wIC0gcG93KHZjdERpcmVjdGlvbkludmVydGVkLnosIDIuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJldmVudHMgaGFyc2ggbGlnaHRpbmcgYXJ0aWZhY3RzIGF0IGJvdW5kYXJ5IG9mIHRoZSBnaXZlbiBzcG90bGlnaHRcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMCkgY29udGludWU7XHJcblxyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfc3BvdFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2X3ZjdERpZmZ1c2UsIHZfdmN0U3BlY3VsYXIpO1xyXG4gICAgfVxyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgICAvLyBURVhUVVJFOiB0cmFuc2Zvcm0gVVZzXHJcbiAgI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gICAgdl92Y3RUZXh0dXJlID0gdmVjMih1X210eFBpdm90ICogdmVjMyhhX3ZjdFRleHR1cmUsIDEuMCkpLnh5O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoTUFUQ0FQKVxyXG5cclxuICAgIHZlYzQgdmN0VmVydGV4SW5DYW1lcmEgPSBub3JtYWxpemUodV9tdHhXb3JsZFRvQ2FtZXJhICogdmN0UG9zaXRpb24pO1xyXG4gICAgdmN0VmVydGV4SW5DYW1lcmEueHkgKj0gLSAxLjA7XHJcbiAgICBtYXQ0IG10eF9Sb3RYID0gbWF0NCgxLCAwLCAwLCAwLCAwLCB2Y3RWZXJ0ZXhJbkNhbWVyYS56LCB2Y3RWZXJ0ZXhJbkNhbWVyYS55LCAwLCAwLCAtIHZjdFZlcnRleEluQ2FtZXJhLnksIHZjdFZlcnRleEluQ2FtZXJhLnosIDAsIDAsIDAsIDAsIDEpO1xyXG4gICAgbWF0NCBtdHhfUm90WSA9IG1hdDQodmN0VmVydGV4SW5DYW1lcmEueiwgMCwgLSB2Y3RWZXJ0ZXhJbkNhbWVyYS54LCAwLCAwLCAxLCAwLCAwLCB2Y3RWZXJ0ZXhJbkNhbWVyYS54LCAwLCB2Y3RWZXJ0ZXhJbkNhbWVyYS56LCAwLCAwLCAwLCAwLCAxKTtcclxuXHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG1hdDModV9tdHhOb3JtYWxNZXNoVG9Xb3JsZCkgKiBhX3ZjdE5vcm1hbDtcclxuXHJcbiAgICAvLyBhZGRzIGNvcnJlY3Rpb24gZm9yIHRoaW5ncyBiZWluZyBmYXIgYW5kIHRvIHRoZSBzaWRlLCBidXQgZGlzdG9ydGlvbiBmb3IgdGhpbmdzIGJlaW5nIGNsb3NlXHJcbiAgICB2Y3ROb3JtYWwgPSBtYXQzKG10eF9Sb3RYICogbXR4X1JvdFkpICogdmN0Tm9ybWFsO1xyXG5cclxuICAgIHZlYzMgdmN0UmVmbGVjdGlvbiA9IG5vcm1hbGl6ZShtYXQzKHVfbXR4V29ybGRUb0NhbWVyYSkgKiBub3JtYWxpemUodmN0Tm9ybWFsKSk7XHJcbiAgICB2Y3RSZWZsZWN0aW9uLnkgPSAtIHZjdFJlZmxlY3Rpb24ueTtcclxuXHJcbiAgICB2X3ZjdFRleHR1cmUgPSAwLjUgKiB2Y3RSZWZsZWN0aW9uLnh5ICsgMC41O1xyXG5cclxuICAjZW5kaWZcclxufWA7XHJcblxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db2F0L0NvYXQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYWNjZXNzIGRhdGEgZnJvbSBhIFdlYkdsIHNoYWRlcnByb2dyYW0uIFxyXG4gICAqIFRoaXMgc2hvdWxkIGFsd2F5cyBtaXJyb3IgdGhlIChzdGF0aWMpIGludGVyZmFjZSBvZiB7QGxpbmsgU2hhZGVyfS4gSXQgZXhwb3NlcyB0aGUgc3RhdGljIG1lbWJlcnMgb2YgU2hhZGVyIGluIGFuIGluc3RhbmNlLWJhc2VkIHdheS4gZS5nLjpcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlO1xyXG4gICAqIGBgYFxyXG4gICAqIGNhbiB0YWtlIHZhbHVlcyBvZiB0eXBlIFxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiB0eXBlb2YgU2hhZGVyIHwgU2hhZGVySW50ZWZhY2VcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNoYWRlckludGVyZmFjZSB7XHJcbiAgICBkZWZpbmU6IHN0cmluZ1tdO1xyXG4gICAgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgICB1bmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfTtcclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZztcclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IGRlY29yYXRvci4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS4gKi9cclxuICAgIGRlbGV0ZVByb2dyYW0odGhpczogU2hhZGVySW50ZXJmYWNlKTogdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgSW5qZWN0ZWQgYnkgZGVjb3JhdG9yLiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgdXNlUHJvZ3JhbSh0aGlzOiBTaGFkZXJJbnRlcmZhY2UpOiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSBkZWNvcmF0b3IuIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBjcmVhdGVQcm9ncmFtKHRoaXM6IFNoYWRlckludGVyZmFjZSk6IHZvaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWMgc3VwZXJjbGFzcyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIFdlYkdsIHNoYWRlcnByb2dyYW1zLiBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgLy8gVE9ETzogZGVmaW5lIGF0dHJpYnV0ZS91bmlmb3JtcyBhcyBsYXlvdXQgYW5kIHVzZSB0aG9zZSBjb25zaXN0ZW50bHkgaW4gc2hhZGVyc1xyXG4gIEBSZW5kZXJJbmplY3RvclNoYWRlci5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXIge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyO1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgU2hhZGVyW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW107XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBmcmFnbWVudFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICAgIHB1YmxpYyBzdGF0aWMgdW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH07XHJcblxyXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNvYXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgc2hhZGVyIHRvIGNyZWF0ZSBhIG1hdGVyaWFsICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdENvbG9yZWQ7IH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyVW5pdmVyc2FsLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovIC8vIFRPRE86IG1heWJlIGRvbid0IGZsYWcgdGhpcyBhcyBpbnRlcm5hbCwgc28gc2hhZGVycyBjYW4gYmUgcHJlY29tcGlsZWQgaW4gZnV0dXJlIEZVREdFIGFwcHMuIE9yIGNyZWF0ZSBhbiBBUEkgdG8gcHJlY29tcGlsZSBzaGFkZXJzLCBsb2FkIHRleHR1cmVzIGV0Yy5cclxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgU2hhZGVyKTogbnVtYmVyIHsgcmV0dXJuIFNoYWRlci5zdWJjbGFzc2VzLnB1c2goX3N1YmNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICAvLyByZXBsYWNlIHRoZSBtYW5kYXRvcnkgaGVhZGVyIG9mIHRoZSBzaGFkZXIgd2l0aCBpdHNlbGYgcGx1cyB0aGUgZGVmaW5pdGlvbnMgZ2l2ZW5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5zZXJ0RGVmaW5lcyhfc2hhZGVyOiBzdHJpbmcsIF9kZWZpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgIGlmICghX2RlZmluZXMpXHJcbiAgICAgICAgcmV0dXJuIF9zaGFkZXI7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCIjdmVyc2lvbiAzMDAgZXNcXG5cIjtcclxuICAgICAgZm9yIChsZXQgZGVmaW5lIG9mIF9kZWZpbmVzKVxyXG4gICAgICAgIGNvZGUgKz0gYCNkZWZpbmUgJHtkZWZpbmV9XFxuYDtcclxuXHJcbiAgICAgIHJldHVybiBfc2hhZGVyLnJlcGxhY2UoXCIjdmVyc2lvbiAzMDAgZXNcIiwgY29kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckFtYmllbnRPY2NsdXNpb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckFtYmllbnRPY2NsdXNpb24uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJCbG9vbSBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJTY3JlZW4udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyQmxvb20uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJGbGF0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiRkxBVFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckZsYXRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0U2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0VGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJGTEFUXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR2l6bW8gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHaXptb1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcIlRFWFRVUkVcIl07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHb3VyYXVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiR09VUkFVRFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdvdXJhdWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJHT1VSQVVEXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXQpO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFNraW4pO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXRUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTWF0Q2FwIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJNYXRDYXApO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJNQVRDQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclBob25nIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZyk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1NraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZTsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1RleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFscyBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJOT1JNQUxNQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFsc1NraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIk5PUk1BTE1BUFwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2suZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrVGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGlja1RleHR1cmVkLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclRvb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclRvb24pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb247IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyVG9vblNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uOyB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyVG9vblRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uVGV4dHVyZWQ7IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uVGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWRTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb25UZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlRGVmYXVsdCBleHRlbmRzIFRleHR1cmVCYXNlNjQge1xyXG4gICAgcHVibGljIHN0YXRpYyBjb2xvcjogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIlRleHR1cmVEZWZhdWx0XCIsIFRleHR1cmVEZWZhdWx0LmdldENvbG9yKCksIE1JUE1BUC5NRURJVU0pO1xyXG4gICAgcHVibGljIHN0YXRpYyBub3JtYWw6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlTm9ybWFsRGVmYXVsdFwiLCBUZXh0dXJlRGVmYXVsdC5nZXROb3JtYWwoKSwgTUlQTUFQLk1FRElVTSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRvb246IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlVG9vbkRlZmF1bHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0VG9vbigpLCBNSVBNQVAuU01PT1RILCBXUkFQLkNMQU1QKTtcclxuXHJcbiAgICAvLyBUT0RPOiBtYXliZSBtYWtlIHRoZXNlIGxhenlcclxuICAgIHB1YmxpYyBzdGF0aWMgaWNvbkxpZ2h0OiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiSWNvbkRlZmF1bHRMaWdodFwiLCBUZXh0dXJlRGVmYXVsdC5nZXRJY29uTGlnaHQoKSwgTUlQTUFQLkJMVVJSWSwgV1JBUC5DTEFNUCwgMjU2LCAyNTYpO1xyXG4gICAgcHVibGljIHN0YXRpYyBpY29uQ2FtZXJhOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiSWNvbkRlZmF1bHRDYW1lcmFcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkNhbWVyYSgpLCBNSVBNQVAuQkxVUlJZLCBXUkFQLkNMQU1QLCAyNTYsIDI1Nik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGljb25BdWRpbzogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0QXVkaW9cIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkF1ZGlvKCksIE1JUE1BUC5CTFVSUlksIFdSQVAuQ0xBTVAsIDI1NiwgMjU2KTtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgaWNvblBhcnRpY2xlczogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0UGFydGljbGVcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvblBhcnRpY2xlcygpLCBNSVBNQVAuQkxVUlJZLCAyNTYsIDI1Nik7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29sb3IoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBRFdMU1VSQlZIaGU3ZDBIbkZUbHZmL3hIOXVYWllHbDl5clNSSnBFVWV4WXNKSWJhOFJlNDk4V05jWkViKzQxZXBPSXNXczBOaXl4bTJnMGR1d2Fld083b3FKQ0FHblN0N0gvODMwNEI0ZGxkcGs1WjNiM3pPN256ZXU4NXB3ek04dk1zN1BQYjM1UE82MXFQQlpqclZxMTh2ZmlLZWJGUi9sRlJQbEZRL2xGRS9meXkvRnZBUUJJQ3dFRUFCQUtBUVFBRUFwOUlCSFJoaG9ONVJjTjVSZE5TeWcvL1l6Q3drSnIzYnExTzE2OWVyWGJNb0VBRWhGL3dORlFmdEZRZnRFMDkvTEx6YzIxTGwyNjJFOSs4aE1iUDM2OFZWZFgyK3V2djI3VHAwOTNRU1RxK3llQVJNUWZjRFNVWHpTVVh6VE50Znh5Y25Lc3BLVEVCZzBhWkVjZWVhUWRldWlodG1MRkN2dnNzODlzM3J4NTl2ampqOXZERHo4Y09ST0pIRUNxcXFwczl1elp0bXpaTWx1NWNxVkxsZHExYTJkOSsvWjErMUh4QVl5RzhvdUc4b3VHOG9zbVRQbmw1K2RiOSs3ZGJmZmRkN2RUVHozVjFjWHZ2dnV1dmZ6eXl5NERrVldyVnRtTk45NW9TNVlzY2NkaGhRNGc1ZVhsOXV5eno5cU1HVE5zelpvMS90a2ZLUUlxK3UyOTk5NVdXbHJxbjAwZkg4Qm9LTDlvS0w5b0tMOW8waWsvUGJaTm16YTJ4UlpiMkhISEhXZVRKMCsyaFFzWDJwTlBQbW1MRnkvMkg3WE9mLzd6SDd2MTFsdGRQUjVGcUFDeVlNRUN1K2VlZTFLS1htdlhyclg5OXR2UFJvOGU3WUpLdXZnQVJrUDVSUk9Vbno2NytpS1VsNWRubFpXVnRuejU4bGk4ZGo1LzBUU244bE9UMWI3Nzdtc1hYSENCZGU3YzJWNTc3VFY3ODgwM2s3N0hiNy85MXU2NDR3NnJxS2p3ejRTVGRnQlJ0cUhVSjRob0NoQ2ZmUEtKZmZYVlY2NDlyWDM3OWpaZ3dBQzNCWlF1VFpvMHliYmJianVYWHFXREQyQTBsRjgwUWZsMTdOalJqam5tR092VXFaTjk4ODAzOXNBREQ3Z3ZVazM5K3ZuOFJkT2N5cTlyMTY0MmRlcFUyM3JycmUzUlJ4OTFYM0pFZGJTYXNJcUxpMjNZc0dIdVhLWUNTTm9wZ1hydmcrQ2gvby83N3J2UHZWaTkrSi8vL09kMjlORkgyOUNoUTkwTERHajRtTklsQlptNC84TFFzc3ljT2RNMXhiNzY2cXRKbTJKRjJVZlBuajN0MTcvK3RVMllNTUYyM1hWWE8vYllZMTFRUWZNMWYvNTh1K21tbTF6ZmdmcDQ0MDcxc1Y2elBzdEI4RkE5ckMvOFR6MzFsT3NYeWJTME1wQWZmdmpCcnI3NjZ2VWRNVUVmaUZLbS9mZmYzOHJLeXRhbitNcEdWUGpCWS9YSHFlempyTFBPY3Azc3FlSWJURFNVWC8zKzhJYy91TStyNkV2UVQzLzZVemZzTVNnMzNTcUFxRjM1bVdlZXNXdXZ2ZGFkbDRjZWVzamVlKzg5LzZocDhQbUxwcjd5MDZpbEs2KzgwbFhNMHI5L2Z4czVjcVQ3Z2x4UVVPRE9OYlIweWkvNG9uUEVFVWU0WTQyMGV1ZWRkOXhncHFPT09zcDIzSEZITndwTG1pUUQrZUNERHpib3hYLzc3YmRkeG5IZ2dRZGFuejU5ckczYnRpN2JVSURvMXEyYjYwQVBGQlVWMlhQUFBSZUx0QjlJUm45UUw3MzBVc29kaTdVN0p0RzhxRU42bDExMjhZL012djc2YS92blAvOXBmLzd6biszQkJ4KzBMNy84TWxaMW1acXE1czZkNno3SCtxS2paaXZSKzFEZ0N5WVNabEphQWVTTEw3N3c5OHcrLy94ejk4SVU3ZlROTFZta0hERml4QVlkNTNxODNsVFVubitnSVNqRDFsRDBWQ3VGNE1zVW1pLzFKNmh6V3ArSllGUEdxcVpQVmRTWFhucXB5MHcxMmlrTzlKbFVkckYwNmRMMW4yTk5KbXlvakNubEFLSVg4OTEzMy9sSDVpS2Qyb1BWcnBZWUpCS3BPVXVqQVFMcWdIenJyYmZxYkdzR2dEaFIzVFp1M0xpTjZyaWdjdFlYamxkZWVjVjk0Ny8rK3V2dGpUZmVjSzB6VFNsNGJZMGg1UUNpYjJkQlc2Qm9DSytHNXFwbnZ6N0tUZ0pxMnZyMDAwL0pRQUJrRFRYLzFGY3BCL2VwQTF2OURtcml1dnZ1dSszamp6OXU5bGxxeWdHazlwd1BSVmtOMWQzVXNGd042dzJvajBSRElJTk9Td0NJTzlWaDZVeUdWa0JSRS8rOTk5NXJGMTk4Y1N6N1N6SWw1UUJTT3kxVDc3MEtWdTFyOVVrTU1OcFhsS2J0R0VBMjZkMjdkNTFOOWNrb1dLaGZXRitXUC96d1E5ZGZjdFZWVjdsQkdtck5hUzVTSHNhcjRZb2FnUkM0L1BMTDNXSmMyMjY3cmV2cnFJdFdmbnppaVNmOEk3TXJycmpDRFMzVGtMaFUxTzZjVjJlUVJuekZ4V09QUGVidnhkTmVlKzNsNzhWVFU1V2Z2c3owNnRYTFRid0tNbUxOYWRLb3dqMzMzSFA5T200cVAxVWNtMisrdWQxMjIyMXVHSHRBNCtzMThrV2RyRTJGejE4MHFaYWZScHhxQ0d6VUxDS296M3IwNk9HNkFEUTh2TDQxQTlNWnhsc1hEVXZYY0hYMVFRZkR6ak0xakRmbEFLSXA4WW1GclhhK0YxNTR3VWFOR2xWdlpGYXdlT1NSUi95amRZRkhIVTM2ZzB4RjdRSlVuOG92ZnZFTC93Z0lwME9IRGk1WTZGdGhFRURVNURCOCtIQWJQSGp3QnBtelBvUDZJNXd5WllvYmRSTzQ1WlpiM0VDU1ZEL0xRRzJhM3ZDclgvMnF6anEwMlFTUTJvSGdzc3N1Y3pNZU5hbW12amRaTy9CY2Nza2xibzBXUmQ1VTFQN1phalpMbkYvUzFQUnROYzRTczc4NGFxcnlVMy9jYnJ2dDVyN1FCQUZFNjd0cDNQL1lzV1BYRDN0VStlbVBXeE8wemozM1hKZEJCelJSZHJQTk5uUDNOUlUrZjlHa1duNkxGaTF5UTJNelNhdmthb1NYdnJUVXBka0VFTTA0VjJkUVFETTBsWUVvRU5UM0poVmtOSTFlMVBlaEFLSTNvVzk1cWNoRUFUYWtGSXV2eVZCKzlVdWNpZjczdi8vZHJaUncwRUVIclI5ZHFQSlRQNSthRzFRWlhuUE5OZTY4cUFscnpwdzUvbEhUNFBNWFRhcmxwK1o2MVZ0aHkxdWZJZFYvV3ExanpKZ3h0dVdXVzdvdk1adVNpZkpyeUFDU2NxOVE3WWtvbXRXb1A3eE5GV2ppa04xZ09aUEU1Z0dnS1NYMjM2a3ZRMFBWRXovVCtnUFc4SE5sSmVsMG9xSjUwVVdZMU4rVmpxRHlWeCtIZ29hV1dEL3R0Tk5jczJjcXdTTWJwUHdYVVhzWW0yYVZhOEd1VFJWcTRpSmtXdnBCUDJkVEk3ZUF4cExZZ2FrQW9oRXlpYU1FOVkxUkYrWlI4MVZjWmh1amNlbExoUUpJT3RtQUhqdHc0RUMzekpQNk9EU1lvQ21iT2h0S3lnRWtjVDZINlBqNzc3L2ZZSEpoTW9uckJXa3VpVWErMURkcUMyaE1pU3ZxcWo5RFFTTHhNNjNtckQvOTZVOHUrMGhzd2tYTG9Ua2RtMnBwQ1lLTFZ1WlFzRkRRT095d3c5enk2YzM1QzNQS0FVUnR3b21MY2FtZ3RMUkpmUUZFVFZ4YThpU2c5bUlOd2FVSkMzR2hqc3lBUHRNYXFwazQ1K21QZi95amE0WlZCM3ZVNjBjak8ya3FRckxzSTJqU1ZMMm96dkNUVGpySlRqamhCTGUvcVJVNkdvdGVkenFaVTdwU0RpQXFyTVM1RzVxRnJxbjY5YTFycGRtWFFRZWxhRFZMZFI1cDZCb1FCMXFtSXBGR3hHZytpQmJMMHdTd3A1OStlbjN3VUlkanBrZmlJTjcwSlhuMjdObnJNNUNnUWxZcmloYUwxV0t5WjU5OXRydGdYdUt5VFUxQnIwdGRDNXIwcUMvcXdhYW1zMlJ6bGRTdnJmdjBlSFd3aDVGeUFKRWhRNGI0ZSt1R1Flb0NVWFV0SEtZQzF5SmpBZjBTMUw0OGZ2ejQyRVJuUUovamJiYlp4ajlhOTBWSi9YYi8rTWMvM0ZVSFAvcm9JL2RaMXFKNXQ5OStlMVpjV0FpWm9mNWRqYjVLcEMvUnV0YjRPZWVjNDI1MTNKRGY4Tk9oVEVpWHRMM3p6anZkbktaZ3UrR0dHMnlISFhiWTRIVUdDWUVXZ05Uanp6Ly9mTGZ3YmJydkphMEFvamtmaWYwWG1rU29JYnExVTN2OXdXbUpZdzBWQzJqdWh4NnZTVmMwWVNGT0prNmM2RVphSmN1bVZZa29HOUh3WFYzTFJrTWlBeXpKMDd4cDNUNzE4MnJTcVQ0anYvemxMKzN3d3c5M3JTaHhyTVBVc3FNNlZ2M1RHcTZyUzJkby9wNG1ibXNWRVYxNlBLQmdvU3RycXBWSTEzbFNQODNKSjUrYzlxb0thVjJSVVBTQ0ZKV0RTS1VtS25VK2JyWFZWaTRDcXFOY0x6NXg2WGNkYXd5OUpoOHE1VXZuUmNZbHV0Y2x6ZUpyZEpSZmFuVDFPYTJncW05c0NnejZvcVNNV1g5MHdlVkJkVTd6bDlSTW9NOTNVODhCRVQ1LzBkUlhmcnBQOVprQ1NGTkpwL3hVcnlvcjBrVHI0TXFENmRJOFBXWGJxVW83Z0lqV3ZsZGtUdVhOYVFTREx2MjV4eDU3dUZtL2FtOUxwMUNvQUtPaC9GS25JS0xobWxvOVlkYXNXYTY1U2t2MkpMNUdwZjRxVTUxTGQxNUFRK0R6RjAxekt6OTl1VG40NElQZGFGZjEyYVh6L2pSaVZzMWQ2UWdWUU5Udm9Xd2lTTytTVVdlai9oQzFDSmtXWE5Uak5XczkzU0Z0ZkFDam9melNweVpaWmRZS0VKb0hFbWQ4L3FKcGJ1V254eXNUVVhOVzdUbE5tNkt5U0xjOFFnVVEwYmV6SjU5ODBpMG9welJQelZkNjhmb1dwMGltRkYvWFJUL2trRVBjb25VYXRSVm0vZ2Nmd0dnb3YyZ292MmdvdjJqaVhuNmhBNGpvbTVxQ2hZYno2a3FEU3Y4MUwwU1RzelI4VEIwNjZuVFVTSmRnekhTNitBQkdRL2xGUS9sRlEvbEYwNndEU0VEcHZ0cmJGRHowNDlSTXBWRUtXaVlpYWdId0FZeUc4b3VHOG91Rzhvc203dVdYa1FEU2tQZ0FSa1A1UlVQNVJVUDVSUlAzOGd2WHJnUUFhUEVJSUFDQVVBZ2dBSUJRMU1BVzcwYkFkYThSSVkwZE96YnV2OTlZZSt2dHQvMDloTkVxNW4wTWNSZjMwaU1EQVFDRVFnQUJBSVJDQUFFQWhFSUFBUUNFUWdBQkFJUkNBQUVBaEpLUkFLS3JET3BLWFZ0dnZiVi9CZ0RRM0dVa2dPaHlvQU1IRGd4OVlYWUFRUGFoQ1FzQUVFcEdBa2pjVjdRRUFHUWVHUWdBSUJRQ0NBQWdGQUlJQUNDVWpBYVF1Rjg5Q3dDUU9XUWdBSUJRQ0NBQWdGQXlFa0FZeGdzQUxROFpDQUFnRkFJSUFDQ1VqQVlRUm1FQlFNdEJCZ0lBQ0lVQUFnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ3lXZ0FZUmd2QUxRY1pDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdNWUxBQzBQR1FnQUlCUUNDQUFnbEl3R0VJYnhBa0RMUVFZQ0FBaUZBQUlBQ0lVQUFnQUlKU01CaEdHOEFORHlrSUVBQUVMSlVmWVFkWnMyYlpyN1lVY2RkVlRTKzZOc0FOQlNhV1JybkxlTVpDRDZRUUNBbG9VbUxBQkFLQVFRQUVBb0dRMGc5RmtBUU10QkJnSUFDSVVBQWdBSWhRQUNBQWdsSXdHRVlid0EwUEtRZ1FBQVFpR0FBQUJDeVdnQVlSZ3ZBTFFjWkNBQWdGQUlJQUNBVUFnZ0FJQlFNaEpBR01ZTEFDMFBHUWdBSUJRQ0NBQWdsSXdHRUlieEFrRExRUVlDQUFpRkFBSUFDSVVBQWdBSUpTTUJoR0c4QU5EeWtJRUFBRUloZ0FBQVFzbG9BR0VZTHdDMEhHUWdBSUJRQ0NBQWdGQXlFa0FZaFFVQUxROFpDQUFnRkFJSUFDQVVBZ2dBSUpTTUJoQ0c4UUpBeTBFR0FnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ0lZQUFBRUxKYUFCaEdDOEF0QnpxL1k1YzZ3OGJOc3dPT3VnZysvREREKzMrKysvM3oyYUdGNVIyOW5jUndva25udmljdjRzUWJ2anJEZjRld3FocHhaZktTR0plZkRSaEFRQkN5VWdBQ1pxdUdNNExBQzBIR1FnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNDVWpBUVFodkVDUU10REJnSUFDSVVBQWdBSWhRQUNBQWlGQUFJQUNJVUFBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkNJWUFBQUVJaGdBQUFRaUdBQUFCQ0lZQUFBRUxKU0FCaEdDOEF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNBVUFnZ0FJQlFNaEpBR0lVRkFDMFBHUWdBSUJRQ0NBQWdGQUlJQUNBVUFnZ0FJQlFDQ0FBZ0ZBSUlBQ0NVakFRUWh2RUNRTXREQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xSLzBYVWJmSEgzL2MvYkE5OTl3ejZmMVJOZ0JvcWRTdkhPZU5EQVFBRUFvQkJBQVFDZ0VFQUJBS0FRUUFFQW9CQkFBUUNnRUVBQkJLUmdLSWhuTUp3MjRCb09VZ0F3RUFoRUlBQVFDRVFnQUJBSVJDQUFFQWhFSUFBUUNFa3BFQXdpZ3NBR2g1eUVBQUFLRVFRQUFBb1JCQUFBQ2hFRUFBQUtFUVFBQUFvUkJBQUFDaFpDU0FNSXdYQUZvZU1oQUFRQ2dFRUFCQUtBUVFBRUFvQkJBQVFDZ0VFQUJBS0FRUUFFQW9HUWtnRE9NRmdKYUhEQVFBRUVwR0FraHVicTY3cmE2dWRyY0FnT1l2NVFDeVlzVUt1K09PTyt6R0cyKzBlKzY1eDVZdlgrN2ZVNzgzM25qRHBrMmJaamZmZkxOOS9QSEgvbGtBUUxaTE9ZQW95NWc5ZTdiTm5UdlhQdjMwVTd2d3dndnQ4ODgvdDdWcjEvcVAySmd5a21lZmZkYSsrZVliKys2NzcreXFxNjd5N3dFQVpMdVVBMGh4Y2JIMTc5L2ZQekpidlhxMTNYLy8vUzR6Q1FTZDZZRXZ2dmpDeXN2TDNiNkN5Y01QUCt6MkFRRFpMNjAra0ZHalJ2bDdacDA2ZGJMbm5udXUzcWFzbVRObitudG1YMzc1cFMxYnRzdy9BZ0JrdTdRQ3lPREJnOWQzbUl2MlAvdnNNNnVxcXZMUC9Fam5sSUVFUHZyb0l4czNicHgvQkFESWRta0ZrTHk4UEJzeVpJaC90QzZnUFBQTU03WnExU3IvekkvVVB4STBYMVZVVkxoZ01tblNKSGNNQU1oK2FRVVFHVE5takw5bjFxRkRCM3Z0dGRmV0I1REVQcEFQUC96UTN6UFg2VjVRVUdBVEowNzB6d0FBc2wzYUFhUmZ2MzVXV0Zqb0g1bmJuelZybHVza1Y1Q1F5c3BLMTdRVlVERFpmdnZ0clVlUEh2NFpBRUMyU3p1QTVPVGsySlpiYnVrZm1XdlNldkhGRjEyZmg1cTRSTUZEUVVRMFNrdkRlUGZlZTI4ckxTMTE1d0FBMlMvdEFDSmp4NDcxOTh6YXRtMXJNMmJNY1BOQjJyUnA0ODRsTmwrcDg3eXNyTXkyMjI0N054UVlBTkE4cU5NaXJSVVEyN2R2YjZlY2Nvb0xIRUhmeDV0dnZtbTlldld5blhiYXlYYmZmWGU3N3JycjFvL011dUdHRzJ6Ky9QbWhsem1wcWFtNXdOOUZDRjc1LzQrL2l4Qk9QUEVFZnc5aDFOUnNPRGNNNllyM0FyVnBaeUJxa3BvK2Zib05IejdjUDJNMmRPaFFOMHU5VDU4K2JyNUhFRHkrLy81N04zT2ROYklBb1BsSk80QW9PR2haa3NRbFROUjB0V1RKRW12WHJwMGJjUlhRUk1MYXM5TUJBTTFEcUQ0UXpTaC82cW1uM0d6MFFQZnUzZTJERHo2d3I3LysyaDNyMmlEcUd3RUFORStoQW9pYXNUVHlhdENnUWY0WnM4MDMzOXl0dkJzMFg2bEphK25TcFZ4a0NnQ2FxVkFCUk0xWEN4WXNzSVVMRjY1dm9tcmR1clhsNStlN2ZWRTJrcmpzQ1FDZ2VRa1ZRQ1JveHVyWnM2ZC9adDJLdmFJc1JFTjV5VDRBb1BrS0hVQTBoRmZOV0ltejBnT2FTS2psM3V1N1ZnZ0FJTHVGRGlES0x0VFBjZEZGRjduRkVvTmdvZjRSOVlWb3hub3lkWjBIQUdTWHRDY1MxcVoramhFalJyaUFvaUc4YTlhczhlOUpUbzlQWjE2STkzT1pTQmdCRXdtallTSmhORXdraktxWlRTU3NUY0ZBbzYwMEEzMmZmZmJ4ejlhTlNZVUEwRHlrRkVEVXo2SE9jaTFYMHJWcjEvV0xKZ1lVRkVwS1N0eEV3b0NhcXJUY3U1NmpWWGcxU2dzQTBIeWtGRUIwWWFnNWMrYTRHZWhhMXlxWTYxRWY5WWtzWHJ6WVBVZkxtU1M3NkJRQUlIdlJvdzBBQ0NVakFZVDVIZ0RROHBDQkFBQkNJWUFBQUVJaGdBQUFRc2xvQU9IYUh3RFFjcENCQUFCQ0lZQUFBRUxKU0FCaEdDOEF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdGQXlHa0FZeGdzQUxRY1pDQUFnRkFJSUFDQ1VqQVFRaHZFQ1FNdERCZ0lBQ0lVQUFnQUloUUFDQUFnbG93R0VZYndBMEhLUWdRQUFRaUdBQUFCQ3lVZ0FZUmd2QUxROFpDQUFnRkFJSUFDQVVETGFoTVVvTEFCb09jaEFBQUNoNUNoN2lMcTk4ODQ3N29lTkhqMDY2ZjFSTmdCb3FkU3FFK2VOREFRQUVFcEdBb2dpa1pBeEFFRExRUVlDQUFpRkFBSUFDSVVBQWdBSWhRQUNBQWlGQUFJQUNJVUFBZ0FJSlNNQmhHRzhBTkR5a0lFQUFFSWhnQUFBUWlHQUFBQkNJWUFBQUVJaGdBQUFRaUdBQUFCQ3lVZ0FZUmd2QUxROFpDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNBVURJU1FCaUZCUUF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdsSXoyZ1FBQVdnNHlFQUJBS0FRUUFFQW9HUTBnRE9NRmdKYUREQVFBRUFvQkJBQVFDZ0VFQUJCS1JnSUl3M2dCb09VaEF3RUFoRUlBQVFDRWt0RUF3akJlQUdnNXlFQUFBS0VRUUFBQW9XUWtnREFLQ3dCYUh0WDhrVHN1T25ic2FLZWVlcW90V3JUSXJyNzZhdjlzWnRUVTFMemc3eUtFdDk5K2UwZC9GeUdNSFR2VzMxdW45cGVsMnYxK1RYMS9iYlVmWDF0RFB4L05HMDFZQUlCUUNDQUFXaHhsVG01YnUzYjlQdEtYa1FCQzRRT0lNOVZSVlpXVnRtRGVkM2Jqbjg2eHZZWVVlRnUrN1RYVXYvVzJzdy9ieVQ1NjkxV3JxQ2kzdFY1Z3dhYVJnUUQxVUI5QTRoWjhXdzIycHI0ZmRWTVFXTEpvZ2IzeTlFTjIwajRqYmQ4dGl1M0lIZnZaUDZaZDV0MjdjZGw5K05iTGR0WWgyOXYrSTByc29LMjcyRDl2djhZV3paOXIxZFZWL2lOUUd3RUVRTE9ob1BIMTV4L2F2WCs5MkFXQm4yL2J3eTQ2NVFENzVvdVAvRWVrWnVXeXBYYjkvNTFoVTNib1l6OGIyOUZ1bnZvYm0vWHhlMTR3cWZZZkFjbG9FNWErSVFGQVkxSS94Z2RlOW5Ebk5SZlp6OGFVMlMrOGJPUFd5ODV6UVNBVHlsZXZ0QWR1dnNST21ieVYrL2wvdS9yMzlzR2JML24zdG14a0lBQ3lSdEIwdDNadHRjMTg4MFdiZHVsNXR0K0lFdnZWWVR0NUZmdi8yaHF2c205STVXdFdlWUhxOS9hcktUdmJ2dDcvZStjMUY5cG5NOTl5bVU5TGJGSlV5aEQ1WFplVmxkbnBwNTl1aXhjdnRxdXV1c28vbXhuZUw0VjVJQkV3RHlTYXVNOEQyWlRhejY5dFV6K3ZvWitmS3YyYzZxb3FtLzNGUnpiOXdkdnR5UWVtMmVxVnkveDdtMTVacDI2MjYrVERiZTlEVDdETzNYdGJUazV1MnIrcmJFUUdBaUNXZ3FBeDUrdlA3ZG9MVHJWamR4OWlwMHdlYXcvZGRtV3Nnb2NzV1RqUEhyanBFanQ2MTBGMitzKzJzVHV2dmNnV2Z6L1AxbFpYWnl5SXhoRUJCRUNzcUtQNmh5VUw3YjRicHRycEI0eTM0L1lZYW8vZWZiMHRtRHZiZjBTOHFiUDl6cXN2c0NOMjZtZm5Iclc3UGYrdmUyemw4aCthWlNBaGdBQ0loVlVybHRrTGo5MW5aeDI2ZzAzWnZyZnJDSi8xOGJ2K3ZRMG5KNmVWNWVYbHV2YjhURkwyTlBPTkYyenEyWWU3ek9TQ1gweTJUOTkvdzhyWHJQWWZrZjFVWnBIREluMGc4VVVmU0RSYmJiV1Z2N2RPN1crUjZmWlpOUFQ5dGRWK2ZHMU4vWHpOc1ZndzV4dTc2OXFMN00wWEhuT1pSME1vTENpd2ZuMTcyRTRUeGxsSlNaRTdwNWRlWEZ4c25UdVZXVjV1cnBWWFZOaXNyNzYxQng2YWJ2TVhMSEtQeVRTVmwvcElkdnV2bzIzUGc0NnhqbDE2YkxJTTQweXZ2UDdmY0FyYXQyOXZaNXh4aGkxWnNzU3V2UEpLLzJ4bWVCOUFBa2dFQkpCb0NDQU44L3pLaW5JMzlQYTZDMCszT2JNL2QzMEZEYVYzejY3MjI3T1BkNEZpVTY5WDFJUTI0OFBQN2ZKcjc3Q1ZLeHN1VzhndktMUytnNGJiS2Y5N3JXMDJiTFRsNXVYNTkyUVBtckFBTkNyMVpSeXoyMkQ3N2RGNzJMZGZmdEtnd1NNL1A4L08rZVV4MXFWemg1U0NoK1I2MmNpb0VZUHQ3Rk9QOU04MERBWFJMejU4eDg0NGNGczdZdWYrOXZGN3IvbjNaQThDQ0lCR05mUFpoMnpOOTNQOG80YlZ5dnRYVlZXMXlVeXFOZ1diRlN0WCtVY05yY2JXTEpwbmoxNzVHLzg0ZXhCQWdIcW80a25jVkxFa2JuRzd2L1pXKy9HMXQyVFBTZHlTUFNkeFMvYWN4QzJaWlF2bldZODJoZGEzcE1DS2MxUExDc0txcUt5MHMzNTdxZDEyMXlQMjNzeFBiZWtQeXplNVVLSmU5OExGUyszTyt4NzF6elFjdmY5K0pmbld5eXNQVmNaMWxWbGM2YmNYK1JYVEJ4SmY5SUZFd3dXbG9qMC9tUWN1T2N0ZXV2K3YvcEhabXFwcVc3aW15bFpWcC8rendpZ3VLclJSV3c2MnpwMDZXTnZTRWlzb3lIZm5TbG9YdTg1ekJacjNQL2pNZjNUREtNbHJaWjBLODZ3d0w5Yy9ZOVpyeUdnNzY5WVhMQ2NuZTc3WGs0RUFhRlJWbFJYKzNqcEZYaVdxYitCOXZXL2lwVjdGMnRCV3J5bTNWOStZWVE4Lzlyejk3ZDVIN1pZN0hySnJiN3pYcGw1NXE5MTI5eU1OR2p6YTV1ZFl2ellGMXJPa2NJUGdJVFZhOVRkRVFHNUtCQkFBamFxNnN0TGYyNUFxMU81ZXhkcmZxMkE3Rkd4WXVXWXpoY1JPaGJrMm9MVEF1clV1c0lMYzVOV3VSbitGeWVpYVVrWUR5S2JTWFNEYjZET2R1T2tQUEhGcjZ2dXpVZTBNcExaOHI0THRXSlJuQTBzTHJZdDNtNjBVQXJzVmUrK2piYUdWRmVaWjNpYWFwckp4MlJNeUVBQ05xcnFxL2dBaUNwYTVPYTJzdlZmeGJ1WlZ3RDFiNTF0K2xudy9MZlplZCsvV2VUYkFlOTF0Qy9Jc3h3LyttMUt6VnNPWkNTQUFVS2RXcmRLcmRsUUJsK1RuV2o4dkkxSC9RWnU4SE5jc0ZDZDZSMlg1T2RhL3RNQjZlNit6T0Q4dnBhQ3hnU3hzd01sSUFNbldWQnBBNDh2TnovZjMwcU1LV2YwSDNiMXNSQlYxcDRKY2E0USs5M29WZURWbzkrSTg3L1VVV3VmV0JaWWZZUVJWdW9FMURyTHZGUU9OS0xHL1Fac3FzY1N0cWUvZjFGYjcrYlczWk05SjNKSTlKM0ZMOXB6RUxabmN2SEFCSktDZnEvNkVzcUk4bDVYMDlnSks2MXp2Ly9QdmIyaXFOTnQ2V1pBNisvdTJLYlRTZ2p6WDNCWlZLKzluMUZWbWNVVUFBZENvb2dhUWdDcGJOVzhWNStkYXo1SUNmL1JXVG9QMWxSUjVGWHhYTDJncCsrbXFQaGt2Rzhwa2hiOHVBeUdBQUVDZGtnV1FiajI2MmVubm5XN0huMzZjamRsNnRCVVVGUGozcE1abEpXNzBWcjZYRlJSWUw2K0NiNU1YUFN0UkUxbDdMeWlwNzZXM3Q3VXR5UFd5amN3R2pvQUxJTmtWUHpJYlFMSXQvUUxRK0pMMWdSeHcrTSs4SU5MVkJtdyt3TnMvd002ZmVwNXR2K3YyL3IycGMxbUpWOEczOXJLUzdxMEwzTnlMTGtXNVZwVG1raW1hOEtjZ3BNRFIyUXRLNm52UnoyN0lPcTZWQWhNWkNOQjhCSlZHc0cycUQ2Q3g3ODlHeVRLUTdqMjcrM3ZyeWp6ZkN6S1RmcnFuL2Z6WVEvMno2ZFBQVWJiUXZqRGZldnROWEpyUXA0N3ZaTnA1UWFOYlVaNXQ1ay80VXhCU01OTFBpYXB6dDg2MjUrUTlYWUNzU3liK244WkdBQUhRcUpJRmtFVUxONzZBa3lyVUxVWnZZV1BIYjdnZVdSZ3VLSGxaUkFjdm0raFhXbVFEdlNEUm96amZ1bm1iT3VFVk5McDZRYU50WVY3RzE2S2FmTWhrTytPOE0yekgzWGF3WTA4OXhyMm5aRnJsNUdaZEVNbElTV1hyTnlFQWpTOVpBUGxrNWlmKzNvWlVvVTdjYTFmL0tIT1VtYlFweUhWOUd1cUViNGdGRFBQeTh1eVlVNDYybjB3WTUvMzhkWUZCLzg5QlJ4N283cXZOWFZDcUpRWVFBRWhWc2dEeXpPUFB1cldna21sWDFzN2FsTGJ4ajdKRFVYR1JuZmsvdjdSQlF3ZHRsRldvZWE1bjM1NytVYUoxelpUWmhBQUMxS04ybjRQK3dCTzN1TjFmZTZ2OStOcGJzdWNrYnNtZWs3Z2xlMDdpbGt4T2tnQlN2cWJjM256bHJhVFAwZi9UdG4xYi95ZzdISGI4WVZiV29jdy8ycERlNC9JZmx2dEgyWTBBQXFCUkZSUzE5dmMyOU05Ny8ybXpaODNlS0lqb2VGV2pYUjB3T21WTEF3ZlYzVm0rY3ZsS1c3eHdzWCtVM1RMYUI2SnZDZ0JRbjZLU1VuOXZZMys5L0FhYi91aDBXN2xpNWZwNlpmYVgzOWpTeFV2ZGZqWVlzc1ZnTjZzOEdWME44WkVIL3VVZlpUOHlFQUNOcXFpay91YW9aeDkvemk3NjlmL1pmNS8rTy92ZEwvL0gvbnJaajFjdmpEMHZib3o2eVNqL1lHUFBQZkc4elhoN2huK1UvUWdnUUQwUzIvdTE2VnR4NHRiVTkyZWowbGFyclgxQmxiZFgvN1hKMWFsZVdaSDg0bE54bFp1VHU4R2Nsb0IrVjdPL25PMnlxNDJ0dFRLdlBJYTNML2VQc3djQkJFQ2pxbHc2MTZzc0syMTR1d29yek1tK2EyRFVwM3B0dGMzNWRxNS90QzV3cU5ucXFVZWV0dXN2cloxSjFWaHBYcldOOUFMSE1LODhjbHRsWHprUVFBQTBxdkpsNnlZTnRpK3NzVEVkSzJ4QVNZWGx1bXlrR1FRUzd5MW9NTUN5SDVhNXdMRncva0tiZHUydDl2eVR6L3NQa0JvcjhnTG4wTGJsTnFLc3d0cWt0K3hYckJCQUFEU3F0UW1YdEZWZmMvZVN0YlpWcDNMcjA3clNXaldEUUxKb3dTSzc1SGVYMk1YL1BkVXV1K2h5KytLVEwveDdhaXkvMVZvYlZGcGhvenRVV0ljaU5WSDZkL215clZreUoyaExqYkxObVRQSC9iQWVQWG9rdlQvS0JqU2w0RE9ZK0ZsVVgwUncyOVQzQjdTZjdGalBTM3h1N2VOQVF6MC9tYlhWRzEvU05zLzdLdHU3VGJWdDFiSGN1aFZWZVlGazQvOGptMVJWVmR1eXBjdThBdE5SalpkaDFkaUFOaFUyMW50L1hZclhXcktKN3pWZXh1SS9ZYjJnSE9PNlpTUUQwUThDbWlOOXRsVmh4dlUyRzYydHFydGp2Q0RYYkdEYkt1OGIraHBybDZlTzl1d09KRG5lNisvdFpWWmpPNjZ4Ymw3Z3lLMm54bDFiV2U0SGtleEJFeFpRajFRcThhYThEVFlkSjU2THkzRXlOUWxOV0hVcHpqTWJYbFpwbzh2V1dFbHU5blcwZXlWZ1hRdlhCWTdlSmRXVzd3VkdyMWpxVmJQV2U1OTFsRmxjRVVDQWVnU1ZZVnh2czlIYTZ0U0c1bnB2MFZybm00M3NVR0Zqdkl4RUhjOTUrWG5XcVVzbjY5Q3BnLytvT05Idm84YmE1MWZaT0M5d0tKTlNScVgza1lxYW11ektQaVNqQVNSYlA5QkFYZXFydk9OeUcrekg4VGlaK3Bxd2t0R1BVVWFpRVZ0bi91bzRPL04zdjdTei8vY3NPL2EwWTlPK2NtSERxYkUyZWRXMmRhYzFia2h1S2hsSGJXcSs4a3JQUDhvT1pDQkFQWUpLTWE2MzJXaHQxYWFic0pKcFhkYkJ5bnIyY2U5ZDIyYURCOXF2THpySGlsb1grWTlvQ212ZFhJNnhYb1kwc2tPbEd3emd2YlJ3YW1qQ0FwcVZWQ3J4cHJ3Tk5oMG5ub3ZMY1RLcE5tSFZWcmxxcFp0YmthaDFTV3M3NG9URC9hUEdGRXdDckxBdE8xUlkwY2FYOTBoYnRuV2dDd0VFcUVkUUdjYjFOaHVsMjRRVnFLb290emt6M3ZLUGZ0UzVZNmtOYlJkMHRqZTBHbXViWDJWYnRsL2pBa2ViZ3N6OURsd0F5YkxmS1FFRXFFY3FsWGhUM3diN2NUeE9waVprQmlJekhyblhsczMvY2FrUVpTVHZQWFNYZFNpc2NaM3R3N3hBMHJxQkFvbUdGWTlvWDI1YnRLKzAwZ2JwZXNtK0x3UXBCWkExYTliWXlwVXIvYVB3RmkxYVZPZFZ4NEE0Q2lyRnVONW1vNXk4OExXdnZxWC9lOXJWTnYvemo2eGl6V3A3Ky81YmJlbTNYN243dkNLeE1pK1FqTm9na0VRdEl6VlZyY3M0Tkt5NHJaZHg2UDlwQ0xvbWVvUDk4QWFTVWdCNTl0bG43WW9ycnJCWFhubGxvemJJVkt4YXRjb2VldWdodSthYWEreVRUNUpmK3hpSW8xUXE4YWE4RFRZZEo1Nkx5M0V5T2ZuUk9yMnJ5dGZZbTNmZGFFOWQvRnViLzhsTS8reVB2UDkrZlNCUnh0Qm0vWVRFVklQSnVzZTJkWUZENjFVcDQ5QjdXM2R2UThuSnpYZGxsMDFTQ2lBREJ3NjBxcW9xbXo1OXVnc2tMNy84c3ExWXNjSy9kOTIzTktuOWdWSEc4Y1FUVDdqbnZQLysrKzV4L2Z2MzkrOEY0aStvRE9ONm00MXlDeHBuMUpSWFJDNWoyTklMQUNQTHlxMTlmclcvUkVwZDVlYVZxN2RwSHNjbzcvRmJORkxnQ0xUS1ZVOThkZ1dRVnQ2SGNKT2ZRbVVkbDF4eWlXdktrdUREMjZsVEordmJ0NjhWRlJXNTdLU3dzTkRHang5dml4Y3Z0cSsrK3NxV0wxOXVPVGs1N3ZtNjNXeXp6ZXpRUXc5MVB5TU5ML2kzQ09IdHQ5L2UwZDlGQ0dQSGp0Mm8wbzdicldoZjRucWM2TTJyVHJDdm5yclpQMm84ZWlscnFzM21yYzYxNzlma1dXV05YcU0yTFhKWVk1MkxxcXhiY2JVVk5WRkxVcnYrSTIyM0s5NzBNaEh2QmZpQ2NveXJsRElRVmY1YmJybWw1ZnB2TFBoUUxGeTQwTjU5OTExNzlkVlgzYkVDeklzdnZtZ3paODUwd1VPQ0ppLzFmWXdjT2RMdEE5bENmOEQ2dk1mMU5odEZiY0lLeXlzeU55R3hmMm0xamVsWWJzUGFsVnZYb2twM3ErTitiYXJkL1hwY1U4ajF5cVZWc2xVV1l5emxWenRxMUtpa0hlQUtFRUdRMElkYSs4aysyTXBPQmc4ZTdCOEIyYUcreWpzT3Q4R200OFJ6Y1RsT3ByQnRSMyt2NldqQ24vcEpObXRiNVc0alRRRE1GTy8vVjlsbGs1UURTUGZ1M2ExangvUi84Zm9RS1hOSnpHQ0FiQkZVaG5HOXpVWWROaC9uN3lGUjY4NTkvTDNza1ZhK05IcjBhUGZCVFljZVQvTVZzbFVxbFhoVDN3YjdjVHhPcHR1WTNhM1g5Z2Y2UjltaGJiZWUxbnYwMXRaM3ErMHN0d0hXMzJvL1lMU05PKzFHL3loN3BCVkFsRVhvdzVFT1BiNWR1M2JXczJkUC93eVFQWUpLTWE2MzJTZ25OOC9HbjNPM2JYSDRSVjRCcDFVRk5icWkwblkyN3VmSDI0VGp6N1NSK3gxaUkvWSt3SGI2ZjcvMTc4Mk1udHY5ekhiOTg4dVczN3JVUDVNOTB2cnRsWmFXdW1HNCt2Q21TaDN3WVRJWElBNVNxY1NiOGpiWWRKeDRMaTdIZGRGamhoMzhHOXZwRDg5WWJuRm1LODc4NGhKcmxZSG1jbVVkTzUzeUcrczZhSmlyeHdLRnJVc3lGdmlHVDduQXR2MzEzWTAydERuVDBpNEZCWU9nMHp3VitoQXBjd0d5VVZBWnh2VTIyM1Vac1lQdGZkTm4xbVhVUlA5TU5Oc2MvZ3ZiNDV5TGJOSnZwOXI0bzA2eGpnTTI5KzlKajVxcGZuTFlDWlpYVU9pZitWSDVxcFZleFpiK2hPcEV1VVVsdHZQRkw5andRODVmTndNOVM2VWRRSVlPSFpyV0d2eTlldld5c3JJeS93aklMcWxVNGsxOUcrekg4VGdWUmUyNjJJNi9mOXpHblBKWC8wdzRIZm9Nc0U1K3dGREcwTEh2UU50bXlrbGVGdkZiS3loSkw4dnBQWHE4RmRieG5NcnkxZjVlT0YxR1RyUjliLzNHT2crZjRKL0pYbWtIa0x5OFBCcytmTGo3QmVtRHNpbktXSUJzRlZTS2NiMXRMalQvWWJNOWo3UDk3cGhyZWNWdC9iUHA2VGx5NDlGZEtxYzJIVHZiMWxOT1RQbWJ2aDQzZU9jOTNYT1RLUzV0NSsrbGI5d1p0OWlPRno1dUJXM2ErMmV5VzZpR1BNMEpVVE5XWFFVY1VKQVpObXlZZndSa24xUXE4YWE4RFRZZEo1Nkx5M0c2aXNxNjJ1UzdGOWpRZzgvemp0THJONjF2ZEZUYnJqMXMyRzc3K1VmMUsrM2FQV25UMVkvUzc4OHQ3VFhFOXIxamp2V2ZlS1FMbHMxRnFIZlNwMDhmTjdLcVB2b1FEUmt5eEMxekFtU3JvREtNNjIxemxKT1hiMXRNdWNBbTNmaXBGWFZJZmZUbTNKbnYrbnNiVTNsMTdMOVpTcFYzYWVmdTd2SEpWSmF2c1ZkdXZ0dy8yclJXdWZtdW8zeVBhOTYzb3ZaZC9iUE5SNmdBb3NMVnZJNjZDbG4wNFdidUI3SmRmWlYzWEc2RC9UZ2VoNlhudHVrMndQYStaWllObUhTaWY3WitTNzc3MnRiV2M3bUlWSmRMWDdGb3Zuc1BpYlNNL1BkZmZXNVBYL0xmdG1MaEF2OXMvVXA3RDdWSmYvM0Vobm5aVkU1ZVhxVHlpS3ZRdVpTQ1ErMUNUcVRNUTRzbkF0a3NxQlRqZXR1YzZUM21ldG5JMkpPdnRZbFh2R0d0dTlXL2tuZmxxaFgyOW4zVDZpeVh2TUpDeTBtaEgrU0hPZC9ZZHpQZXN1cXFTdmV6bHN6NTFwNjU4dmYyK3UxLzhRS1Vsb2F2bjdLT1FmdWY3bVVkNzNsQnNKOTdIODFWU3F2eDF1WEdHMiswdVhOL3ZEcFlRRXVXakJzM3p2YllZdy8vVENTc3hoc0JxL0ZHRS9mVmVBTTZsdUJjWEk0enFXWnR0YjEzOHpuMitiK3VNYTkyOTg5dXJQdXdVVFo4ejhsdUVtQ2lsWXNYMmd2WFhXeHJxellkQkVUTHErY1hGbG1GRjVoUzFXN0FLTnY2N0R1c25aZDlCR1VSUlNaK1JrT0sxSnN6WnN3WWYyOURXcnFFdVI5b0R2UUhyTW93cnJjdGlacWdSaDMzWjV0NDZXdld0dDhXL3RtTi9lZWo5Mno2RmIrM0wxNSsxcW9yMTEwK1YwMWJzLzc5WE1yQlEycThJSlZxOE5BS3d5T08vcFB0ZnVWYjFyN1BNUGY3YVFraVpTRGw1ZVUyZGVyVWpTWVdkdWpRd1U0OTlWVC9LREl5a0FqSVFLTGhlaUNaT2M0ME5TVjk5dEFWTnVPMjg3eUR1b05DYmtHaHRlM2V5OHFYLzJDcnZBeWtJWFFjdHAxdGZlWnQxbVlUVFd4aEJPVVlWNUV5RUMzUnJvbUZpVzlTKzNWbEprQzIwZWRabFdCY2Ixc3FyYWMxK0wvT3NrazNmR3hsbTQzMXoyNnN1cUxjbHN5ZTFTREJROWQyMythY3UyeVhpNTl2a09DUkRTSUZFS205d0tMMlI0d1k0UjhCMlMxWnBSMm4yMkRUY2VLNXVCdzNKUDAvcGQwRzJLNlgvdHUyT2ZjZTEzbmRXSHB0ZjVEdCs3ZTUxbWVIZzczWEVia2F6VnFSMzdsR1dpWE85Umd3WUlDMWJSdHVKaWtRTjBGbEdOZGJyTXRHK2t3NDBQYS9hNEgxMmVrdzcwekROZnZrRlpmYXhDdmZzdkZlNWxIWWhpV2FJZ2NRelRiWHpIUjlvTFV4OXdQTlNTcVZlRlBmQnZ0eFBHNU1CU1Z0Ylp1emI3YzkvakxUOGtzNytHY3pRODFWWTA2NXppYmYvYjExR01qcTRvR001RjdCbkJBRkU4MCtCNXFMb0ZLTTZ5MDIxcTdQVU52L3puazIrSUJmdTRvL0VxK2MydzhjYS92ZnZkQUc3bkc4bXlXUEgyVWtnSFRyMXMyNmR1M3ErajdTV2FrWGlMdFVLdkdtdkEwMkhTZWVpOHR4VTlHRXdaRkgvY0gyOHdKSngyRVRYQ0JJbHk0eHU4c2xMOXR1Vjd5Kzdob2pJWDVHY3hkcEdHOGlEZW5WU3IwTmNOMXpodkZHd0REZWFMYmFhcXYxRldOY2IwWDdFcmZqdUpqMzNqUDI5alVuMmNwNVgvcG42cGJYdXExYnYycnpmVS94M2svVGRwQUg1UmxYR1NzZERlbHRnT0FCTkNsVmhQb2pqdk50c0IvSDQ3am9ObXBYbTNUOVIxNWcrTDNsRnJYeHo5Yml2ZDUrRTQrMi9mODJ6d2J2ZDVwMzJMVEJJeHRRUWtBOWdrb3hycmRJbmZvdmhoOXlucnZteUtEOXovRFByclBaM2lmYjVIc1cyVS9PdU1sTlBrUnFNdGFFMVlCb3dvcUFKcXhvV0FzcjJuR2NWYTVlYm5OZS9hZjFtbkNBNWNYMG11UkJlY1lWR1FoUUQvMEJxektNNnkzQ3l5OHV0WDY3VElsdDhNZ0dDbSt4L2hURy9ZOUVmOGh4UnZsRlEvbEZRL2xGRS9meUl3TUJBSVJDQUFHQUZrRFp6SW9WSzl4V240cUtDbHU2ZEtsVnBiRDBQVTFZRVpFQ1IwUDVSVVA1UmRPY3l1L3h4eCszTjk1NHd6cDM3bXdubjN5eWYzYWRqejc2eUo1ODhrbGJ0bXlaTzlZbE4vYlpaeC9yMy8vSFZZUlhyVnBsLy9yWHYreVRUejV4LzYrbVpXaVpxa21USnRVNVJZTU1CQUN5M0gvKzh4OTc4ODAzcmF5c3pHVVFpV2JQbm0wUFBQQ0E5ZTNiMTA0ODhVUTcvUEREM2FUdnUrKysyMzc0NFFmL1VXYjMzWGVmZSt5QkJ4NW9KNTEwa2syWU1FR2pPRzM2OU9uK0l6WVdPWUFvTW5YczJOSDY5T25qTnIwQkFFRGpVTGJ3NktPUDJyQmh3NnhYcjE3KzJSKzkrT0tMMXE1ZE81czhlYkpiZGtvcnB2LzBweisxeXNwS2UrZWRkOXhqdnY3NmF4YzhkdDk5ZDNlTkp5MU50ZE5PTzltZ1FZUHNyYmZlcXJNNUszUUFVZXBYVWxKaVcyeXhoWjF6empsMnp6MzMySjEzM21tbm5IS0tTNC9pbmhvQ1FIUHcvdnZ2MjRJRkMxemxYNXV1RnF2Z01IRGdRTGZZYlVDQlJKZmQrTzY3Nzl6eGwxK3VXK0pGQVNQUjVwdHY3b0tIZm40eW9RS0kwcDhlUFhxNGlIYkREVGU0dEVqUjdJTVBQbkFaeUhISEhlY2lIZ0NnNFdnTlFqVXg3YkRERGttdnc2UU9jd1VSdFJMVnBycDY1Y3FWYmw5OUk4WEZ4ZGE2ZFd0M0hBaGFsT3JxZUU4cmdDaUM2VVhxa3JYbm4zKytYWEhGRmE3RFJtMXB6ejMzbk0yZlA5KzlFTDJwNnVwcS8xa0FnSWFnZWxmckVJNGZQOTQvczZFZ1FPZ3h0ZW1jT3M1Rmo2dnJNYko2OVdwM1cxdktBVVRCUTJuUGxDbFRiTnEwYVhid3dRZmJ1KysrNjVxdEZEZ1M2VVVwaUFBQUdzYjMzMy92T3M3MzNIUFBUUzVrcXl3a21jVG4xZmVsUC9Jb0xHVWVSeDU1cEYxNDRZVXVtTngyMjIzMjczLy8yLzJuNnNSWnMyYU4vOGgxblRycEREOERBS1JIdzNMVjJkMm1UUnMzQ2t1Yk1nWFZ5ZHBYblJ3MFNTWFd6d0dkVXorMnFQbXFyc2RJOExqYVVnNGd1bENVcm4vKzRZY2YycjMzM3J0KytOZWlSWXRjRTViT0F3QWF4N3g1ODF5Z1VEOTBzSDN4eFJldXYwTDdyNzMybWdzZ0d0QzBjT0ZDLzFucjZBdSt6clZ2Mzk0ZEt3aXBIenVZSnhKUS9TNTE5V21uSEVBVWlUUkpaY2FNR2U1WVRWUlBQLzIwL2VVdmY3SGx5NWZidHR0dTY4NERBQnFlNW1xY2R0cHBHMnlEQncrMjB0SlN0Njk1SFBuNStkYXpaMDhYV0JLSDRzNmFOY3QxTldpVWxXaU9pSHo2NmFmdVZoUmtWTjkzNnRUSmpheE5KdVVBb3Npa29icWEwZmp0dDkrNndQSEtLNis0VHBiamp6L2VaU2NBZ01haHJFR2pwQkkzdFJTcGkwSDdHaTByMjIrL3Zlc2tEMXFLWG4vOWRYdnd3UWRkbjdhbVlZZ0NpWTQxb3V2VlYxOTFqOVBFd3JsejU5ckVpUlBkWTVMUlpJMlVPeXVVQ2dXcFR0QkpydUZoRjExMGtYWHYzdDExcW92R0ZxdVBSSStMS3U1OUtjMXBLWVNtUVBsRlEvbEYwOXpLVHdGQWxmNFJSeHpobjFsSFV5eGVldWtsMXlSVlZGVGtBb1lDUStLd1hUVjlQZlhVVXk1YlVkM2RwVXNYRjN5R0RCbmlQMkpqYVFXUVpQU2ZxR05kMFlzQUVqK1VYelNVWHpTVVh6UnhMNytVbTdBQUFFaEVBQUdBWms3TlVwZGZmcm5yZWxCV2M4c3R0MlJrNUN3QkJBQ2FPUTF5VWovMTg4OC83eFpRVkVlN0ZsK01pZ0FDQUMzQVhudnRaZSs5OTU1Yi9tUy8vZmJMU1A4UEFRUUFXZ0FOOGRXbW1lckJFTitvQ0NBQTBBSm9pTzZJRVNOczVNaVI3dXFGbVVBQUFZQm1UdGNFMGV4ekxmdSs4ODQ3dTZrV3VuUnRWQVFRQUdqbXRCanVVVWNkNVpxd3RIckkwVWNmN1M3RkVSVUJCQUNhQWZWdExGbXlaUDAxUGhKcExTdk5PdGN5Vk5xMFhsYXlpMHlKbG9uLzZxdXZiUEhpeGY2WnVxa2JQdEpVUjJhaU01TTFDc292R3Nvdm11WlVmbG9sWGMxU1dnZExpeWttMHFVM05Qb3FXRkJSbWNnKysremora1FDQ2hqMzMzKy9XK1Uzb0V2aEhuamdnVWt2TmlWa0lBQ1E1VFJSVUN2cDZndDk3YUNqQlhDMWN2bzIyMnhqNTU1N3JwMTY2cW51a3VRUFBmVFErbVhlZGNFcExaWmJVVkhoTGxIK205Lzh4bDJ5WE5kS2YrS0pKOXhqa2trN2dHZ0NTckRwS2xXNnJTdUtiK3ArQUVBMGFycFNKVDl1M0RnWFFHcFQ5cUgramwxMjJjVmxFbXJPMm5mZmZWM1FDRnFOUHYvOGM5ZDB0ZnZ1dTd2V0pHVW9HcTJseVlaYTBsMkJKWm1VQTRnQ2dkYUZIelZxMUFhYmxnTk8xcGFtSzFnTkh6N2N2UWlsUVhvK0FDQ3pkT0VvWFlsUW82dHFVNVBWbkRselhCMmMrRVZlUVVRWGs5SUZxV1QyN05udS9uNzkrcm5qd0lBQkExeWdVWEJKSnVWYVhiMzR4eDU3ckV1RkhudnNzZlhiWFhmZFpUdnV1S09MZ2dGTlVoazZkS2pkZnZ2dDlzZ2pqN2lyWTJrcVBVRUVBREpIMTJsNjRZVVgzTkxzV3FhOU5pM1JMc0dWQnhQcG5LNFRJbnFjT3RscjkzVUVWeUlNSGxkYldobUlzb3IzMzMvZnJyLytlcmRkZDkxMTdzSlMxMXh6emZvckZZcFNvRDMyMk1PMXNkMTAwMDMyNG9zdjJwUXBVMXpQUHdBZ00vU0ZYczFXYWcxS0pxajRrM1dDNjJxRnlseEVqMU96VlczQjg0TEgxWlp5QUZHRVVzYng4Y2NmKzJmU296UW91QWdWQUNDYWI3NzV4cTJvTzJuU3BBMmFweElGclQ2Smw3TU5xTE5kUVVUMHVMb2VJOEhqYWtzNWdLZ1RSUjB1RHp6d2dDMVlzTUJtenB6cGpsUGROSVJNMTFVSEFFU25wVW02ZHUxcVAvendneHRwcFUzN3FxdTF2M1RwMHZWWEhFeFc5eXFyVUt1U0ZCY1hKMzFNTUtkRVY2Sk5SbUVycllIYVNuUFUxcFp1TnFFTUpNeThFTWFSUjBQNVJVUDVSVVA1UlZOZitWMTIyV1cyZlBseS8yaGp1KzY2cXh1Nis4Yy8vdEgxU1I5d3dBSCtQZXZxNDZsVHA3ckwxV3E0cmk2Ris4b3JyN2o1STVwSEV0QmxjSjk5OWxrNzg4d3prM1pCcEIxQUdoc2Z3R2dvdjJnb3YyZ292MmpTTGIrLy8vM3ZiaUwzNmFlZjdwOHhONmxia3dOMUx1aG9WNS8xZ3c4K2FJY2Njb2dOSGp6WXpUelhvQ2NGblFrVEpyakhhR0NVK3JpVm5SeDMzSEh1WEcwTWl3S0Faa3p6UDlTc05XM2FOSmRsYUNYZWh4OSsyQTN0M1h6enpkMWpOSHkzZi8vK3JxdEI5Ny84OHN0Mjg4MDN1eVl4RFlpcUN4bElSSHdEaklieWk0YnlpNmE1bGQrcnI3N3E1bXpvZ2xHSjFPR3VDWVdMRmkxeVdZZ0N4N2JiYnVzbWV3ZlV4YUFtSzYzYXEzMk43dHB1dSszY2xRenJRZ0NKaUQvZ2FDaS9hQ2kvYUNpL2FHakNBZ0NFUWdBQkFJUmc5djhCNGhNT3BJK1hsdHNBQUFBQVNVVk9SSzVDWUlJPVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldE5vcm1hbCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQUlBQUFDUWQxUGVBQUFGRG1sVVdIUllUVXc2WTI5dExtRmtiMkpsTG5odGNBQUFBQUFBUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRLUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpV0UxUUlFTnZjbVVnTlM0MUxqQWlQZ29nUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0S0lDQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJZ29nSUNBZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJZ29nSUNBZ2VHMXNibk02Y0dodmRHOXphRzl3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzQm9iM1J2YzJodmNDOHhMakF2SWdvZ0lDQWdlRzFzYm5NNlpYaHBaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5bGVHbG1MekV1TUM4aUNpQWdJQ0I0Yld4dWN6cDBhV1ptUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzUnBabVl2TVM0d0x5SUtJQ0FnSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWdvZ0lDQWdlRzFzYm5NNmMzUkZkblE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVVYyWlc1MEl5SUtJQ0FnZUcxd09rTnlaV0YwWlVSaGRHVTlJakl3TWpNdE1EVXRNRFpVTWpJNk1qZzZNRFlyTURJd01DSUtJQ0FnZUcxd09rMXZaR2xtZVVSaGRHVTlJakl3TWpNdE1EVXRNRFpVTWpJNk16QTZNakVyTURJNk1EQWlDaUFnSUhodGNEcE5aWFJoWkdGMFlVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNekE2TWpFck1ESTZNREFpQ2lBZ0lIQm9iM1J2YzJodmNEcEVZWFJsUTNKbFlYUmxaRDBpTWpBeU15MHdOUzB3TmxReU1qb3lPRG93Tmlzd01qQXdJZ29nSUNCd2FHOTBiM05vYjNBNlEyOXNiM0pOYjJSbFBTSXpJZ29nSUNCd2FHOTBiM05vYjNBNlNVTkRVSEp2Wm1sc1pUMGljMUpIUWlCSlJVTTJNVGsyTmkweUxqRWlDaUFnSUdWNGFXWTZVR2w0Wld4WVJHbHRaVzV6YVc5dVBTSXhJZ29nSUNCbGVHbG1PbEJwZUdWc1dVUnBiV1Z1YzJsdmJqMGlNU0lLSUNBZ1pYaHBaanBEYjJ4dmNsTndZV05sUFNJeElnb2dJQ0IwYVdabU9rbHRZV2RsVjJsa2RHZzlJakVpQ2lBZ0lIUnBabVk2U1cxaFoyVk1aVzVuZEdnOUlqRWlDaUFnSUhScFptWTZVbVZ6YjJ4MWRHbHZibFZ1YVhROUlqSWlDaUFnSUhScFptWTZXRkpsYzI5c2RYUnBiMjQ5SWpjeUx6RWlDaUFnSUhScFptWTZXVkpsYzI5c2RYUnBiMjQ5SWpjeUx6RWlQZ29nSUNBOGVHMXdUVTA2U0dsemRHOXllVDRLSUNBZ0lEeHlaR1k2VTJWeFBnb2dJQ0FnSUR4eVpHWTZiR2tLSUNBZ0lDQWdjM1JGZG5RNllXTjBhVzl1UFNKd2NtOWtkV05sWkNJS0lDQWdJQ0FnYzNSRmRuUTZjMjltZEhkaGNtVkJaMlZ1ZEQwaVFXWm1hVzVwZEhrZ1VHaHZkRzhnTWlBeUxqQXVOQ0lLSUNBZ0lDQWdjM1JGZG5RNmQyaGxiajBpTWpBeU15MHdOUzB3TmxReU1qb3pNRG95TVNzd01qb3dNQ0l2UGdvZ0lDQWdQQzl5WkdZNlUyVnhQZ29nSUNBOEwzaHRjRTFOT2tocGMzUnZjbmsrQ2lBZ1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0NpQThMM0prWmpwU1JFWStDand2ZURwNGJYQnRaWFJoUGdvOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4KzBJZ1Z4QUFBQVlCcFEwTlFjMUpIUWlCSlJVTTJNVGsyTmkweUxqRUFBQ2lSZFpIUEswUlJGTWMvTTM3bVI2TllLQll2RGF1aFFZbU54Y2l2d21LTU10ak12UG1sNW8zWGUyL1NaS3RzRlNVMmZpMzRDOWdxYTZXSWxHeFpFeHYwbk9lcGtjeTVuWHMrOTN2dk9kMTdMbmdqV1ZVenk0T2c1U3dqUEJwU1pxTnpTdFVqRlZUU1JBdSttR3JxazlNakVVcmEydzBlSjE1MU9yVktuL3ZYYWhOSlV3VlB0ZkNncWh1VzhKand4TEtsTzd3cDNLUm1ZZ25oWStHQUlSY1V2bmIwdU10UERxZGQvbkRZaUlTSHdOc2dyS1IvY2Z3WHF4bERFNWFYNDlleWVmWG5QczVMNnBLNW1XbUpiZUt0bUlRWkpZVENPTU1NMFVjM0F6TDMwVWtQWGJLaVJIN3dPMytLSmNsVlpkWXBZTEJJbWd3V0FWSHpVajBwTVNWNlVrYVdndFAvdjMwMVU3MDlidlc2RUZRODJQWkxPMVJ0d09lNmJiL3YyL2JuQVpUZHcxbXVtTCswQi8ydm9xOFhOZjh1K0ZiaDVMeW94YmZnZEEyYTcvU1lFZnVXeXNTOXFSUThIMEY5RkJvdm9XYmU3ZG5QUG9lM0VGbVJyN3FBN1Izb2tQTytoUzgyNFdmUWd4R0NjZ0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFBeEpSRUZVQ0psamFHajREd0FEZ3dJQVZialdQd0FBQUFCSlJVNUVya0pnZ2c9PVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFRvb24oKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFQOEFBQUFCQ0FZQUFBQVJrSGlqQUFBQmhHbERRMUJKUTBNZ2NISnZabWxzWlFBQUtKRjlrVDFJdzBBY3hWL1RTb3RVQk8wZzRwQ2hPdGxGUlJ4TEZZdGdvYlFWV25Vd3VmUUxtalFrS1M2T2dtdkJ3WS9GcW9PTHM2NE9yb0lnK0FIaTdPQ2s2Q0lsL2k4cHRJang0TGdmNys0OTd0NEJRcXZHVkRNUUIxVE5NakxKaEpndnJJckJWd1FSUUJnaERFbk0xRlBaeFJ3OHg5YzlmSHk5aS9FczczTi9qZ0dsYURMQUp4TEhtVzVZeEJ2RXM1dVd6bm1mT01JcWtrSjhUanhwMEFXSkg3a3V1L3pHdWV5d3dETWpSaTR6VHh3aEZzczlMUGN3cXhncThReHhWRkUxeWhmeUxpdWN0emlydFFicjNKTy9NRnpVVnJKY3B6bUdKSmFRUWhvaVpEUlFSUTBXWXJScXBKakkwSDdDd3ovcStOUGtrc2xWQlNQSEF1cFFJVGwrOEQvNDNhMVptcDV5azhJSm9PL0Z0ai9HZ2VBdTBHN2E5dmV4YmJkUEFQOHpjS1YxL2ZVV01QZEplck9yUlkrQXdXM2c0cnFyeVh2QTVRNHc4cVJMaHVSSWZwcENxUVM4bjlFM0ZZRGhXNkIvemUydHM0L1RCeUJIWFMzZkFBZUh3RVNac3RjOTNoM3E3ZTNmTTUzK2ZnQTRPWEtQdC83Sy9nQUFBQVppUzBkRUFQOEFBQUFBTXlkODh3QUFBQWx3U0ZsekFBQXVJd0FBTGlNQmVLVS9kZ0FBQUFkMFNVMUZCK2dIQkF3ZEoxajlXQnNBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQVZVbEVRVlFvejJOa1lHRDR6ekFLaGg1Z1pXQmc0R0JnWU9CRW8yRnNLSitYazRGQmlwT0JRWm9EUWt0eE1qQ0lzREV3U0hGQU1SZUU1c1ZtRGhjV08xZ1lHQmdZR01sSU52ajBNSTd3WkVpcy82a2JoZ0MwNFFqL3c3L0haZ0FBQUFCSlJVNUVya0pnZ2c9PVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25MaWdodCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0Nzdmcgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgaWQ9J0xpZ2h0JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDc3R5bGUlM0UgLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NyZWN0IGNsYXNzPSdzJyB4PScwLjE3MDM5MjkzJyB5PScxMC4wMDI0NDgnIHdpZHRoPSczLjkwMDA1NjgnIGhlaWdodD0nMC45MDAwOTkzNCcgaWQ9J05ORScgdHJhbnNmb3JtPSdyb3RhdGUoLTY3LjUpJyAvJTNFJTNDcmVjdCB4PSc4LjgyOTUwNzgnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDU2OCcgaGVpZ2h0PScwLjkwMDA5OTM0JyBpZD0nRU5FJyB0cmFuc2Zvcm09J3JvdGF0ZSgtMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScxNC45NTI0NjknIHk9JzMuODc5NTcxNycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nRVNFJyB0cmFuc2Zvcm09J3JvdGF0ZSgyMi41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9JzE0Ljk1MjQ3JyB5PSctNC43Nzk1NDI5JyB3aWR0aD0nMy45MDAwMTM5JyBoZWlnaHQ9JzAuOTAwMDk5ODcnIGlkPSdTU0UnIHRyYW5zZm9ybT0ncm90YXRlKDY3LjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nLTEyLjcyOTU2NScgeT0nMTAuMDAyNDQ3JyB3aWR0aD0nMy45MDAwMTM5JyBoZWlnaHQ9JzAuOTAwMDk5ODcnIGlkPSdTU1cnIHRyYW5zZm9ybT0ncm90YXRlKC02Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9Jy00LjA3MDQ0OTgnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nV1NXJyB0cmFuc2Zvcm09J3JvdGF0ZSgtMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScyLjA1MjQ2ODUnIHk9JzMuODc5NTcxNycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nV05XJyB0cmFuc2Zvcm09J3JvdGF0ZSgyMi41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9JzIuMDUyNDY4NScgeT0nLTQuNzc5NTQyOScgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nTk5XJyB0cmFuc2Zvcm09J3JvdGF0ZSg2Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NlbGxpcHNlIGlkPSdDRU5URVInIGN4PSc4LjAwMDA4MicgY3k9JzguMDAwMjU3NScgcng9JzMuNDUwMDgyMycgcnk9JzMuNDUwMjU3MycgY2xhc3M9J3MnIC8lM0UlM0Mvc3ZnJTNFXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWNvbkNhbWVyYSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0NzdmcgaWQ9J0NhbWVyYScgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlIGlkPSdzdHlsZTEnJTNFLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdNIDEzLjg1NzMyMiw4Ljg3NTUyOTcgSCAxMi40MTM0MjQgTCAxMi40MTMsNi43ODcgaCAtMS40MjUzMTEgYyAwLjIyNzAyNiwtMC40NDk0NjkzIDAuMzYzMjQzLC0wLjk0NTM5MTkgMC4zNjMyNDMsLTEuNDg4NTAwOCAwLC0xLjc5Nzg3NzUgLTEuNDA3NTcyNywtMy4yNDkyODkzIC0zLjE1MTE0NjYsLTMuMjQ5Mjg5MyAtMS43NDM1NzQ2LDAgLTMuMTUxMTQ3OSwxLjQ1MTQxMTggLTMuMTUxMTQ3OSwzLjI0OTI4OTMgdiAwLjAyODA5MyBDIDQuNTc2NDE5NCw1LjAzNjMxMTggNC4wMzE1NTI0LDQuODU4Mzk2OCAzLjQ1MDM2MDYsNC44NTgzOTY4IDEuNzA2Nzg2Myw0Ljg2Nzc1NjcgMC4yOTkyMTI5OCw2LjMxOTE3MjMgMC4yOTkyMTI5OCw4LjEwNzY4NiBjIDAsMS43ODg1MTM1IDEuNjY1Mzg1ODIsMy4zMTE3ODkgMy40MjQ1ODUxMiwzLjI0OTI4OSBMIDMuNzMyLDEzLjk3NiBoIDguNjgxIHYgLTIuMTEzMzY4IGggMS40NDQzMjIgeicgaWQ9J3BhdGgxJyAvJTNFJTNDcmVjdCBjbGFzcz0ncycgeD0nMTIuODAzOTEnIHk9JzguMzk3OTY4Mycgd2lkdGg9JzIuODk2ODc2NicgaGVpZ2h0PSczLjg4NjAzNzYnIHJ4PScwJyByeT0nMCcgaWQ9J3JlY3QxJyAvJTNFJTNDL3N2ZyUzRSUwQVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25BdWRpbygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0NzdmcgaWQ9J0F1ZGlvJyB2aWV3Qm94PScwIDAgMTYgMTYnIHZlcnNpb249JzEuMScgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDc3R5bGUlM0UucyU3QmZpbGw6JTIzZmZmO3N0cm9rZTolMjMwMDA7c3Ryb2tlLXdpZHRoOi4xcHg7JTdEICUzQy9zdHlsZSUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J00gOS4xNTYzNTg4LDEuMDgwNDAwNiAzLjY3MjkzNDEsNC42NDIwMTcgSCAwLjU0MzY0OTcxIHYgNi43ODQwMzEgSCAzLjc1OTA2MTIgbCA1LjM5NzI5NzYsMy40OTM3NzYgeicgaWQ9J3BhdGgxJyAvJTNFJTNDcGF0aCBjbGFzcz0ncycgZD0nbSAxMy4zNDc1MTgsMTMuNjc2NjQ1IC0wLjc2NTE1NywtMC41NjM1NjYgYyA0LjIyNzQ4NSwtNS41NjA1MjQxIDAuMjEwNDE4LC05Ljg4MTIwMiAwLjAzODI1LC0xMC4wNTk2NjQ4IGwgMC42OTgyMDQsLTAuNjQ4MTAxOSBjIDAuMDQ3ODIsMC4wNDY5NjQgNC43NTM1Myw1LjA2MjcwNzYgMC4wMzgyNSwxMS4yNzEzMzI3IHonIGlkPSdwYXRoMicgLyUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J20gMTEuMzIxODY4LDExLjc5ODA5IC0wLjgyMjU0MSwtMC40NzkwMzIgYyAyLjE0MjQzNCwtMy41Nzg2NDc0IDAuMTE0NzczLC02LjM1ODkxIDAuMDI4NjksLTYuNDcxNjIzMiBsIDAuNzY1MTU2LC0wLjU2MzU2NjYgYyAwLjEwNTIwOCwwLjE0MDg5MTUgMi41MDU4ODMsMy4zODE0MDAxIDAuMDI4NjksNy41MDQ4Mjk4IHonIGlkPSdwYXRoMycgLyUzRSUzQy9zdmclM0UlMEFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBnZXRJY29uUGFydGljbGVzKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgIHJldHVybiBcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnJTNGJTNFJTNDc3ZnIGlkPSdQYXJ0aWtlbF9WMicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTYuMjggMTYuNTInJTNFJTNDZGVmcyUzRSUzQ3N0eWxlJTNFLmNscy0xJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2UtbWl0ZXJsaW1pdDoxNS4xMjtzdHJva2Utd2lkdGg6LjI1cHg7JTdEJTNDL3N0eWxlJTNFJTNDL2RlZnMlM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nNC43MicgY3k9JzUuNDcnIHI9JzIuNTInLyUzRSUzQ2NpcmNsZSBjbGFzcz0nY2xzLTEnIGN4PScxMS4yNicgY3k9JzguMjgnIHI9JzEuNzUnLyUzRSUzQ2NpcmNsZSBjbGFzcz0nY2xzLTEnIGN4PSc1Ljk1JyBjeT0nMTIuMDUnIHI9JzEuMjknLyUzRSUzQy9zdmclM0VcIjtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCIvLyAvPHJlZmVyZW5jZSBwYXRoPVwiLi4vRXZlbnQvRXZlbnQudHNcIi8+XHJcbi8vIC88cmVmZXJlbmNlIHBhdGg9XCIuLi9UaW1lL1RpbWUudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIG1vZGUgYSBsb29wIHJ1bnMgaW5cclxuICAgKi9cclxuICBleHBvcnQgZW51bSBMT09QX01PREUge1xyXG4gICAgLyoqIExvb3AgY3ljbGVzIGNvbnRyb2xsZWQgYnkgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAqL1xyXG4gICAgRlJBTUVfUkVRVUVTVCA9IFwiZnJhbWVSZXF1ZXN0XCIsXHJcbiAgICAvKiogTG9vcCBjeWNsZXMgY29udHJvbGxlZCBieSB4clNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lICovXHJcbiAgICBGUkFNRV9SRVFVRVNUX1hSID0gXCJmcmFtZVJlcXVlc3RYUlwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIHdpdGggdGhlIGdpdmVuIGZyYW1lcmF0ZSBpbiB7QGxpbmsgVGltZS5nYW1lfSAqL1xyXG4gICAgVElNRV9HQU1FID0gXCJ0aW1lR2FtZVwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIHdpdGggdGhlIGdpdmVuIGZyYW1lcmF0ZSBpbiByZWFsdGltZSwgaW5kZXBlbmRlbnQgb2Yge0BsaW5rIFRpbWUuZ2FtZX0gKi9cclxuICAgIFRJTUVfUkVBTCA9IFwidGltZVJlYWxcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29yZSBsb29wIG9mIGEgRlVER0UgYXBwbGljYXRpb24uIEluaXRpYWxpemVzIGF1dG9tYXRpY2FsbHkgYW5kIG11c3QgYmUgc3RhcnRlZCBleHBsaWNpdGx5LlxyXG4gICAqIEl0IHRoZW4gZmlyZXMge0BsaW5rIEVWRU5ULkxPT1BfRlJBTUV9IHRvIGFsbCBhZGRlZCBsaXN0ZW5lcnMgYXQgZWFjaCBmcmFtZVxyXG4gICAqIFxyXG4gICAqIEBhdXRob3IgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTG9vcCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZVN0YXJ0R2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZVN0YXJ0UmVhbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lR2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lUmVhbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lU3RhcnRHYW1lOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lRnJhbWVTdGFydFJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVMYXN0RnJhbWVHYW1lQXZnOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZzogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSRnJhbWVzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbW9kZTogTE9PUF9NT0RFID0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZEludGVydmFsbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGlkUmVxdWVzdDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGZwc0Rlc2lyZWQ6IG51bWJlciA9IDMwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZnJhbWVzVG9BdmVyYWdlOiBudW1iZXIgPSAzMDtcclxuICAgIHByaXZhdGUgc3RhdGljIHN5bmNXaXRoQW5pbWF0aW9uRnJhbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIHRoZSBsb29wIHdhcyBzdGFydGVkLCBvdmVyd3JpdHRlbiBhdCBlYWNoIHN0YXJ0ICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lU3RhcnRHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZVN0YXJ0R2FtZTsgfVxyXG4gICAgLyoqIFRoZSByZWFsdGltZSB0aGUgbG9vcCB3YXMgc3RhcnRlZCwgb3ZlcndyaXR0ZW4gYXQgZWFjaCBzdGFydCAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZVN0YXJ0UmVhbCgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVTdGFydFJlYWw7IH1cclxuICAgIC8qKiBUaGUgZ2FtZXRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBsb29wIGN5Y2xlICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lR2FtZTsgfVxyXG4gICAgLyoqIFRoZSByZWFsdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGxvb3AgY3ljbGUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVGcmFtZVJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVSZWFsOyB9XHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIHRoZSBsYXN0IGxvb3AgY3ljbGUgc3RhcnRlZCovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVTdGFydEdhbWUoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgdGhlIGxhc3QgbG9vcCBjeWNsZSBzdGFydGVkKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVGcmFtZVN0YXJ0UmVhbCgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVGcmFtZVN0YXJ0UmVhbDsgfVxyXG4gICAgLyoqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgcGVyIHNlY29uZCBpbiBnYW1ldGltZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgZnBzR2FtZUF2ZXJhZ2UoKTogbnVtYmVyIHsgcmV0dXJuIDEwMDAgLyBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmc7IH1cclxuICAgIC8qKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgaW4gcmVhbHRpbWUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZwc1JlYWxBdmVyYWdlKCk6IG51bWJlciB7IHJldHVybiAxMDAwIC8gTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnOyB9XHJcbiAgICAvKiogVGhlIG51bWJlciBvZiBmcmFtZXMgdHJpZ2dlcmVkIHNvIGZhciAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgZnJhbWVzKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSRnJhbWVzOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIGxvb3Agd2l0aCB0aGUgZ2l2ZW4gbW9kZSBhbmQgZnBzLiAgXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBmb3IgX21vZGUgaXMgRlJBTUVfUkVRVUVTVCwgc2VlIHtAbGluayBMT09QX01PREV9LCBob29raW5nIHRoZSBsb29wIHRvIHRoZSBicm93c2VyJ3MgYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICogSXMgb25seSBhcHBsaWNhYmxlIGluIFRJTUUtbW9kZXMuXHJcbiAgICAgKiBfc3luY1dpdGhBbmltYXRpb25GcmFtZSBpcyBleHBlcmltZW50YWwgYW5kIG9ubHkgYXBwbGljYWJsZSBpbiBUSU1FLW1vZGVzLCBkZWZlcnJpbmcgdGhlIGxvb3AtY3ljbGUgdW50aWwgdGhlIG5leHQgcG9zc2libGUgYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0YXJ0KF9tb2RlOiBMT09QX01PREUgPSBMT09QX01PREUuRlJBTUVfUkVRVUVTVCwgX2ZwczogbnVtYmVyID0gNjAsIF9zeW5jV2l0aEFuaW1hdGlvbkZyYW1lOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgTG9vcC5zdG9wKCk7XHJcblxyXG4gICAgICBMb29wLsaSVGltZVN0YXJ0R2FtZSA9IFRpbWUuZ2FtZS5nZXQoKTtcclxuICAgICAgTG9vcC7GklRpbWVTdGFydFJlYWwgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZSA9IExvb3AuxpJUaW1lU3RhcnRHYW1lO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsID0gTG9vcC7GklRpbWVTdGFydFJlYWw7XHJcbiAgICAgIExvb3AuZnBzRGVzaXJlZCA9IChfbW9kZSA9PSBMT09QX01PREUuRlJBTUVfUkVRVUVTVCkgPyA2MCA6IF9mcHM7XHJcbiAgICAgIExvb3AuZnJhbWVzVG9BdmVyYWdlID0gTG9vcC5mcHNEZXNpcmVkO1xyXG4gICAgICBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgPSBMb29wLsaSVGltZUxhc3RGcmFtZVJlYWxBdmcgPSAxMDAwIC8gTG9vcC5mcHNEZXNpcmVkO1xyXG4gICAgICBMb29wLm1vZGUgPSBfbW9kZTtcclxuICAgICAgTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lID0gX3N5bmNXaXRoQW5pbWF0aW9uRnJhbWU7XHJcblxyXG4gICAgICBsZXQgbG9nOiBzdHJpbmcgPSBgTG9vcCBzdGFydGluZyBpbiBtb2RlICR7TG9vcC5tb2RlfWA7XHJcbiAgICAgIGlmIChMb29wLm1vZGUgIT0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QpXHJcbiAgICAgICAgbG9nICs9IGAgd2l0aCBhdHRlbXB0ZWQgJHtfZnBzfSBmcHNgO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShsb2cpO1xyXG5cclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q6XHJcbiAgICAgICAgICBMb29wLmxvb3BGcmFtZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuRlJBTUVfUkVRVUVTVF9YUjpcclxuICAgICAgICAgIExvb3AubG9vcEZyYW1lWFIoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfUkVBTDpcclxuICAgICAgICAgIExvb3AuaWRJbnRlcnZhbGwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoTG9vcC5sb29wVGltZSwgMTAwMCAvIExvb3AuZnBzRGVzaXJlZCk7XHJcbiAgICAgICAgICBMb29wLmxvb3BUaW1lKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX0dBTUU6XHJcbiAgICAgICAgICBMb29wLmlkSW50ZXJ2YWxsID0gVGltZS5nYW1lLnNldFRpbWVyKDEwMDAgLyBMb29wLmZwc0Rlc2lyZWQsIDAsIExvb3AubG9vcFRpbWUpO1xyXG4gICAgICAgICAgTG9vcC5sb29wVGltZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBMb29wLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIGxvb3BcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9wKCk6IHZvaWQge1xyXG4gICAgICBpZiAoIUxvb3AucnVubmluZylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBzd2l0Y2ggKExvb3AubW9kZSkge1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q6XHJcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoTG9vcC5pZFJlcXVlc3QpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuRlJBTUVfUkVRVUVTVF9YUjpcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfUkVBTDpcclxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKExvb3AuaWRJbnRlcnZhbGwpO1xyXG4gICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfR0FNRTpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5kZWxldGVUaW1lcihMb29wLmlkSW50ZXJ2YWxsKTtcclxuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIExvb3AucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkxvb3Agc3RvcHBlZCFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250aW51ZSBydW5uaW5nIHRoZSBsb29wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udGludWUoKTogdm9pZCB7XHJcbiAgICAgIGlmIChMb29wLnJ1bm5pbmcpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgTG9vcC5zdGFydChMb29wLm1vZGUsIExvb3AuZnBzRGVzaXJlZCwgTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZTogbnVtYmVyO1xyXG4gICAgICB0aW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVSZWFsID0gdGltZSAtIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWw7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWwgPSB0aW1lO1xyXG5cclxuICAgICAgdGltZSA9IFRpbWUuZ2FtZS5nZXQoKTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZUdhbWUgPSB0aW1lIC0gTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZSA9IHRpbWU7XHJcblxyXG4gICAgICBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgPSAoKExvb3AuZnJhbWVzVG9BdmVyYWdlIC0gMSkgKiBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgKyBMb29wLsaSVGltZUZyYW1lR2FtZSkgLyBMb29wLmZyYW1lc1RvQXZlcmFnZTtcclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnID0gKChMb29wLmZyYW1lc1RvQXZlcmFnZSAtIDEpICogTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnICsgTG9vcC7GklRpbWVGcmFtZVJlYWwpIC8gTG9vcC5mcmFtZXNUb0F2ZXJhZ2U7XHJcblxyXG4gICAgICAvLyBUT0RPOiBjb25zaWRlciBMb29wRXZlbnQgd2hpY2ggY29udmV5cyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRpbWVFbGFwc2VkIGV0Yy4uLlxyXG4gICAgICBMb29wLsaSRnJhbWVzKys7XHJcbiAgICAgIGxldCBldmVudDogRXZlbnQgPSBuZXcgRXZlbnQoRVZFTlQuTE9PUF9GUkFNRSk7XHJcbiAgICAgIExvb3AudGFyZ2V0U3RhdGljLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGxvb3BGcmFtZSgpOiB2b2lkIHtcclxuICAgICAgTG9vcC5sb29wKCk7XHJcbiAgICAgIExvb3AuaWRSZXF1ZXN0ID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3BGcmFtZSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wRnJhbWVYUihfdGltZTogbnVtYmVyID0gbnVsbCwgX3hyRnJhbWU6IFhSRnJhbWUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIExvb3AubG9vcCgpO1xyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuZHJhdyh0cnVlLCBfeHJGcmFtZSk7XHJcbiAgICAgIExvb3AuaWRSZXF1ZXN0ID0gWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKExvb3AubG9vcEZyYW1lWFIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIGlmIChMb29wLnN5bmNXaXRoQW5pbWF0aW9uRnJhbWUpXHJcbiAgICAgICAgTG9vcC5pZFJlcXVlc3QgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKExvb3AubG9vcCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb29wLmxvb3AoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBUaW1lVW5pdHMge1xyXG4gICAgaG91cnM/OiBudW1iZXI7XHJcbiAgICBtaW51dGVzPzogbnVtYmVyO1xyXG4gICAgc2Vjb25kcz86IG51bWJlcjtcclxuICAgIHRlbnRocz86IG51bWJlcjtcclxuICAgIGh1bmRyZWRzPzogbnVtYmVyO1xyXG4gICAgdGhvdXNhbmRzPzogbnVtYmVyO1xyXG4gICAgZnJhY3Rpb24/OiBudW1iZXI7XHJcbiAgICBhc0hvdXJzPzogbnVtYmVyO1xyXG4gICAgYXNNaW51dGVzPzogbnVtYmVyO1xyXG4gICAgYXNTZWNvbmRzPzogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBUaW1lcnMgZXh0ZW5kcyBPYmplY3Qge1xyXG4gICAgW2lkOiBudW1iZXJdOiBUaW1lcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGdlbmVyYXRlIGEgdGltZXN0YW1wIHRoYXQgY29ycmVsYXRlcyB3aXRoIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGJ1dCBhbGxvd3MgZm9yIHJlc2V0dGluZyBhbmQgc2NhbGluZy4gIFxyXG4gICAqIFN1cHBvcnRzIHtAbGluayBUaW1lcn1zIHNpbWlsYXIgdG8gd2luZG93LnNldEludGVydmFsIGJ1dCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNjYWxlZCB0aW1lLlxyXG4gICAqIEFsbCB0aW1lIHZhbHVlcyBhcmUgZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGltZSBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICAvKiogU3RhbmRhcmQgZ2FtZSB0aW1lIHN0YXJ0aW5nIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgYXBwbGljYXRpb24gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ2FtZTogVGltZSA9IG5ldyBUaW1lKCk7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHNjYWxlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIG9mZnNldDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsYXN0Q2FsbFRvRWxhcHNlZDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lcnM6IFRpbWVycyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBpZFRpbWVyQWRkZWRMYXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICB0aGlzLnNjYWxlID0gMS4wO1xyXG4gICAgICB0aGlzLm9mZnNldCA9IDAuMDtcclxuICAgICAgdGhpcy5sYXN0Q2FsbFRvRWxhcHNlZCA9IDAuMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgcmVwcmVzZW50aW9ucyBvZiB0aGUgdGltZSBnaXZlbiBpbiBtaWxsaXNlY29uZHMgaW4gdmFyaW91cyBmb3JtYXRzIGRlZmluZWQgaW4ge0BsaW5rIFRpbWVVbml0c31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRVbml0cyhfbWlsbGlzZWNvbmRzOiBudW1iZXIpOiBUaW1lVW5pdHMge1xyXG4gICAgICBsZXQgdW5pdHM6IFRpbWVVbml0cyA9IHt9O1xyXG5cclxuICAgICAgdW5pdHMuYXNTZWNvbmRzID0gX21pbGxpc2Vjb25kcyAvIDEwMDA7XHJcbiAgICAgIHVuaXRzLmFzTWludXRlcyA9IHVuaXRzLmFzU2Vjb25kcyAvIDYwO1xyXG4gICAgICB1bml0cy5hc0hvdXJzID0gdW5pdHMuYXNNaW51dGVzIC8gNjA7XHJcblxyXG4gICAgICB1bml0cy5ob3VycyA9IE1hdGguZmxvb3IodW5pdHMuYXNIb3Vycyk7XHJcbiAgICAgIHVuaXRzLm1pbnV0ZXMgPSBNYXRoLmZsb29yKHVuaXRzLmFzTWludXRlcykgJSA2MDtcclxuICAgICAgdW5pdHMuc2Vjb25kcyA9IE1hdGguZmxvb3IodW5pdHMuYXNTZWNvbmRzKSAlIDYwO1xyXG5cclxuICAgICAgdW5pdHMuZnJhY3Rpb24gPSBfbWlsbGlzZWNvbmRzICUgMTAwMDtcclxuICAgICAgdW5pdHMudGhvdXNhbmRzID0gX21pbGxpc2Vjb25kcyAlIDEwO1xyXG4gICAgICB1bml0cy5odW5kcmVkcyA9IF9taWxsaXNlY29uZHMgJSAxMDAgLSB1bml0cy50aG91c2FuZHM7XHJcbiAgICAgIHVuaXRzLnRlbnRocyA9IHVuaXRzLmZyYWN0aW9uIC0gdW5pdHMuaHVuZHJlZHMgLSB1bml0cy50aG91c2FuZHM7XHJcblxyXG4gICAgICByZXR1cm4gdW5pdHM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdGltZSBhbmQgc2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2NhbGVkIHRpbWVzdGFtcCBvZiB0aGlzIGluc3RhbmNlIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldCArIHRoaXMuc2NhbGUgKiAocGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnN0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJlbWFpbmluZyB0aW1lIHRvIHRoZSBnaXZlbiBwb2ludCBvZiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZW1haW5kZXIoX3RvOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX3RvIC0gdGhpcy5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pIFNldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgVGhlIHRpbWVzdGFtcCB0byByZXByZXNlbnQgdGhlIGN1cnJlbnQgdGltZSAoZGVmYXVsdCAwLjApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3RpbWU6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfdGltZTtcclxuICAgICAgdGhpcy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICB0aGlzLmdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2NhbGluZyBvZiB0aGlzIHRpbWUsIGFsbG93aW5nIGZvciBzbG93bW90aW9uICg8MSkgb3IgZmFzdGZvcndhcmQgKD4xKSBcclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIGRlc2lyZWQgc2NhbGluZyAoZGVmYXVsdCAxLjApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTY2FsZShfc2NhbGU6IG51bWJlciA9IDEuMCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCh0aGlzLmdldCgpKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IF9zY2FsZTtcclxuICAgICAgLy9UT0RPOiBjYXRjaCBzY2FsZT0wXHJcbiAgICAgIHRoaXMucmVzY2FsZUFsbFRpbWVycygpO1xyXG4gICAgICB0aGlzLmdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlRJTUVfU0NBTEVEKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2NhbGluZyBvZiB0aGlzIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBvZmZzZXQgb2YgdGhpcyB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPZmZzZXQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBzY2FsZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhpcyBtZXRob2RcclxuICAgICAqIEF1dG9tYXRpY2FsbHkgcmVzZXQgYXQgZXZlcnkgY2FsbCB0byBzZXQoLi4uKSBhbmQgc2V0U2NhbGUoLi4uKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RWxhcHNlZFNpbmNlUHJldmlvdXNDYWxsKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBudW1iZXIgPSB0aGlzLmdldCgpO1xyXG4gICAgICBsZXQgZWxhcHNlZDogbnVtYmVyID0gY3VycmVudCAtIHRoaXMubGFzdENhbGxUb0VsYXBzZWQ7XHJcbiAgICAgIHRoaXMubGFzdENhbGxUb0VsYXBzZWQgPSBjdXJyZW50O1xyXG4gICAgICByZXR1cm4gZWxhcHNlZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVGltZXJzXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBQcm9taXNlPHZvaWQ+IHRvIGJlIHJlc29sdmVkIGFmdGVyIHRoZSB0aW1lIGdpdmVuLiBUbyBiZSB1c2VkIHdpdGggYXN5bmMvYXdhaXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGF5KF9sYXBzZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShfcmVzb2x2ZSA9PiB0aGlzLnNldFRpbWVyKF9sYXBzZSwgMSwgKCkgPT4gX3Jlc29sdmUoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IGV4YW1pbmUgaWYgd2ViLXdvcmtlcnMgd291bGQgZW5oYW5jZSBwZXJmb3JtYW5jZSBoZXJlIVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbmQgZGVsZXRlcyBhbGwge0BsaW5rIFRpbWVyfXMgYXR0YWNoZWQuIFNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgVGltZS1vYmplY3QgbGVhdmVzIHNjb3BlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhckFsbFRpbWVycygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICB0aGlzLmRlbGV0ZVRpbWVyKE51bWJlcihpZCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHtAbGluayBUaW1lcn0gZm91bmQgdXNpbmcgdGhlIGludGVybmFsIGlkIG9mIHRoZSBjb25uZWN0ZWQgaW50ZXJ2YWwtb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gX2lkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlVGltZXJCeUl0c0ludGVybmFsSWQoX2lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgIGlmICh0aW1lci5pZCA9PSBfaWQpIHtcclxuICAgICAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgICAgICBkZWxldGUgdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgYW4gZWFybHkgb3V0IGlzIE9LIGhlcmUuLi4gc2hvdWxkIGJlIVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFsbHMgYSB0aW1lciBhdCB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gX2xhcHNlIFRoZSBvYmplY3QtdGltZSB0byBlbGFwc2UgYmV0d2VlbiB0aGUgY2FsbHMgdG8gX2NhbGxiYWNrXHJcbiAgICAgKiBAcGFyYW0gX2NvdW50IFRoZSBudW1iZXIgb2YgY2FsbHMgZGVzaXJlZCwgMCA9IEluZmluaXRlXHJcbiAgICAgKiBAcGFyYW0gX2hhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZWFjaCB0aGUgZ2l2ZW4gbGFwc2UgaGFzIGVsYXBzZWRcclxuICAgICAqIEBwYXJhbSBfYXJndW1lbnRzIEFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUaW1lcihfbGFwc2U6IG51bWJlciwgX2NvdW50OiBudW1iZXIsIF9oYW5kbGVyOiBUaW1lckhhbmRsZXIsIC4uLl9hcmd1bWVudHM6IE9iamVjdFtdKTogbnVtYmVyIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgICBuZXcgVGltZXIodGhpcywgX2xhcHNlLCBfY291bnQsIF9oYW5kbGVyLCAuLi5fYXJndW1lbnRzKTtcclxuICAgICAgLy90aGlzLmFkZFRpbWVyKHRpbWVyKTtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRUaW1lckFkZGVkTGFzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBUaW1lfSBhbmQge0BsaW5rIFRpbWVyfSBhbmQgbXVzdCBub3QgYmUgY2FsbGVkIG90aGVyd2lzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVGltZXIoX3RpbWVyOiBUaW1lcik6IG51bWJlciB7XHJcbiAgICAgIHRoaXMudGltZXJzWysrdGhpcy5pZFRpbWVyQWRkZWRMYXN0XSA9IF90aW1lcjtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRUaW1lckFkZGVkTGFzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhlIHRpbWVyIHdpdGggdGhlIGlkIGdpdmVuIGJ5IHRoaXMgdGltZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVRpbWVyKF9pZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCB0aW1lcjogVGltZXIgPSB0aGlzLnRpbWVyc1tfaWRdO1xyXG4gICAgICBpZiAoIXRpbWVyKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgdGltZXIuY2xlYXIoKTtcclxuICAgICAgZGVsZXRlIHRoaXMudGltZXJzW19pZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0aW1lciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRpbWVyKF9pZDogbnVtYmVyKTogVGltZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy50aW1lcnNbX2lkXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IG9mIHRpbWVycyBjdXJyZW50bHkgaW5zdGFsbGVkIG9uIHRoaXMgdGltZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRpbWVycygpOiBUaW1lcnMge1xyXG4gICAgICBsZXQgcmVzdWx0OiBUaW1lcnMgPSB7fTtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB0aGlzLnRpbWVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHtAbGluayBUaW1lcnN9IGluc3RhbGxlZCB0byB0aGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYXNUaW1lcnMoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoT2JqZWN0LmtleXModGhpcy50aW1lcnMpLmxlbmd0aCA+IDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjcmVhdGVzIHtAbGluayBUaW1lcn1zIHdoZW4gc2NhbGluZyBjaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzY2FsZUFsbFRpbWVycygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICBpZiAoIXRoaXMuc2NhbGUpXHJcbiAgICAgICAgICAvLyBUaW1lIGhhcyBzdG9wcGVkLCBubyBuZWVkIHRvIHJlcGxhY2UgY2xlYXJlZCB0aW1lcnNcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvKiB0aGlzLnRpbWVyc1tpZF0gPSAgKi9cclxuICAgICAgICB0aW1lciA9IHRpbWVyLmluc3RhbGxDb3B5KCk7IC8vIHRoZSB0aW1lciBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoaXMgdGltZSBpbnN0YW5jZVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1t0aGlzLmlkVGltZXJBZGRlZExhc3RdOyAvLyByZW1vdmUgdGhlIGNvcHkgYWdhaW4gLi4uXHJcbiAgICAgICAgdGhpcy50aW1lcnNbaWRdID0gdGltZXI7IC8vIC4uLiBhbmQgcGxhY2UgaXQgYXQgdGhlIGlkIG9mIHRoZSBvcmlnaW5hbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyB0aGUgc2lnbmF0dXJlIG9mIGhhbmRsZXIgZnVuY3Rpb25zIGZvciB7QGxpbmsgRXZlbnRUaW1lcn1zLCB2ZXJ5IHNpbWlsYXIgdG8gdXN1YWwgZXZlbnQgaGFuZGxlclxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIFRpbWVySGFuZGxlciA9IChfZXZlbnQ6IEV2ZW50VGltZXIpID0+IHZvaWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIFRpbWVyfS1pbnN0YW5jZSBpbnRlcm5hbGx5IHVzZXMgd2luZG93LnNldEludGVydmFsIHRvIGNhbGwgYSBnaXZlbiBoYW5kbGVyIHdpdGggYSBnaXZlbiBmcmVxdWVuY3kgYSBnaXZlbiBudW1iZXIgb2YgdGltZXMsXHJcbiAgICogcGFzc2luZyBhbiB7QGxpbmsgRXZlbnRUaW1lcn0taW5zdGFuY2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBnaXZlbiBhcmd1bWVudHMuIFxyXG4gICAqIFRoZSBmcmVxdWVuY3kgc2NhbGVzIHdpdGggdGhlIHtAbGluayBUaW1lfS1pbnN0YW5jZSB0aGUge0BsaW5rIFRpbWVyfS1pbnN0YW5jZSBpcyBhdHRhY2hlZCB0by5cclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRpbWVyIHtcclxuICAgIHB1YmxpYyBhY3RpdmU6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgY291bnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaGFuZGxlcjogVGltZXJIYW5kbGVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lOiBUaW1lO1xyXG4gICAgcHJpdmF0ZSBlbGFwc2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgZXZlbnQ6IEV2ZW50VGltZXI7XHJcbiAgICBwcml2YXRlIHRpbWVvdXRSZWFsOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGlkV2luZG93OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRpbWVyfSBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSBUaGUge0BsaW5rIFRpbWV9IGluc3RhbmNlLCB0aGUgdGltZXIgYXR0YWNoZXMgdG9cclxuICAgICAqIEBwYXJhbSBfZWxhcHNlIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBlbGFwc2UsIHRvIHRoZSBuZXh0IGNhbGwgb2YgX2hhbmRsZXIsIG1lYXN1cmVkIGluIF90aW1lXHJcbiAgICAgKiBAcGFyYW0gX2NvdW50IFRoZSBkZXNpcmVkIG51bWJlciBvZiBjYWxscyB0byBfaGFuZGxlciwgVGltZXIgZGVpbnN0YWxscyBhdXRvbWF0aWNhbGx5IGFmdGVyIGxhc3QgY2FsbC4gUGFzc2luZyAwIGludm9rZXMgaW5maW5pdGUgY2FsbHNcclxuICAgICAqIEBwYXJhbSBfaGFuZGxlciBUaGUge0BsaW5rIFRpbWVySGFuZGxlcn0gaW5zdGFuY2UgdG8gY2FsbFxyXG4gICAgICogQHBhcmFtIF9hcmd1bWVudHMgQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBfaGFuZGxlclxyXG4gICAgICogXHJcbiAgICAgKiBUT0RPOiBmb3IgcHJvcGVyIGhhbmRsaW5nIGFuZCBkZWxldGlvbiwgdXNlIFRpbWUuc2V0VGltZXIgaW5zdGVhZCBvZiBpbnN0YW50aWF0aW5nIHRpbWVycyB5b3Vyc2VsZi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90aW1lOiBUaW1lLCBfZWxhcHNlOiBudW1iZXIsIF9jb3VudDogbnVtYmVyLCBfaGFuZGxlcjogVGltZXJIYW5kbGVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSkge1xyXG4gICAgICB0aGlzLnRpbWUgPSBfdGltZTtcclxuICAgICAgdGhpcy5lbGFwc2UgPSBfZWxhcHNlO1xyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IEV2ZW50VGltZXIodGhpcywgLi4uX2FyZ3VtZW50cyk7XHJcbiAgICAgIHRoaXMuaGFuZGxlciA9IF9oYW5kbGVyO1xyXG4gICAgICB0aGlzLmNvdW50ID0gX2NvdW50O1xyXG5cclxuICAgICAgbGV0IHNjYWxlOiBudW1iZXIgPSBNYXRoLmFicyhfdGltZS5nZXRTY2FsZSgpKTtcclxuXHJcbiAgICAgIGlmICghc2NhbGUpIHtcclxuICAgICAgICAvLyBUaW1lIGlzIHN0b3BwZWQsIHRpbWVyIHdvbid0IGJlIGFjdGl2ZVxyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRpbWVvdXRSZWFsID0gdGhpcy5lbGFwc2UgLyBzY2FsZTtcclxuXHJcbiAgICAgIGxldCBjYWxsYmFjazogRnVuY3Rpb24gPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudC5jb3VudCA9IHRoaXMuY291bnQ7XHJcbiAgICAgICAgdGhpcy5ldmVudC5sYXN0Q2FsbCA9ICh0aGlzLmNvdW50ID09IDEpO1xyXG4gICAgICAgIF9oYW5kbGVyKHRoaXMuZXZlbnQpO1xyXG4gICAgICAgIHRoaXMuZXZlbnQuZmlyc3RDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvdW50ID4gMClcclxuICAgICAgICAgIGlmICgtLXRoaXMuY291bnQgPT0gMClcclxuICAgICAgICAgICAgX3RpbWUuZGVsZXRlVGltZXJCeUl0c0ludGVybmFsSWQodGhpcy5pZFdpbmRvdyk7XHJcblxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pZFdpbmRvdyA9IHdpbmRvdy5zZXRJbnRlcnZhbChjYWxsYmFjaywgdGhpcy50aW1lb3V0UmVhbCwgLi4uX2FyZ3VtZW50cyk7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgX3RpbWUuYWRkVGltZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB3aW5kb3ctaWQgb2YgdGhlIHRpbWVyLCB3aGljaCB3YXMgcmV0dXJuZWQgYnkgc2V0SW50ZXJ2YWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5pZFdpbmRvdztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRpbWUtaW50ZXJ2YWxsIGZvciBjYWxscyB0byB0aGUgaGFuZGxlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGxhcHNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVsYXBzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGFjaGVzIGEgY29weSBvZiB0aGlzIGF0IGl0cyBjdXJyZW50IHN0YXRlIHRvIHRoZSBzYW1lIHtAbGluayBUaW1lfS1pbnN0YW5jZS4gVXNlZCBpbnRlcm5hbGx5IHdoZW4gcmVzY2FsaW5nIHtAbGluayBUaW1lfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5zdGFsbENvcHkoKTogVGltZXIge1xyXG4gICAgICByZXR1cm4gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy5lbGFwc2UsIHRoaXMuY291bnQsIHRoaXMuaGFuZGxlciwgdGhpcy5ldmVudC5hcmd1bWVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSB0aW1lciwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgaW50ZXJ2YWwtdGltZXJzIGhhbmRsZWQgYnkgd2luZG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgLy8gaWYgKHRoaXMudHlwZSA9PSBUSU1FUl9UWVBFLlRJTUVPVVQpIHtcclxuICAgICAgLy8gICAgIGlmICh0aGlzLmFjdGl2ZSlcclxuICAgICAgLy8gICAgICAgICAvLyBzYXZlIHJlbWFpbmluZyB0aW1lIHRvIHRpbWVvdXQgYXMgbmV3IHRpbWVvdXQgZm9yIHJlc3RhcnRcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aGlzLnRpbWVvdXQgKiAoMSAtIChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lUmVhbCkgLyB0aGlzLnRpbWVvdXRSZWFsKTtcclxuICAgICAgLy8gICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5pZCk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZVxyXG4gICAgICAvLyBUT0RPOiByZXVzaW5nIHRpbWVyIHN0YXJ0cyBpbnRlcnZhbCBhbmV3LiBTaG91bGQgYmUgcmVtYWluaW5nIGludGVydmFsIGFzIHRpbWVvdXQsIHRoZW4gc3RhcnRpbmcgaW50ZXJ2YWwgYW5ldyBcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVkZ2VDb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUYXJnZXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0ludGVyZmFjZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0NvbnNvbGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Zy50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yU2hhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29hdC50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3Rvck1lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUmVjeWNsZS9SZWN5Y2xlci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvUmVjdGFuZ2xlLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlcldlYkdMLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSGVscGVyc1BoeXNpY3MudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludEF4aWFsLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvTWF0ZXJpYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFNrZWxldG9uLnRzIiwiLi4vU291cmNlL0NvcmUvUmVmZXJlbmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uRnVuY3Rpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb25LZXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEF1ZGlvLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9NYW5hZ2VyLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9Pc2NpbGxhdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudEFtYmllbnRPY2NsdXNpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QW5pbWF0b3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW9MaXN0ZW5lci50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRDYW1lcmEudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50RmFjZUNhbWVyYS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRGb2cudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50R3JhcGhGaWx0ZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9MaWdodC9MaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRMaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNYXRlcmlhbC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBpY2sudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2NyaXB0LnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFRleHQudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VHJhbnNmb3JtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFZSRGV2aWNlLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9Db250cm9sLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9BeGlzLnRzIiwiLi4vU291cmNlL0NvcmUvQ29udHJvbC9LZXlib2FyZC50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnQWxlcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0RpYWxvZy50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnVGV4dEFyZWEudHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEtleWJvYXJkLnRzIiwiLi4vU291cmNlL0NvcmUvRXZlbnQvRXZlbnRUaW1lci50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50VG91Y2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9HcmFwaC9HcmFwaC50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoSW5zdGFuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdENvbG9yZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFRleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFJlbWlzc2l2ZVRleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXRUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29sb3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9NYXRlcmlhbEdMVEYudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0NhbGMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0ZyYW1pbmcudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0dlbzIudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0dlbzMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL0xGSUI0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9NYXRyaXgzeDMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL01hdHJpeDR4NC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2UzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9Ob2lzZTQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1F1YXRlcm5pb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1JhbmRvbS50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yNC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvRmFjZS50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEN1YmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hQb2x5Z29uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRXh0cnVzaW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoRnJvbURhdGEudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoT0JKLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUHlyYW1pZC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFF1YWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hUZXJyYWluLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUmVsaWVmLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUm90YXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hTcGhlcmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hTcHJpdGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hUb3J1cy50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvUXVhZC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvVmVydGV4LnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9WZXJ0aWNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1BhcnRpY2xlU3lzdGVtL1NoYWRlclBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db21wb25lbnRXYWxrZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXRoaW5nL0NvbXBvbmVudFdheXBvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db25uZWN0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Db21wb25lbnRSaWdpZGJvZHkudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0RlYnVnUGh5c2ljc0RyYXcudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50Q3lsaW5kcmljYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UHJpc21hdGljLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFJhZ2RvbGwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UmV2b2x1dGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50U3BoZXJpY2FsLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFVuaXZlcnNhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSm9pbnRXZWxkaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9QaHlzaWNzLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L0JveC50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9QaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L1BpY2tlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9SYXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvR2l6bW9zLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1ZpZXdwb3J0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1hSVmlld3BvcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZpbGVJb0Jyb3dzZXJMb2NhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vTXV0YWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9Qcm9qZWN0LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvQnVmZmVyUmVhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTG9hZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vRkJYL2xvYWRGcm9tTm9kZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZCWC9wYXJzZU5vZGVzRnJvbUJpbmFyeS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vR0xURi9HTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9HTFRGL0dMVEZMb2FkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvTWVyZ2VkU2hhZGVyU291cmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyQW1iaWVudE9jY2x1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0LnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0VGV4dHVyZWRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTGl0U2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZFNraW4udHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTWF0Q2FwLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBpY2tUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlRGVmYXVsdC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvTG9vcC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZS50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFVLFNBQVMsQ0FvQmxCO0FBcEJELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQXNCLFdBQVc7UUFHL0I7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsR0FBRyxLQUFlO1lBQy9ELElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUNsRSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUs7Z0JBQ25CLElBQUksR0FBRyxZQUFZLE1BQU07b0JBQ3ZCLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjs7b0JBRTVFLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsK0JBQStCO1lBQ2pFLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztLQUNGO0lBZnFCLHFCQUFXLGNBZWhDLENBQUE7QUFDSCxDQUFDLEVBcEJTLFNBQVMsS0FBVCxTQUFTLFFBb0JsQjtBQ3BCRCxvQ0FBb0M7QUFDcEMsSUFBVSxTQUFTLENBZ0NsQjtBQWpDRCxvQ0FBb0M7QUFDcEMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsSUFBWSxZQWVYO0lBZkQsV0FBWSxZQUFZO1FBQ3RCLCtDQUFXLENBQUE7UUFDWCwrQ0FBVyxDQUFBO1FBQ1gsNkNBQVUsQ0FBQTtRQUNWLCtDQUFXLENBQUE7UUFDWCxpREFBWSxDQUFBO1FBQ1osa0RBQVksQ0FBQTtRQUNaLG1EQUFhLENBQUE7UUFDYixtREFBYSxDQUFBO1FBQ2IscUVBQXNCLENBQUE7UUFDdEIseURBQWdCLENBQUE7UUFDaEIscURBQWMsQ0FBQTtRQUNkLHdEQUE0QyxDQUFBO1FBQzVDLHFEQUFrRCxDQUFBO1FBQ2xELCtDQUF1QixDQUFBO0lBQ3pCLENBQUMsRUFmVyxZQUFZLEdBQVosc0JBQVksS0FBWixzQkFBWSxRQWV2QjtJQUVZLHNCQUFZLEdBQWlDO1FBQ3hELENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUc7UUFDeEIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRztRQUN2QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHO1FBQ3hCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUc7UUFDekIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSTtRQUMxQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJO0tBQzVCLENBQUM7QUFJSixDQUFDLEVBaENTLFNBQVMsS0FBVCxTQUFTLFFBZ0NsQjtBQ2pDRCx1Q0FBdUM7QUFDdkMsSUFBVSxTQUFTLENBZ0NsQjtBQWpDRCx1Q0FBdUM7QUFDdkMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsVUFBQSxXQUFXO2lCQUM3QixjQUFTLEdBQTZCO1lBQ2xELENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDakMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRztZQUMvQixDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2pDLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDbkMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSztZQUN4QyxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ25DLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDbkMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUNyRCxDQUFDLFVBQUEsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQ3pDLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDM0MsQ0FBQztRQUVGOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFnQixFQUFFLEdBQUcsS0FBZTtZQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNyRSxDQUFDOztJQTFCVSxzQkFBWSxlQTJCeEIsQ0FBQTtBQUNILENBQUMsRUFoQ1MsU0FBUyxLQUFULFNBQVMsUUFnQ2xCO0FDakNELHVDQUF1QztBQUN2QywwQ0FBMEM7QUFDMUMsdUNBQXVDO0FBQ3ZDLElBQVUsU0FBUyxDQTZLbEI7QUFoTEQsdUNBQXVDO0FBQ3ZDLDBDQUEwQztBQUMxQyx1Q0FBdUM7QUFDdkMsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLEtBQUs7UUFDaEI7O1dBRUc7aUJBQ1ksY0FBUyxHQUFtRCxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFaEc7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQW9CLEVBQUUsT0FBcUI7WUFDakUsS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUztnQkFDaEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFMUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxVQUFBLFlBQVksRUFBRSxDQUFDO2dCQUNoQyxJQUFJLE1BQU0sR0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDZixNQUFNO2dCQUNSLElBQUksQ0FBQyxVQUFBLFlBQVksQ0FBQyxRQUFRLEVBQUUsVUFBQSxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RGLDJCQUEyQjtvQkFDM0IsU0FBUztnQkFDWCxJQUFJLE9BQU8sR0FBRyxNQUFNO29CQUNsQixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQW9CO1lBQzFDLElBQUksTUFBTSxHQUFpQixDQUFDLENBQUM7WUFDN0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUztnQkFDbEMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQW9CLEVBQUUsT0FBcUI7WUFDakUsSUFBSSxPQUFPLEdBQWlCLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBb0IsRUFBRSxPQUFxQjtZQUNwRSxJQUFJLE9BQU8sR0FBaUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFpQixFQUFFLEdBQUcsS0FBZ0I7WUFDdkQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBaUIsRUFBRSxHQUFHLEtBQWdCO1lBQ3RELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWlCLEVBQUUsR0FBRyxLQUFnQjtZQUN2RCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFpQixFQUFFLEdBQUcsS0FBZ0I7WUFDeEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBaUIsRUFBRSxHQUFHLEtBQWdCO1lBQ3hELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSztZQUNqQixLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFhO1lBQy9CLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWE7WUFDeEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRO1lBQ3BCLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQWE7WUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOztnQkFFMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFNUIsS0FBSyxJQUFJLEtBQUssSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0QsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsR0FBRyxLQUFnQjtZQUN6RCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVEOztXQUVHO1FBQ0ssTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFxQixFQUFFLFFBQWlCLEVBQUUsS0FBZ0I7WUFDaEYsSUFBSSxPQUFPLElBQUksVUFBQSxZQUFZLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxVQUFBLFlBQVksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLFVBQUEsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDO29CQUN0QyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO3dCQUNoRSxJQUFJLFFBQVEsRUFBRSxDQUFDOzRCQUNiLElBQUksS0FBSyxHQUFhLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzFELFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsQ0FBQztZQUNQLENBQUM7WUFDRCxJQUFJLFNBQVMsR0FBNkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRSxLQUFLLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JDLElBQUksUUFBUTtvQkFDVixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzNCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQzs7d0JBRTdCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzQixDQUFDO1FBQ0Q7O1dBRUc7UUFDSyxNQUFNLENBQUMsWUFBWTtZQUN6QixJQUFJLE1BQU0sR0FBbUQsRUFBRSxDQUFDO1lBQ2hFLElBQUksT0FBTyxHQUFtQjtnQkFDNUIsVUFBQSxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQUEsWUFBWSxDQUFDLEdBQUcsRUFBRSxVQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQUEsWUFBWSxDQUFDLEtBQUs7Z0JBQzlGLFVBQUEsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFBLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBQSxZQUFZLENBQUMsY0FBYyxFQUFFLFVBQUEsWUFBWSxDQUFDLFFBQVE7Z0JBQzFGLFVBQUEsWUFBWSxDQUFDLE1BQU07YUFDcEIsQ0FBQztZQUVGLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTztnQkFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFBLFlBQVksRUFBRSxVQUFBLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0UsTUFBTSxDQUFDLFVBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLFlBQVksQ0FBQyxDQUFDO1lBRWpELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7O0lBcktVLGVBQUssUUFzS2pCLENBQUE7QUFDSCxDQUFDLEVBN0tTLFNBQVMsS0FBVCxTQUFTLFFBNktsQjtBQ2hMRCxJQUFVLFNBQVMsQ0E2SWxCO0FBN0lELFdBQVUsU0FBUztJQXFGakIsNkZBQTZGO0lBQzdGLE1BQWEsa0JBQW1CLFNBQVEsV0FBVztRQUNqRDs7V0FFRztRQUNJLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxRQUE4QixFQUFFLFFBQTRDO1lBQ2pILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQXNDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsUUFBOEIsRUFBRSxRQUE0QztZQUNwSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFzQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksYUFBYSxDQUFDLE1BQW9CO1lBQ3ZDLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDO0tBQ0Y7SUFyQlksNEJBQWtCLHFCQXFCOUIsQ0FBQTtJQUVEOztPQUVHO0lBQ0gsTUFBYSxpQkFBa0IsU0FBUSxrQkFBa0I7aUJBQ3RDLGlCQUFZLEdBQXNCLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUUzRTtZQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxRQUF1QjtZQUNuRSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsUUFBdUI7WUFDdEUsaUJBQWlCLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWE7WUFDdkMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7O0lBM0JVLDJCQUFpQixvQkE0QjdCLENBQUE7QUFDSCxDQUFDLEVBN0lTLFNBQVMsS0FBVCxTQUFTLFFBNklsQjtBQzdJRCxJQUFVLFNBQVMsQ0F1U2xCO0FBdlNELFdBQVUsU0FBUztJQW1CakIsNEZBQTRGO0lBRTVGOztPQUVHO0lBQ0gsU0FBZ0IscUJBQXFCLENBQUMsT0FBZTtRQUNuRCxJQUFJLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDMUIsSUFBSSxVQUFVLEdBQWlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLEtBQUssSUFBSSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDakMsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEQsSUFBSSxLQUFLLFlBQVksUUFBUTtnQkFDM0IsU0FBUztZQUNYLDhEQUE4RDtZQUM5RCxjQUFjO1lBQ2QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQVplLCtCQUFxQix3QkFZcEMsQ0FBQTtJQUVELCtMQUErTDtJQUMvTCxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBcUI5Qzs7Ozs7OztPQU9HO0lBQ0gsU0FBZ0IsSUFBSSxDQUFDLFlBQTBEO1FBQzdFLE9BQU8sQ0FBQyxNQUFlLEVBQUUsUUFBcUMsRUFBRSxFQUFFO1lBQ2hFLElBQUksSUFBSSxHQUFvQixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksUUFBUSxHQUFhLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDM0MsSUFBSSxLQUFLLEdBQXVCLFFBQVEsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDO1lBQy9ELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDN0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQVBlLGNBQUksT0FPbkIsQ0FBQTtJQUVEOzs7O01BSUU7SUFDRixTQUFnQixVQUFVLENBQUMsTUFBZSxFQUFFLFFBQTZGO1FBQ3ZJLHFJQUFxSTtRQUNySSw0REFBNEQ7UUFDNUQsc0dBQXNHO1FBQ3RHLHNEQUFzRDtRQUN0RCw2RUFBNkU7UUFDN0UsTUFBTTtRQUVOLElBQUksUUFBUSxHQUFhLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzdELFFBQVEsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixRQUFRLENBQUMsY0FBYyxLQUFLLEVBQUUsQ0FBQztZQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxjQUFjO2dCQUN2QyxNQUFNLENBQUMsY0FBYyxDQUFZLE1BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakYsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBcEJlLG9CQUFVLGFBb0J6QixDQUFBO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBc0IsT0FBUSxTQUFRLFVBQUEsa0JBQWtCO1FBQ3REOztXQUVHO1FBQ0gseURBQXlEO1FBQ3pELHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UsNENBQTRDO1FBQzVDLFFBQVE7UUFDUixRQUFRO1FBQ1IsSUFBSTtRQUVHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFpQixFQUFFLEtBQWU7WUFDakUsSUFBSSxHQUFHLEdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUMxQixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsa0VBQWtFO2dCQUNoRyxPQUFPLFFBQVEsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4RixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNJLFVBQVUsQ0FBQyxjQUF1QixLQUFLO1lBQzVDLElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUUxQiwyQ0FBMkM7WUFDM0MsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEtBQUssWUFBWSxRQUFRO29CQUMzQixTQUFTO2dCQUNYLElBQUksS0FBSyxZQUFZLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVM7b0JBQzdMLFNBQVM7Z0JBQ1gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM3QixDQUFDO1lBRUQsSUFBSSxDQUFDLFdBQVc7Z0JBQ2QsMkNBQTJDO2dCQUMzQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFNUIsb0VBQW9FO1lBQ3BFLEtBQUssSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxHQUFXLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxLQUFLLFlBQVksT0FBTztvQkFDMUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxLQUFLLFlBQVksVUFBQSxZQUFZO29CQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxzQkFBc0IsQ0FBQyxjQUF1QixLQUFLO1lBQ3hELE9BQTRCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVEOzs7V0FHRztRQUNJLDBCQUEwQixDQUFDLGNBQXVCLEtBQUs7WUFDNUQsT0FBZ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLHVOQUF1TjtRQUN4UixDQUFDO1FBRUQ7OztXQUdHO1FBQ0gseURBQXlEO1FBQ3pELHFEQUFxRDtRQUNyRCxJQUFJO1FBQ0o7OztXQUdHO1FBQ0ksd0JBQXdCLENBQUMsUUFBaUI7WUFDL0MsSUFBSSxLQUFLLEdBQTBCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFNBQVMsR0FBdUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDakUsS0FBSyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxJQUFJLEdBQVcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQztnQkFDOUMsSUFBSSxLQUFLLEdBQWtELFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFL0UsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTO29CQUN6QyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7d0JBQzFCLElBQUksR0FBYSxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzt5QkFDaEQsSUFBSSxPQUFPLEtBQUssSUFBSSxVQUFVO3dCQUNqQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQzs7d0JBRWxCLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFFbEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUMxQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxxQkFBcUI7WUFDMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxLQUFLLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xELENBQUM7UUFFRDs7O1dBR0c7UUFDSSxhQUFhLENBQUMsUUFBaUI7WUFDcEMsS0FBSyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pELElBQUksS0FBSyxZQUFZLE9BQU87b0JBQzFCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7O29CQUV6QyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM1QyxJQUFJLGVBQWU7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLDhCQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVEOztXQUVHO1FBQ08sS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFpQixFQUFFLFVBQXFCO1lBQ2pFLElBQUksT0FBTyxHQUFZLFFBQVEsQ0FBQztZQUVoQyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsOERBQThEO2dCQUM5RSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEtBQUssSUFBSSxTQUFTLElBQUksVUFBVSxFQUFFLHNDQUFzQztvQkFDdEUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssV0FBVzt3QkFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBRUQsS0FBSyxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztvQkFDL0IsU0FBUztnQkFDWCxJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxLQUFLLEdBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakQsSUFBSSxNQUFNLFlBQVksVUFBQSxZQUFZLElBQUksTUFBTSxZQUFZLE9BQU87b0JBQzdELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDOztvQkFFeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0tBTUY7SUFwTHFCLGlCQUFPLFVBb0w1QixDQUFBO0FBQ0gsQ0FBQyxFQXZTUyxTQUFTLEtBQVQsU0FBUyxRQXVTbEI7QUN2U0QsSUFBVSxTQUFTLENBMlRsQjtBQTNURCxXQUFVLFNBQVM7SUEyQmpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0gsTUFBc0IsVUFBVTtRQUM5QiwyR0FBMkc7aUJBQzVGLGVBQVUsR0FBc0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFbEU7O1dBRUc7UUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7WUFDaEQsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVTtnQkFDcEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVU7b0JBQzNDLE9BQU8sSUFBSSxDQUFDO1lBRWhCLElBQUksSUFBSSxHQUFXLFVBQVUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJO2dCQUNQLEtBQUssSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM3QyxJQUFJLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNqRixJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULElBQUksR0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQzt3QkFDL0IsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7WUFFSCxJQUFJLENBQUMsSUFBSTtnQkFDUCxNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFFaEcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBR0Q7Ozs7V0FJRztRQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBcUI7WUFDM0MsSUFBSSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztZQUN0QyxzREFBc0Q7WUFDdEQsaUVBQWlFO1lBQ2pFLElBQUksSUFBSSxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUk7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLG1GQUFtRixDQUFDLENBQUM7WUFDM0ssYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxPQUFPLGFBQWEsQ0FBQztZQUNyQiw4QkFBOEI7UUFDaEMsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQzNELElBQUksV0FBeUIsQ0FBQztZQUM5QixJQUFJLElBQVksQ0FBQztZQUNqQixJQUFJLENBQUM7Z0JBQ0gsc0VBQXNFO2dCQUN0RSxLQUFLLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDNUIsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLE9BQU8sV0FBVyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksT0FBTyxHQUFXLHNCQUFzQixJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBTSxDQUFDO2dCQUNuSSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUF5QixLQUFrQixFQUFFLFFBQXdCO1lBQy9GLElBQUksY0FBYyxHQUFvQixFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUk7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsS0FBSyxDQUFDLElBQUksbUZBQW1GLENBQUMsQ0FBQztZQUU3SixLQUFLLElBQUksTUFBTSxJQUFJLFFBQVE7Z0JBQ3pCLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFFMUMsSUFBSSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztZQUN0QyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQTZCO1lBQ2hFLElBQUksYUFBYSxHQUFtQixFQUFFLENBQUM7WUFDdkMsSUFBSSxTQUFpQyxDQUFDO1lBQ3RDLElBQUksY0FBYyxHQUFvQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDO2dCQUNILHNFQUFzRTtnQkFDdEUsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDaEMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RDLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFFRCxLQUFLLElBQUksYUFBYSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLFlBQVksR0FBaUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5QyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsOEhBQThIO1FBQzlIOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBYSxJQUFZLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUvRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQTZCO1lBQ25ELG1GQUFtRjtZQUNuRixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxNQUFNLEdBQVcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFhO1lBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFhO1lBQ3JDLElBQUksV0FBVyxHQUEyQixVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNFLElBQUksY0FBYyxHQUFpQixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JELE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxxSEFBcUg7UUFDckg7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUF5QixLQUFhO1lBQ2hFLElBQUksUUFBUSxHQUFXLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLFNBQVMsR0FBVyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLEtBQUsseURBQXlELENBQUMsQ0FBQztZQUNoSSxPQUFpQixTQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVEOzs7V0FHRztRQUNLLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBcUI7WUFDOUMsSUFBSSxRQUFRLEdBQVcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDaEQsb0RBQW9EO1lBQ3BELEtBQUssSUFBSSxhQUFhLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLEtBQUssR0FBc0IsVUFBVSxDQUFDLFVBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxLQUFLLElBQUksT0FBTyxZQUFZLEtBQUs7b0JBQ25DLE9BQU8sYUFBYSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7V0FHRztRQUNLLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBYTtZQUN2QyxJQUFJLGFBQWEsR0FBVyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUMzRCxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBa0IsRUFBRSxPQUFlO1lBQ2hFLEtBQUssSUFBSSxJQUFJLElBQUksT0FBTztnQkFDdEIsSUFBYyxPQUFRLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVTtvQkFDeEMsT0FBTyxJQUFJLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQXBNbUIsb0JBQVUsYUFxTS9CLENBQUE7SUFLRDs7OztPQUlHO0lBQ0gsU0FBZ0IsaUNBQWlDLENBQWtELEtBQVk7UUFDN0csTUFBZSw0QkFBNkIsU0FBUSxLQUFLO1lBQXpEOztnQkFHUyxXQUFNLEdBQW9CLFVBQUEsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQXVCM0QsQ0FBQztZQXJCQzs7ZUFFRztZQUNJLFNBQVM7Z0JBQ2QsTUFBTSxhQUFhLEdBQWtCO29CQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2lCQUN6QixDQUFDO2dCQUNGLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLENBQUM7U0FHRjtRQUFBLENBQUM7UUFFRixJQUFJLEtBQUssQ0FBQyxTQUFTLFlBQVksVUFBQSxPQUFPLEVBQUUsQ0FBQztZQUN2Qzs7O2VBR0c7WUFDSCxTQUFTLHdDQUF3QyxDQUFvRSxLQUFZO2dCQUMvSCxNQUFlLG1DQUFvQyxTQUFRLEtBQUs7b0JBQ3ZELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7d0JBQ2pHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNoRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksU0FBUzs0QkFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RCLENBQUM7b0JBRVMsYUFBYSxDQUFDLFFBQWlCO3dCQUN2QyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLENBQUM7aUJBQ0Y7Z0JBRUQsT0FBTyxtQ0FBbUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyx3Q0FBd0MsQ0FBOEQsNEJBQTRCLENBQUMsQ0FBQztRQUM3SSxDQUFDO1FBRUQsT0FBTyw0QkFBNEIsQ0FBQztJQUN0QyxDQUFDO0lBdERlLDJDQUFpQyxvQ0FzRGhELENBQUE7QUFDSCxDQUFDLEVBM1RTLFNBQVMsS0FBVCxTQUFTLFFBMlRsQjtBQzNURCxJQUFVLFNBQVMsQ0EwbkJsQjtBQTFuQkQsV0FBVSxTQUFTO0lBS2pCOzs7O09BSUc7SUFDSCxNQUFhLElBQUssU0FBUSxVQUFBLGtCQUFrQjtRQWtCMUMsdUJBQXVCLENBQVM7UUFDaEMsZ0JBQWdCLENBQVk7UUFFNUI7O1dBRUc7UUFDSCxZQUFtQixLQUFhO1lBQzlCLEtBQUssRUFBRSxDQUFDO1lBdkJNLGFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxvQkFBZSxHQUFXLENBQUMsQ0FBQztZQUNuQyxxRkFBcUY7WUFDOUUsbUJBQWMsR0FBVyxDQUFDLENBQUM7WUFDbEMsaUlBQWlJO1lBQzFILFdBQU0sR0FBVyxDQUFDLENBQUM7WUFFbEIsV0FBTSxHQUFnQixJQUFJLENBQUMsQ0FBQywyQkFBMkI7WUFDdkQsYUFBUSxHQUFXLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztZQUNyRSxlQUFVLEdBQXlCLEVBQUUsQ0FBQztZQUM5QyxtSEFBbUg7WUFDbkgsNEdBQTRHO1lBQ3BHLGNBQVMsR0FBMkIsRUFBRSxDQUFDO1lBQ3ZDLGFBQVEsR0FBMkIsRUFBRSxDQUFDO1lBQ3RDLFdBQU0sR0FBWSxJQUFJLENBQUM7WUFzTC9COzs7ZUFHRztZQUNILDhEQUE4RDtZQUM5QyxnQkFBVyxHQUEyQixJQUFJLENBQUMsUUFBUSxDQUFDO1lBakxsRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQXVCLEVBQUUsR0FBcUI7WUFDdkUsTUFBTSxJQUFJLEdBQVMsS0FBSyxZQUFZLFVBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbkUsTUFBTSxFQUFFLEdBQVMsR0FBRyxZQUFZLFVBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7WUFFZCx1Q0FBdUM7WUFDdkMsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLElBQUksTUFBTSxHQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIsT0FBTyxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwRSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsQ0FBQztZQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekIsSUFBSSxDQUFDLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUM7WUFFZCx1QkFBdUI7WUFDdkIsSUFBSSxjQUFjLEdBQWEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1lBQ2pHLElBQUksZ0JBQWdCLEdBQWEsTUFBTTtpQkFDcEMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJBQ2hHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQixJQUFJLEtBQUssWUFBWSxVQUFBLFNBQVM7Z0JBQzVCLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsSUFBSSxHQUFHLFlBQVksVUFBQSxTQUFTO2dCQUMxQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFakcsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUVBQXVFO1FBQ25JLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQXVCLEtBQXVCLEVBQUUsS0FBYTtZQUM3RSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNiLE9BQVUsS0FBSyxDQUFDO1lBRWxCLElBQUksSUFBSSxHQUFhLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsSUFBSSxFQUFFLEdBQVksS0FBSyxDQUFDO1lBRXhCLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUN0QixFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFckMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLFlBQVk7WUFDckIsT0FBMkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFBLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUVELElBQVcsZUFBZTtZQUN4QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsZUFBZTtnQkFDdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDcEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxTQUFTO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLENBQUUsV0FBVyxDQUFDLFVBQW1CLEtBQUs7WUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxDQUFDO2dCQUNYLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQzdCLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsR0FBWTtZQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLDBDQUFxQixDQUFDLDZDQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLDBDQUFxQixDQUFDLDZDQUFzQixDQUFDLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsb0JBQW9CO1FBQ3BCOztXQUVHO1FBQ0ksU0FBUztZQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXO1lBQ2hCLElBQUksUUFBUSxHQUFTLElBQUksQ0FBQztZQUMxQixPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLElBQUksUUFBUSxHQUFTLElBQUksQ0FBQztZQUMxQixJQUFJLElBQUksR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDaEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsTUFBYztZQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksV0FBVztZQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNJLGlCQUFpQixDQUFDLEtBQWE7WUFDcEMsSUFBSSxLQUFLLEdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQztZQUNuRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFtQk0sUUFBUSxDQUFDLE1BQVksRUFBRSxNQUFlO1lBQzNDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLFNBQVM7Z0JBQ3ZELG1DQUFtQztnQkFDbkMsT0FBTztZQUVULElBQUksWUFBWSxHQUFZLEtBQUssQ0FBQztZQUNsQyxJQUFJLGFBQWEsR0FBUyxVQUFBLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIsT0FBTyxRQUFRLEVBQUUsQ0FBQztnQkFDaEIsUUFBUSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLENBQUM7Z0JBQzNELElBQUksUUFBUSxJQUFJLE1BQU07b0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDLENBQUM7O29CQUU1RyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixDQUFDO1lBRUQsSUFBSSxjQUFjLEdBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUN6QyxJQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2dCQUNyRSxNQUFNLEVBQUUsQ0FBQztZQUVYLElBQUksY0FBYztnQkFDaEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLHlDQUFxQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkUsSUFBSSxZQUFZO2dCQUNkLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLDBEQUEwQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksV0FBVyxDQUFDLE1BQVk7WUFDN0IsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxJQUFJLEtBQUssR0FBRyxDQUFDO2dCQUNYLE9BQU87WUFFVCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyx5Q0FBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLDhDQUF1QixDQUFDLENBQUM7WUFDeEQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyw0REFBMEIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxpQkFBaUI7WUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxPQUFhO1lBQzVCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksWUFBWSxDQUFDLFFBQWMsRUFBRSxLQUFXO1lBQzdDLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsSUFBSSxLQUFLLEdBQUcsQ0FBQztnQkFDWCxPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxnQkFBd0I7WUFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxjQUFjLENBQUMsU0FBZTtZQUNuQyxJQUFJLElBQUksR0FBUyxJQUFJLENBQUM7WUFDdEIsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVM7Z0JBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksY0FBYyxDQUFDLFFBQWlCO1lBQ3JDLElBQUksWUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixLQUFLLE1BQU0sYUFBYSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxnQkFBZ0IsR0FBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG9EQUFvRDtvQkFDeEgsSUFBSSxlQUFlLEdBQWMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDcEUsSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLElBQUksZUFBZSxJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUNsRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDOzRCQUNoQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDOUQsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzNCLEtBQUssTUFBTSxTQUFTLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMxQyxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUMxRCxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDekQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxhQUFhO1FBRWIscUJBQXFCO1FBQ3JCOztXQUVHO1FBQ0ksZ0JBQWdCO1lBQ3JCLElBQUksR0FBRyxHQUFnQixFQUFFLENBQUM7WUFDMUIsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxhQUFhLENBQXNCLE1BQW1CO1lBQzNELE9BQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNEOztXQUVHO1FBQ0ksWUFBWSxDQUFzQixNQUFtQjtZQUMxRCxJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUk7Z0JBQ04sT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsVUFBcUI7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxZQUFZLENBQUMsVUFBcUI7WUFDdkMsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQ3pCLE9BQU87WUFDVCxJQUFJLE9BQU8sR0FBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBSSxPQUFPLEtBQUssU0FBUztnQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDN0MsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxXQUFXO2dCQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsVUFBVSxDQUFDLElBQUksc0VBQXNFLENBQUMsQ0FBQzs7Z0JBRXBILE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFM0IsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSywwQ0FBcUIsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLFdBQVcsMkNBQXNCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUNuSSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsVUFBcUI7WUFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxnQkFBZ0IsQ0FBQyxNQUEyQjtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxlQUFlLENBQUMsVUFBcUI7WUFDMUMsSUFBSSxDQUFDO2dCQUNILElBQUksZ0JBQWdCLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLE9BQU8sR0FBVyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNELElBQUksT0FBTyxHQUFHLENBQUM7b0JBQ2IsT0FBTztnQkFDVCxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxnREFBd0IsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxXQUFXLGlEQUF5QixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7Z0JBQ3ZJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFVBQVUsbUJBQW1CLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzVGLENBQUM7UUFDSCxDQUFDO1FBQ0QsYUFBYTtRQUViLHdCQUF3QjtRQUNqQixTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3BCLENBQUM7WUFFRixJQUFJLFVBQVUsR0FBa0IsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUM7b0JBQ25DLFNBQVM7Z0JBRVgsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzVDLGdEQUFnRDtvQkFDaEQsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7WUFDRCxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBRXpDLElBQUksUUFBUSxHQUFvQixFQUFFLENBQUM7WUFDbkMsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7WUFFckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssOENBQXVCLENBQUMsQ0FBQztZQUNyRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsZ0RBQWdEO1lBRWhELCtFQUErRTtZQUMvRSxLQUFLLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDM0MsS0FBSyxJQUFJLG1CQUFtQixJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsSUFBSSxxQkFBcUIsR0FBeUIsTUFBTSxVQUFBLFVBQVUsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDcEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksY0FBYyxDQUFDLFFBQVE7Z0JBQ3pCLEtBQUssSUFBSSxlQUFlLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwRCxJQUFJLGlCQUFpQixHQUFlLE1BQU0sVUFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNsRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3RDLENBQUM7WUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxrREFBeUIsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMzQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxrREFBeUIsQ0FBQyxDQUFDO1lBRTlELHdDQUF3QztZQUN4Qyw2REFBNkQ7WUFDN0QsbURBQW1EO1lBQ25ELHdGQUF3RjtZQUN4RixvRkFBb0Y7WUFDcEYsb0ZBQW9GO1lBQ3BGLEtBQUs7WUFDTCwrRUFBK0U7WUFDL0UsK0VBQStFO1lBRS9FLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELGFBQWE7UUFFTixRQUFRO1lBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFFRDs7V0FFRztRQUNJLGlCQUFpQixDQUFDLFFBQWMsSUFBSSxFQUFFLFNBQWlCLENBQUM7WUFDN0Qsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxLQUFLO2dCQUNSLEtBQUssR0FBRyxJQUFJLENBQUM7WUFFZixJQUFJLE1BQU0sR0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLElBQUksTUFBTSxHQUFXLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDdkQsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztZQUN2RixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDdkMsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELGlCQUFpQjtRQUNqQjs7O1dBR0c7UUFDSSxnQkFBZ0IsQ0FBQyxLQUFxQixFQUFFLFFBQThCLEVBQUUsV0FBa0QsS0FBSztZQUNwSSxJQUFJLGFBQWEsR0FBMkIsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUN2QixhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVCLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNEOztXQUVHO1FBQ0ksbUJBQW1CLENBQUMsS0FBcUIsRUFBRSxRQUE4QixFQUFFLFdBQWtELEtBQUs7WUFDdkksSUFBSSxnQkFBZ0IsR0FBMkIsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZHLElBQUksZ0JBQWdCO2dCQUNsQixLQUFLLElBQUksQ0FBQyxHQUFXLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQzNELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUTt3QkFDakMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNJLGFBQWEsQ0FBQyxNQUFhO1lBQ2hDLElBQUksU0FBUyxHQUFXLEVBQUUsQ0FBQztZQUMzQixJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIseUJBQXlCO1lBQ3pCLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekUsNEZBQTRGO1lBQzVGLE9BQU8sUUFBUSxDQUFDLE1BQU07Z0JBQ3BCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBTyxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEcsZ0JBQWdCO1lBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLEtBQUssSUFBSSxDQUFDLEdBQVcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLFFBQVEsR0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUVELGVBQWU7WUFDZixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN4RixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO1lBRWQsZUFBZTtZQUNmLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELElBQUksUUFBUSxHQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxzRUFBc0U7UUFDckYsQ0FBQztRQUNEOztXQUVHO1FBQ0kseUJBQXlCLENBQUMsTUFBYTtZQUM1QyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN4RixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywyRUFBMkU7WUFDcEksT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0Q7OztXQUdHO1FBQ0ksY0FBYyxDQUFDLE1BQWE7WUFDakMsbUNBQW1DO1lBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFTyx1QkFBdUIsQ0FBQyxNQUFhO1lBQzNDLHFCQUFxQjtZQUNyQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksUUFBUSxHQUEyQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFFBQVEsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyx1RUFBdUU7Z0JBQ2pHLEtBQUssSUFBSSxPQUFPLElBQUksUUFBUTtvQkFDMUIsYUFBYTtvQkFDYixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLHlDQUF5QztnQkFDekMsd0RBQXdEO2dCQUN4RCx1QkFBdUI7Z0JBQ3ZCLE1BQU07WUFDUixDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7UUFFTyxhQUFhLENBQUMsVUFBa0MsRUFBRSxNQUFhO1lBQ3JFLElBQUksVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUN4QixLQUFLLElBQUksT0FBTyxJQUFJLFVBQVU7b0JBQzVCLGFBQWE7b0JBQ2IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7S0FFRjtJQS9tQlksY0FBSSxPQSttQmhCLENBQUE7QUFDSCxDQUFDLEVBMW5CUyxTQUFTLEtBQVQsU0FBUyxRQTBuQmxCO0FDMW5CRCxrREFBa0Q7QUFDbEQsK0NBQStDO0FBQy9DLElBQVUsU0FBUyxDQWlIbEI7QUFuSEQsa0RBQWtEO0FBQ2xELCtDQUErQztBQUMvQyxXQUFVLFNBQVM7SUFDakI7Ozs7T0FJRztJQUNILE1BQXNCLFNBQVUsU0FBUSxVQUFBLE9BQU87UUFHN0Msa0dBQWtHO2lCQUMzRSxjQUFTLEdBQXFCLFNBQVMsQUFBOUIsQ0FBK0I7UUFDL0QscUZBQXFGO2lCQUM5RCxlQUFVLEdBQXVCLEVBQUUsQUFBekIsQ0FBMEI7UUFJM0QsS0FBSyxDQUFxQjtRQUUxQjtZQUNFLEtBQUssRUFBRSxDQUFDO1lBTEEsY0FBUyxHQUFZLElBQUksQ0FBQztZQUMxQixXQUFNLEdBQVksSUFBSSxDQUFDO1lBQ2pDLFVBQUssR0FBZ0IsSUFBSSxDQUFDO1lBSXhCLElBQUksQ0FBQyxnQkFBZ0IsOEJBQWUsQ0FBQyxNQUFtQixFQUFFLEVBQUU7Z0JBQzFELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNmLHVFQUF1RTtvQkFDdkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUMvQixZQUFZO29CQUNaLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQTJCLElBQVksT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNILElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxXQUFXO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLElBQUk7WUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLEdBQVk7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxvREFBMEIsQ0FBQyx1REFBMkIsQ0FBQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksWUFBWSxDQUFDLFVBQXVCO1lBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxVQUFVO2dCQUMxQixPQUFPO1lBQ1QsSUFBSSxpQkFBaUIsR0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pDLElBQUksQ0FBQztnQkFDSCxJQUFJLGlCQUFpQjtvQkFDbkIsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsS0FBSztvQkFDWixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQVlELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUNwQixDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUMxRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssV0FBVztnQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDMUIsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQzNCLENBQUM7O0lBdkdtQixtQkFBUyxZQTBHOUIsQ0FBQTtBQUNILENBQUMsRUFqSFMsU0FBUyxLQUFULFNBQVMsUUFpSGxCO0FDbkhELElBQVUsU0FBUyxDQThFbEI7QUE5RUQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLGNBQWM7UUFDekIsT0FBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixNQUFNLEdBQWEsSUFBSSxLQUFLLEVBQUssQ0FBQztRQUNsQyxzQkFBc0I7UUFFdEIsb0NBQW9DO1FBQ3BDLGtEQUFrRDtRQUNsRCx3QkFBd0I7UUFDeEIsSUFBSTtRQUVKLElBQVcsTUFBTTtZQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxLQUFLO1lBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFFRDs7V0FFRztRQUNJLElBQUksQ0FBQyxNQUFTO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksR0FBRztZQUNSLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOzs7V0FHRztRQUNILHdCQUF3QjtRQUN4Qiw2Q0FBNkM7UUFDN0Msc0JBQXNCO1FBQ3RCLDBDQUEwQztRQUMxQyxNQUFNO1FBQ04sZ0RBQWdEO1FBQ2hELHdDQUF3QztRQUN4QyxJQUFJO1FBRUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLEtBQTZCO1lBQzVDLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0Y7SUF2RVksd0JBQWMsaUJBdUUxQixDQUFBO0FBQ0gsQ0FBQyxFQTlFUyxTQUFTLEtBQVQsU0FBUyxRQThFbEI7QUM5RUQsSUFBVSxTQUFTLENBc0JsQjtBQXRCRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxjQUFjO1FBRXpCOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBc0IsRUFBRSxTQUFnQztZQUMzRSxJQUFJLFNBQVMsR0FBYSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMscUNBQXFDLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM3RCxLQUFLLEVBQUUsU0FBUzthQUNqQixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0Y7SUFmWSx3QkFBYyxpQkFlMUIsQ0FBQTtBQUNILENBQUMsRUF0QlMsU0FBUyxLQUFULFNBQVMsUUFzQmxCO0FDdEJELElBQVUsU0FBUyxDQXNJbEI7QUF0SUQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsb0JBQW9CO1FBQy9COztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFzQixFQUFFLFFBQStCO1lBQzVFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtnQkFDaEQsS0FBSyxFQUFFLG9CQUFvQixDQUFDLFVBQVU7YUFDdkMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFO2dCQUNuRCxLQUFLLEVBQUUsb0JBQW9CLENBQUMsYUFBYTthQUMxQyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUU7Z0JBQ25ELEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxhQUFhO2FBQzFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxVQUFVO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFdkIsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGFBQWE7WUFDekIsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRVMsTUFBTSxDQUFDLGFBQWE7WUFDNUIsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLE9BQU8sR0FBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRWpELElBQUksQ0FBQztnQkFDSCxJQUFJLFNBQVMsR0FBZ0IsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRyxJQUFJLFdBQVcsR0FBZ0IsYUFBYSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUVySCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQWMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsVUFBQSxXQUFXLENBQUMsTUFBTSxDQUFjLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTFCLElBQUksS0FBSyxHQUFXLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ3BELENBQUM7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLEVBQUUsQ0FBQztnQkFFakMsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxVQUFBLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hGLElBQUksVUFBVSxJQUFJLHNCQUFzQixDQUFDLGFBQWE7b0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQUEsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFL0UsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBQSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLFVBQVUsSUFBSSxzQkFBc0IsQ0FBQyxhQUFhO29CQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFBLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTdFLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFVBQUEsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekUsSUFBSSxVQUFVLElBQUksc0JBQXNCLENBQUMsYUFBYTtvQkFDcEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBQSxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlFLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQztZQUNYLENBQUM7WUFFRCxTQUFTLGFBQWEsQ0FBQyxXQUFtQixFQUFFLFdBQW1CO2dCQUM3RCxJQUFJLFdBQVcsR0FBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksS0FBSyxHQUFXLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQ2pCLFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFFdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztnQkFDRCxvQ0FBb0M7Z0JBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pGLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDMUMsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1lBRUQsU0FBUyxnQkFBZ0I7Z0JBQ3ZCLElBQUksa0JBQWtCLEdBQStCLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxjQUFjLEdBQVcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN6RyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2hELElBQUksYUFBYSxHQUFvQixVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQWtCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTTtvQkFDUixDQUFDO29CQUVELGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFL0YsQ0FBQztnQkFDRCxPQUFPLGtCQUFrQixDQUFDO1lBQzVCLENBQUM7WUFFRCxTQUFTLGNBQWM7Z0JBQ3JCLElBQUksZ0JBQWdCLEdBQTZDLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxZQUFZLEdBQVcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckcsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM5QyxJQUFJLElBQUksR0FBb0IsVUFBQSxXQUFXLENBQUMsTUFBTSxDQUFrQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25HLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDVixNQUFNO29CQUNSLENBQUM7b0JBQ0QsSUFBSSxRQUFRLEdBQXlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRixJQUFJLFFBQVE7d0JBQ1YsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBdUIsUUFBUSxDQUFDLENBQUM7Z0JBQ3JGLENBQUM7Z0JBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztLQUNGO0lBL0hZLDhCQUFvQix1QkErSGhDLENBQUE7QUFDSCxDQUFDLEVBdElTLFNBQVMsS0FBVCxTQUFTLFFBc0lsQjtBQ3RJRCxJQUFVLFNBQVMsQ0E0RWxCO0FBNUVELFdBQVUsU0FBUztJQUVqQjs7O09BR0c7SUFDSCxNQUFhLGtCQUFtQixTQUFRLFVBQUEsY0FBYztRQUNwRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBc0IsRUFBRSxRQUErQjtZQUM1RSxVQUFBLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVTLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBb0IsT0FBc0IsRUFBRSxZQUErQjtZQUMzRyxJQUFJLE9BQU8sR0FBeUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRSxJQUFJLEtBQUssR0FBVSxVQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEUsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRVMsTUFBTSxDQUFDLG1CQUFtQixDQUFzQixPQUFzQixFQUFFLFlBQStCO1lBQy9HLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3ZFLElBQUksT0FBNkIsQ0FBQztZQUNsQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFDLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUMsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwRSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFUyxNQUFNLENBQUMsa0JBQWtCLENBQXFCLE9BQXNCLEVBQUUsWUFBK0I7WUFDN0csa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFdkUsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVTLE1BQU0sQ0FBQywyQkFBMkIsQ0FBOEIsT0FBc0IsRUFBRSxZQUErQjtZQUMvSCxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV6RSxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRVMsTUFBTSxDQUFDLGtDQUFrQyxDQUFxQyxPQUFzQixFQUFFLFlBQStCO1lBQzdJLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRWpGLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBRVMsTUFBTSxDQUFDLGNBQWMsQ0FBaUIsT0FBc0IsRUFBRSxZQUErQjtZQUNyRyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV6RSxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUVTLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBaUIsT0FBc0IsRUFBRSxZQUErQjtZQUM3RyxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVqRixJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0YsQ0FBQztLQUNGO0lBckVZLDRCQUFrQixxQkFxRTlCLENBQUE7QUFDSCxDQUFDLEVBNUVTLFNBQVMsS0FBVCxTQUFTLFFBNEVsQjtBQzVFRCxJQUFVLFNBQVMsQ0FxSGxCO0FBckhELFdBQVUsU0FBUztJQUVqQjs7O09BR0c7SUFDSCxNQUFhLGtCQUFrQjtRQUU3Qjs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBc0IsRUFBRSxRQUErQjtZQUM1RSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ2hFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0I7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFO2dCQUNoRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsZ0JBQWdCO2FBQzNDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtnQkFDbkUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLG1CQUFtQjthQUM5QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQjtZQUMvQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRztvQkFDeEIsUUFBUSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3JGLE9BQU8sRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7b0JBQzNGLE9BQU8sRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO29CQUNuRixVQUFVLEVBQUUsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztvQkFDekYsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7b0JBQ2pGLFFBQVEsRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNyRixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTTtpQkFDekMsQ0FBQztnQkFFRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztvQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0csSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87b0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFFL0IsU0FBUyxZQUFZLENBQUMsS0FBYSxFQUFFLE1BQStDO2dCQUNsRixNQUFNLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdkUsSUFBSSxNQUFNLEdBQWdCLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBYyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsZ0JBQWdCLENBQWEsT0FBc0IsRUFBRSxlQUEwQixFQUFFLGNBQXlCLEVBQUUsR0FBWTtZQUN2SSxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLGFBQWEsR0FBa0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFM0QsSUFBSSxPQUE2QixDQUFDO1lBRWxDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFNUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFL0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksWUFBWSxHQUFjLFVBQUEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0Isa0JBQWtCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0Qsa0JBQWtCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUQsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsa0JBQWtCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUQsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFOUQsTUFBTSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUU3RCxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwRixPQUFPLGFBQWEsQ0FBQztZQUVyQixTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxPQUFvQixFQUFFLEtBQWE7Z0JBQzVFLElBQUksU0FBUyxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksU0FBUyxJQUFJLFNBQVM7b0JBQ3hCLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEYsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsbUJBQW1CLENBQUMsY0FBNkI7WUFDaEUsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUE5R1ksNEJBQWtCLHFCQThHOUIsQ0FBQTtBQUNILENBQUMsRUFySFMsU0FBUyxLQUFULFNBQVMsUUFxSGxCO0FDckhELElBQVUsU0FBUyxDQTBTbEI7QUExU0QsV0FBVSxTQUFTO0lBRWpCLElBQWlCLFlBQVksQ0FvQzVCO0lBcENELFdBQWlCLFlBQVk7UUFFM0IsSUFBWSxRQVlYO1FBWkQsV0FBWSxRQUFRO1lBQ2xCLG1CQUFtQjtZQUNuQixpQ0FBcUIsQ0FBQTtZQUNyQix1Q0FBMkIsQ0FBQTtZQUMzQiw2Q0FBaUMsQ0FBQTtZQUNqQyxpQ0FBcUIsQ0FBQTtZQUNyQiw2QkFBaUIsQ0FBQTtZQUNqQiwyQkFBZSxDQUFBO1lBQ2YsdUNBQTJCLENBQUE7WUFDM0Isc0NBQTBCLENBQUE7WUFDMUIsNkJBQWlCLENBQUE7WUFDakIsd0NBQTRCLENBQUE7UUFDOUIsQ0FBQyxFQVpXLFFBQVEsR0FBUixxQkFBUSxLQUFSLHFCQUFRLFFBWW5CO1FBRVksd0NBQTJCLEdBQStDO1lBQ3JGLG9DQUFvQztZQUNwQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztTQUN4QyxDQUFDO1FBRVcsaUNBQW9CLEdBQThCO1lBQzdELGNBQWMsRUFBRSwyQkFBMkI7WUFDM0MsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxVQUFVLEVBQUUsdUJBQXVCO1lBQ25DLFVBQVUsRUFBRSxhQUFhO1NBQzFCLENBQUM7SUFDSixDQUFDLEVBcENnQixZQUFZLEdBQVosc0JBQVksS0FBWixzQkFBWSxRQW9DNUI7SUFFRDs7OztPQUlHO0lBQ0gsTUFBYSxrQ0FBbUMsU0FBUSxVQUFBLG9CQUFvQjtpQkFDbkQsY0FBUyxHQUFpRDtZQUMvRSw4REFBOEQ7WUFDOUQsa0NBQWtDO1lBQ2xDLEtBQUs7WUFDTCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzFELE9BQU8sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBb0IsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxNQUFNLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUM3RCxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQW9CLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFlBQVksTUFBTSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDNUcsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLE1BQU0sTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQzVHLENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzFELE9BQU8sSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbkQsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDeEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxZQUFZLEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2hILENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQ3ZELE9BQU8sT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDckQsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUNoRixDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUN4RCxPQUFPLHFCQUFxQixDQUFDLGtDQUFrQyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHlFQUF5RSxDQUFDO1lBQ2pMLENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzlELE9BQU8sSUFBSSxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3ZJLENBQUM7U0FDRixDQUFDO2lCQUVhLDRCQUF1QixHQUFXLENBQUMsQ0FBQztRQUU1QyxNQUFNLENBQVUsUUFBUSxDQUFDLFlBQXNCLEVBQUUsUUFBK0I7WUFDckYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsRUFBRTtnQkFDckUsS0FBSyxFQUFFLGtDQUFrQyxDQUFDLHFCQUFxQjthQUNoRSxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUseUJBQXlCLEVBQUU7Z0JBQ3ZFLEtBQUssRUFBRSxrQ0FBa0MsQ0FBQyx1QkFBdUI7YUFDbEUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVEOztXQUVHO1FBQ08sTUFBTSxDQUFDLHFCQUFxQjtZQUNwQyxJQUFJLElBQUksR0FBd0IsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMxQyxJQUFJLFFBQVEsR0FBa0MsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUM3RCxJQUFJLFFBQVEsR0FBa0MsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUU3RCxrQ0FBa0MsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7WUFFL0QsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLGtCQUFrQjtpQkFDekMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLDRCQUE0QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQkFDdkgsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGtDQUFrQyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUNySCxPQUFPLENBQUMsZUFBZSxFQUFFLGtDQUFrQyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDdkcsT0FBTyxDQUFDLGVBQWUsRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUM3RSxPQUFPLENBQUMsZUFBZSxFQUFFLGtDQUFrQyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDdkcsT0FBTyxDQUFDLGVBQWUsRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUM3RSxVQUFVLENBQUMsWUFBWSxFQUFFLGtDQUFrQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDTyxNQUFNLENBQUMsdUJBQXVCO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0osQ0FBQztRQUVELHlCQUF5QjtRQUVqQixNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBNEMsRUFBRSxjQUFvRDtZQUNqSSxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUUzQixPQUFPLFVBQVU7aUJBQ2QsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDcEssR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxTQUFTLENBQUMsSUFBSSxNQUFNLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztpQkFDakUsTUFBTSxDQUFDLENBQUMsWUFBb0IsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxLQUFLLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFTyxNQUFNLENBQUMsdUJBQXVCLENBQUMsZ0JBQWlELEVBQUUsYUFBZ0M7WUFDeEgsSUFBSSxDQUFDLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBRWpFLElBQUksZUFBZSxHQUE4RSxnQkFBZ0I7aUJBQzlHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDWCxJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsY0FBYyxLQUFLLE9BQU8sQ0FBQztnQkFDeEQsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDNUUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBNkIsQ0FBQztnQkFFbkosT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUVMLElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztZQUN0QixJQUFJLElBQUksZUFBZTtpQkFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFjLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxRQUFRLEdBQVcsTUFBTSxHQUFHLGFBQWEsQ0FBQztnQkFDOUMsSUFBSSxlQUFlLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2hDLElBQUksU0FBUyxHQUErQixDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLE1BQU0sVUFBQSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzlGLE9BQU8sa0JBQWtCLFFBQVEsTUFBTSxTQUFTLENBQUMsRUFBRSxDQUFDOytCQUNqQyxRQUFRLE1BQU0sU0FBUyxDQUFDLEVBQUUsQ0FBQzsrQkFDM0IsUUFBUSxNQUFNLFNBQVMsQ0FBQyxFQUFFLENBQUM7MkJBQy9CLFFBQVEsbUJBQW1CLFFBQVE7MkJBQ25DLFFBQVEsbUJBQW1CLFFBQVE7MkJBQ25DLFFBQVEsbUJBQW1CLFFBQVE7MkJBQ25DLFFBQVEsbUJBQW1CLFFBQVE7MkJBQ25DLFFBQVEsbUJBQW1CLFFBQVE7MkJBQ25DLFFBQVEsbUJBQW1CLFFBQVEsTUFBTSxDQUFDO2dCQUMzRCxDQUFDOztvQkFDQyxPQUFPLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxlQUF1QixFQUFFLEVBQUUsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO2lCQUMxRCxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLEtBQUssS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEYsSUFBSSxJQUFJLElBQUksQ0FBQztZQUViLElBQUksSUFBSSxXQUFXLGFBQWEsS0FBSyxDQUFDO1lBQ3RDLElBQUksSUFBSSxlQUFlO2lCQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQWMsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsR0FBVyxNQUFNLEdBQUcsYUFBYSxDQUFDO2dCQUM5QyxRQUFRLGVBQWUsRUFBRSxDQUFDO29CQUN4QixLQUFLLFdBQVc7d0JBQ2QsT0FBTzs7OztnQkFJTCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDO29CQUM3QixLQUFLLFFBQVE7d0JBQ1gsT0FBTztxQkFDQSxRQUFRLFdBQVcsUUFBUSxVQUFVLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUTtxQkFDbkYsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxVQUFVLFFBQVEsV0FBVyxRQUFRO3FCQUN2TixRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxVQUFVLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFVBQVUsUUFBUSxXQUFXLFFBQVE7O2dCQUU1TixDQUFDO29CQUNMLEtBQUssT0FBTzt3QkFDVixPQUFPO2dCQUNMLEVBQUU7cUJBQ0csRUFBRTswQkFDRyxFQUFFOztnQkFFWixDQUFDO29CQUNMO3dCQUNFLE1BQU0sWUFBWSxVQUFBLGNBQWMsQ0FBQyxJQUFJLE1BQU0sZUFBZSwyQkFBMkIsQ0FBQztnQkFDMUYsQ0FBQztZQUNILENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJLElBQUksS0FBSyxDQUFDO1lBRWQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFpQztZQUM1RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUV2QixJQUFJLElBQUksR0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUQsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ3ZHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVkLE9BQU8sUUFBUSxJQUFJLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQW9DO1lBQ3BFLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLFVBQVUsR0FBYSxFQUFFLENBQUM7Z0JBQzlCLEtBQUssSUFBSSxLQUFLLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7Z0JBQ0QsT0FBTyxrQ0FBa0MsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9GLENBQUM7WUFFRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxZQUFZLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDaEgsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLEtBQUssR0FBVyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqRCxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEQsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLElBQUksR0FBVyxXQUFXLENBQUMsSUFBSTtxQkFDaEMsVUFBVSxDQUFDLHlCQUF5QixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksMEJBQTBCLEdBQUcsTUFBTSxDQUFDO3FCQUNuSSxVQUFVLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxHQUFHLGtDQUFrQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVqRSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLFlBQVksVUFBQSxjQUFjLENBQUMsSUFBSSwyREFBMkQsQ0FBQztRQUNuRyxDQUFDO1FBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQWdDLEVBQUUsV0FBcUI7WUFDckYsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUM7Z0JBQzFFLE1BQU0sWUFBWSxVQUFBLGNBQWMsQ0FBQyxJQUFJLE1BQU0sU0FBUyxvQkFBb0IsWUFBWSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDM0ksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUMxRCxPQUFPLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Z0JBRTVFLE1BQU0sWUFBWSxVQUFBLGNBQWMsQ0FBQyxJQUFJLE1BQU0sU0FBUyx1QkFBdUIsQ0FBQztRQUNoRixDQUFDO1FBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWE7WUFDM0MsSUFBSSxhQUFhLEdBQVcsb0JBQW9CLENBQUM7WUFDakQsSUFBSSxLQUFzQixDQUFDO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNuRCxJQUFJLGlCQUFpQixHQUFhLGtDQUFrQyxDQUFDLFNBQVMsQ0FBd0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3SCxJQUFJLENBQUMsaUJBQWlCO29CQUNwQixTQUFTO2dCQUVYLElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLGtCQUFrQixHQUFXLGFBQWEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pELE9BQU8sWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN4QixRQUFRLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7d0JBQ2xDLEtBQUssR0FBRzs0QkFDTixZQUFZLEVBQUUsQ0FBQzs0QkFDZixNQUFNO3dCQUNSLEtBQUssR0FBRzs0QkFDTixZQUFZLEVBQUUsQ0FBQzs0QkFDZixNQUFNO3dCQUNSLEtBQUssR0FBRzs0QkFDTixJQUFJLFlBQVksSUFBSSxDQUFDO2dDQUNuQixZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7NEJBQ3hDLE1BQU07b0JBQ1YsQ0FBQztvQkFDRCxrQkFBa0IsRUFBRSxDQUFDO2dCQUN2QixDQUFDO2dCQUVELElBQUksSUFBSSxHQUNOLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxZQUFZLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUU7b0JBQ3RJLE9BQU8sTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLFlBQVksQ0FBQyxDQUFDO3dCQUNkLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRVQsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDekcsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7SUExUFUsNENBQWtDLHFDQTRQOUMsQ0FBQTtBQUNILENBQUMsRUExU1MsU0FBUyxLQUFULFNBQVMsUUEwU2xCO0FDMVNELElBQVUsU0FBUyxDQW9FbEI7QUFwRUQsV0FBVSxTQUFTO0lBRWpCOzs7O09BSUc7SUFDSCxNQUFhLHFDQUFxQztRQUNoRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBc0IsRUFBRSxRQUErQjtZQUM1RSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM3RCxLQUFLLEVBQUUscUNBQXFDLENBQUMsYUFBYTthQUMzRCxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ2hFLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxnQkFBZ0I7YUFDOUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVTLE1BQU0sQ0FBQyxhQUFhO1lBQzVCLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixnQkFBZ0I7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw2SEFBNkg7Z0JBQ2pMLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxPQUFPLEdBQWlCLFVBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBZSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRTdELElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDMUQsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFFOUUsb0lBQW9JO2dCQUNwSSxJQUFJLGFBQWEsR0FBYSxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRTtvQkFDeEQsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFFcEMsSUFBSSxDQUFDO29CQUNILElBQUksQ0FBQyxVQUFVLENBQ2Isc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLEtBQUssRUFDeEosWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FDakMsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7b0JBQ2hCLFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztnQkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTNFLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2dCQUUxQixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFMUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQjtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTztZQUU3QixJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFekIsQ0FBQztLQUNGO0lBNURZLCtDQUFxQyx3Q0E0RGpELENBQUE7QUFDSCxDQUFDLEVBcEVTLFNBQVMsS0FBVCxTQUFTLFFBb0VsQjtBQ3BFRCxJQUFVLFNBQVMsQ0FtRmxCO0FBbkZELFdBQVUsU0FBUztJQVlqQjs7Ozs7T0FLRztJQUNILE1BQXNCLFFBQVE7aUJBQ2IsVUFBSyxHQUErQyxFQUFFLENBQUM7UUFFdEU7Ozs7V0FJRztRQUNJLE1BQU0sQ0FBQyxHQUFHLENBQW1ELEVBQWU7WUFDakYsSUFBSSxHQUFHLEdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLFNBQVMsR0FBMkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsR0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLFFBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDOztnQkFDQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQW1CLEVBQWU7WUFDbkQsT0FBVSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQWlCO1lBQ25DLGdEQUFnRDtZQUNoRCxvQkFBb0I7WUFDcEIsa0dBQWtHO1lBQ2xHLDZCQUE2QjtZQUM3QixzQ0FBc0M7WUFDdEMsZ0ZBQWdGO1lBQ2hGLHdCQUF3QjtZQUN4QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLFVBQUEsY0FBYyxFQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQW9CO1lBQ2pELEtBQUssTUFBTSxRQUFRLElBQUksVUFBVTtnQkFDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBSSxFQUFlO1lBQ25DLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksVUFBQSxjQUFjLEVBQVUsQ0FBQztRQUN6RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsT0FBTztZQUNuQixRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN0QixDQUFDOztJQS9EbUIsa0JBQVEsV0FnRTdCLENBQUE7QUFDSCxDQUFDLEVBbkZTLFNBQVMsS0FBVCxTQUFTLFFBbUZsQjtBQ25GRCxJQUFVLFNBQVMsQ0F3V2xCO0FBeFdELFdBQVUsU0FBUztJQUNqQjs7Ozs7OztPQU9HO0lBQ0gsTUFBYSxPQUFRLFNBQVEsVUFBQSxPQUFPO1FBSWxDLFlBQW1CLEtBQWEsQ0FBQyxFQUFFLEtBQWEsQ0FBQztZQUMvQyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxnQkFBZ0I7UUFDaEI7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLElBQUk7WUFDaEIsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQWlCLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ksTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFpQixDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFZLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBaUIsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFnQixFQUFFLGFBQXdCLEVBQUUsc0JBQStCLElBQUk7WUFDMUcsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxHQUFpQixhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FDUixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQ3BDLENBQUM7WUFFRixJQUFJLG1CQUFtQjtnQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFnQixFQUFFLFVBQWtCLENBQUM7WUFDL0QsSUFBSSxnQkFBZ0IsR0FBVyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7WUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxHQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFnQixFQUFFLE1BQWM7WUFDbEQsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUNuRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBbUI7WUFDdEMsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLEtBQUssSUFBSSxNQUFNLElBQUksUUFBUTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFpQixFQUFFLFdBQW9CO1lBQzlELE1BQU0sTUFBTSxHQUFZLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFXLEVBQUUsRUFBVztZQUMxQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFXLEVBQUUsRUFBVztZQUN4QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOzs7Ozs7OztXQVFHO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFnQixFQUFFLGFBQXNCLEtBQUs7WUFDcEUsSUFBSSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksVUFBVTtnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUVsQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFpQixDQUFDLEVBQUUsYUFBcUIsQ0FBQztZQUMxRCxJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxHQUFHLEdBQVMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQUEsSUFBSSxDQUFDLENBQUM7WUFDckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxZQUFZO1FBRVosbUJBQW1CO1FBQ25COztXQUVHO1FBQ0gsSUFBVyxTQUFTO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLGdCQUFnQjtZQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsR0FBRztZQUNaLElBQUksR0FBRyxHQUFTLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUUvQixJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQztnQkFDckIsT0FBTyxHQUFHLENBQUM7WUFFYixHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxHQUFHLENBQUMsSUFBVTtZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsT0FBTyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSSxJQUFJLENBQUMsU0FBa0I7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXFCLE1BQU0sQ0FBQyxPQUFPO1lBQ2xFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7V0FHRztRQUNJLEdBQUcsQ0FBQyxPQUFnQjtZQUN6QixJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFFBQVEsQ0FBQyxXQUFvQjtZQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLE9BQWU7WUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTLENBQUMsVUFBa0IsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksU0FBUyxDQUFDLGFBQXdCLEVBQUUsc0JBQStCLElBQUk7WUFDNUUsSUFBSSxXQUFXLEdBQVksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsUUFBaUI7WUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRDs7V0FFRztRQUNJLEdBQUcsQ0FBQyxRQUFpQjtZQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLEtBQWEsQ0FBQztZQUM3QixPQUFPLElBQUksVUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVE7WUFDYixJQUFJLE1BQU0sR0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDNUUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLEdBQUcsQ0FBQyxTQUE2RTtZQUN0RixJQUFJLElBQUksR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckQsZ0hBQWdIO1lBQ2hILGFBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQWtCLGNBQWMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7O2dCQUNDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksT0FBTyxHQUFZO2dCQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDckIsQ0FBQztZQUNGLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDUyxhQUFhLENBQUMsUUFBaUIsSUFBZ0IsQ0FBQztLQUUzRDtJQTlWWSxpQkFBTyxVQThWbkIsQ0FBQTtBQUNILENBQUMsRUF4V1MsU0FBUyxLQUFULFNBQVMsUUF3V2xCO0FDeFdELDZDQUE2QztBQUM3QyxpQ0FBaUM7QUFFakMsSUFBVSxTQUFTLENBcU5sQjtBQXhORCw2Q0FBNkM7QUFDN0MsaUNBQWlDO0FBRWpDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILElBQVksUUFVWDtJQVZELFdBQVksUUFBUTtRQUNsQiw2Q0FBYyxDQUFBO1FBQ2QsaURBQWdCLENBQUE7UUFDaEIsK0NBQWUsQ0FBQTtRQUNmLG9EQUFpQixDQUFBO1FBQ2pCLDRDQUFhLENBQUE7UUFDYixzREFBa0IsQ0FBQTtRQUNsQixvREFBaUIsQ0FBQTtRQUNqQix3REFBbUIsQ0FBQTtRQUNuQixzREFBa0IsQ0FBQTtJQUNwQixDQUFDLEVBVlcsUUFBUSxHQUFSLGtCQUFRLEtBQVIsa0JBQVEsUUFVbkI7SUFFRDs7O09BR0c7SUFDSCxNQUFhLFNBQVUsU0FBUSxVQUFBLE9BQU87UUFJcEMsWUFBbUIsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDLEVBQUUsU0FBaUIsQ0FBQyxFQUFFLFVBQWtCLENBQUMsRUFBRSxVQUFvQixRQUFRLENBQUMsT0FBTztZQUM5SCxLQUFLLEVBQUUsQ0FBQztZQUpILGFBQVEsR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUMxQyxTQUFJLEdBQVksVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTyxDQUFDLENBQUM7WUFJM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQWEsQ0FBQyxFQUFFLEtBQWEsQ0FBQyxFQUFFLFNBQWlCLENBQUMsRUFBRSxVQUFrQixDQUFDLEVBQUUsVUFBb0IsUUFBUSxDQUFDLE9BQU87WUFDN0gsSUFBSSxJQUFJLEdBQWMsVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFXLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLEtBQUs7WUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsSUFBSTtZQUNiLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0Q7O1dBRUc7UUFDSCxJQUFXLEdBQUc7WUFDWixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRDs7V0FFRztRQUNILElBQVcsTUFBTTtZQUNmLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBVyxDQUFDLENBQUMsRUFBVTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQVcsQ0FBQyxDQUFDLEVBQVU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFXLEtBQUssQ0FBQyxNQUFjO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBVyxNQUFNLENBQUMsT0FBZTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQVcsSUFBSSxDQUFDLE1BQWM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFXLEdBQUcsQ0FBQyxNQUFjO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBVyxLQUFLLENBQUMsTUFBYztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUNELElBQVcsTUFBTSxDQUFDLE1BQWM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFXLEtBQUs7WUFDZCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksSUFBSSxDQUFDLEtBQWdCO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVEOztXQUVHO1FBQ0ksa0JBQWtCLENBQUMsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDLEVBQUUsU0FBaUIsQ0FBQyxFQUFFLFVBQWtCLENBQUMsRUFBRSxVQUFvQixRQUFRLENBQUMsT0FBTztZQUNySSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsUUFBUSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQUMsTUFBTTtnQkFDdkMsS0FBSyxJQUFJO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUFDLE1BQU07Z0JBQ3BELEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO29CQUFDLE1BQU07WUFDbEQsQ0FBQztZQUNELFFBQVEsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUN2QixLQUFLLElBQUk7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUFDLE1BQU07Z0JBQ3ZDLEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFBQyxNQUFNO2dCQUNyRCxLQUFLLElBQUk7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztvQkFBQyxNQUFNO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQWtCO1lBQ3BELElBQUksTUFBTSxHQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdkMsTUFBTSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFFBQVEsQ0FBQyxNQUFlO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksUUFBUSxDQUFDLEtBQWdCO1lBQzlCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLGVBQWUsQ0FBQyxLQUFnQjtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDO1lBRWQsSUFBSSxZQUFZLEdBQWMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5QyxZQUFZLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBRTNFLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7T0FFRDtRQUNRLE1BQU0sQ0FBQyxLQUFnQjtZQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsSUFBSSxNQUFNLEdBQVcsd0JBQXdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RHLE1BQU0sSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekosT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQixJQUFlLENBQUM7S0FDMUQ7SUFoTVksbUJBQVMsWUFnTXJCLENBQUE7QUFDSCxDQUFDLEVBck5TLFNBQVMsS0FBVCxTQUFTLFFBcU5sQjtBQ3hORCx3Q0FBd0M7QUFDeEMsOENBQThDO0FBQzlDLDRDQUE0QztBQUM1Qyw0Q0FBNEM7QUFDNUMsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCwyQ0FBMkM7QUFFM0MsSUFBVSxTQUFTLENBdTJCbEI7QUEvMkJELHdDQUF3QztBQUN4Qyw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBQzVDLDRDQUE0QztBQUM1Qyw0REFBNEQ7QUFDNUQsK0RBQStEO0FBQy9ELDJDQUEyQztBQUUzQyxXQUFVLFNBQVM7SUFDakIsMkNBQTJDO0lBSTNDLElBQVksS0FFWDtJQUZELFdBQVksS0FBSztRQUNmLHFDQUFNLENBQUE7UUFBRSwrQ0FBVyxDQUFBO1FBQUUseUNBQVEsQ0FBQTtRQUFFLCtDQUFXLENBQUE7UUFBRSx5Q0FBUSxDQUFBO0lBQ3RELENBQUMsRUFGVyxLQUFLLEdBQUwsZUFBSyxLQUFMLGVBQUssUUFFaEI7SUFFRCxJQUFZLGNBRVg7SUFGRCxXQUFZLGNBQWM7UUFDeEIscURBQUssQ0FBQTtRQUFFLG1EQUFJLENBQUE7UUFBRSxxREFBSyxDQUFBO1FBQUUsK0RBQVUsQ0FBQTtRQUFFLHlEQUFPLENBQUE7UUFBRSw2REFBUyxDQUFBO1FBQUUscUVBQWEsQ0FBQTtRQUFFLHVEQUFNLENBQUE7SUFDM0UsQ0FBQyxFQUZXLGNBQWMsR0FBZCx3QkFBYyxLQUFkLHdCQUFjLFFBRXpCO0lBRUQsNkVBQTZFO0lBQ2hFLHdCQUFjLEdBQUc7UUFDNUIsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsSUFBSSxFQUFFLEtBQUs7WUFDWCxPQUFPLEVBQUUsQ0FBQztTQUNYO0tBQ0YsQ0FBQztJQUVXLDBCQUFnQixHQUFHO1FBQzlCLEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxRQUFRO1lBQ3JDLEtBQUssRUFBRSxDQUFDLENBQUMsaUVBQWlFO1NBQzNFO1FBQ0QsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFLGFBQWE7WUFDdEIsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFFBQVE7WUFDckMsS0FBSyxFQUFFLENBQUM7U0FDVDtRQUNELFFBQVEsRUFBRTtZQUNSLE9BQU8sRUFBRSwrQkFBK0I7WUFDeEMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFFBQVE7WUFDckMsS0FBSyxFQUFFLENBQUM7U0FDVDtRQUNELElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxXQUFXLEVBQUUsc0NBQXNDO1lBQzVELElBQUksRUFBRSxzQkFBc0IsQ0FBQyxRQUFRO1lBQ3JDLEtBQUssRUFBRSxDQUFDO1NBQ1Q7UUFDRCxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsV0FBVztZQUNwQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsUUFBUTtZQUNyQyxLQUFLLEVBQUUsQ0FBQztTQUNUO0tBQ08sQ0FBQztJQUVYOzs7T0FHRztJQUNILE1BQXNCLFdBQVksU0FBUSxVQUFBLGlCQUFpQjtpQkFDeEMsU0FBSSxHQUEyQixXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBRTFELGVBQVUsR0FBYyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFxQm5FOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFvQixFQUFFLE1BQWdCO1lBQzdELElBQUksV0FBVyxHQUFZLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBWSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztZQUNuRyxJQUFJLFNBQVM7Z0JBQ1gsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLHFIQUFxSCxDQUFDLENBQUM7WUFDckksSUFBSSxpQkFBaUIsR0FBMkI7Z0JBQzlDLEtBQUssRUFBRSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEtBQUs7Z0JBQ2xFLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixrQkFBa0IsRUFBRSxLQUFLO2dCQUN6QixPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7WUFDRixVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN6RCxJQUFJLE1BQU0sR0FBc0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRSxJQUFJLElBQTRCLENBQUM7WUFDakMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQ3ZCLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLEVBQzlDLG1DQUFtQyxDQUNwQyxDQUFDO1lBQ0YsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDeEIsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJELFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3BDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRWhDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9CLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7OztVQUlFO1FBQ0ssTUFBTSxDQUFDLE1BQU0sQ0FBSSxNQUFnQixFQUFFLFdBQW1CLEVBQUU7WUFDN0QsSUFBSSxNQUFNLEtBQUssSUFBSTtnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxrQkFBa0IsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4SCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBUztZQUNyQixPQUEwQixXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLCtCQUErQjtRQUNwRixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsbUJBQW1CO1lBQy9CLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsYUFBYTtZQUN6QixJQUFJLE1BQU0sR0FBeUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0UsT0FBTyxVQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWMsRUFBRSxPQUFlO1lBQ3pELFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDdkMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUMzQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQWdCO1lBQy9DLFdBQVcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZGLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQWMsRUFBRSxVQUFtQixJQUFJLEVBQUUsU0FBa0IsSUFBSSxFQUFFLFdBQW9CLElBQUk7WUFDM0csV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM1RixJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7WUFDckIsSUFBSSxPQUFPO2dCQUNULElBQUksSUFBSSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRCxJQUFJLE1BQU07Z0JBQ1IsSUFBSSxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDO1lBQ2xELElBQUksUUFBUTtnQkFDVixJQUFJLElBQUksc0JBQXNCLENBQUMsa0JBQWtCLENBQUM7WUFDcEQsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUF5QjtZQUMxRCxXQUFXLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUNsQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsZ0JBQWdCO1lBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGtCQUFrQjtZQUM5QixPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFjO1lBQ3ZDLElBQUksS0FBSztnQkFDUCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Z0JBRTNELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUE0QixjQUFjLENBQUMsSUFBSTtZQUM1RSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFjLEVBQUUsRUFBVyxFQUFFLEVBQVcsRUFBRSxNQUFlLEVBQUUsT0FBZ0I7WUFDdEcsSUFBSSxLQUFLO2dCQUNQLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDOztnQkFFN0QsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEUsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQVcsRUFBRSxFQUFXLEVBQUUsRUFBVyxFQUFFLEVBQVc7WUFDaEYsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLE1BQWMsRUFBRSxPQUFlO1lBQy9FLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBWTtZQUNyQyxRQUFRLEtBQUssRUFBRSxDQUFDO2dCQUNkLEtBQUssS0FBSyxDQUFDLE1BQU07b0JBQ2YsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEYsTUFBTTtnQkFDUixLQUFLLEtBQUssQ0FBQyxXQUFXO29CQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEUsc0dBQXNHO29CQUN0RyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDekcsTUFBTTtnQkFDUixLQUFLLEtBQUssQ0FBQyxRQUFRO29CQUNqQixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEUsc0ZBQXNGO29CQUN0RixXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pGLE1BQU07Z0JBQ1IsS0FBSyxLQUFLLENBQUMsV0FBVztvQkFDcEIsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDN0Usc0ZBQXNGO29CQUN0RixXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pGLE1BQU07Z0JBQ1IsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLDJHQUEyRztvQkFDOUgsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUMzRztvQkFDRSxNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBZ0I7WUFDL0MsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxHQUFpQixJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMxRCxJQUFJLFFBQVEsR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLHFCQUFxQjtZQUNqQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1lBRS9GLFdBQVcsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBbUIsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDakcsV0FBVyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFtQixXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNqRyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUM3QixXQUFXLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFFL0UsV0FBVyxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNHLFdBQVcsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5RyxXQUFXLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUcsV0FBVyxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xILFdBQVcsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzRyxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUcsV0FBVyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRS9HLFdBQVcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtnQkFDakUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXRILFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUYsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEwsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkwsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakwsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFOUwsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRixXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvSyxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVuTCxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFM0UsU0FBUyxhQUFhLENBQUMsT0FBZSxFQUFFLEtBQWE7Z0JBQ25ELE1BQU0sSUFBSSxHQUEyQixXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN0RCxNQUFNLE9BQU8sR0FBaUIsV0FBVyxDQUFDLE1BQU0sQ0FBZSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMxRyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDMUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BHLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxpQkFBaUI7WUFDN0IsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUU5SyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsK0ZBQStGO1lBQy9GLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV6SyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXpLLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXZNLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLE9BQU8sR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdkcsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hMLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBVyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBZSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0csSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxpQkFBaUI7UUFDakI7Ozs7OztXQU1HO1FBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBSSxLQUFVLEVBQUUsVUFBMkIsRUFBRSxLQUEwRDtZQUMzSCxNQUFNLElBQUksR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztZQUMzTixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbE0sSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXBELGdDQUFnQztZQUNoQyxVQUFBLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQUEsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLFVBQUEsa0JBQWtCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFBLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXhFLGdDQUFnQztZQUNoQyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QyxJQUFJLEtBQUssR0FBVyxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTVDLG1CQUFtQjtZQUNuQix3R0FBd0c7WUFDeEcsSUFBSSxJQUFJLEdBQWUsSUFBSSxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RCxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWhILElBQUksTUFBTSxHQUFXLEVBQUUsQ0FBQztZQUN4QixJQUFJLGNBQWMsR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdFLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlDLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDOUQsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLGtCQUFrQjtvQkFDbEMsU0FBUztnQkFDWCxJQUFJLElBQUksR0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7Z0JBRXJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztZQUVELFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRS9CLE9BQU8sTUFBTSxDQUFDO1lBRWQsU0FBUyxxQkFBcUIsQ0FBQyxXQUF1QixFQUFFLE1BQWM7Z0JBQ3BFLElBQUksTUFBTSxHQUFnQixJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLEdBQWEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUVELFNBQVMsbUJBQW1CLENBQUMsV0FBdUIsRUFBRSxNQUFjO2dCQUNsRSxJQUFJLE1BQU0sR0FBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksSUFBSSxHQUFhLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMzSCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLFVBQTJCO1lBQy9ELElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBQztZQUV2QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixJQUFJLE9BQU8sR0FBa0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLFdBQVcsR0FBc0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGlCQUFpQixDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUN2RSxTQUFTO2dCQUVYLElBQUksSUFBSSxHQUFTLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUMzQyxJQUFJLE1BQU0sR0FBb0IsSUFBSSxZQUFZLFVBQUEsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFBLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxVQUFBLFVBQVUsQ0FBQztnQkFFN0YsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxhQUFhLEdBQWMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRTlJLElBQUksSUFBSSxHQUFTLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0csV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUVsSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsWUFBWTtRQUVGLE1BQU0sQ0FBQyxhQUFhO1lBQzVCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDekUsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFVBQUEsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pILENBQUM7UUFFRDs7V0FFRztRQUNPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBcUI7WUFDOUMsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLE1BQU0sSUFBSSxHQUFpQixJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUVTLE1BQU0sQ0FBQyxnQkFBZ0I7WUFDL0IsTUFBTSxzQkFBc0IsR0FBVyxFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7WUFDakYsTUFBTSxnQkFBZ0IsR0FBVyxHQUFHLENBQUM7WUFDckMsTUFBTSxlQUFlLEdBQVcsR0FBRyxDQUFDO1lBQ3BDLE1BQU0sZUFBZSxHQUFXLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyw4REFBOEQ7WUFFOUksV0FBVyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUNsQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxXQUFXLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQ3pGLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDbkYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDbEYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDOUUsV0FBVyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1lBQ2hILFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsZUFBZSxHQUFHLHNCQUFzQixDQUFDO1lBQ25JLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1lBRXRILE1BQU0sSUFBSSxHQUEyQixXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN2RSxXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDaEUsTUFBTSxTQUFTLEdBQVcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLGVBQWUsR0FBRyxlQUFlLENBQUM7WUFFckcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsVUFBQSxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVEOztXQUVHO1FBQ08sTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFnQztZQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU87WUFFVCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTFGLCtDQUErQztZQUMvQyxJQUFJLFNBQVMsR0FBbUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFBLFlBQVksQ0FBQyxDQUFDO1lBQzFFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxNQUFNLEdBQVUsSUFBSSxVQUFBLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxRQUFRLEdBQVUsVUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BGLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3JCLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFFRCxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQy9CLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSw2REFBNkQ7Z0JBQ3hHLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUMvQixDQUFDO1lBQ0osQ0FBQztZQUVELDBEQUEwRDtZQUMxRCxxR0FBcUc7WUFDckcsa0JBQWtCLENBQUMsVUFBQSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUM5RSxrQkFBa0IsQ0FBQyxVQUFBLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RCxrQkFBa0IsQ0FBQyxVQUFBLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFekQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFrQixFQUFFLFFBQWdCLEVBQUUsVUFBa0I7Z0JBQ2xGLE1BQU0sU0FBUyxHQUFtQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVyRSxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQy9CLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxnRUFBZ0U7Z0JBQ3hHLElBQUksVUFBVSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUN6QyxDQUFDO2dCQUVGLElBQUksQ0FBQyxTQUFTO29CQUNaLE9BQU87Z0JBRVQsTUFBTSxhQUFhLEdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxxREFBcUQ7Z0JBQ2hHLE1BQU0sVUFBVSxHQUFpQixJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUVwRixJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQy9CLE1BQU0sZUFBZSxHQUFXLE1BQU0sR0FBRyxhQUFhLENBQUM7b0JBRXZELGVBQWU7b0JBQ2YsSUFBSSxRQUFRLEdBQVUsVUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BGLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEQsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUV6QixlQUFlO29CQUNmLElBQUksUUFBUSxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3ZGLElBQUksS0FBSyxJQUFJLFVBQUEsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxJQUFJLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ25DLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUM1QixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZCLENBQUM7b0JBRUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CO29CQUV6RSxzQkFBc0I7b0JBQ3RCLElBQUksS0FBSyxJQUFJLFVBQUEsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxVQUFVLEdBQWMsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN4RCxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsK0JBQStCO3dCQUMzRixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzdCLENBQUM7b0JBRUQsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN6QixNQUFNLEVBQUUsQ0FBQztnQkFDWCxDQUFDO2dCQUVELFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFDL0IsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLHVEQUF1RDtnQkFDakcsVUFBVSxDQUNYLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNPLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBNEIsRUFBRSxXQUEyQixFQUFFLFVBQTJCO1lBQy9HLE1BQU0sSUFBSSxHQUEyQixXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUV2RSxNQUFNLE1BQU0sR0FBaUIsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsQ0FBQztZQUN6RSxNQUFNLG1CQUFtQixHQUE4QixVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFBLHlCQUF5QixDQUFDLENBQUM7WUFDaEgsTUFBTSxRQUFRLEdBQW1CLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQUEsY0FBYyxDQUFDLENBQUM7WUFFL0UsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5QixlQUFlO1lBQ2YsK0ZBQStGO1lBQy9GLDRGQUE0RjtZQUM1RixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHVFQUF1RTtnQkFDdEgsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FDM0MsQ0FBQztZQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLElBQUksSUFBSSxZQUFZO2dCQUMzQixXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTFDLHlCQUF5QjtZQUN6QixJQUFJLG1CQUFtQixFQUFFLFFBQVE7Z0JBQy9CLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUVwRSxhQUFhO1lBQ2IsSUFBSSxRQUFRLEVBQUUsUUFBUTtnQkFDcEIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVsQyxrS0FBa0s7WUFDbEssSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFFN0QseUJBQXlCO1lBQ3pCLEtBQUssSUFBSSxJQUFJLElBQUksV0FBVztnQkFDMUIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekMsd0JBQXdCO1lBRXhCLDZCQUE2QjtZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwTyxDQUFDO1FBRUQ7O1dBRUc7UUFDTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsVUFBMkIsRUFBRSxvQkFBK0M7WUFDaEgsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLFVBQUEsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFcEMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQzNILFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBQSxzQkFBc0IsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN2SCxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsc0JBQXNCLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3BILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2hILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3RILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQUEsc0JBQXNCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFdkcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEssV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRDs7V0FFRztRQUNPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBeUI7WUFDbEQsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLFVBQUEsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXpCLGlIQUFpSDtZQUNqSCxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5SyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFcEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLFdBQVcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXhELGFBQWE7WUFDYixNQUFNLFVBQVUsR0FBVyxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxPQUFPLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvRSxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFbkMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVwQixXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDekgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2dCQUNqRywwRUFBMEU7Z0JBRTFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekMsV0FBVztZQUNYLEtBQUssSUFBSSxDQUFDLEdBQVcsVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2RyxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xMLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFFM0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLFdBQVcsRUFBRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2dCQUNqRywwRUFBMEU7Z0JBRTFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwSyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3JILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsV0FBVyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV4RCxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7O1VBRUU7UUFDUSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVcsRUFBRSxVQUEyQjtZQUNoRSxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksV0FBVyxHQUFzQixLQUFLLENBQUMsWUFBWSxDQUFDLFVBQUEsaUJBQWlCLENBQUMsQ0FBQztZQUMzRSxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksSUFBSSxHQUFTLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzNDLElBQUksaUJBQWlCLEdBQTRCLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBQSx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdGLElBQUksYUFBYSxHQUFZLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUM3RSxJQUFJLE1BQU0sR0FBb0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvRCxJQUFJLGFBQWE7Z0JBQ2YsTUFBTSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXhDLElBQUksY0FBYyxHQUFjLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFakQsSUFBSSxPQUFPLEVBQUUsUUFBUTtnQkFDbkIsY0FBYyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXJFLElBQUksYUFBYSxHQUFjLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0ksSUFBSSxhQUFhLEdBQWtCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUV4RyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUTtnQkFDNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0MsSUFBSSxPQUFPLEdBQXlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTlFLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDOUMsSUFBSSxPQUFPO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLGdIQUFnSDtnQkFDaEgsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxJQUFJLE9BQU87Z0JBQ1QsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEUsSUFBSSxhQUFhO2dCQUNmLFdBQVcsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQUEsbUJBQW1CLENBQUMsQ0FBQyxDQUFDOztnQkFFN0csV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFFUyxNQUFNLENBQUMsYUFBYSxDQUFDLGtCQUEyQyxFQUFFLE9BQXdCLEVBQUUsY0FBNkIsRUFBRSxjQUFtQztZQUN0SyxNQUFNLElBQUksR0FBMkIsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxXQUFXLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvRSxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUVuQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckcsSUFBSSxVQUFVLEdBQVksY0FBYyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLFVBQVUsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXpKLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBVyxFQUFFLGVBQTBCLEVBQUUsZUFBMEIsRUFBRSxPQUFpQjtZQUNsSCw4RUFBOEU7WUFDOUUsSUFBSSxhQUFhLEdBQXdCLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBQSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pGLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxhQUF3QixDQUFDLENBQUMsaUJBQWlCO2dCQUMvQyxhQUFhLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkcsT0FBTyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxPQUFPLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBd0IsRUFBRSxRQUFzQixFQUFFLEtBQWEsRUFBRSxRQUFnQjtZQUMxRyxNQUFNLElBQUksR0FBMkIsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7O0lBeHlCbUIscUJBQVcsY0F5eUJoQyxDQUFBO0FBQ0gsQ0FBQyxFQXYyQlMsU0FBUyxLQUFULFNBQVMsUUF1MkJsQjtBQy8yQkQsSUFBVSxTQUFTLENBZ0dsQjtBQWhHRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxxQkFBc0IsU0FBUSxVQUFBLGNBQWM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFzQixFQUFFLFFBQStCO1lBQzVFLFVBQUEsY0FBYyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ2hFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxnQkFBZ0I7YUFDOUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVTLE1BQU0sQ0FBQyxhQUFhLENBQWdCLGVBQXVCLHNCQUFzQixDQUFDLFFBQVE7WUFDbEcsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBZSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDtZQUU5SCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVyRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDO29CQUNILGtEQUFrRDtvQkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVELElBQUksQ0FBQyxVQUFVLENBQ2Isc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsRUFDcEksSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztvQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFFN0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixDQUFDO2dCQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7b0JBQ2hCLFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BCLEtBQUssVUFBQSxNQUFNLENBQUMsS0FBSzt3QkFDZixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDakksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2pJLE1BQU07b0JBQ1IsS0FBSyxVQUFBLE1BQU0sQ0FBQyxNQUFNO3dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDakksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQzt3QkFDL0ksSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDdkQsTUFBTTtvQkFDUixLQUFLLFVBQUEsTUFBTSxDQUFDLE1BQU07d0JBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoSSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3dCQUM5SSxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN2RCxNQUFNO29CQUNSLEtBQUssVUFBQSxNQUFNLENBQUMsTUFBTTt3QkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2hJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwSSxDQUFDO2dCQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xCLEtBQUssVUFBQSxJQUFJLENBQUMsTUFBTTt3QkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzVILElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDNUgsTUFBTTtvQkFDUixLQUFLLFVBQUEsSUFBSSxDQUFDLEtBQUs7d0JBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNuSSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ25JLE1BQU07b0JBQ1IsS0FBSyxVQUFBLElBQUksQ0FBQyxNQUFNO3dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDckksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNySSxNQUFNO2dCQUNWLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsZ0JBQWdCO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDbEIsT0FBTztZQUVULElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7S0FDRjtJQXpGWSwrQkFBcUIsd0JBeUZqQyxDQUFBO0FBQ0gsQ0FBQyxFQWhHUyxTQUFTLEtBQVQsU0FBUyxRQWdHbEI7QUNoR0QsSUFBVSxTQUFTLENBd09sQjtBQXhPRCxXQUFVLFNBQVM7SUFTakI7O09BRUc7SUFDSCxNQUFhLFlBQWEsU0FBUSxLQUFLO1FBa0JyQyxzSUFBc0k7UUFDdEksWUFBbUIsS0FBb0IsRUFBRSxhQUFpQyxFQUFFLGNBQXNCLEVBQUUsZUFBdUIsRUFBRSxnQkFBd0IsRUFBRSxrQkFBMkIsSUFBSSxFQUFFLG1CQUE0QixJQUFJO1lBQ3ROLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUM7WUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztRQUMxQyxDQUFDO0tBQ0Y7SUE1Qlksc0JBQVksZUE0QnhCLENBQUE7SUFFRDs7TUFFRTtJQUNGLElBQVksZUFPWDtJQVBELFdBQVksZUFBZTtRQUN6QiwyREFBVyxDQUFBO1FBQ1gsMkRBQVcsQ0FBQTtRQUNYLDJEQUFXLENBQUE7UUFDWCwyREFBVyxDQUFBO1FBQ1gsNERBQVksQ0FBQTtRQUNaLDREQUFZLENBQUE7SUFDZCxDQUFDLEVBUFcsZUFBZSxHQUFmLHlCQUFlLEtBQWYseUJBQWUsUUFPMUI7SUFFRDs7TUFFRTtJQUNGLElBQVksU0FPWDtJQVBELFdBQVksU0FBUztRQUNuQiwySEFBMkg7UUFDM0gsK0NBQU8sQ0FBQTtRQUNQLGtIQUFrSDtRQUNsSCw2Q0FBTSxDQUFBO1FBQ04sbUhBQW1IO1FBQ25ILG1EQUFTLENBQUEsQ0FBQyxpQ0FBaUM7SUFDN0MsQ0FBQyxFQVBXLFNBQVMsR0FBVCxtQkFBUyxLQUFULG1CQUFTLFFBT3BCO0lBRUQ7Ozs7Ozs7O01BUUU7SUFDRixJQUFZLGFBUVg7SUFSRCxXQUFZLGFBQWE7UUFDdkIsaURBQUksQ0FBQTtRQUNKLHFEQUFNLENBQUE7UUFDTix1REFBTyxDQUFBO1FBQ1AseURBQVEsQ0FBQTtRQUNSLGlEQUFJLENBQUE7UUFDSix1REFBTyxDQUFBO1FBQ1AscURBQU0sQ0FBQTtJQUNSLENBQUMsRUFSVyxhQUFhLEdBQWIsdUJBQWEsS0FBYix1QkFBYSxRQVF4QjtJQUVELHNIQUFzSDtJQUN0SCxJQUFZLGlCQU9YO0lBUEQsV0FBWSxpQkFBaUI7UUFDM0IseURBQUksQ0FBQTtRQUNKLG1FQUFTLENBQUE7UUFDVCx1RkFBbUIsQ0FBQTtRQUNuQiw2RUFBYyxDQUFBO1FBQ2QsaUVBQVEsQ0FBQTtRQUNSLHVGQUFtQixDQUFBO0lBQ3JCLENBQUMsRUFQVyxpQkFBaUIsR0FBakIsMkJBQWlCLEtBQWpCLDJCQUFpQixRQU81QjtJQUVELHdEQUF3RDtJQUN4RCxNQUFhLFVBQVU7UUFTckI7WUFOTyxhQUFRLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsY0FBUyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLFdBQU0sR0FBWSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxjQUFTLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFHekMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7WUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUM7S0FDRjtJQXRCWSxvQkFBVSxhQXNCdEIsQ0FBQTtJQUVELHNFQUFzRTtJQUN0RSxNQUFhLGVBQWU7UUFFMUIsWUFBbUIsc0JBQThCLEVBQUUscUJBQTZCO1lBQzlFLElBQUksT0FBTyxJQUFJLElBQUksV0FBVztnQkFDNUIsT0FBTztZQUNULElBQUksQ0FBQyxxQkFBcUIsR0FBRyxzQkFBc0IsQ0FBQztZQUNwRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7UUFDcEQsQ0FBQztRQUVELGdOQUFnTjtRQUNoTixJQUFXLGVBQWU7WUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBVyxlQUFlLENBQUMsTUFBZTtZQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7UUFDeEMsQ0FBQztRQUNELGdEQUFnRDtRQUNoRCxJQUFXLHlCQUF5QjtZQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQVcseUJBQXlCLENBQUMsTUFBYztZQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztRQUNsRCxDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELElBQVcsZ0NBQWdDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBVyxnQ0FBZ0MsQ0FBQyxNQUFjO1lBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLEdBQUcsTUFBTSxDQUFDO1FBQ3pELENBQUM7UUFFRCwrRkFBK0Y7UUFDL0YsSUFBVyxxQkFBcUI7WUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFXLHFCQUFxQixDQUFDLE1BQWM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7UUFDOUMsQ0FBQztRQUVELGdLQUFnSztRQUNoSyxJQUFXLHNCQUFzQjtZQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQVcsc0JBQXNCLENBQUMsVUFBa0I7WUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7UUFDN0MsQ0FBQztRQUVELHNKQUFzSjtRQUN0SixJQUFXLGVBQWU7WUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBVyxlQUFlLENBQUMsTUFBYztZQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7UUFDeEMsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxJQUFXLGtCQUFrQjtZQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDekMsQ0FBQztRQUNELElBQVcsa0JBQWtCLENBQUMsTUFBYztZQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztRQUMzQyxDQUFDO1FBRUQ7O1VBRUU7UUFDRixJQUFXLG9CQUFvQjtZQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQVcsb0JBQW9CLENBQUMsTUFBYztZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztRQUM3QyxDQUFDO1FBRUQseUpBQXlKO1FBQ3pKLElBQVcscUJBQXFCO1lBQzlCLE9BQXdCLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQVcscUJBQXFCLENBQUMsTUFBdUI7WUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7UUFDOUMsQ0FBQztRQUVELCtOQUErTjtRQUMvTixJQUFXLDJCQUEyQjtZQUNwQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQVcsMkJBQTJCLENBQUMsTUFBYztZQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQztRQUN6RCxDQUFDO1FBRUQ7OE5BQ3NOO1FBQ3ROLElBQVcsMEJBQTBCO1lBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBVywwQkFBMEIsQ0FBQyxNQUFjO1lBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsdUNBQXVDLEdBQUcsTUFBTSxDQUFDO1FBQ2hFLENBQUM7UUFFRDs7O1dBR0c7UUFDSCxJQUFXLGdCQUFnQjtZQUN6QixPQUFPLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFXLGdCQUFnQixDQUFDLE1BQWM7WUFDeEMsVUFBQSxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxDQUFDO0tBQ0Y7SUE5R1kseUJBQWUsa0JBOEczQixDQUFBO0FBQ0gsQ0FBQyxFQXhPUyxTQUFTLEtBQVQsU0FBUyxRQXdPbEI7QUN4T0QsSUFBVSxTQUFTLENBbVRsQjtBQW5URCxXQUFVLFNBQVM7SUFDakI7Ozs7Ozs7O1NBUUs7SUFDTCxNQUFzQixLQUFNLFNBQVEsVUFBQSxTQUFTO1FBQzNDLGtHQUFrRztpQkFDM0UsY0FBUyxHQUFpQixLQUFLLEFBQXRCLENBQXVCO1FBQ3ZELHFGQUFxRjtpQkFDOUQsZUFBVSxHQUFtQixFQUFFLEFBQXJCLENBQXNCO1FBS3ZELGFBQWEsQ0FBYTtRQUMxQixXQUFXLENBQWE7UUFDeEIsV0FBVyxDQUFxQjtRQUNoQyxTQUFTLENBQXFCO1FBRTlCLFVBQVUsQ0FBa0I7UUFDNUIsT0FBTyxDQUFZO1FBQ25CLGtCQUFrQixDQUFrQjtRQUVwQyxXQUFXLENBQWE7UUFDeEIsWUFBWSxDQUFhO1FBRXpCLG1CQUFtQixDQUFTO1FBSzVCLDJFQUEyRTtRQUMzRSxZQUFtQixjQUFrQyxJQUFJLEVBQUUsWUFBZ0MsSUFBSTtZQUM3RixLQUFLLEVBQUUsQ0FBQztZQXRCVix5RkFBeUY7WUFDL0UsY0FBUyxHQUFZLEtBQUssQ0FBQyxDQUFDLDZDQUE2QztZQUVuRixrQkFBYSxHQUFXLENBQUMsQ0FBQztZQUMxQixnQkFBVyxHQUFXLENBQUMsQ0FBQztZQUl4QixlQUFVLEdBQVksS0FBSyxDQUFDO1lBRTVCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztZQUVwQyxnQkFBVyxHQUFXLENBQUMsQ0FBQztZQUN4QixpQkFBWSxHQUFXLENBQUMsQ0FBQztZQTJQakIsYUFBUSxHQUFHLENBQUMsTUFBYSxFQUFRLEVBQUU7Z0JBQ3pDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQjt3QkFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixpREFBeUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMzRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ25CLE1BQU07b0JBQ1I7d0JBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsaURBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDOUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNuQixNQUFNO2dCQUNWLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixnQkFBVyxHQUFHLEdBQVksRUFBRTtnQkFDMUIsSUFBSSxPQUFPLEdBQVk7b0JBQ3JCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzVDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7b0JBQzFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVztvQkFDNUIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO2lCQUMvQixDQUFDO2dCQUNGLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUMsQ0FBQztZQUVGLFlBQU8sR0FBRyxDQUFDLFFBQWlCLEVBQVEsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUM7WUExUUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFFMUI7OztjQUdFO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQiwyQ0FBc0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxnQkFBZ0IsaURBQXlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQXVCLElBQVksT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ILGlKQUFpSjtRQUNqSixJQUFXLFVBQVU7WUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFXLFVBQVUsQ0FBQyxNQUEwQjtZQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFXLFFBQVEsQ0FBQyxNQUEwQjtZQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxNQUFNO1lBQ2YsT0FBTyxJQUFJLFVBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQVcsTUFBTSxDQUFDLE1BQWU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7VUFFRTtRQUNGLElBQVcsV0FBVztZQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQVcsV0FBVyxDQUFDLE1BQWM7WUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsVUFBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQVcsVUFBVSxDQUFDLE1BQWM7WUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRDs7OztXQUlHO1FBQ0gsSUFBVyxpQkFBaUI7WUFDMUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDakMsQ0FBQztRQUNELElBQVcsaUJBQWlCLENBQUMsTUFBZTtZQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVEOztXQUVHO1FBQ0ksWUFBWSxDQUFDLEtBQWE7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ1osT0FBTztZQUVULElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7O2dCQUVqQyxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksOERBQThELEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkksQ0FBQztRQUVEOztXQUVHO1FBQ0ksV0FBVyxDQUFDLEtBQVc7WUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUN0QixPQUFPO1lBRVQsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFdEYsSUFBSSxXQUFXLEdBQXVCLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBQSxrQkFBa0IsQ0FBQyxDQUFDO1lBQzdFLElBQUksUUFBUSxHQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGtCQUFrQixDQUFDLENBQUM7WUFFOUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksd0NBQXdDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuSSxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQzlCLENBQUM7UUFFRCx1SUFBdUk7UUFDaEksV0FBVztZQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE9BQU87WUFDWixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZELElBQUksSUFBSSxDQUFDLG1CQUFtQjt3QkFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDOUMsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFVBQVU7WUFDZixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRDs7O1VBR0U7UUFDSyxZQUFZO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBRU0sU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEQsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9DLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxVQUFBLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QixNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRU0sd0JBQXdCLENBQUMsUUFBaUI7WUFDL0MsSUFBSSxLQUFLLEdBQTBCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1RSxLQUFLLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVc7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFBLE9BQU8sQ0FBQyxHQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2QixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxXQUFXO2dCQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBSVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM3QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdEIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELDBGQUEwRjtRQUNoRixXQUFXO1lBQ25CLFVBQUEsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUyxRQUFRO1lBQ2hCLFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRVMsV0FBVztZQUNuQixVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVTLGNBQWMsQ0FBQyxHQUFHLGFBQXVCO1lBQ2pELElBQUksYUFBYSxHQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyw4REFBOEQ7WUFDdEksSUFBSSxXQUFXLEdBQWMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakosaUdBQWlHO1lBQ2pHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDMUgsQ0FBQztRQUVTLGNBQWM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFUyxpQkFBaUIsQ0FBQyxRQUFpQixFQUFFLE9BQWdCO1lBQzdELEtBQUssSUFBSSxHQUFHLElBQUksT0FBTztnQkFDckIsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQWVELFdBQVcsQ0FRVDtRQUVGLE9BQU8sQ0FFTDs7SUF2U2tCLGVBQUssUUF3UzFCLENBQUE7QUFDSCxDQUFDLEVBblRTLFNBQVMsS0FBVCxTQUFTLFFBbVRsQjtBQ25URCxJQUFVLFNBQVMsQ0FnS2xCO0FBaEtELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7SUFDSCxNQUFzQixVQUFXLFNBQVEsVUFBQSxLQUFLO1FBRzVDLG9CQUFvQjtRQUNwQixTQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsR0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN4QixXQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBWTtRQUNqQixnQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsY0FBYyxHQUFXLENBQUMsQ0FBQztRQUUzQixpSkFBaUo7UUFDakosWUFBbUIsY0FBa0MsSUFBSSxFQUFFLFlBQWdDLElBQUksRUFBRSxRQUFpQixJQUFJLFVBQUEsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBd0IsSUFBSSxVQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsTCxLQUFLLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELG9FQUFvRTtRQUNwRTs7O1dBR0c7UUFDSCxJQUFXLElBQUk7WUFDYixPQUFPLElBQUksVUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBVyxJQUFJLENBQUMsTUFBZTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBVyxRQUFRLENBQUMsTUFBYztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUM7Z0JBQzRCLElBQUksQ0FBQyxLQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUNqRixDQUFDO1lBQUMsT0FBTyxFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQVcsUUFBUSxDQUFDLE1BQWM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUM0QixJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDakYsQ0FBQztZQUFDLE9BQU8sRUFBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLGFBQWE7WUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFXLGFBQWEsQ0FBQyxNQUFjO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDNEIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQ3JGLENBQUM7WUFBQyxPQUFPLEVBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxVQUFVO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBVyxVQUFVLENBQUMsTUFBYztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ21CLElBQUksQ0FBQyxLQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUN4RSxDQUFDO1lBQUMsT0FBTyxFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7VUFFRTtRQUNGLElBQVcsZUFBZTtZQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBVyxlQUFlLENBQUMsTUFBYztZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQztnQkFDbUIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEVBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELFlBQVk7UUFFWix3QkFBd0I7UUFDakIsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEQsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxVQUFBLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVztnQkFDeEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFVBQUEsT0FBTyxDQUFDLEdBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDM0MsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELFlBQVk7UUFFRixjQUFjO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELFdBQVcsR0FBRyxHQUFZLEVBQUU7WUFDMUIsSUFBSSxPQUFPLEdBQVk7Z0JBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbEMsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDN0IsQ0FBQztZQUNGLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDLFFBQWlCLEVBQVEsRUFBRTtZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQyxDQUFDO0tBQ0g7SUExSnFCLG9CQUFVLGFBMEovQixDQUFBO0FBQ0gsQ0FBQyxFQWhLUyxTQUFTLEtBQVQsU0FBUyxRQWdLbEI7QUNoS0QsSUFBVSxTQUFTLENBbVdsQjtBQW5XRCxXQUFVLFNBQVM7SUFJakI7Ozs7O09BS0c7SUFDSCxJQUFZLE1BRVg7SUFGRCxXQUFZLE1BQU07UUFDaEIscUNBQUssQ0FBQTtRQUFFLHVDQUFNLENBQUE7UUFBRSx1Q0FBTSxDQUFBO1FBQUUsdUNBQU0sQ0FBQTtJQUMvQixDQUFDLEVBRlcsTUFBTSxHQUFOLGdCQUFNLEtBQU4sZ0JBQU0sUUFFakI7SUFFRCxJQUFZLElBRVg7SUFGRCxXQUFZLElBQUk7UUFDZCxtQ0FBTSxDQUFBO1FBQUUsaUNBQUssQ0FBQTtRQUFFLG1DQUFNLENBQUE7SUFDdkIsQ0FBQyxFQUZXLElBQUksR0FBSixjQUFJLEtBQUosY0FBSSxRQUVmO0lBRUQ7OztPQUdHO1FBRW1CLE9BQU87O2dDQUQ1QixDQUFBLEtBQUEsVUFBQSxxQkFBcUIsQ0FBQSxDQUFDLFFBQVE7Ozs7MEJBQ08sVUFBQSxPQUFPOzJCQUFmLFNBQVEsV0FBTzs7OztnQkFBN0MsNktBd0dDOzs7Z0JBeEdxQix1REFBTzs7WUFVM0IsT0FBTyxDQUF3QjtZQUMvQixLQUFLLENBQXFCO1lBRTFCLFlBQW1CLFFBQWdCLFNBQVM7Z0JBQzFDLEtBQUssRUFBRSxDQUFDO2dCQVpILGVBQVUsR0FBVyxTQUFTLENBQUM7Z0JBSTVCLGlCQUFZLEdBQVksSUFBSSxDQUFDO2dCQUM3QixnQkFBVyxHQUFZLElBQUksQ0FBQztnQkFDNUIsY0FBUyxHQUFZLElBQUksQ0FBQztnQkFFcEMsWUFBTyxHQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQy9CLFVBQUssR0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUl4QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRUQsSUFBVyxNQUFNLENBQUMsT0FBZTtnQkFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7WUFFRCxJQUFXLE1BQU07Z0JBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3RCLENBQUM7WUFFRCxJQUFXLElBQUksQ0FBQyxLQUFXO2dCQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDeEIsQ0FBQztZQUVELElBQVcsSUFBSTtnQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEIsQ0FBQztZQU9EOzs7O2VBSUc7WUFDSSxhQUFhLENBQUMsZUFBdUIsQ0FBQyxJQUF5QyxDQUFDO1lBRXZGOzs7O2VBSUc7WUFDSSxnQkFBZ0IsS0FBMEMsQ0FBQztZQUVsRTs7ZUFFRztZQUNJLE9BQU87Z0JBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQztZQUVELGtCQUFrQjtZQUNYLFNBQVM7Z0JBQ2QsSUFBSSxhQUFhLEdBQWtCO29CQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDdkIsQ0FBQztnQkFDRixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBb0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLEtBQUssR0FBb0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRU0sVUFBVSxDQUFDLFdBQXFCO2dCQUNyQyxJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztZQUVNLHdCQUF3QixDQUFDLFFBQWlCO2dCQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLEtBQUssQ0FBQyxNQUFNO29CQUNkLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUN4QixJQUFJLEtBQUssQ0FBQyxJQUFJO29CQUNaLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFUyxhQUFhLENBQUMsUUFBaUI7Z0JBQ3ZDLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQztnQkFDM0IsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUMzQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7Z0JBQzdCLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDNUIsT0FBTyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUNoQyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDNUIsQ0FBQzs7OztJQXZHbUIsaUJBQU8sVUF3RzVCLENBQUE7SUFFRDs7T0FFRztJQUNILE1BQWEsWUFBYSxTQUFRLE9BQU87UUFJdkMsWUFBbUIsSUFBa0I7WUFDbkMsS0FBSyxFQUFFLENBQUM7WUFKSCxVQUFLLEdBQXFCLElBQUksQ0FBQztZQUtwQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBRUQsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFXLGNBQWM7WUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBaUI7WUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBR3pCLDJEQUEyRDtZQUMzRCw0Q0FBNEM7WUFDNUMscURBQXFEO1lBQ3JELDhCQUE4QjtZQUU5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsd0NBQXdDO29CQUNoRSxRQUFRLEVBQUUsQ0FBQztnQkFDYixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxPQUFPO2dCQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSw2QkFBNkI7Z0JBQzlDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO2FBQzVDLENBQUM7UUFDSixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLHNFQUFzRTtZQUN0RSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsYUFBdUIsSUFBSSxFQUFFLGtCQUEyQixJQUFJO1lBQ2pHLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNyRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLGlEQUFpRDtZQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQzFELHVFQUF1RTtZQUN2RSw0QkFBNEI7UUFDOUIsQ0FBQztLQUVGO0lBbEVZLHNCQUFZLGVBa0V4QixDQUFBO0lBRUQ7O09BRUc7SUFDSCxNQUFhLGFBQWMsU0FBUSxPQUFPO1FBR3hDLFlBQW1CLEtBQWEsRUFBRSxPQUFlLEVBQUUsVUFBa0IsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFjLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBZSxFQUFFLE9BQWdCO1lBQzdJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUhSLFVBQUssR0FBcUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUkzQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxNQUFNO2dCQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUM1QixJQUFJLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFXLGNBQWM7WUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7S0FDRjtJQWpCWSx1QkFBYSxnQkFpQnpCLENBQUE7SUFDRDs7T0FFRztJQUNILE1BQWEsYUFBYyxTQUFRLE9BQU87UUFHeEMsWUFBbUIsS0FBYSxFQUFFLEtBQW1FO1lBQ25HLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFXLGNBQWM7WUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixDQUFDO0tBQ0Y7SUFWWSx1QkFBYSxnQkFVekIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILE1BQWEsV0FBWSxTQUFRLE9BQU87UUFFdEMsS0FBSyxDQUFTO1FBQ2QsS0FBSyxDQUFTO1FBRWQsWUFBbUIsS0FBYSxFQUFFLFFBQWdCLE1BQU0sRUFBRSxRQUFnQixnQkFBZ0I7WUFDeEYsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBVyxJQUFJLENBQUMsS0FBYTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFXLElBQUksQ0FBQyxLQUFhO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7aUJBQzVCLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFXLGNBQWM7WUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFXLEtBQUs7WUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFXLGVBQWU7WUFDeEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBWSxNQUFNO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQztRQUVNLGFBQWEsQ0FBQyxZQUFxQjtZQUN4QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFFM0IsSUFBSSxPQUFPLEdBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxNQUFNLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztnQkFFcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLHNEQUFzRDtnQkFDekYsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDO29CQUN4QixPQUFPO2dCQUVULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyx3REFBd0Q7Z0JBQ3BGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVNLFNBQVM7WUFDZCxPQUFPO2dCQUNMLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUMzQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ2hCLENBQUM7UUFDSixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVUsQ0FBQyxXQUFxQjtZQUNyQyxJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN6QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUNGO0lBakdZLHFCQUFXLGNBaUd2QixDQUFBO0lBRUQ7O09BRUc7SUFDSCxNQUFhLGFBQWMsU0FBUSxhQUFhO1FBQzlDLElBQVcsY0FBYztZQUN2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRjtJQUpZLHVCQUFhLGdCQUl6QixDQUFBO0lBQ0Q7O09BRUc7SUFDSCxNQUFhLFdBQVksU0FBUSxhQUFhO1FBQzVDLElBQVcsY0FBYztZQUN2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRjtJQUpZLHFCQUFXLGNBSXZCLENBQUE7QUFDSCxDQUFDLEVBbldTLFNBQVMsS0FBVCxTQUFTLFFBbVdsQjtBQ25XRCxJQUFVLFNBQVMsQ0F5SWxCO0FBeklELFdBQVUsU0FBUztJQUNqQjs7Ozs7T0FLRztRQUVtQixJQUFJOztnQ0FEekIsQ0FBQSxLQUFBLFVBQUEsa0JBQWtCLENBQUEsQ0FBQyxRQUFROzs7OzBCQUNPLFVBQUEsT0FBTzt3QkFBZixTQUFRLFdBQU87Ozs7Z0JBQTFDLDZLQWdJQzs7OztZQS9IQyxrR0FBa0c7cUJBQzNFLGNBQVMsR0FBZ0IsSUFBSSxBQUFwQixDQUFxQjtZQUNyRCxxRkFBcUY7cUJBQzlELGVBQVUsR0FBa0IsRUFBRSxBQUFwQixDQUFxQjtZQWtCdEQsV0FBVyxDQUFhO1lBRXhCLFlBQW1CLFFBQWdCLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSxDQUFDO2dCQW5CViwrRUFBK0U7Z0JBRXhFLGVBQVUsR0FBVyxTQUFTLENBQUM7Z0JBQy9CLFNBQUksR0FBVyxNQUFNLENBQUM7Z0JBQzdCLHFDQUFxQztnQkFDOUIsYUFBUSxHQUFhLElBQUksVUFBQSxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsVUFBSyxHQUFXLEVBQUUsQ0FBQztnQkFjeEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDYixVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFzQixJQUFZLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqSCxJQUFXLFVBQVU7Z0JBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJO29CQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksVUFBQSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMxQixDQUFDO1lBRUQsSUFBVyxXQUFXO2dCQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSTtvQkFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFFdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CLENBQUM7WUFDRCxJQUFXLE1BQU07Z0JBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUk7b0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUVyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdEIsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxnQkFBZ0IsQ0FBQyxPQUF3QixFQUFFLGVBQTBCLEVBQUUsY0FBeUIsRUFBRSxHQUFZLElBQW1CLE9BQU8sSUFBSSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUN0TDs7OztlQUlHO1lBQ0ksZ0JBQWdCLEtBQW9CLE9BQU8sSUFBSSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUN6Rjs7OztlQUlHO1lBQ0ksbUJBQW1CLENBQUMsY0FBNkIsSUFBeUMsQ0FBQztZQUVsRzs7ZUFFRztZQUNJLEtBQUs7Z0JBQ1YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2dCQUV6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBRUQsa0JBQWtCO1lBQ2xCLHlFQUF5RTtZQUNsRSxTQUFTO2dCQUNkLElBQUksYUFBYSxHQUFrQjtvQkFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCO2lCQUN6QyxDQUFDLENBQUMscUJBQXFCO2dCQUN4QixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDaEMsbURBQW1EO2dCQUNuRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFUyxhQUFhLENBQUMsUUFBaUI7Z0JBQ3ZDLCtEQUErRDtnQkFDL0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNyQixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBRXhCLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsWUFBWTtZQUdGLFlBQVk7Z0JBQ3BCLGdGQUFnRjtnQkFDaEYsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO2dCQUN2QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEQsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFFUyxpQkFBaUI7Z0JBQ3pCLElBQUksR0FBRyxHQUFRLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3RELElBQUksS0FBSyxHQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixDQUFDO2dCQUNELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQzs7Z0JBL0htQix1REFBSTs7Ozs7SUFBSixjQUFJLE9BZ0l6QixDQUFBO0FBQ0gsQ0FBQyxFQXpJUyxTQUFTLEtBQVQsU0FBUyxRQXlJbEI7QUN6SUQsSUFBVSxTQUFTLENBNkdsQjtBQTdHRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO1FBRVUsUUFBUTtnQ0FEcEIsVUFBQSxVQUFVOzs7OzBCQUNtQixVQUFBLE9BQU87Ozs0QkFBZixTQUFRLFdBQU87Ozs7d0NBNkJsQyxVQUFBLElBQUksQ0FBQyxVQUFBLElBQUksQ0FBQyxFQUNWLFVBQUEsVUFBVTtnQkFDWCxtS0FBVyxJQUFJLDZEQUVkO2dCQWpDSCw2S0FxR0M7OztnQkFyR1ksdURBQVE7O1lBV25CLEtBQUssQ0FBTztZQUVaLFlBQW1CLEtBQWEsRUFBRSxPQUF1QixFQUFFLEtBQVk7Z0JBQ3JFLEtBQUssRUFBRSxDQUFDO2dCQWJWLHdDQUF3QztnQkFDakMsU0FBSSxHQUZBLG1EQUFRLENBRUM7Z0JBQ2IsZUFBVSxHQUFXLFNBQVMsQ0FBQztnQkFFdEM7O21CQUVHO2dCQUNJLGNBQVMsR0FBVyxJQUFJLENBQUM7Z0JBTzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztnQkFDMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixJQUFJLEtBQUs7d0JBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7O3dCQUVsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNoRCxDQUFDO2dCQUNELFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBRUQ7O2VBRUc7WUFHSCxJQUFXLElBQUk7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUM7WUFDRDs7ZUFFRztZQUNILElBQVcsSUFBSSxDQUFDLEtBQVc7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVU7b0JBQ2pCLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTt3QkFDaEQsSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUU7NEJBQzVDLFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDOzs0QkFFNUQsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDckIsQ0FBQztZQUVEOztlQUVHO1lBQ0ksd0JBQXdCO2dCQUM3QixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxTQUFTLENBQUMsV0FBMEI7Z0JBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO2dCQUM5QixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7WUFFRDs7ZUFFRztZQUNJLFNBQVM7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxrQkFBa0I7WUFDbEIsOEtBQThLO1lBQ3ZLLFNBQVM7Z0JBQ2QsSUFBSSxhQUFhLEdBQWtCO29CQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUM1QixJQUFJLEVBQUUsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3RDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDMUIsQ0FBQztnQkFDRixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBYSxTQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLElBQUksR0FBZSxNQUFNLFVBQUEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksU0FBUztvQkFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUM1QyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFUyxhQUFhLENBQUMsUUFBaUI7Z0JBQ3ZDLDhCQUE4QjtZQUNoQyxDQUFDOzs7O0lBbkdVLGtCQUFRLFdBcUdwQixDQUFBO0FBQ0gsQ0FBQyxFQTdHUyxTQUFTLEtBQVQsU0FBUyxRQTZHbEI7QUM3R0QsSUFBVSxTQUFTLENBa0tsQjtBQWxLRCxXQUFVLFNBQVM7SUFFakI7O09BRUc7SUFDSCxJQUFpQixZQUFZLENBZ0Y1QjtJQWhGRCxXQUFpQixZQUFZO1FBdUMzQjs7V0FFRztRQUNILFNBQWdCLFlBQVksQ0FBQyxLQUFnQjtZQUMzQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRmUseUJBQVksZUFFM0IsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsU0FBZ0IsVUFBVSxDQUFDLEtBQWdCO1lBQ3pDLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDekQsQ0FBQztRQUZlLHVCQUFVLGFBRXpCLENBQUE7UUFFRDs7V0FFRztRQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFnQjtZQUN6QyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUM7UUFDeEYsQ0FBQztRQUZlLHVCQUFVLGFBRXpCLENBQUE7UUFFRDs7V0FFRztRQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFnQjtZQUN6QyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUM7UUFDeEYsQ0FBQztRQUZlLHVCQUFVLGFBRXpCLENBQUE7UUFFRDs7V0FFRztRQUNILFNBQWdCLE1BQU0sQ0FBQyxLQUFnQjtZQUNyQyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDO1FBQ3JELENBQUM7UUFGZSxtQkFBTSxTQUVyQixDQUFBO1FBRUQ7O1dBRUc7UUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFnQjtZQUMvQyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxnQkFBZ0IsSUFBSSxLQUFLLENBQUM7UUFDL0QsQ0FBQztRQUZlLDZCQUFnQixtQkFFL0IsQ0FBQTtJQUNILENBQUMsRUFoRmdCLFlBQVksR0FBWixzQkFBWSxLQUFaLHNCQUFZLFFBZ0Y1QjtJQUVEOzs7OztPQUtHO0lBQ0gsTUFBYSxjQUFlLFNBQVEsVUFBQSxPQUFPO1FBSXpDLEtBQUssQ0FBc0I7UUFDM0I7d0hBQ2dIO1FBQ2hILDZCQUE2QixDQUF5RDtRQUV0RixZQUFtQixRQUFnQixjQUFjLENBQUMsSUFBSSxFQUFFLFFBQTZCLEVBQUU7WUFDckYsS0FBSyxFQUFFLENBQUM7WUFSSCxlQUFVLEdBQVcsU0FBUyxDQUFDO1lBR3RDOzRIQUNnSDtZQUNoSCxrQ0FBNkIsR0FBK0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUlwRixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUVsQixVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELElBQVcsSUFBSTtZQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBVyxJQUFJLENBQUMsS0FBMEI7WUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QyxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSSxhQUFhLENBQUMsT0FBd0I7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxjQUFjLEdBQXlCLElBQUksVUFBQSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN0RSxjQUFjLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RFLGNBQWMsQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDcEUsY0FBYyxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN4RSxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDaEIsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUMvQixPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDNUIsQ0FBQztLQUVGO0lBcEVZLHdCQUFjLGlCQW9FMUIsQ0FBQTtBQUNILENBQUMsRUFsS1MsU0FBUyxLQUFULFNBQVMsUUFrS2xCO0FDbEtELElBQVUsU0FBUyxDQXFEbEI7QUFyREQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsK0JBQStCO1FBRW5DLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBc0IsRUFBRSxRQUErQjtZQUM1RSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQy9ELEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxlQUFlO2FBQ3ZELENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTtnQkFDbEUsS0FBSyxFQUFFLCtCQUErQixDQUFDLGtCQUFrQjthQUMxRCxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ2xFLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxrQkFBa0I7YUFDMUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVTLE1BQU0sQ0FBQyxlQUFlLENBQTBCLE9BQXNCO1lBQzlFLE1BQU0sSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFVBQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9HLENBQUM7UUFFUyxNQUFNLENBQUMsa0JBQWtCO1lBQ2pDLE1BQU0sSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sYUFBYSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0dBQWdHO2dCQUU1SSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0csQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVTLE1BQU0sQ0FBQyxrQkFBa0I7WUFDakMsTUFBTSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFdkUsSUFBSSxJQUFJLENBQUMsWUFBWTtnQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsQ0FBQztLQUNGO0lBOUNZLHlDQUErQixrQ0E4QzNDLENBQUE7QUFDSCxDQUFDLEVBckRTLFNBQVMsS0FBVCxTQUFTLFFBcURsQjtBQ3JERCxxRUFBcUU7QUFDckUsSUFBVSxTQUFTLENBdUhsQjtBQXhIRCxxRUFBcUU7QUFDckUsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztRQUVVLGlCQUFpQjs7Z0NBRDdCLENBQUEsS0FBQSxVQUFBLCtCQUErQixDQUFBLENBQUMsUUFBUTs7OzswQkFDRixVQUFBLFNBQVM7cUNBQWpCLFNBQVEsV0FBUzs7OztnQkFBaEQsNktBOEdDOzs7Z0JBOUdZLHVEQUFpQjs7WUFXNUIsWUFBbUIsU0FBaUIsRUFBRSxFQUFFLG1CQUFnQyxFQUFFO2dCQUN4RSxLQUFLLEVBQUUsQ0FBQztnQkFMQSxjQUFTLEdBQVksS0FBSyxDQUFDO2dCQUNyQyxxRkFBcUY7Z0JBQ2xFLGFBQVEsR0FBZ0IsRUFBRSxDQUFDO2dCQUk1QyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztnQkFFeEMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDaEQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7d0JBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ3BFLENBQUM7WUFFRDs7OztlQUlHO1lBQ0ksZUFBZSxDQUFDLE9BQXdCLElBQW1CLE9BQU8sSUFBSSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNoSDs7OztlQUlHO1lBQ0ksa0JBQWtCLEtBQW9CLE9BQU8sSUFBSSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUMzRjs7OztlQUlHO1lBQ0ksa0JBQWtCLEtBQTBDLENBQUM7WUFFcEU7O2VBRUc7WUFDSSxPQUFPLENBQUMsS0FBVyxFQUFFLGtCQUE2QixLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUs7Z0JBQ2xGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBVU0sT0FBTyxDQUFDLEtBQW9CO2dCQUNqQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRO29CQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBVyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDOztvQkFFbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQ7O2VBRUc7WUFDSSxNQUFNO2dCQUNYLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQ2pDLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUV6QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxPQUFPLEdBQWMsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQ7O2VBRUc7WUFDSSxTQUFTO2dCQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVNLFNBQVM7Z0JBQ2QsTUFBTSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztnQkFDeEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM5RSxhQUFhLENBQUMsZUFBZSxHQUFHLFVBQUEsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNGLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFaEUsTUFBTSxtQkFBbUIsR0FBeUIsR0FBRyxFQUFFO29CQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7d0JBQ3RELElBQUksSUFBSSxHQUFTLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxJQUFJOzRCQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxVQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsSUFBSSx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDOUcsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixtREFBMEIsbUJBQW1CLENBQUMsQ0FBQztnQkFDekUsQ0FBQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsbURBQTBCLG1CQUFtQixDQUFDLENBQUM7Z0JBRXBFLElBQUksQ0FBQyxlQUFlLEdBQWdCLE1BQU0sVUFBQSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7Ozs7SUE3R1UsMkJBQWlCLG9CQThHN0IsQ0FBQTtBQUVILENBQUMsRUF2SFMsU0FBUyxLQUFULFNBQVMsUUF1SGxCO0FDeEhELDRDQUE0QztBQUM1QyxzQ0FBc0M7QUFDdEMscUNBQXFDO0FBQ3JDLHNDQUFzQztBQUN0QyxnREFBZ0Q7QUFDaEQsb0RBQW9EO0FBQ3BELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsaURBQWlEO0FBQ2pELDZDQUE2QztBQUM3Qyx1REFBdUQ7QUFDdkQsaURBQWlEO0FBQ2pELHdDQUF3QztBQUN4Qyw2Q0FBNkM7QUFDN0MsMENBQTBDO0FBQzFDLG9DQUFvQztBQUNwQyw0Q0FBNEM7QUFDNUMsd0RBQXdEO0FBQ3hELHNEQUFzRDtBQUd0RCxrQkFBa0I7QUFDbEIsU0FBUyxRQUFRLENBQUMsTUFBYyxFQUFFLFFBQWdCO0lBQ2hELE9BQU8sT0FBTyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxRCxDQUFDO0FDeEJELElBQVUsU0FBUyxDQTRpQmxCO0FBNWlCRCxXQUFVLFNBQVM7SUE2Q2pCOzs7T0FHRztJQUNILElBQUssd0JBU0o7SUFURCxXQUFLLHdCQUF3QjtRQUMzQixpQ0FBaUM7UUFDakMsMkVBQU0sQ0FBQTtRQUNOLHlCQUF5QjtRQUN6Qiw2RUFBTyxDQUFBO1FBQ1AsdUJBQXVCO1FBQ3ZCLCtFQUFRLENBQUE7UUFDUix3QkFBd0I7UUFDeEIsNkZBQWUsQ0FBQTtJQUNqQixDQUFDLEVBVEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQVM1QjtJQUVEOzs7T0FHRztJQUNILElBQVksa0JBWVg7SUFaRCxXQUFZLGtCQUFrQjtRQUM1QixnRUFBZ0U7UUFDaEUsbUNBQWEsQ0FBQTtRQUNiLHlEQUF5RDtRQUN6RCw0Q0FBc0IsQ0FBQTtRQUN0QiwyREFBMkQ7UUFDM0QsdURBQWlDLENBQUE7UUFDakMsOENBQThDO1FBQzlDLGtEQUE0QixDQUFBO1FBQzVCLDJJQUEySTtRQUMzSSxtQ0FBYSxDQUFBO1FBQ2IsMENBQTBDO0lBQzVDLENBQUMsRUFaVyxrQkFBa0IsR0FBbEIsNEJBQWtCLEtBQWxCLDRCQUFrQixRQVk3QjtJQUVELElBQVksc0JBUVg7SUFSRCxXQUFZLHNCQUFzQjtRQUNoQyx1SUFBdUk7UUFDdkkseUdBQXlHO1FBQ3pHLGlEQUF1QixDQUFBO1FBQ3ZCLG9IQUFvSDtRQUNwSCwrQ0FBcUIsQ0FBQTtRQUNyQixvSkFBb0o7UUFDcEosMkNBQWlCLENBQUE7SUFDbkIsQ0FBQyxFQVJXLHNCQUFzQixHQUF0QixnQ0FBc0IsS0FBdEIsZ0NBQXNCLFFBUWpDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFhLFNBQVUsU0FBUSxVQUFBLE9BQU87UUFDcEMscUdBQXFHO1FBQ3JHLGtFQUFrRTtRQUNsRSx3RkFBd0Y7aUJBQ2pFLGVBQVUsR0FBdUIsRUFBRSxBQUF6QixDQUEwQjtpQkFDcEMsY0FBUyxHQUFXLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQUFBaEQsQ0FBaUQ7UUFZakYsNkJBQTZCLENBQThHO1FBRTNJLFlBQW1CLFFBQWdCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsaUJBQXFDLEVBQUUsRUFBRSxPQUFlLEVBQUU7WUFDM0csS0FBSyxFQUFFLENBQUM7WUFkSCxlQUFVLEdBQVcsU0FBUyxDQUFDO1lBRS9CLGNBQVMsR0FBVyxDQUFDLENBQUM7WUFDdEIsV0FBTSxHQUFtQixFQUFFLENBQUMsQ0FBQyxnRkFBZ0Y7WUFHN0csV0FBTSxHQUEwQixFQUFFLENBQUM7WUFDaEMsb0JBQWUsR0FBVyxFQUFFLENBQUMsQ0FBQywyREFBMkQ7WUFFbkcsNkRBQTZEO1lBQ3JELG9CQUFlLEdBQXlELElBQUksR0FBRyxFQUFtRCxDQUFDO1lBQzNJLGtDQUE2QixHQUFzRCxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztZQUl6SSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO1lBQ3pDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQTJCLElBQVksT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNILElBQVcsU0FBUztZQUNsQixtQ0FBbUM7WUFDbkMsSUFBSSxFQUFFLEdBQWUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQVcsR0FBRztZQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBVyxHQUFHLENBQUMsSUFBWTtZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxVQUFVO1lBQ2YsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxRQUFRLENBQUMsS0FBYSxFQUFFLFVBQWtCLEVBQUUsYUFBcUM7WUFDdEYsSUFBSSxDQUFDLEdBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksa0JBQTRDLENBQUM7WUFFakQsSUFBSSxhQUFhLElBQUksc0JBQXNCLENBQUMsU0FBUztnQkFDbkQsa0JBQWtCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUM7O2dCQUV6RyxrQkFBa0IsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztZQUVySCxDQUFDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxlQUFlLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxhQUFxQyxFQUFFLFVBQWtCO1lBQzFHLElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQztZQUM3QixJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNELElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM3QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFFN0IsT0FBTyxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksYUFBYSxHQUEwQixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDN0IsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMzRixJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxRQUFRLENBQUMsS0FBYSxFQUFFLEtBQWE7WUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksV0FBVyxDQUFDLEtBQWE7WUFDOUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUdEOztXQUVHO1FBQ0ksa0JBQWtCO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN2RCwwRkFBMEY7WUFDMUYsd0JBQXdCO1FBQzFCLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxLQUFhLEVBQUUsU0FBNkIsRUFBRSxZQUFvQixLQUFLO1lBQ3pGLFFBQVEsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssa0JBQWtCLENBQUMsSUFBSTtvQkFDMUIscUNBQXFDO29CQUNyQyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO29CQUMvQixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUzt3QkFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFLLG9DQUFvQztnQkFDMUUsS0FBSyxrQkFBa0IsQ0FBQyxlQUFlO29CQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUzt3QkFDekIsa0NBQWtDO3dCQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUssb0NBQW9DO1lBQzVFLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ksa0JBQWtCLENBQUMsS0FBYSxFQUFFLFNBQTZCO1lBQ3BFLFFBQVEsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssa0JBQWtCLENBQUMsSUFBSTtvQkFDMUIsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsb0NBQW9DO2dCQUNwQywrREFBK0Q7Z0JBQy9ELGdCQUFnQjtnQkFDaEIsU0FBUztnQkFDVCxpQkFBaUI7Z0JBQ2pCLEtBQUssa0JBQWtCLENBQUMsWUFBWTtvQkFDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDWixLQUFLLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztnQkFDbEMsS0FBSyxrQkFBa0IsQ0FBQyxlQUFlO29CQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQzVCLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7Z0JBQ0g7b0JBQ0UsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLENBQUMsR0FBa0I7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLE1BQU0sRUFBRSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsMkJBQTJCO2FBQzVCLENBQUM7WUFDRixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxDQUFDLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztZQUN0RCw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztZQUVsRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFNUcsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO1lBRTdGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGlDQUFpQztRQUNqQyw2QkFBNkI7UUFDN0IsSUFBSTtRQUVNLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDNUIsQ0FBQztRQUNEOzs7O1dBSUc7UUFDSyxpQ0FBaUMsQ0FBQyxVQUFrQjtZQUMxRCxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksbUJBQW1CLEdBQXFCLFVBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxtQkFBbUIsWUFBWSxVQUFBLGlCQUFpQjtvQkFDbEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDOztvQkFFMUQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNLLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxjQUE2QjtZQUM3RSxJQUFJLFNBQVMsR0FBdUIsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzdCLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3hDLElBQUksT0FBTyxHQUFzQixJQUFJLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekQsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFzQixDQUFDLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSyxtQkFBbUIsQ0FBQyxVQUFrQixFQUFFLGFBQXFDO1lBQ25GLElBQUksYUFBYSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekUsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDakYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSywyQkFBMkIsQ0FBQyxVQUE4QixFQUFFLEtBQWE7WUFDL0UsSUFBSSxVQUFVLEdBQVksRUFBRSxDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztvQkFDL0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUF1QixVQUFVLENBQUMsQ0FBQyxDQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBcUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3RixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7O1dBR0c7UUFDSyx3QkFBd0IsQ0FBQyxVQUE4QjtZQUM3RCxLQUFLLElBQUksQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxVQUFBLGlCQUFpQixFQUFFLENBQUM7b0JBQy9DLElBQUksUUFBUSxHQUF5QyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25FLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEIsSUFBSSxZQUFZLEdBQVcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzFELENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyx3QkFBd0IsQ0FBcUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSyw4QkFBOEIsQ0FBQyxLQUErQjtZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLEdBQXVCLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxLQUFLLEVBQUUsQ0FBQztvQkFDZCxLQUFLLHdCQUF3QixDQUFDLE1BQU07d0JBQ2xDLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7d0JBQzdCLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxPQUFPO3dCQUNuQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzlHLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxRQUFRO3dCQUNwQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQy9HLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxlQUFlO3dCQUMzQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzdKLE1BQU07b0JBQ1I7d0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssd0JBQXdCLENBQUMsS0FBK0I7WUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLEVBQUUsR0FBMEIsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLEtBQUssRUFBRSxDQUFDO29CQUNkLEtBQUssd0JBQXdCLENBQUMsTUFBTTt3QkFDbEMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7d0JBQ2pCLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxPQUFPO3dCQUNuQyxFQUFFLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDckQsTUFBTTtvQkFDUixLQUFLLHdCQUF3QixDQUFDLFFBQVE7d0JBQ3BDLEVBQUUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUN0RCxNQUFNO29CQUNSLEtBQUssd0JBQXdCLENBQUMsZUFBZTt3QkFDM0MsRUFBRSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDMUcsTUFBTTtvQkFDUjt3QkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDZCxDQUFDO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSyxnQ0FBZ0MsQ0FBQyxhQUFpQyxFQUFFLGNBQXdCO1lBQ2xHLElBQUksWUFBWSxHQUF1QixFQUFFLENBQUM7WUFDMUMsS0FBSyxJQUFJLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO29CQUNsRCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBcUIsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNoSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssd0JBQXdCLENBQUMsU0FBNEI7WUFDM0QsSUFBSSxHQUFHLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELElBQUksTUFBTSxHQUFpQixTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEdBQUcsR0FBaUIsSUFBSSxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1SSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRDs7OztXQUlHO1FBQ0sseUJBQXlCLENBQUMsU0FBNEI7WUFDNUQsSUFBSSxHQUFHLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELElBQUksU0FBUyxHQUFXLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxHQUFHLEdBQWlCLElBQUksVUFBQSxZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBQSx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssNkJBQTZCLENBQUMsT0FBOEI7WUFDbEUsSUFBSSxFQUFFLEdBQTBCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVEOzs7O1dBSUc7UUFDSyw4QkFBOEIsQ0FBQyxPQUE4QjtZQUNuRSxJQUFJLEVBQUUsR0FBMEIsRUFBRSxDQUFDO1lBQ25DLElBQUksU0FBUyxHQUFXLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BELEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVEOzs7Ozs7V0FNRztRQUNLLGtCQUFrQixDQUFDLGNBQXFDLEVBQUUsSUFBWSxFQUFFLElBQVk7WUFDMUYsSUFBSSxlQUFlLEdBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7b0JBQ2hFLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQzs7SUE1Y1UsbUJBQVMsWUE2Y3JCLENBQUE7QUFDSCxDQUFDLEVBNWlCUyxTQUFTLEtBQVQsU0FBUyxRQTRpQmxCO0FDNWlCRCxJQUFVLFNBQVMsQ0FnRmxCO0FBaEZELFdBQVUsU0FBUztJQUNqQjs7Ozs7T0FLRztJQUNILE1BQWEsaUJBQWlCO1FBUTVCLFlBQW1CLE1BQW9CLEVBQUUsVUFBd0IsSUFBSTtZQVA3RCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1lBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztZQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7WUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1lBS3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBVyxRQUFRLENBQUMsTUFBb0I7WUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFXLFNBQVMsQ0FBQyxPQUFxQjtZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLGFBQWE7WUFDbEIsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxRQUFRLENBQUMsS0FBYTtZQUMzQixLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSSxLQUFLLEdBQVcsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLEtBQUssR0FBVyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLFNBQVM7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxVQUFBLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqRixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLFVBQUEsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDckQsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQztLQUNGO0lBeEVZLDJCQUFpQixvQkF3RTdCLENBQUE7QUFDSCxDQUFDLEVBaEZTLFNBQVMsS0FBVCxTQUFTLFFBZ0ZsQjtBQ2hGRCxJQUFVLFNBQVMsQ0FrQmxCO0FBbEJELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLGlDQUFpQyxDQUFDLFVBQUEsU0FBUyxDQUFDO1FBQ3RFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFnQixJQUFJLENBQUMsSUFBSTtZQUN2RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixPQUFPLFVBQUEsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO0tBT0Y7SUFaWSx1QkFBYSxnQkFZekIsQ0FBQTtBQUNILENBQUMsRUFsQlMsU0FBUyxLQUFULFNBQVMsUUFrQmxCO0FDbEJELElBQVUsU0FBUyxDQXNJbEI7QUF0SUQsV0FBVSxTQUFTO0lBRWpCLElBQVksdUJBSVg7SUFKRCxXQUFZLHVCQUF1QjtRQUNqQyw2RUFBUSxDQUFBO1FBQ1IseUVBQU0sQ0FBQTtRQUNOLHVFQUFLLENBQUE7SUFDUCxDQUFDLEVBSlcsdUJBQXVCLEdBQXZCLGlDQUF1QixLQUF2QixpQ0FBdUIsUUFJbEM7SUFDRCxpRUFBaUU7SUFFakU7Ozs7OztPQU1HO0lBQ0gsTUFBYSxZQUFhLFNBQVEsVUFBQSxPQUFPO1FBT3ZDLEtBQUssQ0FBUztRQUNkLE1BQU0sQ0FBUztRQUNmLGNBQWMsQ0FBMEI7UUFFeEMsUUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixTQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRXRCLFlBQW1CLFFBQWdCLENBQUMsRUFBRSxTQUFpQixDQUFDLEVBQUUsaUJBQTBDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxXQUFtQixDQUFDLEVBQUUsWUFBb0IsQ0FBQztZQUM1SyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBRTNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFBLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBZ0I7WUFDdEQsT0FBTyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQVcsSUFBSTtZQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBVyxJQUFJLENBQUMsS0FBYTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQVcsS0FBSztZQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBRUQsSUFBVyxLQUFLLENBQUMsTUFBYztZQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQVcsYUFBYTtZQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQVcsYUFBYSxDQUFDLGNBQXVDO1lBQzlELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBVyxPQUFPO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBVyxPQUFPLENBQUMsTUFBYztZQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFXLFFBQVEsQ0FBQyxNQUFjO1lBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1lBQ3RDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNoQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDbEMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2xELGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUN6QyxpREFBaUQ7WUFDakQsK0VBQStFO1lBQy9FLHdDQUF3QztZQUN4QyxTQUFTO1lBQ1QscUNBQXFDO1lBRXJDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLEVBQUU7UUFDSixDQUFDO0tBRUY7SUFySFksc0JBQVksZUFxSHhCLENBQUE7QUFDSCxDQUFDLEVBdElTLFNBQVMsS0FBVCxTQUFTLFFBc0lsQjtBQ3RJRCxJQUFVLFNBQVMsQ0FzS2xCO0FBdEtELFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxpQkFBa0IsU0FBUSxVQUFBLE9BQU87UUFHNUMsWUFBbUIsUUFBd0IsRUFBRTtZQUMzQyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ksUUFBUSxDQUFDLEtBQWE7WUFDM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUN2QixPQUFPLFNBQVMsQ0FBQyxDQUFDLGtMQUFrTDtZQUN0TSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLO2dCQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRzVCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztnQkFDRCxrQ0FBa0M7Z0JBQ2xDLCtCQUErQjtZQUNqQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLElBQWtCO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxTQUFTLENBQUMsSUFBa0IsRUFBRSxLQUFjLEVBQUUsTUFBZTtZQUNsRSxJQUFJLEtBQUssSUFBSSxJQUFJO2dCQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksTUFBTSxJQUFJLElBQUk7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxTQUFTLENBQUMsSUFBa0I7WUFDakMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN2QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsT0FBTztnQkFDVCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNJLE9BQU8sQ0FBQyxLQUFhO1lBQzFCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQ3ZCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLO29CQUNuQixPQUFPLEdBQUcsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxnQkFBZ0IsQ0FBQyxNQUFjO1lBQ3BDLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxFQUFFLEdBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxNQUFNLENBQUMsTUFBYztZQUMxQixJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFDMUMsT0FBTyxJQUFJLENBQUM7WUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE9BQU87WUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLENBQUMsR0FBa0I7Z0JBQ3JCLElBQUksRUFBRSxFQUFFO2dCQUNSLGlCQUFpQixFQUFFLElBQUk7YUFDeEIsQ0FBQztZQUNGLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVELGdGQUFnRjtnQkFDaEYsSUFBSSxDQUFDLEdBQWlCLElBQUksVUFBQSxZQUFZLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNTLGFBQWEsQ0FBQyxRQUFpQixJQUFnQixDQUFDO1FBQzFELFlBQVk7UUFFWjs7V0FFRztRQUNLLG1CQUFtQjtZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLGlLQUFpSztvQkFDakssQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUEvSlksMkJBQWlCLG9CQStKN0IsQ0FBQTtBQUNILENBQUMsRUF0S1MsU0FBUyxLQUFULFNBQVMsUUFzS2xCO0FDdEtELElBQVUsU0FBUyxDQThKbEI7QUE5SkQsV0FBVSxTQUFTO1FBRUosZUFBZTtnQ0FEM0IsVUFBQSxVQUFVOzs7OzBCQUMwQixVQUFBLFNBQVM7OzttQ0FBakIsU0FBUSxXQUFTOzs7OzJDQWtCM0MsVUFBQSxVQUFVLEVBQ1YsVUFBQSxJQUFJLENBQUMsVUFBQSxPQUFPLENBQUM7Z0JBQ2QsNEtBQVcsT0FBTyw2REFFakI7Z0JBdEJILDZLQTJKQzs7OztxQkExSndCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQUFBdEQsQ0FBdUQ7WUFRdkYsUUFBUSxDQUFpQztZQUV6QyxzQ0FBc0M7WUFDdEMsWUFBbUIsUUFBZ0IsaUJBQWlCO2dCQUNsRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFYZCxXQUFNLElBRkgsbURBQWUsRUFFRCxFQUFFLEVBQUM7Z0JBQ3BCLGNBQVMsR0FBVyxDQUFDLENBQUM7Z0JBQ3RCLFVBQUssR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsU0FBSSxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxTQUFJLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLFNBQUksR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFM0MsYUFBUSxHQUFZLFVBQUEsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFLdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVILENBQUM7WUFJRCxJQUFXLE9BQU87Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN2QixDQUFDO1lBQ0Q7O2VBRUc7WUFDSCxJQUFXLE9BQU8sQ0FBQyxRQUFpQjtnQkFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUgsQ0FBQztZQUVEOztlQUVHO1lBQ0ksTUFBTSxDQUFDLFFBQWlCLEVBQUUsT0FBZSxFQUFFLFVBQWtCLEVBQUUsTUFBZSxFQUFFLEtBQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLGdCQUF3QjtnQkFDN0osSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO2dCQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7Z0JBRXhDLElBQUksS0FBSyxHQUFZLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUUvQyxJQUFJLFlBQVksR0FBc0IsSUFBSSxVQUFBLGlCQUFpQixFQUFFLENBQUM7Z0JBQzlELElBQUksWUFBWSxHQUFzQixJQUFJLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxNQUFNLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLE1BQU0sR0FBc0IsSUFBSSxVQUFBLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFBLFlBQVksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFBLFlBQVksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVDLEtBQUssSUFBSSxLQUFLLEdBQVcsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQzFELElBQUksSUFBSSxHQUFXLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztvQkFDdkQsSUFBSSxRQUFRLEdBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtvQkFDM0gsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQUEsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxnQkFBZ0I7b0JBQzdHLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsZ0JBQWdCO2dCQUNoSCxDQUFDO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsR0FBRztvQkFDeEIsWUFBWSxFQUFFO3dCQUNaLG1CQUFtQixFQUFFLENBQUM7Z0NBQ3BCLFVBQVUsRUFBRTtvQ0FDVixhQUFhLEVBQUU7d0NBQ2IsQ0FBQyxFQUFFLFlBQVk7d0NBQ2YsQ0FBQyxFQUFFLFlBQVk7cUNBQ2hCO29DQUNELFNBQVMsRUFBRTt3Q0FDVCxDQUFDLEVBQUUsTUFBTTt3Q0FDVCxDQUFDLEVBQUUsTUFBTTtxQ0FDVjtpQ0FDRjs2QkFDRixDQUFDO3FCQUNIO2lCQUNGLENBQUM7Z0JBRUYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsQ0FBQztZQUVEOztlQUVHO1lBQ0ksUUFBUTtnQkFDYixPQUFPLElBQUksVUFBQSxPQUFPLENBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssRUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUNsRCxDQUFDO1lBQ0osQ0FBQztZQUVEOztlQUVHO1lBQ0ksWUFBWTtnQkFDakIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksU0FBUyxHQUFjLEVBQUUsQ0FBQztnQkFDOUIsS0FBSyxJQUFJLEtBQUssR0FBVyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDekQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQUEsT0FBTyxDQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDLENBQUM7b0JBRUgsS0FBSyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUM1QixLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUNWLEtBQUssRUFBRSxDQUFDO29CQUNWLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsa0JBQWtCO1lBQ1gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLFVBQXFCLEVBQUUsZUFBeUI7Z0JBQ3JGLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1SCxDQUFDO1lBRU0sU0FBUztnQkFDZCxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO2dCQUN0QyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQzNDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDbkMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN6QyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO29CQUNoRCxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQWEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBRXZFLElBQUksbUJBQW1CLEdBQXVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztnQkFDL0Qsd0RBQXdEO2dCQUN4RCxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLDZCQUE2QjtnQkFDNUUsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7Z0JBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLGNBQWMsQ0FBQyxTQUFTO29CQUMxQixJQUFJLENBQUMsUUFBUSxHQUFZLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFL0UsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztvQkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFFLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5SSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxZQUFZO1lBRVo7O2VBRUc7WUFDSSxrQkFBa0I7Z0JBQ3ZCLElBQUksU0FBUyxHQUFjLElBQUksVUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDOztnQkExSlUsdURBQWU7Ozs7O0lBQWYseUJBQWUsa0JBMkozQixDQUFBO0FBQ0gsQ0FBQyxFQTlKUyxTQUFTLEtBQVQsU0FBUyxRQThKbEI7QUM5SkQsSUFBVSxTQUFTLENBMkVsQjtBQTNFRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxLQUFNLFNBQVEsVUFBQSxPQUFPO1FBUWhDLFlBQW1CLElBQWtCO1lBQ25DLEtBQUssRUFBRSxDQUFDO1lBUkgsU0FBSSxHQUFXLE9BQU8sQ0FBQztZQUN2QixlQUFVLEdBQVcsU0FBUyxDQUFDO1lBQy9CLFdBQU0sR0FBZ0IsU0FBUyxDQUFDO1lBQ2hDLFNBQUksR0FBUSxTQUFTLENBQUM7WUFDckIsUUFBRyxHQUFnQixTQUFTLENBQUM7WUFDN0IsVUFBSyxHQUFZLEtBQUssQ0FBQztZQUk3QixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFXLE9BQU87WUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBaUI7WUFDakMsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBQSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQWEsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBZ0IsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUQsSUFBSSxNQUFNLEdBQWdCLE1BQU0sVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxpQ0FBbUIsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsT0FBTztnQkFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ2hCLENBQUM7UUFDSixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsVUFBcUIsRUFBRSxlQUF5QjtZQUNyRixJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsOENBQThDO1lBQzlFLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsaURBQWlEO1lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELGlEQUFpRDtZQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QywrQkFBK0I7WUFDL0IsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUM7S0FFRjtJQXJFWSxlQUFLLFFBcUVqQixDQUFBO0FBQ0gsQ0FBQyxFQTNFUyxTQUFTLEtBQVQsU0FBUyxRQTJFbEI7QUUzRUQsNkNBQTZDO0FBQzdDLElBQVUsU0FBUyxDQXlFbEI7QUExRUQsNkNBQTZDO0FBQzdDLFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsWUFBWTtRQUM1QyxvR0FBb0c7aUJBQzdFLFlBQU8sR0FBaUIsSUFBSSxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxBQUFwRixDQUFxRjtpQkFDcEcsZ0JBQVcsR0FBVSxJQUFJLEtBQUssNkNBQW9CLEFBQXZDLENBQXdDO1FBTWxFLFlBQW1CLGVBQXFDO1lBQ3RELEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUpqQixVQUFLLEdBQVMsSUFBSSxDQUFDO1lBQ25CLGdCQUFXLEdBQTJCLElBQUksQ0FBQztZQXNCbkQ7O2VBRUc7WUFDSSxhQUFRLEdBQUcsQ0FBQyxNQUFtQixFQUFRLEVBQUU7Z0JBQzlDLElBQUksSUFBSSxDQUFDLEtBQUs7b0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLDREQUEwQixDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxNQUFNO29CQUNULE9BQU87Z0JBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSywwREFBMEIsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQztZQUVGOztlQUVHO1lBQ0ksd0JBQW1CLEdBQUcsR0FBUyxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEIsQ0FBQyxDQUFDO1lBRUY7O2VBRUc7WUFDSSxlQUFVLEdBQUcsQ0FBQyxZQUEyQyxFQUFRLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1lBQ2xDLENBQUMsQ0FBQztZQUVGOztlQUVHO1lBQ0ksV0FBTSxHQUFHLEdBQVMsRUFBRTtnQkFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVM7b0JBQ3pCLE9BQU87Z0JBQ1QsNERBQTREO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQUksSUFBSSxDQUFDLFdBQVc7b0JBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUM7WUF0REEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsTUFBTSxDQUFDLE1BQWM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QixDQUFDOztJQTNCVSxzQkFBWSxlQWtFeEIsQ0FBQTtBQUNILENBQUMsRUF6RVMsU0FBUyxLQUFULFNBQVMsUUF5RWxCO0FDMUVELHdCQUF3QjtBQUV4QixVQUFVO0FBQ1Ysc0RBQXNEO0FBQ3RELFVBQVU7QUFDVixxRkFBcUY7QUFFckYsVUFBVTtBQUNWLHNEQUFzRDtBQUN0RCw0REFBNEQ7QUFDNUQsd0RBQXdEO0FBQ3hELGtEQUFrRDtBQUNsRCw4Q0FBOEM7QUFDOUMsVUFBVTtBQUNWLGlDQUFpQztBQUNqQyw4QkFBOEI7QUFDOUIsNEJBQTRCO0FBQzVCLFFBQVE7QUFDUixVQUFVO0FBQ1YseURBQXlEO0FBQ3pELDJDQUEyQztBQUMzQyxVQUFVO0FBQ1YscUNBQXFDO0FBRXJDLG1EQUFtRDtBQUVuRCxxQ0FBcUM7QUFDckMsbURBQW1EO0FBQ25ELGdEQUFnRDtBQUVoRCx1Q0FBdUM7QUFDdkMsMENBQTBDO0FBRTFDLDBGQUEwRjtBQUMxRiwwRkFBMEY7QUFDMUYsOEVBQThFO0FBQzlFLHFEQUFxRDtBQUNyRCxxREFBcUQ7QUFDckQsbUVBQW1FO0FBQ25FLGdCQUFnQjtBQUNoQixxQkFBcUI7QUFDckIsOENBQThDO0FBQzlDLGlGQUFpRjtBQUNqRixvQkFBb0I7QUFDcEIseUJBQXlCO0FBQ3pCLDZGQUE2RjtBQUM3RixvQkFBb0I7QUFDcEIsZ0JBQWdCO0FBQ2hCLFlBQVk7QUFFWiw2RUFBNkU7QUFDN0UscURBQXFEO0FBQ3JELG1FQUFtRTtBQUNuRSxnQkFBZ0I7QUFDaEIscUJBQXFCO0FBQ3JCLDhDQUE4QztBQUM5QyxpRkFBaUY7QUFDakYsb0JBQW9CO0FBQ3BCLGdCQUFnQjtBQUNoQixZQUFZO0FBRVosd0RBQXdEO0FBQ3hELDBDQUEwQztBQUMxQyxZQUFZO0FBRVoseUhBQXlIO0FBQ3pILGdFQUFnRTtBQUNoRSw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBRTVDLGdFQUFnRTtBQUNoRSw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBRTVDLDZHQUE2RztBQUM3RyxZQUFZO0FBRVosNERBQTREO0FBQzVELDJDQUEyQztBQUMzQyxZQUFZO0FBRVosNENBQTRDO0FBQzVDLHFDQUFxQztBQUNyQyxZQUFZO0FBRVosb0VBQW9FO0FBQ3BFLHFEQUFxRDtBQUNyRCwrREFBK0Q7QUFDL0QsWUFBWTtBQUVaLCtDQUErQztBQUMvQywwQ0FBMEM7QUFDMUMsWUFBWTtBQUVaLHlGQUF5RjtBQUN6RiwyQ0FBMkM7QUFDM0MsMkhBQTJIO0FBQzNILFlBQVk7QUFFWiwwQ0FBMEM7QUFDMUMscUNBQXFDO0FBQ3JDLFlBQVk7QUFFWixvRUFBb0U7QUFDcEUsa0RBQWtEO0FBQ2xELHNEQUFzRDtBQUN0RCx5Q0FBeUM7QUFDekMsbUdBQW1HO0FBQ25HLHlIQUF5SDtBQUV6SCw0REFBNEQ7QUFDNUQsWUFBWTtBQUNaLFFBQVE7QUFDUixJQUFJO0FDakhKLElBQVUsU0FBUyxDQThDbEI7QUE5Q0QsV0FBVSxTQUFTO0lBQ2pCOzs7T0FHRztJQUNILE1BQWEseUJBQTBCLFNBQVEsVUFBQSxTQUFTO2lCQUMvQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQVFqRyxZQUFtQixnQkFBd0IsRUFBRSxFQUFFLFFBQWdCLElBQUksRUFBRSx1QkFBK0IsR0FBRyxFQUFFLHFCQUE2QixDQUFDLEVBQUUsd0JBQWdDLENBQUM7WUFDeEssS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUM7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztRQUNwRCxDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQjtnQkFDakMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDN0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDekMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNoRCxDQUFDO1lBQ0YsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztZQUM5RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1lBQzFELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUMsb0JBQW9CLENBQUM7WUFDaEUsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQXZDVSxtQ0FBeUIsNEJBd0NyQyxDQUFBO0FBQ0gsQ0FBQyxFQTlDUyxTQUFTLEtBQVQsU0FBUyxRQThDbEI7QUM5Q0Qsd0NBQXdDO0FBQ3hDLGtEQUFrRDtBQUVsRCxJQUFVLFNBQVMsQ0EwTWxCO0FBN01ELHdDQUF3QztBQUN4QyxrREFBa0Q7QUFFbEQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztRQUNVLGlCQUFpQjswQkFBUyxVQUFBLFNBQVM7Ozs7cUJBQW5DLGlCQUFrQixTQUFRLFdBQVM7Ozt5Q0FHN0MsVUFBQSxJQUFJLENBQUMsVUFBQSxTQUFTLENBQUM7Z0JBQ2hCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBWTs7O3FCQUhMLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxBQUF4RCxDQUF5RDtZQVN6RixNQUFNLENBQWE7WUFDbkIsVUFBVSxDQUFPO1lBQ2pCLFNBQVMsQ0FBYTtZQUV0QixZQUFtQixVQUFzQixFQUFFLFlBQWdDLFVBQUEsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGdCQUF3QyxVQUFBLHNCQUFzQixDQUFDLFNBQVM7Z0JBQzFLLEtBQUssRUFBRSxDQUFDO2dCQWJWLGlFQUFpRTtnQkFFMUQsY0FBUyw0REFBWTtnQkFDckIsYUFBUSx5REFBcUI7Z0JBRTdCLHNCQUFpQixHQUFZLElBQUksQ0FBQztnQkFDbEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7Z0JBRXhDLFdBQU0sR0FBVyxDQUFDLENBQUM7Z0JBRW5CLGNBQVMsR0FBVyxDQUFDLENBQUM7Z0JBcUl0Qix5QkFBeUI7Z0JBQ3pCOzs7O21CQUlHO2dCQUNLLHdCQUFtQixHQUFHLENBQUMsRUFBUyxFQUFFLEtBQWMsRUFBVyxFQUFFO29CQUNuRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLENBQUM7d0JBQy9CLE9BQU8sSUFBSSxDQUFDO29CQUVkLElBQUksSUFBSSxHQUFXLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3hFLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxVQUFBLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUN2RCxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN0RCxDQUFDO29CQUNELElBQUksU0FBUyxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBRXZHLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQ3RCLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7d0JBQ3ZDLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNuRixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDcEMsQ0FBQzt3QkFDRCxPQUFPLE9BQU8sQ0FBQztvQkFDakIsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUM7Z0JBWUY7O21CQUVHO2dCQUNLLGdCQUFXLEdBQUcsR0FBUyxFQUFFO29CQUMvQixJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNuQyxJQUFJLElBQUksQ0FBQyxpQkFBaUI7d0JBQ3hCLFFBQVEsSUFBSSxVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUM7Z0JBakxBLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0JBRTVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFBLElBQUksRUFBRSxDQUFDO2dCQUU3Qix1RUFBdUU7Z0JBQ3ZFLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztnQkFFckMsSUFBSSxDQUFDLGdCQUFnQixpREFBeUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLENBQUMsZ0JBQWdCLDJDQUFzQixHQUFHLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLHlDQUFxQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQVcsS0FBSyxDQUFDLE1BQWM7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUVELElBQVcsS0FBSztnQkFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckIsQ0FBQztZQUVEOzs7ZUFHRztZQUNILElBQVcsSUFBSTtnQkFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDMUQsQ0FBQztZQUVELElBQVcsSUFBSSxDQUFDLEtBQWE7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUVNLFFBQVEsQ0FBQyxHQUFZO2dCQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ1osT0FBTztnQkFFVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUVEOztlQUVHO1lBQ0ksTUFBTSxDQUFDLEtBQWE7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDekMsSUFBSSxPQUFPLEdBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFFRDs7ZUFFRztZQUNJLFdBQVcsQ0FBQyxNQUFjO2dCQUMvQixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakQsSUFBSSxJQUFJO29CQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxlQUFlLENBQUMsS0FBYTtnQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBRUQsa0JBQWtCO1lBQ1gsU0FBUztnQkFDZCxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO2dCQUN0QyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzFELGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3RELGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pELGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFFckQsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7Z0JBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsU0FBUyxHQUFjLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO2dCQUV0RCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsYUFBdUIsSUFBSSxFQUFFLGtCQUEyQixJQUFJO2dCQUNqRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO1lBQ0gsQ0FBQztZQUVNLHdCQUF3QixDQUFDLFFBQWlCO2dCQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLEtBQUssQ0FBQyxRQUFRO29CQUNoQixLQUFLLENBQUMsUUFBUSxHQUFHLFVBQUEsa0JBQWtCLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLFlBQVk7b0JBQ3BCLEtBQUssQ0FBQyxZQUFZLEdBQUcsVUFBQSxzQkFBc0IsQ0FBQztnQkFDOUMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsWUFBWTtZQUVKLGlCQUFpQixDQUFDLEdBQVk7Z0JBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBQSxPQUFPLENBQUMsSUFBSSxJQUFJLFVBQUEsSUFBSSxDQUFDLE1BQU0sSUFBSSxVQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksVUFBQSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUNoRyxVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLHVDQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLDZDQUF1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsdUNBQW9CLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsNkNBQXVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNoRixDQUFDO1lBQ0gsQ0FBQztZQWdDRDs7O2VBR0c7WUFDSyxhQUFhLENBQUMsT0FBaUI7Z0JBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNILENBQUM7OztJQXZMVSwyQkFBaUIsb0JBbU03QixDQUFBO0FBQ0gsQ0FBQyxFQTFNUyxTQUFTLEtBQVQsU0FBUyxRQTBNbEI7QUM3TUQsSUFBVSxTQUFTLENBaVdsQjtBQWpXRCxXQUFVLFNBQVM7SUFFakIsSUFBWSxZQVNYO0lBVEQsV0FBWSxZQUFZO1FBQ3RCLG1EQUFtQyxDQUFBO1FBQ25DLG1EQUFtQyxDQUFBO1FBQ25DLGlEQUFpQyxDQUFBO1FBQ2pDLGdEQUFnQyxDQUFBO1FBQ2hDLDRDQUE0QixDQUFBO1FBQzVCLDhDQUE4QixDQUFBO1FBQzlCLDRDQUE0QixDQUFBO1FBQzVCLGdEQUFnQyxDQUFBO0lBQ2xDLENBQUMsRUFUVyxZQUFZLEdBQVosc0JBQVksS0FBWixzQkFBWSxRQVN2QjtJQUVELElBQVksZUFFWDtJQUZELFdBQVksZUFBZTtRQUN6Qix5REFBTSxDQUFBO1FBQUUseURBQU0sQ0FBQTtRQUFFLHFEQUFJLENBQUE7SUFDdEIsQ0FBQyxFQUZXLGVBQWUsR0FBZix5QkFBZSxLQUFmLHlCQUFlLFFBRTFCO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO1FBQ1UsY0FBYzswQkFBUyxVQUFBLFNBQVM7Ozs7cUJBQWhDLGNBQWUsU0FBUSxXQUFTOzs7cUNBTzFDLFVBQUEsSUFBSSxDQUFDLFVBQUEsS0FBSyxDQUFDO2dCQUNaLGlLQUFRLEtBQUssNkJBQUwsS0FBSyxxRkFBUTs7O3FCQVBFLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQUFBckQsQ0FBc0Q7WUFldEYsWUFBbUIsU0FBZ0IsSUFBSSxFQUFFLFFBQWlCLEtBQUssRUFBRSxTQUFrQixLQUFLLEVBQUUsZ0JBQThCLFVBQUEsWUFBWSxDQUFDLE9BQU87Z0JBQzFJLEtBQUssRUFBRSxDQUFDO2dCQWZWLHlGQUF5RjtnQkFDbEYsYUFBUSxHQUFjLFVBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUV4QyxjQUFTLEdBQVksS0FBSyxDQUFDO2dCQUc3QixVQUFLLHdEQUFRO2dCQUNiLFNBQUkscURBQVc7Z0JBSWYsWUFBTyxHQUFZLEtBQUssQ0FBQztnQkFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztnQkE0TWxDLFlBQVk7Z0JBR0osa0JBQWEsR0FBa0IsQ0FBQyxNQUFhLEVBQUUsRUFBRTtvQkFDdkQsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxJQUFJLENBQUMsT0FBTzt3QkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixDQUFDLENBQUM7Z0JBRU0sa0JBQWEsR0FBa0IsQ0FBQyxNQUFhLEVBQUUsRUFBRTtvQkFDdkQsaUVBQWlFO29CQUNqRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsQ0FBQyxDQUFDO2dCQXNDRjs7O21CQUdHO2dCQUNLLGlCQUFZLEdBQUcsQ0FBQyxNQUFhLEVBQVEsRUFBRTtvQkFDN0MscUJBQXFCO29CQUNyQixJQUFJLE1BQU0sQ0FBQyxJQUFJLDRDQUF1QixFQUFFLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLDJEQUEyQixJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQiw2REFBMkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsOENBQXFCLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztvQkFDdkYsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLDJEQUEyQixJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNoRixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQiw2REFBMkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsOENBQXFCLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUN4QixDQUFDO29CQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixDQUFDLENBQUM7Z0JBRUY7O21CQUVHO2dCQUNLLGdCQUFXLEdBQUcsQ0FBQyxNQUFhLEVBQVEsRUFBRTtvQkFDNUMscUJBQXFCO29CQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksNERBQTRCLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFCLENBQUMsQ0FBQztnQkFFRjs7bUJBRUc7Z0JBQ0ssV0FBTSxHQUFHLENBQUMsTUFBYSxFQUFRLEVBQUU7b0JBQ3ZDLElBQUksU0FBUyxHQUFjLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ3pDLElBQUksSUFBSSxDQUFDLElBQUk7d0JBQ1gsU0FBUyxHQUFHLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRW5FLG1DQUFtQztvQkFDbkMsSUFBSSxRQUFRLEdBQVksU0FBUyxDQUFDLFdBQVcsQ0FBQztvQkFDOUMsSUFBSSxPQUFPLEdBQVksVUFBQSxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRTlFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBRXpDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBRTNDLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEIsdUZBQXVGO29CQUN2RixJQUFJLElBQUksQ0FBQyxJQUFJO3dCQUNYLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDO2dCQS9TQSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFakMsSUFBSSxDQUFDLGdCQUFnQiwyQ0FBc0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLGlEQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRWpFLElBQUksTUFBTTtvQkFDUixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLENBQUM7WUFFRCxJQUFXLE1BQU0sQ0FBQyxNQUFjO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxJQUFXLE1BQU07Z0JBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDOUIsQ0FBQztZQUVELElBQVcsSUFBSSxDQUFDLEdBQVk7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUN6QixDQUFDO1lBRUQsSUFBVyxJQUFJO2dCQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUVELElBQVcsWUFBWSxDQUFDLE1BQWM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDMUMsQ0FBQztZQUVELElBQVcsWUFBWTtnQkFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDeEMsQ0FBQztZQUdELElBQVcsU0FBUztnQkFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3RCLENBQUM7WUFFRCxJQUFXLFVBQVU7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7WUFDM0IsQ0FBQztZQUVELElBQVcsVUFBVTtnQkFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLENBQUM7WUFFRDs7ZUFFRztZQUNJLFFBQVEsQ0FBQyxNQUFhO2dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFFRDs7ZUFFRztZQUNJLFFBQVE7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUM7WUFFRDs7ZUFFRztZQUNJLFNBQVMsQ0FBQyxTQUF1QixFQUFFLE1BQWM7Z0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELG9EQUFvRDtZQUNwRDs7ZUFFRztZQUNJLGdCQUFnQixDQUFDLEtBQXNCO2dCQUM1QyxJQUFJLElBQUksR0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLE9BQU8sR0FBWSxVQUFBLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1lBRUQ7O2VBRUc7WUFDSSxZQUFZLENBQUMsS0FBc0I7Z0JBQ3hDLFFBQVEsS0FBSyxFQUFFLENBQUM7b0JBQ2QsS0FBSyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNoRCxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2hELEtBQUssZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDOUMsQ0FBQztZQUNILENBQUM7WUFFRDs7ZUFFRztZQUNJLElBQUksQ0FBQyxHQUFZO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0Isa0NBQW9CLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckUsQ0FBQztvQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixrQ0FBb0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDOztvQkFDQyxJQUFJLENBQUM7d0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDckIsQ0FBQztvQkFBQyxPQUFPLE1BQWUsRUFBRSxDQUFDLENBQUMsd0RBQXdELENBQUMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDckIsQ0FBQztZQUVEOzs7Ozs7Ozs7Ozs7OztlQWNHO1lBQ0ksZ0JBQWdCLENBQUMsTUFBaUIsRUFBRSxPQUFrQjtnQkFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFFRDs7ZUFFRztZQUNJLFFBQVEsQ0FBQyxHQUFZO2dCQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBRUQ7OztlQUdHO1lBQ0ksT0FBTyxDQUFDLEdBQVk7Z0JBQ3pCLElBQUksR0FBRztvQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOztvQkFFMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRU0sVUFBVTtnQkFDZixJQUFJLFFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRSxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksVUFBQSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxLQUFLLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9DLFVBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFBLGNBQWMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRCxVQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFBQSxDQUFDO1lBRUYsa0JBQWtCO1lBQ1gsU0FBUztnQkFDZCxJQUFJLGFBQWEsR0FBa0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNsRCxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3JDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDL0IsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuQyw4REFBOEQ7Z0JBQzlELG9DQUFvQztnQkFDcEMsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUNNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7Z0JBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxLQUFLLEdBQWlCLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFTSxVQUFVO2dCQUNmLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksS0FBSyxHQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ25DLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLHFDQUFxQztnQkFDM0QsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN6QixPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMseUJBQXlCO2dCQUNoRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1lBRUQsMERBQTBEO1lBQzFELGtDQUFrQztZQUNsQyxzQ0FBc0M7WUFDdEMsa0NBQWtDO1lBQ2xDLElBQUk7WUFFTSxhQUFhLENBQUMsUUFBaUI7Z0JBQ3ZDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMzQixDQUFDO1lBZU8sT0FBTyxDQUFDLGdCQUE4QixVQUFBLFlBQVksQ0FBQyxPQUFPO2dCQUNoRSxJQUFJLE1BQU0sR0FBWSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBRU8sWUFBWSxDQUFDLE1BQWEsRUFBRSxLQUFjLEVBQUUsZ0JBQXdCLEdBQUc7Z0JBQzdFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQzVCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFakMsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztvQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDckMsQ0FBQztnQkFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO1lBQ3BDLENBQUM7WUFFTyxnQkFBZ0I7Z0JBQ3RCLElBQUksQ0FBQztvQkFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQzs7O0lBMVFVLHdCQUFjLGlCQWtVMUIsQ0FBQTtBQUNILENBQUMsRUFqV1MsU0FBUyxLQUFULFNBQVMsUUFpV2xCO0FDaldELElBQVUsU0FBUyxDQWdEbEI7QUFoREQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLHNCQUF1QixTQUFRLFVBQUEsU0FBUztRQUFyRDs7WUFFUyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUF1Q3BELENBQUM7aUJBeEN3QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQUFBN0QsQ0FBOEQ7UUFHOUY7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBd0I7WUFDcEMsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUNYLFNBQVMsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5FLG1DQUFtQztZQUNuQyxJQUFJLFFBQVEsR0FBWSxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQzlDLElBQUksT0FBTyxHQUFZLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlFLElBQUksRUFBRSxHQUFZLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEUsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUV2QyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUVyQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwyRUFBMkU7Z0JBQzNFLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFFRCxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQ1gsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTVCLGtGQUFrRjtRQUNwRixDQUFDOztJQXhDVSxnQ0FBc0IseUJBeUNsQyxDQUFBO0FBQ0gsQ0FBQyxFQWhEUyxTQUFTLEtBQVQsU0FBUyxRQWdEbEI7QUNoREQsSUFBVSxTQUFTLENBbUVsQjtBQW5FRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxjQUFlLFNBQVEsVUFBQSxTQUFTO2lCQUNwQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdEYsVUFBVSxDQUFTO1FBQ25CLFVBQVUsQ0FBUztRQUNuQixzQkFBc0IsQ0FBUztRQUUvQixZQUFtQixhQUFxQixJQUFJLEVBQUUsYUFBcUIsR0FBRyxFQUFFLHdCQUFnQyxHQUFHO1lBQ3pHLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFXLFNBQVM7WUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLFNBQVMsQ0FBQyxNQUFjO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQVcsU0FBUztZQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUNELElBQVcsU0FBUyxDQUFDLE1BQWM7WUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBVyxxQkFBcUI7WUFDOUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckMsQ0FBQztRQUNELElBQVcscUJBQXFCLENBQUMsTUFBYztZQUM3QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMxQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO2FBQ2xELENBQUM7WUFDRixhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsT0FBTyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUMzRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDOztJQTVEVSx3QkFBYyxpQkE2RDFCLENBQUE7QUFDSCxDQUFDLEVBbkVTLFNBQVMsS0FBVCxTQUFTLFFBbUVsQjtBQ25FRCxxQ0FBcUM7QUFDckMsSUFBVSxTQUFTLENBdVVsQjtBQXhVRCxxQ0FBcUM7QUFDckMsV0FBVSxTQUFTO0lBQ2pCLElBQVksYUFJWDtJQUpELFdBQVksYUFBYTtRQUN2QiwwQ0FBeUIsQ0FBQTtRQUN6QixzQ0FBcUIsQ0FBQTtRQUNyQixzQ0FBcUIsQ0FBQTtJQUN2QixDQUFDLEVBSlcsYUFBYSxHQUFiLHVCQUFhLEtBQWIsdUJBQWEsUUFJeEI7SUFDRDs7O09BR0c7SUFDSCxJQUFZLFVBS1g7SUFMRCxXQUFZLFVBQVU7UUFDcEIsaUNBQW1CLENBQUE7UUFDbkIsMkNBQTZCLENBQUE7UUFDN0IsbUNBQXFCLENBQUE7UUFDckIsK0JBQWlCLENBQUE7SUFDbkIsQ0FBQyxFQUxXLFVBQVUsR0FBVixvQkFBVSxLQUFWLG9CQUFVLFFBS3JCO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBYSxlQUFnQixTQUFRLFVBQUEsU0FBUztRQUE5Qzs7WUFHUyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0Msa0JBQWEsR0FBVSxJQUFJLFVBQUEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsc0RBQXNEO1lBQzNHLHNJQUFzSTtZQUM5SCxlQUFVLEdBQWUsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtZQUN0RCxnQkFBVyxHQUFXLEdBQUcsQ0FBQztZQUMxQixjQUFTLEdBQWtCLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDbEQsU0FBSSxHQUFXLENBQUMsQ0FBQztZQUNqQixRQUFHLEdBQVcsSUFBSSxDQUFDO1lBQ25CLHNCQUFpQixHQUFZLElBQUksQ0FBQyxDQUFDLDRFQUE0RTtZQUt2SCxtQkFBYyxHQUFjLElBQUksVUFBQSxTQUFTLENBQUMsQ0FBQyxvR0FBb0c7WUFnUy9JLFlBQVk7UUFDZCxDQUFDO2lCQWpUd0IsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxBQUF0RCxDQUF1RDtRQVl2Riw0RUFBNEU7UUFFNUUsZUFBZSxDQUFZO1FBQzNCLGlCQUFpQixDQUFZO1FBQzdCLGNBQWMsQ0FBNEIsQ0FBQyxvR0FBb0c7UUFFL0k7O1dBRUc7UUFDSCxJQUFXLFFBQVE7WUFDakIsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDL0MsSUFBSSxDQUFDO2dCQUNILFNBQVMsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixpRkFBaUY7Z0JBQ2pGLGtEQUFrRDtZQUNwRCxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNILElBQVcsY0FBYztZQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFFOUIsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsZ0JBQWdCO1lBQ3pCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFFaEMsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsYUFBYTtZQUN0QixJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUNyQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7WUFFN0IsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxVQUFBLFNBQVMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksZ0JBQWdCO1lBQ3JCLElBQUksSUFBSSxDQUFDLGVBQWU7Z0JBQUUsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvRCxJQUFJLElBQUksQ0FBQyxpQkFBaUI7Z0JBQUUsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksYUFBYTtZQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksb0JBQW9CO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksY0FBYztZQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksWUFBWTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNO1lBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xCLENBQUM7UUFFRDs7Ozs7V0FLRztRQUNJLGNBQWMsQ0FBQyxVQUFrQixJQUFJLENBQUMsV0FBVyxFQUFFLGVBQXVCLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBNEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFnQixJQUFJLENBQUMsSUFBSSxFQUFFLE9BQWUsSUFBSSxDQUFDLEdBQUc7WUFDL0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBQSxTQUFTLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7UUFDM0ksQ0FBQztRQUVEOzs7Ozs7V0FNRztRQUNJLG1CQUFtQixDQUFDLFFBQWdCLENBQUMsVUFBQSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxTQUFpQixVQUFBLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLFVBQWtCLFVBQUEsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsT0FBZSxDQUFDLFVBQUEsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDO1lBQzdPLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQUEsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUNuSSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxzQkFBc0I7WUFDM0IsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQywyRUFBMkU7WUFDNUksSUFBSSxhQUFhLEdBQVcsQ0FBQyxDQUFDO1lBQzlCLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztZQUU1QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakQsYUFBYSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ2hDLFdBQVcsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEQsV0FBVyxHQUFHLE1BQU0sQ0FBQztnQkFDckIsYUFBYSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2pELENBQUM7aUJBQU0sQ0FBQyxDQUFBLDBCQUEwQjtnQkFDaEMsYUFBYSxHQUFHLE1BQU0sQ0FBQztnQkFDdkIsV0FBVyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRDs7V0FFRztRQUNJLGdCQUFnQixDQUFDLGtCQUEyQjtZQUNqRCxJQUFJLE1BQWUsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBaUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFakgsTUFBTSxHQUFHLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDekUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksZ0JBQWdCLENBQUMsaUJBQTBCO1lBQ2hELElBQUksY0FBYyxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLEdBQWlCLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxHQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSSxvQkFBb0IsQ0FBQyxTQUFrQjtZQUM1QyxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEUsSUFBSSxLQUFhLENBQUM7WUFDbEIsSUFBSSxJQUFJLEdBQWMsVUFBQSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNsRCxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixLQUFLLGFBQWEsQ0FBQyxRQUFRO29CQUN6QixLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO29CQUNsRCxNQUFNO2dCQUNSLEtBQUssYUFBYSxDQUFDLFVBQVU7b0JBQzNCLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7b0JBQ2pELE1BQU07Z0JBQ1IsS0FBSyxhQUFhLENBQUMsUUFBUTtvQkFDekIsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQzVFLE1BQU07WUFDVixDQUFDO1lBRUQsT0FBTyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQzFCLENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ25DLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3pDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO2FBQzVDLENBQUM7WUFDRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1lBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQztZQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMxQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxVQUFVLENBQUMsWUFBWTtvQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7b0JBQ3pFLE1BQU07Z0JBQ1IsS0FBSyxVQUFVLENBQUMsT0FBTztvQkFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixNQUFNO1lBQ1YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLHdCQUF3QixDQUFDLFFBQWlCO1lBQy9DLElBQUksS0FBSyxHQUEwQixLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsSUFBSSxLQUFLLENBQUMsU0FBUztnQkFDakIsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsVUFBVTtnQkFDbEIsS0FBSyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUUxRCxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxVQUFVLENBQUMsT0FBTztvQkFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0YsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksUUFBUSxHQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzlDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFVLFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxVQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBQSxjQUFjLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RCxVQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFTSxrQkFBa0I7WUFDdkIsVUFBQSxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3SixDQUFDO1FBQUEsQ0FBQztRQUVRLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDMUIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDOztJQWhUVSx5QkFBZSxrQkFrVDNCLENBQUE7QUFDSCxDQUFDLEVBdlVTLFNBQVMsS0FBVCxTQUFTLFFBdVVsQjtBQ3hVRCxJQUFVLFNBQVMsQ0FrQmxCO0FBbEJELFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxtQkFBb0IsU0FBUSxVQUFBLFNBQVM7aUJBQ3pCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxBQUExRCxDQUEyRDtRQU0zRjtZQUNFLEtBQUssRUFBRSxDQUFDO1lBTEgsWUFBTyxHQUFZLElBQUksQ0FBQztZQUN4QixPQUFFLEdBQVksVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7WUFJL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQzs7SUFWVSw2QkFBbUIsc0JBVy9CLENBQUE7QUFDSCxDQUFDLEVBbEJTLFNBQVMsS0FBVCxTQUFTLFFBa0JsQjtBQ2xCRCxJQUFVLFNBQVMsQ0FxQ2xCO0FBckNELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7SUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFBLFNBQVM7aUJBQ2xCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUtwRixZQUFtQixTQUFnQixJQUFJLFVBQUEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQWdCLENBQUMsRUFBRSxPQUFlLEVBQUU7WUFDNUYsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQjtnQkFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUM3QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2FBQ2QsQ0FBQztZQUNGLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7O0lBOUJVLHNCQUFZLGVBK0J4QixDQUFBO0FBQ0gsQ0FBQyxFQXJDUyxTQUFTLEtBQVQsU0FBUyxRQXFDbEI7QUNyQ0QsSUFBVSxTQUFTLENBd0JsQjtBQXhCRCxXQUFVLFNBQVM7SUFDakI7Ozs7O09BS0c7SUFDSCxNQUFhLG9CQUFxQixTQUFRLFVBQUEsU0FBUztpQkFDMUIsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFNUY7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7UUFFTSxTQUFTO1lBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7O0lBZlUsOEJBQW9CLHVCQWdCaEMsQ0FBQTtBQUNILENBQUMsRUF4QlMsU0FBUyxLQUFULFNBQVMsUUF3QmxCO0FDeEJELElBQVUsU0FBUyxDQXVGbEI7QUF2RkQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQXNCLEtBQU0sU0FBUSxVQUFBLE9BQU87UUFJekMsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxhQUFxQixDQUFDO1lBQzlFLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7UUFDOUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLE9BQW9CLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdkMsQ0FBQztRQUVNLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUM7WUFDRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksU0FBUztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVTLGFBQWEsS0FBZSxDQUFDO0tBQ3hDO0lBakNxQixlQUFLLFFBaUMxQixDQUFBO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQWEsWUFBYSxTQUFRLEtBQUs7S0FDdEM7SUFEWSxzQkFBWSxlQUN4QixDQUFBO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7S0FDMUM7SUFEWSwwQkFBZ0IsbUJBQzVCLENBQUE7SUFDRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBYSxVQUFXLFNBQVEsS0FBSztLQUNwQztJQURZLG9CQUFVLGFBQ3RCLENBQUE7SUFDRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFhLFNBQVUsU0FBUSxLQUFLO0tBQ25DO0lBRFksbUJBQVMsWUFDckIsQ0FBQTtBQUNILENBQUMsRUF2RlMsU0FBUyxLQUFULFNBQVMsUUF1RmxCO0FDdkZELHdDQUF3QztBQUN4QyxJQUFVLFNBQVMsQ0FzSGxCO0FBdkhELHdDQUF3QztBQUN4QyxXQUFVLFNBQVM7SUFFakI7O09BRUc7SUFDSCx3REFBd0Q7SUFDeEQsSUFBWSxVQUtYO0lBTEQsV0FBWSxVQUFVO1FBQ3BCLHNDQUF3QixDQUFBO1FBQ3hCLDhDQUFnQyxDQUFBO1FBQ2hDLGtDQUFvQixDQUFBO1FBQ3BCLGdDQUFrQixDQUFBO0lBQ3BCLENBQUMsRUFMVyxVQUFVLEdBQVYsb0JBQVUsS0FBVixvQkFBVSxRQUtyQjtJQUNEOzs7O1FBSUk7SUFDSixNQUFhLGNBQWUsU0FBUSxVQUFBLFNBQVM7aUJBQ3BCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQUFBckQsQ0FBc0Q7UUFLdEYsNkhBQTZIO1FBRTdILFlBQW1CLFNBQWdCLElBQUksVUFBQSxZQUFZLEVBQUU7WUFDbkQsS0FBSyxFQUFFLENBQUM7WUFOViwrTUFBK007WUFDeE0sYUFBUSxHQUFjLFVBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNDLFVBQUssR0FBVSxJQUFJLENBQUM7WUFLekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztRQUVELHdDQUF3QztRQUN4Qzs7V0FFRztRQUNJLE9BQU8sQ0FBa0IsTUFBbUI7WUFDakQsSUFBSSxNQUFNLEdBQVksRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUs7Z0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFTSxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRSxVQUFBLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN4QyxDQUFDO1lBQ0YsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBc0IsVUFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxVQUFVO1lBQ2YsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFTSx3QkFBd0IsQ0FBQyxRQUFpQjtZQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksS0FBSyxDQUFDLElBQUk7Z0JBQ1osS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDMUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxJQUFJLElBQUksR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDdEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLFVBQVUsQ0FBQyxjQUFjLENBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsMkNBQTJDO1lBQ25FLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtRQUM5QyxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksUUFBUSxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0UsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLFVBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUMsVUFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQUEsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUFBLENBQUM7UUFFSyxrQkFBa0I7WUFDdkIsSUFBSSxRQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvRSxJQUFJLEtBQUssR0FBVSxVQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzdCLEtBQUssVUFBQSxnQkFBZ0I7b0JBQ25CLE1BQU0sTUFBTSxHQUFXLEdBQUcsQ0FBQztvQkFDM0IsVUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkMsTUFBTSxLQUFLLEdBQWMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNuRixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDekQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdkQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3pELFVBQUEsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN6QyxVQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDakMsTUFBTTtnQkFDUixLQUFLLFVBQUEsVUFBVTtvQkFDYixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksVUFBQSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxVQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN2QyxNQUFNO2dCQUNSLEtBQUssVUFBQSxTQUFTO29CQUNaLFVBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3JDLE1BQU07WUFDVixDQUFDO1lBRUQsVUFBQSxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDOztJQW5HVSx3QkFBYyxpQkFvRzFCLENBQUE7QUFDSCxDQUFDLEVBdEhTLFNBQVMsS0FBVCxTQUFTLFFBc0hsQjtBQ3ZIRCxJQUFVLFNBQVMsQ0FnRGxCO0FBaERELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7UUFDVSxpQkFBaUI7MEJBQVMsVUFBQSxTQUFTOzs7O3FCQUFuQyxpQkFBa0IsU0FBUSxXQUFTOzs7d0NBSzdDLFVBQUEsSUFBSSxDQUFDLFVBQUEsUUFBUSxDQUFDO2dCQUNmLDBLQUFPLFFBQVEsNkJBQVIsUUFBUSwyRkFBVzs7O3FCQUxILGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxBQUF4RCxDQUF5RDtZQVF6RiwyQ0FBMkM7WUFFM0MsWUFBbUIsWUFBc0IsSUFBSTtnQkFDM0MsS0FBSyxFQUFFLENBQUM7Z0JBVkgsZUFBVSxHQUFVLFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsaUJBQVksR0FBVSxVQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLGFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFM0MsYUFBUSwyREFBVztnQkFDMUIsbVBBQW1QO2dCQUM1TyxpQkFBWSwwREFBWSxLQUFLLEVBQUMsQ0FBQyxvREFBb0Q7Z0JBS3hGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixtRUFBbUU7WUFDckUsQ0FBQztZQUdELGtCQUFrQjtZQUNYLFNBQVM7Z0JBQ2QsSUFBSSxhQUFhLEdBQWtCO29CQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0JBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtvQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7b0JBQ2hDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO29CQUMzQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVO2lCQUNyQyxDQUFDO2dCQUVGLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFhLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0UsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7Z0JBQ2hELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDOzs7SUF4Q1UsMkJBQWlCLG9CQTBDN0IsQ0FBQTtBQUNILENBQUMsRUFoRFMsU0FBUyxLQUFULFNBQVMsUUFnRGxCO0FDaERELElBQVUsU0FBUyxDQTBIbEI7QUExSEQsV0FBVSxTQUFTO0lBQ2pCOzs7T0FHRztRQUNVLGFBQWE7MEJBQVMsVUFBQSxTQUFTOzs7O3FCQUEvQixhQUFjLFNBQVEsV0FBUzs7O29DQUt6QyxVQUFBLElBQUksQ0FBQyxVQUFBLElBQUksQ0FBQztnQkFDWCw4SkFBTyxJQUFJLDZCQUFKLElBQUksbUZBQU87OztxQkFMSyxjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEFBQXBELENBQXFEO1lBUXJGLFlBQW1CLEtBQVksRUFBRSxTQUE2QjtnQkFDNUQsS0FBSyxFQUFFLENBQUM7Z0JBUkgsYUFBUSxHQUFjLFVBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBR3BELFNBQUksdURBQU87Z0JBQ1gsYUFBUSxvREFBb0I7Z0JBSWpDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUM1QixDQUFDO1lBRUQsSUFBVyxNQUFNO2dCQUNmLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUM3QyxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLENBQUM7WUFFRCxNQUFNO1lBQ04scUVBQXFFO1lBQ3JFLHVDQUF1QztZQUN2QyxNQUFNO1lBQ04sc0RBQXNEO1lBQ3RELDBGQUEwRjtZQUMxRix3Q0FBd0M7WUFDeEMsK0NBQStDO1lBRS9DLHVIQUF1SDtZQUN2SCx5REFBeUQ7WUFFekQsMkZBQTJGO1lBQzNGLCtGQUErRjtZQUUvRix5QkFBeUI7WUFDekIsK0RBQStEO1lBRS9ELDRDQUE0QztZQUM1QyxtREFBbUQ7WUFDbkQseUJBQXlCO1lBQ3pCLG9CQUFvQjtZQUNwQiw0SEFBNEg7WUFDNUgsZ0hBQWdIO1lBQ2hILE9BQU87WUFFUCx3QkFBd0I7WUFDeEIsa0NBQWtDO1lBRWxDLG1CQUFtQjtZQUNuQixJQUFJO1lBRUoseUZBQXlGO1lBQ3pGLGtDQUFrQztZQUNsQyxzQ0FBc0M7WUFDdEMsYUFBYTtZQUNiLDhFQUE4RTtZQUM5RSw2RUFBNkU7WUFDN0UsT0FBTztZQUNQLGdCQUFnQjtZQUNoQixJQUFJO1lBRUosa0JBQWtCO1lBQ1gsU0FBUztnQkFDZCxJQUFJLGFBQTRCLENBQUM7Z0JBQ2pDLCtIQUErSDtnQkFDL0gsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLElBQUksTUFBTTtvQkFDUixhQUFhLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O29CQUVuQyxhQUFhLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUU1RCxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUNmLGFBQWEsQ0FBQyxRQUFRLEdBQUcsVUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWxFLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDaEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsSUFBSSxJQUFVLENBQUM7Z0JBQ2YsSUFBSSxjQUFjLENBQUMsTUFBTTtvQkFDdkIsSUFBSSxHQUFTLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7b0JBRTlELElBQUksR0FBUyxNQUFNLFVBQUEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUVqQixJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxtQkFBbUIsR0FBeUIsR0FBRyxFQUFFO3dCQUNyRCxNQUFNLG9CQUFvQixHQUF5QixHQUFHLEVBQUU7NEJBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLHFEQUEyQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQzs0QkFDcEYsSUFBSSxDQUFDLG1CQUFtQixtREFBMEIsbUJBQW1CLENBQUMsQ0FBQzt3QkFDekUsQ0FBQyxDQUFDO3dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLHFEQUEyQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkYsQ0FBQyxDQUFDO29CQUNGLElBQUksQ0FBQyxnQkFBZ0IsbURBQTBCLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3RFLENBQUM7Z0JBRUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxZQUFZO1lBRUwsa0JBQWtCO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ1osT0FBTztnQkFDVCxJQUFJLEtBQUssR0FBVSxVQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZDLFVBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQzs7O0lBbEhVLHVCQUFhLGdCQW1IekIsQ0FBQTtBQUVILENBQUMsRUExSFMsU0FBUyxLQUFULFNBQVMsUUEwSGxCO0FDMUhELElBQVUsU0FBUyxDQTZLbEI7QUE3S0QsV0FBVSxTQUFTO0lBRWpCLElBQVksd0JBS1g7SUFMRCxXQUFZLHdCQUF3QjtRQUNsQyxzRUFBc0U7UUFDdEUsdUVBQUksQ0FBQTtRQUNKLG9FQUFvRTtRQUNwRSxpRkFBUyxDQUFBO0lBQ1gsQ0FBQyxFQUxXLHdCQUF3QixHQUF4QixrQ0FBd0IsS0FBeEIsa0NBQXdCLFFBS25DO0lBRUQ7Ozs7O09BS0c7UUFHVSx1QkFBdUI7O2dDQUZuQyxDQUFBLEtBQUEsVUFBQSxxQ0FBcUMsQ0FBQSxDQUFDLFFBQVEsV0FDOUMsVUFBQSxVQUFVOzs7OzBCQUNrQyxVQUFBLFNBQVM7Ozs7OzsyQ0FBakIsU0FBUSxXQUFTOzs7OzhDQUVuRCxVQUFBLElBQUksQ0FBQyxVQUFBLGNBQWMsQ0FBQzt3Q0FrQ3BCLFVBQUEsVUFBVTtnQkFDWCxtS0FBVyxJQUFJLDZEQUVkO2dCQXBDRCw0TEFBTyxjQUFjLDZCQUFkLGNBQWMsdUdBQWlCO2dCQUh4Qyw2S0EySkM7Ozs7cUJBMUp3QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQUFBOUQsQ0FBK0Q7WUFZL0YsOEJBQThCO1lBQzlCLEtBQUssQ0FBUztZQUNkLFVBQVUsQ0FBYTtZQUNkLEtBQUssQ0FBTztZQUVyQixZQUFtQixrQkFBa0MsSUFBSTtnQkFDdkQsS0FBSyxFQUFFLENBQUM7Z0JBaEJILG1CQUFjLElBSFYsbURBQXVCLGlFQUdJO2dCQUN0Qyx3RUFBd0U7Z0JBQ2pFLGNBQVMsOERBQVU7Z0JBVTFCLGVBQVUsR0FBVyxDQUFDLENBQUM7Z0JBMkd2QixZQUFZO2dCQUVKLGFBQVEsR0FBRyxDQUFDLE1BQWEsRUFBUSxFQUFFO29CQUN6QyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDcEIsc0RBQTZCO3dCQUM3Qjs0QkFDRSxVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLHVDQUFvQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLDZDQUF1QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzlELE1BQU07d0JBQ1I7NEJBQ0UsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQix1Q0FBb0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQiw2Q0FBdUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyRSxDQUFDO2dCQUNILENBQUMsQ0FBQztnQkFFTSxXQUFNLEdBQUcsR0FBUyxFQUFFO29CQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVE7d0JBQzNCLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUN0QixRQUFROzRCQUNSLEtBQUssd0JBQXdCLENBQUMsSUFBSTtnQ0FDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0NBQ2QsTUFBTTs0QkFDUixLQUFLLHdCQUF3QixDQUFDLFNBQVM7Z0NBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQ0FDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0NBQ25CLE1BQU07d0JBQ1YsQ0FBQztnQkFDTCxDQUFDLENBQUM7Z0JBRU0sb0JBQWUsR0FBRyxHQUFTLEVBQUU7b0JBQ25DLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDO2dCQXRJQSxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBQSxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFBLElBQUksRUFBRSxDQUFDO2dCQUV4QixJQUFJLENBQUMsZ0JBQWdCLDJDQUFzQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxnQkFBZ0IsaURBQXlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGdCQUFnQixtREFBMEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRDs7ZUFFRztZQUVILElBQVcsSUFBSTtnQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEIsQ0FBQztZQUVEOztlQUVHO1lBQ0gsSUFBVyxJQUFJLENBQUMsS0FBYTtnQkFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFFRCxJQUFXLElBQUk7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFFRCxJQUFXLElBQUksQ0FBQyxLQUFhO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBRUQsSUFBVyxTQUFTO2dCQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDekIsQ0FBQztZQUVELElBQVcsU0FBUyxDQUFDLE1BQWM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxhQUFhLEtBQTBDLENBQUM7WUFFL0Q7Ozs7ZUFJRztZQUNJLGdCQUFnQixLQUEwQyxDQUFDO1lBRWxFLGtCQUFrQjtZQUNYLFNBQVM7Z0JBQ2QsSUFBSSxhQUFhLEdBQWtCO29CQUNqQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRTtvQkFDM0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVO29CQUNqRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDaEIsQ0FBQztnQkFFRixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksY0FBYyxDQUFDLGdCQUFnQjtvQkFBRSxJQUFJLENBQUMsY0FBYyxHQUFtQixNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdEksSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBRWhDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVNLHNCQUFzQjtnQkFDM0IsSUFBSSxPQUFPLEdBQTZDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDMUUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUM5QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUM7WUFFTSx3QkFBd0IsQ0FBQyxRQUFpQjtnQkFDL0MsSUFBSSxLQUFLLEdBQTBCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxLQUFLLENBQUMsU0FBUztvQkFDakIsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUTtvQkFDaEIsS0FBSyxDQUFDLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQztnQkFDNUMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDOztnQkF6SFUsdURBQXVCOzs7OztJQUF2QixpQ0FBdUIsMEJBMkpuQyxDQUFBO0FBQ0gsQ0FBQyxFQTdLUyxTQUFTLEtBQVQsU0FBUyxRQTZLbEI7QUM3S0QsSUFBVSxTQUFTLENBc0RsQjtBQXRERCxXQUFVLFNBQVM7SUFDakIsSUFBWSxJQUlYO0lBSkQsV0FBWSxJQUFJO1FBQ2QseUJBQWlCLENBQUE7UUFDakIseUJBQWlCLENBQUE7UUFDakIsMkJBQW1CLENBQUE7SUFDckIsQ0FBQyxFQUpXLElBQUksR0FBSixjQUFJLEtBQUosY0FBSSxRQUlmO0lBRUQ7OztPQUdHO0lBQ0gsTUFBYSxhQUFjLFNBQVEsVUFBQSxTQUFTO1FBQTVDOztZQUVTLFNBQUksR0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBd0NsQyxDQUFDO2lCQXpDd0IsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxBQUFwRCxDQUFxRDtRQUdyRjs7V0FFRztRQUNJLGVBQWUsQ0FBQyxJQUFTLEVBQUUsTUFBb0I7WUFDcEQsSUFBSSxPQUFPLEdBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQUEsYUFBYSxDQUFDLENBQUM7WUFDbkUsSUFBSSxRQUFRLEdBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBRWhHLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQixLQUFLLElBQUksQ0FBQyxNQUFNO29CQUNkLGtGQUFrRjtvQkFDbEYsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEMsQ0FBQztvQkFDRCxNQUFNO2dCQUNSLEtBQUssSUFBSSxDQUFDLE9BQU87b0JBQ2YsSUFBSSxPQUFPLEdBQWUsVUFBQSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNuSSxJQUFJLE9BQU8sQ0FBQyxHQUFHO3dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLG1CQUFtQjtZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUVNLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLHdCQUF3QixDQUFDLFFBQWlCO1lBQy9DLElBQUksS0FBSyxHQUEwQixLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsSUFBSSxLQUFLLENBQUMsSUFBSTtnQkFDWixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNwQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7O0lBekNVLHVCQUFhLGdCQTBDekIsQ0FBQTtBQUNILENBQUMsRUF0RFMsU0FBUyxLQUFULFNBQVMsUUFzRGxCO0FDdERELElBQVUsU0FBUyxDQXlCbEI7QUF6QkQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLGVBQWdCLFNBQVEsVUFBQSxTQUFTO1FBQzVDLHFJQUFxSTtRQUNySSwyQkFBMkI7aUJBQ0osY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXZGO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBRU0sU0FBUztZQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQWpCVSx5QkFBZSxrQkFrQjNCLENBQUE7QUFDSCxDQUFDLEVBekJTLFNBQVMsS0FBVCxTQUFTLFFBeUJsQjtBQ3pCRCxJQUFVLFNBQVMsQ0FvRWxCO0FBcEVELFdBQVUsU0FBUztJQUNqQjs7Ozs7O09BTUc7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLFNBQVM7aUJBQ25CLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQVVyRixZQUFtQixLQUFjLEVBQUUsS0FBYztZQUMvQyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFBLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFFTSxTQUFTO1lBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxhQUFhLENBQUMsZUFBMEIsRUFBRSxVQUEyQjtZQUMxRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVwQyxJQUFJLE9BQU8sR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUU3QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxLQUFLLEdBQVcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUFBLENBQUM7WUFDbkcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksYUFBYSxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBRUQsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBRU0sa0JBQWtCO1lBQ3ZCLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQUEsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQzdELElBQUksV0FBVyxHQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGlCQUFpQixDQUFDLENBQUM7WUFDL0UsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJO2dCQUNyQyxPQUFPO1lBRVQsVUFBQSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDOztJQTFEVSx1QkFBYSxnQkEyRHpCLENBQUE7QUFDSCxDQUFDLEVBcEVTLFNBQVMsS0FBVCxTQUFTLFFBb0VsQjtBQ3BFRCxJQUFVLFNBQVMsQ0E4R2xCO0FBOUdELFdBQVUsU0FBUztJQUVqQixJQUFZLElBRVg7SUFGRCxXQUFZLElBQUk7UUFDZCwrQkFBSSxDQUFBO1FBQUUsbUNBQU0sQ0FBQTtRQUFFLGlDQUFLLENBQUE7UUFBRSwrQkFBSSxDQUFBO0lBQzNCLENBQUMsRUFGVyxJQUFJLEdBQUosY0FBSSxLQUFKLGNBQUksUUFFZjtJQUVEOzs7T0FHRztJQUNILE1BQWEsa0JBQW1CLFNBQVEsVUFBQSxTQUFTO2lCQUN4QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUcxRixZQUFtQixXQUFzQixVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUU7WUFDM0QsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDO1FBRUQsa0RBQWtEO1FBQ2xEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFjLElBQUk7WUFDOUIsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxJQUFJLFNBQVMsR0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksU0FBUztnQkFDWCxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUVqQyxJQUFJLEtBQUs7Z0JBQ1AsU0FBUyxHQUFHLFVBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTLENBQUMsYUFBd0IsRUFBRSxRQUFjLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBYyxJQUFJO1lBQ3BGLFFBQVEsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxJQUFJLENBQUMsSUFBSTtvQkFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdEMsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxNQUFNO29CQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxJQUFJO29CQUNaLElBQUksQ0FBQyxLQUFLO3dCQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztnQkFDL0QsS0FBSyxJQUFJLENBQUMsS0FBSztvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBRTVDLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzNCLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ1QsSUFBSSxPQUFrQixDQUFDO3dCQUN2QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3ZCLHFEQUFxRDs0QkFDckQsT0FBTyxHQUFHLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzVCLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDMUIsQ0FBQzt3QkFFRCxJQUFJLE1BQU0sR0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3BDLElBQUksTUFBTSxFQUFFLENBQUM7NEJBQ1gsa0NBQWtDOzRCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDOzRCQUM5QixPQUFPLEdBQUcsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDNUIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUMxQixDQUFDO29CQUNILENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBQ0QsWUFBWTtRQUVaLGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7YUFDNUMsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELDJDQUEyQztRQUMzQyxtQ0FBbUM7UUFDbkMsSUFBSTtRQUNKLGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsSUFBSTtRQUVKLDhFQUE4RTtRQUM5RSx3RkFBd0Y7UUFDeEYsb0JBQW9CO1FBQ3BCLElBQUk7UUFFTSxhQUFhLENBQUMsUUFBaUI7WUFDdkMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQzs7SUFqR1UsNEJBQWtCLHFCQW1HOUIsQ0FBQTtBQUNILENBQUMsRUE5R1MsU0FBUyxLQUFULFNBQVMsUUE4R2xCO0FDOUdELElBQVUsU0FBUyxDQXNHbEI7QUF0R0QsV0FBVSxTQUFTO0lBRWpCOztPQUVHO0lBQ0gsTUFBYSxZQUFZO1FBQXpCO1lBQ1MsaUJBQVksR0FBdUIsSUFBSSxDQUFDO1lBQ3hDLFlBQU8sR0FBWSxJQUFJLENBQUM7WUFDeEIsZ0JBQVcsR0FBVyxJQUFJLENBQUM7WUFDM0IsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDcEMsQ0FBQztLQUFBO0lBTFksc0JBQVksZUFLeEIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBQSxlQUFlO2lCQUM3QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQUFBeEQsQ0FBeUQ7UUFJekYsU0FBUyxDQUFZO1FBRXJCO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFOSCxlQUFVLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDOUMsY0FBUyxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1lBTWxELElBQUksQ0FBQyxnQkFBZ0IsMkNBQXNCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRDs7O1dBR0c7UUFDSCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsV0FBVyxDQUFDLFlBQXFCO1lBQzFDLElBQUksV0FBVyxHQUFZLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDOUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUMxQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxRQUFRLENBQUMsU0FBa0I7WUFDcEMsSUFBSSxRQUFRLEdBQVksU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksV0FBVyxHQUFlLElBQUksVUFBQSxVQUFVLEVBQUUsQ0FBQztZQUMvQyxXQUFXLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUNuQyx3R0FBd0c7WUFDeEcsOEJBQThCO1lBQzlCLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFVBQUEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwTCwwQkFBMEI7WUFDMUIsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqSixzQ0FBc0M7WUFDdEMsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BMLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUNwQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLEdBQVk7WUFDM0IsSUFBSSxXQUFXLEdBQVksR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNyQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDakksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxHQUFZO1lBQ3hCLElBQUksUUFBUSxHQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQWUsSUFBSSxVQUFBLFVBQVUsRUFBRSxDQUFDO1lBQy9DLFdBQVcsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1lBQ25DLDBHQUEwRztZQUMxRyw4QkFBOEI7WUFDOUIsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BMLDBCQUEwQjtZQUMxQixVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pKLHNDQUFzQztZQUN0QyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEwsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFTywyQkFBMkI7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDOztJQXBGVSwyQkFBaUIsb0JBcUY3QixDQUFBO0FBQ0gsQ0FBQyxFQXRHUyxTQUFTLEtBQVQsU0FBUyxRQXNHbEI7QUN0R0QsSUFBVSxTQUFTLENBME1sQjtBQTFNRCxXQUFVLFNBQVM7SUFnQmpCOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFhLE9BQVEsU0FBUSxXQUFXO1FBa0J0QyxZQUFtQixLQUFhLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLHlDQUErQyxFQUFFLFNBQWlCLENBQUM7WUFDeEgsS0FBSyxFQUFFLENBQUM7WUFkQSx1QkFBa0IsR0FBVyxDQUFDLENBQUM7WUFDL0Isa0JBQWEsR0FBVyxDQUFDLENBQUM7WUFDMUIsZUFBVSxHQUFXLENBQUMsQ0FBQztZQUN2QixpQkFBWSxHQUFXLENBQUMsQ0FBQztZQUN6QixtQkFBYyxHQUFXLENBQUMsQ0FBQztZQUMzQix5QkFBb0IsR0FBVyxDQUFDLENBQUM7WUFDakMsV0FBTSxHQUFXLENBQUMsQ0FBQztZQUVuQixTQUFJLEdBQVMsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1lBQzNCLHdCQUFtQixHQUFXLENBQUMsQ0FBQztZQUNoQyxZQUFPLEdBQVcsU0FBUyxDQUFDO1lBa0k5QixtQkFBYyxHQUFHLENBQUMsYUFBa0MsRUFBUSxFQUFFO2dCQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLEtBQUssR0FBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksTUFBYyxDQUFDO2dCQUNuQixJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxRQUFRO29CQUNwQyxNQUFNLEdBQUcsYUFBYSxDQUFDOztvQkFFdkIsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxhQUFhLEdBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUU3RCxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO29CQUM3QixJQUFJLENBQUMsYUFBYTt3QkFDaEIsT0FBTztnQkFDWCxDQUFDO2dCQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO2dCQUU3QixJQUFJLEtBQUssR0FBZ0IsSUFBSSxXQUFXLHNDQUF1QjtvQkFDN0QsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztZQXpKQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVcsQ0FBQyxLQUFXO1lBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsTUFBYztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQ2QsT0FBTztZQUVULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxxQ0FBNkIsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLG1DQUFxQixDQUFDLENBQUM7WUFDbkQsSUFBSSxJQUFJLENBQUMsSUFBSSxxQ0FBNkI7Z0JBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOztnQkFFeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxLQUFLLENBQUMsTUFBYztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLEtBQWE7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0kscUJBQXFCLENBQUMsc0JBQThCLENBQUM7WUFDMUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxPQUFlO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDTyxlQUFlO1lBQ3ZCLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztZQUN2QixJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFM0MsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xCO29CQUNFLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQzFDLElBQUkscUJBQXFCLEdBQVcsV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDM0UsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLHFCQUFxQixDQUFDOzRCQUNyRSxNQUFNO3dCQUNSLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDOzRCQUNuRSxxQkFBcUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO3dCQUMvQyxDQUFDO29CQUNILENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztvQkFDeEMscUdBQXFHO29CQUNyRyxNQUFNO2dCQUNSLHVDQUErQjtnQkFDL0IsdUNBQStCO2dCQUMvQjtvQkFDRSxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLE1BQU07WUFDVixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNEOztXQUVHO1FBQ0ssZUFBZTtZQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLElBQUkscUJBQXFCLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQy9FLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWM7b0JBQzdDLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDdkgsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDO0tBOEJGO0lBOUtZLGlCQUFPLFVBOEtuQixDQUFBO0FBQ0gsQ0FBQyxFQTFNUyxTQUFTLEtBQVQsU0FBUyxRQTBNbEI7QUMxTUQsaUNBQWlDO0FBQ2pDLElBQVUsU0FBUyxDQTZGbEI7QUE5RkQsaUNBQWlDO0FBQ2pDLFdBQVUsU0FBUztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxNQUFhLElBQUssU0FBUSxVQUFBLE9BQU87UUFBakM7O1lBQ1UsYUFBUSxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzNDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1lBaUR4QixtQkFBYyxHQUFrQixDQUFDLE1BQWEsRUFBUSxFQUFFO2dCQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLE9BQU8sR0FBc0IsTUFBTSxDQUFDLE1BQU8sQ0FBQztnQkFDaEQsSUFBSSxLQUFLLEdBQWdCLElBQUksV0FBVyxzQ0FBdUI7b0JBQzdELE1BQU0sRUFBRTt3QkFDTixPQUFPLEVBQUUsT0FBTzt3QkFDaEIsS0FBSyxFQUFnQixNQUFPLENBQUMsTUFBTSxDQUFDLE1BQU07d0JBQzFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO3FCQUN6QjtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUM7WUFFTSxrQkFBYSxHQUFrQixDQUFDLE1BQWEsRUFBUSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLEtBQUssR0FBVSxJQUFJLEtBQUssb0NBQXNCLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztRQUNKLENBQUM7UUFyRUM7O1dBRUc7UUFDSSxVQUFVLENBQUMsUUFBaUI7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzQyxRQUFRLENBQUMsZ0JBQWdCLG9DQUFzQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkUsUUFBUSxDQUFDLGdCQUFnQixzQ0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRDs7V0FFRztRQUNJLFVBQVUsQ0FBQyxLQUFhO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksYUFBYSxDQUFDLEtBQWE7WUFDaEMsSUFBSSxPQUFPLEdBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE9BQU8sQ0FBQyxtQkFBbUIsb0NBQXNCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDckUsT0FBTyxDQUFDLG1CQUFtQixzQ0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUztZQUNkLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztZQUN6QixLQUFLLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFbEMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtvQkFDbkIsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1lBRUQsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVc7Z0JBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7WUFFNUIsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsQ0FBQztLQXdCRjtJQXpFWSxjQUFJLE9BeUVoQixDQUFBO0FBQ0gsQ0FBQyxFQTdGUyxTQUFTLEtBQVQsU0FBUyxRQTZGbEI7QUM5RkQsSUFBVSxTQUFTLENBbUZsQjtBQW5GRCxXQUFVLFNBQVM7SUFLakI7O09BRUc7SUFDSCxNQUFzQixRQUFRO2lCQUNiLGdCQUFXLEdBQWUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9ELGtDQUFrQztRQUVsQzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBc0I7WUFDL0MsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDNUIsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFzQjtZQUNqRCxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQzdCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsVUFBVSxDQUFJLE9BQVUsRUFBRSxTQUFZLEVBQUUsS0FBc0IsRUFBRSxTQUFrQixLQUFLO1lBQ25HLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ3pDLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQTBCLEVBQUUsU0FBMEI7WUFDNUUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw2QkFBNkI7UUFDN0Isc0VBQXNFO1FBQ3RFLDZCQUE2QjtRQUM3QixzREFBc0Q7UUFDdEQsTUFBTTtRQUVOLGlDQUFpQztRQUNqQyx1REFBdUQ7UUFDdkQsMENBQTBDO1FBQzFDLDJEQUEyRDtRQUMzRCxzREFBc0Q7UUFDdEQsMkRBQTJEO1FBQzNELHlDQUF5QztRQUN6Qyw4Q0FBOEM7UUFDOUMsTUFBTTtRQUNOLElBQUk7UUFFSSxNQUFNLENBQUMsVUFBVTtZQUN2QixJQUFJLEtBQUssR0FBZSxFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFxQjtZQUNwRCxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQzs7SUF6RW1CLGtCQUFRLFdBMEU3QixDQUFBO0FBQ0gsQ0FBQyxFQW5GUyxTQUFTLEtBQVQsU0FBUyxRQW1GbEI7QUNuRkQsdUNBQXVDO0FBQ3ZDLElBQVUsU0FBUyxDQTBCbEI7QUEzQkQsdUNBQXVDO0FBQ3ZDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQWEsVUFBVyxTQUFRLFVBQUEsV0FBVztpQkFDM0IsY0FBUyxHQUE2QjtZQUNsRCxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0UsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwRixDQUFDO1FBRUY7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCO1lBQzVDLElBQUksUUFBUSxHQUFhLFVBQVUsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7Z0JBQ3JFLElBQUksSUFBSSxHQUFhLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxHQUFHLEdBQVcsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFBLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDLENBQUM7WUFDRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDOztJQXBCVSxvQkFBVSxhQXFCdEIsQ0FBQTtBQUNILENBQUMsRUExQlMsU0FBUyxLQUFULFNBQVMsUUEwQmxCO0FDM0JELHVDQUF1QztBQUN2QyxJQUFVLFNBQVMsQ0FPbEI7QUFSRCx1Q0FBdUM7QUFDdkMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBYSxXQUFZLFNBQVEsVUFBQSxXQUFXO0tBRTNDO0lBRlkscUJBQVcsY0FFdkIsQ0FBQTtBQUNILENBQUMsRUFQUyxTQUFTLEtBQVQsU0FBUyxRQU9sQjtBQ1JELHVDQUF1QztBQUN2QyxJQUFVLFNBQVMsQ0FtRWxCO0FBcEVELHVDQUF1QztBQUN2QyxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLFdBQVc7aUJBQzlCLGFBQVEsR0FBd0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDbkUsZUFBVSxHQUFZLElBQUksQ0FBQztpQkFFM0IsY0FBUyxHQUE2QjtZQUNsRCxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hGLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRixDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BGLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDekMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsS0FBSztZQUN6QyxDQUFDLFVBQUEsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1lBQ2xELENBQUMsVUFBQSxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLFFBQVE7WUFDL0MsQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZGLENBQUM7aUJBQ2EsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLO1lBQ2pCLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN4QyxhQUFhLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWE7WUFDL0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDbEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQVE7WUFDcEIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCO1lBQzVDLElBQUksUUFBUSxHQUFhLFVBQVUsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7Z0JBQ3JFLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFBLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDO1lBQ0YsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBYztZQUMxQyxJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxJQUFJLENBQUM7WUFDakIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYTtZQUNoQyxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztZQUMvRyxJQUFJLGFBQWEsQ0FBQyxVQUFVO2dCQUMxQixhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzRSxDQUFDOztJQTdEVSx1QkFBYSxnQkE4RHpCLENBQUE7QUFDSCxDQUFDLEVBbkVTLFNBQVMsS0FBVCxTQUFTLFFBbUVsQjtBQ3BFRCxJQUFVLFNBQVMsQ0FnTmxCO0FBaE5ELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILElBQVksYUE0S1g7SUE1S0QsV0FBWSxhQUFhO1FBQ3ZCLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsK0JBQWMsQ0FBQTtRQUNkLGdDQUFlLENBQUE7UUFDZiwrQkFBYyxDQUFBO1FBQ2QsK0JBQWMsQ0FBQTtRQUNkLGlDQUFnQixDQUFBO1FBQ2hCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsK0JBQWMsQ0FBQTtRQUNkLGlDQUFnQixDQUFBO1FBQ2hCLGlDQUFnQixDQUFBO1FBQ2hCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsZ0NBQWUsQ0FBQTtRQUNmLHdDQUF1QixDQUFBO1FBQ3ZCLGtDQUFpQixDQUFBO1FBQ2pCLDZDQUE0QixDQUFBO1FBQzVCLCtDQUE4QixDQUFBO1FBQzlCLGdDQUFlLENBQUE7UUFDZiwwQ0FBeUIsQ0FBQTtRQUN6Qix3Q0FBdUIsQ0FBQTtRQUN2QixnQ0FBZSxDQUFBO1FBQ2YseUNBQXdCLENBQUE7UUFDeEIseUNBQXdCLENBQUE7UUFDeEIsd0NBQXVCLENBQUE7UUFDdkIsZ0NBQWUsQ0FBQTtRQUNmLGtDQUFpQixDQUFBO1FBQ2pCLGdDQUFlLENBQUE7UUFDZiwyQ0FBMEIsQ0FBQTtRQUMxQixtREFBa0MsQ0FBQTtRQUNsQyxxQ0FBb0IsQ0FBQTtRQUNwQixnQ0FBZSxDQUFBO1FBQ2YsdUNBQXNCLENBQUE7UUFDdEIsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsNEJBQVcsQ0FBQTtRQUNYLGdDQUFlLENBQUE7UUFDZiwyQ0FBMEIsQ0FBQTtRQUMxQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixtREFBa0MsQ0FBQTtRQUNsQyxvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQix5Q0FBd0IsQ0FBQTtRQUN4QixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixpREFBZ0MsQ0FBQTtRQUNoQyw2Q0FBNEIsQ0FBQTtRQUM1QixrREFBaUMsQ0FBQTtRQUNqQyw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDZDQUE0QixDQUFBO1FBQzVCLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLHVDQUFzQixDQUFBO1FBQ3RCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsbUNBQWtCLENBQUE7UUFDbEIsb0NBQW1CLENBQUE7UUFDbkIsMkNBQTBCLENBQUE7UUFDMUIscUNBQW9CLENBQUE7UUFDcEIsNkNBQTRCLENBQUE7UUFDNUIsOEJBQWEsQ0FBQTtRQUNiLGdDQUFlLENBQUE7UUFDZiw0REFBMkMsQ0FBQTtRQUMzQyw0QkFBVyxDQUFBO1FBQ1gsOEJBQWEsQ0FBQTtRQUNiLG9EQUFtQyxDQUFBO1FBQ25DLDZDQUE0QixDQUFBO1FBQzVCLDRDQUEyQixDQUFBO1FBQzNCLHNEQUFxQyxDQUFBO1FBQ3JDLDJDQUEwQixDQUFBO1FBQzFCLG9EQUFtQyxDQUFBO1FBQ25DLHlDQUF3QixDQUFBO1FBQ3hCLGdDQUFlLENBQUE7UUFDZixzREFBcUMsQ0FBQTtRQUNyQywyQ0FBMEIsQ0FBQTtRQUMxQixrREFBaUMsQ0FBQTtRQUNqQyx1Q0FBc0IsQ0FBQTtRQUN0Qiw2Q0FBNEIsQ0FBQTtRQUM1QiwrQ0FBOEIsQ0FBQTtRQUM5Qix1Q0FBc0IsQ0FBQTtRQUN0Qiw4QkFBYSxDQUFBO1FBQ2IscUNBQW9CLENBQUE7UUFDcEIsOEJBQWEsQ0FBQTtRQUNiLHFDQUFvQixDQUFBO1FBQ3BCLDJDQUEwQixDQUFBO1FBQzFCLHlDQUF3QixDQUFBO1FBQ3hCLHlDQUF3QixDQUFBO1FBQ3hCLDRCQUFXLENBQUE7UUFDWCxtQ0FBa0IsQ0FBQTtRQUNsQix1Q0FBc0IsQ0FBQTtRQUN0QixrQ0FBaUIsQ0FBQTtRQUNqQixrQ0FBaUIsQ0FBQTtRQUNqQix3Q0FBdUIsQ0FBQTtRQUN2QixtQ0FBa0IsQ0FBQTtRQUNsQix5Q0FBd0IsQ0FBQTtRQUN4QixxQ0FBb0IsQ0FBQTtRQUNwQiw2Q0FBNEIsQ0FBQTtRQUM1QixnQ0FBZSxDQUFBO1FBQ2YsaURBQWdDLENBQUE7UUFDaEMsdURBQXNDLENBQUE7UUFDdEMsbURBQWtDLENBQUE7UUFDbEMsNkNBQTRCLENBQUE7UUFDNUIsbURBQWtDLENBQUE7UUFDbEMsNkNBQTRCLENBQUE7UUFDNUIsMkNBQTBCLENBQUE7UUFDMUIsMkNBQTBCLENBQUE7UUFDMUIsMERBQXlDLENBQUE7UUFFekMseUJBQXlCO1FBQ3pCLDBCQUFTLENBQUE7UUFFVCxvQkFBb0I7UUFDcEIsZ0NBQWUsQ0FBQTtRQUNmLGdDQUFlLENBQUE7UUFDZixrQ0FBaUIsQ0FBQTtRQUNqQiw4QkFBYSxDQUFBO1FBQ2IsOEJBQWEsQ0FBQTtRQUNiLG1DQUFrQixDQUFBO1FBQ2xCLHdEQUF1QyxDQUFBO1FBQ3ZDLDBEQUF5QyxDQUFBO1FBRXpDLFNBQVM7UUFDVCxnQ0FBZSxDQUFBO0lBQ2pCLENBQUMsRUE1S1csYUFBYSxHQUFiLHVCQUFhLEtBQWIsdUJBQWEsUUE0S3hCO0lBRUQsSUFBWSxnQkFhWDtJQWJELFdBQVksZ0JBQWdCO1FBQzFCLDhCQUFtQixDQUFBO1FBQ25CLDhCQUFtQixDQUFBO1FBQ25CLHdDQUEyQixDQUFBO1FBQzNCLG9DQUF1QixDQUFBO1FBQ3ZCLDBDQUE4QixDQUFBO1FBQzlCLHNDQUE4QixDQUFBO1FBQzlCLHlDQUFrQyxDQUFBO1FBQ2xDLDRCQUE0QjtRQUM1QixvQ0FBdUIsQ0FBQTtRQUN2QixtQ0FBMkIsQ0FBQTtRQUMzQiwrQ0FBeUMsQ0FBQTtRQUN6QyxtQ0FBMkIsQ0FBQTtJQUM3QixDQUFDLEVBYlcsZ0JBQWdCLEdBQWhCLDBCQUFnQixLQUFoQiwwQkFBZ0IsUUFhM0I7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztBQUNMLENBQUMsRUFoTlMsU0FBUyxLQUFULFNBQVMsUUFnTmxCO0FDaE5ELElBQVUsU0FBUyxDQXFCbEI7QUFyQkQsV0FBVSxTQUFTO0lBSWpCOztPQUVHO0lBQ0gsTUFBYSxVQUFVO1FBUXJCLFlBQW1CLE1BQWEsRUFBRSxHQUFHLFVBQW9CO1lBUGxELFNBQUksd0NBQWlDO1lBR3JDLGNBQVMsR0FBWSxJQUFJLENBQUM7WUFDMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztZQUkvQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0tBQ0Y7SUFiWSxvQkFBVSxhQWF0QixDQUFBO0FBQ0gsQ0FBQyxFQXJCUyxTQUFTLEtBQVQsU0FBUyxRQXFCbEI7QUNyQkQsSUFBVSxTQUFTLENBc01sQjtBQXRNRCxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxJQUFZLFdBZVg7SUFmRCxXQUFZLFdBQVc7UUFDckIsaUdBQWlHO1FBQ2pHLGlDQUFrQixDQUFBO1FBQ2xCLGtGQUFrRjtRQUNsRiwrQkFBZ0IsQ0FBQTtRQUNoQix3SEFBd0g7UUFDeEgsbUNBQW9CLENBQUE7UUFDcEIsZ0dBQWdHO1FBQ2hHLGlDQUFrQixDQUFBO1FBQ2xCLHlFQUF5RTtRQUN6RSxxQ0FBc0IsQ0FBQTtRQUN0QixtR0FBbUc7UUFDbkcsbUNBQW9CLENBQUE7UUFDcEIsdUNBQXVDO1FBQ3ZDLHFDQUFzQixDQUFBO0lBQ3hCLENBQUMsRUFmVyxXQUFXLEdBQVgscUJBQVcsS0FBWCxxQkFBVyxRQWV0QjtJQWFEOzs7O09BSUc7SUFDSCxNQUFhLG9CQUFvQjtRQWdCL0IsWUFBbUIsT0FBb0IsRUFBRSxhQUFxQixDQUFDLEVBQUUsZUFBdUIsRUFBRSxFQUFFLGNBQXNCLEdBQUcsRUFBRSxhQUFxQixJQUFJO1lBZnpJLGFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxhQUFRLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFJbEMsWUFBTyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLFVBQUssR0FBWSxLQUFLLENBQUM7WUFLdkIsU0FBSSxHQUFTLElBQUksVUFBQSxJQUFJLEVBQUUsQ0FBQztZQUN4QixrQkFBYSxHQUFXLENBQUMsQ0FBQztZQUMxQixtQkFBYyxHQUFXLENBQUMsQ0FBQztZQTJCM0IsYUFBUSxHQUFHLENBQUMsTUFBa0IsRUFBUSxFQUFFO2dCQUM5QyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksVUFBVSxHQUFVLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx3REFBd0Q7Z0JBQzFILElBQUksTUFBZSxDQUFDO2dCQUVwQixRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDcEIsS0FBSyxZQUFZO3dCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3dCQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUU1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUMvQixjQUFjOzRCQUNkLElBQUksS0FBSyxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ2pJLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFFRCxJQUFJLFlBQVksR0FBaUIsQ0FBQyxXQUF1QixFQUFRLEVBQUU7NEJBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDdkIsSUFBSSxXQUFXLENBQW1CLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0NBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRTs2QkFDdkUsQ0FBQyxDQUNILENBQUM7d0JBQ0osQ0FBQyxDQUFDO3dCQUVGLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN0RSxNQUFNO29CQUNSLEtBQUssVUFBVTt3QkFDYixJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3dCQUV4QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUM5Qix1QkFBdUI7NEJBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzVCLE1BQU07d0JBQ1IsQ0FBQzt3QkFFRCxJQUFJLFdBQVcsR0FBaUIsQ0FBQyxXQUF1QixFQUFRLEVBQUU7NEJBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUN2QixJQUFJLFdBQVcsQ0FBbUIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQ0FDakQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFOzZCQUN2RSxDQUFDLENBQ0gsQ0FBQzt3QkFDSixDQUFDLENBQUM7d0JBRUYsMkVBQTJFO3dCQUMzRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7NEJBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQ3pCLDBCQUEwQjs0QkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLElBQUksV0FBVyxDQUFtQixXQUFXLENBQUMsTUFBTSxFQUFFO2dDQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7NkJBQ3ZFLENBQUMsQ0FBQyxDQUFDO3dCQUNSLENBQUM7NkJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLOzRCQUNwQiwrREFBK0Q7NEJBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUUzRSxNQUFNO29CQUNSLEtBQUssV0FBVzt3QkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDbkMsTUFBTSxHQUFHLFVBQUEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDekQsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsNENBQTRDO3dCQUNoRyxJQUFJLFFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLElBQUksV0FBVyxDQUFtQixXQUFXLENBQUMsSUFBSSxFQUFFOzRCQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO3lCQUMzRyxDQUFDLENBQUMsQ0FBQzt3QkFDTixvRUFBb0U7d0JBQ3BFLE1BQU0sR0FBRyxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDeEMsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDL0QsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbEMsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUN2QixJQUFJLFdBQVcsQ0FBbUIsV0FBVyxDQUFDLEtBQUssRUFBRTtnQ0FDbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFOzZCQUMvSCxDQUFDLENBQUMsQ0FBQzs0QkFDTixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzt3QkFDM0IsQ0FBQzt3QkFDRCx3QkFBd0I7d0JBQ3hCLE1BQU07b0JBQ1I7d0JBQ0UsTUFBTTtnQkFDVixDQUFDO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQztZQUVNLGdCQUFXLEdBQUcsQ0FBQyxNQUFrQixFQUFFLFNBQWtCLEVBQVEsRUFBRTtnQkFDckUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDO29CQUM1QixPQUFPO2dCQUVULElBQUksQ0FBQyxHQUFjLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksS0FBSyxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRixJQUFJLGFBQWEsR0FBVyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QyxJQUFJLFVBQVUsR0FBVyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDNUQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjO29CQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDdkIsSUFBSSxXQUFXLENBQW1CLFdBQVcsQ0FBQyxLQUFLLEVBQUU7d0JBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUU7cUJBQzlHLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3JDLENBQUMsQ0FBQztZQS9IQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVEsQ0FBQyxHQUFZO1lBQzFCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDeEUsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBaUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBMkdPLFlBQVksQ0FBQyxTQUFrQjtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRU8sbUJBQW1CLENBQUMsUUFBbUI7WUFDN0MsSUFBSSxPQUFPLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDN0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0Y7SUFoS1ksOEJBQW9CLHVCQWdLaEMsQ0FBQTtBQUNILENBQUMsRUF0TVMsU0FBUyxLQUFULFNBQVMsUUFzTWxCO0FDdE1ELElBQVUsU0FBUyxDQW9EbEI7QUFwREQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLEtBQU0sU0FBUSxVQUFBLElBQUk7UUFFN0IsNkJBQTZCO1FBRTdCLFlBQW1CLFFBQWdCLE9BQU87WUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBSlIsZUFBVSxHQUFXLFNBQVMsQ0FBQztZQTRCOUIsY0FBUyxHQUFHLEtBQUssRUFBRSxNQUFtQixFQUFpQixFQUFFO2dCQUUvRCxzRUFBc0U7Z0JBQ3RFLGtEQUFrRDtnQkFDbEQseUJBQXlCO2dCQUN6QiwyRUFBMkU7Z0JBQzNFLGNBQWM7Z0JBRWQsMkNBQTJDO2dCQUMzQyx3QkFBd0I7Z0JBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO2dCQUNsRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyx5Q0FBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsMkNBQXNCLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLHdEQUF3RDtnQkFDeEQseUJBQXlCO1lBQzNCLENBQUMsQ0FBQztZQXRDQSxJQUFJLENBQUMsZ0JBQWdCLDhCQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDO1FBRU0sU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckQsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMvQixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsTUFBTSxVQUFBLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxvREFBMEIsQ0FBQyxDQUFDO1lBQ3pELFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQWtCRjtJQTdDWSxlQUFLLFFBNkNqQixDQUFBO0FBQ0gsQ0FBQyxFQXBEUyxTQUFTLEtBQVQsU0FBUyxRQW9EbEI7QUNwREQsSUFBVSxTQUFTLENBMkJsQjtBQTNCRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxTQUFVLFNBQVEsVUFBQSxpQ0FBaUMsQ0FBQyxVQUFBLEtBQUssQ0FBQztRQUM5RCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQW9CLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBZ0IsSUFBSSxDQUFDLElBQUk7WUFDdkUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxVQUFBLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVNLFNBQVM7WUFDZCxNQUFNLHFCQUFxQixHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0QsTUFBTSxpQkFBaUIsR0FBa0IsVUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywrREFBK0Q7WUFDN0ksT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsVUFBQSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxPQUFPLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUNsQyxPQUFPLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUM7UUFDNUQsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sVUFBQSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUNGO0lBcEJZLG1CQUFTLFlBb0JyQixDQUFBO0FBQ0gsQ0FBQyxFQTNCUyxTQUFTLEtBQVQsU0FBUyxRQTJCbEI7QUMzQkQsSUFBVSxTQUFTLENBc0xsQjtBQXRMRCxXQUFVLFNBQVM7SUFFakIsY0FBYztJQUNkLDhDQUE4QztJQUM5QyxJQUFJO0lBRUo7Ozs7O09BS0c7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLElBQUk7UUFDckMsd0RBQXdEO1FBQ3hELHNGQUFzRjtpQkFDeEUsVUFBSyxHQUFXLENBQUMsQUFBWixDQUFhO1FBQ2hDLFNBQVMsQ0FBcUI7UUFDOUIsNEJBQTRCO1FBQzVCLHNCQUFzQixDQUFpQjtRQUV2Qzs7OztXQUlHO1FBQ0gsWUFBbUIsTUFBYztZQUMvQixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFWekIsY0FBUyxHQUFXLFNBQVMsQ0FBQztZQUM5Qiw0QkFBNEI7WUFDNUIsMkJBQXNCLEdBQVksSUFBSSxDQUFDO1lBZ0h2Qzs7ZUFFRztZQUNLLHFCQUFnQixHQUFHLEtBQUssRUFBRSxNQUFtQixFQUFpQixFQUFFO2dCQUN0RSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25CLE9BQU87Z0JBRVQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBUyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxnREFBd0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQztZQUVGOztlQUVHO1lBQ0ssd0JBQW1CLEdBQUcsS0FBSyxFQUFFLE1BQW1CLEVBQWlCLEVBQUU7Z0JBQ3pFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsT0FBTztnQkFFVCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsOEJBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDLENBQUM7WUEzSEEsSUFBSSxDQUFDLGdCQUFnQiw4QkFBZSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUU5RCxJQUFJLENBQUMsTUFBTTtnQkFDVCxPQUFPO1lBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxLQUFLO1lBQ2hCLElBQUksUUFBUSxHQUFpQixNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCx1RkFBdUY7UUFDaEYsU0FBUztZQUNkLElBQUksTUFBTSxHQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQUEsb0JBQW9CLENBQUMsQ0FBQztZQUMzRSxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1lBRXRDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLDZGQUE2RjtnQkFDNUgsYUFBYSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxLQUFLLEdBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLEtBQUssWUFBWSxVQUFBLFNBQVMsRUFBRSxDQUFDLENBQUMsNEZBQTRGO29CQUM1SCxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBQSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEQsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO29CQUM5QixhQUFhLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sYUFBYSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUM3QyxDQUFDO1lBSUQsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3hDLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFFBQVEsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxLQUFLLEdBQTBCLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxLQUFLLFlBQVksVUFBQSxTQUFTO29CQUM1QixNQUFNLFVBQUEsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUxRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnREFBZ0Q7Z0JBRXpGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7WUFDdEMsQ0FBQztZQUVELElBQUksS0FBSyxHQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUs7Z0JBQ1AsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7aUJBQ25ELENBQUM7Z0JBQ0osVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxVQUFBLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxLQUFLLENBQUMsY0FBYztZQUN6QixJQUFJLEtBQUssR0FBVSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCO2dCQUM3QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFhO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUVuQyxJQUFJLFlBQVksR0FBVSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckMsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsWUFBWSxDQUFDLG1CQUFtQix5Q0FBcUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUVELDRIQUE0SDtZQUM1SCxJQUFJLGFBQWEsR0FBa0IsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLEtBQUssSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTTtZQUNSLENBQUM7WUFFRCxVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsa0JBQWtCLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdEcsTUFBTSxDQUFDLGdCQUFnQix5Q0FBcUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssb0RBQTBCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHO1lBQ1IsT0FBYyxVQUFBLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUF3QkQsc0ZBQXNGO1FBQzlFLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBbUIsRUFBRSxPQUFhLEVBQUUsWUFBa0IsRUFBRSxLQUFhO1lBQ2pHLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLCtFQUErRTtnQkFDckcsSUFBSSxJQUFJLFlBQVksYUFBYSxFQUFFLDZEQUE2RDtvQkFDOUYsSUFBSSxJQUFJLElBQUksSUFBSTt3QkFDZCxNQUFNO3lCQUNILENBQUM7d0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO3dCQUNuRCxPQUFPO29CQUNULENBQUM7WUFFTCwyREFBMkQ7WUFDM0QsSUFBSSxLQUFLLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFXLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLFVBQVUsR0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0RBQXNEO2dCQUN6SCxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLDJDQUEyQztnQkFDN0Ysc0RBQXNEO1lBQ3hELENBQUM7WUFFRCx3REFBd0Q7WUFDeEQsSUFBSSxTQUFTLEdBQWMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRixJQUFJLFNBQVM7Z0JBQ1gsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRU8sVUFBVTtZQUNoQixJQUFJLFNBQVMsR0FBeUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLG9CQUFvQixDQUFDLENBQUM7WUFDOUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsQ0FBQzs7SUF4S1UsdUJBQWEsZ0JBeUt6QixDQUFBO0FBQ0gsQ0FBQyxFQXRMUyxTQUFTLEtBQVQsU0FBUyxRQXNMbEI7QUN0TEQsSUFBVSxTQUFTLENBOEJsQjtBQTlCRCxXQUFVLFNBQVM7SUFDakI7Ozs7T0FJRztJQUNILE1BQWEsSUFBSyxTQUFRLFVBQUEsT0FBTztRQUMvQixnQ0FBZ0M7UUFDaEMsb0ZBQW9GO1FBRXBGOzs7O1dBSUc7UUFDSSxhQUFhLENBQUMsT0FBd0IsRUFBRSxZQUErQixJQUF5QyxDQUFDO1FBRXhILGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDN0IsQ0FBQztLQUVGO0lBdkJZLGNBQUksT0F1QmhCLENBQUE7QUFDSCxDQUFDLEVBOUJTLFNBQVMsS0FBVCxTQUFTLFFBOEJsQjtBQzlCRCxJQUFVLFNBQVMsQ0EwQmxCO0FBMUJELFdBQVUsU0FBUztJQUNqQjs7T0FFRztRQUVVLFdBQVc7O2dDQUR2QixDQUFBLEtBQUEsVUFBQSxrQkFBa0IsQ0FBQSxDQUFDLFFBQVE7Ozs7MEJBQ0ssVUFBQSxJQUFJOytCQUFaLFNBQVEsV0FBSTs7OztnQkFBckMsNktBb0JDOzs7Z0JBcEJZLHVEQUFXOztZQUd0QixZQUFtQixTQUFnQixJQUFJLFVBQUEsS0FBSyxFQUFFO2dCQUM1QyxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUN0QixDQUFDO1lBRUQsa0JBQWtCO1lBQ1gsU0FBUztnQkFDZCxJQUFJLGFBQWEsR0FBa0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7Ozs7SUFsQlUscUJBQVcsY0FvQnZCLENBQUE7QUFDSCxDQUFDLEVBMUJTLFNBQVMsS0FBVCxTQUFTLFFBMEJsQjtBQzFCRCxJQUFVLFNBQVMsQ0EyRGxCO0FBM0RELFdBQVUsU0FBUztJQUNqQjs7T0FFRztRQUVVLGFBQWE7O2dDQUR6QixDQUFBLEtBQUEsVUFBQSxrQkFBa0IsQ0FBQSxDQUFDLFFBQVE7Ozs7MEJBQ08sVUFBQSxXQUFXO2lDQUFuQixTQUFRLFdBQVc7Ozs7Z0JBQTlDLDZLQXFEQzs7O2dCQXJEWSx1REFBYTs7WUFLeEIsU0FBUyxDQUFTO1lBRWxCLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUUsRUFBRSxXQUFtQixDQUFDLEVBQUUsWUFBb0IsR0FBRyxFQUFFLGFBQXFCLEdBQUcsRUFBRSxZQUFvQixHQUFHO2dCQUM5SSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDNUIsQ0FBQztZQUVELElBQVcsUUFBUTtnQkFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxJQUFXLFFBQVEsQ0FBQyxNQUFjO2dCQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxrQkFBa0I7WUFDWCxTQUFTO2dCQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JELGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDckMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUN2QyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7Z0JBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDekQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRU0sVUFBVTtnQkFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUN6QixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2pDLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUM7Ozs7SUFuRFUsdUJBQWEsZ0JBcUR6QixDQUFBO0FBQ0gsQ0FBQyxFQTNEUyxTQUFTLEtBQVQsU0FBUyxRQTJEbEI7QUMzREQsSUFBVSxTQUFTLENBNkJsQjtBQTdCRCxXQUFVLFNBQVM7SUFDakI7O09BRUc7UUFFVSxZQUFZOztnQ0FEeEIsQ0FBQSxLQUFBLFVBQUEsa0JBQWtCLENBQUEsQ0FBQyxRQUFROzs7OzBCQUNNLFVBQUEsV0FBVzs7OztnQ0FBbkIsU0FBUSxXQUFXOzs7O3VDQUUxQyxVQUFBLElBQUksQ0FBQyxVQUFBLE9BQU8sQ0FBQztnQkFDZCx1S0FBTyxPQUFPLDZCQUFQLE9BQU8seUZBQVU7Z0JBSDFCLDZLQXVCQzs7O2dCQXZCWSx1REFBWTs7WUFLdkIsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssRUFBRSxFQUFFLFdBQW9CLFVBQUEsY0FBYyxDQUFDLEtBQUs7Z0JBQ3RGLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFIVCxZQUFPLDBEQUFVOztnQkFJdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7YUFDekI7WUFFRCxrQkFBa0I7WUFDWCxTQUFTO2dCQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JELGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksY0FBYyxDQUFDLFNBQVM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQVksTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7Ozs7SUFyQlUsc0JBQVksZUF1QnhCLENBQUE7QUFDSCxDQUFDLEVBN0JTLFNBQVMsS0FBVCxTQUFTLFFBNkJsQjtBQzdCRCxzQ0FBc0M7QUFFdEMsSUFBVSxTQUFTLENBMERsQjtBQTVERCxzQ0FBc0M7QUFFdEMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO1FBRVUscUJBQXFCOztnQ0FEakMsQ0FBQSxLQUFBLFVBQUEsa0JBQWtCLENBQUEsQ0FBQyxRQUFROzs7OzBCQUNlLFVBQUEsWUFBWTt5Q0FBcEIsU0FBUSxXQUFZOzs7O2dCQUF2RCw2S0FvREM7OztnQkFwRFksdURBQXFCOztZQUtoQyxTQUFTLENBQVM7WUFFbEIsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssRUFBRSxFQUFFLFdBQW9CLFVBQUEsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFtQixDQUFDLEVBQUUsWUFBb0IsR0FBRyxFQUFFLGFBQXFCLEdBQUcsRUFBRSxZQUFvQixHQUFHO2dCQUN4TCxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO2dCQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUM1QixDQUFDO1lBRUQsSUFBVyxRQUFRO2dCQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEIsQ0FBQztZQUNELElBQVcsUUFBUSxDQUFDLE1BQWM7Z0JBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUVELGtCQUFrQjtZQUNYLFNBQVM7Z0JBQ2QsSUFBSSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDckQsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNyQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDekMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUN2QyxPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtnQkFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzVELElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUN6RCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFTSxVQUFVO2dCQUNmLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDdkIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUN4QixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQzs7OztJQWxEVSwrQkFBcUIsd0JBb0RqQyxDQUFBO0FBQ0gsQ0FBQyxFQTFEUyxTQUFTLEtBQVQsU0FBUyxRQTBEbEI7QUM1REQsc0NBQXNDO0FBRXRDLElBQVUsU0FBUyxDQTZCbEI7QUEvQkQsc0NBQXNDO0FBRXRDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztRQUVVLDRCQUE0Qjs7Z0NBRHhDLENBQUEsS0FBQSxVQUFBLGtCQUFrQixDQUFBLENBQUMsUUFBUTs7OzswQkFDc0IsVUFBQSxxQkFBcUI7Ozs7Z0RBQTdCLFNBQVEsV0FBcUI7Ozs7eUNBRXBFLFVBQUEsSUFBSSxDQUFDLFVBQUEsT0FBTyxDQUFDO2dCQUNkLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtnQkFINUIsNktBdUJDOzs7Z0JBdkJZLHVEQUE0Qjs7WUFLdkMsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssRUFBRSxFQUFFLFdBQW9CLFVBQUEsY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFzQixVQUFBLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBaUIsRUFBRSxZQUFvQixTQUFTLEVBQUUsYUFBcUIsU0FBUyxFQUFFLFlBQW9CLFNBQVM7Z0JBQ3BQLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUgvRCxjQUFTLDREQUFVOztnQkFJeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7YUFDN0I7WUFFRCxrQkFBa0I7WUFDWCxTQUFTO2dCQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JELGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3RELE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksY0FBYyxDQUFDLFdBQVc7b0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQVksTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNsRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7Ozs7SUFyQlUsc0NBQTRCLCtCQXVCeEMsQ0FBQTtBQUNILENBQUMsRUE3QlMsU0FBUyxLQUFULFNBQVMsUUE2QmxCO0FDL0JELElBQVUsU0FBUyxDQThDbEI7QUE5Q0QsV0FBVSxTQUFTO0lBRWpCOztPQUVHO1FBRVUsUUFBUTs7Z0NBRHBCLENBQUEsS0FBQSxVQUFBLGtCQUFrQixDQUFBLENBQUMsUUFBUTs7OzswQkFDRSxhQUFhLENBQUMsVUFBQSxhQUFhLENBQUM7NEJBQXBDLFNBQVEsV0FBNEI7Ozs7Z0JBQTFELDZLQUtDOzs7Z0JBTFksdURBQVE7O1lBQ25CLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUUsRUFBRSxXQUFvQixVQUFBLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBaUIsRUFBRSxZQUFvQixHQUFHLEVBQUUsVUFBbUIsRUFBRSxTQUFrQjtnQkFDMUssS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDMUIsQ0FBQzs7OztJQUpVLGtCQUFRLFdBS3BCLENBQUE7SUFFRDs7T0FFRztRQUVVLGdCQUFnQjs7Z0NBRDVCLENBQUEsS0FBQSxVQUFBLGtCQUFrQixDQUFBLENBQUMsUUFBUTs7OzswQkFDVSxhQUFhLENBQUMsVUFBQSxxQkFBcUIsQ0FBQztvQ0FBNUMsU0FBUSxXQUFvQzs7OztnQkFBMUUsNktBS0M7OztnQkFMWSx1REFBZ0I7O1lBQzNCLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUUsRUFBRSxXQUFvQixVQUFBLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBb0IsVUFBQSxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQWlCLEVBQUUsWUFBb0IsR0FBRyxFQUFFLFVBQW1CLEVBQUUsU0FBa0I7Z0JBQ3BOLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUMxQixDQUFDOzs7O0lBSlUsMEJBQWdCLG1CQUs1QixDQUFBO0lBRUQsU0FBUyxhQUFhLENBQXlELEtBQVk7WUFDMUUsUUFBUTs4QkFBUyxLQUFLOzs7O3lCQUF0QixRQUFTLFNBQVEsV0FBSzs7OzJDQUVsQyxVQUFBLElBQUksQ0FBQyxVQUFBLE9BQU8sQ0FBQztvQkFDZCx1S0FBTyxPQUFPLDZCQUFQLE9BQU8seUZBQVU7OztnQkFFakIsU0FBUztvQkFDZCxJQUFJLGFBQWEsR0FBa0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNyRCxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO29CQUNsRCxPQUFPLGFBQWEsQ0FBQztnQkFDdkIsQ0FBQztnQkFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO29CQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ3hDLElBQUksY0FBYyxDQUFDLFNBQVM7d0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQVksTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM5RSxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDOzs7b0JBYk0sWUFBTywwREFBVTs7Ozs7UUFnQjFCLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLEVBOUNTLFNBQVMsS0FBVCxTQUFTLFFBOENsQjtBQzlDRCxJQUFVLFNBQVMsQ0FrUGxCO0FBbFBELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQWEsS0FBTSxTQUFRLFVBQUEsT0FBTztRQUNoQyxzRUFBc0U7aUJBQ3ZELFNBQUksR0FBNkIsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEdBQTZCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkgsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFPTCxZQUFtQixLQUFhLENBQUMsRUFBRSxLQUFhLENBQUMsRUFBRSxLQUFhLENBQUMsRUFBRSxLQUFhLENBQUM7WUFDL0UsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBZ0I7WUFDNUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xELENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsTUFBZTtZQUNqRCxPQUFPLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFVTSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQW9CLEVBQUUsV0FBMkI7WUFDckUsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBVSxXQUFXLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLEtBQUs7WUFDZCxPQUFPLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksSUFBSSxDQUFDLE1BQWE7WUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLE9BQU87WUFDWixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxNQUFlO1lBQzdDLE1BQU0sU0FBUyxHQUFzQixLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFVTSxRQUFRLENBQUMsRUFBOEIsRUFBRSxFQUFXLEVBQUUsRUFBVyxFQUFFLEVBQVc7WUFDbkYsSUFBSSxFQUFFLFlBQVksaUJBQWlCO2dCQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBVU0sVUFBVSxDQUFDLEVBQXlCLEVBQUUsRUFBVyxFQUFFLEVBQVcsRUFBRSxFQUFXO1lBQ2hGLElBQUksRUFBRSxZQUFZLFlBQVk7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUU1QyxJQUFJLENBQUMsR0FBRyxDQUNOLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNwQixVQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDcEIsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3BCLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNyQixDQUFDO1lBQ0osT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVTtZQUN2RCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUTtZQUNiLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNO1lBQ1gsSUFBSSxLQUFLLEdBQXNCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2xFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU07WUFDWCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ3BCLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBWTtZQUN4QixJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztZQUN4QixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUEsQ0FBQztRQUMvQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsTUFBYTtZQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBVU0sUUFBUSxDQUFDLFdBQTJCO1lBQ3pDLElBQUksV0FBVyxZQUFZLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFlLEVBQUUsYUFBcUIsTUFBTSxDQUFDLE9BQU87WUFDaEUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEgsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxnSEFBZ0g7WUFDaEgsYUFBYSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFrQixjQUFjLENBQUMsQ0FBQztZQUNqRixDQUFDOztnQkFDQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQixJQUFnQixDQUFDOztJQTVPL0MsZUFBSyxRQTZPakIsQ0FBQTtBQUNILENBQUMsRUFsUFMsU0FBUyxLQUFULFNBQVMsUUFrUGxCO0FDbFBELElBQVUsU0FBUyxDQWFsQjtBQWJELFdBQVUsU0FBUztJQUVqQjs7O09BR0c7SUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFBLGlDQUFpQyxDQUFDLFVBQUEsUUFBUSxDQUFDO1FBQ3BFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFnQixJQUFJLENBQUMsSUFBSTtZQUN2RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixPQUFPLFVBQUEsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO0tBQ0Y7SUFOWSxzQkFBWSxlQU14QixDQUFBO0FBQ0gsQ0FBQyxFQWJTLFNBQVMsS0FBVCxTQUFTLFFBYWxCO0FDYkQsSUFBVSxTQUFTLENBa0NsQjtBQWxDRCxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxNQUFzQixJQUFJO1FBQ3hCLHlFQUF5RTtpQkFDbEQsWUFBTyxHQUFXLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ3ZELHlFQUF5RTtpQkFDbEQsWUFBTyxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTFEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBSSxNQUFTLEVBQUUsSUFBTyxFQUFFLElBQU8sRUFBRSxhQUFrRCxDQUFDLE9BQVUsRUFBRSxPQUFVLEVBQUUsRUFBRSxHQUFHLE9BQU8sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDN0osSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzFDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVO1lBQ25ELE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFjLEVBQUUsVUFBa0IsRUFBRSxTQUFxQyxJQUFJLENBQUMsS0FBSztZQUNwRyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ2xELENBQUM7O0lBNUJtQixjQUFJLE9BNkJ6QixDQUFBO0FBQ0gsQ0FBQyxFQWxDUyxTQUFTLEtBQVQsU0FBUyxRQWtDbEI7QUNsQ0QsSUFBVSxTQUFTLENBMkpsQjtBQTNKRCxXQUFVLFNBQVM7SUFRakI7Ozs7O09BS0c7SUFDSCxNQUFzQixPQUFRLFNBQVEsVUFBQSxPQUFPO1FBQ2pDLGFBQWEsQ0FBQyxRQUFpQixJQUFnQixDQUFDO0tBcUIzRDtJQXRCcUIsaUJBQU8sVUFzQjVCLENBQUE7SUFFRDs7O09BR0c7SUFDSCxNQUFhLFlBQWEsU0FBUSxPQUFPO1FBSXZDLFlBQW1CLFNBQWlCLEdBQUcsRUFBRSxVQUFrQixHQUFHO1lBQzVELEtBQUssRUFBRSxDQUFDO1lBSkgsVUFBSyxHQUFXLEdBQUcsQ0FBQztZQUNwQixXQUFNLEdBQVcsR0FBRyxDQUFDO1lBSTFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNJLE9BQU8sQ0FBQyxNQUFjLEVBQUUsT0FBZTtZQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUN4QixDQUFDO1FBRU0sUUFBUSxDQUFDLGFBQXNCLEVBQUUsVUFBcUI7WUFDM0QsSUFBSSxNQUFNLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUNuRSxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLGVBQWUsQ0FBQyxNQUFlLEVBQUUsS0FBZ0I7WUFDdEQsSUFBSSxNQUFNLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FDL0IsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFDN0MsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FDaEQsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFTSxPQUFPLENBQUMsVUFBcUI7WUFDbEMsT0FBTyxVQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDO0tBQ0Y7SUFwQ1ksc0JBQVksZUFvQ3hCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxNQUFhLGFBQWMsU0FBUSxPQUFPO1FBQTFDOztZQUNTLGNBQVMsR0FBVyxHQUFHLENBQUM7WUFDeEIsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQTZCbEMsQ0FBQztRQTNCQzs7V0FFRztRQUNJLFFBQVEsQ0FBQyxVQUFrQixFQUFFLFdBQW1CO1lBQ3JELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLENBQUM7UUFFTSxRQUFRLENBQUMsYUFBc0IsRUFBRSxVQUFxQjtZQUMzRCxJQUFJLE1BQU0sR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDbkQsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFTSxlQUFlLENBQUMsTUFBZSxFQUFFLEtBQWdCO1lBQ3RELElBQUksTUFBTSxHQUFZLElBQUksVUFBQSxPQUFPLENBQy9CLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FDckMsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFTSxPQUFPLENBQUMsVUFBcUI7WUFDbEMsT0FBTyxVQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckcsQ0FBQztLQUNGO0lBL0JZLHVCQUFhLGdCQStCekIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILE1BQWEsY0FBZSxTQUFRLE9BQU87UUFBM0M7O1lBQ1MsV0FBTSxHQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFELFlBQU8sR0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQWdDcEUsQ0FBQztRQTlCUSxRQUFRLENBQUMsYUFBc0IsRUFBRSxVQUFxQjtZQUMzRCxJQUFJLE1BQU0sR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUMvQixhQUFhLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQ3pFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDekUsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDTSxlQUFlLENBQUMsTUFBZSxFQUFFLEtBQWdCO1lBQ3RELElBQUksTUFBTSxHQUFZLElBQUksVUFBQSxPQUFPLENBQy9CLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFDN0QsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUM3RCxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLE9BQU8sQ0FBQyxVQUFxQjtZQUNsQyxJQUFJLENBQUMsVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQztZQUVkLElBQUksSUFBSSxHQUFXLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMxRixJQUFJLElBQUksR0FBVyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDekYsSUFBSSxJQUFJLEdBQVcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbEcsSUFBSSxJQUFJLEdBQVcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFFckcsT0FBTyxVQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRU0sVUFBVTtZQUNmLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hELENBQUM7S0FDRjtJQWxDWSx3QkFBYyxpQkFrQzFCLENBQUE7QUFDSCxDQUFDLEVBM0pTLFNBQVMsS0FBVCxTQUFTLFFBMkpsQjtBQzNKRCxJQUFVLFNBQVMsQ0FtQ2xCO0FBbkNELFdBQVUsU0FBUztJQUNqQjs7Ozs7O09BTUc7SUFDSCxNQUFhLElBQUk7UUFJZixZQUFtQixTQUFpQixDQUFDLEVBQUUsYUFBcUIsQ0FBQztZQUh0RCxjQUFTLEdBQVcsQ0FBQyxDQUFDO1lBQ3RCLFVBQUssR0FBVyxDQUFDLENBQUM7WUFHdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksR0FBRyxDQUFDLFNBQWlCLENBQUMsRUFBRSxhQUFxQixDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUTtZQUNiLE9BQU8sVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0YsQ0FBQztLQUNGO0lBMUJZLGNBQUksT0EwQmhCLENBQUE7QUFDSCxDQUFDLEVBbkNTLFNBQVMsS0FBVCxTQUFTLFFBbUNsQjtBQ25DRCxJQUFVLFNBQVMsQ0FzQ2xCO0FBdENELFdBQVUsU0FBUztJQUNqQjs7Ozs7OztPQU9HO0lBQ0gsTUFBYSxJQUFJO1FBS2YsWUFBbUIsYUFBcUIsQ0FBQyxFQUFFLFlBQW9CLENBQUMsRUFBRSxhQUFxQixDQUFDO1lBSmpGLGNBQVMsR0FBVyxDQUFDLENBQUM7WUFDdEIsYUFBUSxHQUFXLENBQUMsQ0FBQztZQUNyQixjQUFTLEdBQVcsQ0FBQyxDQUFDO1lBRzNCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsYUFBcUIsQ0FBQyxFQUFFLFlBQW9CLENBQUMsRUFBRSxhQUFxQixDQUFDO1lBQzlFLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQzlCLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUTtZQUNiLE9BQU8sY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0ksQ0FBQztLQUNGO0lBNUJZLGNBQUksT0E0QmhCLENBQUE7QUFDSCxDQUFDLEVBdENTLFNBQVMsS0FBVCxTQUFTLFFBc0NsQjtBQ3RDRCxJQUFVLFNBQVMsQ0E2RmxCO0FBN0ZELFdBQVUsU0FBUztJQUNqQixzREFBc0Q7SUFDdEQsNENBQTRDO0lBQzVDLFNBQWdCLElBQUk7UUFDbEIsSUFBSSxDQUFDLEdBQVcsVUFBVSxDQUFDO1FBRTNCLElBQUksSUFBSSxHQUFhLFVBQVUsS0FBc0I7WUFDbkQsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLEdBQVcsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDWixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNQLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDUCxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLE9BQU87WUFDL0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxRQUFRO1FBQ3JELENBQUMsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFwQmUsY0FBSSxPQW9CbkIsQ0FBQTtJQUdELHNEQUFzRDtJQUN0RCxTQUFnQixLQUFLO1FBQ25CLDRCQUE0QjtRQUM1QiwrREFBK0Q7UUFDL0QsSUFBSSxJQUFJLEdBQWEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELElBQUksRUFBRSxHQUFXLENBQUMsRUFDaEIsRUFBRSxHQUFXLEVBQUUsRUFDZixFQUFFLEdBQVcsR0FBRyxFQUNoQixFQUFFLEdBQVcsR0FBRyxDQUFDO1FBRW5CLElBQUksQ0FBQyxHQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksR0FBYSxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxRQUFRO1lBQ2pELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsUUFBUTtnQkFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSxD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QUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksU0FBUyxHQUFjLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7YUFDbEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBZTtZQUNuQyxJQUFJLENBQUMsR0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUvQixJQUFJLENBQUMsR0FBVyxDQUFDO2dCQUNmLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUM1QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQzdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFbkMsTUFBTSxTQUFTLEdBQWMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTTtnQkFDbkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxD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SSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dC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RUFBRSxDQUFDO2FBQ3pCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTTtZQUNYLElBQUksQ0FBQyxHQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBRTlCLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ3JELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUV6QyxJQUFJLEVBQUUsR0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNyRCxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxFQUFFLEdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDdEQsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztZQUUxQyxJQUFJLENBQUMsR0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDUCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNO2dCQUNkLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTTtnQkFDZCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFTLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBUyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQU8sTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFPLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE9BQU87Z0JBQ3JHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxPQUFPO2dCQUNyRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdB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QUMsVUFBVSxDQUFDLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBVztZQUN2QixJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsWUFBWTtRQUVaLHdCQUF3QjtRQUN4Qjs7V0FFRztRQUNJLFFBQVEsQ0FBQyxPQUFrQixFQUFFLFlBQXFCLEtBQUs7WUFDNUQsTUFBTSxTQUFTLEdBQWMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELFlBQVk7UUFFWixrQkFBa0I7UUFDbEIsd0NBQXdDO1FBQ3hDLHlDQUF5QztRQUV6Qyx3REFBd0Q7UUFDeEQsZ0RBQWdEO1FBQ2hELGdEQUFnRDtRQUVoRCxtQkFBbUI7UUFDbkIsc0JBQXNCO1FBQ3RCLGtDQUFrQztRQUNsQyxpRkFBaUY7UUFDakYsa0ZBQWtGO1FBQ2xGLFFBQVE7UUFDUixhQUFhO1FBQ2IsOEJBQThCO1FBQzlCLDZEQUE2RDtRQUM3RCxvQkFBb0I7UUFDcEIsUUFBUTtRQUNSLE1BQU07UUFDTixXQUFXO1FBQ1gsNkJBQTZCO1FBQzdCLDJEQUEyRDtRQUMzRCxrQkFBa0I7UUFDbEIsTUFBTTtRQUNOLG9EQUFvRDtRQUNwRCxpREFBaUQ7UUFFakQsOEJBQThCO1FBQzlCLElBQUk7UUFFSjs7V0FFRztRQUNJLEdBQUcsQ0FBQyxNQUF5QjtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxJQUFJLENBQUMsU0FBb0I7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUM7WUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBQy9DLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQztZQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO2dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO2dCQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVE7WUFDYixPQUFPLDRCQUE0QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxlQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQy9JLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixrRkFBa0Y7WUFDbEYsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksSUFBSTtZQUNULElBQUksTUFBTSxHQUFZLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxJQUFJO1lBQ1QsSUFBSSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRDs7V0FFRztRQUNJLElBQUk7WUFDVCxJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTTtZQUNYLElBQUksSUFBSSxHQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWU7WUFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCO1lBQzdGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7WUFDbkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU07WUFDWCxJQUFJLElBQUksR0FBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1lBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtZQUM5RixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1lBQ2xGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNO1lBQ1gsSUFBSSxJQUFJLEdBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtZQUNoRixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7WUFDOUYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtZQUNsRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksZ0JBQWdCLENBQUMsVUFBcUI7WUFDM0MsSUFBSSxVQUFVLEdBQVksVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTyxDQUFDLENBQUM7WUFDaEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlILE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFTSxTQUFTO1lBQ2QscUJBQXFCO1lBQ3JCLElBQUksYUFBYSxHQUFrQjtnQkFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO2dCQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTthQUNsQyxDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxPQUFPLEdBQVk7Z0JBQ3JCLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7Z0JBQzNFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7YUFDaEUsQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksSUFBSSxDQUFDLE9BQU87Z0JBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRXRCLElBQUksT0FBTyxHQUFZO2dCQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDcEMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2FBQ25DLENBQUM7WUFFRixnQkFBZ0I7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUI7WUFDbkMsTUFBTSxDQUFDLEdBQWlCLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFbEMsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksV0FBVyxHQUFZLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzVDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUMsNERBQTREO2dCQUU1RCxJQUFJLFFBQVEsR0FBeUIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdPQUFnTztvQkFDblAsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMseUpBQXlKO2dCQUVwTyxJQUFJLE9BQU8sR0FBWSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBRTVGLElBQUksUUFBUSxDQUFDLFFBQVE7b0JBQ25CLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVyQyxJQUFJLFFBQVEsQ0FBQyxPQUFPO29CQUNsQixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFbkMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sZUFBZSxHQUFZLFFBQVEsWUFBWSxVQUFBLE9BQU8sQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLGVBQWUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztnQkFFeEMsTUFBTSxFQUFFLEdBQVcsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQVcsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDN0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDN0IsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBRXBCLFNBQVMsbUJBQW1CLENBQUMsUUFBaUI7Z0JBQzVDLE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ25HLENBQUM7UUFDSCxDQUFDO1FBRU0sd0JBQXdCLENBQUMsUUFBaUI7WUFDL0MsSUFBSSxLQUFLLEdBQTBCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFFBQVEsQ0FBQyxXQUFXO2dCQUFFLEtBQUssQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQ3hELElBQUksUUFBUSxDQUFDLFFBQVE7Z0JBQUUsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDbEQsSUFBSSxRQUFRLENBQUMsT0FBTztnQkFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUNoRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDUyxhQUFhLENBQUMsUUFBaUIsSUFBZ0IsQ0FBQztRQUVsRCxVQUFVO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO0tBQ0Y7SUFwbUNZLG1CQUFTLFlBb21DckIsQ0FBQTtJQUNELFlBQVk7QUFDZCxDQUFDLEVBbm5DUyxTQUFTLEtBQVQsU0FBUyxRQW1uQ2xCO0FDbm5DRCxJQUFVLFNBQVMsQ0FzQ2xCO0FBdENELFdBQVUsU0FBUztJQUVqQjs7OztPQUlHO0lBQ0gsTUFBc0IsS0FBSztRQVN6QixZQUFtQixVQUFvQixJQUFJLENBQUMsTUFBTTtZQVJ4QyxTQUFJLEdBQWUsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsY0FBUyxHQUFlLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBUXBELE1BQU0sQ0FBQyxHQUFlLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVgsSUFBSSxDQUFTLENBQUM7WUFDZCxJQUFJLENBQVMsQ0FBQztZQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWCxDQUFDO1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7S0FHRjtJQTlCcUIsZUFBSyxRQThCMUIsQ0FBQTtBQUNILENBQUMsRUF0Q1MsU0FBUyxLQUFULFNBQVMsUUFzQ2xCO0FDdENELGlDQUFpQztBQUVqQyxJQUFVLFNBQVMsQ0FzRWxCO0FBeEVELGlDQUFpQztBQUVqQyxXQUFVLFNBQVM7SUFFakI7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFhLE1BQU8sU0FBUSxVQUFBLEtBQUs7aUJBQ2hCLFdBQU0sR0FBVyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxBQUF2QyxDQUF3QztpQkFDOUMsYUFBUSxHQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQXZILENBQXdIO1FBQy9JLE9BQU8sQ0FBNEM7UUFFbkQsWUFBbUIsVUFBb0IsSUFBSSxDQUFDLE1BQU07WUFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBSGpCLFlBQU8sR0FBdUMsSUFBSSxDQUFDO1lBaUQ1QyxXQUFNLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFVLEVBQUU7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDO1lBOUNBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQUU7Z0JBQ3hDLGdFQUFnRTtnQkFDaEUsTUFBTSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtnQkFDbEYsTUFBTSxDQUFDLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsR0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkNBQTZDO2dCQUN2RSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMseUNBQXlDO2dCQUNyRSxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUUzQixxQ0FBcUM7Z0JBQ3JDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbkMsNkJBQTZCO2dCQUM3QixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFFbEQsb0VBQW9FO2dCQUNwRSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxNQUFNLEVBQUUsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLE1BQU0sRUFBRSxHQUFhLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakYsb0RBQW9EO2dCQUNwRCxNQUFNLEVBQUUsR0FBVyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBRTlFLE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFOUUsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUU5RSxtRUFBbUU7Z0JBQ25FLGdFQUFnRTtnQkFDaEUsT0FBTyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQzs7SUFsRFUsZ0JBQU0sU0F1RGxCLENBQUE7QUFDSCxDQUFDLEVBdEVTLFNBQVMsS0FBVCxTQUFTLFFBc0VsQjtBQ3hFRCxJQUFVLFNBQVMsQ0FpSGxCO0FBakhELFdBQVUsU0FBUztJQUNqQjs7Ozs7Ozs7Ozs7T0FXRztJQUNILGFBQWE7SUFDYixNQUFhLE1BQU8sU0FBUSxVQUFBLEtBQUs7aUJBQ2hCLFdBQU0sR0FBVyxHQUFHLEdBQUcsR0FBRyxBQUFwQixDQUFxQjtpQkFDM0IsYUFBUSxHQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckwsQUFEc0IsQ0FDckI7UUFDRixPQUFPLENBQXdEO1FBRS9ELFlBQW1CLFVBQW9CLElBQUksQ0FBQyxNQUFNO1lBQ2hELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUhqQixZQUFPLEdBQW1ELElBQUksQ0FBQztZQTJGeEQsV0FBTSxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQVUsRUFBRTtnQkFDN0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDO1lBeEZBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFFO2dCQUNwRCxnRUFBZ0U7Z0JBQ2hFLE1BQU0sQ0FBQyxHQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQywwQ0FBMEM7Z0JBQ2xGLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsK0NBQStDO2dCQUN6RSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsMkNBQTJDO2dCQUN2RSxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUUzQixtQ0FBbUM7Z0JBQ25DLElBQUksRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLENBQUMseURBQXlEO2lCQUM3RjtnQkFDSCxJQUFJLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxDQUFDLHdEQUF3RDtpQkFDNUY7Z0JBQ0gsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ2IsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ25CLENBQUM7eUJBQU0sSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ3BCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDakIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNuQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ25CLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO3dCQUNaLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDakIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNuQixDQUFDO3lCQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO3dCQUNuQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDbkIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDakIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNuQixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsOENBQThDO2dCQUMxRixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDZDQUE2QztnQkFDL0YsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDakQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDakQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRDQUE0QztnQkFDL0YsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFFbEQseUVBQXlFO2dCQUN6RSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE1BQU0sRUFBRSxHQUFhLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEcsTUFBTSxFQUFFLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxNQUFNLEVBQUUsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXJHLHlEQUF5RDtnQkFDekQsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFN0QsbUVBQW1FO2dCQUNuRSxrREFBa0Q7Z0JBQ2xELE9BQU8saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUM7UUFDSixDQUFDOztJQTdGVSxnQkFBTSxTQWtHbEIsQ0FBQTtBQUNILENBQUMsRUFqSFMsU0FBUyxLQUFULFNBQVMsUUFpSGxCO0FDakhELElBQVUsU0FBUyxDQThKbEI7QUE5SkQsV0FBVSxTQUFTO0lBQ2pCLGFBQWE7SUFDYjs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQWEsTUFBTyxTQUFRLFVBQUEsS0FBSztpQkFDaEIsV0FBTSxHQUFXLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEFBQXhDLENBQXlDO2lCQUMvQyxhQUFRLEdBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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QyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLGtEQUFrRDtnQkFDbEQsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxHQUFXLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLG1EQUFtRDtnQkFDbkQsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxHQUFXLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLEdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRDLCtFQUErRTtnQkFDL0UsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZ0RBQWdEO2dCQUM1RixNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsK0NBQStDO2dCQUNqRyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZ0RBQWdEO2dCQUNsRyxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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QUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxDQUFDO29CQUN2QixDQUFDLENBQUMsR0FBRztvQkFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FB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UUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsd0ZBQXdGO1lBQy9OLGlLQUFpSztZQUNqSyxJQUFJLEtBQUssR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3TSxJQUFJLFFBQVEsR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0TixJQUFJLFFBQVEsR0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENB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QUVNLFNBQVMsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFB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USxDQUFDLENBQUM7WUFFdEQsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVc7WUFDaEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSztZQUNWLHlDQUF5QztZQUN6Qyx1QkFBdUI7WUFDdkIsdUVBQXVFO1lBQ3ZFLDJHQUEyRztZQUMzRyxvQ0FBb0M7WUFDcEMsSUFBSTtZQUNKLE9BQU87WUFDUCxrSEFBa0g7WUFDbEgsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztLQUNGO0lBN0ZZLGVBQUssUUE2RmpCLENBQUE7QUFDSCxDQUFDLEVBM0dTLFNBQVMsS0FBVCxTQUFTLFFBMkdsQiIsInNvdXJjZXNDb250ZW50IjpbIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEJhc2UgY2xhc3MgZm9yIHRoZSBkaWZmZXJlbnQgRGVidWdUYXJnZXRzLCBtYWlubHkgZm9yIHRlY2huaWNhbCBwdXJwb3NlIG9mIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlYnVnVGFyZ2V0IHtcclxuICAgIHB1YmxpYyBkZWxlZ2F0ZXM6IE1hcERlYnVnRmlsdGVyVG9EZWxlZ2F0ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1lcmdlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBzdHJpbmcsIHNlcGFyYXRlZCBieSAnLCAnXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VBcmd1bWVudHMoX21lc3NhZ2U6IE9iamVjdCwgLi4uX2FyZ3M6IE9iamVjdFtdKTogc3RyaW5nIHtcclxuICAgICAgbGV0IG91dDogc3RyaW5nID0gX21lc3NhZ2UudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShfbWVzc2FnZSk7XHJcbiAgICAgIGZvciAobGV0IGFyZyBvZiBfYXJncylcclxuICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgTnVtYmVyKVxyXG4gICAgICAgICAgb3V0ICs9IFwiLCBcIiArIGFyZy50b1ByZWNpc2lvbigyKS50b1N0cmluZygpOyAvL0pTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMik7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgb3V0ICs9IFwiLCBcIiArIGFyZy50b1N0cmluZygpOyAvL0pTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMik7XHJcbiAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWdBbGVydC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBkZWJ1ZyBhY3Rpdml0aWVzLCBtb3JlIHRvIGNvbWVcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBERUJVR19GSUxURVIge1xyXG4gICAgTk9ORSA9IDB4MDAsXHJcbiAgICBJTkZPID0gMHgwMSxcclxuICAgIExPRyA9IDB4MDIsXHJcbiAgICBXQVJOID0gMHgwNCxcclxuICAgIEVSUk9SID0gMHgwOCxcclxuICAgIEZVREdFID0gMHgxMCxcclxuICAgIENMRUFSID0gMHgxMDAsXHJcbiAgICBHUk9VUCA9IDB4MTAxLFxyXG4gICAgR1JPVVBDT0xMQVBTRUQgPSAweDEwMixcclxuICAgIEdST1VQRU5EID0gMHgxMDQsXHJcbiAgICBTT1VSQ0UgPSAweDIwMCxcclxuICAgIE1FU1NBR0VTID0gSU5GTyB8IExPRyB8IFdBUk4gfCBFUlJPUiB8IEZVREdFLFxyXG4gICAgRk9STUFUID0gQ0xFQVIgfCBHUk9VUCB8IEdST1VQQ09MTEFQU0VEIHwgR1JPVVBFTkQsXHJcbiAgICBBTEwgPSBNRVNTQUdFUyB8IEZPUk1BVFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNvbnN0IERFQlVHX1NZTUJPTDogeyBbZmlsdGVyOiBudW1iZXJdOiBzdHJpbmcgfSA9IHtcclxuICAgIFtERUJVR19GSUxURVIuSU5GT106IFwi4pyTXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLkxPR106IFwi4pyOXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLldBUk5dOiBcIuKaoFwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IFwi4p2MXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLkZVREdFXTogXCLwn46yXCIsXHJcbiAgICBbREVCVUdfRklMVEVSLlNPVVJDRV06IFwi8J+Ul1wiXHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0IHR5cGUgTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlID0gTWFwPERlYnVnVGFyZ2V0LCBGdW5jdGlvbj47XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGUgeyBbZmlsdGVyOiBudW1iZXJdOiBGdW5jdGlvbiB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIHRoZSBzdGFuZGFyZC1jb25zb2xlXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnQ29uc29sZSBleHRlbmRzIERlYnVnVGFyZ2V0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVsZWdhdGVzOiBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGUgPSB7XHJcbiAgICAgIFtERUJVR19GSUxURVIuSU5GT106IGNvbnNvbGUuaW5mbyxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBjb25zb2xlLmxvZyxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogY29uc29sZS53YXJuLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkVSUk9SXTogY29uc29sZS5lcnJvcixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IERlYnVnQ29uc29sZS5mdWRnZSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5DTEVBUl06IGNvbnNvbGUuY2xlYXIsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBdOiBjb25zb2xlLmdyb3VwLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQQ09MTEFQU0VEXTogY29uc29sZS5ncm91cENvbGxhcHNlZCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUEVORF06IGNvbnNvbGUuZ3JvdXBFbmQsXHJcbiAgICAgIFtERUJVR19GSUxURVIuU09VUkNFXTogRGVidWdDb25zb2xlLnNvdXJjZVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3VsZCBiZSB1c2VkIHRvIGRpc3BsYXkgdW5jcml0aWNhbCBzdGF0ZSBpbmZvcm1hdGlvbiBvZiBGVURHRSwgb25seSB2aXNpYmxlIGluIGJyb3dzZXIncyB2ZXJib3NlIG1vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBmdWRnZShfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSwgX21lc3NhZ2UsIC4uLl9hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGFuIGV4dHJhIGxpbmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc291cmNlKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICBjb25zb2xlLmxvZyhERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLlNPVVJDRV0sIF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnSW50ZXJmYWNlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnQ29uc29sZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIERlYnVnLUNsYXNzIG9mZmVycyBmdW5jdGlvbnMga25vd24gZnJvbSB0aGUgY29uc29sZS1vYmplY3QgYW5kIGFkZGl0aW9ucywgXHJcbiAgICogcm91dGluZyB0aGUgaW5mb3JtYXRpb24gdG8gdmFyaW91cyB7QGxpbmsgRGVidWdUYXJnZXR9cyB0aGF0IGNhbiBiZSBlYXNpbHkgZGVmaW5lZCBieSB0aGUgZGV2ZWxvcGVycyBhbmQgcmVnaXN0ZXJkIGJ5IHVzZXJzXHJcbiAgICogT3ZlcnJpZGUgZnVuY3Rpb25zIGluIHN1YmNsYXNzZXMgb2Yge0BsaW5rIERlYnVnVGFyZ2V0fSBhbmQgcmVnaXN0ZXIgdGhlbSBhcyB0aGVpciBkZWxlZ2F0ZXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCBzZXQgZmlsdGVyLCB0aGlzIGFzc29jaWF0aXZlIGFycmF5IGtlZXBzIHJlZmVyZW5jZXMgdG8gdGhlIHJlZ2lzdGVyZWQgZGVsZWdhdGUgZnVuY3Rpb25zIG9mIHRoZSBjaG9zZW4ge0BsaW5rIERlYnVnVGFyZ2V0fXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVsZWdhdGVzOiB7IFtmaWx0ZXI6IG51bWJlcl06IE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSB9ID0gRGVidWcuc2V0dXBDb25zb2xlKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSBhIGZpbHRlciBmb3IgdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQsIF9maWx0ZXI6IERFQlVHX0ZJTFRFUik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gRGVidWcuZGVsZWdhdGVzKVxyXG4gICAgICAgIERlYnVnLmRlbGVnYXRlc1tmaWx0ZXJdLmRlbGV0ZShfdGFyZ2V0KTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBpbiBERUJVR19GSUxURVIpIHtcclxuICAgICAgICBsZXQgcGFyc2VkOiBudW1iZXIgPSBwYXJzZUludChmaWx0ZXIpO1xyXG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgaWYgKFtERUJVR19GSUxURVIuTUVTU0FHRVMsIERFQlVHX0ZJTFRFUi5GT1JNQVQsIERFQlVHX0ZJTFRFUi5BTExdLmluZGV4T2YocGFyc2VkKSAhPSAtMSlcclxuICAgICAgICAgIC8vIGRvbnQgZGVsZWdhdGUgY29tYm9zLi4uIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKF9maWx0ZXIgJiBwYXJzZWQpXHJcbiAgICAgICAgICBEZWJ1Zy5kZWxlZ2F0ZXNbcGFyc2VkXS5zZXQoX3RhcmdldCwgX3RhcmdldC5kZWxlZ2F0ZXNbcGFyc2VkXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZmlsdGVyKHMpIGZvciB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCk6IERFQlVHX0ZJTFRFUiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IERFQlVHX0ZJTFRFUiA9IDA7XHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBpbiBfdGFyZ2V0LmRlbGVnYXRlcylcclxuICAgICAgICByZXN1bHQgfD0gcGFyc2VJbnQoZmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCwgX2ZpbHRlcjogREVCVUdfRklMVEVSKTogdm9pZCB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBERUJVR19GSUxURVIgPSBEZWJ1Zy5nZXRGaWx0ZXIoX3RhcmdldCk7XHJcbiAgICAgIERlYnVnLnNldEZpbHRlcihfdGFyZ2V0LCBjdXJyZW50IHwgX2ZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgZnJvbSB0aGUgZ2l2ZW4gRGVidWdUYXJnZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlRmlsdGVyKF90YXJnZXQ6IERlYnVnVGFyZ2V0LCBfZmlsdGVyOiBERUJVR19GSUxURVIpOiB2b2lkIHtcclxuICAgICAgbGV0IGN1cnJlbnQ6IERFQlVHX0ZJTFRFUiA9IERlYnVnLmdldEZpbHRlcihfdGFyZ2V0KTtcclxuICAgICAgRGVidWcuc2V0RmlsdGVyKF90YXJnZXQsIGN1cnJlbnQgXiBfZmlsdGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZm8oLi4uKSBkaXNwbGF5cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpdGggbG93IHByaW9yaXR5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuSU5GTywgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgaW5mb3JtYXRpb24gd2l0aCBtZWRpdW0gcHJpb3JpdHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBsb2coX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkxPRywgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgbm9uLWNvbmZvcm1pdGllcyBpbiB1c2FnZSwgd2hpY2ggaXMgZW1waGFzaXplZCBlLmcuIGJ5IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgd2FybihfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuV0FSTiwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgY3JpdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHdoaWNoIGlzIGVtcGhhc2l6ZWQgZS5nLiBieSBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGVycm9yKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5FUlJPUiwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheXMgbWVzc2FnZXMgZnJvbSBGVURHRVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGZ1ZGdlKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5GVURHRSwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBvdXRwdXQgYW5kIHJlbW92ZXMgcHJldmlvdXMgbWVzc2FnZXMgaWYgcG9zc2libGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkNMRUFSLCBudWxsLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgYSBuZXcgZ3JvdXAgZm9yIG1lc3NhZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXAoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVAsIF9uYW1lLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgYSBuZXcgZ3JvdXAgZm9yIG1lc3NhZ2VzIHRoYXQgaXMgY29sbGFwc2VkIGF0IGZpcnN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBDb2xsYXBzZWQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRUQsIF9uYW1lLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSB5b3VuZ2VzdCBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwRW5kKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuR1JPVVBFTkQsIG51bGwsIG51bGwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2cgYSBicmFuY2ggb2YgdGhlIG5vZGUgaGllcmFyY2h5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYnJhbmNoKF9icmFuY2g6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKF9icmFuY2gubkNoaWxkcmVuID4gMClcclxuICAgICAgICBEZWJ1Zy5ncm91cChfYnJhbmNoLm5hbWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcuZnVkZ2UoX2JyYW5jaC5uYW1lKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIF9icmFuY2guZ2V0Q2hpbGRyZW4oKSkgRGVidWcuYnJhbmNoKGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfYnJhbmNoLm5DaGlsZHJlbiA+IDApXHJcbiAgICAgICAgRGVidWcuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIG1lc3NhZ2VzIGFib3V0IHRoZSBzb3VyY2Ugb2YgdGhlIGRlYnVnIGNhbGxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzb3VyY2UoX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLlNPVVJDRSwgX21lc3NhZ2UsIF9hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvb2t1cCBhbGwgZGVsZWdhdGVzIHJlZ2lzdGVyZWQgdG8gdGhlIGZpbHRlciBhbmQgY2FsbCB0aGVtIHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVsZWdhdGUoX2ZpbHRlcjogREVCVUdfRklMVEVSLCBfbWVzc2FnZTogdW5rbm93biwgX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBpZiAoX2ZpbHRlciA9PSBERUJVR19GSUxURVIuTE9HIHx8IF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLldBUk4gfHwgX2ZpbHRlciA9PSBERUJVR19GSUxURVIuRVJST1IpIHtcclxuICAgICAgICBpZiAoRGVidWcuZGVsZWdhdGVzW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdKVxyXG4gICAgICAgICAgZm9yIChsZXQgZGVsZWdhdGUgb2YgRGVidWcuZGVsZWdhdGVzW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLnZhbHVlcygpKVxyXG4gICAgICAgICAgICBpZiAoZGVsZWdhdGUpIHtcclxuICAgICAgICAgICAgICBsZXQgdHJhY2U6IHN0cmluZ1tdID0gbmV3IEVycm9yKFwiVGVzdFwiKS5zdGFjay5zcGxpdChcIlxcblwiKTtcclxuICAgICAgICAgICAgICBkZWxlZ2F0ZSh0cmFjZVszXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgZGVsZWdhdGVzOiBNYXBEZWJ1Z1RhcmdldFRvRGVsZWdhdGUgPSBEZWJ1Zy5kZWxlZ2F0ZXNbX2ZpbHRlcl07XHJcbiAgICAgIGZvciAobGV0IGRlbGVnYXRlIG9mIGRlbGVnYXRlcy52YWx1ZXMoKSlcclxuICAgICAgICBpZiAoZGVsZWdhdGUpXHJcbiAgICAgICAgICBpZiAoX2FyZ3MgJiYgX2FyZ3MubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgZGVsZWdhdGUoX21lc3NhZ2UsIC4uLl9hcmdzKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZGVsZWdhdGUoX21lc3NhZ2UpO1xyXG5cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogc2V0dXAgcm91dGluZyB0byBzdGFuZGFyZCBjb25zb2xlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIHNldHVwQ29uc29sZSgpOiB7fSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHsgW2ZpbHRlcjogbnVtYmVyXTogTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlIH0gPSB7fTtcclxuICAgICAgbGV0IGZpbHRlcnM6IERFQlVHX0ZJTFRFUltdID0gW1xyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5JTkZPLCBERUJVR19GSUxURVIuTE9HLCBERUJVR19GSUxURVIuV0FSTiwgREVCVUdfRklMVEVSLkVSUk9SLCBERUJVR19GSUxURVIuRlVER0UsXHJcbiAgICAgICAgREVCVUdfRklMVEVSLkNMRUFSLCBERUJVR19GSUxURVIuR1JPVVAsIERFQlVHX0ZJTFRFUi5HUk9VUENPTExBUFNFRCwgREVCVUdfRklMVEVSLkdST1VQRU5ELFxyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5TT1VSQ0VcclxuICAgICAgXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZpbHRlciBvZiBmaWx0ZXJzKVxyXG4gICAgICAgIHJlc3VsdFtmaWx0ZXJdID0gbmV3IE1hcChbW0RlYnVnQ29uc29sZSwgRGVidWdDb25zb2xlLmRlbGVnYXRlc1tmaWx0ZXJdXV0pO1xyXG5cclxuICAgICAgcmVzdWx0W0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLmRlbGV0ZShEZWJ1Z0NvbnNvbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEV2ZW50VHlwZVRvTGlzdGVuZXIge1xyXG4gICAgW2V2ZW50VHlwZTogc3RyaW5nXTogRXZlbnRMaXN0ZW5lclVuaWZpZWRbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR5cGVzIG9mIGV2ZW50cyBzcGVjaWZpYyB0byBGVURHRSwgaW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIERPTS9Ccm93c2VyLVR5cGVzIGFuZCBjdXN0b20gc3RyaW5nc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UIHtcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHRhcmdldHMgcmVnaXN0ZXJlZCBhdCB7QGxpbmsgTG9vcH0sIHdoZW4gcmVxdWVzdGVkIGFuaW1hdGlvbiBmcmFtZSBzdGFydHMgKi9cclxuICAgIExPT1BfRlJBTUUgPSBcImxvb3BGcmFtZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBhZGRlZCB0byBhIHtAbGluayBOb2RlfSAqL1xyXG4gICAgQ09NUE9ORU5UX0FERCA9IFwiY29tcG9uZW50QWRkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBDb21wb25lbnR9IHdoZW4gaXRzIGJlaW5nIHJlbW92ZWQgZnJvbSBhIHtAbGluayBOb2RlfSAqL1xyXG4gICAgQ09NUE9ORU5UX1JFTU9WRSA9IFwiY29tcG9uZW50UmVtb3ZlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBDb21wb25lbnR9IHdoZW4gaXRzIGJlaW5nIGFjdGl2YXRlZCAqL1xyXG4gICAgQ09NUE9ORU5UX0FDVElWQVRFID0gXCJjb21wb25lbnRBY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBkZWFjdGl2YXRlZCAqL1xyXG4gICAgQ09NUE9ORU5UX0RFQUNUSVZBVEUgPSBcImNvbXBvbmVudERlYWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE5vZGV9LCBpdCdzIHN1Y2Nlc3NvcnMgYW5kIGFuY2VzdG9ycyB3aGVuIGl0cyBiZWluZyBhY3RpdmF0ZWQgKi9cclxuICAgIE5PREVfQUNUSVZBVEUgPSBcIm5vZGVBY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgTm9kZX0sIGl0J3Mgc3VjY2Vzc29ycyBhbmQgYW5jZXN0b3JzIHdoZW4gaXRzIGJlaW5nIGRlYWN0aXZhdGVkICovXHJcbiAgICBOT0RFX0RFQUNUSVZBVEUgPSBcIm5vZGVEZWFjdGl2YXRlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIGNoaWxkIHtAbGluayBOb2RlfSBhbmQgaXRzIGFuY2VzdG9ycyBhZnRlciBpdCB3YXMgYXBwZW5kZWQgdG8gYSBwYXJlbnQgKi9cclxuICAgIENISUxEX0FQUEVORCA9IFwiY2hpbGRBcHBlbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEgY2hpbGQge0BsaW5rIE5vZGV9IGFuZCBpdHMgYW5jZXN0b3JzIGp1c3QgYmVmb3JlIGl0cyBiZWluZyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCAqL1xyXG4gICAgQ0hJTERfUkVNT1ZFID0gXCJjaGlsZFJlbW92ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgTXV0YWJsZX0gd2hlbiBpdCBtdXRhdGVzICovXHJcbiAgICBNVVRBVEUgPSBcIm11dGF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgYnkgYSB7QGxpbmsgR3JhcGh9IHdoZW4gaXQgbXV0YXRlcywge0BsaW5rIEdyYXBoSW5zdGFuY2V9cyBjb25uZWN0ZWQgdG8gdGhlIGdyYXBoIGxpc3RlbiAqL1xyXG4gICAgTVVUQVRFX0dSQVBIID0gXCJtdXRhdGVHcmFwaFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgYnkgYSB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gd2hlbiBpdCByZWZsZWN0ZWQgdGhlIG11dGF0aW9uIG9mIHRoZSB7QGxpbmsgR3JhcGh9IGl0J3MgY29ubmVjdGVkIHRvICovXHJcbiAgICBNVVRBVEVfSU5TVEFOQ0UgPSBcIm11dGF0ZUdyYXBoRG9uZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSB3aGVuIGl0IGdldHMgdGhlIGZvY3VzIHRvIHJlY2VpdmUga2V5Ym9hcmQgaW5wdXQgKi9cclxuICAgIEZPQ1VTX0lOID0gXCJmb2N1c2luXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IHdoZW4gaXQgbG9zZXMgdGhlIGZvY3VzIHRvIHJlY2VpdmUga2V5Ym9hcmQgaW5wdXQgKi9cclxuICAgIEZPQ1VTX09VVCA9IFwiZm9jdXNvdXRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIGl0J3MgZG9uZSBzZXJpYWxpemluZyAqL1xyXG4gICAgTk9ERV9TRVJJQUxJWkVEID0gXCJub2RlU2VyaWFsaXplZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIHtAbGluayBDb21wb25lbnR9cyB3aGVuIGl0J3MgZG9uZSBkZXNlcmlhbGl6aW5nLCBzbyBhbGwgY29tcG9uZW50cywgY2hpbGRyZW4gYW5kIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSAqL1xyXG4gICAgTk9ERV9ERVNFUklBTElaRUQgPSBcIm5vZGVEZXNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBicm9hZGNhc3QgZnJvbSBhIHtAbGluayBHcmFwaEluc3RhbmNlfSB0byBhbGwgaXRzIGRlc2NlbmRhbnRzIHdoZW4gaXQncyBjb250ZW50IGlzIHNldCBhY2NvcmRpbmcgdG8gYSBzZXJpYWxpemF0aW9uIG9mIGEge0BsaW5rIEdyYXBofS4gQnJvYWRjYXN0ZWQsIHNvIG5lZWRzIHRvIGJlIGNhdWdodCBpbiBjYXB0dXJlLiAqL1xyXG4gICAgR1JBUEhfSU5TVEFOVElBVEVEID0gXCJncmFwaEluc3RhbnRpYXRlZFwiLFxyXG4gICAgLyoqIGJyb2FkY2FzdCBmcm9tIGEge0BsaW5rIEdyYXBofSB0byBhbGwgaXRzIGRlc2NlbmRhbnRzIHdoZW4gaXQncyBmaW5pc2hlZCBkZXNlcmlhbGl6aW5nLiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBHUkFQSF9ERVNFUklBTElaRUQgPSBcImdyYXBoRGVzZXJpYWxpemVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCBieSBhIHtAbGluayBHcmFwaH0gd2hlbiBpdCBhbmQgaXRzIGNvbm5lY3RlZCBpbnN0YW5jZXMgaGF2ZSBmaW5pc2hlZCBtdXRhdGluZyAgKi9cclxuICAgIEdSQVBIX01VVEFURUQgPSBcImdyYXBoTXV0YXRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFRpbWV9IHdoZW4gaXQncyBzY2FsaW5nIGNoYW5nZWQgICovXHJcbiAgICBUSU1FX1NDQUxFRCA9IFwidGltZVNjYWxlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEZpbGVJb0Jyb3dzZXJMb2NhbH0gd2hlbiBhIGxpc3Qgb2YgZmlsZXMgaGFzIGJlZW4gbG9hZGVkICAqL1xyXG4gICAgRklMRV9MT0FERUQgPSBcImZpbGVMb2FkZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBGaWxlSW9Ccm93c2VyTG9jYWx9IHdoZW4gYSBsaXN0IG9mIGZpbGVzIGhhcyBiZWVuIHNhdmVkICovXHJcbiAgICBGSUxFX1NBVkVEID0gXCJmaWxlU2F2ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIHJlY2FsY3VsYXRpbmcgdHJhbnNmb3JtcyBmb3IgcmVuZGVyICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRSA9IFwicmVuZGVyUHJlcGFyZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSBhbmQge0BsaW5rIE5vZGV9IHdoZW4gcmVjYWxjdWxhdGlvbiBvZiB0aGUgYnJhbmNoIHRvIHJlbmRlciBzdGFydHMuICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRV9TVEFSVCA9IFwicmVuZGVyUHJlcGFyZVN0YXJ0XCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IGFuZCB7QGxpbmsgTm9kZX0gd2hlbiByZWNhbGN1bGF0aW9uIG9mIHRoZSBicmFuY2ggdG8gcmVuZGVyIGVuZHMuIFRoZSBicmFuY2ggZGlzcGF0Y2hlcyBiZWZvcmUgdGhlIGxpZ2h0cyBhcmUgdHJhbnNtaXR0ZWQgdG8gdGhlIHNoYWRlcnMgICovXHJcbiAgICBSRU5ERVJfUFJFUEFSRV9FTkQgPSBcInJlbmRlclByZXBhcmVFbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gYXQgdGhlIGVuZCBvZiBhIHJlbmRlcmVkIGZyYW1lIHJpZ2h0IGJlZm9yZSBpdCBnZXRzIGRpc3BsYXllZC4gQXQgdGhpcyBwb2ludCB7QGxpbmsgR2l6bW9zfSBjYW4gc3RpbGwgYmUgZHJhd24uICovXHJcbiAgICBSRU5ERVJfRU5EID0gXCJyZW5kZXJFbmRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBKb2ludH0tQ29tcG9uZW50cyBpbiBvcmRlciB0byBkaXNjb25uZWN0ICovXHJcbiAgICBESVNDT05ORUNUX0pPSU5UID0gXCJkaXNjb25uZWN0Sm9pbnRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSB3aGVuIGl0IGdldHMgYXR0YWNoZWQgdG8gYSB2aWV3cG9ydCBmb3IgcmVuZGVyaW5nLiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBBVFRBQ0hfQlJBTkNIID0gXCJhdHRhY2hCcmFuY2hcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBQcm9qZWN0fSB3aGVuIGl0J3MgZG9uZSBsb2FkaW5nIHJlc291cmNlcyBmcm9tIGEgdXJsICovXHJcbiAgICBSRVNPVVJDRVNfTE9BREVEID0gXCJyZXNvdXJjZXNMb2FkZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IGFuZCB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9IHdoZW4gYSB7QGxpbmsgQ29tcG9uZW50V2Fsa2VyfSByZWFjaGVzIGEge0BsaW5rIFdheXBvaW50fSBvciB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9ICovXHJcbiAgICBXQVlQT0lOVF9SRUFDSEVEID0gXCJ3YXlwb2ludFJlYWNoZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IHdoZW4gdGhlIGZpbmFsIHtAbGluayBXYXlwb2ludH0gaW4gdGhlIGN1cnJlbnQgcGF0aCBoYXMgYmVlbiByZWFjaGVkICovXHJcbiAgICBQQVRISU5HX0NPTkNMVURFRCA9IFwicGF0aGluZ0NvbmNsdWRlZFwiXHJcbiAgfVxyXG5cclxuICAvKiogVW5pb24gdHlwZSBvZiBvdGhlciBldmVudCB0eXBlcyBzZXJ2aW5nIGFzIGFubm90YXRpb24gZm9yIGxpc3RlbmVycyBhbmQgaGFuZGxlcnMgKi9cclxuICBleHBvcnQgdHlwZSBFdmVudFVuaWZpZWQgPSBFdmVudCB8IEN1c3RvbUV2ZW50IHwgRXZlbnRQaHlzaWNzO1xyXG5cclxuICAvKiogVW5pZmllZCBsaXN0ZW5lciB0eXBlIGV4dGVuZGluZyBFdmVudExpc3RlbmVyIGFuZCBFdmVudExpc3RlbmVyT2JqZWN0IGZvciBDdXN0b21FdmVudCBhbmQgb3RoZXJzICovXHJcbiAgZXhwb3J0IHR5cGUgRXZlbnRMaXN0ZW5lclVuaWZpZWQgPVxyXG4gICAgKChfZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKSB8XHJcbiAgICAoKF9ldmVudDogQ3VzdG9tRXZlbnQpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBFdmVudFBoeXNpY3MpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBFdmVudFRpbWVyKSA9PiB2b2lkKSB8XHJcbiAgICBFdmVudExpc3RlbmVyIHxcclxuICAgIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q7XHJcblxyXG4gIC8qKiBFeHRlbmRzIEV2ZW50VGFyZ2V0IHRvIHdvcmsgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfSAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFRhcmdldFVuaWZpZWQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcn0gZm9yIHJlZmVyZW5jZS4gV29ya3Mgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogc3RyaW5nLCBfaGFuZGxlcjogRXZlbnRMaXN0ZW5lclVuaWZpZWQsIF9vcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIoX3R5cGUsIDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0Pl9oYW5kbGVyLCBfb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJ9IGZvciByZWZlcmVuY2UuIFdvcmtzIHdpdGgge0BsaW5rIEV2ZW50TGlzdGVuZXJVbmlmaWVkfSBhbmQge0BsaW5rIEV2ZW50VW5pZmllZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKF90eXBlLCA8RXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdD5faGFuZGxlciwgX29wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBFdmVudFRhcmdldC5kaXNwYXRjaEV2ZW50fSBmb3IgcmVmZXJlbmNlLiBXb3JrcyB3aXRoIHdpdGgge0BsaW5rIEV2ZW50VW5pZmllZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudFVuaWZpZWQpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJhc2UgY2xhc3MgZm9yIEV2ZW50VGFyZ2V0IHNpbmdsZXRvbnMsIHdoaWNoIGFyZSBmaXhlZCBlbnRpdGllcyBpbiB0aGUgc3RydWN0dXJlIG9mIEZVREdFLCBzdWNoIGFzIHRoZSBjb3JlIGxvb3AgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50VGFyZ2V0U3RhdGljIGV4dGVuZHMgRXZlbnRUYXJnZXRVbmlmaWVkIHtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdGFyZ2V0U3RhdGljOiBFdmVudFRhcmdldFN0YXRpYyA9IG5ldyBFdmVudFRhcmdldFN0YXRpYygpO1xyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIEV2ZW50VGFyZ2V0U3RhdGljLnRhcmdldFN0YXRpYy5hZGRFdmVudExpc3RlbmVyKF90eXBlLCBfaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIEV2ZW50VGFyZ2V0U3RhdGljLnRhcmdldFN0YXRpYy5yZW1vdmVFdmVudExpc3RlbmVyKF90eXBlLCBfaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCBvbiB7QGxpbmsgdGFyZ2V0U3RhdGljfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkaXNwYXRjaEV2ZW50KF9ldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIGRlc2NyaWJpbmcgdGhlIGRhdGF0eXBlcyBvZiB0aGUgYXR0cmlidXRlcyBhIG11dGF0b3IgYXMgc3RyaW5ncyBcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICBbYXR0cmlidXRlOiBzdHJpbmddOiBzdHJpbmcgfCBPYmplY3Q7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEludGVyZmFjZSBkZXNjcmliaW5nIGEgbXV0YXRvciwgd2hpY2ggaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCBuYW1lcyBvZiBhdHRyaWJ1dGVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvciB7XHJcbiAgICBbYXR0cmlidXRlOiBzdHJpbmddOiBHZW5lcmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBJbnRlcmZhY2VzIGRlZGljYXRlZCBmb3IgZWFjaCBwdXJwb3NlLiBFeHRyYSBhdHRyaWJ1dGUgbmVjZXNzYXJ5IGZvciBjb21waWxldGltZSB0eXBlIGNoZWNraW5nLCBub3QgZXhpc3RlbnQgYXQgcnVudGltZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckZvckFuaW1hdGlvbiBleHRlbmRzIE11dGF0b3IgeyByZWFkb25seSBmb3JBbmltYXRpb246IG51bGwgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckZvclVzZXJJbnRlcmZhY2UgZXh0ZW5kcyBNdXRhdG9yIHsgcmVhZG9ubHkgZm9yVXNlckludGVyZmFjZTogbnVsbCB9XHJcbiAgLy8gZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yQ29tcG9uZW50IGV4dGVuZHMgTXV0YXRvciB7IHJlYWRvbmx5IGZvclVzZXJDb21wb25lbnQ6IG51bGw7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdCBhcHBsaWNhYmxlIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlIGFuZCBjb3BpZXMgb2YgdGhlaXIgdmFsdWVzIGluIGEgTXV0YXRvci1vYmplY3RcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TXV0YXRvck9mQXJiaXRyYXJ5KF9vYmplY3Q6IE9iamVjdCk6IE11dGF0b3Ige1xyXG4gICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgIGxldCBhdHRyaWJ1dGVzOiAoc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sKVtdID0gUmVmbGVjdC5vd25LZXlzKFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoX29iamVjdCkpO1xyXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcclxuICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBSZWZsZWN0LmdldChfb2JqZWN0LCBhdHRyaWJ1dGUpO1xyXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbilcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKSlcclxuICAgICAgLy8gICBjb250aW51ZTtcclxuICAgICAgbXV0YXRvclthdHRyaWJ1dGUudG9TdHJpbmcoKV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBtdXRhdG9yO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZSAtIGFzIG9mIG5vdyB3ZSBuZWVkIHRvIHBvbHlmaWxsIHRoZSBzeW1ib2wgdG8gbWFrZSBkZWNvcmF0b3IgbWV0YWRhdGEgd29yaywgc2VlIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC01LTIuaHRtbCNkZWNvcmF0b3ItbWV0YWRhdGFcclxuICBTeW1ib2wubWV0YWRhdGEgPz89IFN5bWJvbChcIlN5bWJvbC5tZXRhZGF0YVwiKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXNzb2NpYXRpb24gb2YgYW4gYXR0cmlidXRlIHdpdGggaXRzIHNwZWNpZmllZCB0eXBlIChjb25zdHJ1Y3RvcikuXHJcbiAgICogQHNlZSB7QGxpbmsgTWV0YWRhdGF9LlxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIE1ldGFBdHRyaWJ1dGVUeXBlcyA9IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIEZ1bmN0aW9uPjtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0YWRhdGEgZm9yIGNsYXNzZXMgZXh0ZW5kaW5nIHtAbGluayBNdXRhYmxlfS4gTWV0YWRhdGEgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgdXNpbmcgZGVjb3JhdG9ycy5cclxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtNS0yLmh0bWwjZGVjb3JhdG9yLW1ldGFkYXRhIHwgdHlwZSBzY3JpcHQgNS4yIGZlYXR1cmUgXCJkZWNvcmF0b3IgbWV0YWRhdGFcIn0gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzcGVjaWZpZWQgdHlwZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcy4gVXNlIHRoZSB7QGxpbmsgdHlwZX0gZGVjb3JhdG9yIHRvIGFkZCB0eXBlIGluZm9ybWF0aW9uIHRvIHRoZSBtZXRhZGF0YSBvZiBhIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBhdHRyaWJ1dGVUeXBlcz86IE1ldGFBdHRyaWJ1dGVUeXBlcztcclxuXHJcbiAgICBlbnVtZXJhYmxlS2V5cz86IChzdHJpbmcgfCBzeW1ib2wpW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvcmF0b3IgdG8gc3BlY2lmeSBhIHR5cGUgKGNvbnN0cnVjdG9yKSBmb3IgYW4gYXR0cmlidXRlIHdpdGhpbiBhIGNsYXNzJ3Mge0BsaW5rIE1ldGFkYXRhIHwgbWV0YWRhdGF9LlxyXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBpbnRlbmRlZCB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB0byBiZSBrbm93biBhdCBydW50aW1lLCBtYWtpbmcgaXQgYSB2YWxpZCBkcm9wIHRhcmdldCBpbiB0aGUgZWRpdG9yLlxyXG4gICAqXHJcbiAgICogKipOb3RlOioqIEF0dHJpYnV0ZXMgd2l0aCBhIHNwZWNpZmllZCBtZXRhLXR5cGUgd2lsbCBhbHdheXMgYmUgaW5jbHVkZWQgaW4gdGhlIHtAbGluayBNdXRhdG9yIGJhc2UtbXV0YXRvcn0gXHJcbiAgICogKHZpYSB7QGxpbmsgTXV0YWJsZS5nZXRNdXRhdG9yfSksIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgb3duIHR5cGUuIE5vbi17QGxpbmsgTXV0YWJsZSBtdXRhYmxlfSBvYmplY3RzIFxyXG4gICAqIHdpbGwgYmUgZGlzcGxheWVkIHZpYSB0aGVpciB7QGxpbmsgdG9TdHJpbmd9IG1ldGhvZCBpbiB0aGUgZWRpdG9yLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiB0eXBlKF9jb25zdHJ1Y3RvcjogYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBHZW5lcmFsW10pID0+IEdlbmVyYWwpOiAoX3ZhbHVlOiB1bmtub3duLCBfY29udGV4dDogQ2xhc3NGaWVsZERlY29yYXRvckNvbnRleHQgfCBDbGFzc0dldHRlckRlY29yYXRvckNvbnRleHQgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gKF92YWx1ZTogdW5rbm93biwgX2NvbnRleHQ6IENsYXNzTWVtYmVyRGVjb3JhdG9yQ29udGV4dCkgPT4geyAvLyBjb3VsZCBjYWNoZSB0aGUgZGVjb3JhdG9yIGZ1bmN0aW9uIGZvciBlYWNoIGNsYXNzXHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgfCBzeW1ib2wgPSBfY29udGV4dC5uYW1lO1xyXG4gICAgICBsZXQgbWV0YWRhdGE6IE1ldGFkYXRhID0gX2NvbnRleHQubWV0YWRhdGE7XHJcbiAgICAgIGxldCB0eXBlczogTWV0YUF0dHJpYnV0ZVR5cGVzID0gbWV0YWRhdGEuYXR0cmlidXRlVHlwZXMgPz89IHt9O1xyXG4gICAgICB0eXBlc1tuYW1lXSA9IF9jb25zdHJ1Y3RvcjtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvcmF0b3IgZm9yIG1ha2luZyBnZXR0ZXJzIGluIGEge0BsaW5rIE11dGFibGV9IGNsYXNzIGVudW1lcmFibGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBnZXR0ZXJzIGFyZSBpbmNsdWRlZCBpbiBtdXRhdG9ycyBhbmQgYXJlIHN1YnNlcXVlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvci5cclxuICAgKiBcclxuICAgKiAqKlVzYWdlOioqIEFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIGJvdGggdGhlIGdldHRlciBtZXRob2QgYW5kIHRoZSBjbGFzcyB0byBtYWtlIGl0IGVmZmVjdGl2ZS5cclxuICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhYmxlKF92YWx1ZTogdW5rbm93biwgX2NvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dCB8IENsYXNzR2V0dGVyRGVjb3JhdG9yQ29udGV4dCB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0KTogdm9pZCB7XHJcbiAgICAvLyBfY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAodGhpczogdW5rbm93bikgeyAvLyB0aGlzIGlzIHJ1biBwZXIgaW5zdGFuY2UuLi4gaWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIHJ1biB0aGlzIG9uY2UgcGVyIGNsYXNzXHJcbiAgICAvLyAgIGNvbnN0IHByb3RvdHlwZTogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcclxuICAgIC8vICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIF9jb250ZXh0Lm5hbWUpO1xyXG4gICAgLy8gICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUgPT0gZmFsc2UpXHJcbiAgICAvLyAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgX2NvbnRleHQubmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgbGV0IG1ldGFkYXRhOiBNZXRhZGF0YSA9IF9jb250ZXh0Lm1ldGFkYXRhO1xyXG4gICAgaWYgKF9jb250ZXh0LmtpbmQgPT0gXCJnZXR0ZXJcIiB8fCBfY29udGV4dC5raW5kID09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICBtZXRhZGF0YS5lbnVtZXJhYmxlS2V5cyA/Pz0gW107XHJcbiAgICAgIG1ldGFkYXRhLmVudW1lcmFibGVLZXlzLnB1c2goX2NvbnRleHQubmFtZS50b1N0cmluZygpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKF9jb250ZXh0LmtpbmQgPT0gXCJjbGFzc1wiKSB7XHJcbiAgICAgIG1ldGFkYXRhLmVudW1lcmFibGVLZXlzID8/PSBbXTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbWV0YWRhdGEuZW51bWVyYWJsZUtleXMpXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCg8RnVuY3Rpb24+X3ZhbHVlKS5wcm90b3R5cGUsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHlwZXMgdGhhdCBhcmUgbXV0YWJsZSB1c2luZyB7QGxpbmsgTXV0YXRvcn0tb2JqZWN0cywgdGh1cyBwcm92aWRpbmcgYW5kIHVzaW5nIGludGVyZmFjZXMgY3JlYXRlZCBhdCBydW50aW1lLlxyXG4gICAqIFxyXG4gICAqIE11dGFibGVzIHByb3ZpZGUgYSB7QGxpbmsgTXV0YXRvcn0gYnVpbHQgYnkgY29sbGVjdGluZyBhbGwgdGhlaXIgYXBwbGljYWJsZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEJ5IGRlZmF1bHQsIHRoaXMgaW5jbHVkZXMgb25seSBwcmltaXRpdmUgdHlwZXMgYW5kIG5lc3RlZCBtdXRhYmxlIG9iamVjdHMuXHJcbiAgICogVXNpbmcgdGhlIHtAbGluayB0eXBlfS1kZWNvcmF0b3IgY2FuIGFsc28gaW5jbHVkZSBub24tbXV0YWJsZSBvYmplY3RzLCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCB2aWEgdGhlaXIge0BsaW5rIHRvU3RyaW5nfSBtZXRob2QgaW4gdGhlIGVkaXRvci5cclxuICAgKiBcclxuICAgKiBTdWJjbGFzc2VzIGNhbiBlaXRoZXIgcmVkdWNlIHRoZSBzdGFuZGFyZCB7QGxpbmsgTXV0YXRvcn0gYnVpbHQgYnkgdGhpcyBiYXNlIGNsYXNzIGJ5IGRlbGV0aW5nIHByb3BlcnRpZXMgb3IgaW1wbGVtZW50IGFuIGluZGl2aWR1YWwgZ2V0TXV0YXRvciBtZXRob2QuXHJcbiAgICogVGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBNdXRhdG9yfSBtdXN0IG1hdGNoIHB1YmxpYyBwcm9wZXJ0aWVzIG9yIGdldHRlcnMvc2V0dGVycyBvZiB0aGUgb2JqZWN0LlxyXG4gICAqIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGhhbmRsZWQgYnkgYW4gb3ZlcnJpZGUgb2YgdGhlIG11dGF0ZSBtZXRob2QgaW4gdGhlIHN1YmNsYXNzLCBhbmQgd2lsbCB0aHJvdyBlcnJvcnMgaW4gYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBvYmplY3QuXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE11dGFibGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvcmF0b3IgYWxsb3dzIHRvIGF0dGFjaCB7QGxpbmsgTXV0YWJsZX0gZnVuY3Rpb25hbGl0eSB0byBleGlzdGluZyBjbGFzc2VzLiBcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAvLyAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgLy8gICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNdXRhdG9yKHRoaXM6IE11dGFibGVGb3JVc2VySW50ZXJmYWNlKTogTXV0YXRvciB7XHJcbiAgICAvLyAgICAgICByZXR1cm4gZ2V0TXV0YXRvck9mQXJiaXRyYXJ5KHRoaXMpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRNdXRhdG9yRnJvbVBhdGgoX211dGF0b3I6IE11dGF0b3IsIF9wYXRoOiBzdHJpbmdbXSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfcGF0aFswXTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKF9tdXRhdG9yW2tleV0gPT0gdW5kZWZpbmVkKSAvLyBpZiB0aGUgcGF0aCBkZXZpYXRlcyBmcm9tIG11dGF0b3Igc3RydWN0dXJlLCByZXR1cm4gdGhlIG11dGF0b3JcclxuICAgICAgICByZXR1cm4gX211dGF0b3I7XHJcbiAgICAgIG11dGF0b3Jba2V5XSA9IF9tdXRhdG9yW2tleV07XHJcbiAgICAgIGlmIChfcGF0aC5sZW5ndGggPiAxKVxyXG4gICAgICAgIG11dGF0b3Jba2V5XSA9IE11dGFibGUuZ2V0TXV0YXRvckZyb21QYXRoKG11dGF0b3Jba2V5XSwgX3BhdGguc2xpY2UoMSwgX3BhdGgubGVuZ3RoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoaXMgbXV0YWJsZSBzdWJjbGFzcyBhcyB0aGUgbmFtZSBvZiB0aGUgcnVudGltZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMgVGhlIHR5cGUgb2YgdGhlIG11dGFibGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3QgYXBwbGljYWJsZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgY29waWVzIG9mIHRoZWlyIHZhbHVlcyBpbiBhIE11dGF0b3Itb2JqZWN0LlxyXG4gICAgICogQnkgZGVmYXVsdCwgYSBtdXRhdG9yIGNhbm5vdCBiZSBleHRlbmRlZCwgc2luY2UgZXh0ZW5zaW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgb2JqZWN0IHRoZSBtdXRhdG9yIGJlbG9uZ3MgdG8uXHJcbiAgICAgKiBBIG11dGF0b3IgbWF5IGJlIHJlZHVjZWQgYnkgdGhlIGRlc2NlbmRhbnRzIG9mIHtAbGluayBNdXRhYmxlfSB0byBjb250YWluIG9ubHkgdGhlIHByb3BlcnRpZXMgbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge307XHJcblxyXG4gICAgICAvLyBjb2xsZWN0IHByaW1pdGl2ZSBhbmQgbXV0YWJsZSBhdHRyaWJ1dGVzXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiB0aGlzKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSB0aGlzW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlQXJyYXkpICYmICEodmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFJlc291cmNlXCIpKSAmJiB0aGlzLmdldE1ldGFBdHRyaWJ1dGVUeXBlcygpW2F0dHJpYnV0ZV0gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2V4dGVuZGFibGUpXHJcbiAgICAgICAgLy8gbXV0YXRvciBjYW4gYmUgcmVkdWNlZCBidXQgbm90IGV4dGVuZGVkIVxyXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgLy8gZGVsZXRlIHVud2FudGVkIGF0dHJpYnV0ZXNcclxuICAgICAgdGhpcy5yZWR1Y2VNdXRhdG9yKG11dGF0b3IpO1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSByZWZlcmVuY2VzIHRvIG11dGFibGUgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbXV0YXRvcnNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIG11dGF0b3IpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IG11dGF0b3JbYXR0cmlidXRlXTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGVBcnJheSlcclxuICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IHZhbHVlLm1hcCgoX3ZhbHVlKSA9PiBfdmFsdWUuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIGFuaW1hdGlvbi5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKF9leHRlbmRhYmxlOiBib29sZWFuID0gZmFsc2UpOiBNdXRhdG9yRm9yQW5pbWF0aW9uIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yQW5pbWF0aW9uPnRoaXMuZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZShfZXh0ZW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTXV0YXRvckZvclVzZXJJbnRlcmZhY2Uge1xyXG4gICAgICByZXR1cm4gPE11dGF0b3JGb3JVc2VySW50ZXJmYWNlPnRoaXMuZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZSk7ICAvLyBUT0RPOiBib3RoIG9mIHRoZXNlICh0aGlzIGFuZCBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKSBkb24ndCByZWFsbHkgd29yayBhcyB0aGV5IGRvbid0IHJlY3Vyc2l2ZWx5IGNhbGwgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2Ugb24gc3ViLW11dGFibGUgb2JqZWN0cywgbWF5YmUgaW5zdGVhZCBpbXBsZW1lbnQgYSByZWR1Y2VNdXRhdG9yRm9yVXNlckludGVyZmFjZT8/P1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGVjdCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIHRoZWlyIHZhbHVlcyBhcHBsaWNhYmxlIGZvciBpbmRpdml1YWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBCYXNpYyBmdW5jdGlvbmFsaXR5IGlzIGlkZW50aWNhbCB0byB7QGxpbmsgZ2V0TXV0YXRvcn0sIHJldHVybmVkIG11dGF0b3Igc2hvdWxkIHRoZW4gYmUgcmVkdWNlZCBieSB0aGUgc3ViY2xhc3NlZCBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpOiBNdXRhdG9yRm9yQ29tcG9uZW50IHtcclxuICAgIC8vICAgICByZXR1cm4gPE11dGF0b3JGb3JDb21wb25lbnQ+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBnaXZlbiBtdXRhdG9yLCBidXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBhcyBzdHJpbmctdmFsdWVzLlxyXG4gICAgICogRG9lcyBub3QgcmVjdXJzZSBpbnRvIG9iamVjdHMhIFRoaXMgd2lsbCByZXR1cm4gdGhlIGRlY29yYXRlZCB7QGxpbmsgTWV0YWRhdGEgbWV0YS10eXBlfSBpbnN0ZWFkIG9mIHRoZSBydW50aW1lLXR5cGUgb2YgdGhlIG9iamVjdCwgaWYgYXZhaWxhYmxlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSB7fTtcclxuICAgICAgbGV0IG1ldGFUeXBlczogTWV0YUF0dHJpYnV0ZVR5cGVzID0gdGhpcy5nZXRNZXRhQXR0cmlidXRlVHlwZXMoKTtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHR5cGU6IHN0cmluZyA9IG1ldGFUeXBlc1thdHRyaWJ1dGVdPy5uYW1lO1xyXG4gICAgICAgIGxldCB2YWx1ZTogbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZyB8IG9iamVjdCB8IEZ1bmN0aW9uID0gX211dGF0b3JbYXR0cmlidXRlXTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCAmJiB0eXBlID09IHVuZGVmaW5lZClcclxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgdHlwZSA9ICg8R2VuZXJhbD50aGlzKVthdHRyaWJ1dGVdLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICB0eXBlID0gdmFsdWUubmFtZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdHlwZSA9IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XHJcblxyXG4gICAgICAgIHR5cGVzW2F0dHJpYnV0ZV0gPSB0eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgc3BlY2lmaWVkIHtAbGluayBNZXRhZGF0YS5hdHRyaWJ1dGVUeXBlcyB8IGF0dHJpYnV0ZSB0eXBlc30gZnJvbSB0aGUge0BsaW5rIE1ldGFkYXRhIHwgbWV0YWRhdGF9IG9mIHRoaXMgaW5zdGFuY2UncyBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1ldGFBdHRyaWJ1dGVUeXBlcygpOiBNZXRhQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSgpLmF0dHJpYnV0ZVR5cGVzID8/PSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBNZXRhZGF0YSB8IG1ldGFkYXRhfSBvZiB0aGlzIGluc3RhbmNlJ3MgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNZXRhZGF0YSgpOiBNZXRhZGF0YSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5tZXRhZGF0YV0gPz89IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtdXRhdG9yIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBSZWZsZWN0LmdldCh0aGlzLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpXHJcbiAgICAgICAgICB2YWx1ZS51cGRhdGVNdXRhdG9yKF9tdXRhdG9yW2F0dHJpYnV0ZV0pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIHRoZSBtdXRhdG9yLlxyXG4gICAgICogVGhlIG11dGF0aW9uIG1heSBiZSByZXN0cmljdGVkIHRvIGEgc3Vic2V0IG9mIHRoZSBtdXRhdG9yIGFuZCB0aGUgZXZlbnQgZGlzcGF0Y2hpbmcgc3VwcHJlc3NlZC5cclxuICAgICAqIFVzZXMgbXV0YXRlQmFzZSwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBzdWJjbGFzc2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIF9zZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoX2Rpc3BhdGNoTXV0YXRlKVxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFLCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBtdXRhdG9yOiBfbXV0YXRvciB9IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJhc2UgbWV0aG9kIGZvciBtdXRhdGlvbiwgYWx3YXlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzLiBEbyBub3Qgb3ZlcndyaXRlIGluIHN1YmNsYXNzZXMhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhc3luYyBtdXRhdGVCYXNlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBfbXV0YXRvcjtcclxuXHJcbiAgICAgIGlmIChfc2VsZWN0aW9uKSB7IC8vIFRPRE86IHRoaXMgZG9lc24ndCB3b3JrIGFzIGl0IGRvZXMgbm90IHJlY3Vyc2UgaW50byBvYmplY3RzXHJcbiAgICAgICAgbXV0YXRvciA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBfc2VsZWN0aW9uKSAvLyByZWR1Y2UgdGhlIG11dGF0b3IgdG8gdGhlIHNlbGVjdGlvblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3JbYXR0cmlidXRlXSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBtdXRhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFSZWZsZWN0Lmhhcyh0aGlzLCBhdHRyaWJ1dGUpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IG11dGFudDogT2JqZWN0ID0gUmVmbGVjdC5nZXQodGhpcywgYXR0cmlidXRlKTtcclxuICAgICAgICBsZXQgdmFsdWU6IE11dGF0b3IgPSA8TXV0YXRvcj5tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKG11dGFudCBpbnN0YW5jZW9mIE11dGFibGVBcnJheSB8fCBtdXRhbnQgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgYXdhaXQgbXV0YW50Lm11dGF0ZSh2YWx1ZSwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIGF0dHJpYnV0ZSwgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZHVjZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdlbmVyYWwgbXV0YXRvciBhY2NvcmRpbmcgdG8gZGVzaXJlZCBvcHRpb25zIGZvciBtdXRhdGlvbi4gVG8gYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xyXG4gICAgICogQHBhcmFtIF9tdXRhdG9yIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQ7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgZXhwb3J0IHR5cGUgR2VuZXJhbCA9IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9sZHMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlY3JlYXRlIGFuIG9iamVjdCBpZGVudGljYWwgdG8gdGhlIG9uZSBpdCBvcmlnaW5hdGVkIGZyb20uIFxyXG4gICAqIEEgc2VyaWFsaXphdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBjb3BpZXMgb2YgZXhpc3Rpbmcgb2JqZWN0cyBhdCBydW50aW1lIG9yIHRvIHN0b3JlIG9iamVjdHMgYXMgc3RyaW5ncyBvciByZWNyZWF0ZSB0aGVtLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphdGlvbiB7XHJcbiAgICBbdHlwZTogc3RyaW5nXTogR2VuZXJhbDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBvZiB0aGlzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb247XHJcbiAgICAvKipcclxuICAgICAqIFJlY3JlYXRlcyB0aGlzIGluc3RhbmNlIG9mIHtAbGluayBTZXJpYWxpemFibGV9IHdpdGggdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIHtAbGluayBTZXJpYWxpemF0aW9ufS5cclxuICAgICAqL1xyXG4gICAgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT47XHJcbiAgfVxyXG5cclxuICBpbnRlcmZhY2UgTmFtZXNwYWNlUmVnaXN0ZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE9iamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGV4dGVybmFsIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZiB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzLiBUaGUgaW50ZXJuYWwgcHJvY2VzcyBpcyBoYW5kbGVkIGJ5IHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuICBcclxuICAgKiBBIHtAbGluayBTZXJpYWxpemF0aW9ufSBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdCBhbmQgYSBKU09OLVN0cmluZyBtYXkgYmUgY3JlYXRlZCBmcm9tIHRoYXQuICBcclxuICAgKiBWaWNlIHZlcnNhLCBhIEpTT04tU3RyaW5nIGNhbiBiZSBwYXJzZWQgdG8gYSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gd2hpY2ggY2FuIGJlIGRlc2VyaWFsaXplZCB0byBhIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogIFtTZXJpYWxpemFibGVdIOKGkiAoc2VyaWFsaXplKSDihpIgW1NlcmlhbGl6YXRpb25dIOKGkiAoc3RyaW5naWZ5KSDihpIgW1N0cmluZ10g4oaSIChzYXZlIG9yIHNlbmQpXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaTICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgIFtTZXJpYWxpemFibGVdIOKGkCAoZGVzZXJpYWxpemUpIOKGkCBbU2VyaWFsaXphdGlvbl0g4oaQIChwYXJzZSkg4oaQIChsb2FkKSDihpAgW01lZGl1bV1cclxuICAgKiBgYGAgICAgICBcclxuICAgKiBXaGlsZSB0aGUgaW50ZXJuYWwgc2VyaWFsaXplL2Rlc2VyaWFsaXplIG1ldGhvZDFzIG9mIHRoZSBvYmplY3RzIGNhcmUgb2YgdGhlIHNlbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVjcmVhdGUgdGhlIG9iamVjdCBhbmQgaXRzIHN0cnVjdHVyZSwgIFxyXG4gICAqIHRoZSB7QGxpbmsgU2VyaWFsaXplcn0ga2VlcHMgdHJhY2sgb2YgdGhlIG5hbWVzcGFjZXMgYW5kIGNsYXNzZXMgaW4gb3JkZXIgdG8gcmVjcmVhdGUge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cy4gVGhlIGdlbmVyYWwgc3RydWN0dXJlIG9mIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IGlzIGFzIGZvbGxvd3MgIFxyXG4gICAqIGBgYHRleHRcclxuICAgKiB7XHJcbiAgICogICAgICBuYW1lc3BhY2VOYW1lLmNsYXNzTmFtZToge1xyXG4gICAqICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlWYWx1ZSxcclxuICAgKiAgICAgICAgICAuLi4sXHJcbiAgICogICAgICAgICAgcHJvcGVydHlOYW1lT2ZSZWZlcmVuY2U6IFNlcmlhbGl6YXRpb25PZlRoZVJlZmVyZW5jZWRPYmplY3QsXHJcbiAgICogICAgICAgICAgLi4uLFxyXG4gICAqICAgICAgICAgIGNvbnN0cnVjdG9yTmFtZU9mU3VwZXJjbGFzczogU2VyaWFsaXphdGlvbk9mU3VwZXJDbGFzc1xyXG4gICAqICAgICAgfVxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKiBTaW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHN1cGVyY2xhc3MgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWQsIFxyXG4gICAqIHRoZSBTZXJpYWxpemF0aW9uT2ZTdXBlckNsYXNzIG9taXRzIHRoZSB0aGUgbmFtZXNwYWNlTmFtZS5jbGFzc05hbWUga2V5IGFuZCBjb25zaXN0cyBvbmx5IG9mIGl0cyB2YWx1ZS4gXHJcbiAgICogVGhlIGNvbnN0cnVjdG9yTmFtZU9mU3VwZXJjbGFzcyBpcyBnaXZlbiBpbnN0ZWFkIGFzIGEgcHJvcGVydHkgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc3ViY2xhc3MuXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6ZXIge1xyXG4gICAgLyoqIEluIG9yZGVyIGZvciB0aGUgU2VyaWFsaXplciB0byBjcmVhdGUgY2xhc3MgaW5zdGFuY2VzLCBpdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZXMgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVzcGFjZXM6IE5hbWVzcGFjZVJlZ2lzdGVyID0geyBcIsaSXCI6IEZ1ZGdlQ29yZSB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlIHRvIHRoZSB7QGxpbmsgU2VyaWFsaXplcn0sIHRvIGVuYWJsZSBhdXRvbWF0aWMgaW5zdGFudGlhdGlvbiBvZiBjbGFzc2VzIGRlZmluZWQgd2l0aGluXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJOYW1lc3BhY2UoX25hbWVzcGFjZTogT2JqZWN0KTogc3RyaW5nIHtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBTZXJpYWxpemVyLm5hbWVzcGFjZXMpXHJcbiAgICAgICAgaWYgKFNlcmlhbGl6ZXIubmFtZXNwYWNlc1tuYW1lXSA9PSBfbmFtZXNwYWNlKVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWU7XHJcblxyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gU2VyaWFsaXplci5maW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZSwgd2luZG93KTtcclxuICAgICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIGZvciAobGV0IHBhcmVudE5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgICBuYW1lID0gU2VyaWFsaXplci5maW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZSwgU2VyaWFsaXplci5uYW1lc3BhY2VzW3BhcmVudE5hbWVdKTtcclxuICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBwYXJlbnROYW1lICsgXCIuXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICBpZiAoIW5hbWUpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTmFtZXNwYWNlIG5vdCBmb3VuZC4gTWF5YmUgcGFyZW50IG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZT9cIik7XHJcblxyXG4gICAgICBTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZV0gPSBfbmFtZXNwYWNlO1xyXG4gICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgamF2YXNjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemFibGUgRlVER0Utb2JqZWN0IGdpdmVuLFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHMgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcmVjb25zdHJ1Y3Rpb25cclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IEFuIG9iamVjdCB0byBzZXJpYWxpemUsIGltcGxlbWVudGluZyB0aGUge0BsaW5rIFNlcmlhbGl6YWJsZX0gaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKF9vYmplY3Q6IFNlcmlhbGl6YWJsZSk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICAvLyBUT0RPOiBzYXZlIHRoZSBuYW1lc3BhY2Ugd2l0aCB0aGUgY29uc3RydWN0b3JzIG5hbWVcclxuICAgICAgLy8gc2VyaWFsaXphdGlvbltfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWVdID0gX29iamVjdC5zZXJpYWxpemUoKTtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZyA9IHRoaXMuZ2V0RnVsbFBhdGgoX29iamVjdCk7XHJcbiAgICAgIGlmICghcGF0aClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWVzcGFjZSBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIG9yIHRoZSBjbGFzcyBub3QgZXhwb3J0ZWQ/YCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bcGF0aF0gPSBfb2JqZWN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgLy8gcmV0dXJuIF9vYmplY3Quc2VyaWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgRlVER0Utb2JqZWN0IHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHtAbGluayBTZXJpYWxpemF0aW9ufSBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Q6IFNlcmlhbGl6YWJsZTtcclxuICAgICAgbGV0IHBhdGg6IHN0cmluZztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBsb29wIGNvbnN0cnVjdGVkIHNvbGVseSB0byBhY2Nlc3MgdHlwZS1wcm9wZXJ0eS4gT25seSBvbmUgZXhwZWN0ZWQhXHJcbiAgICAgICAgZm9yIChwYXRoIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgICByZWNvbnN0cnVjdCA9IFNlcmlhbGl6ZXIucmVjb25zdHJ1Y3QocGF0aCk7XHJcbiAgICAgICAgICByZWNvbnN0cnVjdCA9IGF3YWl0IHJlY29uc3RydWN0LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3BhdGhdKTtcclxuICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIGxldCBtZXNzYWdlOiBzdHJpbmcgPSBgRGVzZXJpYWxpemF0aW9uIG9mICR7cGF0aH0sICR7cmVjb25zdHJ1Y3QgPyBSZWZsZWN0LmdldChyZWNvbnN0cnVjdCwgXCJpZFJlc291cmNlXCIpIDogXCJcIn0gZmFpbGVkOiBgICsgX2Vycm9yO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gQXJyYXkgb2YgamF2YXNjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemFibGUgRlVER0Utb2JqZWN0cyBnaXZlbiBpbiB0aGUgYXJyYXksXHJcbiAgICAgKiBpbmNsdWRpbmcgYXR0YWNoZWQgY29tcG9uZW50cywgY2hpbGRyZW4sIHN1cGVyY2xhc3Mtb2JqZWN0cyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUFycmF5PFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF90eXBlOiBuZXcgKCkgPT4gVCwgX29iamVjdHM6IFNlcmlhbGl6YWJsZVtdKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uczogU2VyaWFsaXphdGlvbltdID0gW107XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmcgPSB0aGlzLmdldEZ1bGxQYXRoKG5ldyBfdHlwZSgpKTtcclxuICAgICAgaWYgKCFwYXRoKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmFtZXNwYWNlIG9mIHNlcmlhbGl6YWJsZSBvYmplY3Qgb2YgdHlwZSAke190eXBlLm5hbWV9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIG9yIHRoZSBjbGFzcyBub3QgZXhwb3J0ZWQ/YCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBvYmplY3Qgb2YgX29iamVjdHMpXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbnMucHVzaChvYmplY3Quc2VyaWFsaXplKCkpO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbltwYXRoXSA9IHNlcmlhbGl6YXRpb25zO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gQXJyYXkgb2YgRlVER0Utb2JqZWN0cyByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhcnJheSBvZiB7QGxpbmsgU2VyaWFsaXphdGlvbn1zIGdpdmVuLFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGVbXT4ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphYmxlczogU2VyaWFsaXphYmxlW10gPSBbXTtcclxuICAgICAgbGV0IGNvbnN0cnVjdDogbmV3ICgpID0+IFNlcmlhbGl6YWJsZTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb25zOiBTZXJpYWxpemF0aW9uW10gPSBbXTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBsb29wIGNvbnN0cnVjdGVkIHNvbGVseSB0byBhY2Nlc3MgdHlwZS1wcm9wZXJ0eS4gT25seSBvbmUgZXhwZWN0ZWQhXHJcbiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgY29uc3RydWN0ID0gU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcihwYXRoKTtcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25zID0gX3NlcmlhbGl6YXRpb25bcGF0aF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlc2VyaWFsaXphdGlvbiBmYWlsZWQ6IFwiICsgX2Vycm9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgc2VyaWFsaXphdGlvbiBvZiBzZXJpYWxpemF0aW9ucykge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemFibGU6IFNlcmlhbGl6YWJsZSA9IG5ldyBjb25zdHJ1Y3QoKTtcclxuICAgICAgICBhd2FpdCBzZXJpYWxpemFibGUuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgc2VyaWFsaXphYmxlcy5wdXNoKHNlcmlhbGl6YWJsZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemFibGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogaW1wbGVtZW50IHByZXR0aWZpZXIgdG8gbWFrZSBKU09OLVN0cmluZ2lmaWNhdGlvbiBvZiBzZXJpYWxpemF0aW9ucyBtb3JlIHJlYWRhYmxlLCBlLmcuIHBsYWNpbmcgeCwgeSBhbmQgeiBpbiBvbmUgbGluZVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmV0dGlmeSBhIEpTT04tU3RyaW5nLCB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUuXHJcbiAgICAgKiBub3QgaW1wbGVtZW50ZWQgeWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcHJldHRpZnkoX2pzb246IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBfanNvbjsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCwgaHVtYW4gcmVhZGFibGUgSlNPTi1TdHJpbmcsIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4ge0BsaW5rIFNlcmlhbGl6YXRpb259IHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHtAbGluayBTZXJpYWxpemVyfS5zZXJpYWxpemVcclxuICAgICAqIEBwYXJhbSBfc2VyaWFsaXphdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0cmluZ2lmeShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IHN0cmluZyB7XHJcbiAgICAgIC8vIGFkanVzdG1lbnRzIHRvIHNlcmlhbGl6YXRpb24gY2FuIGJlIG1hZGUgaGVyZSBiZWZvcmUgc3RyaW5naWZpY2F0aW9uLCBpZiBkZXNpcmVkXHJcbiAgICAgIGxldCBqc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShfc2VyaWFsaXphdGlvbiwgbnVsbCwgMik7XHJcbiAgICAgIGxldCBwcmV0dHk6IHN0cmluZyA9IFNlcmlhbGl6ZXIucHJldHRpZnkoanNvbik7XHJcbiAgICAgIHJldHVybiBwcmV0dHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gSlNPTi1TdHJpbmcuIFJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHtAbGluayBTZXJpYWxpemVyLmRlc2VyaWFsaXplfVxyXG4gICAgICogQHBhcmFtIF9qc29uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKF9qc29uOiBzdHJpbmcpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoX2pzb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIGRlZmluZWQgd2l0aCB0aGUgZnVsbCBwYXRoIGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlTmFtZShzKSBhbmQgdGhlIGNsYXNzTmFtZSBzZXBlcmF0ZWQgYnkgZG90cyguKSBcclxuICAgICAqIEBwYXJhbSBfcGF0aCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWNvbnN0cnVjdChfcGF0aDogc3RyaW5nKTogU2VyaWFsaXphYmxlIHtcclxuICAgICAgbGV0IGNvbnN0cnVjdG9yOiBuZXcgKCkgPT4gU2VyaWFsaXphYmxlID0gU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcihfcGF0aCk7XHJcbiAgICAgIGxldCByZWNvbnN0cnVjdGlvbjogU2VyaWFsaXphYmxlID0gbmV3IGNvbnN0cnVjdG9yKCk7XHJcbiAgICAgIHJldHVybiByZWNvbnN0cnVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGdldENvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF90eXBlOiBzdHJpbmcsIF9uYW1lc3BhY2U6IE9iamVjdCA9IEZ1ZGdlQ29yZSk6IG5ldyAoKSA9PiBUIHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgZ2l2ZW4gcGF0aCB0byBhIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29uc3RydWN0b3I8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oX3BhdGg6IHN0cmluZyk6IG5ldyAoKSA9PiBUIHtcclxuICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBfcGF0aC5zdWJzdHJpbmcoX3BhdGgubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcbiAgICAgIGxldCBuYW1lc3BhY2U6IE9iamVjdCA9IFNlcmlhbGl6ZXIuZ2V0TmFtZXNwYWNlKF9wYXRoKTtcclxuICAgICAgaWYgKCFuYW1lc3BhY2UpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25zdHJ1Y3RvciBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfcGF0aH0gbm90IGZvdW5kLiBNYXliZSB0aGUgbmFtZXNwYWNlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ/YCk7XHJcbiAgICAgIHJldHVybiAoPEdlbmVyYWw+bmFtZXNwYWNlKVt0eXBlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QsIGlmIGZvdW5kIGluIHRoZSByZWdpc3RlcmVkIG5hbWVzcGFjZXNcclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGdWxsUGF0aChfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IF9vYmplY3QuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgLy8gRGVidWcubG9nKFwiU2VhcmNoaW5nIG5hbWVzcGFjZSBvZjogXCIgKyB0eXBlTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IG5hbWVzcGFjZU5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgbGV0IGZvdW5kOiBHZW5lcmFsID0gKDxHZW5lcmFsPlNlcmlhbGl6ZXIubmFtZXNwYWNlcylbbmFtZXNwYWNlTmFtZV1bdHlwZU5hbWVdO1xyXG4gICAgICAgIGlmIChmb3VuZCAmJiBfb2JqZWN0IGluc3RhbmNlb2YgZm91bmQpXHJcbiAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlTmFtZSArIFwiLlwiICsgdHlwZU5hbWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Utb2JqZWN0IGRlZmluZWQgd2l0aGluIHRoZSBmdWxsIHBhdGgsIGlmIHJlZ2lzdGVyZWRcclxuICAgICAqIEBwYXJhbSBfcGF0aFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXROYW1lc3BhY2UoX3BhdGg6IHN0cmluZyk6IE9iamVjdCB7XHJcbiAgICAgIGxldCBuYW1lc3BhY2VOYW1lOiBzdHJpbmcgPSBfcGF0aC5zdWJzdHIoMCwgX3BhdGgubGFzdEluZGV4T2YoXCIuXCIpKTtcclxuICAgICAgcmV0dXJuIFNlcmlhbGl6ZXIubmFtZXNwYWNlc1tuYW1lc3BhY2VOYW1lXSB8fCBGdWRnZUNvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgbmFtZXNwYWNlLW9iamVjdCBpbiBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJlbnQtb2JqZWN0IChlLmcuIHdpbmRvdyksIGlmIHByZXNlbnRcclxuICAgICAqIEBwYXJhbSBfbmFtZXNwYWNlIFxyXG4gICAgICogQHBhcmFtIF9wYXJlbnQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGZpbmROYW1lc3BhY2VJbihfbmFtZXNwYWNlOiBPYmplY3QsIF9wYXJlbnQ6IE9iamVjdCk6IHN0cmluZyB7XHJcbiAgICAgIGZvciAobGV0IHByb3AgaW4gX3BhcmVudClcclxuICAgICAgICBpZiAoKDxHZW5lcmFsPl9wYXJlbnQpW3Byb3BdID09IF9uYW1lc3BhY2UpXHJcbiAgICAgICAgICByZXR1cm4gcHJvcDtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogR2VuZXJhbFtdKSA9PiBUO1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IChhYnN0cmFjdCkgY2xhc3MgaW1wbGVtZW50aW5nIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfSBmcm9tIGFueSBjbGFzcyB0aGF0IGltcGxlbWVudHMge0BsaW5rIFNlcmlhbGl6YWJsZVJlc291cmNlfSBieSBtaXhpbmcgaW4gdGhlIGZ1bmN0aW9uYWxpdHkgdG8gbG9hZCB0aGUgcmVzb3VyY2UgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlPj4oX2Jhc2U6IFRCYXNlKSB7IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgKi8gLy9kaXNhYmxlIGVzbGludCBiZWNhdXNlIG9ubHkgdHlwZSBpbmZlcmVuY2Ugc2VlbXMgdG8gYmUgYWJsZSB0byBoYW5kbGUgbWl4aW4gYWJzdHJhY3QgY2xhc3NlcyBjb3JyZWN0bHlcclxuICAgIGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgZXh0ZW5kcyBfYmFzZSBpbXBsZW1lbnRzIEZ1ZGdlQ29yZS5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsIHtcclxuICAgICAgcHVibGljIHVybDogUmVxdWVzdEluZm87XHJcblxyXG4gICAgICBwdWJsaWMgc3RhdHVzOiBSRVNPVVJDRV9TVEFUVVMgPSBSRVNPVVJDRV9TVEFUVVMuUEVORElORztcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IG9mIHRoaXMgcmVzb3VyY2UuIE9ubHkgdGhlIGRhdGEgbmVlZGVkIHRvIGxvYWQgaXQgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlIGlzIHNlcmlhbGl6ZWQgKFwidXJsXCIsIFwibmFtZVwiLCBcImlkUmVzb3VyY2VcIikuXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICB1cmw6IHRoaXMudXJsLnRvU3RyaW5nKClcclxuICAgICAgICB9OyBcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICAgIHRoaXMudXJsID0gX3NlcmlhbGl6YXRpb24udXJsO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYWJzdHJhY3QgbG9hZCgpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+O1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX2Jhc2UucHJvdG90eXBlIGluc3RhbmNlb2YgTXV0YWJsZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogTWl4aW4gdGhlIHtAbGluayBNdXRhYmxlfSBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzXHJcbiAgICAgICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gbWl4aW5NdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgJiBNdXRhYmxlPj4oX2Jhc2U6IFRCYXNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgICBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIF9iYXNlIHtcclxuICAgICAgICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB1bmRlZmluZWQgfHwgX211dGF0b3IubmFtZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgICAgICAgZGVsZXRlIF9tdXRhdG9yLnN0YXR1cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1peGluTXV0YWJsZVNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoPFRCYXNlICYgQ29uc3RydWN0b3I8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCAmIE11dGFibGU+PlNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwQ2xhc3NUb0NvbXBvbmVudHMge1xyXG4gICAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ29tcG9uZW50W107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgc2NlbmV0cmVlLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0dyYXBoXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZzsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIG5vZGUgYnkuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHRpbWVzdGFtcFVwZGF0ZTogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG5vZGVzIG9mIHRoZSB3aG9sZSBicmFuY2ggaW5jbHVkaW5nIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgKi9cclxuICAgIHB1YmxpYyBuTm9kZXNJbkJyYW5jaDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgZGltZW5zaW9ucyBlbmNsb3NpbmcgdGhlIGdlb21ldHJ5IG9mIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgaW4gdGhlIGJyYW5jaCAqL1xyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudDogTm9kZSB8IG51bGwgPSBudWxsOyAvLyBUaGUgcGFyZW50IG9mIHRoaXMgbm9kZS5cclxuICAgIHByaXZhdGUgY2hpbGRyZW46IE5vZGVbXSA9IFtdOyAvLyBhcnJheSBvZiBjaGlsZCBub2RlcyBhcHBlbmRlZCB0byB0aGlzIG5vZGUuXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IE1hcENsYXNzVG9Db21wb25lbnRzID0ge307XHJcbiAgICAvLyBwcml2YXRlIHRhZ3M6IHN0cmluZ1tdID0gW107IC8vIE5hbWVzIG9mIHRhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiAoVE9ETzogQXMgb2YgeWV0IG5vIGZ1bmN0aW9uYWxpdHkpXHJcbiAgICAvLyBwcml2YXRlIGxheWVyczogc3RyaW5nW10gPSBbXTsgLy8gTmFtZXMgb2YgdGhlIGxheWVycyB0aGlzIG5vZGUgaXMgb24uIChUT0RPOiBBcyBvZiB5ZXQgbm8gZnVuY3Rpb25hbGl0eSlcclxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGNhcHR1cmVzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI210eFdvcmxkSW52ZXJzZVVwZGF0ZWQ6IG51bWJlcjtcclxuICAgICNtdHhXb3JsZEludmVyc2U6IE1hdHJpeDR4NDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGEgbmFtZSBhbmQgaW5pdGlhbGl6ZXMgYWxsIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG11dGF0b3ItbGlrZSBwYXRoIHN0cmluZyB0byBnZXQgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyIG9yIG51bGwgaWYgbm8gcGF0aCBpcyBmb3VuZCBlLmcuOlxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogXCJub2RlL3BhcmVudC9jaGlsZHJlbi8xL2NvbXBvbmVudHMvQ29tcG9uZW50U2tlbGV0b24vMFwiXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVRIX0ZST01fVE8oX2Zyb206IE5vZGUgfCBDb21wb25lbnQsIF90bzogTm9kZSB8IENvbXBvbmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICBjb25zdCBmcm9tOiBOb2RlID0gX2Zyb20gaW5zdGFuY2VvZiBDb21wb25lbnQgPyBfZnJvbS5ub2RlIDogX2Zyb207XHJcbiAgICAgIGNvbnN0IHRvOiBOb2RlID0gX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50ID8gX3RvLm5vZGUgOiBfdG87XHJcbiAgICAgIGlmICghZnJvbSB8fCAhdG8pXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBmaW5kIHBhdGhzIHRvIGxvd2VzdCBjb21tb24gYW5jZXN0b3JcclxuICAgICAgbGV0IHBhdGhGcm9tOiBOb2RlW10gPSBmcm9tLmdldFBhdGgoKTtcclxuICAgICAgbGV0IHBhdGhUbzogTm9kZVtdID0gdG8uZ2V0UGF0aCgpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBudWxsO1xyXG4gICAgICB3aGlsZSAocGF0aEZyb20ubGVuZ3RoICYmIHBhdGhUby5sZW5ndGggJiYgcGF0aEZyb21bMF0gPT0gcGF0aFRvWzBdKSB7XHJcbiAgICAgICAgYW5jZXN0b3IgPSBwYXRoRnJvbS5zaGlmdCgpO1xyXG4gICAgICAgIHBhdGhUby5zaGlmdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhdGhUby51bnNoaWZ0KGFuY2VzdG9yKTtcclxuXHJcbiAgICAgIGlmICghYW5jZXN0b3IpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBsZXQgcGF0aFRvQW5jZXN0b3I6IHN0cmluZ1tdID0gcGF0aEZyb20ubWFwKF9ub2RlID0+IFwicGFyZW50XCIpOyAvLyBUT0RPOiB1c2UgXCJrZXlvZiBOb2RlXCIgYXMgdHlwZVxyXG4gICAgICBsZXQgcGF0aEZyb21BbmNlc3Rvcjogc3RyaW5nW10gPSBwYXRoVG9cclxuICAgICAgICAuZmxhdE1hcCgoX25vZGUsIF9pbmRleCwgX2FycmF5KSA9PiBbXCJjaGlsZHJlblwiLCBfbm9kZS5maW5kQ2hpbGQoX2FycmF5W19pbmRleCArIDFdKS50b1N0cmluZygpXSlcclxuICAgICAgICAuc2xpY2UoMCwgLTIpO1xyXG5cclxuICAgICAgaWYgKF9mcm9tIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhUb0FuY2VzdG9yLnVuc2hpZnQoXCJub2RlXCIpO1xyXG4gICAgICBpZiAoX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhGcm9tQW5jZXN0b3IucHVzaChcImNvbXBvbmVudHNcIiwgX3RvLnR5cGUsIHRvLmNvbXBvbmVudHNbX3RvLnR5cGVdLmluZGV4T2YoX3RvKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIHJldHVybiBwYXRoVG9BbmNlc3Rvci5jb25jYXQocGF0aEZyb21BbmNlc3Rvcikuam9pbihcIi9cIik7IC8vIFRPRE86IG9yIG1heWJlIHZhbGlkYXRlIHRoaXMgc3RyaW5nIHdpdGggbm9kZSBhbmQgY29tcG9uZW50IG9iamVjdHM/XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBOb2RlfSBvciB7QGxpbmsgQ29tcG9uZW50fSBmb3VuZCBhdCB0aGUgZ2l2ZW4gcGF0aCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBGSU5EPFQgPSBOb2RlIHwgQ29tcG9uZW50PihfZnJvbTogTm9kZSB8IENvbXBvbmVudCwgX3BhdGg6IHN0cmluZyk6IFQge1xyXG4gICAgICBpZiAoX3BhdGggPT0gXCJcIilcclxuICAgICAgICByZXR1cm4gPFQ+X2Zyb207XHJcblxyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBfcGF0aC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGxldCB0bzogR2VuZXJhbCA9IF9mcm9tO1xyXG5cclxuICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoICYmIHRvKVxyXG4gICAgICAgIHRvID0gUmVmbGVjdC5nZXQodG8sIHBhdGguc2hpZnQoKSk7XHJcblxyXG4gICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhpcyBub2RlcyB7QGxpbmsgQ29tcG9uZW50VHJhbnNmb3JtfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNtcFRyYW5zZm9ybSgpOiBDb21wb25lbnRUcmFuc2Zvcm0ge1xyXG4gICAgICByZXR1cm4gPENvbXBvbmVudFRyYW5zZm9ybT50aGlzLmdldENvbXBvbmVudHMoQ29tcG9uZW50VHJhbnNmb3JtKT8uWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhlIGxvY2FsIHtAbGluayBNYXRyaXg0eDR9IGF0dGFjaGVkIHRvIHRoaXMgbm9kZXMge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gIFxyXG4gICAgICogRmFpbHMgaWYgbm8ge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gaXMgYXR0YWNoZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhMb2NhbCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy5jbXBUcmFuc2Zvcm0/Lm10eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGRJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZEludmVyc2VVcGRhdGVkICE9IHRoaXMudGltZXN0YW1wVXBkYXRlKVxyXG4gICAgICAgIHRoaXMuI210eFdvcmxkSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG5cclxuICAgICAgdGhpcy4jbXR4V29ybGRJbnZlcnNlVXBkYXRlZCA9IHRoaXMudGltZXN0YW1wVXBkYXRlO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGF0dGFjaGVkIHRvIHRoaXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBuQ2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBub2RlIGFuZCBhbGwgZGVjZW5kYW50cyBpbiB0aGUgZ3JhcGggYmVsb3cgZm9yIGl0ZXJhdGlvblxyXG4gICAgICogSW5hY3RpdmUgbm9kZXMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIGNhbiBiZSBmaWx0ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgKiBnZXRJdGVyYXRvcihfYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgaWYgKCFfYWN0aXZlIHx8IHRoaXMuaXNBY3RpdmUpIHtcclxuICAgICAgICB5aWVsZCB0aGlzO1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXHJcbiAgICAgICAgICB5aWVsZCogY2hpbGQuZ2V0SXRlcmF0b3IoX2FjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGJlbG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlcmF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoaXMgbm9kZS4gSW5hY3RpdmUgbm9kZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSByZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IF9vbjtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBTY2VuZXRyZWVcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGVzIHBhcmVudCBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJlbnQoKTogTm9kZSB8IG51bGwge1xyXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjZXMgYmFjayB0aGUgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZSBhbmQgcmV0dXJucyB0aGUgZmlyc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuY2VzdG9yKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKGFuY2VzdG9yLmdldFBhcmVudCgpKVxyXG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCk7XHJcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNlcyB0aGUgaGllcmFyY2h5IHVwd2FyZHMgdG8gdGhlIGZpcnN0IGFuY2VzdG9yIGFuZCByZXR1cm5zIHRoZSBwYXRoIHRocm91Z2ggdGhlIGdyYXBoIHRvIHRoaXMgbm9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBOb2RlW10ge1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICBsZXQgcGF0aDogTm9kZVtdID0gW3RoaXNdO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgcGF0aC51bnNoaWZ0KGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpO1xyXG4gICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgY2hpbGQgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZChfaW5kZXg6IG51bWJlcik6IE5vZGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZHJlbigpOiBOb2RlW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zbGljZSgwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byBjaGlsZG5vZGVzIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWU6IHN0cmluZyk6IE5vZGVbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogTm9kZVtdID0gW107XHJcbiAgICAgIGZvdW5kID0gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKF9ub2RlOiBOb2RlKSA9PiBfbm9kZS5uYW1lID09IF9uYW1lKTtcclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2ltcGx5IGNhbGxzIHtAbGluayBhZGRDaGlsZH0uIFRoaXMgcmVmZXJlbmNlIGlzIGhlcmUgc29sZWx5IGJlY2F1c2UgYXBwZW5kQ2hpbGQgaXMgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIGluIERPTS5cclxuICAgICAqIFNlZSBhbmQgcHJlZmVyYWJseSB1c2Uge0BsaW5rIGFkZENoaWxkfVxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcGVuZENoaWxkOiAoX2NoaWxkOiBOb2RlKSA9PiB2b2lkID0gdGhpcy5hZGRDaGlsZDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYSBub2RlIHRvIHRoZSBsaXN0IG9mIGNoaWxkcmVuLCBpZiBub3QgYWxyZWFkeSBpblxyXG4gICAgICogQHRocm93cyBFcnJvciB3aGVuIHRyeWluZyB0byBhZGQgYW4gYW5jZXN0b3Igb2YgdGhpcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENoaWxkKF9jaGlsZDogTm9kZSk6IHZvaWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhIG5vZGUgdG8gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gYXQgdGhlIGdpdmVuIGluZGV4LiBJZiBpdCBpcyBhbHJlYWR5IGEgY2hpbGQsIGl0IGlzIG1vdmVkIHRvIHRoZSBuZXcgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleDogbnVtYmVyKTogdm9pZDtcclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5pbmNsdWRlcyhfY2hpbGQpICYmIF9pbmRleCA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLy8gX25vZGUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXNcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgaW5BdWRpb0dyYXBoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBncmFwaExpc3RlbmVkOiBOb2RlID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IpIHtcclxuICAgICAgICBhbmNlc3Rvci50aW1lc3RhbXBVcGRhdGUgPSAwO1xyXG4gICAgICAgIGluQXVkaW9HcmFwaCA9IGluQXVkaW9HcmFwaCB8fCAoYW5jZXN0b3IgPT0gZ3JhcGhMaXN0ZW5lZCk7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9yID09IF9jaGlsZClcclxuICAgICAgICAgIHRocm93IChuZXcgRXJyb3IoXCJDeWNsaWMgcmVmZXJlbmNlIHByb2hpYml0ZWQgaW4gbm9kZSBoaWVyYXJjaHksIGFuY2VzdG9ycyBtdXN0IG5vdCBiZSBhZGRlZCBhcyBjaGlsZHJlblwiKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcmV2aW91c1BhcmVudDogTm9kZSA9IF9jaGlsZC5wYXJlbnQ7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudCA9PSB0aGlzICYmIF9pbmRleCA+IHByZXZpb3VzUGFyZW50LmZpbmRDaGlsZChfY2hpbGQpKVxyXG4gICAgICAgIF9pbmRleC0tO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzUGFyZW50KVxyXG4gICAgICAgIHByZXZpb3VzUGFyZW50LnJlbW92ZUNoaWxkKF9jaGlsZCk7XHJcblxyXG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShfaW5kZXggPz8gdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIF9jaGlsZCk7XHJcbiAgICAgIF9jaGlsZC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICBfY2hpbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAoaW5BdWRpb0dyYXBoKVxyXG4gICAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGdpdmUgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDaGlsZChfY2hpbGQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfY2hpbGQpO1xyXG4gICAgICBpZiAoZm91bmQgPCAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIF9jaGlsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DSElMRF9SRU1PVkUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICAgIGlmICh0aGlzLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSkpXHJcbiAgICAgICAgX2NoaWxkLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUpKTtcclxuICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZm91bmQsIDEpO1xyXG4gICAgICBfY2hpbGQucGFyZW50ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUFsbENoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9yIC0xIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZENoaWxkKF9zZWFyY2g6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5pbmRleE9mKF9zZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBub2RlIHdpdGggYW5vdGhlciwgcHJlc2VydmluZyB0aGUgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDaGlsZChfcmVwbGFjZTogTm9kZSwgX3dpdGg6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfcmVwbGFjZSk7XHJcbiAgICAgIGlmIChmb3VuZCA8IDApXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgX3dpdGguZ2V0UGFyZW50KCk/LnJlbW92ZUNoaWxkKF93aXRoKTtcclxuICAgICAgdGhpcy5yZW1vdmVDaGlsZChfcmVwbGFjZSk7XHJcblxyXG4gICAgICB0aGlzLmFkZENoaWxkKF93aXRoLCBmb3VuZCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGltZXN0YW1wIG1hdGNoZXMgdGhlIGxhc3QgdXBkYXRlIHRpbWVzdGFtcCB0aGlzIG5vZGUgdW5kZXJ3ZW50LCBlbHNlIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1VwZGF0ZWQoX3RpbWVzdGFtcFVwZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAodGhpcy50aW1lc3RhbXBVcGRhdGUgPT0gX3RpbWVzdGFtcFVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGdpdmVuIG5vZGUsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGVsc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRGVzY2VuZGFudE9mKF9hbmNlc3RvcjogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgbm9kZTogTm9kZSA9IHRoaXM7XHJcbiAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT0gX2FuY2VzdG9yKVxyXG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcclxuICAgICAgcmV0dXJuIChub2RlICE9IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhIE11dGF0b3IgZnJvbSB7QGxpbmsgQW5pbWF0aW9ufSB0byBhbGwgaXRzIGNvbXBvbmVudHMgYW5kIHRyYW5zZmVycyBpdCB0byBpdHMgY2hpbGRyZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUFuaW1hdGlvbihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBpZiAoXCJjb21wb25lbnRzXCIgaW4gX211dGF0b3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudFR5cGUgaW4gX211dGF0b3IuY29tcG9uZW50cykge1xyXG4gICAgICAgICAgbGV0IGNvbXBvbmVudHNPZlR5cGU6IENvbXBvbmVudFtdID0gdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudFR5cGVdOyAvLyBUT0RPOiBhZGQgZXJyb3JzIGlmIG5vZGUgZG9lc24ndCBjb250YWluIHByb3BlcnR5XHJcbiAgICAgICAgICBsZXQgbXV0YXRvcnNGb3JUeXBlOiBNdXRhdG9yW10gPSBfbXV0YXRvci5jb21wb25lbnRzW2NvbXBvbmVudFR5cGVdO1xyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudHNPZlR5cGUgIT0gdW5kZWZpbmVkICYmIG11dGF0b3JzRm9yVHlwZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIG11dGF0b3JzRm9yVHlwZSkge1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudHNPZlR5cGVbaV0ubXV0YXRlKG11dGF0b3JzRm9yVHlwZVtpXSwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChcImNoaWxkcmVuXCIgaW4gX211dGF0b3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTmFtZSBpbiBfbXV0YXRvci5jaGlsZHJlbikge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgdGhpcy5nZXRDaGlsZHJlbkJ5TmFtZShjaGlsZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNoaWxkTm9kZS5hcHBseUFuaW1hdGlvbihfbXV0YXRvci5jaGlsZHJlbltjaGlsZE5hbWVdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIENvbXBvbmVudHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gdGhpcyBub2RlLCBpbmRlcGVuZGVudCBvZiB0eXBlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFsbENvbXBvbmVudHMoKTogQ29tcG9uZW50W10ge1xyXG4gICAgICBsZXQgYWxsOiBDb21wb25lbnRbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuY29tcG9uZW50cykge1xyXG4gICAgICAgIGFsbCA9IGFsbC5jb25jYXQodGhpcy5jb21wb25lbnRzW3R5cGVdKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRvIHRoaXMgbm9kZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRzPFQgZXh0ZW5kcyBDb21wb25lbnQ+KF9jbGFzczogbmV3ICgpID0+IFQpOiBUW10ge1xyXG4gICAgICByZXR1cm4gPFRbXT4odGhpcy5jb21wb25lbnRzW19jbGFzcy5uYW1lXSB8fCBbXSkuc2xpY2UoMCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNvbXBvbnRlbnQgZm91bmQgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRoaXMgbm9kZSBvciBudWxsLCBpZiBsaXN0IGlzIGVtcHR5IG9yIGRvZXNuJ3QgZXhpc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXBvbmVudDxUIGV4dGVuZHMgQ29tcG9uZW50PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCBsaXN0OiBUW10gPSA8VFtdPnRoaXMuY29tcG9uZW50c1tfY2xhc3MubmFtZV07XHJcbiAgICAgIGlmIChsaXN0KVxyXG4gICAgICAgIHJldHVybiBsaXN0WzBdO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGFjaCB0aGUgZ2l2ZW4gY29tcG9uZW50IHRvIHRoaXMgbm9kZS4gSWRlbnRpY2FsIHRvIHtAbGluayBhZGRDb21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdHRhY2goX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWRkQ29tcG9uZW50KF9jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgdG8gdGhpcyBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDb21wb25lbnQoX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfY29tcG9uZW50Lm5vZGUgPT0gdGhpcylcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGxldCBjbXBMaXN0OiBDb21wb25lbnRbXSA9IHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdO1xyXG4gICAgICBpZiAoY21wTGlzdCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdID0gW19jb21wb25lbnRdO1xyXG4gICAgICBlbHNlIGlmIChjbXBMaXN0Lmxlbmd0aCAmJiBfY29tcG9uZW50LmlzU2luZ2xldG9uKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7X2NvbXBvbmVudC50eXBlfSBpcyBtYXJrZWQgc2luZ2xldG9uIGFuZCBjYW4ndCBiZSBhdHRhY2hlZCwgbm8gbW9yZSB0aGFuIG9uZSBhbGxvd2VkYCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjbXBMaXN0LnB1c2goX2NvbXBvbmVudCk7XHJcblxyXG4gICAgICBfY29tcG9uZW50LmF0dGFjaFRvTm9kZSh0aGlzKTtcclxuICAgICAgX2NvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DT01QT05FTlRfQUREKSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuQ09NUE9ORU5UX0FERCwgeyBkZXRhaWw6IF9jb21wb25lbnQgfSkpOyAvLyBUT0RPOiBzZWUgaWYgdGhpcyBpcyBiZSBmZWFzYWJsZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgZnJvbSB0aGlzIG5vZGUuIElkZW50aWNhbCB0byB7QGxpbmsgcmVtb3ZlQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGV0YWNoKF9jb21wb25lbnQ6IENvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIGNsYXNzIGF0dGFjaGVkIHRvIHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNvbXBvbmVudHMoX2NsYXNzOiBuZXcgKCkgPT4gQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2V0Q29tcG9uZW50cyhfY2xhc3MpLmZvckVhY2goX2NvbXBvbmVudCA9PiB0aGlzLnJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29tcG9uZW50IGZyb20gdGhlIG5vZGUsIGlmIGl0IHdhcyBhdHRhY2hlZCwgYW5kIHNldHMgaXRzIHBhcmVudCB0byBudWxsLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNvbXBvbmVudChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgY29tcG9uZW50c09mVHlwZTogQ29tcG9uZW50W10gPSB0aGlzLmNvbXBvbmVudHNbX2NvbXBvbmVudC50eXBlXTtcclxuICAgICAgICBsZXQgZm91bmRBdDogbnVtYmVyID0gY29tcG9uZW50c09mVHlwZS5pbmRleE9mKF9jb21wb25lbnQpO1xyXG4gICAgICAgIGlmIChmb3VuZEF0IDwgMClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBfY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUpKTtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnRUb1RhcmdldE9ubHkobmV3IEN1c3RvbUV2ZW50KEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHsgZGV0YWlsOiBfY29tcG9uZW50IH0pKTsgLy8gVE9ETzogc2VlIGlmIHRoaXMgd291bGQgYmUgZmVhc2FibGVcclxuICAgICAgICBjb21wb25lbnRzT2ZUeXBlLnNwbGljZShmb3VuZEF0LCAxKTtcclxuICAgICAgICBfY29tcG9uZW50LmF0dGFjaFRvTm9kZShudWxsKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVtb3ZlIGNvbXBvbmVudCAnJHtfY29tcG9uZW50fSdpbiBub2RlIG5hbWVkICcke3RoaXMubmFtZX0nYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIFNlcmlhbGl6YXRpb25cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuYWN0aXZlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsZXQgY29tcG9uZW50czogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuY29tcG9uZW50cykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoID09IDApXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29tcG9uZW50c1t0eXBlXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHNbdHlwZV0pIHtcclxuICAgICAgICAgIC8vIGNvbXBvbmVudHNbdHlwZV0ucHVzaChjb21wb25lbnQuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgY29tcG9uZW50c1t0eXBlXS5wdXNoKFNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzZXJpYWxpemF0aW9uW1wiY29tcG9uZW50c1wiXSA9IGNvbXBvbmVudHM7XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChTZXJpYWxpemVyLnNlcmlhbGl6ZShjaGlsZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bXCJjaGlsZHJlblwiXSA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX1NFUklBTElaRUQpKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdGhpcy5wYXJlbnQgPSBpcyBzZXQgd2hlbiB0aGUgbm9kZXMgYXJlIGFkZGVkXHJcblxyXG4gICAgICAvLyBkZXNlcmlhbGl6ZSBjb21wb25lbnRzIGZpcnN0IHNvIHNjcmlwdHMgY2FuIHJlYWN0IHRvIGNoaWxkcmVuIGJlaW5nIGFwcGVuZGVkXHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gX3NlcmlhbGl6YXRpb24uY29tcG9uZW50cykge1xyXG4gICAgICAgIGZvciAobGV0IHNlcmlhbGl6ZWRDb21wb25lbnQgb2YgX3NlcmlhbGl6YXRpb24uY29tcG9uZW50c1t0eXBlXSkge1xyXG4gICAgICAgICAgbGV0IGRlc2VyaWFsaXplZENvbXBvbmVudDogQ29tcG9uZW50ID0gPENvbXBvbmVudD5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRDb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoZGVzZXJpYWxpemVkQ29tcG9uZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5jaGlsZHJlbilcclxuICAgICAgICBmb3IgKGxldCBzZXJpYWxpemVkQ2hpbGQgb2YgX3NlcmlhbGl6YXRpb24uY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGxldCBkZXNlcmlhbGl6ZWRDaGlsZDogTm9kZSA9IDxOb2RlPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZENoaWxkKTtcclxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZGVzZXJpYWxpemVkQ2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQpKTtcclxuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCkpO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgaWYgdGhpcyBpcyBhIGdvb2QgaWRlYVxyXG4gICAgICAvLyBjb25zdCBobmRHcmFwaERlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAvLyAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgeyBidWJibGVzOiBmYWxzZSB9KSk7XHJcbiAgICAgIC8vICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgLy8gfTtcclxuICAgICAgLy8gdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVELCBobmRHcmFwaERlc2VyaWFsaXplZCwgdHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlKF9zZXJpYWxpemF0aW9uLmFjdGl2ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyBhcyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9IaWVyYXJjaHlTdHJpbmcoX25vZGU6IE5vZGUgPSBudWxsLCBfbGV2ZWw6IG51bWJlciA9IDApOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiByZWZhY3RvciBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XHJcbiAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgX25vZGUgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gXCIrXCIucmVwZWF0KF9sZXZlbCk7XHJcblxyXG4gICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSBwcmVmaXggKyBcIiBcIiArIF9ub2RlLm5hbWUgKyBcIiB8IFwiO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIF9ub2RlLmNvbXBvbmVudHMpXHJcbiAgICAgICAgb3V0cHV0ICs9IF9ub2RlLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoICsgXCIgXCIgKyB0eXBlLnNwbGl0KFwiQ29tcG9uZW50XCIpLnBvcCgpICsgXCIsIFwiO1xyXG4gICAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMCwgLTIpICsgXCI8L2JyPlwiO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgIG91dHB1dCArPSB0aGlzLnRvSGllcmFyY2h5U3RyaW5nKGNoaWxkLCBfbGV2ZWwgKyAxKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNyZWdpb24gRXZlbnRzXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUuIFRoZSBnaXZlbiBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBtYXRjaGluZyBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5vZGUuXHJcbiAgICAgKiBEZXZpYXRpbmcgZnJvbSB0aGUgc3RhbmRhcmQgRXZlbnRUYXJnZXQsIGhlcmUgdGhlIF9oYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiBhbmQgX2NhcHR1cmUgaXMgdGhlIG9ubHkgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogRVZFTlQgfCBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX2NhcHR1cmU6IGJvb2xlYW4gLyp8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKi8gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGlzdExpc3RlbmVyczogTWFwRXZlbnRUeXBlVG9MaXN0ZW5lciA9IF9jYXB0dXJlID8gdGhpcy5jYXB0dXJlcyA6IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICBpZiAoIWxpc3RMaXN0ZW5lcnNbX3R5cGVdKVxyXG4gICAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdID0gW107XHJcbiAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdLnB1c2goX2hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIG5vZGUuIFRoZSBzaWduYXR1cmUgbXVzdCBtYXRjaCB0aGUgb25lIHVzZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBFVkVOVCB8IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfY2FwdHVyZTogYm9vbGVhbiAvKnwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMqLyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBsaXN0ZW5lcnNGb3JUeXBlOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gX2NhcHR1cmUgPyB0aGlzLmNhcHR1cmVzW190eXBlXSA6IHRoaXMubGlzdGVuZXJzW190eXBlXTtcclxuICAgICAgaWYgKGxpc3RlbmVyc0ZvclR5cGUpXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGlzdGVuZXJzRm9yVHlwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JUeXBlW2ldID09IF9oYW5kbGVyKVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNGb3JUeXBlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZSAoc3RhbmRhcmQ6IHJldHVybiB0cnVlIG9ubHkgaWYgZWl0aGVyIGV2ZW50J3MgY2FuY2VsYWJsZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZmFsc2Ugb3IgaXRzIHByZXZlbnREZWZhdWx0KCkgbWV0aG9kIHdhcyBub3QgaW52b2tlZClcclxuICAgICAqIFRoZSBldmVudCB0cmF2ZWxzIGludG8gdGhlIGhpZXJhcmNoeSB0byB0aGlzIG5vZGUgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50LCBpbnZva2luZyBtYXRjaGluZyBoYW5kbGVycyBvZiB0aGUgbm9kZXMgYW5jZXN0b3JzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZSwgXHJcbiAgICAgKiB0aGFuIHRoZSBtYXRjaGluZyBoYW5kbGVyIG9mIHRoZSB0YXJnZXQgbm9kZSBpbiB0aGUgdGFyZ2V0IHBoYXNlLCBhbmQgYmFjayBvdXQgb2YgdGhlIGhpZXJhcmNoeSBpbiB0aGUgYnViYmxpbmcgcGhhc2UsIGludm9raW5nIGFwcHJvcHJpYXRlIGhhbmRsZXJzIG9mIHRoZSBhbnZlc3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgYW5jZXN0b3JzOiBOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHVwY29taW5nOiBOb2RlID0gdGhpcztcclxuICAgICAgLy8gb3ZlcndyaXRlIGV2ZW50IHRhcmdldFxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcInRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgUmVmbGVjdCBpbnN0ZWFkIG9mIE9iamVjdCB0aHJvdWdob3V0LiBTZWUgYWxzbyBSZW5kZXIgYW5kIE11dGFibGUuLi5cclxuICAgICAgd2hpbGUgKHVwY29taW5nLnBhcmVudClcclxuICAgICAgICBhbmNlc3RvcnMucHVzaCh1cGNvbWluZyA9IHVwY29taW5nLnBhcmVudCk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwicGF0aFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEFycmF5PE5vZGU+KHRoaXMsIC4uLmFuY2VzdG9ycykgfSk7XHJcblxyXG4gICAgICAvLyBjYXB0dXJlIHBoYXNlXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQ0FQVFVSSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBhbmNlc3RvcnNbaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJjdXJyZW50VGFyZ2V0XCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhbmNlc3RvciB9KTtcclxuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMoYW5jZXN0b3IuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0YXJnZXQgcGhhc2VcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJldmVudFBoYXNlXCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBFdmVudC5BVF9UQVJHRVQgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKHRoaXMuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmNhbGxMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKCFfZXZlbnQuYnViYmxlcylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGJ1YmJsZSBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkJVQkJMSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gYW5jZXN0b3JzW2ldO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYW5jZXN0b3IgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKGFuY2VzdG9yLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7IC8vVE9ETzogcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSwgc2VlIGRvY3VtZW50YXRpb24gb2YgZGlzcGF0Y2ggZXZlbnRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQgd2l0aG91dCB0cmF2ZWxsaW5nIHRocm91Z2ggdGhlIGdyYXBoIGhpZXJhcmNoeSBuZWl0aGVyIGR1cmluZyBjYXB0dXJlIG5vciBidWJibGluZyBwaGFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShfZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQVRfVEFSR0VUIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImN1cnJlbnRUYXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuY2FsbExpc3RlbmVycyh0aGlzLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7IC8vIFRPRE86IGV4YW1pbmUgaWYgdGhpcyBzaG91bGQgZ28gdG8gdGhlIGNhcHR1cmVzIGluc3RlYWQgb2YgdGhlIGxpc3RlbmVyc1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIHN5bnRoZXRpYyBldmVudCB0byB0aGlzIG5vZGUgYW5kIGZyb20gdGhlcmUgdG8gYWxsIG5vZGVzIGRlZXBlciBpbiB0aGUgaGllcmFyY2h5LFxyXG4gICAgICogaW52b2tpbmcgbWF0Y2hpbmcgaGFuZGxlcnMgb2YgdGhlIG5vZGVzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZS4gV2F0Y2ggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBub2RlcyBpbnZvbHZlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnJvYWRjYXN0RXZlbnQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAvLyBvdmVyd3JpdGUgZXZlbnQgdGFyZ2V0IGFuZCBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkNBUFRVUklOR19QSEFTRSB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJ0YXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJyb2FkY2FzdEV2ZW50UmVjdXJzaXZlKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgLy8gY2FwdHVyZSBwaGFzZSBvbmx5XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgbGV0IGNhcHR1cmVzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gdGhpcy5jYXB0dXJlc1tfZXZlbnQudHlwZV07XHJcbiAgICAgIGlmIChjYXB0dXJlcykge1xyXG4gICAgICAgIGNhcHR1cmVzID0gWy4uLmNhcHR1cmVzXTsgLy8gY3JlYXRlIGEgY29weSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGhhbmRsZXJzIHRoYXQgZGV0YWNoIHRoZW1zZWx2ZXNcclxuICAgICAgICBmb3IgKGxldCBoYW5kbGVyIG9mIGNhcHR1cmVzKVxyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgaGFuZGxlcihfZXZlbnQpO1xyXG4gICAgICAgIC8vIGFwcGVhcnMgdG8gYmUgc2xvd2VyLCBhc3RvbmlzaGluZ2x5Li4uXHJcbiAgICAgICAgLy8gY2FwdHVyZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICAvLyAgICAgaGFuZGxlcihfZXZlbnQpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzYW1lIGZvciBjaGlsZHJlblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGQuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsbExpc3RlbmVycyhfbGlzdGVuZXJzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdLCBfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfbGlzdGVuZXJzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgX2xpc3RlbmVycylcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RyYW5zZmVyL1NlcmlhbGl6ZXIudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVHJhbnNmZXIvTXV0YWJsZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqIFxyXG4gICAqIFN1cGVyY2xhc3MgZm9yIGFsbCB7QGxpbmsgQ29tcG9uZW50fXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8ge0BsaW5rIE5vZGV9cy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMCB8IEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBHaXptbyB7XHJcbiAgICAvKiogc3ViY2xhc3NlcyBnZXQgYSBpU3ViY2xhc3MgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlcjtcclxuICAgIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIENvbXBvbmVudCA9IENvbXBvbmVudDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIENvbXBvbmVudFtdID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgYWN0aXZlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICNub2RlOiBOb2RlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCAoX2V2ZW50OiBDdXN0b21FdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLiNub2RlKSB7XHJcbiAgICAgICAgICAvLyBUT0RPOiBmaW5kIHRoZSBudW1iZXIgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGUgYXJyYXkgaWYgbm90IHNpbmdsZXRvblxyXG4gICAgICAgICAgX2V2ZW50LmRldGFpbC5jb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBfZXZlbnQuZGV0YWlsLmNvbXBvbmVudEluZGV4ID0gdGhpcy5ub2RlLmdldENvbXBvbmVudHModGhpcy5jb25zdHJ1Y3RvcikuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgIHRoaXMuI25vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJjbGFzczogdHlwZW9mIENvbXBvbmVudCk6IG51bWJlciB7IHJldHVybiBDb21wb25lbnQuc3ViY2xhc3Nlcy5wdXNoKF9zdWJjbGFzcykgLSAxOyB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdHJ1ZSwgd2hlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzIGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc1NpbmdsZXRvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBub2RlLCB0aGlzIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBub2RlKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSB0aGlzIGNvbXBvbmVudC4gSW5hY3RpdmUgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWN0aXZhdGUoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gX29uO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KF9vbiA/IEVWRU5ULkNPTVBPTkVOVF9BQ1RJVkFURSA6IEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmllcyB0byBhdHRhY2ggdGhlIGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gbm9kZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbm9kZSBpdCB3YXMgYXR0YWNoZWQgdG8gaWYgYXBwbGljYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoVG9Ob2RlKF9jb250YWluZXI6IE5vZGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNub2RlID09IF9jb250YWluZXIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcHJldmlvdXNDb250YWluZXI6IE5vZGUgPSB0aGlzLiNub2RlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChwcmV2aW91c0NvbnRhaW5lcilcclxuICAgICAgICAgIHByZXZpb3VzQ29udGFpbmVyLnJlbW92ZUNvbXBvbmVudCh0aGlzKTtcclxuICAgICAgICB0aGlzLiNub2RlID0gX2NvbnRhaW5lcjtcclxuICAgICAgICBpZiAodGhpcy4jbm9kZSlcclxuICAgICAgICAgIHRoaXMuI25vZGUuYWRkQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aGlzLiNub2RlID0gcHJldmlvdXNDb250YWluZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBmb3IgdGhpcyBjb21wb25lbnQgaW5zaWRlIHRoZSBlZGl0b3JzIHJlbmRlciB2aWV3LiBVc2Uge0BsaW5rIEdpem1vc30gaW5zaWRlIHRoZSBvdmVycmlkZSB0byBkcmF3IHN0dWZmLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcz8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIGRyYXdHaXptb3N9LiBPbmx5IGRpc3BsYXllZCB3aGlsZSB0aGUgY29ycmVzcG9uZGluZyBub2RlIGlzIHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkPyhfY21wQ2FtZXJhPzogQ29tcG9uZW50Q2FtZXJhKTogdm9pZDtcclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShfc2VyaWFsaXphdGlvbi5hY3RpdmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hY3RpdmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUoX211dGF0b3IuYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2luZ2xldG9uO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubXR4V29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogV3JhcHMgYSByZWd1bGFyIEphdmFzY3JpcHQgQXJyYXkgYW5kIG9mZmVycyB2ZXJ5IGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBnZWFyZWQgc29sZWx5IHRvd2FyZHMgYXZvaWRpbmcgZ2FyYmFnZSBjb2xsZXRpb24uXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVjeWNsZXJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVjeWNhYmxlQXJyYXk8VD4ge1xyXG4gICAgI2xlbmd0aDogbnVtYmVyID0gMDtcclxuICAgICNhcnJheTogQXJyYXk8VD4gPSBuZXcgQXJyYXk8VD4oKTtcclxuICAgIC8vICN0eXBlOiBuZXcgKCkgPT4gVDtcclxuXHJcbiAgICAvLyAvL3RzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcclxuICAgIC8vIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSB7XHJcbiAgICAvLyAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlydHVhbCBsZW5ndGggb2YgdGhlIGFycmF5IHRvIHplcm8gYnV0IGtlZXBzIHRoZSBlbnRyaWVzIGJleW9uZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNsZW5ndGggPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZSB0aGlzIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGEgbmV3IGVudHJ5IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCBhbmQgcmV0dXJucyB0aGUgbmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwdXNoKF9lbnRyeTogVCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aF0gPSBfZW50cnk7XHJcbiAgICAgIHRoaXMuI2xlbmd0aCsrO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgbGFzdCBlbnRyeSBmcm9tIHRoZSBhcnJheSBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvcCgpOiBUIHtcclxuICAgICAgdGhpcy4jbGVuZ3RoLS07XHJcbiAgICAgIHJldHVybiB0aGlzLiNhcnJheVt0aGlzLiNsZW5ndGhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb2xsb3dpbmcgdGhlIGxhc3QgaW4gdGhlIGFycmF5IGFuZCBpbmNyZWFzZXMgdGhlIGFycmF5IGxlbmd0aFxyXG4gICAgICogSXQgbXVzdCBiZSBhc3N1cmVkLCB0aGF0IG5vbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5IGlzIHN0aWxsIGluIGFueSB1c2Ugb2YgYW55IGtpbmQhXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyByZWN5Y2xlKCk6IFQge1xyXG4gICAgLy8gICBpZiAodGhpcy4jbGVuZ3RoIDwgdGhpcy4jYXJyYXkubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgdGhpcy4jbGVuZ3RoKys7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aCsrXTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLiNhcnJheS5wdXNoKFJlY3ljbGVyLmdldCh0aGlzLiN0eXBlKSk7XHJcbiAgICAvLyAgIHJldHVybiB0aGlzLiNhcnJheVt0aGlzLiNsZW5ndGgrK107XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuI2xlbmd0aDsgaSsrKVxyXG4gICAgICAgIHlpZWxkIHRoaXMuI2FycmF5W2ldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGFycmF5IHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBhcmUgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNvcnRlZChfc29ydDogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IFRbXSB7XHJcbiAgICAgIGxldCBzb3J0ZWQ6IFRbXSA9IHRoaXMuI2FycmF5LnNsaWNlKDAsIHRoaXMuI2xlbmd0aCk7XHJcbiAgICAgIHNvcnRlZC5zb3J0KF9zb3J0KTtcclxuICAgICAgcmV0dXJuIHNvcnRlZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIHtAbGluayBSZW5kZXJJbmplY3RvckNvYXR9IGFuZCB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciB3aXRoIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBnaXZlbiBpbmplY3Rvci4gTmFtZSBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RvciBtZXRob2QgbXVzdCBtYXRjaC5cclxuICAgICAqIFVzZWQgaW4gc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGluamVjdChfY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBfaW5qZWN0b3I6IHR5cGVvZiBSZW5kZXJJbmplY3Rvcik6IHZvaWQge1xyXG4gICAgICBsZXQgaW5qZWN0aW9uOiBGdW5jdGlvbiA9IFJlZmxlY3QuZ2V0KF9pbmplY3RvciwgXCJpbmplY3RcIiArIF9jb25zdHJ1Y3Rvci5uYW1lKTtcclxuICAgICAgaWYgKCFpbmplY3Rpb24pIHtcclxuICAgICAgICBEZWJ1Zy5lcnJvcihcIk5vIGluamVjdGlvbiBkZWNvcmF0b3IgZGVmaW5lZCBmb3IgXCIgKyBfY29uc3RydWN0b3IubmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyRGF0YVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IGluamVjdGlvblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBTaGFkZXJ9XHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yU2hhZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiB7QGxpbmsgU2hhZGVyfS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJ1c2VQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIudXNlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJkZWxldGVQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIuZGVsZXRlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3RvciwgXCJjcmVhdGVQcm9ncmFtXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXIuY3JlYXRlUHJvZ3JhbVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIHByb2dyYW0gdG8gdXNlIGFzIHRoZSBhY3RpdmUgcHJvZ3JhbSBpbiBXZWJHTFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucHJvZ3JhbSlcclxuICAgICAgICB0aGlzLmNyZWF0ZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhpcyBwcm9ncmFtIGZyb20gV2ViR0wsIGNsZWFyaW5nIHRoZSB1c2VkIG1lbW9yeSBvbiB0aGUgR1BVLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgaWYgKHRoaXMucHJvZ3JhbSkge1xyXG4gICAgICAgIGNyYzMuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudW5pZm9ybXM7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvZ3JhbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiQ3JlYXRlIHNoYWRlciBwcm9ncmFtXCIsIHRoaXMubmFtZSk7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBsZXQgcHJvZ3JhbTogV2ViR0xQcm9ncmFtID0gY3JjMy5jcmVhdGVQcm9ncmFtKCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBzaGRWZXJ0ZXg6IFdlYkdMU2hhZGVyID0gY29tcGlsZVNoYWRlcih0aGlzLmdldFZlcnRleFNoYWRlclNvdXJjZSgpLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlZFUlRFWF9TSEFERVIpO1xyXG4gICAgICAgIGxldCBzaGRGcmFnbWVudDogV2ViR0xTaGFkZXIgPSBjb21waWxlU2hhZGVyKHRoaXMuZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFHTUVOVF9TSEFERVIpO1xyXG5cclxuICAgICAgICBjcmMzLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xTaGFkZXI+KHNoZFZlcnRleCkpO1xyXG4gICAgICAgIGNyYzMuYXR0YWNoU2hhZGVyKHByb2dyYW0sIFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFNoYWRlcj4oc2hkRnJhZ21lbnQpKTtcclxuICAgICAgICBjcmMzLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IFJlbmRlcldlYkdMLmFzc2VydDxzdHJpbmc+KGNyYzMuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xyXG4gICAgICAgIGlmIChlcnJvciAhPT0gXCJcIikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgbGlua2luZyBTaGFkZXI6IFwiICsgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBkZXRlY3RBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IGRldGVjdFVuaWZvcm1zKCk7XHJcblxyXG4gICAgICAgIGxldCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkxJR0hUUy5OQU1FKTtcclxuICAgICAgICBpZiAoYmxvY2tJbmRleCAhPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LklOVkFMSURfSU5ERVgpXHJcbiAgICAgICAgICBjcmMzLnVuaWZvcm1CbG9ja0JpbmRpbmcocHJvZ3JhbSwgYmxvY2tJbmRleCwgVU5JRk9STV9CTE9DS1MuTElHSFRTLkJJTkRJTkcpO1xyXG5cclxuICAgICAgICBibG9ja0luZGV4ID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5TS0lOLk5BTUUpO1xyXG4gICAgICAgIGlmIChibG9ja0luZGV4ICE9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5WQUxJRF9JTkRFWClcclxuICAgICAgICAgIGNyYzMudW5pZm9ybUJsb2NrQmluZGluZyhwcm9ncmFtLCBibG9ja0luZGV4LCBVTklGT1JNX0JMT0NLUy5TS0lOLkJJTkRJTkcpO1xyXG5cclxuICAgICAgICBibG9ja0luZGV4ID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5GT0cuTkFNRSk7XHJcbiAgICAgICAgaWYgKGJsb2NrSW5kZXggIT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5JTlZBTElEX0lOREVYKVxyXG4gICAgICAgICAgY3JjMy51bmlmb3JtQmxvY2tCaW5kaW5nKHByb2dyYW0sIGJsb2NrSW5kZXgsIFVOSUZPUk1fQkxPQ0tTLkZPRy5CSU5ESU5HKTtcclxuXHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIoX3NoYWRlckNvZGU6IHN0cmluZywgX3NoYWRlclR5cGU6IEdMZW51bSk6IFdlYkdMU2hhZGVyIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHdlYkdMU2hhZGVyOiBXZWJHTFNoYWRlciA9IGNyYzMuY3JlYXRlU2hhZGVyKF9zaGFkZXJUeXBlKTtcclxuICAgICAgICBjcmMzLnNoYWRlclNvdXJjZSh3ZWJHTFNoYWRlciwgX3NoYWRlckNvZGUpO1xyXG4gICAgICAgIGNyYzMuY29tcGlsZVNoYWRlcih3ZWJHTFNoYWRlcik7XHJcbiAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8c3RyaW5nPihjcmMzLmdldFNoYWRlckluZm9Mb2cod2ViR0xTaGFkZXIpKTtcclxuICAgICAgICBpZiAoZXJyb3IgIT09IFwiXCIpIHtcclxuICAgICAgICAgIERlYnVnLmxvZyhfc2hhZGVyQ29kZSk7XHJcblxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29tcGlsaW5nIHNoYWRlcjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhbnkgY29tcGlsYXRpb24gZXJyb3JzLlxyXG4gICAgICAgIGlmICghY3JjMy5nZXRTaGFkZXJQYXJhbWV0ZXIod2ViR0xTaGFkZXIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09NUElMRV9TVEFUVVMpKSB7XHJcbiAgICAgICAgICBhbGVydChjcmMzLmdldFNoYWRlckluZm9Mb2cod2ViR0xTaGFkZXIpKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd2ViR0xTaGFkZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRldGVjdEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH0ge1xyXG4gICAgICAgIGxldCBkZXRlY3RlZEF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUNvdW50OiBudW1iZXIgPSBjcmMzLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BQ1RJVkVfQVRUUklCVVRFUyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50OyBpKyspIHtcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVJbmZvOiBXZWJHTEFjdGl2ZUluZm8gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xBY3RpdmVJbmZvPihjcmMzLmdldEFjdGl2ZUF0dHJpYihwcm9ncmFtLCBpKSk7XHJcbiAgICAgICAgICBpZiAoIWF0dHJpYnV0ZUluZm8pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZGV0ZWN0ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZm8ubmFtZV0gPSBjcmMzLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGF0dHJpYnV0ZUluZm8ubmFtZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGV0ZWN0ZWRBdHRyaWJ1dGVzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZXRlY3RVbmlmb3JtcygpOiB7IFtuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB9IHtcclxuICAgICAgICBsZXQgZGV0ZWN0ZWRVbmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfSA9IHt9O1xyXG4gICAgICAgIGxldCB1bmlmb3JtQ291bnQ6IG51bWJlciA9IGNyYzMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFDVElWRV9VTklGT1JNUyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHVuaWZvcm1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgaW5mbzogV2ViR0xBY3RpdmVJbmZvID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQWN0aXZlSW5mbz4oY3JjMy5nZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGkpKTtcclxuICAgICAgICAgIGlmICghaW5mbykge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24gPSBjcmMzLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBpbmZvLm5hbWUpO1xyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uKVxyXG4gICAgICAgICAgICBkZXRlY3RlZFVuaWZvcm1zW2luZm8ubmFtZV0gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xVbmlmb3JtTG9jYXRpb24+KGxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRldGVjdGVkVW5pZm9ybXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBDb2F0fVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvckNvYXQgZXh0ZW5kcyBSZW5kZXJJbmplY3RvciB7XHJcbiAgICAvKipcclxuICAgICAqIEluamVjdHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBjbGFzcyBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4ge0BsaW5rIENvYXR9LXN1YmNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbiwgX2NvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3Rvci5pbmplY3QoX2NvbnN0cnVjdG9yLCBSZW5kZXJJbmplY3RvckNvYXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdENvbG9yZWQodGhpczogQ29hdENvbG9yZWQsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gX3NoYWRlci51bmlmb3Jtc1tcInVfdmN0Q29sb3JcIl07XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5QUk9EVUNUKHRoaXMuY29sb3IsIF9jbXBNYXRlcmlhbC5jbHJQcmltYXJ5KTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm00ZnYodW5pZm9ybSwgY29sb3IuZ2V0KCkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0UmVtaXNzaXZlKHRoaXM6IENvYXRSZW1pc3NpdmUsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRDb2xvcmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfZkRpZmZ1c2VcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5kaWZmdXNlKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZNZXRhbGxpY1wiXTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm0xZih1bmlmb3JtLCB0aGlzLm1ldGFsbGljKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZTcGVjdWxhclwiXTtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm0xZih1bmlmb3JtLCB0aGlzLnNwZWN1bGFyKTtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZJbnRlbnNpdHlcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5pbnRlbnNpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFRleHR1cmVkKHRoaXM6IENvYXRUZXh0dXJlZCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdENvbG9yZWQuY2FsbCh0aGlzLCBfc2hhZGVyLCBfY21wTWF0ZXJpYWwpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZS51c2VSZW5kZXJEYXRhKFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5JTkRFWCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDNmdihfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhQaXZvdFwiXSwgZmFsc2UsIF9jbXBNYXRlcmlhbC5tdHhQaXZvdC5nZXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0UmVtaXNzaXZlVGV4dHVyZWQodGhpczogQ29hdFJlbWlzc2l2ZVRleHR1cmVkLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4UGl2b3RcIl0sIGZhbHNlLCBfY21wTWF0ZXJpYWwubXR4UGl2b3QuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyh0aGlzOiBDb2F0UmVtaXNzaXZlVGV4dHVyZWROb3JtYWxzLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlVGV4dHVyZWQuY2FsbCh0aGlzLCBfc2hhZGVyLCBfY21wTWF0ZXJpYWwpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIHRoaXMubm9ybWFsTWFwLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5OT1JNQUwuVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5OT1JNQUwuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uTk9STUFMLklOREVYKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUb29uKHRoaXM6IENvYXRUb29uLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0UmVtaXNzaXZlLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleFRvb24udXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLlRPT04uVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLlRPT04uSU5ERVgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFRvb25UZXh0dXJlZCh0aGlzOiBDb2F0VG9vbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleFRvb24udXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLlRPT04uVU5JVCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLlRPT04uSU5ERVgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBNZXNofSBpbnRvIGEgV2ViR0wgQnVmZmVyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yTWVzaCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBNZXNofS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyQnVmZmVyc1wiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yTWVzaC51c2VSZW5kZXJCdWZmZXJzXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRSZW5kZXJCdWZmZXJzXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JNZXNoLmdldFJlbmRlckJ1ZmZlcnNcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckJ1ZmZlcnNcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3Rvck1lc2guZGVsZXRlUmVuZGVyQnVmZmVyc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldFJlbmRlckJ1ZmZlcnModGhpczogTWVzaCk6IFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzID0ge1xyXG4gICAgICAgICAgdmVydGljZXM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnZlcnRpY2VzKSxcclxuICAgICAgICAgIGluZGljZXM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guaW5kaWNlcyksXHJcbiAgICAgICAgICBub3JtYWxzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5ub3JtYWxzKSxcclxuICAgICAgICAgIHRleHR1cmVVVnM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnRleHR1cmVVVnMpLFxyXG4gICAgICAgICAgY29sb3JzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5jb2xvcnMpLFxyXG4gICAgICAgICAgdGFuZ2VudHM6IGNyZWF0ZUJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkFSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLnRhbmdlbnRzKSxcclxuICAgICAgICAgIG5JbmRpY2VzOiB0aGlzLnJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGhcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLmJvbmVzKVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMuYm9uZXMgPSBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC5ib25lcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlck1lc2gud2VpZ2h0cylcclxuICAgICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzLndlaWdodHMgPSBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC53ZWlnaHRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyKF90eXBlOiBHTGVudW0sIF9hcnJheTogRmxvYXQzMkFycmF5IHwgVWludDE2QXJyYXkgfCBVaW50OEFycmF5KTogV2ViR0xCdWZmZXIge1xyXG4gICAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xCdWZmZXI+KGNyYzMuY3JlYXRlQnVmZmVyKCkpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlcihfdHlwZSwgYnVmZmVyKTtcclxuICAgICAgICBjcmMzLmJ1ZmZlckRhdGEoX3R5cGUsIF9hcnJheSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEFUSUNfRFJBVyk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdXNlUmVuZGVyQnVmZmVycyh0aGlzOiBNZXNoLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCwgX210eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCwgX2lkPzogbnVtYmVyKTogUmVuZGVyQnVmZmVycyB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBsZXQgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IHRoaXMuZ2V0UmVuZGVyQnVmZmVycygpO1xyXG5cclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1ZpZXdcIl07XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDRmdih1bmlmb3JtLCBmYWxzZSwgX210eE1lc2hUb1ZpZXcuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1dvcmxkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9tdHhNZXNoVG9Xb3JsZC5nZXQoKSk7XHJcblxyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4Tm9ybWFsTWVzaFRvV29ybGRcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKSB7XHJcbiAgICAgICAgbGV0IG5vcm1hbE1hdHJpeDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlRSQU5TUE9TRShNYXRyaXg0eDQuSU5WRVJTRShfbXR4TWVzaFRvV29ybGQpKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIG5vcm1hbE1hdHJpeC5nZXQoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGZlZWQgaW4gYW4gaWQgb2YgdGhlIG5vZGUgaWYgc2hhZGVyIGFjY2VwdHMgdV9pZC4gVXNlZCBmb3IgcGlja2luZ1xyXG4gICAgICB1bmlmb3JtID0gX3NoYWRlci51bmlmb3Jtc1tcInVfaWRcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKVxyXG4gICAgICAgIGNyYzMudW5pZm9ybTFpKHVuaWZvcm0sIF9pZCk7XHJcblxyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdFBvc2l0aW9uXCIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMsIDMpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdENvbG9yXCIsIHJlbmRlckJ1ZmZlcnMuY29sb3JzLCA0KTtcclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RUZXh0dXJlXCIsIHJlbmRlckJ1ZmZlcnMudGV4dHVyZVVWcywgMik7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0Tm9ybWFsXCIsIHJlbmRlckJ1ZmZlcnMubm9ybWFscywgMyk7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0VGFuZ2VudFwiLCByZW5kZXJCdWZmZXJzLnRhbmdlbnRzLCA0KTtcclxuXHJcbiAgICAgIGNvbnN0IGFCb25lOiBudW1iZXIgPSBfc2hhZGVyLmF0dHJpYnV0ZXNbXCJhX3ZjdEJvbmVzXCJdO1xyXG4gICAgICBpZiAoYUJvbmUpIHtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHJlbmRlckJ1ZmZlcnMuYm9uZXMpO1xyXG4gICAgICAgIGNyYzMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYUJvbmUpO1xyXG4gICAgICAgIGNyYzMudmVydGV4QXR0cmliSVBvaW50ZXIoYUJvbmUsIDQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSwgMCwgMCk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RXZWlnaHRzXCIsIHJlbmRlckJ1ZmZlcnMud2VpZ2h0cywgNCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgcmVuZGVyQnVmZmVycy5pbmRpY2VzKTtcclxuXHJcbiAgICAgIHJldHVybiByZW5kZXJCdWZmZXJzO1xyXG5cclxuICAgICAgZnVuY3Rpb24gc2V0QXR0cmlidXRlQnVmZmVyKF9uYW1lOiBzdHJpbmcsIF9idWZmZXI6IFdlYkdMQnVmZmVyLCBfc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW19uYW1lXTtcclxuICAgICAgICBpZiAoYXR0cmlidXRlID09IHVuZGVmaW5lZClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIF9idWZmZXIpO1xyXG4gICAgICAgIGNyYzMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmlidXRlKTtcclxuICAgICAgICBjcmMzLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlLCBfc2l6ZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GTE9BVCwgZmFsc2UsIDAsIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJCdWZmZXJzKF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAoX3JlbmRlckJ1ZmZlcnMpIHtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIG51bGwpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgICAgICBPYmplY3QudmFsdWVzKF9yZW5kZXJCdWZmZXJzKS5maWx0ZXIoX2J1ZmZlciA9PiBfYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXIpLmZvckVhY2goKF9idWZmZXIsIF9pbmRleCkgPT4ge1xyXG4gICAgICAgICAgY3JjMy5kZWxldGVCdWZmZXIoX2J1ZmZlcik7XHJcbiAgICAgICAgICBjcmMzLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShfaW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBuYW1lc3BhY2UgUGFydGljbGVEYXRhIHtcclxuXHJcbiAgICBleHBvcnQgZW51bSBGVU5DVElPTiB7XHJcbiAgICAgIC8vIFZBTFVFID0gXCJ2YWx1ZVwiLFxyXG4gICAgICBBRERJVElPTiA9IFwiYWRkaXRpb25cIixcclxuICAgICAgU1VCVFJBQ1RJT04gPSBcInN1YnRyYWN0aW9uXCIsXHJcbiAgICAgIE1VTFRJUExJQ0FUSU9OID0gXCJtdWx0aXBsaWNhdGlvblwiLFxyXG4gICAgICBESVZJU0lPTiA9IFwiZGl2aXNpb25cIixcclxuICAgICAgTU9EVUxPID0gXCJtb2R1bG9cIixcclxuICAgICAgUE9XRVIgPSBcInBvd2VyXCIsXHJcbiAgICAgIFBPTFlOT01JQUwzID0gXCJwb2x5bm9taWFsM1wiLFxyXG4gICAgICBTUVVBUkVfUk9PVCA9IFwic3F1YXJlUm9vdFwiLFxyXG4gICAgICBSQU5ET00gPSBcInJhbmRvbVwiLFxyXG4gICAgICBSQU5ET01fUkFOR0UgPSBcInJhbmRvbVJhbmdlXCJcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY29uc3QgRlVOQ1RJT05fTUlOSU1VTV9QQVJBTUVURVJTOiB7IFtrZXkgaW4gUGFydGljbGVEYXRhLkZVTkNUSU9OXTogbnVtYmVyIH0gPSB7XHJcbiAgICAgIC8vIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uVkFMVUVdOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLkFERElUSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5TVUJUUkFDVElPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTVVMVElQTElDQVRJT05dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLkRJVklTSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5NT0RVTE9dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPV0VSXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5QT0xZTk9NSUFMM106IDUsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1FVQVJFX1JPT1RdOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV06IDAsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUkFORE9NX1JBTkdFXTogMlxyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnQgY29uc3QgUFJFREVGSU5FRF9WQVJJQUJMRVM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgIHN5c3RlbUR1cmF0aW9uOiBcInVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb25cIixcclxuICAgICAgc3lzdGVtU2l6ZTogXCJ1X2ZQYXJ0aWNsZVN5c3RlbVNpemVcIixcclxuICAgICAgc3lzdGVtVGltZTogXCJ1X2ZQYXJ0aWNsZVN5c3RlbVRpbWVcIixcclxuICAgICAgcGFydGljbGVJZDogXCJmUGFydGljbGVJZFwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGlsZXMgcGFydGljbGUgc3lzdGVtIHNoYWRlcnMgKHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0pIGZyb20gc2hhZGVyIHVuaXZlcnNhbCBkZXJpdmF0ZXMgZm9yIFdlYkdMXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0gZXh0ZW5kcyBSZW5kZXJJbmplY3RvclNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZVTkNUSU9OUzogeyBba2V5IGluIFBhcnRpY2xlRGF0YS5GVU5DVElPTl06IEZ1bmN0aW9uIH0gPSB7XHJcbiAgICAgIC8vIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uVkFMVUVdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIC8vICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVyc1swXX0pYDtcclxuICAgICAgLy8gfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5BRERJVElPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICsgJHtfdmFsdWV9YCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1VCVFJBQ1RJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVycy5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfdmFsdWU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfSAtICR7X3ZhbHVlfWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1VTFRJUExJQ0FUSU9OXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn0gKiAke192YWx1ZX1gKX0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5ESVZJU0lPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzWzBdfSAvICR7X3BhcmFtZXRlcnNbMV19KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTU9EVUxPXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGBtb2QoJHtfYWNjdW11bGF0b3J9LCAke192YWx1ZX0pYCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9XRVJdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGBwb3coJHtfcGFyYW1ldGVyc1swXX0sICR7X3BhcmFtZXRlcnNbMV19KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9MWU5PTUlBTDNdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgbGV0IHg6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzBdO1xyXG4gICAgICAgIGxldCBhOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1sxXTtcclxuICAgICAgICBsZXQgYjogc3RyaW5nID0gX3BhcmFtZXRlcnNbMl07XHJcbiAgICAgICAgbGV0IGM6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzNdO1xyXG4gICAgICAgIGxldCBkOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1s0XTtcclxuICAgICAgICByZXR1cm4gYCgke2F9ICogcG93KCR7eH0sIDMuMCkgKyAke2J9ICogcG93KCR7eH0sIDIuMCkgKyAke2N9ICogJHt4fSArICR7ZH0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5TUVVBUkVfUk9PVF06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBsZXQgeDogc3RyaW5nID0gX3BhcmFtZXRlcnNbMF07XHJcbiAgICAgICAgcmV0dXJuIGBzcXJ0KCR7eH0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGBmZXRjaFJhbmRvbU51bWJlcigkeyhSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLnJhbmRvbU51bWJlckluZGV4T2Zmc2V0KyspLnRvRml4ZWQoMCl9LCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZSwgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aClgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV9SQU5HRV06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke1JlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TW1wicmFuZG9tXCJdKCl9ICogKCR7X3BhcmFtZXRlcnNbMV19IC0gJHtfcGFyYW1ldGVyc1swXX0pICsgJHtfcGFyYW1ldGVyc1swXX0pYDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyByYW5kb21OdW1iZXJJbmRleE9mZnNldDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuZGVjb3JhdGUoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgX2NvbnRleHQpO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRWZXJ0ZXhTaGFkZXJTb3VyY2VcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdldFZlcnRleFNoYWRlclNvdXJjZVxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2VcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdldEZyYWdtZW50U2hhZGVyU291cmNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHZlcnRleCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS52ZXJ0ZXhTaGFkZXJTb3VyY2V9LlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSh0aGlzOiBTaGFkZXJQYXJ0aWNsZVN5c3RlbSk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBkYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtID0gdGhpcy5kYXRhO1xyXG4gICAgICBsZXQgbXR4TG9jYWw6IFBhcnRpY2xlRGF0YS5UcmFuc2Zvcm1hdGlvbltdID0gZGF0YT8ubXR4TG9jYWw7XHJcbiAgICAgIGxldCBtdHhXb3JsZDogUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW10gPSBkYXRhPy5tdHhXb3JsZDtcclxuXHJcbiAgICAgIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmFuZG9tTnVtYmVySW5kZXhPZmZzZXQgPSAwO1xyXG5cclxuICAgICAgbGV0IHNvdXJjZTogc3RyaW5nID0gdGhpcy52ZXJ0ZXhTaGFkZXJTb3VyY2VcclxuICAgICAgICAucmVwbGFjZShcIiN2ZXJzaW9uIDMwMCBlc1wiLCBgI3ZlcnNpb24gMzAwIGVzXFxuI2RlZmluZSAke3RoaXMuZGVmaW5lWzBdfSR7ZGF0YS5jb2xvciA/IFwiXFxuI2RlZmluZSBQQVJUSUNMRV9DT0xPUlwiIDogXCJcIn1gKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokdmFyaWFibGVzKi9cIiwgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZVZhcmlhYmxlcyhkYXRhPy52YXJpYWJsZXMsIGRhdGE/LnZhcmlhYmxlTmFtZXMpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eExvY2FsLCBcIkxvY2FsXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBtdHhMb2NhbCAmJiBtdHhMb2NhbC5sZW5ndGggPiAwID8gXCIqIG10eExvY2FsXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eFdvcmxkLCBcIldvcmxkXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBtdHhXb3JsZCAmJiBtdHhXb3JsZC5sZW5ndGggPiAwID8gXCJtdHhXb3JsZCAqXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKFwiLyokY29sb3IqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlQ29sb3IoZGF0YT8uY29sb3IpKTtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBmcmFnbWVudCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5mcmFnbWVudFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UodGhpczogU2hhZGVyUGFydGljbGVTeXN0ZW0pOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlclNvdXJjZS5yZXBsYWNlKFwiI3ZlcnNpb24gMzAwIGVzXCIsIGAjdmVyc2lvbiAzMDAgZXNcXG4jZGVmaW5lICR7dGhpcy5kZWZpbmVbMF19JHt0aGlzLmRhdGEuY29sb3IgPyBcIlxcbiNkZWZpbmUgUEFSVElDTEVfQ09MT1JcIiA6IFwiXCJ9YClcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gY29kZSBnZW5lcmF0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVWYXJpYWJsZXMoX3ZhcmlhYmxlczogUGFydGljbGVEYXRhLlN5c3RlbVtcInZhcmlhYmxlc1wiXSwgX3ZhcmlhYmxlTmFtZXM6IFBhcnRpY2xlRGF0YS5TeXN0ZW1bXCJ2YXJpYWJsZU5hbWVzXCJdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfdmFyaWFibGVzKSByZXR1cm4gXCJcIjtcclxuXHJcbiAgICAgIHJldHVybiBfdmFyaWFibGVzXHJcbiAgICAgICAgLm1hcCgoX3ZhcmlhYmxlLCBfaW5kZXgpID0+ICh7IG5hbWU6IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfdmFyaWFibGVOYW1lc1tfaW5kZXhdLCB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhcmlhYmxlKSB9KSlcclxuICAgICAgICAubWFwKF92YXJpYWJsZSA9PiBgZmxvYXQgJHtfdmFyaWFibGUubmFtZX0gPSAke192YXJpYWJsZS52YWx1ZX07YClcclxuICAgICAgICAucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX2NvZGU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfVxcbiR7X2NvZGV9YCwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUcmFuc2Zvcm1hdGlvbnMoX3RyYW5zZm9ybWF0aW9uczogUGFydGljbGVEYXRhLlN5c3RlbVtcIm10eExvY2FsXCJdLCBfbG9jYWxPcldvcmxkOiBcIkxvY2FsXCIgfCBcIldvcmxkXCIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAoIV90cmFuc2Zvcm1hdGlvbnMgfHwgX3RyYW5zZm9ybWF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgICBsZXQgdHJhbnNmb3JtYXRpb25zOiBbUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW1widHJhbnNmb3JtYXRpb25cIl0sIHN0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBfdHJhbnNmb3JtYXRpb25zXHJcbiAgICAgICAgLm1hcChfZGF0YSA9PiB7XHJcbiAgICAgICAgICBsZXQgaXNTY2FsZTogYm9vbGVhbiA9IF9kYXRhLnRyYW5zZm9ybWF0aW9uID09PSBcInNjYWxlXCI7XHJcbiAgICAgICAgICBsZXQgW3gsIHksIHpdID0gW19kYXRhLnBhcmFtZXRlcnNbMF0sIF9kYXRhLnBhcmFtZXRlcnNbMV0sIF9kYXRhLnBhcmFtZXRlcnNbMl1dXHJcbiAgICAgICAgICAgIC5tYXAoKF92YWx1ZSkgPT4gX3ZhbHVlID8gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhbHVlKSA6IChpc1NjYWxlID8gXCIxLjBcIiA6IFwiMC4wXCIpKSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFtfZGF0YS50cmFuc2Zvcm1hdGlvbiwgeCwgeSwgel07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgY29kZSArPSB0cmFuc2Zvcm1hdGlvbnNcclxuICAgICAgICAubWFwKChbX3RyYW5zZm9ybWF0aW9uLCBfeCwgX3ksIF96XSwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCByb3RhdGVJZDogc3RyaW5nID0gX2luZGV4ICsgX2xvY2FsT3JXb3JsZDtcclxuICAgICAgICAgIGlmIChfdHJhbnNmb3JtYXRpb24gPT0gXCJyb3RhdGVcIikge1xyXG4gICAgICAgICAgICBsZXQgdG9SYWRpYW5zOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyA9IChfdmFsdWU6IHN0cmluZykgPT4gYCR7X3ZhbHVlfSAqICR7Q2FsYy5kZWcycmFkfWA7XHJcbiAgICAgICAgICAgIHJldHVybiBgZmxvYXQgZlhSYWRpYW5zJHtyb3RhdGVJZH0gPSAke3RvUmFkaWFucyhfeCl9O1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZZUmFkaWFucyR7cm90YXRlSWR9ID0gJHt0b1JhZGlhbnMoX3kpfTtcclxuICAgICAgICAgICAgICBmbG9hdCBmWlJhZGlhbnMke3JvdGF0ZUlkfSA9ICR7dG9SYWRpYW5zKF96KX07XHJcbiAgICAgICAgICAgICAgZmxvYXQgZlNpblgke3JvdGF0ZUlkfSA9IHNpbihmWFJhZGlhbnMke3JvdGF0ZUlkfSk7XHJcbiAgICAgICAgICAgICAgZmxvYXQgZkNvc1gke3JvdGF0ZUlkfSA9IGNvcyhmWFJhZGlhbnMke3JvdGF0ZUlkfSk7IFxyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5ZJHtyb3RhdGVJZH0gPSBzaW4oZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NZJHtyb3RhdGVJZH0gPSBjb3MoZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5aJHtyb3RhdGVJZH0gPSBzaW4oZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NaJHtyb3RhdGVJZH0gPSBjb3MoZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xcbmA7XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKChfdHJhbnNmb3JtYXRpb246IHN0cmluZykgPT4gX3RyYW5zZm9ybWF0aW9uICE9IFwiXCIpXHJcbiAgICAgICAgLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF9jb2RlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn1cXG4ke19jb2RlfWAsIFwiXCIpO1xyXG4gICAgICBjb2RlICs9IFwiXFxuXCI7XHJcblxyXG4gICAgICBjb2RlICs9IGBtYXQ0IG10eCR7X2xvY2FsT3JXb3JsZH0gPSBgO1xyXG4gICAgICBjb2RlICs9IHRyYW5zZm9ybWF0aW9uc1xyXG4gICAgICAgIC5tYXAoKFtfdHJhbnNmb3JtYXRpb24sIF94LCBfeSwgX3pdLCBfaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGV0IHJvdGF0ZUlkOiBzdHJpbmcgPSBfaW5kZXggKyBfbG9jYWxPcldvcmxkO1xyXG4gICAgICAgICAgc3dpdGNoIChfdHJhbnNmb3JtYXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcInRyYW5zbGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjAsXHJcbiAgICAgICAgICAgICAgMC4wLCAxLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCxcclxuICAgICAgICAgICAgICAke194fSwgJHtfeX0sICR7X3p9LCAxLjApYDtcclxuICAgICAgICAgICAgY2FzZSBcInJvdGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICBmQ29zWiR7cm90YXRlSWR9ICogZkNvc1kke3JvdGF0ZUlkfSwgZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NZJHtyb3RhdGVJZH0sIC1mU2luWSR7cm90YXRlSWR9LCAwLjAsXHJcbiAgICAgICAgICAgICAgZkNvc1oke3JvdGF0ZUlkfSAqIGZTaW5ZJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9IC0gZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSArIGZDb3NaJHtyb3RhdGVJZH0gKiBmQ29zWCR7cm90YXRlSWR9LCBmQ29zWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgMC4wLFxyXG4gICAgICAgICAgICAgIGZDb3NaJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZkNvc1gke3JvdGF0ZUlkfSArIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9LCBmU2luWiR7cm90YXRlSWR9ICogZlNpblkke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0gLSBmQ29zWiR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgZkNvc1kke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIDAuMCxcclxuICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAxLjBcclxuICAgICAgICAgICAgICApYDtcclxuICAgICAgICAgICAgY2FzZSBcInNjYWxlXCI6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGBtYXQ0KFxyXG4gICAgICAgICAgICAgICR7X3h9LCAwLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgJHtfeX0sIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAke196fSwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxyXG4gICAgICAgICAgICAgIClgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X3RyYW5zZm9ybWF0aW9ufVwiIGlzIG5vdCBhIHRyYW5zZm9ybWF0aW9uYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfY29kZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogXFxuJHtfY29kZX1gKTtcclxuICAgICAgY29kZSArPSBcIjtcXG5cIjtcclxuXHJcbiAgICAgIHJldHVybiBjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQ29sb3IoX2NvbG9yOiBQYXJ0aWNsZURhdGEuRXhwcmVzc2lvbltdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfY29sb3IpIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgbGV0IHJnYmE6IHN0cmluZyA9IFtfY29sb3JbMF0sIF9jb2xvclsxXSwgX2NvbG9yWzJdLCBfY29sb3JbM11dXHJcbiAgICAgICAgLm1hcCgoX3ZhbHVlKTogc3RyaW5nID0+IF92YWx1ZSA/IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2VuZXJhdGVFeHByZXNzaW9uKF92YWx1ZSkgOiBcIjEuMFwiKVxyXG4gICAgICAgIC5qb2luKFwiLCBcIik7XHJcblxyXG4gICAgICByZXR1cm4gYHZlYzQoJHtyZ2JhfSk7YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUV4cHJlc3Npb24oX2V4cHJlc3Npb246IFBhcnRpY2xlRGF0YS5FeHByZXNzaW9uKTogc3RyaW5nIHtcclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0Z1bmN0aW9uKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIF9leHByZXNzaW9uLnBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlRXhwcmVzc2lvbihwYXJhbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUZ1bmN0aW9uKF9leHByZXNzaW9uLmZ1bmN0aW9uLCBwYXJhbWV0ZXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc1ZhcmlhYmxlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIHJldHVybiBQYXJ0aWNsZURhdGEuUFJFREVGSU5FRF9WQVJJQUJMRVNbX2V4cHJlc3Npb24udmFsdWVdIHx8IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfZXhwcmVzc2lvbi52YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0NvbnN0YW50KF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gX2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JHt2YWx1ZS5pbmNsdWRlcyhcIi5cIikgPyBcIlwiIDogXCIuMFwifWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChQYXJ0aWNsZURhdGEuaXNDb2RlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBjb2RlOiBzdHJpbmcgPSBfZXhwcmVzc2lvbi5jb2RlXHJcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxiW2EtekEtel0rXFx3Kig/IVxcKClcXGIvZywgKF9tYXRjaCkgPT4gUGFydGljbGVEYXRhLlBSRURFRklORURfVkFSSUFCTEVTW19tYXRjaF0gfHwgXCJmUGFydGljbGVTeXN0ZW1WYXJpYWJsZV9cIiArIF9tYXRjaClcclxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8oPzwhXFwuKVxcYlxcZCtcXGIoPyFcXC4pL2csIChfbWF0Y2gpID0+IF9tYXRjaCArIFwiLjBcIik7XHJcbiAgICAgICAgY29kZSA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmVwbGFjZUZ1bmN0aW9ucyhjb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBpbnZhbGlkIG5vZGUgc3RydWN0dXJlIGluIHBhcnRpY2xlIHN5c3RlbSBzZXJpYWxpemF0aW9uYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUZ1bmN0aW9uKF9mdW5jdGlvbjogUGFydGljbGVEYXRhLkZVTkNUSU9OLCBfcGFyYW1ldGVyczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICBpZiAoX3BhcmFtZXRlcnMubGVuZ3RoIDwgUGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dKVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIG5lZWRzIGF0IGxlYXN0ICR7UGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dfSBwYXJhbWV0ZXJzYDtcclxuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoUGFydGljbGVEYXRhLkZVTkNUSU9OKS5pbmNsdWRlcyhfZnVuY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tfZnVuY3Rpb25dKF9wYXJhbWV0ZXJzKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIGlzIG5vdCBhbiBvcGVyYXRpb25gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlcGxhY2VGdW5jdGlvbnMoX2NvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBmdW5jdGlvblJlZ2V4OiBSZWdFeHAgPSAvXFxiW2EtekEtel9dK1xcdypcXCgvZztcclxuICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXk7XHJcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBmdW5jdGlvblJlZ2V4LmV4ZWMoX2NvZGUpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGZ1bmN0aW9uR2VuZXJhdG9yOiBGdW5jdGlvbiA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TWzxQYXJ0aWNsZURhdGEuRlVOQ1RJT04+bWF0Y2hbMF0uc2xpY2UoMCwgLTEpXTtcclxuICAgICAgICBpZiAoIWZ1bmN0aW9uR2VuZXJhdG9yKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjb21tYUluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgbGV0IG9wZW5CcmFja2V0czogbnVtYmVyID0gMTtcclxuICAgICAgICBsZXQgYXJndW1lbnRzTGFzdEluZGV4OiBudW1iZXIgPSBmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleDtcclxuICAgICAgICB3aGlsZSAob3BlbkJyYWNrZXRzID4gMCkge1xyXG4gICAgICAgICAgc3dpdGNoIChfY29kZVthcmd1bWVudHNMYXN0SW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCIoXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzKys7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIpXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzLS07XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIsXCI6XHJcbiAgICAgICAgICAgICAgaWYgKG9wZW5CcmFja2V0cyA9PSAxKVxyXG4gICAgICAgICAgICAgICAgY29tbWFJbmRpY2VzLnB1c2goYXJndW1lbnRzTGFzdEluZGV4KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ3VtZW50c0xhc3RJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFyZ3M6IHN0cmluZ1tdID1cclxuICAgICAgICAgIFtmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleCAtIDEsIC4uLmNvbW1hSW5kaWNlcywgYXJndW1lbnRzTGFzdEluZGV4IC0gMV0ucmVkdWNlPHN0cmluZ1tdPigoX2FjY3VtdWxhdG9yLCBfcG9zaXRpb24sIF9pbmRleCwgX3Bvc2l0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX2luZGV4ID09IF9wb3NpdGlvbnMubGVuZ3RoIC0gMSA/XHJcbiAgICAgICAgICAgICAgX2FjY3VtdWxhdG9yIDpcclxuICAgICAgICAgICAgICBfYWNjdW11bGF0b3IuY29uY2F0KF9jb2RlLnNsaWNlKF9wb3NpdGlvbiArIDEsIF9wb3NpdGlvbnNbX2luZGV4ICsgMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uUmVnZXgubGFzdEluZGV4ID0gbWF0Y2guaW5kZXg7XHJcbiAgICAgICAgX2NvZGUgPSBgJHtfY29kZS5zbGljZSgwLCBtYXRjaC5pbmRleCl9KCR7ZnVuY3Rpb25HZW5lcmF0b3IoYXJncyl9KSR7X2NvZGUuc2xpY2UoYXJndW1lbnRzTGFzdEluZGV4KX1gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfY29kZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgZm9yIHRoZSBwYXJ0aWNsZSBzeXN0ZW0gKHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0pIGludG8gYSBXZWJHTCBUZXh0dXJlXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBfY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0KTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnVzZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlbGV0ZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1c2VSZW5kZXJEYXRhKHRoaXM6IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJEYXRhKSB7XHJcbiAgICAgICAgLy8gYnVmZmVycyBleGlzdFxyXG4gICAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShURVhUVVJFX0xPQ0FUSU9OLlBBUlRJQ0xFLlVOSVQpOyAvLyBBVFRFTlRJT04hOiBjaGFuZ2luZyB0aGlzIGlkIHJlcXVpcmVzIGNoYW5naW5nIG9mIGNvcnJlc3BvbmRpbmcgaWQgaW4gcGFydGljbGUgcmVuZGVyIG1ldGhvZCwgdXNlIGN0cmwgKyBzaGlmdCArIGYgc2VhcmNoIVxyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlci5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG5cclxuICAgICAgICBsZXQgdGV4dHVyZVNpemU6IG51bWJlciA9IE1hdGguY2VpbChNYXRoLnNxcnQodGhpcy5zaXplKSk7XHJcbiAgICAgICAgdGV4dHVyZVNpemUgPSBNYXRoLm1pbih0ZXh0dXJlU2l6ZSwgY3JjMy5nZXRQYXJhbWV0ZXIoY3JjMy5NQVhfVEVYVFVSRV9TSVpFKSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHVzZSBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYWRkaXRpb25hbGx5IG1heWJlIHVzZSBhIHNlZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWNyZWF0ZSB0aGUgc2FtZSByYW5kb20gbnVtYmVyc1xyXG4gICAgICAgIGxldCByYW5kb21OdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0ZXh0dXJlU2l6ZSAqIHRleHR1cmVTaXplOyBpKyspXHJcbiAgICAgICAgICByYW5kb21OdW1iZXJzLnB1c2goTWF0aC5yYW5kb20oKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SMzJGLCB0ZXh0dXJlU2l6ZSwgdGV4dHVyZVNpemUsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULFxyXG4gICAgICAgICAgICBGbG9hdDMyQXJyYXkuZnJvbShyYW5kb21OdW1iZXJzKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUlOX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUFHX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnVzZVJlbmRlckRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlckRhdGE7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB0aGF0IGNhbiBiZSByZWN5Y2xlZCwgaS5lLiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnkgcmV1c2luZyB0aGUgb2JqZWN0IGluc3RlYWQgb2YgcmVwbGFjaW5nIGl0IHdpdGggYSBuZXcgb25lLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVjeWNhYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb3IgdGhlIG5leHQgcmV1c2UgYnkgc2V0dGluZyBpdHMgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHN0YXRlcy5cclxuICAgICAqL1xyXG4gICAgcmVjeWNsZSgpOiB2b2lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2VlcHMgYSBkZXBvdCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgcmV1c2UsIHNvcnRlZCBieSB0eXBlLiAgXHJcbiAgICogVXNpbmcge0BsaW5rIFJlY3ljbGVyfSByZWR1Y2VzIGxvYWQgb24gdGhlIGNhcmJhZ2UgY29sbGVjdG9yIGFuZCB0aHVzIHN1cHBvcnRzIHNtb290aCBwZXJmb3JtYW5jZS5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWN5Y2xlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBkZXBvdDogeyBbdHlwZTogc3RyaW5nXTogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgZnJvbSB0aGUgZGVwb3QsIGNhbGxzIGl0cyByZWN5Y2xlLW1ldGhvZCBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqIElmIHRoZSBkZXBvdCBmb3IgdGhhdCB0eXBlIGlzIGVtcHR5IGl0IHJldHVybnMgYSBuZXcgb2JqZWN0IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS5cclxuICAgICAqIEBwYXJhbSBfdCBUaGUgY2xhc3MgaWRlbnRpZmllciBvZiB0aGUgZGVzaXJlZCBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8VCBleHRlbmRzIFJlY3ljYWJsZSB8IFJlY3ljYWJsZUFycmF5PFQ+IHwgT2JqZWN0PihfdDogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgbGV0IGtleTogc3RyaW5nID0gX3QubmFtZTtcclxuICAgICAgbGV0IGluc3RhbmNlczogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiA9IFJlY3ljbGVyLmRlcG90W2tleV07XHJcbiAgICAgIGlmIChpbnN0YW5jZXMgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgaW5zdGFuY2U6IFQgPSA8VD5pbnN0YW5jZXMucG9wKCk7XHJcbiAgICAgICAgKDxSZWN5Y2FibGU+aW5zdGFuY2UpLnJlY3ljbGU/LigpO1xyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIG5ldyBfdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGZyb20gdGhlIGRlcG90IGFuZCByZXR1cm5zIGl0LiDimqDvuI8qKkRPRVMgTk9UKiogY2FsbCBpdHMgcmVjeWNsZS1tZXRob2QuXHJcbiAgICAgKiBGYXN0ZXIgdGhhbiB7QGxpbmsgUmVjeWNsZXIuZ2V0fSwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZXVzZTxUIGV4dGVuZHMgT2JqZWN0PihfdDogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgcmV0dXJuIDxUPlJlY3ljbGVyLmRlcG90W190Lm5hbWVdPy5wb3AoKSA/PyBuZXcgX3QoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgb2JqZWN0IGluIHRoZSBkZXBvdCBmb3IgbGF0ZXIgcmVjeWNsaW5nLiBVc2VycyBhcmUgcmVzcG9uc2libGUgZm9yIHRocm93aW5nIGluIG9iamVjdHMgdGhhdCBhcmUgYWJvdXQgdG8gbG9vc2Ugc2NvcGUgYW5kIGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgb3RoZXJcclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZShfaW5zdGFuY2U6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgICAvLyBsZXQga2V5OiBzdHJpbmcgPSBfaW5zdGFuY2UuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgLy8gLy9EZWJ1Zy5sb2coa2V5KTtcclxuICAgICAgLy8gbGV0IGluc3RhbmNlczogUmVjeWNhYmxlQXJyYXk8T2JqZWN0PiA9IFJlY3ljbGVyTmV3LmRlcG90W2tleV0gfHwgbmV3IFJlY3ljYWJsZUFycmF5PE9iamVjdD4oKTtcclxuICAgICAgLy8gaW5zdGFuY2VzLnB1c2goX2luc3RhbmNlKTtcclxuICAgICAgLy8gUmVjeWNsZXJOZXcuZGVwb3Rba2V5XSA9IGluc3RhbmNlcztcclxuICAgICAgLy8gRGVidWcubG9nKGBPYmplY3RNYW5hZ2VyLmRlcG90WyR7a2V5fV06ICR7T2JqZWN0TWFuYWdlci5kZXBvdFtrZXldLmxlbmd0aH1gKTtcclxuICAgICAgLy9EZWJ1Zy5sb2codGhpcy5kZXBvdCk7XHJcbiAgICAgIChSZWN5Y2xlci5kZXBvdFtfaW5zdGFuY2UuY29uc3RydWN0b3IubmFtZV0gPz89IG5ldyBSZWN5Y2FibGVBcnJheTxPYmplY3Q+KCkpLnB1c2goX2luc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgb2JqZWN0cyB1c2luZyB0aGUge0BsaW5rIFJlY3ljbGVyLnN0b3JlfSBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZU11bHRpcGxlKC4uLl9pbnN0YW5jZXM6IE9iamVjdFtdKTogdm9pZCB7IC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyB0aGUgZGVmYXVsdCBzdG9yZSBtZXRob2RcclxuICAgICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBfaW5zdGFuY2VzKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGluc3RhbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtcHR5cyB0aGUgZGVwb3Qgb2YgYSBnaXZlbiB0eXBlLCBsZWF2aW5nIHRoZSBvYmplY3RzIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIE1heSByZXN1bHQgaW4gYSBzaG9ydCBzdGFsbCB3aGVuIG1hbnkgb2JqZWN0cyB3ZXJlIGluXHJcbiAgICAgKiBAcGFyYW0gX3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkdW1wPFQ+KF90OiBuZXcgKCkgPT4gVCk6IHZvaWQge1xyXG4gICAgICBSZWN5Y2xlci5kZXBvdFtfdC5uYW1lXSA9IG5ldyBSZWN5Y2FibGVBcnJheTxPYmplY3Q+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbXB0eXMgYWxsIGRlcG90cywgbGVhdmluZyBhbGwgb2JqZWN0cyB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIE1heSByZXN1bHQgaW4gYSBzaG9ydCBzdGFsbCB3aGVuIG1hbnkgb2JqZWN0cyB3ZXJlIGluXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHVtcEFsbCgpOiB2b2lkIHtcclxuICAgICAgUmVjeWNsZXIuZGVwb3QgPSB7fTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgdHdvZGltZW5zaW9uYWwgdmVjdG9yIGNvbXByaXNlZCBvZiB0aGUgY29tcG9uZW50cyB4IGFuZCB5XHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICAgK3lcclxuICAgKiAgICAgICAgICAgICB8X18gK3hcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBMdWthcyBTY2hldWVybGUsIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFZlY3RvcjIgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTdGF0aWNcclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMigwLCAwKWAuXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzICgwLCAwKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFpFUk8oKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDApO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMihfc2NhbGUsIF9zY2FsZSlgLlxyXG4gICAgICogQHBhcmFtIF9zY2FsZSB0aGUgc2NhbGUgb2YgdGhlIHZlY3Rvci4gRGVmYXVsdDogMVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9ORShfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3NjYWxlLCBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEEgc2hvcnRoYW5kIGZvciB3cml0aW5nIGBuZXcgVmVjdG9yMih4LCAwKWAuXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIFRoZSBudW1iZXIgdG8gd3JpdGUgaW4gdGhlIHggY29vcmRpbmF0ZS4gRGVmYXVsdDogMVxyXG4gICAgICogQHJldHVybnMgQSBuZXcgdmVjdG9yIHdpdGggdGhlIHZhbHVlcyAoX3NjYWxlLCAwKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKDAsIHkpYC5cclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIG51bWJlciB0byB3cml0ZSBpbiB0aGUgeSBjb29yZGluYXRlLiBEZWZhdWx0OiAxXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzICgwLCBfc2NhbGUpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWShfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IyLCBfbXR4VHJhbnNmb3JtOiBNYXRyaXgzeDMsIF9pbmNsdWRlVHJhbnNsYXRpb246IGJvb2xlYW4gPSB0cnVlKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gX210eFRyYW5zZm9ybS5nZXQoKTtcclxuICAgICAgdmVjdG9yLnNldChcclxuICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVszXSAqIF92ZWN0b3IueSxcclxuICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdmVjdG9yLmFkZChfbXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCB0byB0aGUgZ2l2ZW4gbGVuZ3RoLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMiwgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjIgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIHNjYWxpbmcgZmFjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTEUoX3ZlY3RvcjogVmVjdG9yMiwgX3NjYWxlOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3ZlY3Rvci54ICogX3NjYWxlLCBfdmVjdG9yLnkgKiBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIHZlY3RvciBhdHRhaW5lZCBieSBhZGRpdGlvbiBvZiBhbGwgZ2l2ZW4gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTVU0oLi4uX3ZlY3RvcnM6IFZlY3RvcjJbXSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIGZvciAobGV0IHZlY3RvciBvZiBfdmVjdG9ycylcclxuICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC54ICsgdmVjdG9yLngsIHJlc3VsdC55ICsgdmVjdG9yLnkpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBESUZGRVJFTkNFKF9taW51ZW5kOiBWZWN0b3IyLCBfc3VidHJhaGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfbWludWVuZC54IC0gX3N1YnRyYWhlbmQueCwgX21pbnVlbmQueSAtIF9zdWJ0cmFoZW5kLnkpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gVmVjdG9ycy4gRHVlIHRvIHRoZW0gYmVpbmcgb25seSAyIERpbWVuc2lvbmFsLCB0aGUgcmVzdWx0IGlzIGEgc2luZ2xlIG51bWJlcixcclxuICAgICAqIHdoaWNoIGltcGxpY2l0bHkgaXMgb24gdGhlIFogYXhpcy4gSXQgaXMgYWxzbyB0aGUgc2lnbmVkIG1hZ25pdHVkZSBvZiB0aGUgcmVzdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENST1NTKF9hOiBWZWN0b3IyLCBfYjogVmVjdG9yMik6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS54ICogX2IueSAtIF9hLnkgKiBfYi54O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgdGhlIGRvdHByb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfYTogVmVjdG9yMiwgX2I6IFZlY3RvcjIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnggKyBfYS55ICogX2IueTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIG9ydGhvZ29uYWwgdmVjdG9yIHRvIHRoZSBnaXZlbiB2ZWN0b3IuIFJvdGF0ZXMgY291bnRlcmNsb2Nrd2lzZSBieSBkZWZhdWx0LlxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICog4oaRID0+IOKGkCA9PiDihpMgPT4g4oaSID0+IOKGkVxyXG4gICAgICogYGBgXHJcbiAgICAgKiBAcGFyYW0gX3ZlY3RvciBWZWN0b3IgdG8gZ2V0IHRoZSBvcnRob2dvbmFsIGVxdWl2YWxlbnQgb2ZcclxuICAgICAqIEBwYXJhbSBfY2xvY2t3aXNlIFNob3VsZCB0aGUgcm90YXRpb24gYmUgY2xvY2t3aXNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgY291bnRlcmNsb2Nrd2lzZT8gZGVmYXVsdDogZmFsc2VcclxuICAgICAqIEByZXR1cm5zIEEgVmVjdG9yIHRoYXQgaXMgb3J0aG9nb25hbCB0byBhbmQgaGFzIHRoZSBzYW1lIG1hZ25pdHVkZSBhcyB0aGUgZ2l2ZW4gVmVjdG9yLiAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT1JUSE9HT05BTChfdmVjdG9yOiBWZWN0b3IyLCBfY2xvY2t3aXNlOiBib29sZWFuID0gZmFsc2UpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBpZiAoX2Nsb2Nrd2lzZSlcclxuICAgICAgICByZXN1bHQuc2V0KF92ZWN0b3IueSwgLV92ZWN0b3IueCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQuc2V0KC1fdmVjdG9yLnksIF92ZWN0b3IueCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2FydGVzaWFuIHZlY3RvciBmcm9tIHBvbGFyIGNvb3JkaW5hdGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR0VPKF9hbmdsZTogbnVtYmVyID0gMCwgX21hZ25pdHVkZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIGxldCBnZW86IEdlbzIgPSBSZWN5Y2xlci5yZXVzZShHZW8yKTtcclxuICAgICAgZ2VvLnNldChfYW5nbGUsIF9tYWduaXR1ZGUpO1xyXG4gICAgICB2ZWN0b3IuZ2VvID0gZ2VvO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShnZW8pO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIEFjY2Vzc29yc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hZ25pdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gTWF0aC5oeXBvdCh0aGlzLngsIHRoaXMueSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMi5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9sYXIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBnZW8oKTogR2VvMiB7XHJcbiAgICAgIGxldCBnZW86IEdlbzIgPSBSZWN5Y2xlci5nZXQoR2VvMik7XHJcbiAgICAgIGdlby5tYWduaXR1ZGUgPSB0aGlzLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChnZW8ubWFnbml0dWRlID09PSAwKVxyXG4gICAgICAgIHJldHVybiBnZW87XHJcblxyXG4gICAgICBnZW8uYW5nbGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueSAvIGdlby5tYWduaXR1ZGUsIHRoaXMueCAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIHBvbGFyIGNvb3JkaW5hdGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgZ2VvKF9nZW86IEdlbzIpIHtcclxuICAgICAgdGhpcy5zZXQoX2dlby5tYWduaXR1ZGUsIDApO1xyXG4gICAgICB0aGlzLnRyYW5zZm9ybShNYXRyaXgzeDMuUk9UQVRJT04oX2dlby5hbmdsZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gUmVjeWNsZXIucmV1c2UoVmVjdG9yMikuY29weSh0aGlzKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHZlY3RvciBhcmUgdG8gYmUgY29uc2lkZXJlZCBpZGVudGljYWwgd2l0aGluIHRoZSBnaXZlbiB0b2xlcmFuY2VcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRvbGVyYW5jZSBhcyBjcml0ZXJpdW0gZm9yIHRoZSBkaWZmZXJlbmNlIGlzIGFwcHJvcHJpYXRlIHdpdGggdmVyeSBsYXJnZSBjb29yZGluYXRlIHZhbHVlcyBvciBpZiBfdG9sZXJhbmNlIHNob3VsZCBiZSBtdWx0aXBsaWVkIGJ5IGNvb3JkaW5hdGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVxdWFscyhfY29tcGFyZTogVmVjdG9yMiwgX3RvbGVyYW5jZTogbnVtYmVyID0gTnVtYmVyLkVQU0lMT04pOiBib29sZWFuIHtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueCAtIF9jb21wYXJlLngpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy55IC0gX2NvbXBhcmUueSkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoZSBleGVjdXRpbmcgdmVjdG9yLCBjaGFuZ2luZyB0aGUgZXhlY3V0b3IuXHJcbiAgICAgKiBAcGFyYW0gX2FkZGVuZCBUaGUgdmVjdG9yIHRvIGFkZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGUgZXhlY3V0aW5nIHZlY3RvciwgY2hhbmdpbmcgdGhlIGV4ZWN1dG9yLlxyXG4gICAgICogQHBhcmFtIF9zdWJ0cmFoZW5kIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdWJ0cmFjdChfc3VidHJhaGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggLT0gX3N1YnRyYWhlbmQueDtcclxuICAgICAgdGhpcy55IC09IF9zdWJ0cmFoZW5kLnk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoZSBWZWN0b3IgYnkgdGhlIGdpdmVuIF9zY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB0byB0aGUgZ2l2ZW4gbGVuZ3RoLCAxIGJ5IGRlZmF1bHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbGl6ZShfbGVuZ3RoOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvcHkoVmVjdG9yMi5OT1JNQUxJWkFUSU9OKHRoaXMsIF9sZW5ndGgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCA9IF94O1xyXG4gICAgICB0aGlzLnkgPSBfeTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFt0aGlzLngsIHRoaXMueV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gbWF0cml4LCBpbmNsdWRpbmcgb3IgZXhsdWRpbmcgdGhlIHRyYW5zbGF0aW9uLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX210eFRyYW5zZm9ybTogTWF0cml4M3gzLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgdHJhbnNmb3JtZWQ6IFZlY3RvcjIgPSBWZWN0b3IyLlRSQU5TRk9STUFUSU9OKHRoaXMsIF9tdHhUcmFuc2Zvcm0sIF9pbmNsdWRlVHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLmNvcHkodHJhbnNmb3JtZWQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2Zvcm1lZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtYXhpbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1heChfY29tcGFyZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1heCh0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1heCh0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB6LWNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbWFnbml0dWRlIChkZWZhdWx0PTApIHRvIHRoZSB2ZWN0b3IgYW5kIHJldHVybnMgYSBuZXcgVmVjdG9yM1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IzKF96OiBudW1iZXIgPSAwKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLngsIHRoaXMueSwgX3opO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IGAoJHt0aGlzLngudG9QcmVjaXNpb24oNSl9LCAke3RoaXMueS50b1ByZWNpc2lvbig1KX0pYDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZXMgdGhlIHN0YW5kYXJkIGFycmF5Lm1hcCBmdW5jdGlvbmFsaXR5IHRvIHBlcmZvcm0gdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKiBhbmQgcmV0dXJuIGEgbmV3IHZlY3RvciB3aXRoIHRoZSByZXN1bHRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXAoX2Z1bmN0aW9uOiAodmFsdWU6IG51bWJlciwgaW5kZXg6IG51bWJlciwgYXJyYXk6IEFycmF5TGlrZTxudW1iZXI+KSA9PiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IGNvcHk6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIGNvcHkuc2V0KC4uLlt0aGlzLngsIHRoaXMueV0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX1dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3IyPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55XSA9IEpTT04ucGFyc2UoPHN0cmluZz48dW5rbm93bj5fc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRoaXMubXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHg6IHRoaXMueCwgeTogdGhpcy55XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi4vUmVjeWNsZS9SZWN5Y2xlci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiVmVjdG9yMi50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIG9yaWdpbiBvZiBhIHJlY3RhbmdsZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIE9SSUdJTjJEIHtcclxuICAgIFRPUExFRlQgPSAweDAwLFxyXG4gICAgVE9QQ0VOVEVSID0gMHgwMSxcclxuICAgIFRPUFJJR0hUID0gMHgwMixcclxuICAgIENFTlRFUkxFRlQgPSAweDEwLFxyXG4gICAgQ0VOVEVSID0gMHgxMSxcclxuICAgIENFTlRFUlJJR0hUID0gMHgxMixcclxuICAgIEJPVFRPTUxFRlQgPSAweDIwLFxyXG4gICAgQk9UVE9NQ0VOVEVSID0gMHgyMSxcclxuICAgIEJPVFRPTVJJR0hUID0gMHgyMlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBhIHJlY3RhbmdsZSB3aXRoIHBvc2l0aW9uIGFuZCBzaXplIGFuZCBhZGQgY29tZm9ydGFibGUgbWV0aG9kcyB0byBpdFxyXG4gICAqIEBhdXRob3IgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVjdGFuZ2xlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgcG9zaXRpb246IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICBwdWJsaWMgc2l6ZTogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfd2lkdGg6IG51bWJlciA9IDEsIF9oZWlnaHQ6IG51bWJlciA9IDEsIF9vcmlnaW46IE9SSUdJTjJEID0gT1JJR0lOMkQuVE9QTEVGVCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uQW5kU2l6ZShfeCwgX3ksIF93aWR0aCwgX2hlaWdodCwgX29yaWdpbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHJlY3RhbmdsZSBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHRVQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfd2lkdGg6IG51bWJlciA9IDEsIF9oZWlnaHQ6IG51bWJlciA9IDEsIF9vcmlnaW46IE9SSUdJTjJEID0gT1JJR0lOMkQuVE9QTEVGVCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGxldCByZWN0OiBSZWN0YW5nbGUgPSBSZWN5Y2xlci5nZXQoUmVjdGFuZ2xlKTtcclxuICAgICAgcmVjdC5zZXRQb3NpdGlvbkFuZFNpemUoX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQpO1xyXG4gICAgICByZXR1cm4gcmVjdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgeSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaXplLng7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaXplLnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGxlZnRtb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGxlZnQoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS54ID4gMClcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueCArIHRoaXMuc2l6ZS54KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSB0b3Btb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0b3AoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS55ID4gMClcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueSArIHRoaXMuc2l6ZS55KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByaWdodG1vc3QgZXhwYW5zaW9uLCByZXNwZWN0aW5nIGFsc28gbmVnYXRpdmUgdmFsdWVzIG9mIHdpZHRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS54ID4gMClcclxuICAgICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueCArIHRoaXMuc2l6ZS54KTtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBsb3dlc3QgZXhwYW5zaW9uLCByZXNwZWN0aW5nIGFsc28gbmVnYXRpdmUgdmFsdWVzIG9mIGhlaWdodFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJvdHRvbSgpOiBudW1iZXIge1xyXG4gICAgICBpZiAodGhpcy5zaXplLnkgPiAwKVxyXG4gICAgICAgIHJldHVybiAodGhpcy5wb3NpdGlvbi55ICsgdGhpcy5zaXplLnkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgeChfeDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueCA9IF94O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB5KF95OiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbi55ID0gX3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHdpZHRoKF93aWR0aDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS54ID0gX3dpZHRoO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBoZWlnaHQoX2hlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS55ID0gX2hlaWdodDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbGVmdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueCA9IHRoaXMucmlnaHQgLSBfdmFsdWU7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdG9wKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS55ID0gdGhpcy5ib3R0b20gLSBfdmFsdWU7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcmlnaHQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnggPSB0aGlzLnBvc2l0aW9uLnggKyBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGJvdHRvbShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IHRoaXMucG9zaXRpb24ueSArIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKHRoaXMueCwgdGhpcy55LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyByZWN0YW5nbGUgdG8gdGhlIHZhbHVlcyBnaXZlbiBieSB0aGUgcmVjdGFuZ2xlIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9yZWN0OiBSZWN0YW5nbGUpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbkFuZFNpemUoX3JlY3QueCwgX3JlY3QueSwgX3JlY3Qud2lkdGgsIF9yZWN0LmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UG9zaXRpb25BbmRTaXplKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaXplLnNldChfd2lkdGgsIF9oZWlnaHQpO1xyXG4gICAgICBzd2l0Y2ggKF9vcmlnaW4gJiAweDAzKSB7XHJcbiAgICAgICAgY2FzZSAweDAwOiB0aGlzLnBvc2l0aW9uLnggPSBfeDsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAweDAxOiB0aGlzLnBvc2l0aW9uLnggPSBfeCAtIF93aWR0aCAvIDI7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgwMjogdGhpcy5wb3NpdGlvbi54ID0gX3ggLSBfd2lkdGg7IGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHN3aXRjaCAoX29yaWdpbiAmIDB4MzApIHtcclxuICAgICAgICBjYXNlIDB4MDA6IHRoaXMucG9zaXRpb24ueSA9IF95OyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MTA6IHRoaXMucG9zaXRpb24ueSA9IF95IC0gX2hlaWdodCAvIDI7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgyMDogdGhpcy5wb3NpdGlvbi55ID0gX3kgLSBfaGVpZ2h0OyBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSB0aGlzIHJlY3RhbmdsZXMgc3BhY2UgdG8gdGhlIHRhcmdldCByZWN0YW5nbGVzIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludFRvUmVjdChfcG9pbnQ6IFZlY3RvcjIsIF90YXJnZXQ6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gX3BvaW50LmNsb25lO1xyXG4gICAgICByZXN1bHQuc3VidHJhY3QodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgIHJlc3VsdC54ICo9IF90YXJnZXQud2lkdGggLyB0aGlzLndpZHRoO1xyXG4gICAgICByZXN1bHQueSAqPSBfdGFyZ2V0LmhlaWdodCAvIHRoaXMuaGVpZ2h0O1xyXG4gICAgICByZXN1bHQuYWRkKF90YXJnZXQucG9zaXRpb24pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgb2YgdGhpcyByZWN0YW5nbGUgb3Igb24gdGhlIGJvcmRlclxyXG4gICAgICogQHBhcmFtIF9wb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IyKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoX3BvaW50LnggPj0gdGhpcy5sZWZ0ICYmIF9wb2ludC54IDw9IHRoaXMucmlnaHQgJiYgX3BvaW50LnkgPj0gdGhpcy50b3AgJiYgX3BvaW50LnkgPD0gdGhpcy5ib3R0b20pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVjdGFuZ2xlIGNvbGxpZGVzIHdpdGggdGhlIHJlY3RhbmdsZSBnaXZlblxyXG4gICAgICogQHBhcmFtIF9yZWN0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGlkZXMoX3JlY3Q6IFJlY3RhbmdsZSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAodGhpcy5sZWZ0ID4gX3JlY3QucmlnaHQpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMucmlnaHQgPCBfcmVjdC5sZWZ0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnRvcCA+IF9yZWN0LmJvdHRvbSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5ib3R0b20gPCBfcmVjdC50b3ApIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZWN0YW5nbGUgY3JlYXRlZCBieSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiByZWN0YW5nbGUgb3IgbnVsbCwgaWYgdGhleSBkb24ndCBjb2xsaWRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbnRlcnNlY3Rpb24oX3JlY3Q6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGlmICghdGhpcy5jb2xsaWRlcyhfcmVjdCkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgaW50ZXJzZWN0aW9uOiBSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi54ID0gTWF0aC5tYXgodGhpcy5sZWZ0LCBfcmVjdC5sZWZ0KTtcclxuICAgICAgaW50ZXJzZWN0aW9uLnkgPSBNYXRoLm1heCh0aGlzLnRvcCwgX3JlY3QudG9wKTtcclxuICAgICAgaW50ZXJzZWN0aW9uLndpZHRoID0gTWF0aC5taW4odGhpcy5yaWdodCwgX3JlY3QucmlnaHQpIC0gaW50ZXJzZWN0aW9uLng7XHJcbiAgICAgIGludGVyc2VjdGlvbi5oZWlnaHQgPSBNYXRoLm1pbih0aGlzLmJvdHRvbSwgX3JlY3QuYm90dG9tKSAtIGludGVyc2VjdGlvbi55O1xyXG5cclxuICAgICAgcmV0dXJuIGludGVyc2VjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICogUmV0dXJucyB0aGUgcmVjdGFuZ2xlIGNyZWF0ZWQgYnkgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIG9yIG51bGwsIGlmIHRoZXkgZG9uJ3QgY29sbGlkZVxyXG4gKi9cclxuICAgIHB1YmxpYyBjb3ZlcnMoX3JlY3Q6IFJlY3RhbmdsZSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAodGhpcy5sZWZ0ID4gX3JlY3QubGVmdCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5yaWdodCA8IF9yZWN0LnJpZ2h0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnRvcCA+IF9yZWN0LnRvcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5ib3R0b20gPCBfcmVjdC5ib3R0b20pIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVjdGFuZ2xlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgxpIuUmVjdGFuZ2xlKHBvc2l0aW9uOiR7dGhpcy5wb3NpdGlvbi50b1N0cmluZygpfSwgc2l6ZToke3RoaXMuc2l6ZS50b1N0cmluZygpfWA7XHJcbiAgICAgIHJlc3VsdCArPSBgLCBsZWZ0OiR7dGhpcy5sZWZ0LnRvUHJlY2lzaW9uKDUpfSwgdG9wOiR7dGhpcy50b3AudG9QcmVjaXNpb24oNSl9LCByaWdodDoke3RoaXMucmlnaHQudG9QcmVjaXNpb24oNSl9LCBib3R0b206JHt0aGlzLmJvdHRvbS50b1ByZWNpc2lvbig1KX1gO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyogKi8gfVxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvclNoYWRlci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JDb2F0LnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3Rvck1lc2gudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0udHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0udHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL01hdGgvUmVjdGFuZ2xlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gZXhwb3J0IGRlY2xhcmUgbGV0IGZ1ZGdlQ29uZmlnOiBHZW5lcmFsO1xyXG5cclxuICBleHBvcnQgdHlwZSBSZW5kZXJUZXh0dXJlID0gV2ViR0xUZXh0dXJlO1xyXG5cclxuICBleHBvcnQgZW51bSBCTEVORCB7XHJcbiAgICBPUEFRVUUsIFRSQU5TUEFSRU5ULCBBRERJVElWRSwgU1VCVFJBQ1RJVkUsIE1PRFVMQVRFXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBERVBUSF9GVU5DVElPTiB7XHJcbiAgICBORVZFUiwgTEVTUywgRVFVQUwsIExFU1NfRVFVQUwsIEdSRUFURVIsIE5PVF9FUVVBTCwgR1JFQVRFUl9FUVVBTCwgQUxXQVlTXHJcbiAgfVxyXG5cclxuICAvLyB3ZSB3YW50IHR5cGUgaW5mZXJlbmNlIGhlcmUgc28gd2UgY2FuIHVzZSB2cyBjb2RlIHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlc1xyXG4gIGV4cG9ydCBjb25zdCBVTklGT1JNX0JMT0NLUyA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG4gICAgTElHSFRTOiB7XHJcbiAgICAgIE5BTUU6IFwiTGlnaHRzXCIsXHJcbiAgICAgIEJJTkRJTkc6IDBcclxuICAgIH0sXHJcbiAgICBTS0lOOiB7XHJcbiAgICAgIE5BTUU6IFwiU2tpblwiLFxyXG4gICAgICBCSU5ESU5HOiAxXHJcbiAgICB9LFxyXG4gICAgRk9HOiB7XHJcbiAgICAgIE5BTUU6IFwiRm9nXCIsXHJcbiAgICAgIEJJTkRJTkc6IDJcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBleHBvcnQgY29uc3QgVEVYVFVSRV9MT0NBVElPTiA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG4gICAgQ09MT1I6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleENvbG9yXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsXHJcbiAgICAgIElOREVYOiAwIC8vIGNvdWxkIGNvbXB1dGUgdGhlc2UgYnkgVU5JVCAtIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAgXHJcbiAgICB9LFxyXG4gICAgTk9STUFMOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhOb3JtYWxcIixcclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMSxcclxuICAgICAgSU5ERVg6IDFcclxuICAgIH0sXHJcbiAgICBQQVJUSUNMRToge1xyXG4gICAgICBVTklGT1JNOiBcInVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTIsXHJcbiAgICAgIElOREVYOiAyXHJcbiAgICB9LFxyXG4gICAgVEVYVDoge1xyXG4gICAgICBVTklGT1JNOiBcInVfdGV4VGV4dFwiLCAvLyBUT0RPOiBhZGQgdGV4dCB1bmlmb3JtIHRvIHNoYWRlci4uLlxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUzLFxyXG4gICAgICBJTkRFWDogM1xyXG4gICAgfSxcclxuICAgIFRPT046IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleFRvb25cIixcclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFNCxcclxuICAgICAgSU5ERVg6IDRcclxuICAgIH1cclxuICB9IGFzIGNvbnN0O1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBSZW5kZXJNYW5hZ2VyLCBoYW5kbGluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVuZGVyaW5nIHN5c3RlbSwgaW4gdGhpcyBjYXNlIFdlYkdMLlxyXG4gICAqIE1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgb2YgdGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSwgb25seSB0aHJvdWdoIHtAbGluayBSZW5kZXJ9XHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcldlYkdMIGV4dGVuZHMgRXZlbnRUYXJnZXRTdGF0aWMge1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IFJlbmRlcldlYkdMLmdldENhbnZhc1JlY3QoKTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9NYWluOiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIGZvciBmb3J3YXJkIHJlbmRlcmluZyBwYXNzZXMsIGUuZy4gb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBvYmplY3RzXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9Qb3N0OiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIGZvciBwb3N0LXByb2Nlc3NpbmcgZWZmZWN0cywgYXR0YWNobWVudHMgZ2V0IHN3YXBwZWQgZm9yIGRpZmZlcmVudCBlZmZlY3RzXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmYm9UYXJnZXQ6IFdlYkdMRnJhbWVidWZmZXI7IC8vIHVzZWQgdG8gcmVuZGVyIHRoZSBmaW5hbCBpbWFnZSB0bywgdXN1YWxseSBcIm51bGxcIiB0byByZW5kZXIgdG8gdGhlIGNhbnZhcyBkZWZhdWx0IGZyYW1lYnVmZmVyLiBVc2VkIGJ5IFhSIHRvIHJlbmRlciB0byB0aGUgWFJXZWJHTExheWVyIGZyYW1lYnVmZmVyLlxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHRleENvbG9yOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgY29sb3Igb2YgZWFjaCBwaXhlbCByZW5kZXJlZFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4UG9zaXRpb246IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHBpeGVsIGluIHdvcmxkIHNwYWNlXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhOb3JtYWw6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBub3JtYWwgb2YgZWFjaCBwaXhlbCBpbiB3b3JsZCBzcGFjZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Tm9pc2U6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHJhbmRvbSB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwsIHVzZWQgZm9yIGFtYmllbnQgb2NjbHVzaW9uXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhEZXB0aFN0ZW5jaWw6IFdlYkdMVGV4dHVyZTsgLy8gc3RvcmVzIHRoZSBkZXB0aCBvZiBlYWNoIHBpeGVsLCBjdXJyZW50bHkgdW51c2VkXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhCbG9vbVNhbXBsZXM6IFdlYkdMVGV4dHVyZVtdOyAvLyBzdG9yZXMgZG93biBhbmQgdXBzYW1wbGVkIHZlcnNpb25zIG9mIHRoZSBjb2xvciB0ZXh0dXJlLCB1c2VkIGZvciBibG9vbVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZib1BpY2s6IFdlYkdMQnVmZmVyO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4UGljazogV2ViR0xUZXh0dXJlO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4RGVwdGhQaWNrOiBXZWJHTFRleHR1cmU7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdWJvTGlnaHRzOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHByaXZhdGUgc3RhdGljIHVib0xpZ2h0c09mZnNldHM6IHsgW19uYW1lOiBzdHJpbmddOiBudW1iZXIgfTsgLy8gTWFwcyB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBpbnNpZGUgdGhlIExpZ2h0cyB1bmlmb3JtIGJsb2NrIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnl0ZSBvZmZzZXRcclxuICAgIHByaXZhdGUgc3RhdGljIHVib0ZvZzogV2ViR0xCdWZmZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBvZmZzY3JlZW4tY2FudmFzLCByZW5kZXJpbmdjb250ZXh0IGFuZCBoYXJkd2FyZSB2aWV3cG9ydC4gQ2FsbCBvbmNlIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzIGxpa2UgbWVzaGVzIG9yIHNoYWRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKF9hbnRpYWxpYXM/OiBib29sZWFuLCBfYWxwaGE/OiBib29sZWFuKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbCA9IFJlZmxlY3QuZ2V0KGdsb2JhbFRoaXMsIFwiZnVkZ2VDb25maWdcIikgfHwge307XHJcbiAgICAgIGNvbnN0IGFudGlhbGlhczogYm9vbGVhbiA9IChfYW50aWFsaWFzICE9IHVuZGVmaW5lZCkgPyBfYW50aWFsaWFzIDogZnVkZ2VDb25maWcuYW50aWFsaWFzIHx8IGZhbHNlO1xyXG4gICAgICBpZiAoYW50aWFsaWFzKVxyXG4gICAgICAgIERlYnVnLmVycm9yKFwiVGhlIGRlZmF1bHQgYW50aWFsaWFzaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMgYW5kIHdpbGwgdGhlcmVmb3JlIGJlIGRpc2FibGVkLlwiKTtcclxuICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzOiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzID0geyAvLyBUT0RPOiBcclxuICAgICAgICBhbHBoYTogKF9hbHBoYSAhPSB1bmRlZmluZWQpID8gX2FscGhhIDogZnVkZ2VDb25maWcuYWxwaGEgfHwgZmFsc2UsXHJcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcclxuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxyXG4gICAgICAgIHN0ZW5jaWw6IHRydWVcclxuICAgICAgfTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJJbml0aWFsaXplIFJlbmRlcldlYkdMXCIsIGNvbnRleHRBdHRyaWJ1dGVzKTtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgY3JjMyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTDJSZW5kZXJpbmdDb250ZXh0PihcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiLCBjb250ZXh0QXR0cmlidXRlcyksXHJcbiAgICAgICAgXCJXZWJHTC1jb250ZXh0IGNvdWxkbid0IGJlIGNyZWF0ZWRcIlxyXG4gICAgICApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzID0gY3JjMztcclxuICAgICAgLy8gRW5hYmxlIGJhY2tmYWNlLSBhbmQgekJ1ZmZlci1jdWxsaW5nLlxyXG4gICAgICBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNVTExfRkFDRSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyID0gUmVuZGVyV2ViR0wuZ2V0Q2FudmFzUmVjdCgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZUF0dGFjaG1lbnRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmFkanVzdEF0dGFjaG1lbnRzKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5pbml0aWFsaXplTGlnaHRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmluaXRpYWxpemVGb2coKTtcclxuXHJcbiAgICAgIHJldHVybiBjcmMzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDaGVja3MgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBXZWJHTC1lcnJvcmNvZGUgaWYgdGhlIHZhbHVlIGlzIG51bGxcclxuICAgICogQHBhcmFtIF92YWx1ZSAgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCBudWxsXHJcbiAgICAqIEBwYXJhbSBfbWVzc2FnZSAgb3B0aW9uYWwsIGFkZGl0aW9uYWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvblxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXNzZXJ0PFQ+KF92YWx1ZTogVCB8IG51bGwsIF9tZXNzYWdlOiBzdHJpbmcgPSBcIlwiKTogVCB7XHJcbiAgICAgIGlmIChfdmFsdWUgPT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlcnRpb24gZmFpbGVkLiAke19tZXNzYWdlfSwgV2ViR0wtRXJyb3I6ICR7UmVuZGVyV2ViR0wuY3JjMyA/IFJlbmRlcldlYkdMLmNyYzMuZ2V0RXJyb3IoKSA6IFwiXCJ9YCk7XHJcbiAgICAgIHJldHVybiBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIG9mZnNjcmVlbi1jYW52YXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xyXG4gICAgICByZXR1cm4gPEhUTUxDYW52YXNFbGVtZW50PlJlbmRlcldlYkdMLmNyYzMuY2FudmFzOyAvLyBUT0RPOiBlbmFibGUgT2Zmc2NyZWVuQ2FudmFzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyaW5nQ29udGV4dCgpOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IHtcclxuICAgICAgcmV0dXJuIFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSByZWN0YW5nbGUgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2NyZWVuLWNhbnZhcy4geCx5IGFyZSAwIGF0IGFsbCB0aW1lcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDYW52YXNSZWN0KCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gPEhUTUxDYW52YXNFbGVtZW50PlJlbmRlcldlYkdMLmNyYzMuY2FudmFzO1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaXplIG9mIHRoZSBvZmZzY3JlZW4tY2FudmFzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENhbnZhc1NpemUoX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNhbnZhcy53aWR0aCA9IF93aWR0aDtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5jYW52YXMuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYXJlYSBvbiB0aGUgb2Zmc2NyZWVuLWNhbnZhcyB0byByZW5kZXIgdGhlIGNhbWVyYSBpbWFnZSB0by5cclxuICAgICAqIEBwYXJhbSBfcmVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFJlbmRlclJlY3RhbmdsZShfcmVjdDogUmVjdGFuZ2xlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLnJlY3RSZW5kZXIuc2V0UG9zaXRpb25BbmRTaXplKF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhlIG9mZnNjcmVlbiByZW5kZXJidWZmZXIgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIENvbG9yfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyKF9jb2xvcj86IENvbG9yLCBfY29sb3JzOiBib29sZWFuID0gdHJ1ZSwgX2RlcHRoOiBib29sZWFuID0gdHJ1ZSwgX3N0ZW5jaWw6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2xlYXJDb2xvcihfY29sb3I/LnIgPz8gMCwgX2NvbG9yPy5nID8/IDAsIF9jb2xvcj8uYiA/PyAwLCBfY29sb3I/LmEgPz8gMSk7XHJcbiAgICAgIGxldCBtYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAoX2NvbG9ycylcclxuICAgICAgICBtYXNrIHw9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVDtcclxuICAgICAgaWYgKF9kZXB0aClcclxuICAgICAgICBtYXNrIHw9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVDtcclxuICAgICAgaWYgKF9zdGVuY2lsKVxyXG4gICAgICAgIG1hc2sgfD0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2xlYXIobWFzayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZpbmFsIGZyYW1lYnVmZmVyIHRvIHJlbmRlciB0by4gSWYgbnVsbCwgdGhlIGNhbnZhcyBkZWZhdWx0IGZyYW1lYnVmZmVyIGlzIHVzZWQuXHJcbiAgICAgKiBVc2VkIGJ5IFhSIHRvIHJlbmRlciB0byB0aGUgWFJXZWJHTExheWVyIGZyYW1lYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEZyYW1lYnVmZmVyVGFyZ2V0KF9idWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvVGFyZ2V0ID0gX2J1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0IHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgbWFpbiBjb2xvciBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVzZXRGcmFtZWJ1ZmZlcigpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgYXJlYSBvbiB0aGUgb2Zmc2NyZWVuLWNhbnZhcyB0aGUgY2FtZXJhIGltYWdlIGdldHMgcmVuZGVyZWQgdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyUmVjdGFuZ2xlKCk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgZGVwdGggdGVzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXREZXB0aFRlc3QoX3Rlc3Q6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF90ZXN0KVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmRpc2FibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9URVNUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb24gdXNlZCB0byB0ZXN0IGZyYWdtZW50IGRlcHRocyBhZ2FpbnN0IGN1cnJlbnQgZGVwdGggYnVmZmVyIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXREZXB0aEZ1bmN0aW9uKF9mdW5jdGlvbjogREVQVEhfRlVOQ1RJT04gPSBERVBUSF9GVU5DVElPTi5MRVNTKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZGVwdGhGdW5jKF9mdW5jdGlvbiArIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVWRVIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgc2Npc3NvciB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFNjaXNzb3JUZXN0KF90ZXN0OiBib29sZWFuLCBfeD86IG51bWJlciwgX3k/OiBudW1iZXIsIF93aWR0aD86IG51bWJlciwgX2hlaWdodD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TQ0lTU09SX1RFU1QpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kaXNhYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU0NJU1NPUl9URVNUKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5zY2lzc29yKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB3aGljaCBjb2xvciBjb21wb25lbnRzIHRvIGVuYWJsZSBvciB0byBkaXNhYmxlIHdoZW4gcmVuZGVyaW5nIHRvIGEgY29sb3IgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENvbG9yV3JpdGVNYXNrKF9yOiBib29sZWFuLCBfZzogYm9vbGVhbiwgX2I6IGJvb2xlYW4sIF9hOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY29sb3JNYXNrKF9yLCBfZywgX2IsIF9hKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBXZWJHTHMgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Vmlld3BvcnQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYmxlbmQgbW9kZSB0byByZW5kZXIgd2l0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEJsZW5kTW9kZShfbW9kZTogQkxFTkQpOiB2b2lkIHtcclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgQkxFTkQuT1BBUVVFOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuWkVSTyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELlRSQU5TUEFSRU5UOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNSQ19BTFBIQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuQURESVRJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICAvLyBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TUkNfQUxQSEEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuU1VCVFJBQ1RJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmxlbmRGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1JDX0FMUEhBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELk1PRFVMQVRFOiAvLyBjb2xvciBnZXRzIG11bHRpcGxpZWQsIHRyaWVkIHRvIGNvcHkgdW5pdHlzIFwiUGFydGljbGUgU2hhZGVyOiBCbGVuZGluZyBPcHRpb246IFJlbmRlcmluZyBNb2RlOiBNb2R1bGF0ZVwiXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9DT0xPUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgdGhlICh3b3JsZCkgcG9zaXRpb24gZnJvbSB0aGUgcGl4ZWwgYXQgdGhlIGdpdmVuIHBvaW50IG9uIHRoZSByZW5kZXItcmVjdGFuZ2xlIChvcmlnaW4gdG9wIGxlZnQpLlxyXG4gICAgICog4pqg77iPIENBVVRJT046IEN1cnJlbnRseSBvbmx5IHdvcmtzIHdoZW4gYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlIGR1ZSB0byB3cml0aW5nIHRvIHRoZSBwb3NpdGlvbiB0ZXh0dXJlIGJlaW5nIGRpc2FibGVkIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwb2ludFJlbmRlclRvV29ybGQoX3JlbmRlcjogVmVjdG9yMik6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEpO1xyXG4gICAgICBjcmMzLnJlYWRQaXhlbHMoX3JlbmRlci54LCBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLmhlaWdodCAtIF9yZW5kZXIueSwgMSwgMSwgY3JjMy5SR0JBLCBjcmMzLkZMT0FULCBkYXRhKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDApO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHBvc2l0aW9uLnNldChkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgZGlmZmVyZW50IGZyYW1lYnVmZmVycyBhc3dlbGwgYXMgdGV4dHVyZSBhdHRhY2htZW50cyB0byB1c2UgYXMgcmVuZGVyIHRhcmdldHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplQXR0YWNobWVudHMoKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKTsgLy8gVE9ETzogZGlzYWJsZSBzc2FvIGlmIG5vdCBzdXBwb3J0ZWRcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmZib01haW4gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xGcmFtZWJ1ZmZlcj4oUmVuZGVyV2ViR0wuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvUG9zdCA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEZyYW1lYnVmZmVyPihSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBudWxsO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9QaWNrID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmNyYzMuY3JlYXRlRnJhbWVidWZmZXIoKSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhDb2xvciA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhQb3NpdGlvbiA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhOb3JtYWwgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleE5vaXNlID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleFBpY2sgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXMgPSBuZXcgQXJyYXkoNik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib01haW4pO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24sIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Tm9ybWFsLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhEZXB0aFN0ZW5jaWwsIDApO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvUGljayk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhQaWNrLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX0FUVEFDSE1FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrLCAwKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIG51bGwpO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShfZmlsdGVyOiBudW1iZXIsIF93cmFwOiBudW1iZXIpOiBXZWJHTFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5jcmMzO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFRleHR1cmU+KGNyYzMuY3JlYXRlVGV4dHVyZSgpKTtcclxuICAgICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIF9maWx0ZXIpO1xyXG4gICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBfZmlsdGVyKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBfd3JhcCk7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgX3dyYXApO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgc2l6ZSBvZiB0aGUgZGlmZmVyZW50IHRleHR1cmUgYXR0YWNobWVudHMgKHJlbmRlciB0YXJnZXRzKSB0byB0aGUgY2FudmFzIHNpemVcclxuICAgICAqIOKaoO+4jyBDQVVUSU9OOiBFeHBlbnNpdmUgb3BlcmF0aW9uLCB1c2Ugb25seSB3aGVuIGNhbnZhcyBzaXplIGNoYW5nZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGp1c3RBdHRhY2htZW50cygpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNyYzMuY2FudmFzLndpZHRoIHx8IDE7XHJcbiAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY3JjMy5jYW52YXMuaGVpZ2h0IHx8IDE7XHJcblxyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoY3JjMy5URVhUVVJFMCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9CWVRFLCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhQb3NpdGlvbik7XHJcbiAgICAgIC8vIEluIHZpZXcgc3BhY2UgMTZGIHdvdWxkIGJlIHByZWNpc2UgZW5vdWdoLi4uIGJ1dCB3ZSB3YW50IHRvIHVzZSB3b3JsZCBzcGFjZSBmb3IgY2FsY3VsYXRpb25zXHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMyRiwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhOb3JtYWwpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkExNkYsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GTE9BVCwgbnVsbCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSDI0X1NURU5DSUw4LCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1NURU5DSUwsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfSU5UXzI0XzgsIG51bGwpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgZGl2aXNvcjogbnVtYmVyID0gMTsgaSA8IFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlcy5sZW5ndGg7IGkrKywgZGl2aXNvciAqPSAyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLndpZHRoIC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMuaGVpZ2h0IC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaV0pO1xyXG4gICAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIG51bGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuVmFsdWVzOiBudW1iZXIgPSB3aWR0aCAqIGhlaWdodCAqIDQ7XHJcbiAgICAgIGNvbnN0IG5vaXNlRGF0YTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KG5WYWx1ZXMpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WYWx1ZXM7IGkgKz0gNCkge1xyXG4gICAgICAgIG5vaXNlRGF0YVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAxXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAyXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgICAgbm9pc2VEYXRhW2kgKyAzXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoY3JjMy5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhOb2lzZSk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChjcmMzLlRFWFRVUkVfMkQsIDAsIGNyYzMuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgY3JjMy5SR0JBLCBjcmMzLlVOU0lHTkVEX0JZVEUsIG5vaXNlRGF0YSk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoY3JjMy5URVhUVVJFXzJELCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIHBpY2thYmxlIG9iamVjdCBpbiB0aGUgbGluZSBvZiBzaWdodCBhbmQgcmV0dXJucyB0aGF0IGFzIGFuIHVuc29ydGVkIGFycmF5IG9mIHtAbGluayBQaWNrfXMuXHJcbiAgICAgKiBUaGUgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBvYmplY3RzIGludG8gdGhlIHBpY2sgYnVmZmVyIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cclxuICAgICAqIEBwYXJhbSBfcGljayBUaGUgZnVuY3Rpb24gd2hpY2ggcmVuZGVycyBvYmplY3RzIGludG8gdGhlIHBpY2sgYnVmZmVyLiBSZXR1cm5zIGEge0BsaW5rIFBpY2t9IGZvciBlYWNoIHJlbmRlcmVkIG9iamVjdC4gXHJcbiAgICAgKiAqKk1VU1QqKiB1c2Uge0BsaW5rIFNoYWRlclBpY2t9IG9yIHtAbGluayBTaGFkZXJQaWNrVGV4dHVyZWR9IHRvIHJlbmRlciBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tGcm9tPFQ+KF9mcm9tOiBUW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2s6IChfZnJvbTogVFtdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpID0+IFBpY2tbXSk6IFBpY2tbXSB7IC8vIFRPRE86IHNlZSBpZiB0aGlyZCBwYXJhbWV0ZXIgX3dvcmxkPzogTWF0cml4NHg0IHdvdWxkIGJlIHVzZWZ1bGxcclxuICAgICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gTWF0aC5jZWlsKE1hdGguc3FydChfZnJvbS5sZW5ndGgpKTtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIC8vIGFkanVzdCBwaWNrIGJ1ZmZlciBzaXplXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1BpY2spO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4UGljayk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMySSwgc2l6ZSwgc2l6ZSwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBX0lOVEVHRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5ULCBudWxsKTsgLy8gY291bGQgdXNlIFJCR0EzMkYgaW4gdGhlIGZ1dHVyZSBlLmcuIFdlYkdQVVxyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhQaWNrKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9DT01QT05FTlQyNCwgc2l6ZSwgc2l6ZSwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9DT01QT05FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfSU5ULCBudWxsKTtcclxuICAgICAgY3JjMy5jbGVhcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX0JVRkZFUl9CSVQpO1xyXG5cclxuICAgICAgLy8gYnVmZmVyIHNpemUgaW50byBwaWNrIHNoYWRlcnNcclxuICAgICAgU2hhZGVyUGljay51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmdihTaGFkZXJQaWNrLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbc2l6ZSwgc2l6ZV0pO1xyXG4gICAgICBTaGFkZXJQaWNrVGV4dHVyZWQudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZnYoU2hhZGVyUGlja1RleHR1cmVkLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbc2l6ZSwgc2l6ZV0pO1xyXG5cclxuICAgICAgLy8gcmVuZGVyIHBpY2tzIGludG8gcGljayBidWZmZXJcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELk9QQVFVRSk7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gX3BpY2soX2Zyb20sIF9jbXBDYW1lcmEpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG5cclxuICAgICAgLy8gZ2V0L2ZpbHRlciBwaWNrc1xyXG4gICAgICAvLyBldmFsdWF0ZSB0ZXh0dXJlIGJ5IHJlYWRpbmcgcGl4ZWxzIGFuZCBleHRyYWN0LCBjb252ZXJ0IGFuZCBzdG9yZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBtZXNoIGhpdFxyXG4gICAgICBsZXQgZGF0YTogSW50MzJBcnJheSA9IG5ldyBJbnQzMkFycmF5KHNpemUgKiBzaXplICogNCk7XHJcbiAgICAgIFJlbmRlci5jcmMzLnJlYWRQaXhlbHMoMCwgMCwgc2l6ZSwgc2l6ZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBX0lOVEVHRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5ULCBkYXRhKTtcclxuXHJcbiAgICAgIGxldCBwaWNrZWQ6IFBpY2tbXSA9IFtdO1xyXG4gICAgICBsZXQgbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKF9jbXBDYW1lcmEubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGlja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgekJ1ZmZlcjogbnVtYmVyID0gZGF0YVs0ICogaSArIDBdICsgZGF0YVs0ICogaSArIDFdIC8gMjU2O1xyXG4gICAgICAgIGlmICh6QnVmZmVyID09IDApIC8vIGRpc2NhcmQgbWlzc2VzIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBwaWNrc1tpXTtcclxuICAgICAgICBwaWNrLnpCdWZmZXIgPSBjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoZGF0YSwgNCAqIGkgKyAwKSAqIDIgLSAxO1xyXG4gICAgICAgIHBpY2suY29sb3IgPSBjb252ZXJ0SW50MzJ0b0NvbG9yKGRhdGEsIDQgKiBpICsgMSk7XHJcbiAgICAgICAgcGljay50ZXh0dXJlVVYgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgICBwaWNrLnRleHR1cmVVVi5zZXQoY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMiksIGNvbnZlcnRJbnQzMnRvRmxvYXQzMihkYXRhLCA0ICogaSArIDMpKTtcclxuICAgICAgICBwaWNrLm10eFZpZXdUb1dvcmxkID0gbXR4Vmlld1RvV29ybGQ7XHJcblxyXG4gICAgICAgIHBpY2tlZC5wdXNoKHBpY2spO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5yZXNldEZyYW1lYnVmZmVyKCk7XHJcblxyXG4gICAgICByZXR1cm4gcGlja2VkO1xyXG5cclxuICAgICAgZnVuY3Rpb24gY29udmVydEludDMydG9GbG9hdDMyKF9pbnQzMkFycmF5OiBJbnQzMkFycmF5LCBfaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7XHJcbiAgICAgICAgbGV0IHZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XHJcbiAgICAgICAgdmlldy5zZXRJbnQzMigwLCBfaW50MzJBcnJheVtfaW5kZXhdKTtcclxuICAgICAgICByZXR1cm4gdmlldy5nZXRGbG9hdDMyKDApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBjb252ZXJ0SW50MzJ0b0NvbG9yKF9pbnQzMkFycmF5OiBJbnQzMkFycmF5LCBfaW5kZXg6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgICBsZXQgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTtcclxuICAgICAgICBsZXQgdmlldzogRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcclxuICAgICAgICB2aWV3LnNldEludDMyKDAsIF9pbnQzMkFycmF5W19pbmRleF0pO1xyXG4gICAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoYHJnYigke3ZpZXcuZ2V0VWludDgoMCl9LCAke3ZpZXcuZ2V0VWludDgoMSl9LCAke3ZpZXcuZ2V0VWludDgoMil9KWAsIHZpZXcuZ2V0VWludDgoMykgLyAyNTUpO1xyXG4gICAgICAgIHJldHVybiBjb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlciBmdW5jdGlvbiBmb3IgcGlja2luZyBub2Rlcy4gXHJcbiAgICAgKiBBIGNhbWVyYXByb2plY3Rpb24gd2l0aCBleHRyZW1lbHkgbmFycm93IGZvY3VzIGlzIHVzZWQsIHNvIGVhY2ggcGl4ZWwgb2YgdGhlIGJ1ZmZlciB3b3VsZCBob2xkIHRoZSBzYW1lIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUsICBcclxuICAgICAqIGJ1dCB0aGUgZnJhZ21lbnQgc2hhZGVyIHJlbmRlcnMgb25seSAxIHBpeGVsIGZvciBlYWNoIG5vZGUgaW50byB0aGUgcmVuZGVyIGJ1ZmZlciwgMXN0IG5vZGUgdG8gMXN0IHBpeGVsLCAybmQgbm9kZSB0byBzZWNvbmQgcGl4ZWwgZXRjLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2soX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gW107XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgX25vZGVzKSB7XHJcbiAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICAgIGlmICghKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNvYXQgaW5zdGFuY2VvZiBDb2F0VGV4dHVyZWQgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJQaWNrO1xyXG5cclxuICAgICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gUmVuZGVyV2ViR0wuY2FsY01lc2hUb1ZpZXcobm9kZSwgY21wTWVzaC5tdHhXb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIGxldCBtZXNoOiBNZXNoID0gY21wTWVzaC5tZXNoO1xyXG4gICAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbWVzaC51c2VSZW5kZXJCdWZmZXJzKHNoYWRlciwgbm9kZS5tdHhXb3JsZCwgbXR4TWVzaFRvVmlldywgcGlja3MubGVuZ3RoKTtcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmRyYXdFbGVtZW50cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgcmVuZGVyQnVmZmVycy5uSW5kaWNlcywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcblxyXG4gICAgICAgIHBpY2tzLnB1c2gobmV3IFBpY2sobm9kZSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcGlja3M7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluaXRpYWxpemVGb2coKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0ZvZyA9IFJlbmRlcldlYkdMLmFzc2VydChSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5GT0cuQklORElORywgUmVuZGVyV2ViR0wudWJvRm9nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZm9nIHBhcmFtZXRlcnMgaW50byB0aGUgZm9nIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckZvZyhfY21wRm9nOiBDb21wb25lbnRGb2cpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoOCk7XHJcblxyXG4gICAgICBkYXRhWzBdID0gX2NtcEZvZz8uaXNBY3RpdmUgPyAxIDogMDtcclxuICAgICAgaWYgKF9jbXBGb2cpIHtcclxuICAgICAgICBkYXRhWzFdID0gX2NtcEZvZy5uZWFyO1xyXG4gICAgICAgIGRhdGFbMl0gPSBfY21wRm9nLmZhcjtcclxuICAgICAgICBkYXRhLnNldChfY21wRm9nLmNvbG9yLmdldCgpLCA0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYnVmZmVyIGRhdGEgdG8gYm91bmQgYnVmZmVyXHJcbiAgICAgIGNyYzMuYmluZEJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBSZW5kZXJXZWJHTC51Ym9Gb2cpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgZGF0YSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5pdGlhbGl6ZUxpZ2h0cygpOiB2b2lkIHtcclxuICAgICAgY29uc3QgTUFYX0xJR0hUU19ESVJFQ1RJT05BTDogbnVtYmVyID0gMTU7IC8vIG11c3QgbWF0Y2ggdGhlIGRlZmluZSBpbiB0aGUgc2hhZGVyXHJcbiAgICAgIGNvbnN0IE1BWF9MSUdIVFNfUE9JTlQ6IG51bWJlciA9IDEwMDtcclxuICAgICAgY29uc3QgTUFYX0xJR0hUU19TUE9UOiBudW1iZXIgPSAxMDA7XHJcbiAgICAgIGNvbnN0IEJZVEVTX1BFUl9MSUdIVDogbnVtYmVyID0gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogKDQgKyAxNiArIDE2KTsgLy8gdmN0Q29sb3IgKyBtdHhTaGFwZSArIG10eFNoYXBlSW52ZXJzZSBhcyBmbG9hdDMycyBpbiBzaGFkZXJcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHMgPSB7fTtcclxuICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiAwO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9uTGlnaHRzUG9pbnRcIl0gPSBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDE7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X25MaWdodHNTcG90XCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiAyO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9hbWJpZW50XCJdID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiA0O1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9kaXJlY3Rpb25hbFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X2FtYmllbnRcIl0gKyBCWVRFU19QRVJfTElHSFQgKiAxO1xyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9wb2ludFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X2RpcmVjdGlvbmFsXCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19ESVJFQ1RJT05BTDtcclxuICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfc3BvdFwiXSA9IFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbXCJ1X3BvaW50XCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19QT0lOVDtcclxuXHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0cyA9IFJlbmRlcldlYkdMLmFzc2VydChjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgY29uc3QgYmxvY2tTaXplOiBudW1iZXIgPSBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW1widV9zcG90XCJdICsgQllURVNfUEVSX0xJR0hUICogTUFYX0xJR0hUU19TUE9UO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIFJlbmRlcldlYkdMLnVib0xpZ2h0cyk7XHJcbiAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBibG9ja1NpemUsIGNyYzMuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5MSUdIVFMuQklORElORywgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lZ3JhcGggaW50byB0aGUgbGlnaHRzIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckxpZ2h0cyhfbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCk6IHZvaWQge1xyXG4gICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuXHJcbiAgICAgIC8vIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhbWJpZW50IGxpZ2h0IGNvbG9yXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KExpZ2h0QW1iaWVudCk7XHJcbiAgICAgIGlmIChjbXBMaWdodHMpIHtcclxuICAgICAgICBsZXQgY2xyU3VtOiBDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAwLCAwKTtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpIHtcclxuICAgICAgICAgIGxldCBjbHJMaWdodDogQ29sb3IgPSBDb2xvci5QUk9EVUNUKGNtcExpZ2h0LmxpZ2h0LmNvbG9yLCBjbXBMaWdodC5saWdodC5pbnRlbnNpdHkpO1xyXG4gICAgICAgICAgY2xyU3VtLmFkZChjbHJMaWdodCk7XHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShjbHJMaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJ1ZmZlclN1YkRhdGEoXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLlVOSUZPUk1fQlVGRkVSLFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzT2Zmc2V0c1tcInVfYW1iaWVudFwiXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBcInVfYW1iaWVudFwiIGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGNsclN1bS5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgbGlnaHQgZGF0YSBmb3IgZWFjaCBsaWdodCB0eXBlXHJcbiAgICAgIC8vIHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgYSBtYXhpbXVtIG9mIDQgY3JjMy5idWZmZXJTdWJEYXRhKCkgY2FsbHMsIGJ1dCB3ZSBjb3VsZCBkbyB0aGlzIGluIG9uZSBjYWxsXHJcbiAgICAgIGJ1ZmZlckxpZ2h0c09mVHlwZShMaWdodERpcmVjdGlvbmFsLCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIsIFwidV9kaXJlY3Rpb25hbFwiKTtcclxuICAgICAgYnVmZmVyTGlnaHRzT2ZUeXBlKExpZ2h0UG9pbnQsIFwidV9uTGlnaHRzUG9pbnRcIiwgXCJ1X3BvaW50XCIpO1xyXG4gICAgICBidWZmZXJMaWdodHNPZlR5cGUoTGlnaHRTcG90LCBcInVfbkxpZ2h0c1Nwb3RcIiwgXCJ1X3Nwb3RcIik7XHJcblxyXG4gICAgICBmdW5jdGlvbiBidWZmZXJMaWdodHNPZlR5cGUoX3R5cGU6IFR5cGVPZkxpZ2h0LCBfdW5pTmFtZTogc3RyaW5nLCBfdW5pU3RydWN0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KF90eXBlKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c09mZnNldHNbX3VuaU5hbWVdLCAvLyBieXRlIG9mZnNldCBvZiB0aGUgdWludCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIgaW5zaWRlIHRoZSB1Ym9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KFtjbXBMaWdodHM/Lmxlbmd0aCA/PyAwXSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIWNtcExpZ2h0cylcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgbGlnaHREYXRhU2l6ZTogbnVtYmVyID0gNCArIDE2ICsgMTY7IC8vIHZjdENvbG9yICsgbXR4U2hhcGUgKyBtdHhTaGFwZUludmVyc2UsIGFzIGZsb2F0MzJzXHJcbiAgICAgICAgY29uc3QgbGlnaHRzRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShjbXBMaWdodHMubGVuZ3RoICogbGlnaHREYXRhU2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBpTGlnaHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY21wTGlnaHQgb2YgY21wTGlnaHRzKSB7XHJcbiAgICAgICAgICBjb25zdCBsaWdodERhdGFPZmZzZXQ6IG51bWJlciA9IGlMaWdodCAqIGxpZ2h0RGF0YVNpemU7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHZjdENvbG9yXHJcbiAgICAgICAgICBsZXQgY2xyTGlnaHQ6IENvbG9yID0gQ29sb3IuUFJPRFVDVChjbXBMaWdodC5saWdodC5jb2xvciwgY21wTGlnaHQubGlnaHQuaW50ZW5zaXR5KTtcclxuICAgICAgICAgIGxpZ2h0c0RhdGEuc2V0KGNsckxpZ2h0LmdldCgpLCBsaWdodERhdGFPZmZzZXQgKyAwKTtcclxuICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKGNsckxpZ2h0KTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgbXR4U2hhcGVcclxuICAgICAgICAgIGxldCBtdHhUb3RhbDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoY21wTGlnaHQubm9kZS5tdHhXb3JsZCwgY21wTGlnaHQubXR4UGl2b3QpO1xyXG4gICAgICAgICAgaWYgKF90eXBlID09IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IHplcm86IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgbXR4VG90YWwudHJhbnNsYXRpb24gPSB6ZXJvO1xyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZSh6ZXJvKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsaWdodHNEYXRhLnNldChtdHhUb3RhbC5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCk7IC8vIG9mZnNldCArIHZjdENvbG9yXHJcblxyXG4gICAgICAgICAgLy8gc2V0IG10eFNoYXBlSW52ZXJzZVxyXG4gICAgICAgICAgaWYgKF90eXBlICE9IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFRvdGFsKTtcclxuICAgICAgICAgICAgbGlnaHRzRGF0YS5zZXQobXR4SW52ZXJzZS5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCArIDE2KTsgLy8gb2Zmc2V0ICsgdmN0Q29sb3IgKyBtdHhTaGFwZVxyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhJbnZlcnNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUb3RhbCk7XHJcbiAgICAgICAgICBpTGlnaHQrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYnVmZmVyU3ViRGF0YShcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuVU5JRk9STV9CVUZGRVIsXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNPZmZzZXRzW191bmlTdHJ1Y3RdLCAvLyBieXRlIG9mZnNldCBvZiB0aGUgc3RydWN0IExpZ2h0IGFycmF5IGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBsaWdodHNEYXRhXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGdpdmVuIG5vZGVzIHVzaW5nIHRoZSBnaXZlbiBjYW1lcmEgYW5kIHRoZSBwb3N0IHByb2Nlc3MgY29tcG9uZW50cyBhdHRhY2hlZCB0byB0aGUgc2FtZSBub2RlIGFzIHRoZSBjYW1lcmFcclxuICAgICAqIFRoZSBvcGFxdWUgbm9kZXMgYXJlIGRyYXduIGZpcnN0LCB0aGVuIHNzYW8gaXMgYXBwbGllZCwgdGhlbiBibG9vbSBpcyBhcHBsaWVkLCB0aGVuIG5vZGVzIGFscGhhIChzb3J0Rm9yQWxwaGEpIGFyZSBkcmF3bi5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Tm9kZXMoX25vZGVzT3BhcXVlOiBJdGVyYWJsZTxOb2RlPiwgX25vZGVzQWxwaGE6IEl0ZXJhYmxlPE5vZGU+LCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGNtcEZvZzogQ29tcG9uZW50Rm9nID0gX2NtcENhbWVyYS5ub2RlPy5nZXRDb21wb25lbnQoQ29tcG9uZW50Rm9nKTtcclxuICAgICAgY29uc3QgY21wQW1iaWVudE9jY2x1c2lvbjogQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbiA9IF9jbXBDYW1lcmEubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24pO1xyXG4gICAgICBjb25zdCBjbXBCbG9vbTogQ29tcG9uZW50Qmxvb20gPSBfY21wQ2FtZXJhLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRCbG9vbSk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5idWZmZXJGb2coY21wRm9nKTtcclxuXHJcbiAgICAgIC8vIG9wYXF1ZSBwYXNzIFxyXG4gICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBkaXNhYmxpbmcgYmxlbmRpbmcgZm9yIGFsbCBvcGFxdWUgb2JqZWN0cywgdGhpcyBtaWdodCBpbXByb3ZlIHBlcmZvcm1hbmNlIFxyXG4gICAgICAvLyBhcyBvdGhlcndpc2UgdGhlIDMgY29sb3IgYXR0YWNobWVudHMgKGNvbG9yLCBwb3NpdGlvbiBhbmQgbm9ybWFscykgYWxsIG5lZWQgdG8gYmUgYmxlbmRlZFxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5kcmF3QnVmZmVycyhjbXBBbWJpZW50T2NjbHVzaW9uPy5pc0FjdGl2ZSA/IC8vIG9ubHkgdXNlIHBvc2l0aW9uIGFuZCBub3JtYWwgdGV4dHVyZXMgaWYgYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlXHJcbiAgICAgICAgW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDJdIDpcclxuICAgICAgICBbV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMF1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkJMRU5EKTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXNPcGFxdWUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd05vZGUobm9kZSwgX2NtcENhbWVyYSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG5cclxuICAgICAgLy8gYW1iaWVudCBvY2NsdXNpb24gcGFzc1xyXG4gICAgICBpZiAoY21wQW1iaWVudE9jY2x1c2lvbj8uaXNBY3RpdmUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd0FtYmllbnRPY2NsdXNpb24oX2NtcENhbWVyYSwgY21wQW1iaWVudE9jY2x1c2lvbik7XHJcblxyXG4gICAgICAvLyBibG9vbSBwYXNzXHJcbiAgICAgIGlmIChjbXBCbG9vbT8uaXNBY3RpdmUpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd0Jsb29tKGNtcEJsb29tKTtcclxuXHJcbiAgICAgIC8vIHRyYW5zcGFyZW50IHBhc3MgVE9ETzogdGhpbmsgYWJvdXQgZGlzYWJsaW5nIGRlcHRoIHdyaXRlIGZvciBhbGwgdHJhbnNwYXJlbnQgb2JqZWN0cyAtPiB0aGlzIG1pZ2h0IG1ha2UgZGVwdGggbWFzayBvcHRpb24gaW4gY29tcG9uZW50IHBhcnRpY2xlIHN5c3RlbSBvYnNvbGV0ZVxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5kcmF3QnVmZmVycyhbV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMF0pO1xyXG5cclxuICAgICAgLy8gY3JjMy5kZXB0aE1hc2soZmFsc2UpO1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIF9ub2Rlc0FscGhhKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdOb2RlKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG4gICAgICAvLyBjcmMzLmRlcHRoTWFzayh0cnVlKTtcclxuXHJcbiAgICAgIC8vIGNvcHkgZnJhbWVidWZmZXIgdG8gY2FudmFzXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVBRF9GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRFJBV19GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvVGFyZ2V0KTtcclxuICAgICAgY3JjMy5ibGl0RnJhbWVidWZmZXIoMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCwgMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9CVUZGRVJfQklUIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9CVUZGRVJfQklULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIG9jY2x1c2lvbiBvdmVyIHRoZSBjb2xvci1idWZmZXIsIHVzaW5nIHRoZSBnaXZlbiBhbWJpZW50LW9jY2x1c2lvbi1jb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3QW1iaWVudE9jY2x1c2lvbihfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9jbXBBbWJpZW50T2NjbHVzaW9uOiBDb21wb25lbnRBbWJpZW50T2NjbHVzaW9uKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIFNoYWRlckFtYmllbnRPY2NsdXNpb24udXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhQb3NpdGlvblwiKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4Tm9ybWFsLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUxLCBcInVfdGV4Tm9ybWFsXCIpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJBbWJpZW50T2NjbHVzaW9uLCBSZW5kZXJXZWJHTC50ZXhOb2lzZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMiwgXCJ1X3RleE5vaXNlXCIpO1xyXG5cclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZk5lYXJcIl0sIF9jbXBDYW1lcmEuZ2V0TmVhcigpKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkZhclwiXSwgX2NtcENhbWVyYS5nZXRGYXIoKSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZCaWFzXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5iaWFzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZlNhbXBsZVJhZGl1c1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uc2FtcGxlUmFkaXVzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uQ29uc3RhbnRcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLmF0dGVudWF0aW9uQ29uc3RhbnQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV9mQXR0ZW51YXRpb25MaW5lYXJcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLmF0dGVudWF0aW9uTGluZWFyKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uUXVhZHJhdGljXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvblF1YWRyYXRpYyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X3ZjdFJlc29sdXRpb25cIl0sIFJlbmRlcldlYkdMLmdldENhbnZhcygpLndpZHRoLCBSZW5kZXJXZWJHTC5nZXRDYW52YXMoKS5oZWlnaHQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0zZnYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfdmN0Q2FtZXJhXCJdLCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldCgpKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZEZyYW1lYnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1Bvc3QpO1xyXG4gICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuU1VCVFJBQ1RJVkUpO1xyXG4gICAgICBjcmMzLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIDAsIDMpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGJsb29tLWVmZmVjdCBvdmVyIHRoZSBjb2xvci1idWZmZXIsIHVzaW5nIHRoZSBnaXZlbiBibG9vbS1jb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Qmxvb20oX2NtcEJsb29tOiBDb21wb25lbnRCbG9vbSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBTaGFkZXJCbG9vbS51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICAvLyBleHRyYWN0IGJyaWdodCBjb2xvcnMsIGNvdWxkIG1vdmUgdGhpcyB0byBtYWluIHJlbmRlciBwYXNzIHNvIHRoYXQgaW5kaXZpZHVhbCBvYmplY3RzIGNhbiBiZSBleGVtcHQgZnJvbSBibG9vbVxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9Qb3N0KTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1swXSwgMCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNsZWFyKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9mVGhyZXNob2xkXCJdLCBfY21wQmxvb20udGhyZXNob2xkKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAwKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuXHJcbiAgICAgIC8vIGRvd25zYW1wbGVcclxuICAgICAgY29uc3QgaXRlcmF0aW9uczogbnVtYmVyID0gUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMSwgZGl2aXNvcjogbnVtYmVyID0gMjsgaSA8IGl0ZXJhdGlvbnM7IGkrKywgZGl2aXNvciAqPSAyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLndpZHRoIC8gZGl2aXNvciksIDEpO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMuaGVpZ2h0IC8gZGl2aXNvciksIDEpO1xyXG5cclxuICAgICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldLCAwKTtcclxuICAgICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5jbGVhcigpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2kgLSAxXSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCwgXCJ1X3RleFNvdXJjZVwiKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0xaShTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfaU1vZGVcIl0sIDEpO1xyXG4gICAgICAgIGNyYzMudW5pZm9ybTJmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV92Y3RUZXhlbFwiXSwgMC41IC8gd2lkdGgsIDAuNSAvIGhlaWdodCk7IC8vIGhhbGYgdGV4ZWwgc2l6ZVxyXG4gICAgICAgIC8vIGNyYzMudW5pZm9ybTJmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV92Y3RSZXNvbHV0aW9uXCJdLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELkFERElUSVZFKTtcclxuXHJcbiAgICAgIC8vIHVwc2FtcGxlXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGl0ZXJhdGlvbnMgLSAxLCBkaXZpc29yOiBudW1iZXIgPSAyICoqIChpdGVyYXRpb25zIC0gMik7IGkgPiAwOyBpLS0sIGRpdmlzb3IgLz0gMikge1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy53aWR0aCAvIGRpdmlzb3IpLCAxKTtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLmhlaWdodCAvIGRpdmlzb3IpLCAxKTtcclxuXHJcbiAgICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpIC0gMV0sIDApO1xyXG4gICAgICAgIGNyYzMudmlld3BvcnQoMCwgMCwgTWF0aC5yb3VuZCh3aWR0aCksIE1hdGgucm91bmQoaGVpZ2h0KSk7XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckJsb29tLCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaV0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAyKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0VGV4ZWxcIl0sIDAuNSAvIHdpZHRoLCAwLjUgLyBoZWlnaHQpOyAvLyBoYWxmIHRleGVsIHNpemVcclxuICAgICAgICAvLyBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0UmVzb2x1dGlvblwiXSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNyYzMudmlld3BvcnQoMCwgMCwgY3JjMy5jYW52YXMud2lkdGgsIGNyYzMuY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICBjcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4Q29sb3IsIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzWzBdLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfaU1vZGVcIl0sIDMpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZkludGVuc2l0eVwiXSwgX2NtcEJsb29tLmludGVuc2l0eSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9mSGlnaGxpZ2h0RGVzYXR1cmF0aW9uXCJdLCBfY21wQmxvb20uaGlnaGxpZ2h0RGVzYXR1cmF0aW9uKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5UUkFOU1BBUkVOVCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGEgbWVzaCBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIGluZm9zIGFuZCB0aGUgY29tcGxldGUgcHJvamVjdGlvbiBtYXRyaXhcclxuICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGRyYXdOb2RlKF9ub2RlOiBOb2RlLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICBsZXQgY21wVGV4dDogQ29tcG9uZW50VGV4dCA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRUZXh0KTtcclxuICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICBsZXQgY21wUGFydGljbGVTeXN0ZW06IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTtcclxuICAgICAgbGV0IGRyYXdQYXJ0aWNsZXM6IGJvb2xlYW4gPSBjbXBQYXJ0aWNsZVN5c3RlbSAmJiBjbXBQYXJ0aWNsZVN5c3RlbS5pc0FjdGl2ZTtcclxuICAgICAgbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuZ2V0U2hhZGVyKCk7XHJcbiAgICAgIGlmIChkcmF3UGFydGljbGVzKVxyXG4gICAgICAgIHNoYWRlciA9IGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtLmdldFNoYWRlckZyb20oc2hhZGVyKTtcclxuXHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBtdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0ID0gY21wTWVzaC5tdHhXb3JsZDtcclxuXHJcbiAgICAgIGlmIChjbXBUZXh0Py5pc0FjdGl2ZSlcclxuICAgICAgICBtdHhNZXNoVG9Xb3JsZCA9IGNtcFRleHQudXNlUmVuZGVyRGF0YShtdHhNZXNoVG9Xb3JsZCwgX2NtcENhbWVyYSk7XHJcblxyXG4gICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gUmVuZGVyV2ViR0wuY2FsY01lc2hUb1ZpZXcoX25vZGUsIG10eE1lc2hUb1dvcmxkLCBfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3LCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSBjbXBNZXNoLm1lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIG10eE1lc2hUb1dvcmxkLCBtdHhNZXNoVG9WaWV3KTtcclxuXHJcbiAgICAgIGlmIChjbXBNZXNoLnNrZWxldG9uPy5pc0FjdGl2ZSlcclxuICAgICAgICBjbXBNZXNoLnNrZWxldG9uLnVzZVJlbmRlckJ1ZmZlcihzaGFkZXIpO1xyXG5cclxuICAgICAgbGV0IHVuaWZvcm06IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gc2hhZGVyLnVuaWZvcm1zW1widV92Y3RDYW1lcmFcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMudW5pZm9ybTNmdih1bmlmb3JtLCBfY21wQ2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBzaGFkZXIudW5pZm9ybXNbXCJ1X210eFdvcmxkVG9WaWV3XCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9jbXBDYW1lcmEubXR4V29ybGRUb1ZpZXcuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IHNoYWRlci51bmlmb3Jtc1tcInVfbXR4V29ybGRUb0NhbWVyYVwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pIHtcclxuICAgICAgICAvLyBsZXQgbXR4V29ybGRUb0NhbWVyYTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0lPTihfY21wQ2FtZXJhLm10eFdvcmxkKTsgLy8gdG9kbzogb3B0aW1pemUvc3RvcmUgaW4gY2FtZXJhXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfY21wQ2FtZXJhLm10eENhbWVyYUludmVyc2UuZ2V0KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB1bmlmb3JtID0gc2hhZGVyLnVuaWZvcm1zW1widV9mQWxwaGFDbGlwXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm0xZih1bmlmb3JtLCBjbXBNYXRlcmlhbC5tYXRlcmlhbC5hbHBoYUNsaXApO1xyXG5cclxuICAgICAgaWYgKGRyYXdQYXJ0aWNsZXMpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuZHJhd1BhcnRpY2xlcyhjbXBQYXJ0aWNsZVN5c3RlbSwgc2hhZGVyLCByZW5kZXJCdWZmZXJzLCBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50RmFjZUNhbWVyYSkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIHJlbmRlckJ1ZmZlcnMubkluZGljZXMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd1BhcnRpY2xlcyhfY21wUGFydGljbGVTeXN0ZW06IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtLCBfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzLCBfY21wRmFjZUNhbWVyYTogQ29tcG9uZW50RmFjZUNhbWVyYSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY3JjMy5kZXB0aE1hc2soX2NtcFBhcnRpY2xlU3lzdGVtLmRlcHRoTWFzayk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShfY21wUGFydGljbGVTeXN0ZW0uYmxlbmRNb2RlKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfaUJsZW5kTW9kZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLmJsZW5kTW9kZSk7XHJcbiAgICAgIF9jbXBQYXJ0aWNsZVN5c3RlbS51c2VSZW5kZXJEYXRhKCk7XHJcblxyXG4gICAgICBjcmMzLnVuaWZvcm0xZihfc2hhZGVyLnVuaWZvcm1zW1widV9mUGFydGljbGVTeXN0ZW1EdXJhdGlvblwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLmR1cmF0aW9uKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtU2l6ZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLnNpemUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihfc2hhZGVyLnVuaWZvcm1zW1widV9mUGFydGljbGVTeXN0ZW1UaW1lXCJdLCBfY21wUGFydGljbGVTeXN0ZW0udGltZSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5QQVJUSUNMRS5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5QQVJUSUNMRS5JTkRFWCk7XHJcblxyXG4gICAgICBsZXQgZmFjZUNhbWVyYTogYm9vbGVhbiA9IF9jbXBGYWNlQ2FtZXJhICYmIF9jbXBGYWNlQ2FtZXJhLmlzQWN0aXZlO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1widV9iUGFydGljbGVTeXN0ZW1GYWNlQ2FtZXJhXCJdLCBmYWNlQ2FtZXJhID8gMSA6IDApO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1widV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdFwiXSwgZmFjZUNhbWVyYSAmJiBfY21wRmFjZUNhbWVyYS5yZXN0cmljdCA/IDEgOiAwKTtcclxuXHJcbiAgICAgIGNyYzMuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCBfcmVuZGVyQnVmZmVycy5uSW5kaWNlcywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCwgX2NtcFBhcnRpY2xlU3lzdGVtLnNpemUpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlRSQU5TUEFSRU5UKTtcclxuICAgICAgY3JjMy5kZXB0aE1hc2sodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2FsY01lc2hUb1ZpZXcoX25vZGU6IE5vZGUsIF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfbXR4V29ybGRUb1ZpZXc6IE1hdHJpeDR4NCwgX3RhcmdldD86IFZlY3RvcjMpOiBNYXRyaXg0eDQge1xyXG4gICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGEgUmVuZGVyIGZ1bmN0aW9uIGFzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIHdpdGggV2ViR0xcclxuICAgICAgbGV0IGNtcEZhY2VDYW1lcmE6IENvbXBvbmVudEZhY2VDYW1lcmEgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50RmFjZUNhbWVyYSk7XHJcbiAgICAgIGlmIChjbXBGYWNlQ2FtZXJhICYmIGNtcEZhY2VDYW1lcmEuaXNBY3RpdmUpIHtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0OyAvLyBtZXNoIHRvIHdvcmxkP1xyXG4gICAgICAgIG10eE1lc2hUb1ZpZXcgPSBfbXR4TWVzaFRvV29ybGQuY2xvbmU7XHJcbiAgICAgICAgbXR4TWVzaFRvVmlldy5sb29rQXQoX3RhcmdldCwgY21wRmFjZUNhbWVyYS51cExvY2FsID8gbnVsbCA6IGNtcEZhY2VDYW1lcmEudXAsIGNtcEZhY2VDYW1lcmEucmVzdHJpY3QpO1xyXG4gICAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVChfbXR4V29ybGRUb1ZpZXcsIG10eE1lc2hUb1ZpZXcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eFdvcmxkVG9WaWV3LCBfbXR4TWVzaFRvV29ybGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJpbmRUZXh0dXJlKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX3RleHR1cmU6IFdlYkdMVGV4dHVyZSwgX3VuaXQ6IG51bWJlciwgX3VuaWZvcm06IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoX3VuaXQpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgX3RleHR1cmUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW191bmlmb3JtXSwgX3VuaXQgLSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZXMgV2ViR0wgQnVmZmVyIHRoZSBkYXRhIGZyb20gdGhlIHtAbGluayBUZXh0dXJlfVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvclRleHR1cmUgZXh0ZW5kcyBSZW5kZXJJbmplY3RvciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3IuaW5qZWN0KF9jb25zdHJ1Y3RvciwgUmVuZGVySW5qZWN0b3JUZXh0dXJlKTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZGVsZXRlUmVuZGVyRGF0YVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yVGV4dHVyZS5kZWxldGVSZW5kZXJEYXRhXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0VGV4dHVyZSh0aGlzOiBUZXh0dXJlLCBfdGV4dHVyZVVuaXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTApOiB2b2lkIHtcclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJEYXRhKVxyXG4gICAgICAgIHRoaXMucmVuZGVyRGF0YSA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFRleHR1cmU+KGNyYzMuY3JlYXRlVGV4dHVyZSgpKTsgLy8gVE9ETzogY2hlY2sgaWYgYWxsIFdlYkdMLUNyZWF0aW9ucyBhcmUgYXNzZXJ0ZWRcclxuXHJcbiAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShfdGV4dHVyZVVuaXQpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgdGhpcy5yZW5kZXJEYXRhKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRleHR1cmVEaXJ0eSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBBbHdheXMgcHJlbXVsdGlwbHkgYWxwaGEgd2hpbGUgbG9hZGluZyB0ZXh0dXJlc1xyXG4gICAgICAgICAgY3JjMy5waXhlbFN0b3JlaShjcmMzLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgdGhpcy50ZXhJbWFnZVNvdXJjZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNyYzMucGl4ZWxTdG9yZWkoY3JjMy5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLm1pcG1hcERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihfZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubWlwbWFwRGlydHkpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMubWlwbWFwKSB7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5DUklTUDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgTUlQTUFQLk1FRElVTTpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1RfTUlQTUFQX0xJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMuZ2VuZXJhdGVNaXBtYXAoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5CTFVSUlk6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUl9NSVBNQVBfTElORUFSKTtcclxuICAgICAgICAgICAgY3JjMy5nZW5lcmF0ZU1pcG1hcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgTUlQTUFQLlNNT09USDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWlwbWFwRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMud3JhcERpcnR5KSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLndyYXApIHtcclxuICAgICAgICAgIGNhc2UgV1JBUC5SRVBFQVQ6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgV1JBUC5DTEFNUDpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuTUlSUk9SOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTUlSUk9SRURfUkVQRUFUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndyYXBEaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJEYXRhKHRoaXM6IFRleHR1cmUpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnJlbmRlckRhdGEpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIHRoaXMucmVuZGVyRGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMud3JhcERpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGNvbnN0IGVudW0gRVZFTlRfUEhZU0lDUyB7XHJcbiAgICBUUklHR0VSX0VOVEVSID0gXCJUcmlnZ2VyRW50ZXJlZENvbGxpc2lvblwiLFxyXG4gICAgVFJJR0dFUl9FWElUID0gXCJUcmlnZ2VyTGVmdENvbGxpc2lvblwiLFxyXG4gICAgQ09MTElTSU9OX0VOVEVSID0gXCJDb2xsaWRlckVudGVyZWRDb2xsaXNpb25cIixcclxuICAgIENPTExJU0lPTl9FWElUID0gXCJDb2xsaWRlckxlZnRDb2xsaXNpb25cIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3BlY2lhbCB0eXBlIG9mIHtAbGluayBFdmVudH0gZm9yIHBoeXNpY3MuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50UGh5c2ljcyBleHRlbmRzIEV2ZW50IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcG9uZW50UmlnaWRib2R5IHRoYXQgY29sbGlkZWQgd2l0aCB0aGlzIENvbXBvbmVudFJpZ2lkYm9keVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBub3JtYWwgaW1wdWxzZSBiZXR3ZWVuIHRoZSB0d28gY29sbGlkaW5nIG9iamVjdHMuIE5vcm1hbCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGltcHVsc2UuXHJcbiAgICAgKiBJbXB1bHNlIGlzIG9ubHkgaGFwcGVuaW5nIG9uIENPTExJU0lPTl9FTlRFUiwgc28gdGhlcmUgaXMgbm8gaW1wdWxzZSBvbiBleGl0IG5vciBvbiB0cmlnZ2Vycy5cclxuICAgICAqIFVzZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGNtcFJpZ2lkYm9keSB0byBkZXRlcm1pbmUgdGhlIGludGVuc2l0eSBvZiB0aGUgRVZFTlQgaW5zdGVhZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbEltcHVsc2U6IG51bWJlcjtcclxuICAgIHB1YmxpYyB0YW5nZW50SW1wdWxzZTogbnVtYmVyO1xyXG4gICAgcHVibGljIGJpbm9tYWxJbXB1bHNlOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIHBvaW50IHdoZXJlIHRoZSBjb2xsaXNpb24vdHJpZ2dlcmluZyBpbml0aWFsbHkgaGFwcGVuZWQuIFRoZSBjb2xsaXNpb24gcG9pbnQgZXhpc3RzIG9ubHkgb24gQ09MTElTSU9OX0VOVEVSIC8gVFJJR0dFUl9FTlRFUi4gKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25Qb2ludDogVmVjdG9yMztcclxuICAgIC8qKiBUaGUgbm9ybWFsIHZlY3RvciBvZiB0aGUgY29sbGlzaW9uLiBPbmx5IGV4aXN0aW5nIG9uIENPTExJU0lPTl9FTlRFUiAqL1xyXG4gICAgcHVibGljIGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMztcclxuXHJcbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBldmVudCBjdXN0b21pemVkIGZvciBwaHlzaWNzLiBIb2xkaW5nIGluZm9ybWF0aW9ucyBhYm91dCBpbXB1bHNlcy4gQ29sbGlzaW9uIHBvaW50IGFuZCB0aGUgYm9keSB0aGF0IGlzIGNvbGxpZGluZyAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBFVkVOVF9QSFlTSUNTLCBfaGl0UmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHksIF9ub3JtYWxJbXB1bHNlOiBudW1iZXIsIF90YW5nZW50SW1wdWxzZTogbnVtYmVyLCBfYmlub3JtYWxJbXB1bHNlOiBudW1iZXIsIF9jb2xsaXNpb25Qb2ludDogVmVjdG9yMyA9IG51bGwsIF9jb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjMgPSBudWxsKSB7XHJcbiAgICAgIHN1cGVyKF90eXBlKTtcclxuICAgICAgdGhpcy5jbXBSaWdpZGJvZHkgPSBfaGl0UmlnaWRib2R5O1xyXG4gICAgICB0aGlzLm5vcm1hbEltcHVsc2UgPSBfbm9ybWFsSW1wdWxzZTtcclxuICAgICAgdGhpcy50YW5nZW50SW1wdWxzZSA9IF90YW5nZW50SW1wdWxzZTtcclxuICAgICAgdGhpcy5iaW5vbWFsSW1wdWxzZSA9IF9iaW5vcm1hbEltcHVsc2U7XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uUG9pbnQgPSBfY29sbGlzaW9uUG9pbnQ7XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uTm9ybWFsID0gX2NvbGxpc2lvbk5vcm1hbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogR3JvdXBzIHRvIHBsYWNlIGEgbm9kZSBpbiwgbm90IGV2ZXJ5IGdyb3VwIHNob3VsZCBjb2xsaWRlIHdpdGggZXZlcnkgZ3JvdXAuIFVzZSBhIE1hc2sgaW4gdG8gZXhjbHVkZSBjb2xsaXNpb25zXHJcbiAgKi9cclxuICBleHBvcnQgZW51bSBDT0xMSVNJT05fR1JPVVAgeyAvL1RPRE8gR2l2ZSBhIHBvc3NpYmxpdGh5IHRvIHNldCB3aGljaCBsYXllciBjb2xsaWRlcyB3aXRoIHdoaWNoLCBDb2xsaXNpb25NYXRyaXg/XHJcbiAgICBERUZBVUxUID0gMSxcclxuICAgIEdST1VQXzEgPSAyLFxyXG4gICAgR1JPVVBfMiA9IDQsXHJcbiAgICBHUk9VUF8zID0gOCxcclxuICAgIEdST1VQXzQgPSAxNixcclxuICAgIEdST1VQXzUgPSAzMlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSByaWdpZGJvZHkgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgd2F5IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwaHlzaWNhbCBhbmQgdGhlIHZpc3VhbCB3b3JsZFxyXG4gICovXHJcbiAgZXhwb3J0IGVudW0gQk9EWV9UWVBFIHtcclxuICAgIC8qKiBUaGUgYm9keSBpZ25vcmVzIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHJlbmRlciBncmFwaCwgaXMgY29tcGxldGVseSBjb250cm9sbGVkICBieSBwaHlzaWNzIGFuZCB0YWtlcyBpdHMgbm9kZSB3aXRoIGl0ICAqL1xyXG4gICAgRFlOQU1JQywgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQyxcclxuICAgIC8qKiBUaGUgYm9keSBpZ25vcmVzIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHJlbmRlciBncmFwaCwgaXMgY29tcGxldGVseSBpbW1vdmVibGUgYW5kIGtlZXBzIGl0cyBub2RlIGZyb20gbW92aW5nICAqL1xyXG4gICAgU1RBVElDLCAvLyA9IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUMsXHJcbiAgICAvKiogVGhlIGJvZHkgaXMgY29udHJvbGxlZCBieSBpdHMgbm9kZSBhbmQgbW92ZXMgd2l0aCBpdCwgd2hpbGUgaXQgaW1wYWN0cyB0aGUgcGh5c2ljYWwgd29ybGQgZS5nLiBieSBjb2xsaXNpb25zICovXHJcbiAgICBLSU5FTUFUSUMgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuS0lORU1BVElDXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIERpZmZlcmVudCB0eXBlcyBvZiBjb2xsaWRlciBzaGFwZXMsIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgaW4gc2NhbGluZyBCT1ggPSBWZWN0b3IzKGxlbmd0aCwgaGVpZ2h0LCBkZXB0aCksXHJcbiAgKiBTUEhFUkUgPSBWZWN0b3IzKGRpYW1ldGVyLCB4LCB4KSwgQ0FQU1VMRSA9IFZlY3RvcjMoZGlhbWV0ZXIsIGhlaWdodCwgeCksIENZTElOREVSID0gVmVjdG9yMyhkaWFtZXRlciwgaGVpZ2h0LCB4KSxcclxuICAqIENPTkUgPSBWZWN0b3IoZGlhbWV0ZXIsIGhlaWdodCwgeCksIFBZUkFNSUQgPSBWZWN0b3IzKGxlbmd0aCwgaGVpZ2h0LCBkZXB0aCk7IHggPT0gdW51c2VkLlxyXG4gICogQ09OVkVYID0gQ29tcG9uZW50TWVzaCBuZWVkcyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIFJCIFByb3BlcnR5IGNvbnZleE1lc2gsIHRoZSBwb2ludHMgb2YgdGhhdCBjb21wb25lbnQgYXJlIHVzZWQgdG8gY3JlYXRlIGEgY29sbGlkZXIgdGhhdCBtYXRjaGVzLFxyXG4gICogdGhlIGNsb3Nlc3QgcG9zc2libGUgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBmb3JtLCBpbiBmb3JtIG9mIGEgaHVsbC4gQ29udmV4IGlzIGV4cGVyaW1lbnRhbCBhbmQgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB2ZXJ0aWNlc1xyXG4gICogYXJlIHRvbyBjbG9zZSB0byBvbmUgYW5vdGhlciBhbmQgdGhlIGdpdmVuIHZlcnRpY2VzIGRvIG5vdCBmb3JtIGEgaW4gaXRzZWxmIGNsb3NlZCBzaGFwZSBhbmQgaGF2aW5nIGEgZ2VudXMgb2YgMCAobm8gaG9sZXMpLiBWZXJ0aWNlcyBpbiB0aGUgQ29tcG9uZW50TWVzaCBjYW4gYmUgc2NhbGVkIGRpZmZlcmVudGx5IFxyXG4gICogZm9yIHRleHR1cmluZy9ub3JtYWwgb3Igb3RoZXIgcmVhc29ucywgc28gdGhlIGNvbGxpZGVyIG1pZ2h0IGJlIG9mZiBjb21wYXJlZCB0byB0aGUgdmlzdWFsIHNoYXBlLCB0aGlzIGNhbiBiZSBjb3JyZWN0ZWQgYnkgY2hhbmdpbmcgdGhlIHBpdm90IHNjYWxlIG9mIHRoZSBDb21wb25lbnRSaWdpZGJvZHkuICBcclxuICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTExJREVSX1RZUEUge1xyXG4gICAgQ1VCRSxcclxuICAgIFNQSEVSRSxcclxuICAgIENBUFNVTEUsXHJcbiAgICBDWUxJTkRFUixcclxuICAgIENPTkUsXHJcbiAgICBQWVJBTUlELFxyXG4gICAgQ09OVkVYXHJcbiAgfVxyXG5cclxuICAvKiogRGlzcGxheWluZyBkaWZmZXJlbnQgdHlwZXMgb2YgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHBoeXNpYyBmZWF0dXJlcy4gRGVmYXVsdCA9IEpPSU5UU19BTkRfQ09MTElERVIuICovXHJcbiAgZXhwb3J0IGVudW0gUEhZU0lDU19ERUJVR01PREUge1xyXG4gICAgTk9ORSxcclxuICAgIENPTExJREVSUyxcclxuICAgIEpPSU5UU19BTkRfQ09MTElERVIsXHJcbiAgICBCT1VORElOR19CT1hFUyxcclxuICAgIENPTlRBQ1RTLFxyXG4gICAgUEhZU0lDX09CSkVDVFNfT05MWVxyXG4gIH1cclxuXHJcbiAgLyoqIEluZm8gYWJvdXQgUmF5Y2FzdHMgc2hvdCBmcm9tIHRoZSBwaHlzaWNzIHN5c3RlbS4gKi9cclxuICBleHBvcnQgY2xhc3MgUmF5SGl0SW5mbyBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgaGl0OiBib29sZWFuO1xyXG4gICAgcHVibGljIGhpdERpc3RhbmNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaGl0UG9pbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByaWdpZGJvZHlDb21wb25lbnQ6IENvbXBvbmVudFJpZ2lkYm9keTtcclxuICAgIHB1YmxpYyBoaXROb3JtYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByYXlFbmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHB1YmxpYyByYXlPcmlnaW46IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmhpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhpdERpc3RhbmNlID0gMDtcclxuICAgICAgdGhpcy5oaXRQb2ludC5yZWN5Y2xlKCk7XHJcbiAgICAgIHRoaXMucmlnaWRib2R5Q29tcG9uZW50ID0gbnVsbDtcclxuICAgICAgdGhpcy5oaXROb3JtYWwucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJheU9yaWdpbi5yZWN5Y2xlKCk7XHJcbiAgICAgIHRoaXMucmF5RW5kLnJlY3ljbGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBHZW5lcmFsIHNldHRpbmdzIGZvciB0aGUgcGh5c2ljIHNpbXVsYXRpb24gYW5kIHRoZSBkZWJ1ZyBvZiBpdC4gKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc1NldHRpbmdzIHtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2RlZmF1bHRDb2xsaXNpb25Hcm91cDogbnVtYmVyLCBfZGVmYXVsdENvbGxpc2lvbk1hc2s6IG51bWJlcikge1xyXG4gICAgICBpZiAodHlwZW9mIE9JTU8gPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbGxpc2lvbkdyb3VwID0gX2RlZmF1bHRDb2xsaXNpb25Hcm91cDtcclxuICAgICAgdGhpcy5kZWZhdWx0Q29sbGlzaW9uTWFzayA9IF9kZWZhdWx0Q29sbGlzaW9uTWFzaztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hhbmdlIGlmIHJpZ2lkYm9kaWVzIGFyZSBhYmxlIHRvIHNsZWVwIChkb24ndCBiZSBjb25zaWRlcmVkIGluIHBoeXNpY2FsIGNhbGN1bGF0aW9ucykgd2hlbiB0aGVpciBtb3ZlbWVudCBpcyBiZWxvdyBhIHRocmVzaG9sZC4gRGVhY3RpdmF0aW9uIGlzIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UgZm9yIG1pbm9yIGFkdmFudGFnZSBpbiBwcmVjaXNpb24uICovXHJcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVTbGVlcGluZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kaXNhYmxlU2xlZXBpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRpc2FibGVTbGVlcGluZyhfdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRpc2FibGVTbGVlcGluZyA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKiBTbGVlcGluZyBUaHJlc2hvbGQgZm9yIE1vdmVtZW50IFZlbG9jdGl5LiAqL1xyXG4gICAgcHVibGljIGdldCBzbGVlcGluZ1ZlbG9jaXR5VGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2xlZXBpbmcgVGhyZXNob2xkIGZvciBSb3RhdGlvbiBWZWxvY2l0eS4gKi9cclxuICAgIHB1YmxpYyBnZXQgc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5zbGVlcGluZ0FuZ3VsYXJWZWxvY2l0eVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLnNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaHJlc2hvbGQgaG93IGxvbmcgdGhlIFJpZ2lkYm9keSBtdXN0IGJlIGJlbG93L2Fib3ZlIHRoZSB0aHJlc2hvbGQgdG8gY291bnQgYXMgc2xlZXBpbmcuICovXHJcbiAgICBwdWJsaWMgZ2V0IHNsZWVwaW5nVGltZVRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLnNsZWVwaW5nVGltZVRocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2xlZXBpbmdUaW1lVGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5zbGVlcGluZ1RpbWVUaHJlc2hvbGQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVycm9yIHRocmVzaG9sZC4gRGVmYXVsdCBpcyAwLjA1LiBUaGUgaGlnaGVyIHRoZSBtb3JlIGxpa2VseSBjb2xsaXNpb25zIGdldCBkZXRlY3RlZCBiZWZvcmUgYWN0dWFsIGltcGFjdCBhdCBoaWdoIHNwZWVkcyBidXQgaXQncyB2aXN1YWxseSBsZXNzIGFjY3VyYXRlLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uTWFyZ2luKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEdKS01hcmdpbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbk1hcmdpbihfdGhpY2tuZXNzOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRHSktNYXJnaW4gPSBfdGhpY2tuZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZGVmYXVsdCBhcHBsaWVkIGZyaWN0aW9uIGJldHdlZW4gdHdvIHJpZ2lkYm9kaWVzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuIEhvdyBtdWNoIHZlbG9jaXR5IGlzIHNsb3dlZCBkb3duIHdoZW4gbW92aW5nIGFjY3Jvc3MgdGhpcyBzdXJmYWNlLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0RnJpY3Rpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0RnJpY3Rpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRGcmljdGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdEZyaWN0aW9uID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBCb3VuY2luZXNzIG9mIHJpZ2lkYm9kaWVzLiBIb3cgbXVjaCBvZiB0aGUgaW1wYWN0IGlzIHJlc3RpdHV0ZWQuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRSZXN0aXR1dGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRSZXN0aXR1dGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdFJlc3RpdHV0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0UmVzdGl0dXRpb24gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdyb3VwcyB0aGUgZGVmYXVsdCByaWdpZGJvZHkgd2lsbCBjb2xsaWRlIHdpdGguIFNldCBpdCBsaWtlOiAoUEhZU0lDU19HUk9VUC5ERUZBVUxUIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8xIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8yIHwgUEhZU0lDU19HUk9VUC5HUk9VUF8zKSBcclxuICAgICAqIHRvIGNvbGxpZGUgd2l0aCBtdWx0aXBsZSBncm91cHMuIERlZmF1bHQgaXMgY29sbGlzaW9uIHdpdGggZXZlcnl0aGluZyBidXQgdHJpZ2dlcnMuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uTWFzaygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25NYXNrO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29sbGlzaW9uTWFzayhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdENvbGxpc2lvbk1hc2sgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBncm91cCB0aGF0IHRoaXMgcmlnaWRib2R5IGJlbG9uZ3MgdG8uIERlZmF1bHQgaXMgdGhlIERFRkFVTFQgR3JvdXAgd2hpY2ggbWVhbnMgaXRzIGp1c3QgYSBub3JtYWwgUmlnaWRib2R5IG5vdCBhIHRyaWdnZXIgbm9yIGFueXRoaW5nIHNwZWNpYWwuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb2xsaXNpb25Hcm91cCgpOiBDT0xMSVNJT05fR1JPVVAge1xyXG4gICAgICByZXR1cm4gPENPTExJU0lPTl9HUk9VUD5PSU1PLlNldHRpbmcuZGVmYXVsdENvbGxpc2lvbkdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29sbGlzaW9uR3JvdXAoX3ZhbHVlOiBDT0xMSVNJT05fR1JPVVApIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25Hcm91cCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hhbmdlIHRoZSB0eXBlIG9mIGpvaW50IHNvbHZlciBhbGdvcml0aG0uIERlZmF1bHQgSXRlcmF0aXZlID09IDAsIGlzIGZhc3RlciBidXQgbGVzcyBzdGFibGUuIERpcmVjdCA9PSAxLCBzbG93IGJ1dCBtb3JlIHN0YWJsZSwgcmVjb21tZW5kZWQgZm9yIGNvbXBsZXggam9pbnQgd29yay4gQ2hhbmdlIHRoaXMgc2V0dGluZyBvbmx5IGF0IHRoZSBzdGFydCBvZiB5b3VyIGdhbWUuICovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb25zdHJhaW50U29sdmVyVHlwZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludENvbnN0cmFpbnRTb2x2ZXJUeXBlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29uc3RyYWludFNvbHZlclR5cGUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludENvbnN0cmFpbnRTb2x2ZXJUeXBlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY29ycmVjdGlvbiBhbGdvcml0aG0gdXNlZCB0byBjb3JyZWN0IHBoeXNpY3MgY2FsY3VsYXRpb25zLiBDaGFuZ2UgdGhpcyBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgeW91ciBnYW1lLiBFYWNoIGhhcyBkaWZmZXJlbnQgYXBwcm9hY2hlcywgc28gaWYgeW91IGhhdmUgcHJvYmxlbXMgdGVzdCBhbm90aGVyXHJcbiAgICAgKiAgRGVmYXVsdCAwID0gQmF1bWdhcnRlIChmYXN0IGJ1dCBsZXNzIGNvcnJlY3QgaW5kdWNlcyBzb21lIGVuZXJneSBlcnJvcnMpLCAxID0gU3BsaXQtSW1wdWxzZSAoZmFzdCBhbmQgbm8gZW5nZXJ5IGVycm9ycywgYnV0IG1vcmUgaW5hY2N1cmF0ZSBmb3Igam9pbnRzKSwgMiA9IE5vbi1saW5lYXIgR2F1c3MgU2VpZGVsIChzbG93ZXN0IGJ1dCBtb3N0IGFjY3VyYXRlKSovXHJcbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDb3JyZWN0aW9uQWxnb3JpdGhtKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEpvaW50UG9zaXRpb25Db3JyZWN0aW9uQWxnb3JpdGhtO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q29ycmVjdGlvbkFsZ29yaXRobShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdEpvaW50UG9zaXRpb25Db3JyZWN0aW9uQWxnb3JpdGhtID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBzaW11bGF0aW9uIGluIGZvcm0gb2YgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhlIHNpbXVsYXRpb25zIHJ1bnMgdGhyb3VnaCB1bnRpbCBpdCBhY2NlcHRzIHRoZSByZXN1bHQuXHJcbiAgICAgKiAgMTAgRGVmYXVsdCAtIEhpZ2hlciBtZWFucyBtb3JlIHByZWNpc2lvbiBidXQgcmVzdWx0cyBpbiBhIHBlcmZvcm1hbmNlIGRlY3JlYXNlLiBUaGlzIGhlbHBzIGVzcGVjaWFsbHkgd2l0aCBqb2ludHMsXHJcbiAgICAgKiBidXQgYWxzbyB0aGUgZ2VuZXJhbCBzdGFiaWxpdHkgb2YgdGhlIHNpbXVsYXRpb24gZHVlIHRvIHNpbXVsYXRpb24gc3RlcHMgYmVpbmcgcmVjaGVja2VkIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBiZWluZyBzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc29sdmVySXRlcmF0aW9ucygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5nZXROdW1Qb3NpdGlvbkl0ZXJhdGlvbnMoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc29sdmVySXRlcmF0aW9ucyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBQaHlzaWNzLmFjdGl2ZUluc3RhbmNlLmdldE9pbW9Xb3JsZCgpLnNldE51bVBvc2l0aW9uSXRlcmF0aW9ucyhfdmFsdWUpO1xyXG4gICAgICBQaHlzaWNzLmFjdGl2ZUluc3RhbmNlLmdldE9pbW9Xb3JsZCgpLnNldE51bVZlbG9jaXR5SXRlcmF0aW9ucyhfdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQWN0cyBhcyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHtAbGluayBOb2RlfSdzLlxyXG4gICAgICogVGhlIHR5cGUgb2YgY29ubmNldGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBzdWJjbGFzc2VzIGxpa2UgcHJpc21hdGljIGpvaW50LCBjeWxpbmRlciBqb2ludCBldGMuXHJcbiAgICAgKiBBIFJpZ2lkYm9keSBvbiB0aGUge0BsaW5rIE5vZGV9IHRoYXQgdGhpcyBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXMgbmVlZGVkLiBTZXR0aW5nIHRoZSBjb25uZWN0ZWRSaWdpZGJvZHkgYW5kXHJcbiAgICAgKiBpbml0aWFsaXppbmcgdGhlIGNvbm5lY3Rpb24gY3JlYXRlcyBhIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGVtLiBUaGlzIGRpZmZlcnMgZnJvbSBhIGNvbm5lY3Rpb24gdGhyb3VnaCBoaWVyYXJjaHlcclxuICAgICAqIGluIHRoZSBub2RlIHN0cnVjdHVyZSBvZiBmdWRnZS4gSm9pbnRzIGNhbiBoYXZlIGRpZmZlcmVudCBET0YncyAoRGVncmVlcyBPZiBGcmVlZG9tKSwgMSBBeGlzIHRoYXQgY2FuIGVpdGhlciB0d2lzdCBvciBzd2luZyBpcyBhIGRlZ3JlZSBvZiBmcmVlZG9tLlxyXG4gICAgICogQSBqb2ludCB0eXBpY2FsbHkgY29uc2lzdHMgb2YgYSBtb3RvciB0aGF0IGxpbWl0cyBtb3ZlbWVudC9yb3RhdGlvbiBvciBpcyBhY3Rpdmx5IHRyeWluZyB0byBtb3ZlIHRvIGEgbGltaXQuIEFuZCBhIHNwcmluZyB3aGljaCBkZWZpbmVzIHRoZSByaWdpZGl0eS5cclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjBcclxuICAgICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2ludCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICAvKiogcmVmZXJzIGJhY2sgdG8gdGhpcyBjbGFzcyBmcm9tIGFueSBzdWJjbGFzcyBlLmcuIGluIG9yZGVyIHRvIGZpbmQgY29tcGF0aWJsZSBvdGhlciByZXNvdXJjZXMqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBiYXNlQ2xhc3M6IHR5cGVvZiBKb2ludCA9IEpvaW50O1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgSm9pbnRbXSA9IFtdO1xyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRKb2ludCk7XHJcbiAgICBwcm90ZWN0ZWQgc2luZ2xldG9uOiBib29sZWFuID0gZmFsc2U7IC8vTXVsdGlwbGUgam9pbnRzIGNhbiBiZSBhdHRhY2hlZCB0byBvbmUgTm9kZVxyXG5cclxuICAgICNpZEJvZHlBbmNob3I6IG51bWJlciA9IDA7XHJcbiAgICAjaWRCb2R5VGllZDogbnVtYmVyID0gMDtcclxuICAgICNib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICAjYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keTtcclxuXHJcbiAgICAjY29ubmVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAjYW5jaG9yOiBPSU1PLlZlYzM7XHJcbiAgICAjaW50ZXJuYWxDb2xsaXNpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAjYnJlYWtGb3JjZTogbnVtYmVyID0gMDtcclxuICAgICNicmVha1RvcnF1ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbmFtZUNoaWxkVG9Db25uZWN0OiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGpvaW50OiBPSU1PLkpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbmZpZzogT0lNTy5Kb2ludENvbmZpZztcclxuXHJcbiAgICAvKiogQ3JlYXRlIGEgam9pbnQgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gUmlnaWRib2R5Q29tcG9uZW50cy4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYm9keUFuY2hvciA9IF9ib2R5QW5jaG9yO1xyXG4gICAgICB0aGlzLmJvZHlUaWVkID0gX2JvZHlUaWVkO1xyXG5cclxuICAgICAgLypcclxuICAgICAgICBUZWxsIHRoZSBwaHlzaWNzIHRoYXQgdGhlcmUgaXMgYSBuZXcgam9pbnQgYW5kIG9uIHRoZSBwaHlzaWNzIHN0YXJ0IHRoZSBhY3R1YWwgam9pbnQgaXMgZmlyc3QgY3JlYXRlZC4gVmFsdWVzIGNhbiBiZSBzZXQgYnV0IHRoZVxyXG4gICAgICAgIGFjdHVhbCBjb25zdHJhaW50IGFpbid0IGV4aXN0ZW50IHVudGlsIHRoZSBnYW1lIHN0YXJ0c1xyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgSm9pbnQpOiBudW1iZXIgeyByZXR1cm4gSm9pbnQuc3ViY2xhc3Nlcy5wdXNoKF9zdWJjbGFzcykgLSAxOyB9XHJcblxyXG4gICAgLyoqIEdldC9TZXQgdGhlIGZpcnN0IENvbXBvbmVudFJpZ2lkYm9keSBvZiB0aGlzIGNvbm5lY3Rpb24uIEl0IHNob3VsZCBhbHdheXMgYmUgdGhlIG9uZSB0aGF0IHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvbyBpbiB0aGUgc2NlbmVUcmVlLiAqL1xyXG4gICAgcHVibGljIGdldCBib2R5QW5jaG9yKCk6IENvbXBvbmVudFJpZ2lkYm9keSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNib2R5QW5jaG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYm9keUFuY2hvcihfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSkge1xyXG4gICAgICB0aGlzLiNpZEJvZHlBbmNob3IgPSBfY21wUkIgIT0gbnVsbCA/IF9jbXBSQi5pZCA6IC0xO1xyXG4gICAgICB0aGlzLiNib2R5QW5jaG9yID0gX2NtcFJCO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQvU2V0IHRoZSBzZWNvbmQgQ29tcG9uZW50UmlnaWRib2R5IG9mIHRoaXMgY29ubmVjdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgYm9keVRpZWQoKTogQ29tcG9uZW50UmlnaWRib2R5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JvZHlUaWVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBib2R5VGllZChfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSkge1xyXG4gICAgICB0aGlzLiNpZEJvZHlUaWVkID0gX2NtcFJCICE9IG51bGwgPyBfY21wUkIuaWQgOiAtMTtcclxuICAgICAgdGhpcy4jYm9keVRpZWQgPSBfY21wUkI7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXhhY3QgcG9zaXRpb24gd2hlcmUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGFyZSBjb25uZWN0ZWQuIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYW5jaG9yKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYW5jaG9yLngsIHRoaXMuI2FuY2hvci55LCB0aGlzLiNhbmNob3Iueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGFuY2hvcihfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYW5jaG9yID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhbW91bnQgb2YgZm9yY2UgbmVlZGVkIHRvIGJyZWFrIHRoZSBKT0lOVCwgd2hpbGUgcm90YXRpbmcsIGluIE5ld3Rvbi4gMCBlcXVhbHMgdW5icmVha2FibGUgKGRlZmF1bHQpIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYnJlYWtUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyZWFrVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBicmVha1RvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNicmVha1RvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRCcmVha1RvcnF1ZSh0aGlzLiNicmVha1RvcnF1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZvcmNlIG5lZWRlZCB0byBicmVhayB0aGUgSk9JTlQsIGluIE5ld3Rvbi4gMCBlcXVhbHMgdW5icmVha2FibGUgKGRlZmF1bHQpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJyZWFrRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyZWFrRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGJyZWFrRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jYnJlYWtGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRCcmVha0ZvcmNlKHRoaXMuI2JyZWFrRm9yY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICAqIE9uIGEgd2VsZGluZyBqb2ludCB0aGUgY29ubmVjdGVkIGJvZGllcyBzaG91bGQgbm90IGJlIGNvbGxpZGluZyB3aXRoIGVhY2ggb3RoZXIsXHJcbiAgICAgICogZm9yIGJlc3QgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGludGVybmFsQ29sbGlzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW50ZXJuYWxDb2xsaXNpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGludGVybmFsQ29sbGlzaW9uKF92YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLiNpbnRlcm5hbENvbGxpc2lvbiA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5zZXRBbGxvd0NvbGxpc2lvbih0aGlzLiNpbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0IGEgY2hpbGQgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBqb2ludC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3RDaGlsZChfbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI25hbWVDaGlsZFRvQ29ubmVjdCA9IF9uYW1lO1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IE5vZGVbXSA9IHRoaXMubm9kZS5nZXRDaGlsZHJlbkJ5TmFtZShfbmFtZSk7XHJcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSlcclxuICAgICAgICB0aGlzLmNvbm5lY3ROb2RlKGNoaWxkcmVuLnBvcCgpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RoaXMubm9kZS5uYW1lfSBmYWlscyB0byBjb25uZWN0IGNoaWxkIHdpdGggbm9uIGV4aXN0ZW50IG9yIGFtYmlnb3VzIG5hbWUgJHtfbmFtZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3QgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGpvaW50LiBUaWVpbmcgaXRzIHJpZ2lkYm9keSB0byB0aGUgbm9kZXMgcmlnaWRib2R5IHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdE5vZGUoX25vZGU6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfbm9kZSB8fCAhdGhpcy5ub2RlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIERlYnVnLmZ1ZGdlKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gY29ubmVjdGVkICR7dGhpcy5ub2RlLm5hbWV9IGFuZCAke19ub2RlLm5hbWV9YCk7XHJcblxyXG4gICAgICBsZXQgY29ubmVjdEJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgICBsZXQgdGhpc0JvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuXHJcbiAgICAgIGlmICghY29ubmVjdEJvZHkgfHwgIXRoaXNCb2R5KSB7XHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IGF0ICR7dGhpcy5ub2RlLm5hbWV9IGZhaWxzIGR1ZSB0byBtaXNzaW5nIHJpZ2lkYm9kaWVzIG9uICR7dGhpcy5ub2RlLm5hbWV9IG9yICR7X25vZGUubmFtZX1gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYm9keUFuY2hvciA9IHRoaXNCb2R5O1xyXG4gICAgICB0aGlzLmJvZHlUaWVkID0gY29ubmVjdEJvZHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoZWNrIGlmIGNvbm5lY3Rpb24gaXMgZGlydHksIHNvIHdoZW4gZWl0aGVyIHJiIGlzIGNoYW5nZWQgZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0LiBJbnRlcm5hbGx5IHVzZWQgbm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuICovXHJcbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXppbmcgYW5kIGNvbm5lY3RpbmcgdGhlIHR3byByaWdpZGJvZGllcyB3aXRoIHRoZSBjb25maWd1cmVkIGpvaW50IHByb3BlcnRpZXNcclxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IHRoZSBwaHlzaWNzIHN5c3RlbS4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy4jY29ubmVjdGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2lkQm9keUFuY2hvciA9PSAtMSB8fCB0aGlzLiNpZEJvZHlUaWVkID09IC0xKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0KVxyXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RDaGlsZCh0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RKb2ludCgpO1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRKb2ludCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNjb25uZWN0aW5nIHRoZSB0d28gcmlnaWRib2RpZXMgYW5kIHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgcGh5c2ljcyBzeXN0ZW0sXHJcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgcGh5c2ljcyBzeXN0ZW0uIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI2Nvbm5lY3RlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVKb2ludCgpO1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBKb2ludCB1c2VkIGJ5IHRoZSBwaHlzaWNzIGVuZ2luZS4gVXNlZCBpbnRlcm5hbGx5IG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICogT25seSB0byBiZSB1c2VkIHdoZW4gZnVuY3Rpb25hbGl0eSB0aGF0IGlzIG5vdCBhZGRlZCB3aXRoaW4gRlVER0UgaXMgbmVlZGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vSm9pbnQoKTogT0lNTy5Kb2ludCB7XHJcbiAgICAgIHJldHVybiB0aGlzLmpvaW50O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmFuY2hvciA9IHRoaXMuYW5jaG9yLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5hbmNob3IpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHRoaXMuY29ubmVjdENoaWxkKF9zZXJpYWxpemF0aW9uLm5hbWVDaGlsZFRvQ29ubmVjdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24obXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgbXV0YXRvci5hbmNob3IgPSB0aGlzLmFuY2hvci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIHR5cGVzLm5hbWVDaGlsZFRvQ29ubmVjdCA9IFwiU3RyaW5nXCI7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH0gXHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmFuY2hvcikgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyguLi48bnVtYmVyW10+KE9iamVjdC52YWx1ZXMoX211dGF0b3IuYW5jaG9yKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYW5jaG9yO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5uYW1lQ2hpbGRUb0Nvbm5lY3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuY29ubmVjdENoaWxkKF9tdXRhdG9yLm5hbWVDaGlsZFRvQ29ubmVjdCk7XHJcbiAgICAgIHRoaXMuI211dGF0ZShfbXV0YXRvcik7XHJcbiAgICAgIHRoaXMuZGVsZXRlRnJvbU11dGF0b3IoX211dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5qb2ludDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1vdG9yO1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGVsbCB0aGUgRnVkZ2VQaHlzaWNzIHN5c3RlbSB0aGF0IHRoaXMgam9pbnQgbmVlZHMgdG8gYmUgaGFuZGxlZCBpbiB0aGUgbmV4dCBmcmFtZS4gKi9cclxuICAgIHByb3RlY3RlZCBkaXJ0eVN0YXR1cygpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy5jaGFuZ2VKb2ludFN0YXR1cyh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkSm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuYWRkSm9pbnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbW92ZUpvaW50KCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLnJlbW92ZUpvaW50KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCguLi5fY29uZmlnUGFyYW1zOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQm9keUFuY2hvcjogVmVjdG9yMyA9IHRoaXMuYm9keUFuY2hvci5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uOyAvL1NldHRpbmcgdGhlIGFuY2hvciBwb3NpdGlvbiBsb2NhbGx5IGZyb20gdGhlIGZpcnN0IHJpZ2lkYm9keVxyXG4gICAgICBsZXQgd29ybGRBbmNob3I6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMocG9zQm9keUFuY2hvci54ICsgdGhpcy4jYW5jaG9yLngsIHBvc0JvZHlBbmNob3IueSArIHRoaXMuI2FuY2hvci55LCBwb3NCb2R5QW5jaG9yLnogKyB0aGlzLiNhbmNob3Iueik7XHJcblxyXG4gICAgICAvLyBAdHMtaWdub3JlICAgIC8vIHVuZm9ydHVuYXRlbHksIG1ldGhvZCBpbml0IGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgYmFzZSBjbGFzcyBPSU1PLkpvaW50Q29uZmlnXHJcbiAgICAgIHRoaXMuY29uZmlnLmluaXQodGhpcy4jYm9keUFuY2hvci5nZXRPaW1vUmlnaWRib2R5KCksIHRoaXMuI2JvZHlUaWVkLmdldE9pbW9SaWdpZGJvZHkoKSwgd29ybGRBbmNob3IsIC4uLl9jb25maWdQYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25maWd1cmVKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5qb2ludC5zZXRCcmVha0ZvcmNlKHRoaXMuYnJlYWtGb3JjZSk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QnJlYWtUb3JxdWUodGhpcy5icmVha1RvcnF1ZSk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy4jaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvciwgX2RlbGV0ZTogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gX2RlbGV0ZSlcclxuICAgICAgICBkZWxldGUgX211dGF0b3Jba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgc3dpdGNoIChfZXZlbnQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRJU0NPTk5FQ1RfSk9JTlQsICgpID0+IHsgdGhpcy5kaXNjb25uZWN0KCk7IHRoaXMuZGlydHlTdGF0dXMoKTsgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9SRU1PVkU6XHJcbiAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5ESVNDT05ORUNUX0pPSU5ULCAoKSA9PiB7IHRoaXMuZGlzY29ubmVjdCgpOyB0aGlzLmRpcnR5U3RhdHVzKCk7IH0sIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVKb2ludCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIG5hbWVDaGlsZFRvQ29ubmVjdDogdGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0LFxyXG4gICAgICAgIGludGVybmFsQ29sbGlzaW9uOiB0aGlzLiNpbnRlcm5hbENvbGxpc2lvbixcclxuICAgICAgICBicmVha0ZvcmNlOiB0aGlzLiNicmVha0ZvcmNlLFxyXG4gICAgICAgIGJyZWFrVG9ycXVlOiB0aGlzLiNicmVha1RvcnF1ZVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcImludGVybmFsQ29sbGlzaW9uXCIsIFwiYnJlYWtGb3JjZVwiLCBcImJyZWFrVG9ycXVlXCJdKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBCYXNlIGNsYXNzIGZvciBqb2ludHMgb3BlcmF0aW5nIHdpdGggZXhhY3RseSBvbmUgYXhpc1xyXG4gICAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2ludEF4aWFsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHJvdGVjdGVkIHNwcmluZ0RhbXBlcjogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICBcclxuICAgIC8vSW50ZXJuYWwgVmFyaWFibGVzXHJcbiAgICAjbWF4TW90b3I6IG51bWJlciA9IDEwO1xyXG4gICAgI21pbk1vdG9yOiBudW1iZXIgPSAtMTA7XHJcbiAgICAjbW90b3JTcGVlZDogbnVtYmVyID0gMDtcclxuICAgICNheGlzOiBPSU1PLlZlYzM7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5OiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0RhbXBpbmc6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgY3lsaW5kcmljYWwgam9pbnQgYmV0d2VlbiB0d28gQ29tcG9uZW50UmlnaWRib2RpZXMgbW92aW5nIG9uIG9uZSBheGlzIGFuZCByb3RhdGluZyBhcm91bmQgYW5vdGhlciBib3VuZCBvbiBhIGxvY2FsIGFuY2hvcnBvaW50LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXMgPSBfYXhpcztcclxuICAgICAgdGhpcy5hbmNob3IgPSBfbG9jYWxBbmNob3I7XHJcbiAgICAgIHRoaXMubWluTW90b3IgPSAtMTA7XHJcbiAgICAgIHRoaXMubWF4TW90b3IgPSAxMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpcy54LCB0aGlzLiNheGlzLnksIHRoaXMuI2F4aXMueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXMoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhNb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4TW90b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtYXhNb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhNb3RvciA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+PHVua25vd24+dGhpcy5qb2ludCkuZ2V0TGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7IC8qICovIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Nb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluTW90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pbk1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD48dW5rbm93bj50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50Pjx1bmtub3duPnRoaXMuam9pbnQpLmdldFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclNwZWVkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclNwZWVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbW90b3JTcGVlZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50PnRoaXMuam9pbnQpLmdldFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzID0gdGhpcy5heGlzLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYXhpcyA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpcyk7XHJcbiAgICAgIHRoaXMuI211dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXMpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpcyA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpcztcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzID0gdGhpcy5heGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3ksIHRoaXMuI3NwcmluZ0RhbXBpbmcpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCh0aGlzLiNheGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgc3ByaW5nRGFtcGluZzogdGhpcy4jc3ByaW5nRGFtcGluZyxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3k6IHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSxcclxuICAgICAgICBtYXhNb3RvcjogdGhpcy4jbWF4TW90b3IsXHJcbiAgICAgICAgbWluTW90b3I6IHRoaXMuI21pbk1vdG9yLFxyXG4gICAgICAgIG1vdG9yU3BlZWQ6IHRoaXMuI21vdG9yU3BlZWRcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9O1xyXG5cclxuICAgICNtdXRhdGUgPSAoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkID0+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXCJzcHJpbmdEYW1waW5nXCIsIFwic3ByaW5nRnJlcXVlbmN5XCIsIFwibWF4TW90b3JcIiwgXCJtaW5Nb3RvclwiLCBcIm1vdG9yU3BlZWRcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKioge0BsaW5rIFRleEltYWdlU291cmNlfSBpcyBhIHVuaW9uIHR5cGUgd2hpY2ggYXMgb2Ygbm93IGluY2x1ZGVzIHtAbGluayBWaWRlb0ZyYW1lfS4gQWxsIG90aGVyIHBhcnRzIG9mIHRoaXMgdW5pb24gaGF2ZSBhIC53aWR0aCBhbmQgLmhlaWdodCBwcm9wZXJ0eSBidXQgVmlkZW9GcmFtZSBkb2VzIG5vdC4gQW5kIHNpbmNlIHdlIG9ubHkgZXZlciB1c2Uge0BsaW5rIEhUTUxJbWFnZUVsZW1lbnR9IGFuZCB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSBjdXJyZW50bHkgVmlkZW9GcmFtZSBjYW4gYmUgZXhjbHVkZWQgZm9yIGNvbnZlbmllbmNlIG9mIGFjY2Vzc2luZyAud2lkdGggYW5kIC5oZWlnaHQgKi9cclxuICB0eXBlIEltYWdlU291cmNlID0gRXhjbHVkZTxUZXhJbWFnZVNvdXJjZSwgVmlkZW9GcmFtZT47XHJcblxyXG4gIC8qKlxyXG4gICAqIC0gQ1JJU1A6IG5vIG1pcG1hcHBpbmcsIG1hZyBmaWx0ZXIgbmVhcmVzdCwgbWluIGZpbHRlciBuZWFyZXN0XHJcbiAgICogLSBNRURJVU06IG1pcG1hcHBpbmcsIG1hZyBmaWx0ZXIgbmVhcmVzdCwgbWluIGZpbHRlciBuZWFyZXN0X21pcG1hcF9saW5lYXJcclxuICAgKiAtIEJMVVJSWTogbWlwbWFwcGluZywgbWFnIGZpbHRlciBsaW5lYXIsIG1pbiBmaWx0ZXIgbGluZWFyX21pcG1hcF9saW5lYXJcclxuICAgKiAtIFNNT09USDogbm8gbWlwbWFwcGluZywgbWFnIGZpbHRlciBsaW5lYXIsIG1pbiBmaWx0ZXIgbGluZWFyXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gTUlQTUFQIHtcclxuICAgIENSSVNQLCBNRURJVU0sIEJMVVJSWSwgU01PT1RIXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBXUkFQIHtcclxuICAgIFJFUEVBVCwgQ0xBTVAsIE1JUlJPUlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZWNsYXNzIGZvciBkaWZmZXJlbnQga2luZHMgb2YgdGV4dHVyZXMuIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yVGV4dHVyZS5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZXh0dXJlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHByb3RlY3RlZCByZW5kZXJEYXRhOiB1bmtub3duO1xyXG5cclxuICAgIHByb3RlY3RlZCB0ZXh0dXJlRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJvdGVjdGVkIG1pcG1hcERpcnR5OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb3RlY3RlZCB3cmFwRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICNtaXBtYXA6IE1JUE1BUCA9IE1JUE1BUC5DUklTUDtcclxuICAgICN3cmFwOiBXUkFQID0gV1JBUC5SRVBFQVQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIlRleHR1cmVcIikge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1pcG1hcChfbWlwbWFwOiBNSVBNQVApIHtcclxuICAgICAgdGhpcy4jbWlwbWFwID0gX21pcG1hcDtcclxuICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtaXBtYXAoKTogTUlQTUFQIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pcG1hcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHdyYXAoX3dyYXA6IFdSQVApIHtcclxuICAgICAgdGhpcy4jd3JhcCA9IF93cmFwO1xyXG4gICAgICB0aGlzLndyYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3cmFwKCk6IFdSQVAge1xyXG4gICAgICByZXR1cm4gdGhpcy4jd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGltYWdlIHNvdXJjZSBvZiB0aGlzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIGJpbmRzIHRoZSB0ZXh0dXJlIGluIFdlYkdMIGZyb20gdGhlIHtAbGluayB0ZXhJbWFnZVNvdXJjZX0uIFxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yVGV4dHVyZX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0OiBudW1iZXIgPSAwKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSB0ZXh0dXJlIGluIFdlYkdMIGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBncHUgbWVtb3J5LlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yVGV4dHVyZX0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVJlbmRlckRhdGEoKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZyZXNoZXMgdGhlIGltYWdlIGRhdGEgaW4gdGhlIHJlbmRlciBlbmdpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIG1pcG1hcDogTUlQTUFQW3RoaXMuI21pcG1hcF0sXHJcbiAgICAgICAgd3JhcDogV1JBUFt0aGlzLiN3cmFwXVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcywgX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIHRoaXMuI21pcG1hcCA9IDxudW1iZXI+PHVua25vd24+TUlQTUFQW19zZXJpYWxpemF0aW9uLm1pcG1hcF07XHJcbiAgICAgIHRoaXMuI3dyYXAgPSA8bnVtYmVyPjx1bmtub3duPldSQVBbX3NlcmlhbGl6YXRpb24ud3JhcF07XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKF9leHRlbmRhYmxlPzogYm9vbGVhbik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IubWlwbWFwID0gdGhpcy4jbWlwbWFwO1xyXG4gICAgICBtdXRhdG9yLndyYXAgPSB0aGlzLiN3cmFwO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMubWlwbWFwKVxyXG4gICAgICAgIHR5cGVzLm1pcG1hcCA9IE1JUE1BUDtcclxuICAgICAgaWYgKHR5cGVzLndyYXApXHJcbiAgICAgICAgdHlwZXMud3JhcCA9IFdSQVA7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuaWRSZXNvdXJjZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckRhdGE7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50ZXh0dXJlRGlydHk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5taXBtYXBEaXJ0eTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1pcG1hcEdlbmVyYXRlZDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLndyYXBEaXJ0eTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGFuIGV4aXN0aW5nIGltYWdlXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVJbWFnZSBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHVibGljIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbnVsbDtcclxuICAgIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdXJsPzogUmVxdWVzdEluZm8pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgaWYgKF91cmwpIHtcclxuICAgICAgICB0aGlzLmxvYWQoX3VybCk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gX3VybC50b1N0cmluZygpLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyB0aGUgaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHRoaXMudXJsID0gX3VybDtcclxuICAgICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG5cclxuXHJcbiAgICAgIC8vIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IHdpbmRvdy5mZXRjaCh0aGlzLnVybCk7XHJcbiAgICAgIC8vIGNvbnN0IGJsb2I6IEJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcbiAgICAgIC8vIGxldCBvYmplY3RVUkw6IHN0cmluZyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIC8vIHRoaXMuaW1hZ2Uuc3JjID0gb2JqZWN0VVJMO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gbnVsbDsgLy8gcmVmcmVzaCByZW5kZXIgZGF0YSBvbiBuZXh0IGRyYXcgY2FsbFxyXG4gICAgICAgICAgX3Jlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiBfcmVqZWN0KCkpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gbmV3IFVSTCh0aGlzLnVybC50b1N0cmluZygpLCBQcm9qZWN0LmJhc2VVUkwpLnRvU3RyaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSwgLy8gc2VyaWFsaXplIGZvciBlZGl0b3Igdmlld3NcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZChfc2VyaWFsaXphdGlvbi51cmwpO1xyXG4gICAgICAvLyB0aGlzLnR5cGUgaXMgYW4gYWNjZXNzb3Igb2YgTXV0YWJsZSBkb2Vzbid0IG5lZWQgdG8gYmUgZGVzZXJpYWxpemVkXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoX211dGF0b3IudXJsICYmIF9tdXRhdG9yLnVybCAhPSB0aGlzLnVybC50b1N0cmluZygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChfbXV0YXRvci51cmwpO1xyXG4gICAgICAvLyBleGNlcHQgdXJsIGZyb20gbXV0YXRvciBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcbiAgICAgIGRlbGV0ZSAoX211dGF0b3IudXJsKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lIG5lY2Vzc2l0eSB0byByZWNvbnN0cnVjdCwgaWYgbXV0YXRvciBpcyBrZXB0IGJ5IGNhbGxlclxyXG4gICAgICAvLyBfbXV0YXRvci51cmwgPSB0aGlzLnVybDsgXHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVCYXNlNjQgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBpbWFnZTogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfYmFzZTY0OiBzdHJpbmcsIF9taXBtYXA6IE1JUE1BUCA9IE1JUE1BUC5DUklTUCwgX3dyYXA6IFdSQVAgPSBXUkFQLlJFUEVBVCwgX3dpZHRoPzogbnVtYmVyLCBfaGVpZ2h0PzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5pbWFnZS5zcmMgPSBfYmFzZTY0O1xyXG4gICAgICB0aGlzLm1pcG1hcCA9IF9taXBtYXA7XHJcbiAgICAgIHRoaXMud3JhcCA9IF93cmFwO1xyXG4gICAgICBpZiAoX3dpZHRoKVxyXG4gICAgICAgIHRoaXMuaW1hZ2Uud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIGlmIChfaGVpZ2h0KVxyXG4gICAgICAgIHRoaXMuaW1hZ2UuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVDYW52YXMgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9jcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBfY3JjMjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmMyLmNhbnZhcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgdGV4dC4gVGV4dHVyZSB1cGF0ZXMgd2hlbiB0aGUgdGV4dCBvciBmb250IGNoYW5nZXMuIFRoZSB0ZXh0dXJlIGlzIHJlc2l6ZWQgdG8gZml0IHRoZSB0ZXh0LlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlVGV4dCBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHJvdGVjdGVkIGNyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICAgICN0ZXh0OiBzdHJpbmc7XHJcbiAgICAjZm9udDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfdGV4dDogc3RyaW5nID0gXCJUZXh0XCIsIF9mb250OiBzdHJpbmcgPSBcIjIwcHggbW9ub3NwYWNlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3RleHQ7XHJcbiAgICAgIHRoaXMuZm9udCA9IF9mb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGV4dChfdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuI3RleHQgPSBfdGV4dDtcclxuICAgICAgdGhpcy50ZXh0dXJlRGlydHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZvbnQoX2ZvbnQ6IHN0cmluZykge1xyXG4gICAgICB0aGlzLiNmb250ID0gX2ZvbnQ7XHJcbiAgICAgIGRvY3VtZW50LmZvbnRzLmxvYWQodGhpcy4jZm9udClcclxuICAgICAgICAuY2F0Y2goKF9lcnJvcikgPT4gRGVidWcuZXJyb3IoYCR7VGV4dHVyZVRleHQubmFtZX06ICR7X2Vycm9yfWApKVxyXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmb250KCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXMud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RyYW5zcGFyZW5jeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JjMi5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLnRleHR1cmVEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuY3JjMi5mb250ID0gdGhpcy5mb250O1xyXG5cclxuICAgICAgICBsZXQgbWV0cmljczogVGV4dE1ldHJpY3MgPSB0aGlzLmNyYzIubWVhc3VyZVRleHQodGhpcy50ZXh0KTtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IG1ldHJpY3Mud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGggKyB0aGlzLmNyYzIubWVhc3VyZVRleHQoXCIgIFwiKS53aWR0aDtcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiAxLjE7IC8vIHBhZGRpbmcsIG90aGVyd2lzZSBvbiBzb21lIGdseXBocyBtaWdodCBnZXQgY3V0IG9mZlxyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCA9PSAwKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNyYzIuZm9udCA9IHRoaXMuZm9udDsgLy8gVE9ETzogd2FpdCBmb3IgZm9udCB0byBiZSBsb2FkZWQgdXNpbmcgZG9jdW1lbnQuZm9udHNcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEJhc2VsaW5lID0gXCJtaWRkbGVcIjtcclxuICAgICAgICB0aGlzLmNyYzIuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIHRoaXMuY3JjMi5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jcmMyLmZpbGxUZXh0KHRoaXMuI3RleHQsIHRoaXMuY2FudmFzLndpZHRoIC8gMiwgdGhpcy5jYW52YXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN1cGVyLnVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxyXG4gICAgICAgIGZvbnQ6IHRoaXMuZm9udFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3NlcmlhbGl6YXRpb24udGV4dDtcclxuICAgICAgdGhpcy5mb250ID0gX3NlcmlhbGl6YXRpb24uZm9udDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU/OiBib29sZWFuKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci50ZXh0ID0gdGhpcy50ZXh0O1xyXG4gICAgICBtdXRhdG9yLmZvbnQgPSB0aGlzLmZvbnQ7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSBGVURHRS1Ta2V0Y2hcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZVNrZXRjaCBleHRlbmRzIFRleHR1cmVDYW52YXMge1xyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUZXh0dXJlIGNyZWF0ZWQgZnJvbSBhbiBIVE1MLXBhZ2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUhUTUwgZXh0ZW5kcyBUZXh0dXJlQ2FudmFzIHtcclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgbWVzaGVzLiBcclxuICAgKiBNZXNoZXMgcHJvdmlkZSBpbmRleGVkIHZlcnRpY2VzLCB0aGUgb3JkZXIgb2YgaW5kaWNlcyB0byBjcmVhdGUgdHJpZ29ucyBhbmQgbm9ybWFscywgYW5kIHRleHR1cmUgY29vcmRpbmF0ZXNcclxuICAgKiBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS8yMlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3Rvck1lc2guZGVjb3JhdGVcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVzaCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICAvKiogcmVmZXJzIGJhY2sgdG8gdGhpcyBjbGFzcyBmcm9tIGFueSBzdWJjbGFzcyBlLmcuIGluIG9yZGVyIHRvIGZpbmQgY29tcGF0aWJsZSBvdGhlciByZXNvdXJjZXMqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBiYXNlQ2xhc3M6IHR5cGVvZiBNZXNoID0gTWVzaDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIE1lc2hbXSA9IFtdO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbmFtZSB2ZXJ0aWNlcyB0byB2ZXJ0aWNlc1Ntb290aCBvciBqdXN0IGNsb3VkLCBhbmQgY2xvdWQgdG8gdmVydGljZXNcclxuXHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiTWVzaFwiO1xyXG4gICAgLy8gYmFzZSBzdHJ1Y3R1cmUgZm9yIG1lc2hlcyBpbiBGVURHRVxyXG4gICAgcHVibGljIHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgcHVibGljIGZhY2VzOiBGYWNlW10gPSBbXTtcclxuXHJcbiAgICAvLyBwdWJsaWMgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVyczsgLyogZGVmaW5lZCBieSBSZW5kZXJJbmplY3RvciovXHJcblxyXG4gICAgLyoqIGJvdW5kaW5nIGJveCBBQUJCICovXHJcbiAgICBwcm90ZWN0ZWQgxpJib3g6IEJveDtcclxuICAgIC8vIFRPRE86IGV4cGxvcmUgbWF0aGVtYXRpY3MgZm9yIGVhc3kgdHJhbnNmb3JtYXRpb25zIG9mIHJhZGl1cyBcclxuICAgIC8qKiBib3VuZGluZyByYWRpdXMgKi9cclxuICAgIHByb3RlY3RlZCDGknJhZGl1czogbnVtYmVyO1xyXG5cclxuICAgICNyZW5kZXJNZXNoOiBSZW5kZXJNZXNoO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoXCIpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgTWVzaCk6IG51bWJlciB7IHJldHVybiBNZXNoLnN1YmNsYXNzZXMucHVzaChfc3ViQ2xhc3MpIC0gMTsgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVuZGVyTWVzaCgpOiBSZW5kZXJNZXNoIHtcclxuICAgICAgaWYgKHRoaXMuI3JlbmRlck1lc2ggPT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyZW5kZXJNZXNoID0gbmV3IFJlbmRlck1lc2godGhpcyk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jcmVuZGVyTWVzaDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvdW5kaW5nQm94KCk6IEJveCB7XHJcbiAgICAgIGlmICh0aGlzLsaSYm94ID09IG51bGwpXHJcbiAgICAgICAgdGhpcy7GkmJveCA9IHRoaXMuY3JlYXRlQm91bmRpbmdCb3goKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLsaSYm94O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCByYWRpdXMoKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuxpJyYWRpdXMgPT0gbnVsbClcclxuICAgICAgICB0aGlzLsaScmFkaXVzID0gdGhpcy5jcmVhdGVSYWRpdXMoKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLsaScmFkaXVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yTWVzaH0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJCdWZmZXJzKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX210eE1lc2hUb1dvcmxkOiBNYXRyaXg0eDQsIF9tdHhNZXNoVG9WaWV3OiBNYXRyaXg0eDQsIF9pZD86IG51bWJlcik6IFJlbmRlckJ1ZmZlcnMgeyByZXR1cm4gbnVsbDsgLyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvck1lc2h9LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVuZGVyQnVmZmVycygpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JNZXNofS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVJlbmRlckJ1ZmZlcnMoX3JlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgYm91bmRzIG9mIHRoaXMgbWVzaCBhc3dlbGwgYXMgdGhlIGJ1ZmZlcnMgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbmRlck1lc2h9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuxpJib3ggPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuxpJyYWRpdXMgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICB0aGlzLmRlbGV0ZVJlbmRlckJ1ZmZlcnModGhpcy5yZW5kZXJNZXNoLmJ1ZmZlcnMpO1xyXG4gICAgICB0aGlzLnJlbmRlck1lc2guY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8vIFNlcmlhbGl6ZS9EZXNlcmlhbGl6ZSBmb3IgYWxsIG1lc2hlcyB0aGF0IGNhbGN1bGF0ZSB3aXRob3V0IHBhcmFtZXRlcnNcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgdHlwZTogdGhpcy50eXBlIC8vIHN0b3JlIGZvciBlZGl0b3Igdmlld1xyXG4gICAgICB9OyAvLyBubyBkYXRhIG5lZWRlZCAuLi5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICAvLyB0eXBlIGlzIGFuIGFjY2Vzc29yIGFuZCBtdXN0IG5vdCBiZSBkZXNlcmlhbGl6ZWRcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgLy8gVE9ETzogc28gbXVjaCB0byBkZWxldGUuLi4gcmF0aGVyIGp1c3QgZ2F0aGVyIHdoYXQgdG8gbXV0YXRlXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci7GkmJveDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLsaScmFkaXVzO1xyXG5cclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckJ1ZmZlcnM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVJhZGl1cygpOiBudW1iZXIge1xyXG4gICAgICAvL1RPRE86IHJhZGl1cyBhbmQgYm91bmRpbmcgYm94IGNvdWxkIGJlIGNyZWF0ZWQgb24gY29uc3RydWN0aW9uIG9mIHZlcnRleC1hcnJheVxyXG4gICAgICBsZXQgcmFkaXVzOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgdGhpcy52ZXJ0aWNlcy5wb3NpdGlvbihpKS5tYWduaXR1ZGVTcXVhcmVkKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KHJhZGl1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUJvdW5kaW5nQm94KCk6IEJveCB7XHJcbiAgICAgIGxldCBib3g6IEJveCA9IFJlY3ljbGVyLmdldChCb3gpO1xyXG4gICAgICBib3guc2V0KCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvaW50OiBWZWN0b3IzID0gdGhpcy52ZXJ0aWNlcy5wb3NpdGlvbihpKTtcclxuICAgICAgICBib3guZXhwYW5kKHBvaW50KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYm94O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIG1hdGVyaWFscy4gQ29tYmluZXMgYSB7QGxpbmsgU2hhZGVyfSB3aXRoIGEgY29tcGF0aWJsZSB7QGxpbmsgQ29hdH1cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIEBlbnVtZXJhYmxlXHJcbiAgZXhwb3J0IGNsYXNzIE1hdGVyaWFsIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8qKiBUaGUgbmFtZSB0byBjYWxsIHRoZSBNYXRlcmlhbCBieS4gKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENsaXBwaW5nIHRocmVzaG9sZCBmb3IgYWxwaGEgdmFsdWVzLCBldmVyeSBwaXhlbCB3aXRoIGFscGhhIDwgYWxwaGFDbGlwIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWxwaGFDbGlwOiBudW1iZXIgPSAwLjAxO1xyXG5cclxuICAgIHByaXZhdGUgc2hhZGVyVHlwZTogdHlwZW9mIFNoYWRlcjsgLy8gVGhlIHNoYWRlciBwcm9ncmFtIHVzZWQgYnkgdGhpcyBCYXNlTWF0ZXJpYWxcclxuICAgICNjb2F0OiBDb2F0O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfc2hhZGVyPzogdHlwZW9mIFNoYWRlciwgX2NvYXQ/OiBDb2F0KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLnNoYWRlclR5cGUgPSBfc2hhZGVyO1xyXG4gICAgICBpZiAoX3NoYWRlcikge1xyXG4gICAgICAgIGlmIChfY29hdClcclxuICAgICAgICAgIHRoaXMuY29hdCA9IF9jb2F0O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuY29hdCA9IHRoaXMuY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZWZlcmVuY2VkIHtAbGluayBDb2F0fSBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBAdHlwZShDb2F0KVxyXG4gICAgQGVudW1lcmFibGVcclxuICAgIHB1YmxpYyBnZXQgY29hdCgpOiBDb2F0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvYXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1ha2VzIHRoaXMgbWF0ZXJpYWwgcmVmZXJlbmNlIHRoZSBnaXZlbiB7QGxpbmsgQ29hdH0gaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZWZlcmVuY2VkIHtAbGluayBTaGFkZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY29hdChfY29hdDogQ29hdCkge1xyXG4gICAgICBpZiAodGhpcy5zaGFkZXJUeXBlKVxyXG4gICAgICAgIGlmIChfY29hdC5jb25zdHJ1Y3RvciAhPSB0aGlzLnNoYWRlclR5cGUuZ2V0Q29hdCgpKVxyXG4gICAgICAgICAgaWYgKF9jb2F0IGluc3RhbmNlb2YgdGhpcy5zaGFkZXJUeXBlLmdldENvYXQoKSlcclxuICAgICAgICAgICAgRGVidWcuZnVkZ2UoXCJDb2F0IGlzIGV4dGVuc2lvbiBvZiBDb2F0IHJlcXVpcmVkIGJ5IHNoYWRlclwiKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihcIlNoYWRlciBhbmQgY29hdCBkb24ndCBtYXRjaFwiKSk7XHJcbiAgICAgIHRoaXMuI2NvYXQgPSBfY29hdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvYXR9IGluc3RhbmNlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSB7QGxpbmsgU2hhZGVyfSByZWZlcmVuY2VkIGJ5IHRoaXMgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUNvYXRNYXRjaGluZ1NoYWRlcigpOiBDb2F0IHtcclxuICAgICAgbGV0IGNvYXQ6IENvYXQgPSBuZXcgKHRoaXMuc2hhZGVyVHlwZS5nZXRDb2F0KCkpKCk7XHJcbiAgICAgIHJldHVybiBjb2F0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyB0aGUgbWF0ZXJpYWxzIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4ge0BsaW5rIFNoYWRlcn0sIGNyZWF0ZXMgYW5kIHJlZmVyZW5jZXMgYSBuZXcge0BsaW5rIENvYXR9IGluc3RhbmNlICBcclxuICAgICAqIGFuZCBtdXRhdGVzIHRoZSBuZXcgY29hdCB0byBwcmVzZXJ2ZSBtYXRjaGluZyBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIF9zaGFkZXJUeXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2hhZGVyKF9zaGFkZXJUeXBlOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhZGVyVHlwZSA9IF9zaGFkZXJUeXBlO1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IHRoaXMuY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk7XHJcbiAgICAgIGNvYXQubXV0YXRlKHRoaXMuI2NvYXQ/LmdldE11dGF0b3IoKSk7XHJcbiAgICAgIHRoaXMuY29hdCA9IGNvYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2hhZGVyfSByZWZlcmVuY2VkIGJ5IHRoaXMgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYWRlcigpOiB0eXBlb2YgU2hhZGVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2hhZGVyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8vIFRPRE86IHRoaXMgdHlwZSBvZiBzZXJpYWxpemF0aW9uIHdhcyBpbXBsZW1lbnRlZCBmb3IgaW1wbGljaXQgTWF0ZXJpYWwgY3JlYXRlLiBDaGVjayBpZiBvYnNvbGV0ZSB3aGVuIG9ubHkgb25lIG1hdGVyaWFsIGNsYXNzIGV4aXN0cyBhbmQvb3IgbWF0ZXJpYWxzIGFyZSBzdG9yZWQgc2VwYXJhdGVseVxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBzaGFkZXI6IHRoaXMuc2hhZGVyVHlwZS5uYW1lLFxyXG4gICAgICAgIGNvYXQ6IFNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuI2NvYXQpLFxyXG4gICAgICAgIGFscGhhQ2xpcDogdGhpcy5hbHBoYUNsaXBcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLnNoYWRlclR5cGUgPSAoPEdlbmVyYWw+RnVkZ2VDb3JlKVtfc2VyaWFsaXphdGlvbi5zaGFkZXJdO1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IDxDb2F0PmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY29hdCk7XHJcbiAgICAgIHRoaXMuY29hdCA9IGNvYXQ7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5hbHBoYUNsaXAgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMuYWxwaGFDbGlwID0gX3NlcmlhbGl6YXRpb24uYWxwaGFDbGlwO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvLyBkZWxldGUgX211dGF0b3IuaWRSZXNvdXJjZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbmFtZXNhcGNlIGZvciBoYW5kbGluZyB0aGUgcGFydGljbGUgZGF0YVxyXG4gICAqL1xyXG4gIGV4cG9ydCBuYW1lc3BhY2UgUGFydGljbGVEYXRhIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgYSBwYXJ0aWNsZSBzeXN0ZW0uIERlc2NyaWJlcyB0aGUgcGFydGljbGUgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtIHtcclxuICAgICAgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdO1xyXG4gICAgICB2YXJpYWJsZXM/OiBFeHByZXNzaW9uW107IC8veyBbbmFtZTogc3RyaW5nXTogRXhwcmVzc2lvbiB9O1xyXG4gICAgICBjb2xvcj86IEV4cHJlc3Npb25bXTtcclxuICAgICAgbXR4TG9jYWw/OiBUcmFuc2Zvcm1hdGlvbltdO1xyXG4gICAgICBtdHhXb3JsZD86IFRyYW5zZm9ybWF0aW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgUmVjdXJzaXZlID0gU3lzdGVtIHwgRXhwcmVzc2lvbltdIHwgVHJhbnNmb3JtYXRpb25bXSB8IFRyYW5zZm9ybWF0aW9uIHwgRXhwcmVzc2lvbjtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBFeHByZXNzaW9uID0gRnVuY3Rpb24gfCBWYXJpYWJsZSB8IENvbnN0YW50IHwgQ29kZTtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcclxuICAgICAgZnVuY3Rpb246IEZVTkNUSU9OO1xyXG4gICAgICBwYXJhbWV0ZXJzOiBFeHByZXNzaW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZSB7XHJcbiAgICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb25zdGFudCB7XHJcbiAgICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlIHtcclxuICAgICAgY29kZTogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24ge1xyXG4gICAgICB0cmFuc2Zvcm1hdGlvbjogXCJ0cmFuc2xhdGVcIiB8IFwicm90YXRlXCIgfCBcInNjYWxlXCI7XHJcbiAgICAgIHBhcmFtZXRlcnM6IEV4cHJlc3Npb25bXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YSBpcyBhIHtAbGluayBFeHByZXNzaW9ufVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBFeHByZXNzaW9uIHtcclxuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oX2RhdGEpIHx8IGlzVmFyaWFibGUoX2RhdGEpIHx8IGlzQ29uc3RhbnQoX2RhdGEpIHx8IGlzQ29kZShfZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgRnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBGdW5jdGlvbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcImZ1bmN0aW9uXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgVmFyaWFibGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1ZhcmlhYmxlKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBWYXJpYWJsZSB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInZhbHVlXCIgaW4gX2RhdGEgJiYgdHlwZW9mIF9kYXRhLnZhbHVlID09IFwic3RyaW5nXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgQ29uc3RhbnR9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbnN0YW50KF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBDb25zdGFudCB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInZhbHVlXCIgaW4gX2RhdGEgJiYgdHlwZW9mIF9kYXRhLnZhbHVlID09IFwibnVtYmVyXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgQ29kZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29kZShfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgQ29kZSB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBfZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YSBpcyBhIHtAbGluayBUcmFuc2Zvcm1hdGlvbn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNmb3JtYXRpb24oX2RhdGE6IFJlY3Vyc2l2ZSk6IF9kYXRhIGlzIFRyYW5zZm9ybWF0aW9uIHtcclxuICAgICAgcmV0dXJuIHR5cGVvZiBfZGF0YSA9PSBcIm9iamVjdFwiICYmIFwidHJhbnNmb3JtYXRpb25cIiBpbiBfZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBtdXRhdGUgdGhlIHBhcnRpY2xlcyBvZiBhIHBhcnRpY2xlIHN5c3RlbS5cclxuICAgKiBBIGZ1bGwgcGFydGljbGUgc3lzdGVtIGlzIGNvbXBvc2VkIGJ5IGF0dGFjaGluZyBhIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0sIHtAbGluayBDb21wb25lbnRNZXNofSBhbmQge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsfSB0byB0aGUgc2FtZSB7QGxpbmsgTm9kZX0uIFxyXG4gICAqIEFkZGl0aW9uYWxseSBhIHtAbGluayBDb21wb25lbnRGYWNlQ2FtZXJhfSBjYW4gYmUgYXR0YWNoZWQgdG8gbWFrZSB0aGUgcGFydGljbGVzIGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUGFydGljbGVTeXN0ZW0gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgI2RhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW07XHJcbiAgICAvKiogTWFwIG9mIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzIHRvIGNvcnJlc3BvbmRpbmcgY29tcHV0ZWQge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfS4gXHJcbiAgICAgKiBUaGlzIHdheSBlYWNoIHBhcnRpY2xlIHN5c3RlbSByZXNvdXJjZSBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG11bHRpcGxlIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzICovXHJcbiAgICAjc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbTogTWFwPFNoYWRlckludGVyZmFjZSwgU2hhZGVyUGFydGljbGVTeXN0ZW0+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gUGFydGljbGVTeXN0ZW0ubmFtZSwgX2RhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW0gPSB7fSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5kYXRhID0gX2RhdGE7XHJcblxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBQYXJ0aWNsZURhdGEuU3lzdGVtIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXRhKF9kYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtKSB7XHJcbiAgICAgIHRoaXMuI2RhdGEgPSBfZGF0YTtcclxuICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5mb3JFYWNoKF9zaGFkZXIgPT4gX3NoYWRlci5kZWxldGVQcm9ncmFtKCkpO1xyXG4gICAgICB0aGlzLiNzaGFkZXJUb1NoYWRlclBhcnRpY2xlU3lzdGVtLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29ycmVzcG9uZGluZyB7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19IGZvciB0aGUgZ2l2ZW4gc2hhZGVyIHVuaXZlcnNhbCBkZXJpdmF0ZS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0gdG8gcmVuZGVyIHRoZSBwYXJ0aWNsZSBzeXN0ZW0uXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYWRlckZyb20oX3NvdXJjZTogU2hhZGVySW50ZXJmYWNlKTogU2hhZGVyUGFydGljbGVTeXN0ZW0ge1xyXG4gICAgICBpZiAoIXRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uaGFzKF9zb3VyY2UpKSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2xlU2hhZGVyOiBTaGFkZXJQYXJ0aWNsZVN5c3RlbSA9IG5ldyBTaGFkZXJQYXJ0aWNsZVN5c3RlbSgpO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgcGFydGljbGVTaGFkZXIuZGVmaW5lID0gWy4uLnBhcnRpY2xlU2hhZGVyLmRlZmluZSwgLi4uX3NvdXJjZS5kZWZpbmVdO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLnZlcnRleFNoYWRlclNvdXJjZSA9IF9zb3VyY2UuZ2V0VmVydGV4U2hhZGVyU291cmNlKCk7XHJcbiAgICAgICAgcGFydGljbGVTaGFkZXIuZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBfc291cmNlLmdldEZyYWdtZW50U2hhZGVyU291cmNlKCk7XHJcbiAgICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5zZXQoX3NvdXJjZSwgcGFydGljbGVTaGFkZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZXQoX3NvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmRhdGEgPSBfc2VyaWFsaXphdGlvbi5kYXRhO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuY2FjaGVkTXV0YXRvcnM7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zaGFkZXJNYXA7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVmZmVycyB0aGUgYm9uZSBkYXRhIGZyb20gdGhlIHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gaW50byBhIFdlYkdMIEJ1ZmZlclxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyQnVmZmVyXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi51c2VSZW5kZXJCdWZmZXJcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVwZGF0ZVJlbmRlckJ1ZmZlclwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJkZWxldGVSZW5kZXJCdWZmZXJcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLmRlbGV0ZVJlbmRlckJ1ZmZlclxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHVzZVJlbmRlckJ1ZmZlcih0aGlzOiBDb21wb25lbnRTa2VsZXRvbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucmVuZGVyQnVmZmVyKVxyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlckJhc2UoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgVU5JRk9STV9CTE9DS1MuU0tJTi5CSU5ESU5HLCB0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1cGRhdGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJCdWZmZXIpIHtcclxuICAgICAgICBjb25zdCBib25lc0J5dGVTaXplOiBudW1iZXIgPSAyNTYgKiAxNiAqIDQ7IC8vIENBVVRJT046IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBzaGFkZXIgc291cmNlIGNvZGUgd2hlcmUgMjU2IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib25lc1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckJ1ZmZlciA9IFJlbmRlcldlYkdMLmFzc2VydChjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBib25lc0J5dGVTaXplLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tdHhCb25lcy5sZW5ndGggKiAxNik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm10eEJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGRhdGEuc2V0KHRoaXMubXR4Qm9uZXNbaV0uZ2V0KCksIGkgKiAxNik7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICBjcmMzLmJ1ZmZlclN1YkRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgMCwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlbmRlckJ1ZmZlcilcclxuICAgICAgICBjcmMzLmRlbGV0ZUJ1ZmZlcih0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi8uLi9SZW5kZXIvUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGFuIGFycmF5IG9mIGJvbmVzICh7QGxpbmsgTm9kZX1zIHdpdGhpbiBhIHtAbGluayBHcmFwaH0pLiBSZWZlcmVuY2VkIGZyb20gYSB7QGxpbmsgQ29tcG9uZW50TWVzaH0gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBNZXNofSBhbmQgZW5hYmxlIHNraW5uaW5nIGZvciB0aGUgbWVzaC5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMi0yMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50U2tlbGV0b24gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLyoqIFRoZSBib25lcyB1c2VkIGZvciBza2lubmluZyAqL1xyXG4gICAgcHVibGljIGJvbmVzOiBOb2RlW107XHJcbiAgICAvKiogV2hlbiBhcHBsaWVkIHRvIHZlcnRpY2VzLCBpdCBtb3ZlcyB0aGVtIGZyb20gb2JqZWN0L21vZGVsIHNwYWNlIHRvIGJvbmUtbG9jYWwgc3BhY2UgYXMgaWYgdGhlIGJvbmUgd2VyZSBhdCBpdHMgaW5pdGlhbCBwb3NlICovXHJcbiAgICBwdWJsaWMgbXR4QmluZEludmVyc2VzOiBNYXRyaXg0eDRbXTsgLy8gVE9ETzogdGhpbmsgYWJvdXQgc2VyaWFsaXppbmcgdGhpcyBzZXBhcmF0ZWx5IHRvIG1ha2UgaXQgc2hhcmVhYmxlIGJldHdlZW4gc2tlbGV0b24gc2VyaWFsaXphdGlvbnNcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQnVmZmVyOiB1bmtub3duO1xyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib25lIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSB2ZXJ0aWNlcyBvZiBhIHtAbGluayBNZXNofSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG10eEJvbmVzOiBNYXRyaXg0eDRbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9uZXM6IE5vZGVbXSA9IFtdLCBfbXR4Qm9uZUludmVyc2VzOiBNYXRyaXg0eDRbXSA9IFtdKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYm9uZXMgPSBfYm9uZXM7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gX210eEJvbmVJbnZlcnNlcztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGlmICh0aGlzLm10eEJpbmRJbnZlcnNlc1tpXSA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0gPSB0aGlzLmJvbmVzW2ldLm10eFdvcmxkSW52ZXJzZS5jbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9ufS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVJlbmRlckJ1ZmZlcihfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbn0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVSZW5kZXJCdWZmZXIoKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b259LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyQnVmZmVyKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5vZGUgYXMgYSBib25lIHdpdGggaXRzIGJpbmQgaW52ZXJzZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZEJvbmUoX2JvbmU6IE5vZGUsIF9tdHhCaW5kSW52ZXJzZTogTWF0cml4NHg0ID0gX2JvbmUubXR4V29ybGRJbnZlcnNlLmNsb25lKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYm9uZXMucHVzaChfYm9uZSk7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzLnB1c2goX210eEJpbmRJbnZlcnNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJvbmUgaW4gdGhlIGJvbmVzIGFycmF5IHdoaWNoIGhhcyB0aGUgZ2l2ZW4gbmFtZSwgYW5kIC0xIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25hbWU6IHN0cmluZyk6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gYm9uZSBub2RlIGluIHRoZSBib25lIGFycmF5LCBvciAtMSBpZiBpdCBpcyBub3QgcHJlc2VudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25vZGU6IE5vZGUpOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaW5kZXhPZihfbmFtZTogc3RyaW5nIHwgTm9kZSk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9uYW1lKSA9PSBcInN0cmluZ1wiKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvbmVzLmZpbmRJbmRleCgoX2JvbmU6IE5vZGUpID0+IF9ib25lLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9uZXMuaW5kZXhPZihfbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBib25lIG1hdHJpY2VzIHRvIGJlIHVzZWQgYnkgdGhlIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGNvbnN0IG10eEJvbmUgb2YgdGhpcy5tdHhCb25lcylcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhCb25lKTtcclxuICAgICAgdGhpcy5tdHhCb25lcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgbXR4Qm9uZTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ib25lc1tpXS5tdHhXb3JsZCwgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0pO1xyXG4gICAgICAgIHRoaXMubXR4Qm9uZXMucHVzaChtdHhCb25lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBwb3NlIG9mIHRoaXMgc2tlbGV0b24gdG8gdGhlIGRlZmF1bHQgcG9zZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXRQb3NlKCk6IHZvaWQgeyAvLyBUT0RPOiB0ZXN0IHRoaXNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgdGhpcy5ib25lc1tpXS5tdHhMb2NhbC5jb3B5KE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4QmluZEludmVyc2VzW2ldKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uYm9uZXMgPSB0aGlzLmJvbmVzLm1hcChfYm9uZSA9PiBOb2RlLlBBVEhfRlJPTV9UTyh0aGlzLCBfYm9uZSkpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm10eEJpbmRJbnZlcnNlcyA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoTWF0cml4NHg0LCB0aGlzLm10eEJpbmRJbnZlcnNlcyk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG5cclxuICAgICAgY29uc3QgaG5kTm9kZURlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ib25lcyA9IF9zZXJpYWxpemF0aW9uLmJvbmVzLm1hcCgoX3BhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgbGV0IGJvbmU6IE5vZGUgPSBOb2RlLkZJTkQodGhpcywgX3BhdGgpO1xyXG4gICAgICAgICAgaWYgKCFib25lKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Tm9kZS5uYW1lfSBcIiR7dGhpcy5ub2RlLm5hbWV9XCIgJHtDb21wb25lbnRTa2VsZXRvbi5uYW1lfTogQ291bGQgbm90IGZpbmQgYm9uZSAke19wYXRofWApO1xyXG4gICAgICAgICAgcmV0dXJuIGJvbmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuXHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gPE1hdHJpeDR4NFtdPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbi5tdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnL0RlYnVnVGFyZ2V0LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWcvRGVidWcudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiVGltZS9UaW1lLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiRXZlbnQvRXZlbnQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJTZXJpYWxpemF0aW9uL011dGFibGUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJTZXJpYWxpemF0aW9uL1NlcmlhbGl6ZXIudHNcIi8+IFxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiR3JhcGgvTm9kZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbXBvbmVudC9Db21wb25lbnQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVyL1JlbmRlcldlYkdMLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBoeXNpY3MvSGVscGVyc1BoeXNpY3MudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQaHlzaWNzL0pvaW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGh5c2ljcy9Kb2ludEF4aWFsLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiVGV4dHVyZS9UZXh0dXJlLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiTWVzaC9NZXNoLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiTWF0ZXJpYWwvTWF0ZXJpYWwudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbXBvbmVudC9Db21wb25lbnRTa2VsZXRvbi50c1wiLz5cclxuXHJcblxyXG4vL2dsb2JhbCBmdW5jdGlvbnNcclxuZnVuY3Rpb24gaWZOdW1iZXIoX2NoZWNrOiBudW1iZXIsIF9kZWZhdWx0OiBudW1iZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiB0eXBlb2YgX2NoZWNrID09IFwidW5kZWZpbmVkXCIgPyBfZGVmYXVsdCA6IF9jaGVjaztcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdGhhdCB0aGUgQW5pbWF0aW9uIHVzZXMgdG8gbWFwIHRoZSBTZXF1ZW5jZXMgdG8gdGhlIEF0dHJpYnV0ZXMuXHJcbiAgICogQnVpbHQgb3V0IG9mIGEge0BsaW5rIE5vZGV9J3Mgc2VyaWFsc2F0aW9uLCBpdCBzd2FwcyB0aGUgdmFsdWVzIHdpdGgge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgW2F0dHJpYnV0ZTogc3RyaW5nXTogQW5pbWF0aW9uU3RydWN0dXJlW10gfCBBbmltYXRpb25TdHJ1Y3R1cmUgfCBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzIGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3I0IGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHc/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgZXh0ZW5kcyBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgcm90YXRpb24/OiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgfCBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjQ7XHJcbiAgICBzY2FsZT86IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMztcclxuICAgIHRyYW5zbGF0aW9uPzogQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbiBhc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIG5hbWVzIG9mIGxhYmxlcyB0byB0aW1lc3RhbXBzLlxyXG4gICogTGFiZWxzIG5lZWQgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24uXHJcbiAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkxhYmVsIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IEFuaW1hdGlvbiBFdmVudCBUcmlnZ2Vyc1xyXG4gICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAxOVxyXG4gICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25FdmVudFRyaWdnZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsbHkgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHZhcmlvdXMgZ2VuZXJhdGVkIHN0cnVjdHVyZXMgYW5kIGV2ZW50cy5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZW51bSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUge1xyXG4gICAgLyoqRGVmYXVsdDogZm9yd2FyZCwgY29udGlub3VzICovXHJcbiAgICBOT1JNQUwsXHJcbiAgICAvKipiYWNrd2FyZCwgY29udGlub3VzICovXHJcbiAgICBSRVZFUlNFLFxyXG4gICAgLyoqZm9yd2FyZCwgcmFzdGVyZWQgKi9cclxuICAgIFJBU1RFUkVELFxyXG4gICAgLyoqYmFja3dhcmQsIHJhc3RlcmVkICovXHJcbiAgICBSQVNURVJFRFJFVkVSU0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGRpZmZlcmVudCBwbGF5bW9kZXMgdGhlIGFuaW1hdGlvbiB1c2VzIHRvIHBsYXkgYmFjayBpdHMgYW5pbWF0aW9uLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCA9IFwibG9vcFwiLFxyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIG9uY2UgYW5kIHN0b3BzIGF0IHRoZSBsYXN0IGtleS9mcmFtZSovXHJcbiAgICBQTEFZX09OQ0UgPSBcInBsYXlPbmNlXCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gb25jZSBhbmQgc3RvcHMgb24gdGhlIGZpcnN0IGtleS9mcmFtZSAqL1xyXG4gICAgUExBWV9PTkNFX1JFU0VUID0gXCJwbGF5T25jZVJlc2V0XCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gbGlrZSBMT09QLCBidXQgYmFja3dhcmRzLiovXHJcbiAgICBSRVZFUlNFX0xPT1AgPSBcInJldmVyc2VMb29wXCIsXHJcbiAgICAvKipDYXVzZXMgdGhlIGFuaW1hdGlvbiBub3QgdG8gcGxheSBhdCBhbGwuIFVzZWZ1bCBmb3IganVtcGluZyB0byB2YXJpb3VzIHBvc2l0aW9ucyBpbiB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgcHJvY2VlZGluZyBpbiB0aGUgYW5pbWF0aW9uLiovXHJcbiAgICBTVE9QID0gXCJzdG9wXCJcclxuICAgIC8vVE9ETzogYWRkIGFuIElOSEVSSVQgYW5kIGEgUElOR1BPTkcgbW9kZVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gQU5JTUFUSU9OX1FVQU5USVpBVElPTiB7XHJcbiAgICAvL1RPRE86IGFkZCBhbiBpbi1kZXB0aCBkZXNjcmlwdGlvbiBvZiB3aGF0IGhhcHBlbnMgdG8gdGhlIGFuaW1hdGlvbiAoYW5kIGV2ZW50cykgZGVwZW5kaW5nIG9uIHRoZSBxdWFudGl6YXRpb24uIFVzZSBHcmFwaHMgdG8gZXhwbGFpbi5cclxuICAgIC8qKkNhbGN1bGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRpbWUuIElnbm9yZXMgRlBTIHZhbHVlIG9mIGFuaW1hdGlvbi4qL1xyXG4gICAgQ09OVElOT1VTID0gXCJjb250aW5vdXNcIixcclxuICAgIC8qKkxpbWl0cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIEZQUyB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLiBTa2lwcyBmcmFtZXMgaWYgbmVlZGVkLiovXHJcbiAgICBESVNDUkVURSA9IFwiZGlzY3JldGVcIixcclxuICAgIC8qKiBBZHZhbmNlcyB0aGUgdGltZSBlYWNoIGZyYW1lIGFjY29yZGluZyB0byB0aGUgRlBTIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIGlnbm9yaW5nIHRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIGZyYW1lcy4gRG9lc24ndCBza2lwIGFueSBmcmFtZXMuKi9cclxuICAgIEZSQU1FUyA9IFwiZnJhbWVzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc2NyaWJlcyBhbmQgY29udHJvbHMgYW5kIGFuaW1hdGlvbiBieSB5aWVsZGluZyBtdXRhdG9ycyBcclxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIHN0b3JlZCB7QGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlfSBhbmQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXNcclxuICAgKiBBcHBsaWVkIHRvIGEge0BsaW5rIE5vZGV9IGRpcmVjdGx5IHZpYSBzY3JpcHQgb3Ige0BsaW5rIENvbXBvbmVudEFuaW1hdG9yfS5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMTAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8vIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIEFuaW1hdGlvbiA9IEFuaW1hdGlvbjtcclxuICAgIC8vIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEFuaW1hdGlvbltdID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uKTtcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRvdGFsVGltZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbHM6IEFuaW1hdGlvbkxhYmVsID0ge307IC8vIGEgbGFiZWwgbWFya3MgYSBzcGVjaWZpYyB0aW1lIHRvIGNvbnZlbmllbnRseSBqdW1wIHRvIHVzaW5nIGEgdGV4dCBpZGVudGlmaWVyXHJcbiAgICAvLyBzdGVwc1BlclNlY29uZDogbnVtYmVyID0gMTA7XHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uU3RydWN0dXJlOiBBbmltYXRpb25TdHJ1Y3R1cmU7IC8vIFRPRE86IGlmIHNldCB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgKGFuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQpXHJcbiAgICBwdWJsaWMgZXZlbnRzOiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgIHByb3RlY3RlZCBmcmFtZXNQZXJTZWNvbmQ6IG51bWJlciA9IDYwOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBhbmQgaXRzIGFjY2Vzc29ycyB0byAjZnJhbWVzUGVyU2Vjb25kP1xyXG5cclxuICAgIC8vIHByb2Nlc3NlZCBldmVudGxpc3QgYW5kIGFuaW1hdGlvbiBzdHJ1Y3V0cmVzIGZvciBwbGF5YmFjay5cclxuICAgIHByaXZhdGUgZXZlbnRzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25FdmVudFRyaWdnZXI+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuICAgICNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvblN0cnVjdHVyZT4oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IEFuaW1hdGlvbi5uYW1lLCBfYW5pbVN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge30sIF9mcHM6IG51bWJlciA9IDYwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IF9hbmltU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLiNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkLnNldChBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuTk9STUFMLCBfYW5pbVN0cnVjdHVyZSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZwcztcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgQW5pbWF0aW9uKTogbnVtYmVyIHsgcmV0dXJuIEFuaW1hdGlvbi5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdldExhYmVscygpOiBFbnVtZXJhdG9yIHtcclxuICAgICAgLy9UT0RPOiB0aGlzIGFjdHVhbGx5IG5lZWRzIHRlc3RpbmdcclxuICAgICAgbGV0IGVuOiBFbnVtZXJhdG9yID0gbmV3IEVudW1lcmF0b3IodGhpcy5sYWJlbHMpO1xyXG4gICAgICByZXR1cm4gZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmcHMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZnBzKF9mcHM6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9mcHM7XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhpcyBhbmltYXRpb25zIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IHdpdGggdGhlIGluZm9ybWF0aW9uIHRvIGFwcGx5IHRvIHRoZSB7QGxpbmsgTm9kZX0gdG8gYW5pbWF0ZVxyXG4gICAgICogaW4gdGhlIHN0YXRlIHRoZSBhbmltYXRpb24gaXMgaW4gYXQgdGhlIGdpdmVuIHRpbWUsIGRpcmVjdGlvbiBhbmQgcXVhbnRpemF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGF0ZShfdGltZTogbnVtYmVyLCBfZGlyZWN0aW9uOiBudW1iZXIsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG06IE11dGF0b3IgPSB7fTtcclxuICAgICAgbGV0IGFuaW1hdGlvblN0cnVjdHVyZTogQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFO1xyXG5cclxuICAgICAgaWYgKF9xdWFudGl6YXRpb24gPT0gQU5JTUFUSU9OX1FVQU5USVpBVElPTi5DT05USU5PVVMpXHJcbiAgICAgICAgYW5pbWF0aW9uU3RydWN0dXJlID0gX2RpcmVjdGlvbiA8IDAgPyBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSA6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbmltYXRpb25TdHJ1Y3R1cmUgPSBfZGlyZWN0aW9uIDwgMCA/IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UgOiBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRUQ7XHJcblxyXG4gICAgICBtID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck11dGF0b3IodGhpcy5nZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoYW5pbWF0aW9uU3RydWN0dXJlKSwgX3RpbWUpO1xyXG4gICAgICByZXR1cm4gbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZXZlbnRzIHRoZSB7QGxpbmsgQ29tcG9uZW50QW5pbWF0b3J9IG5lZWRzIHRvIGZpcmUgYmV0d2VlbiBfbWluIGFuZCBfbWF4IGlucHV0IHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIGFuaW1hdGlvbiBpcyBzdXBwb3NlZCB0byBydW4gaW4uID4wID09IGZvcndhcmQsIDAgPT0gc3RvcCwgPDAgPT0gYmFja3dhcmRzXHJcbiAgICAgKiBAcmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUgY3VzdG9tIGV2ZW50cyB0byBmaXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXZlbnRzVG9GaXJlKF9taW46IG51bWJlciwgX21heDogbnVtYmVyLCBfcXVhbnRpemF0aW9uOiBBTklNQVRJT05fUVVBTlRJWkFUSU9OLCBfZGlyZWN0aW9uOiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBtaW5TZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9taW4gLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIGxldCBtYXhTZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9tYXggLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIF9taW4gPSBfbWluICUgdGhpcy50b3RhbFRpbWU7XHJcbiAgICAgIF9tYXggPSBfbWF4ICUgdGhpcy50b3RhbFRpbWU7XHJcblxyXG4gICAgICB3aGlsZSAobWluU2VjdGlvbiA8PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciA9IHRoaXMuZ2V0Q29ycmVjdEV2ZW50TGlzdChfZGlyZWN0aW9uLCBfcXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAobWluU2VjdGlvbiA9PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgICBldmVudExpc3QgPSBldmVudExpc3QuY29uY2F0KHRoaXMuY2hlY2tFdmVudHNCZXR3ZWVuKGV2ZW50VHJpZ2dlcnMsIF9taW4sIF9tYXgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXZlbnRMaXN0ID0gZXZlbnRMaXN0LmNvbmNhdCh0aGlzLmNoZWNrRXZlbnRzQmV0d2VlbihldmVudFRyaWdnZXJzLCBfbWluLCB0aGlzLnRvdGFsVGltZSkpO1xyXG4gICAgICAgICAgX21pbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pblNlY3Rpb24rKztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGV2ZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gRXZlbnQgdG8gdGhlIExpc3Qgb2YgZXZlbnRzLlxyXG4gICAgICogQHBhcmFtIF9uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCAobmVlZHMgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24pLlxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50IChpbiBtaWxsaXNlY29uZHMpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RXZlbnQoX25hbWU6IHN0cmluZywgX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmV2ZW50c1tfbmFtZV0gPSBfdGltZTtcclxuICAgICAgdGhpcy5ldmVudHNQcm9jZXNzZWQuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgbGlzdCBvZiBldmVudHMuXHJcbiAgICAgKiBAcGFyYW0gX25hbWUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgdGhpcy5ldmVudHNbX25hbWVdO1xyXG4gICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pQ2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBBbmltYXRpb24uIENhbGN1bGF0aW9uLWhlYXZ5LCB1c2Ugb25seSBpZiBhY3R1YWxseSBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVUb3RhbFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG90YWxUaW1lID0gMDtcclxuICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICAvLyBpZiAodGhpcy50b3RhbFRpbWUgPT0gMCkgLy8gYW5pbWF0aW9ucyB3aXRoIG9uZSBrZXlmcmFtZSBuZWVkIGEgdG90YWwgdGltZSAhPSAwIHRvIHdvcmtcclxuICAgICAgLy8gICB0aGlzLnRvdGFsVGltZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRvIHVzZSBmb3IgYW5pbWF0aW9uIHNhbXBsaW5nIHdoZW4gYXBwbHlpbmcgYSBwbGF5bW9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9kYWxUaW1lKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFLCBfdGltZVN0b3A6IG51bWJlciA9IF90aW1lKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgLy8gcmV0dXJuIHRoaXMubG9jYWxUaW1lLmdldE9mZnNldCgpO1xyXG4gICAgICAgICAgcmV0dXJuIF90aW1lU3RvcDtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0U6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvdGFsVGltZSAtIDAuMDE7ICAgICAvL1RPRE86IHRoaXMgbWlnaHQgY2F1c2Ugc29tZSBpc3N1ZXNcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBfdGltZVN0b3AgaW5zdGVhZD9cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lICsgMC4wMTsgICAgIC8vVE9ETzogdGhpcyBtaWdodCBjYXVzZSBzb21lIGlzc3Vlc1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGltZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGRpcmVjdGlvbiB0aGUgYW5pbWF0aW9uIHNob3VsZCBjdXJyZW50bHkgYmUgcGxheWluZyBpbi5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgdGltZSBhdCB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGRpcmVjdGlvblxyXG4gICAgICogQHJldHVybnMgMSBpZiBmb3J3YXJkLCAwIGlmIHN0b3AsIC0xIGlmIGJhY2t3YXJkc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgLy8gY2FzZSBBTklNQVRJT05fUExBWU1PREUuUElOR1BPTkc6XHJcbiAgICAgICAgLy8gICBpZiAoTWF0aC5mbG9vcihfdGltZSAvIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZSkgJSAyID09IDApXHJcbiAgICAgICAgLy8gICAgIHJldHVybiAxO1xyXG4gICAgICAgIC8vICAgZWxzZVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgY2FzZSBBTklNQVRJT05fUExBWU1PREUuUkVWRVJTRV9MT09QOlxyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNhc2UgQU5JTUFUSU9OX1BMQVlNT0RFLlBMQVlfT05DRTpcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgczogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGxhYmVsczoge30sXHJcbiAgICAgICAgZXZlbnRzOiB7fSxcclxuICAgICAgICBmcmFtZXNQZXJTZWNvbmQ6IHRoaXMuZnJhbWVzUGVyU2Vjb25kXHJcbiAgICAgICAgLy8gc3BzOiB0aGlzLnN0ZXBzUGVyU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICBzLmxhYmVsc1tuYW1lXSA9IHRoaXMubGFiZWxzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcclxuICAgICAgICBzLmV2ZW50c1tuYW1lXSA9IHRoaXMuZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHMuYW5pbWF0aW9uU3RydWN0dXJlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclNlcmlhbGl6YXRpb24odGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgLy8gdGhpcy5zdGVwc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLnNwcztcclxuICAgICAgdGhpcy5sYWJlbHMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfc2VyaWFsaXphdGlvbi5sYWJlbHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IF9zZXJpYWxpemF0aW9uLmxhYmVsc1tuYW1lXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV2ZW50cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lIGluIF9zZXJpYWxpemF0aW9uLmV2ZW50cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzW25hbWVdID0gX3NlcmlhbGl6YXRpb24uZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0gYXdhaXQgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG5cclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZCA9IG5ldyBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+KCk7XHJcblxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsVGltZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRvdGFsVGltZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIEFuaW1hdGlvblN0cnVjdHVyZSBhbmQgcmV0dXJucyB0aGUgU2VyaWFsaXphdGlvbiBvZiBzYWlkIFN0cnVjdHVyZS5cclxuICAgICAqIEBwYXJhbSBfc3RydWN0dXJlIFRoZSBBbmltYXRpb24gU3RydWN0dXJlIGF0IHRoZSBjdXJyZW50IGxldmVsIHRvIHRyYW5zZm9ybSBpbnRvIHRoZSBTZXJpYWxpemF0aW9uLlxyXG4gICAgICogQHJldHVybnMgdGhlIGZpbGxlZCBTZXJpYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yU2VyaWFsaXphdGlvbihfc3RydWN0dXJlOiBPYmplY3QpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBfc3RydWN0dXJlKSB7XHJcbiAgICAgICAgbGV0IHN0cnVjdHVyZU9yU2VxdWVuY2U6IE9iamVjdCA9ICg8R2VuZXJhbD5fc3RydWN0dXJlKVtwcm9wZXJ0eV07XHJcbiAgICAgICAgaWYgKHN0cnVjdHVyZU9yU2VxdWVuY2UgaW5zdGFuY2VvZiBBbmltYXRpb25TZXF1ZW5jZSlcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25bcHJvcGVydHldID0gc3RydWN0dXJlT3JTZXF1ZW5jZS5zZXJpYWxpemUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9uW3Byb3BlcnR5XSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JTZXJpYWxpemF0aW9uKHN0cnVjdHVyZU9yU2VxdWVuY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmF2ZXJzZXMgYSBTZXJpYWxpemF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBBbmltYXRpb25TdHJ1Y3R1cmUuXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb24gVGhlIHNlcmlhbGl6YXRpb24gdG8gdHJhbnNmZXIgaW50byBhbiBBbmltYXRpb25TdHJ1Y3R1cmVcclxuICAgICAqIEByZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIEFuaW1hdGlvblN0cnVjdHVyZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8QW5pbWF0aW9uU3RydWN0dXJlPiB7XHJcbiAgICAgIGxldCBzdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgaWYgKF9zZXJpYWxpemF0aW9uW25dLmFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgYW5pbVNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgICAgIHN0cnVjdHVyZVtuXSA9IDxBbmltYXRpb25TZXF1ZW5jZT4oYXdhaXQgYW5pbVNlcS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltuXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdHJ1Y3R1cmVbbl0gPSBhd2FpdCB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yRGVzZXJpYWxpemF0aW9uKF9zZXJpYWxpemF0aW9uW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnRzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRDb3JyZWN0RXZlbnRMaXN0KF9kaXJlY3Rpb246IG51bWJlciwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmIChfcXVhbnRpemF0aW9uICE9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgaWYgKF9kaXJlY3Rpb24gPj0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoX2RpcmVjdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIHtAbGluayBBbmltYXRpb25TdHJ1Y3R1cmV9IGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IGRlc2NyaWJpbmcgdGhlIHN0YXRlIGF0IHRoZSBnaXZlbiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JNdXRhdG9yKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbmV3TXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBuZXdNdXRhdG9yW25dID0gKDxBbmltYXRpb25TZXF1ZW5jZT5fc3RydWN0dXJlW25dKS5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld011dGF0b3Jbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTXV0YXRvcig8QW5pbWF0aW9uU3RydWN0dXJlPl9zdHJ1Y3R1cmVbbl0sIF90aW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdNdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIHRoZSBjdXJyZW50IEFuaW1hdGlvblN0cmN1dHVyZSB0byBmaW5kIHRoZSB0b3RhbFRpbWUgb2YgdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gX3N0cnVjdHVyZSBUaGUgc3RydWN0dXJlIHRvIHRyYXZlcnNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JUaW1lKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gPEFuaW1hdGlvblNlcXVlbmNlPl9zdHJ1Y3R1cmVbbl07XHJcbiAgICAgICAgICBpZiAoc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc2VxdWVuY2VUaW1lOiBudW1iZXIgPSBzZXF1ZW5jZS5nZXRLZXkoc2VxdWVuY2UubGVuZ3RoIC0gMSkudGltZTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbFRpbWUgPSBNYXRoLm1heChzZXF1ZW5jZVRpbWUsIHRoaXMudG90YWxUaW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUoPEFuaW1hdGlvblN0cnVjdHVyZT5fc3RydWN0dXJlW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25TdHJjdXR1cmV9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gZ2V0XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWVzdGVkIFtbQGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlXV1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvblN0cnVjdHVyZSB7XHJcbiAgICAgIGlmICghdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5oYXMoX3R5cGUpKSB7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgICBsZXQgYWU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLk5PUk1BTDpcclxuICAgICAgICAgICAgYWUgPSB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0U6XHJcbiAgICAgICAgICAgIGFlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck5ld1N0cnVjdHVyZSh0aGlzLmdldFByb2Nlc3NlZEFuaW1hdGlvblN0cnVjdHVyZShBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSksIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuc2V0KF90eXBlLCBhZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25FdmVudFRyaWdnZXJ9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIFRoZSB0eXBlIG9mIEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB0byBnZXRcclxuICAgICAqIEByZXR1cm5zIHRoZSByZXF1ZXN0ZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmICghdGhpcy5ldmVudHNQcm9jZXNzZWQuaGFzKF90eXBlKSkge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgICAgbGV0IGV2OiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw6XHJcbiAgICAgICAgICAgIGV2ID0gdGhpcy5ldmVudHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRTpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKHRoaXMuZXZlbnRzKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRDpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJhc3RlcmVkRXZlbnRUcmlnZ2Vycyh0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRURSRVZFUlNFOlxyXG4gICAgICAgICAgICBldiA9IHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5zZXQoX3R5cGUsIGV2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ldmVudHNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXZlcnNlcyBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgdG8gYXBwbHkgYSByZWNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdG8gc3RvcmUgaW4gYSBuZXcgU3RydWN0dXJlLlxyXG4gICAgICogQHBhcmFtIF9vbGRTdHJ1Y3R1cmUgVGhlIG9sZCBzdHJ1Y3R1cmUgdG8gdHJhdmVyc2VcclxuICAgICAqIEBwYXJhbSBfZnVuY3Rpb25Ub1VzZSBUaGUgZnVuY3Rpb24gdG8gdXNlIHRvIHJlY2FsY3VsYXRlZCB0aGUgc3RydWN0dXJlLlxyXG4gICAgICogQHJldHVybnMgQSBuZXcgQW5pbWF0aW9uIFN0cnVjdHVyZSB3aXRoIHRoZSByZWNhbHVsYXRlZCBBbmltYXRpb24gU2VxdWVuY2VzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKF9vbGRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX2Z1bmN0aW9uVG9Vc2U6IEZ1bmN0aW9uKTogQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgICAgbGV0IG5ld1N0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcbiAgICAgIGZvciAobGV0IG4gaW4gX29sZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGlmIChfb2xkU3RydWN0dXJlW25dIGluc3RhbmNlb2YgQW5pbWF0aW9uU2VxdWVuY2UpIHtcclxuICAgICAgICAgIG5ld1N0cnVjdHVyZVtuXSA9IF9mdW5jdGlvblRvVXNlKF9vbGRTdHJ1Y3R1cmVbbl0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdTdHJ1Y3R1cmVbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKDxBbmltYXRpb25TdHJ1Y3R1cmU+X29sZFN0cnVjdHVyZVtuXSwgX2Z1bmN0aW9uVG9Vc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3U3RydWN0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHJldmVyc2VkIEFuaW1hdGlvbiBTZXF1ZW5jZSBvdXQgb2YgYSBnaXZlbiBTZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgVGhlIHJldmVyc2VkIFNlcXVlbmNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlKF9zZXF1ZW5jZTogQW5pbWF0aW9uU2VxdWVuY2UpOiBBbmltYXRpb25TZXF1ZW5jZSB7XHJcbiAgICAgIGxldCBzZXE6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb2xkS2V5OiBBbmltYXRpb25LZXkgPSBfc2VxdWVuY2UuZ2V0S2V5KGkpO1xyXG4gICAgICAgIGxldCBrZXk6IEFuaW1hdGlvbktleSA9IG5ldyBBbmltYXRpb25LZXkodGhpcy50b3RhbFRpbWUgLSBvbGRLZXkudGltZSwgb2xkS2V5LnZhbHVlLCBvbGRLZXkuaW50ZXJwb2xhdGlvbiwgb2xkS2V5LnNsb3BlT3V0LCBvbGRLZXkuc2xvcGVJbik7XHJcbiAgICAgICAgc2VxLmFkZEtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcmFzdGVyZWQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfSBvdXQgb2YgYSBnaXZlbiBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJhc3RlcmVkIHNlcXVlbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJhc3RlcmVkU2VxdWVuY2UoX3NlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZSk6IEFuaW1hdGlvblNlcXVlbmNlIHtcclxuICAgICAgbGV0IHNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IGZyYW1lVGltZTogbnVtYmVyID0gMTAwMCAvIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50b3RhbFRpbWU7IGkgKz0gZnJhbWVUaW1lKSB7XHJcbiAgICAgICAgbGV0IGtleTogQW5pbWF0aW9uS2V5ID0gbmV3IEFuaW1hdGlvbktleShpLCBfc2VxdWVuY2UuZXZhbHVhdGUoaSksIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNPTlNUQU5ULCAwLCAwKTtcclxuICAgICAgICBzZXEuYWRkS2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmV2ZXJzZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn0gb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBvbmUuICBcclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIHRoZSBldmVudCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBuZXcgb25lIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJldmVyc2VkIGV2ZW50IG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50cykge1xyXG4gICAgICAgIGFlW25hbWVdID0gdGhpcy50b3RhbFRpbWUgLSBfZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSByYXN0ZXJlZCB7QGxpbmsgQW5pbWF0aW9uRXZlbnRUcmlnZ2VyfSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIG9uZS4gIFxyXG4gICAgICogQHBhcmFtIF9ldmVudHMgdGhlIGV2ZW50IG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG5ldyBvbmUgb3V0IG9mXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmFzdGVyZWQgZXZlbnQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGxldCBmcmFtZVRpbWU6IG51bWJlciA9IDEwMDAgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfZXZlbnRzKSB7XHJcbiAgICAgICAgYWVbbmFtZV0gPSBfZXZlbnRzW25hbWVdIC0gKF9ldmVudHNbbmFtZV0gJSBmcmFtZVRpbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGljaCBldmVudHMgbGF5IGJldHdlZW4gdHdvIGdpdmVuIHRpbWVzIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb25lcyB0aGF0IGRvLlxyXG4gICAgICogQHBhcmFtIF9ldmVudFRyaWdnZXJzIFRoZSBldmVudCBvYmplY3QgdG8gY2hlY2sgdGhlIGV2ZW50cyBpbnNpZGUgb2ZcclxuICAgICAqIEBwYXJhbSBfbWluIHRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSB0byBjaGVjayBiZXR3ZWVuIChpbmNsdXNpdmUpXHJcbiAgICAgKiBAcGFyYW0gX21heCB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UgdG8gY2hlY2sgYmV0d2VlbiAoZXhjbHVzaXZlKVxyXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgaW4gdGhlIGdpdmVuIHJhbmdlLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0V2ZW50c0JldHdlZW4oX2V2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudHNUb1RyaWdnZXI6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50VHJpZ2dlcnMpIHtcclxuICAgICAgICBpZiAoX21pbiA8PSBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSAmJiBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSA8IF9tYXgpIHtcclxuICAgICAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXZlbnRzVG9UcmlnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyBiZXR3ZWVuIHtAbGluayBBbmltYXRpb25LZXl9cy5cclxuICAgKiBSZXByZXNlbnRlZCBpbnRlcm5hbGx5IGJ5IGEgY3ViaWMgZnVuY3Rpb24gKGBmKHgpID0gYXjCsyArIGJ4wrIgKyBjeCArIGRgKS4gXHJcbiAgICogT25seSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbiB0aGUga2V5cyBjaGFuZ2UsIHNvIGF0IHJ1bnRpbWUgaXQgc2hvdWxkIG9ubHkgYmUgY2FsY3VsYXRlZCBvbmNlLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uRnVuY3Rpb24ge1xyXG4gICAgcHJpdmF0ZSBhOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBiOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBrZXlJbjogQW5pbWF0aW9uS2V5O1xyXG4gICAgcHJpdmF0ZSBrZXlPdXQ6IEFuaW1hdGlvbktleTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2tleUluOiBBbmltYXRpb25LZXksIF9rZXlPdXQ6IEFuaW1hdGlvbktleSA9IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2V0S2V5SW4oX2tleUluOiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNldEtleU91dChfa2V5T3V0OiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBvZiB0aGlzIGN1YmljIGZ1bmN0aW9uLiBgZih4KSA9IGF4wrMgKyBieMKyICsgY3ggKyBkYFxyXG4gICAgICogVXNlZCBieSBlZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IHsgYTogbnVtYmVyOyBiOiBudW1iZXI7IGM6IG51bWJlcjsgZDogbnVtYmVyIH0ge1xyXG4gICAgICByZXR1cm4geyBhOiB0aGlzLmEsIGI6IHRoaXMuYiwgYzogdGhpcy5jLCBkOiB0aGlzLmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBhdCB0aGUgZ2l2ZW4gdGltZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gaW4gbWlsbGlzZWNvbmRzLiBXaWxsIGJlIGNvcnJlY3RlZCBmb3Igb2Zmc2V0IGludGVybmFsbHkuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV2YWx1YXRlKF90aW1lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfdGltZSAtPSB0aGlzLmtleUluLnRpbWU7XHJcbiAgICAgIGxldCB0aW1lMjogbnVtYmVyID0gX3RpbWUgKiBfdGltZTtcclxuICAgICAgbGV0IHRpbWUzOiBudW1iZXIgPSB0aW1lMiAqIF90aW1lO1xyXG4gICAgICByZXR1cm4gdGhpcy5hICogdGltZTMgKyB0aGlzLmIgKiB0aW1lMiArIHRoaXMuYyAqIF90aW1lICsgdGhpcy5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogKFJlLSlDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdWJpYyBmdW5jdGlvbi5cclxuICAgICAqIFNlZSBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMxNzM0NjkvY2FsY3VsYXRlLWN1YmljLWVxdWF0aW9uLWZyb20tdHdvLXBvaW50cy1hbmQtdHdvLXNsb3Blcy12YXJpYWJseVxyXG4gICAgICogYW5kIGh0dHBzOi8vamlya2FkZWxsb3JvLmdpdGh1Yi5pby9GVURHRS9Eb2N1bWVudGF0aW9uL0xvZ3MvMTkwNDEwX05vdGl6ZW5fTFNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLmtleUluKSB7XHJcbiAgICAgICAgdGhpcy5kID0gdGhpcy5jID0gdGhpcy5iID0gdGhpcy5hID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmtleU91dCB8fCB0aGlzLmtleUluLmludGVycG9sYXRpb24gPT0gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ09OU1RBTlQpIHtcclxuICAgICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuYyA9IHRoaXMuYiA9IHRoaXMuYSA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgeDE6IG51bWJlciA9IHRoaXMua2V5T3V0LnRpbWUgLSB0aGlzLmtleUluLnRpbWU7XHJcblxyXG4gICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5rZXlJbi5pbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUikge1xyXG4gICAgICAgIHRoaXMuYyA9ICh0aGlzLmtleU91dC52YWx1ZSAtIHRoaXMua2V5SW4udmFsdWUpIC8geDE7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmMgPSB0aGlzLmtleUluLnNsb3BlT3V0O1xyXG4gICAgICB0aGlzLmEgPSAoLXgxICogKHRoaXMua2V5SW4uc2xvcGVPdXQgKyB0aGlzLmtleU91dC5zbG9wZUluKSAtIDIgKiB0aGlzLmtleUluLnZhbHVlICsgMiAqIHRoaXMua2V5T3V0LnZhbHVlKSAvIC1NYXRoLnBvdyh4MSwgMyk7XHJcbiAgICAgIHRoaXMuYiA9ICh0aGlzLmtleU91dC5zbG9wZUluIC0gdGhpcy5rZXlJbi5zbG9wZU91dCAtIDMgKiB0aGlzLmEgKiBNYXRoLnBvdyh4MSwgMikpIC8gKDIgKiB4MSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQW4ge0BsaW5rIEFuaW1hdGlvbn0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBbmltYXRpb25HTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKEFuaW1hdGlvbikge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8QW5pbWF0aW9uR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgIC8vICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gICBzZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnBzOyAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3Q/P1xyXG4gICAgLy8gICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICBDT05TVEFOVCxcclxuICAgIExJTkVBUixcclxuICAgIENVQklDXHJcbiAgfVxyXG4gIC8vIHR5cGUgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiA9IFwiY29uc3RhbnRcIiB8IFwibGluZWFyXCIgfCBcImN1YmljXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGNvbnRpbm91cyBwb2ludHMgaW4gdGltZSB0aGVpciBhY2NvbXBhbnlpbmcgdmFsdWVzIGFzIHdlbGwgYXMgdGhlaXIgc2xvcGVzLiBcclxuICAgKiBBbHNvIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyB0aGF0IGNvbWUgaW4gYW5kIG91dCBvZiB0aGUgc2lkZXMuIFxyXG4gICAqIFRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyBhcmUgaGFuZGxlZCBieSB0aGUge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICogSWYgdGhlIHByb3BlcnR5IGNvbnN0YW50IGlzIHRydWUsIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgYW5kIHdpbCBub3QgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4gdGhpcyBhbmQgdGhlIG5leHQga2V5IGluIGEgc2VxdWVuY2VcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvbktleSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gVE9ETzogY2hlY2sgaWYgZnVuY3Rpb25JbiBjYW4gYmUgcmVtb3ZlZFxyXG4gICAgLyoqRG9uJ3QgbW9kaWZ5IHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiovXHJcbiAgICBwdWJsaWMgZnVuY3Rpb25JbjogQW5pbWF0aW9uRnVuY3Rpb247XHJcbiAgICAvKipEb24ndCBtb2RpZnkgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuKi9cclxuICAgIHB1YmxpYyBmdW5jdGlvbk91dDogQW5pbWF0aW9uRnVuY3Rpb247XHJcblxyXG4gICAgI3RpbWU6IG51bWJlcjtcclxuICAgICN2YWx1ZTogbnVtYmVyO1xyXG4gICAgI2ludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OO1xyXG5cclxuICAgICNzbG9wZUluOiBudW1iZXIgPSAwO1xyXG4gICAgI3Nsb3BlT3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogbnVtYmVyID0gMCwgX3ZhbHVlOiBudW1iZXIgPSAwLCBfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04gPSBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQywgX3Nsb3BlSW46IG51bWJlciA9IDAsIF9zbG9wZU91dDogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuI3ZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNpbnRlcnBvbGF0aW9uID0gX2ludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2xvcGVJbjtcclxuICAgICAgdGhpcy4jc2xvcGVPdXQgPSBfc2xvcGVPdXQ7XHJcblxyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0ID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIGNvbXBhcmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBpbiBhbiBhcnJheSBzb3J0IGZ1bmN0aW9uIHRvIHNvcnQgdGhlIGtleXMgYnkgdGhlaXIgdGltZS5cclxuICAgICAqIEBwYXJhbSBfYSB0aGUgYW5pbWF0aW9uIGtleSB0byBjaGVja1xyXG4gICAgICogQHBhcmFtIF9iIHRoZSBhbmltYXRpb24ga2V5IHRvIGNoZWNrIGFnYWluc3RcclxuICAgICAqIEByZXR1cm5zID4wIGlmIGE+YiwgMCBpZiBhPWIsIDwwIGlmIGE8YlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUoX2E6IEFuaW1hdGlvbktleSwgX2I6IEFuaW1hdGlvbktleSk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS50aW1lIC0gX2IudGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jdGltZSA9IF90aW1lO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB2YWx1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN2YWx1ZSA9IF92YWx1ZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbkluLmNhbGN1bGF0ZSgpO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0LmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaW50ZXJwb2xhdGlvbigpOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpbnRlcnBvbGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04pIHtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9pbnRlcnBvbGF0aW9uO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZUluKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzbG9wZUluO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2xvcGVJbihfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZUluID0gX3Nsb3BlO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZU91dCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2xvcGVPdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzbG9wZU91dChfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zbG9wZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbk91dC5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udGltZSA9IHRoaXMuI3RpbWU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udmFsdWUgPSB0aGlzLiN2YWx1ZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlcnBvbGF0aW9uID0gdGhpcy4jaW50ZXJwb2xhdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZUluID0gdGhpcy4jc2xvcGVJbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZU91dCA9IHRoaXMuI3Nsb3BlT3V0O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3NlcmlhbGl6YXRpb24udGltZTtcclxuICAgICAgdGhpcy4jdmFsdWUgPSBfc2VyaWFsaXphdGlvbi52YWx1ZTtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2VyaWFsaXphdGlvbi5zbG9wZUluO1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zZXJpYWxpemF0aW9uLnNsb3BlT3V0O1xyXG4gICAgICAvLyBpZiAoX3NlcmlhbGl6YXRpb24uaW50ZXJwb2xhdGlvbiA9PSB1bmRlZmluZWQpXHJcbiAgICAgIC8vICAgaWYgKF9zZXJpYWxpemF0aW9uLmNvbnN0YW50KSAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGNvbnN0YW50IGlzIHJlbW92ZWRcclxuICAgICAgLy8gICAgIHRoaXMuI2ludGVycG9sYXRpb24gPSBcImNvbnN0YW50XCI7XHJcbiAgICAgIC8vICAgZWxzZVxyXG4gICAgICAvLyAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IFwiY3ViaWNcIjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvL1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBzZXF1ZW5jZSBvZiB7QGxpbmsgQW5pbWF0aW9uS2V5fXMgdGhhdCBpcyBtYXBwZWQgdG8gYW4gYXR0cmlidXRlIG9mIGEge0BsaW5rIE5vZGV9IG9yIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgaW5zaWRlIHRoZSB7QGxpbmsgQW5pbWF0aW9ufS5cclxuICAgKiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gbW9kaWZ5IHNhaWQga2V5c1xyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcXVlbmNlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwcml2YXRlIGtleXM6IEFuaW1hdGlvbktleVtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfa2V5czogQW5pbWF0aW9uS2V5W10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmtleXMgPSBfa2V5cztcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiBwb2ludCBpbiB0aW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBzZXF1ZW5jZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiB0aW1lLiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZShfdGltZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMua2V5cy5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1RPRE86IHNob3VsZG4ndCByZXR1cm4gMCBidXQgc29tZXRoaW5nIGluZGljYXRpbmcgbm8gY2hhbmdlLCBsaWtlIG51bGwuIHByb2JhYmx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgaW4gTm9kZSBhcyB3ZWxsIHRvIGlnbm9yZSBub24tbnVtZXJpYyB2YWx1ZXMgaW4gdGhlIGFwcGx5QW5pbWF0aW9uIGZ1bmN0aW9uXHJcbiAgICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID09IDEgfHwgdGhpcy5rZXlzWzBdLnRpbWUgPj0gX3RpbWUpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5c1swXS52YWx1ZTtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXNbaV0udGltZSA8PSBfdGltZSAmJiBfdGltZSA8IHRoaXMua2V5c1tpICsgMV0udGltZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMua2V5c1tpXS5mdW5jdGlvbk91dC5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLmtleXNbaV0udGltZSA9PSBfdGltZSlcclxuICAgICAgICAvLyAgIHJldHVybiB0aGlzLmtleXNbaV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMua2V5c1t0aGlzLmtleXMubGVuZ3RoIC0gMV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGtleSB0byB0aGUgc2VxdWVuY2UuXHJcbiAgICAgKiBAcGFyYW0gX2tleSB0aGUga2V5IHRvIGFkZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkS2V5KF9rZXk6IEFuaW1hdGlvbktleSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmtleXMucHVzaChfa2V5KTtcclxuICAgICAgdGhpcy5rZXlzLnNvcnQoQW5pbWF0aW9uS2V5LmNvbXBhcmUpO1xyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmeXMgYSBnaXZlbiBrZXkgaW4gdGhlIHNlcXVlbmNlLlxyXG4gICAgICogQHBhcmFtIF9rZXkgdGhlIGtleSB0byBhZGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZGlmeUtleShfa2V5OiBBbmltYXRpb25LZXksIF90aW1lPzogbnVtYmVyLCBfdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKF90aW1lICE9IG51bGwpXHJcbiAgICAgICAgX2tleS50aW1lID0gX3RpbWU7XHJcbiAgICAgIGlmIChfdmFsdWUgIT0gbnVsbClcclxuICAgICAgICBfa2V5LnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLmtleXMuc29ydChBbmltYXRpb25LZXkuY29tcGFyZSk7XHJcbiAgICAgIHRoaXMucmVnZW5lcmF0ZUZ1bmN0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGtleSBmcm9tIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfa2V5IHRoZSBrZXkgdG8gcmVtb3ZlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVLZXkoX2tleTogQW5pbWF0aW9uS2V5KTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5rZXlzW2ldID09IF9rZXkpIHtcclxuICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBrZXkgaW4gdGhlIHNlcXVlbmNlIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kS2V5KF90aW1lOiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5rZXlzKVxyXG4gICAgICAgIGlmIChrZXkudGltZSA9PSBfdGltZSlcclxuICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgQW5pbWF0aW9uIEtleSBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUga2V5cy5cclxuICAgICAqIEBwYXJhbSBfaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlIHRoZSBrZXlcclxuICAgICAqIEByZXR1cm5zIHRoZSByZW1vdmVkIEFuaW1hdGlvbktleSBpZiBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUtleUF0SW5kZXgoX2luZGV4OiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBpZiAoX2luZGV4IDwgMCB8fCBfaW5kZXggPj0gdGhpcy5rZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhazogQW5pbWF0aW9uS2V5ID0gdGhpcy5rZXlzW19pbmRleF07XHJcbiAgICAgIHRoaXMua2V5cy5zcGxpY2UoX2luZGV4LCAxKTtcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICAgIHJldHVybiBhaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBrZXkgZnJvbSB0aGUgc2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgaW5kZXguXHJcbiAgICAgKiBAcGFyYW0gX2luZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IGF0IHdoaWNoIHRvIGdldCB0aGUga2V5XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgQW5pbWF0aW9uS2V5IGF0IHRoZSBpbmRleCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5KF9pbmRleDogbnVtYmVyKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgaWYgKF9pbmRleCA8IDAgfHwgX2luZGV4ID49IHRoaXMua2V5cy5sZW5ndGgpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzLmtleXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBzZXF1ZW5jZSdzIGtleXMuIFRoaXMgaXMgbm90IGEgY29weSwgYnV0IHRoZSBhY3R1YWwgYXJyYXkgdXNlZCBpbnRlcm5hbGx5LiBIYW5kbGUgd2l0aCBjYXJlIVxyXG4gICAgICogVXNlZCBieSBFZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IEFuaW1hdGlvbktleVtdIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGtleXM6IFtdLFxyXG4gICAgICAgIGFuaW1hdGlvblNlcXVlbmNlOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzLmtleXNbaV0gPSB0aGlzLmtleXNbaV0uc2VyaWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IF9zZXJpYWxpemF0aW9uLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyB0aGlzLmtleXMucHVzaCg8QW5pbWF0aW9uS2V5PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ua2V5c1tpXSkpO1xyXG4gICAgICAgIGxldCBrOiBBbmltYXRpb25LZXkgPSBuZXcgQW5pbWF0aW9uS2V5KCk7XHJcbiAgICAgICAgYXdhaXQgay5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5rZXlzW2ldKTtcclxuICAgICAgICB0aGlzLmtleXNbaV0gPSBrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgeyAvKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCAocmUtKWdlbmVyYXRlcyBhbGwgZnVuY3Rpb25zIGluIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWdlbmVyYXRlRnVuY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGY6IEFuaW1hdGlvbkZ1bmN0aW9uID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMua2V5c1tpXSk7XHJcbiAgICAgICAgdGhpcy5rZXlzW2ldLmZ1bmN0aW9uT3V0ID0gZjtcclxuICAgICAgICBpZiAoaSA9PSB0aGlzLmtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiB0aGlzIGlzIGV2ZW4gdXNlZnVsLiBNYXliZSB1cGRhdGUgdGhlIHJ1bmNvbmRpdGlvbiB0byBsZW5ndGggLSAxIGluc3RlYWQuIE1pZ2h0IGJlIHJlZHVuZGFudCBpZiBmdW5jdGlvbkluIGlzIHJlbW92ZWQsIHNlZSBUT0RPIGluIEFuaW1hdGlvbktleS5cclxuICAgICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzWzBdO1xyXG4gICAgICAgICAgdGhpcy5rZXlzWzBdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzW2kgKyAxXTtcclxuICAgICAgICB0aGlzLmtleXNbaSArIDFdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgQGVudW1lcmFibGVcclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uU3ByaXRlIGV4dGVuZHMgQW5pbWF0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBBbmltYXRpb24ucmVnaXN0ZXJTdWJjbGFzcyhBbmltYXRpb25TcHJpdGUpO1xyXG4gICAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlciA9IDI1O1xyXG4gICAgcHJpdmF0ZSB3cmFwQWZ0ZXI6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcbiAgICBwcml2YXRlIHNpemU6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMig4MCwgODApO1xyXG4gICAgcHJpdmF0ZSBuZXh0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoODAsIDApO1xyXG4gICAgcHJpdmF0ZSB3cmFwOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgODApO1xyXG5cclxuICAgICN0ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3I7XHJcblxyXG4gICAgLy8gVE9ETzogZnBzIHNob3VsZCBiZSBhIHBhcmFtZXRlciB0b29cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJBbmltYXRpb25TcHJpdGVcIikgeyAvL30sIF9mcHM6IG51bWJlciA9IDE1KSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCB7fSwgMSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gdGhpcy5mcmFtZXM7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgQGVudW1lcmFibGVcclxuICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICBwdWJsaWMgZ2V0IHRleHR1cmUoKTogVGV4dHVyZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0ZXh0dXJlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQgYXMgdGhlIHNwcml0ZXNoZWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdGV4dHVyZShfdGV4dHVyZTogVGV4dHVyZSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlID0gX3RleHR1cmU7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoaXMgYW5pbWF0aW9uIHNwcml0ZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfdGV4dHVyZTogVGV4dHVyZSwgX2ZyYW1lczogbnVtYmVyLCBfd3JhcEFmdGVyOiBudW1iZXIsIF9zdGFydDogVmVjdG9yMiwgX3NpemU6IFZlY3RvcjIsIF9uZXh0OiBWZWN0b3IyLCBfd3JhcDogVmVjdG9yMiwgX2ZyYW1lc1BlclNlY29uZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3RleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgICAgdGhpcy5mcmFtZXMgPSBfZnJhbWVzO1xyXG4gICAgICB0aGlzLndyYXBBZnRlciA9IF93cmFwQWZ0ZXI7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBfc3RhcnQ7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zaXplO1xyXG4gICAgICB0aGlzLm5leHQgPSBfbmV4dDtcclxuICAgICAgdGhpcy53cmFwID0gX3dyYXA7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZyYW1lc1BlclNlY29uZDtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogVmVjdG9yMiA9IHRoaXMuZ2V0U2NhbGUoKTtcclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yMltdID0gdGhpcy5nZXRQb3NpdGlvbnMoKTtcclxuXHJcbiAgICAgIGxldCB4VHJhbnNsYXRpb246IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB5VHJhbnNsYXRpb246IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB4U2NhbGU6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGxldCB5U2NhbGU6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIHhTY2FsZS5hZGRLZXkobmV3IEFuaW1hdGlvbktleSgwLCBzY2FsZS54KSk7XHJcbiAgICAgIHlTY2FsZS5hZGRLZXkobmV3IEFuaW1hdGlvbktleSgwLCBzY2FsZS55KSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBmcmFtZTogbnVtYmVyID0gMDsgZnJhbWUgPD0gdGhpcy5mcmFtZXM7IGZyYW1lKyspIHtcclxuICAgICAgICBsZXQgdGltZTogbnVtYmVyID0gMTAwMCAqIGZyYW1lIC8gdGhpcy5mcmFtZXNQZXJTZWNvbmQ7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IyID0gcG9zaXRpb25zW01hdGgubWluKGZyYW1lLCB0aGlzLmZyYW1lcyAtIDEpXTsgLy9yZXBlYXQgdGhlIGxhc3Qga2V5IHRvIGdpdmUgdGhlIGxhc3QgZnJhbWUgc29tZSB0aW1lXHJcbiAgICAgICAgeFRyYW5zbGF0aW9uLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIHBvc2l0aW9uLnggLyB0aGlzLiN0ZXh0dXJlLnRleEltYWdlU291cmNlLndpZHRoKSk7Ly8sIDAsIDAsIHRydWUpKVxyXG4gICAgICAgIHlUcmFuc2xhdGlvbi5hZGRLZXkobmV3IEFuaW1hdGlvbktleSh0aW1lLCBwb3NpdGlvbi55IC8gdGhpcy4jdGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHQpKTsvLywgMCwgMCwgdHJ1ZSkpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0ge1xyXG4gICAgICAgIFwiY29tcG9uZW50c1wiOiB7XHJcbiAgICAgICAgICBcIkNvbXBvbmVudE1hdGVyaWFsXCI6IFt7XHJcbiAgICAgICAgICAgIFwibXR4UGl2b3RcIjoge1xyXG4gICAgICAgICAgICAgIFwidHJhbnNsYXRpb25cIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFRyYW5zbGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgeTogeVRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBcInNjYWxpbmdcIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFNjYWxlLFxyXG4gICAgICAgICAgICAgICAgeTogeVNjYWxlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY2FsZSBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgdGhpcy5zaXplLnggLyB0aGlzLiN0ZXh0dXJlLnRleEltYWdlU291cmNlLndpZHRoLFxyXG4gICAgICAgIHRoaXMuc2l6ZS55IC8gdGhpcy4jdGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHRcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBvc2l0aW9ucygpOiBWZWN0b3IyW10ge1xyXG4gICAgICBsZXQgaU5leHQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBpV3JhcDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGZvciAobGV0IGZyYW1lOiBudW1iZXIgPSAwOyBmcmFtZSA8IHRoaXMuZnJhbWVzOyBmcmFtZSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICB0aGlzLnN0YXJ0LnggKyBpTmV4dCAqIHRoaXMubmV4dC54ICsgaVdyYXAgKiB0aGlzLndyYXAueCxcclxuICAgICAgICAgIHRoaXMuc3RhcnQueSArIGlOZXh0ICogdGhpcy5uZXh0LnkgKyBpV3JhcCAqIHRoaXMud3JhcC55XHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgICAgIGlOZXh0Kys7XHJcbiAgICAgICAgaWYgKGlOZXh0ID49IHRoaXMud3JhcEFmdGVyKSB7XHJcbiAgICAgICAgICBpTmV4dCA9IDA7XHJcbiAgICAgICAgICBpV3JhcCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiB0cmFuc2ZlclxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbj86IHN0cmluZ1tdLCBfZGlzcGF0Y2hNdXRhdGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy50ZXh0dXJlLCB0aGlzLmZyYW1lcywgdGhpcy53cmFwQWZ0ZXIsIHRoaXMuc3RhcnQsIHRoaXMuc2l6ZSwgdGhpcy5uZXh0LCB0aGlzLndyYXAsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UgPSB0aGlzLmlkUmVzb3VyY2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXh0dXJlID0gdGhpcy4jdGV4dHVyZS5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lcyA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLndyYXBBZnRlciA9IHRoaXMud3JhcEFmdGVyO1xyXG4gICAgICBmb3IgKGxldCBuYW1lIG9mIFtcInN0YXJ0XCIsIFwic2l6ZVwiLCBcIm5leHRcIiwgXCJ3cmFwXCJdKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25bbmFtZV0gPSAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLnNlcmlhbGl6ZSgpO1xyXG5cclxuICAgICAgbGV0IGFuaW1hdGlvbnNTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IHt9OyAvLyBubyBuZWVkIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmVcclxuICAgICAgLy8gbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvbnNTdHJ1Y3R1cmU7IC8vIHJlc3RvcmUgZXhpc3RlbnQgc3RydWN0dXJlXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkVGV4dHVyZSlcclxuICAgICAgICB0aGlzLiN0ZXh0dXJlID0gPFRleHR1cmU+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgbmFtZSBvZiBbXCJzdGFydFwiLCBcInNpemVcIiwgXCJuZXh0XCIsIFwid3JhcFwiXSlcclxuICAgICAgICAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW25hbWVdKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy50ZXh0dXJlLCBfc2VyaWFsaXphdGlvbi5mcmFtZXMsIF9zZXJpYWxpemF0aW9uLndyYXBBZnRlciwgdGhpcy5zdGFydCwgdGhpcy5zaXplLCB0aGlzLm5leHQsIHRoaXMud3JhcCwgdGhpcy5mcmFtZXNQZXJTZWNvbmQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIHtAbGluayBBbmltYXRpb25TcHJpdGV9IGludG8gYW4ge0BsaW5rIEFuaW1hdGlvbn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnZlcnRUb0FuaW1hdGlvbigpOiBBbmltYXRpb24ge1xyXG4gICAgICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKHRoaXMubmFtZSwgdGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgICAgcmV0dXJuIGFuaW1hdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFeHRlbnNpb24gb2YgQXVkaW9CdWZmZXIgd2l0aCBhIGxvYWQgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGJ1ZmZlciBpbiB0aGUge0BsaW5rIEF1ZGlvTWFuYWdlcn0uZGVmYXVsdCB0byBiZSB1c2VkIHdpdGgge0BsaW5rIENvbXBvbmVudEF1ZGlvfVxyXG4gICAqIEBhdXRob3JzIFRob21hcyBEb3JuZXIsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEF1ZGlvIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkF1ZGlvXCI7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIGJ1ZmZlcjogQXVkaW9CdWZmZXIgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgcGF0aDogVVJMID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSB1cmw6IFJlcXVlc3RJbmZvID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSByZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdXJsPzogUmVxdWVzdEluZm8pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgaWYgKF91cmwpIHtcclxuICAgICAgICB0aGlzLmxvYWQoX3VybCk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gX3VybC50b1N0cmluZygpLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVhZHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyB0aGUgYXVkaW8gKG1wMykgZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiQXVkaW9Mb2FkXCIsIF91cmwpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5wYXRoID0gbmV3IFVSTCh0aGlzLnVybC50b1N0cmluZygpLCBQcm9qZWN0LmJhc2VVUkwpO1xyXG4gICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cuZmV0Y2godGhpcy5wYXRoLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgICBsZXQgYnVmZmVyOiBBdWRpb0J1ZmZlciA9IGF3YWl0IEF1ZGlvTWFuYWdlci5kZWZhdWx0LmRlY29kZUF1ZGlvRGF0YShhcnJheUJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5SRUFEWSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgdHlwZTogdGhpcy50eXBlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWQoX3NlcmlhbGl6YXRpb24udXJsKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbj86IHN0cmluZ1tdLCBfZGlzcGF0Y2hNdXRhdGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IF9tdXRhdG9yLnVybDsgLy8gc2F2ZSB1cmwgZm9yIHJlY29uc3RydWN0aW9uIGFmdGVyIGV4Y2x1c2lvblxyXG4gICAgICBpZiAoX211dGF0b3IudXJsICE9IHRoaXMudXJsLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgdGhpcy5sb2FkKF9tdXRhdG9yLnVybCk7XHJcbiAgICAgIC8vIGV4Y2VwdCB1cmwgZnJvbSBtdXRhdG9yIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgICAgZGVsZXRlIChfbXV0YXRvci51cmwpO1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIC8vIHJlY29uc3RydWN0LCBmb3IgbXV0YXRvciBtYXkgYmUga2VwdCBieSBjYWxsZXJcclxuICAgICAgUmVmbGVjdC5zZXQoX211dGF0b3IsIFwidXJsXCIsIHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgLy8gZGVsZXRlIF9tdXRhdG9yLmlkUmVzb3VyY2U7IFxyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVhZHk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVF9BVURJTyB7XHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCBhZnRlciBpdCB3YXMgYXBwZW5kZWQgdG8gYSBwYXJlbnQgKi9cclxuICAgIENISUxEX0FQUEVORCA9IFwiY2hpbGRBcHBlbmRUb0F1ZGlvR3JhcGhcIixcclxuICAgIC8qKiBicm9hZGNhc3QgdG8gYSB7QGxpbmsgTm9kZX0gYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGp1c3QgYmVmb3JlIGl0cyBiZWluZyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCAqL1xyXG4gICAgQ0hJTERfUkVNT1ZFID0gXCJjaGlsZFJlbW92ZUZyb21BdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCB0byB1cGRhdGUgdGhlIHBhbm5lcnMgaW4gQXVkaW9Db21wb25lbnRzICovXHJcbiAgICBVUERBVEUgPSBcInVwZGF0ZUF1ZGlvR3JhcGhcIixcclxuICAgIC8qKiBmaXJlZCB3aGVuIHRoZSBhdWRpbyBmaWxlIHdhcyBsb2FkZWQgYW5kIGlzIHJlYWR5IGZvciBwbGF5aW5nICovXHJcbiAgICBSRUFEWSA9IFwicmVhZHlcIixcclxuICAgIC8qKiBmaXJlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGF1ZGlvIGlzIHJlYWNoZWQgd2hpbGUgcGxheWluZyAqL1xyXG4gICAgRU5ERUQgPSBcImVuZGVkXCJcclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi9FdmVudC9FdmVudEF1ZGlvLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFeHRlbmRzIHRoZSBzdGFuZGFyZCBBdWRpb0NvbnRleHQgZm9yIGludGVncmF0aW9uIHdpdGggRlVER0UtZ3JhcGhzLlxyXG4gICAqIENyZWF0ZXMgYSBkZWZhdWx0IG9iamVjdCBhdCBzdGFydHVwIHRvIGJlIGFkZHJlc3NlZCBhcyBBdWRpb01hbmFnZXIgZGVmYXVsdC5cclxuICAgKiBPdGhlciBvYmplY3RzIG9mIHRoaXMgY2xhc3MgbWF5IGJlIGNyZWF0ZSBmb3Igc3BlY2lhbCBwdXJwb3Nlcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQXVkaW9NYW5hZ2VyIGV4dGVuZHMgQXVkaW9Db250ZXh0IHtcclxuICAgIC8qKiBUaGUgZGVmYXVsdCBjb250ZXh0IHRoYXQgbWF5IGJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdCB3aXRob3V0IHRoZSBuZWVkIHRvIGNyZWF0ZSBvdGhlcnMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdDogQXVkaW9NYW5hZ2VyID0gbmV3IEF1ZGlvTWFuYWdlcih7IGxhdGVuY3lIaW50OiBcImludGVyYWN0aXZlXCIsIHNhbXBsZVJhdGU6IDQ0MTAwIH0pO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXZlbnRVcGRhdGU6IEV2ZW50ID0gbmV3IEV2ZW50KEVWRU5UX0FVRElPLlVQREFURSk7XHJcbiAgICAvKiogVGhlIG1hc3RlciB2b2x1bWUgYWxsIEF1ZGlvTm9kZXMgaW4gdGhlIGNvbnRleHQgc2hvdWxkIGF0dGFjaCB0byAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGdhaW46IEdhaW5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBncmFwaDogTm9kZSA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNtcExpc3RlbmVyOiBDb21wb25lbnRBdWRpb0xpc3RlbmVyID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbnRleHRPcHRpb25zPzogQXVkaW9Db250ZXh0T3B0aW9ucykge1xyXG4gICAgICBzdXBlcihfY29udGV4dE9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmdhaW4gPSB0aGlzLmNyZWF0ZUdhaW4oKTtcclxuICAgICAgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG1hc3RlciB2b2x1bWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB2b2x1bWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5nYWluLmdhaW4udmFsdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1hc3RlciB2b2x1bWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB2b2x1bWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBGVURHRS1ncmFwaCB0byBsaXN0ZW4gdG8uIEVhY2gge0BsaW5rIENvbXBvbmVudEF1ZGlvfSBpbiB0aGUgZ3JhcGggd2lsbCBjb25uZWN0IHRvIHRoaXMgY29udGV4dHMgbWFzdGVyIGdhaW4sIGFsbCBvdGhlcnMgZGlzY29ubmVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlblRvID0gKF9ncmFwaDogTm9kZSB8IG51bGwpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKHRoaXMuZ3JhcGgpXHJcbiAgICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfUkVNT1ZFKSk7XHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgdGhpcy5ncmFwaCA9IF9ncmFwaDtcclxuICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIEZVREdFLWdyYXBoIGN1cnJlbnRseSBsaXN0ZW5pbmcgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdyYXBoTGlzdGVuaW5nVG8gPSAoKTogTm9kZSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyYXBoO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUge0BsaW5rIENvbXBvbmVudEF1ZGlvTGlzdGVuZXJ9IHRoYXQgc2VydmVzIHRoZSBzcGF0aWFsIGxvY2F0aW9uIGFuZCBvcmllbnRhdGlvbiBmb3IgdGhpcyBjb250ZXh0cyBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGlzdGVuV2l0aCA9IChfY21wTGlzdGVuZXI6IENvbXBvbmVudEF1ZGlvTGlzdGVuZXIgfCBudWxsKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMuY21wTGlzdGVuZXIgPSBfY21wTGlzdGVuZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc3BhdGlhbCBzZXR0aW5ncyBvZiB0aGUgQXVkaW9Ob2RlcyBlZmZlY3RlZCBpbiB0aGUgY3VycmVudCBGVURHRS1ncmFwaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZSAhPSBcInJ1bm5pbmdcIilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIC8vIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLlVQREFURSkpO1xyXG4gICAgICB0aGlzLmdyYXBoLmJyb2FkY2FzdEV2ZW50KEF1ZGlvTWFuYWdlci5ldmVudFVwZGF0ZSk7XHJcbiAgICAgIGlmICh0aGlzLmNtcExpc3RlbmVyKVxyXG4gICAgICAgIHRoaXMuY21wTGlzdGVuZXIudXBkYXRlKHRoaXMubGlzdGVuZXIpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCIvLyBuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAgIFxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBFbnVtZXJhdG9yIGZvciBhbGwgcG9zc2libGUgT3NjaWxsYXRvciBUeXBlc1xyXG4vLyAgICAgICovXHJcbi8vICAgICB0eXBlIE9TQ0lMTEFUT1JfVFlQRSA9IFwic2luZVwiIHwgXCJzcXVhcmVcIiB8IFwic2F3dG9vdGhcIiB8IFwidHJpYW5nbGVcIiB8IFwiY3VzdG9tXCI7XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBJbnRlcmZhY2UgdG8gY3JlYXRlIEN1c3RvbSBPc2NpbGxhdG9yIFR5cGVzLlxyXG4vLyAgICAgICogU3RhcnQtL0VuZHBvaW50IG9mIGEgY3VzdHVtIGN1cnZlIGUuZy4gc2luZSBjdXJ2ZS5cclxuLy8gICAgICAqIEJvdGggcGFyYW1ldGVycyBuZWVkIHRvIGJlIGluYmV0d2VlbiAtMSBhbmQgMS5cclxuLy8gICAgICAqIEBwYXJhbSBzdGFydHBvaW50IHN0YXJ0cG9pbnQgb2YgYSBjdXJ2ZSBcclxuLy8gICAgICAqIEBwYXJhbSBlbmRwb2ludCBFbmRwb2ludCBvZiBhIGN1cnZlIFxyXG4vLyAgICAgICovXHJcbi8vICAgICBpbnRlcmZhY2UgT3NjaWxsYXRvcldhdmUge1xyXG4vLyAgICAgICAgIHN0YXJ0cG9pbnQ6IG51bWJlcjtcclxuLy8gICAgICAgICBlbmRwb2ludDogbnVtYmVyO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBBZGQgYW4ge0BsaW5rIEF1ZGlvRmlsdGVyfSB0byBhbiB7QGxpbmsgQXVkaW9dXVxyXG4vLyAgICAgICogQGF1dGhvcnMgVGhvbWFzIERvcm5lciwgSEZVLCAyMDE5XHJcbi8vICAgICAgKi9cclxuLy8gICAgIGV4cG9ydCBjbGFzcyBBdWRpb09zY2lsbGF0b3Ige1xyXG5cclxuLy8gICAgICAgICBwdWJsaWMgYXVkaW9Pc2NpbGxhdG9yOiBPc2NpbGxhdG9yTm9kZTsgXHJcblxyXG4vLyAgICAgICAgIHByaXZhdGUgZnJlcXVlbmN5OiBudW1iZXI7XHJcbi8vICAgICAgICAgcHJpdmF0ZSBvc2NpbGxhdG9yVHlwZTogT1NDSUxMQVRPUl9UWVBFO1xyXG4vLyAgICAgICAgIHByaXZhdGUgb3NjaWxsYXRvcldhdmU6IFBlcmlvZGljV2F2ZTtcclxuXHJcbi8vICAgICAgICAgcHJpdmF0ZSBsb2NhbEdhaW46IEdhaW5Ob2RlO1xyXG4vLyAgICAgICAgIHByaXZhdGUgbG9jYWxHYWluVmFsdWU6IG51bWJlcjtcclxuXHJcbi8vICAgICAgICAgY29uc3RydWN0b3IoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9vc2NpbGxhdG9yVHlwZT86IE9TQ0lMTEFUT1JfVFlQRSkge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvciA9IF9hdWRpb1NldHRpbmdzLmdldEF1ZGlvQ29udGV4dCgpLmNyZWF0ZU9zY2lsbGF0b3IoKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4gPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVHYWluKCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvclR5cGUgPSBfb3NjaWxsYXRvclR5cGU7XHJcbi8vICAgICAgICAgICAgIGlmICh0aGlzLm9zY2lsbGF0b3JUeXBlICE9IFwiY3VzdG9tXCIpIHtcclxuLy8gICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnR5cGUgPSB0aGlzLm9zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zY2lsbGF0b3JXYXZlKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3Iuc2V0UGVyaW9kaWNXYXZlKHRoaXMub3NjaWxsYXRvcldhdmUpO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGUgYSBDdXN0b20gUGVyaW9kaWMgV2F2ZSBmaXJzdCB0byB1c2UgQ3VzdG9tIFR5cGVcIik7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRPc2NpbGxhdG9yVHlwZShfb3NjaWxsYXRvclR5cGU6IE9TQ0lMTEFUT1JfVFlQRSk6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vc2NpbGxhdG9yVHlwZSAhPSBcImN1c3RvbVwiKSB7XHJcbi8vICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci50eXBlID0gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghdGhpcy5vc2NpbGxhdG9yV2F2ZSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0aGlzLm9zY2lsbGF0b3JXYXZlKTtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldE9zY2lsbGF0b3JUeXBlKCk6IE9TQ0lMTEFUT1JfVFlQRSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiB0aGlzLm9zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGNyZWF0ZVBlcmlvZGljV2F2ZShfYXVkaW9TZXR0aW5nczogQXVkaW9TZXR0aW5ncywgX3JlYWw6IE9zY2lsbGF0b3JXYXZlLCBfaW1hZzogT3NjaWxsYXRvcldhdmUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgbGV0IHdhdmVSZWFsOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xyXG4vLyAgICAgICAgICAgICB3YXZlUmVhbFswXSA9IF9yZWFsLnN0YXJ0cG9pbnQ7XHJcbi8vICAgICAgICAgICAgIHdhdmVSZWFsWzFdID0gX3JlYWwuZW5kcG9pbnQ7XHJcblxyXG4vLyAgICAgICAgICAgICBsZXQgd2F2ZUltYWc6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMik7XHJcbi8vICAgICAgICAgICAgIHdhdmVJbWFnWzBdID0gX2ltYWcuc3RhcnRwb2ludDtcclxuLy8gICAgICAgICAgICAgd2F2ZUltYWdbMV0gPSBfaW1hZy5lbmRwb2ludDtcclxuXHJcbi8vICAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvcldhdmUgPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVQZXJpb2RpY1dhdmUod2F2ZVJlYWwsIHdhdmVJbWFnKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRMb2NhbEdhaW4oX2xvY2FsR2FpbjogR2Fpbk5vZGUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4gPSBfbG9jYWxHYWluO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldExvY2FsR2FpbigpOiBHYWluTm9kZSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsR2FpbjtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRMb2NhbEdhaW5WYWx1ZShfbG9jYWxHYWluVmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2FpblZhbHVlID0gX2xvY2FsR2FpblZhbHVlO1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2Fpbi5nYWluLnZhbHVlID0gdGhpcy5sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRMb2NhbEdhaW5WYWx1ZSgpOiBudW1iZXIge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBzZXRGcmVxdWVuY3koX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9mcmVxdWVuY3k6IG51bWJlcik6IHZvaWQge1xyXG4vLyAgICAgICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IF9mcmVxdWVuY3k7XHJcbi8vICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSh0aGlzLmZyZXF1ZW5jeSwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGdldEZyZXF1ZW5jeSgpOiBudW1iZXIge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5mcmVxdWVuY3k7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgY3JlYXRlU25hcmUoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRPc2NpbGxhdG9yVHlwZShcInRyaWFuZ2xlXCIpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLnNldEZyZXF1ZW5jeShfYXVkaW9TZXR0aW5ncywgMTAwKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRMb2NhbEdhaW5WYWx1ZSgwKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLCBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAxLCBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSArIC4xKTtcclxuXHJcbi8vICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5sb2NhbEdhaW4pO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gfSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYW4gYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LlxyXG4gICAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbiBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbik7XHJcblxyXG4gICAgcHVibGljIHNhbXBsZVJhZGl1czogbnVtYmVyO1xyXG4gICAgcHVibGljIGJpYXM6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdHRlbnVhdGlvbkNvbnN0YW50OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25MaW5lYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhdHRlbnVhdGlvblF1YWRyYXRpYzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2FtcGxlUmFkaXVzOiBudW1iZXIgPSAxNiwgX2JpYXM6IG51bWJlciA9IDAuMDcsIF9hdHRlbnVhdGlvbkNvbnN0YW50OiBudW1iZXIgPSAyLjUsIF9hdHRlbnVhdGlvbkxpbmVhcjogbnVtYmVyID0gMSwgX2F0dGVudWF0aW9uUXVhZHJhdGljOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2FtcGxlUmFkaXVzID0gX3NhbXBsZVJhZGl1cztcclxuICAgICAgdGhpcy5iaWFzID0gX2JpYXM7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCA9IF9hdHRlbnVhdGlvbkNvbnN0YW50O1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uTGluZWFyID0gX2F0dGVudWF0aW9uTGluZWFyO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uUXVhZHJhdGljID0gX2F0dGVudWF0aW9uUXVhZHJhdGljO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc2FtcGxlUmFkaXVzOiB0aGlzLnNhbXBsZVJhZGl1cyxcclxuICAgICAgICBiaWFzOiB0aGlzLmJpYXMsXHJcbiAgICAgICAgYXR0ZW51YXRpb25Db25zdGFudDogdGhpcy5hdHRlbnVhdGlvbkNvbnN0YW50LFxyXG4gICAgICAgIGF0dGVudWF0aW9uTGluZWFyOiB0aGlzLmF0dGVudWF0aW9uTGluZWFyLFxyXG4gICAgICAgIGF0dGVudWF0aW9uUXVhZHJhdGljOiB0aGlzLmF0dGVudWF0aW9uUXVhZHJhdGljXHJcbiAgICAgIH07XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5zYW1wbGVSYWRpdXMgPSBfc2VyaWFsaXphdGlvbi5zYW1wbGVSYWRpdXM7XHJcbiAgICAgIHRoaXMuYmlhcyA9IF9zZXJpYWxpemF0aW9uLmJpYXM7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCA9IF9zZXJpYWxpemF0aW9uLmF0dGVudWF0aW9uQ29uc3RhbnQ7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25MaW5lYXIgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvbkxpbmVhcjtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpYyA9IF9zZXJpYWxpemF0aW9uLmF0dGVudWF0aW9uUXVhZHJhdGljO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGltZS9Mb29wLnRzXCIvPlxyXG4vLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FuaW1hdGlvbi9BbmltYXRpb24udHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9sZHMgYSByZWZlcmVuY2UgdG8gYW4ge0BsaW5rIEFuaW1hdGlvbn0gYW5kIGNvbnRyb2xzIGl0LiBDb250cm9scyBxdWFudGl6YXRpb24gYW5kIHBsYXltb2RlIGFzIHdlbGwgYXMgc3BlZWQuXHJcbiAgICogQGF1dGhvcnMgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRBbmltYXRvciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QW5pbWF0b3IpO1xyXG4gICAgLy9UT0RPOiBhZGQgZnVuY3Rpb25hbGl0eSB0byBibGVuZCBmcm9tIG9uZSBhbmltYXRpb24gdG8gYW5vdGhlci5cclxuICAgIEB0eXBlKEFuaW1hdGlvbilcclxuICAgIHB1YmxpYyBhbmltYXRpb246IEFuaW1hdGlvbjtcclxuICAgIHB1YmxpYyBwbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFO1xyXG4gICAgcHVibGljIHF1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTjtcclxuICAgIHB1YmxpYyBzY2FsZVdpdGhHYW1lVGltZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgYW5pbWF0ZUluRWRpdG9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgI3NjYWxlOiBudW1iZXIgPSAxO1xyXG4gICAgI3RpbWVMb2NhbDogVGltZTtcclxuICAgICNwcmV2aW91czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2FuaW1hdGlvbj86IEFuaW1hdGlvbiwgX3BsYXltb2RlOiBBTklNQVRJT05fUExBWU1PREUgPSBBTklNQVRJT05fUExBWU1PREUuTE9PUCwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTiA9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uQ09OVElOT1VTKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMucGxheW1vZGUgPSBfcGxheW1vZGU7XHJcbiAgICAgIHRoaXMucXVhbnRpemF0aW9uID0gX3F1YW50aXphdGlvbjtcclxuICAgICAgdGhpcy5hbmltYXRpb24gPSBfYW5pbWF0aW9uO1xyXG5cclxuICAgICAgdGhpcy4jdGltZUxvY2FsID0gbmV3IFRpbWUoKTtcclxuXHJcbiAgICAgIC8vVE9ETzogdXBkYXRlIGFuaW1hdGlvbiB0b3RhbCB0aW1lIHdoZW4gbG9hZGluZyBhIGRpZmZlcmVudCBhbmltYXRpb24/XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uPy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCAoKSA9PiB0aGlzLmFjdGl2YXRlKGZhbHNlKSk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ0hJTERfUkVNT1ZFLCAoKSA9PiB0aGlzLmFjdGl2YXRlKGZhbHNlKSk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzY2FsZShfc2NhbGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzY2FsZSA9IF9zY2FsZTtcclxuICAgICAgdGhpcy51cGRhdGVTY2FsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gdGhlIGN1cnJlbnQgc2FtcGxlIHRpbWUgb2YgdGhlIGFuaW1hdGlvbiAgXHJcbiAgICAgKiAtIHNldDoganVtcCB0byBhIGNlcnRhaW4gc2FtcGxlIHRpbWUgaW4gdGhlIGFuaW1hdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWVMb2NhbC5nZXQoKSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUoX3RpbWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmp1bXBUbyhfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBzdXBlci5hY3RpdmF0ZShfb24pO1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlTGlzdGVuZXJzKF9vbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKdW1wcyB0byBhIGNlcnRhaW4gdGltZSBpbiB0aGUgYW5pbWF0aW9uIHRvIHBsYXkgZnJvbSB0aGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGp1bXBUbyhfdGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3RpbWVMb2NhbC5zZXQoX3RpbWUpO1xyXG4gICAgICB0aGlzLiNwcmV2aW91cyA9IF90aW1lO1xyXG4gICAgICBfdGltZSA9IF90aW1lICUgdGhpcy5hbmltYXRpb24udG90YWxUaW1lO1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHRoaXMuYW5pbWF0aW9uLmdldFN0YXRlKF90aW1lLCB0aGlzLmFuaW1hdGlvbi5jYWxjdWxhdGVEaXJlY3Rpb24oX3RpbWUsIHRoaXMucGxheW1vZGUpLCB0aGlzLnF1YW50aXphdGlvbik7XHJcbiAgICAgIHRoaXMubm9kZS5hcHBseUFuaW1hdGlvbihtdXRhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEp1bXBzIHRvIGEgY2VydGFpbiBsYWJlbCBpbiB0aGUgYW5pbWF0aW9uIGlmIGRlZmluZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGp1bXBUb0xhYmVsKF9sYWJlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGxldCB0aW1lOiBudW1iZXIgPSB0aGlzLmFuaW1hdGlvbi5sYWJlbHNbX2xhYmVsXTtcclxuICAgICAgaWYgKHRpbWUpXHJcbiAgICAgICAgdGhpcy5qdW1wVG8odGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZXMgYW4gdXBkYXRlIG9mIHRoZSBhbmltYXRpb24gZnJvbSBvdXRzaWRlLiBVc2VkIGluIHRoZSBWaWV3QW5pbWF0aW9uLiBTaG91bGRuJ3QgYmUgdXNlZCBkdXJpbmcgdGhlIGdhbWUuXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgdGhlICh1bnNjYWxlZCkgdGltZSB0byB1cGRhdGUgdGhlIGFuaW1hdGlvbiB3aXRoLlxyXG4gICAgICogQHJldHVybnMgdGhlIE11dGF0b3IgZm9yIEFuaW1hdGlvbi4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVBbmltYXRpb24oX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICB0aGlzLiNwcmV2aW91cyA9IHVuZGVmaW5lZDtcclxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcChudWxsLCBfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRBbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbi5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnBsYXltb2RlID0gdGhpcy5wbGF5bW9kZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5xdWFudGl6YXRpb24gPSB0aGlzLnF1YW50aXphdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zY2FsZSA9IHRoaXMuc2NhbGU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGVXaXRoR2FtZVRpbWUgPSB0aGlzLnNjYWxlV2l0aEdhbWVUaW1lO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmFuaW1hdGVJbkVkaXRvciA9IHRoaXMuYW5pbWF0ZUluRWRpdG9yO1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbiA9IDxBbmltYXRpb24+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZEFuaW1hdGlvbik7XHJcbiAgICAgIHRoaXMucGxheW1vZGUgPSBfc2VyaWFsaXphdGlvbi5wbGF5bW9kZTtcclxuICAgICAgdGhpcy5xdWFudGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbi5xdWFudGl6YXRpb247XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2VyaWFsaXphdGlvbi5zY2FsZTtcclxuICAgICAgdGhpcy5zY2FsZVdpdGhHYW1lVGltZSA9IF9zZXJpYWxpemF0aW9uLnNjYWxlV2l0aEdhbWVUaW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGVJbkVkaXRvciA9IF9zZXJpYWxpemF0aW9uLmFuaW1hdGVJbkVkaXRvcjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmFuaW1hdGVJbkVkaXRvcikgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFuaW1hdGlvbigwKTtcclxuICAgICAgICB0aGlzLmFjdGl2YXRlTGlzdGVuZXJzKHRoaXMuYWN0aXZlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5wbGF5bW9kZSlcclxuICAgICAgICB0eXBlcy5wbGF5bW9kZSA9IEFOSU1BVElPTl9QTEFZTU9ERTtcclxuICAgICAgaWYgKHR5cGVzLnF1YW50aXphdGlvbilcclxuICAgICAgICB0eXBlcy5xdWFudGl6YXRpb24gPSBBTklNQVRJT05fUVVBTlRJWkFUSU9OO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlTGlzdGVuZXJzKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX29uICYmIChQcm9qZWN0Lm1vZGUgIT0gTU9ERS5FRElUT1IgfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SICYmIHRoaXMuYW5pbWF0ZUluRWRpdG9yKSkge1xyXG4gICAgICAgIFRpbWUuZ2FtZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVNjYWxlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGVBbmltYXRpb25Mb29wKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBUaW1lLmdhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5USU1FX1NDQUxFRCwgdGhpcy51cGRhdGVTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVOREVSX1BSRVBBUkUsIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdXBkYXRlQW5pbWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIEFuaW1hdGlvbi5cclxuICAgICAqIFVzZXMgdGhlIGJ1aWx0LWluIHRpbWUgdW5sZXNzIGEgZGlmZmVyZW50IHRpbWUgaXMgc3BlY2lmaWVkLlxyXG4gICAgICogTWF5IGFsc28gYmUgY2FsbGVkIGZyb20gdXBkYXRlQW5pbWF0aW9uKCkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQW5pbWF0aW9uTG9vcCA9IChfZTogRXZlbnQsIF90aW1lPzogbnVtYmVyKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWUgPT0gMCkgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgdGltZTogbnVtYmVyID0gX3RpbWUgfHwgX3RpbWUgPT09IDAgPyBfdGltZSA6IHRoaXMuI3RpbWVMb2NhbC5nZXQoKTtcclxuICAgICAgaWYgKHRoaXMucXVhbnRpemF0aW9uID09IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgdGltZSA9IHRoaXMuI3ByZXZpb3VzICsgKDEwMDAgLyB0aGlzLmFuaW1hdGlvbi5mcHMpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBkaXJlY3Rpb246IG51bWJlciA9IHRoaXMuYW5pbWF0aW9uLmNhbGN1bGF0ZURpcmVjdGlvbih0aW1lLCB0aGlzLnBsYXltb2RlKTtcclxuICAgICAgdGltZSA9IHRoaXMuYW5pbWF0aW9uLmdldE1vZGFsVGltZSh0aW1lLCB0aGlzLnBsYXltb2RlLCB0aGlzLiN0aW1lTG9jYWwuZ2V0T2Zmc2V0KCkpO1xyXG4gICAgICB0aGlzLmV4ZWN1dGVFdmVudHModGhpcy5hbmltYXRpb24uZ2V0RXZlbnRzVG9GaXJlKHRoaXMuI3ByZXZpb3VzLCB0aW1lLCB0aGlzLnF1YW50aXphdGlvbiwgZGlyZWN0aW9uKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy4jcHJldmlvdXMgIT0gdGltZSkge1xyXG4gICAgICAgIHRoaXMuI3ByZXZpb3VzID0gdGltZTtcclxuICAgICAgICB0aW1lID0gdGltZSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHRoaXMuYW5pbWF0aW9uLmdldFN0YXRlKHRpbWUsIGRpcmVjdGlvbiwgdGhpcy5xdWFudGl6YXRpb24pO1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGUpIHtcclxuICAgICAgICAgIHRoaXMubm9kZS5hcHBseUFuaW1hdGlvbihtdXRhdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlyZXMgYWxsIGN1c3RvbSBldmVudHMgdGhlIEFuaW1hdGlvbiBzaG91bGQgaGF2ZSBmaXJlZCBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZS5cclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIGEgbGlzdCBvZiBuYW1lcyBvZiBjdXN0b20gZXZlbnRzIHRvIGZpcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleGVjdXRlRXZlbnRzKF9ldmVudHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfZXZlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfZXZlbnRzW2ldKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNjYWxlIG9mIHRoZSBhbmltYXRpb24gaWYgdGhlIHVzZXIgY2hhbmdlcyBpdCBvciBpZiB0aGUgZ2xvYmFsIGdhbWUgdGltZXIgY2hhbmdlZCBpdHMgc2NhbGUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlU2NhbGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBuZXdTY2FsZTogbnVtYmVyID0gdGhpcy4jc2NhbGU7XHJcbiAgICAgIGlmICh0aGlzLnNjYWxlV2l0aEdhbWVUaW1lKVxyXG4gICAgICAgIG5ld1NjYWxlICo9IFRpbWUuZ2FtZS5nZXRTY2FsZSgpO1xyXG4gICAgICB0aGlzLiN0aW1lTG9jYWwuc2V0U2NhbGUobmV3U2NhbGUpO1xyXG4gICAgfTtcclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgZW51bSBBVURJT19QQU5ORVIge1xyXG4gICAgQ09ORV9JTk5FUl9BTkdMRSA9IFwiY29uZUlubmVyQW5nbGVcIixcclxuICAgIENPTkVfT1VURVJfQU5HTEUgPSBcImNvbmVPdXRlckFuZ2xlXCIsXHJcbiAgICBDT05FX09VVEVSX0dBSU4gPSBcImNvbmVPdXRlckdhaW5cIixcclxuICAgIERJU1RBTkNFX01PREVMID0gXCJkaXN0YW5jZU1vZGVsXCIsXHJcbiAgICBNQVhfRElTVEFOQ0UgPSBcIm1heERpc3RhbmNlXCIsXHJcbiAgICBQQU5OSU5HX01PREVMID0gXCJwYW5uaW5nTW9kZWxcIixcclxuICAgIFJFRl9ESVNUQU5DRSA9IFwicmVmRGlzdGFuY2VcIixcclxuICAgIFJPTExPRkZfRkFDVE9SID0gXCJyb2xsb2ZmRmFjdG9yXCJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFVRElPX05PREVfVFlQRSB7XHJcbiAgICBTT1VSQ0UsIFBBTk5FUiwgR0FJTlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGEgbWluaW1hbCBhdWRpbyBncmFwaCAoYnkgZGVmYXVsdCBpbiB7QGxpbmsgQXVkaW9NYW5hZ2VyfS5kZWZhdWx0KSBhbmQgc3luY2hyb25pemVzIGl0IHdpdGggdGhlIGNvbnRhaW5pbmcge0BsaW5rIE5vZGV9XHJcbiAgICogYGBgdGV4dFxyXG4gICAqIOKUjCBBdWRpb01hbmFnZXIoLmRlZmF1bHQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqIOKUgiDilIwgQ29tcG9uZW50QXVkaW8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgIOKUglxyXG4gICAqIOKUgiDilIIgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiDilIzilIDilIDilIDilIDilIDilIDilJAg4pSCICBcclxuICAgKiDilIIg4pSCICAgIOKUgnNvdXJjZeKUgiDihpIg4pSCcGFubmVy4pSCIOKGkiDilIIgZ2FpbiDilIIg4oaSIOKUgiBnYWluIOKUgiDilIJcclxuICAgKiDilIIg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiAgXHJcbiAgICog4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICDilIJcclxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBUaG9tYXMgRG9ybmVyLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRBdWRpbyBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QXVkaW8pO1xyXG4gICAgLyoqIHBsYWNlcyBhbmQgZGlyZWN0cyB0aGUgcGFubmVyIHJlbGF0aXZlIHRvIHRoZSB3b3JsZCB0cmFuc2Zvcm0gb2YgdGhlIHtAbGluayBOb2RlfSAgKi9cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEB0eXBlKEF1ZGlvKVxyXG4gICAgcHJpdmF0ZSBhdWRpbzogQXVkaW87XHJcbiAgICBwcml2YXRlIGdhaW46IEdhaW5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBwYW5uZXI6IFBhbm5lck5vZGU7XHJcbiAgICBwcml2YXRlIHNvdXJjZTogQXVkaW9CdWZmZXJTb3VyY2VOb2RlO1xyXG4gICAgcHJpdmF0ZSBhdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlcjtcclxuICAgIHByaXZhdGUgcGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYXVkaW86IEF1ZGlvID0gbnVsbCwgX2xvb3A6IGJvb2xlYW4gPSBmYWxzZSwgX3N0YXJ0OiBib29sZWFuID0gZmFsc2UsIF9hdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlciA9IEF1ZGlvTWFuYWdlci5kZWZhdWx0KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuaW5zdGFsbChfYXVkaW9NYW5hZ2VyKTtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoX2F1ZGlvLCBfbG9vcCk7XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5oYW5kbGVBdHRhY2gpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5oYW5kbGVBdHRhY2gpO1xyXG5cclxuICAgICAgaWYgKF9zdGFydClcclxuICAgICAgICB0aGlzLnBsYXkoX3N0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHZvbHVtZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBsb29wKF9vbjogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLnNvdXJjZS5sb29wID0gX29uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbG9vcCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmxvb3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBwbGF5YmFja1JhdGUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcGxheWJhY2tSYXRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNQbGF5aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbGF5aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNBdHRhY2hlZCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMubm9kZSAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNMaXN0ZW5lZCgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiB7QGxpbmsgQXVkaW99IGFzIHRoZSBhdWRpbyBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEF1ZGlvKF9hdWRpbzogQXVkaW8pOiB2b2lkIHtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoX2F1ZGlvLCB0aGlzLnNvdXJjZS5sb29wKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBdWRpb30gY3VycmVudGx5IHVzZWQgYXMgYXVkaW8gc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBdWRpbygpOiBBdWRpbyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmF1ZGlvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBwcm9wZXJ0eSBvZiB0aGUgcGFubmVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4gVXNlIHRvIG1hbmlwdWxhdGUgcmFuZ2UgYW5kIHJvbGxvZmYgZXRjLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UGFubmVyKF9wcm9wZXJ0eTogQVVESU9fUEFOTkVSLCBfdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZWZsZWN0LnNldCh0aGlzLnBhbm5lciwgX3Byb3BlcnR5LCBfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IG1heSBiZSB1c2VkIGZvciBzZXJpYWxpemF0aW9uIG9mIEF1ZGlvTm9kZXNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbXV0YXRvciBmb3IgdGhlIHNwZWNpZmllZCBBdWRpb05vZGUgb2YgdGhlIHN0YW5kYXJkIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yT2ZOb2RlKF90eXBlOiBBVURJT19OT0RFX1RZUEUpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG5vZGU6IEF1ZGlvTm9kZSA9IHRoaXMuZ2V0QXVkaW9Ob2RlKF90eXBlKTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBnZXRNdXRhdG9yT2ZBcmJpdHJhcnkobm9kZSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIEF1ZGlvTm9kZSBvZiB0aGUgc3RhbmRhcmQgZ3JhcGggZm9yIGZ1cnRoZXIgbWFuaXB1bGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBdWRpb05vZGUoX3R5cGU6IEFVRElPX05PREVfVFlQRSk6IEF1ZGlvTm9kZSB7XHJcbiAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5TT1VSQ0U6IHJldHVybiB0aGlzLnNvdXJjZTtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5QQU5ORVI6IHJldHVybiB0aGlzLnBhbm5lcjtcclxuICAgICAgICBjYXNlIEFVRElPX05PREVfVFlQRS5HQUlOOiByZXR1cm4gdGhpcy5nYWluO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydCBvciBzdG9wIHBsYXlpbmcgdGhlIGF1ZGlvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwbGF5KF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX29uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW8uaXNSZWFkeSkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTb3VyY2UodGhpcy5hdWRpbywgdGhpcy5zb3VyY2UubG9vcCwgdGhpcy5wbGF5YmFja1JhdGUpO1xyXG4gICAgICAgICAgdGhpcy5zb3VyY2Uuc3RhcnQoMCwgMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5SRUFEWSwgdGhpcy5obmRBdWRpb1JlYWR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5FTkRFRCwgdGhpcy5obmRBdWRpb0VuZGVkKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuc291cmNlLnN0b3AoKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3I6IHVua25vd24pIHsgLyogY2F0Y2ggZXhjZXB0aW9uIHdoZW4gc291cmNlIGhhc24ndCBiZWVuIHN0YXJ0ZWQuLi4gKi8gfVxyXG4gICAgICB0aGlzLnBsYXlpbmcgPSBfb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnRzIEF1ZGlvTm9kZXMgYmV0d2VlbiB0aGUgcGFubmVyIGFuZCB0aGUgbG9jYWwgZ2FpbiBvZiB0aGlzIHtAbGluayBDb21wb25lbnRBdWRpb31cclxuICAgICAqIF9pbnB1dCBhbmQgX291dHB1dCBtYXkgYmUgdGhlIHNhbWUgQXVkaW9Ob2RlLCBpZiB0aGVyZSBpcyBvbmx5IG9uZSB0byBpbnNlcnQsXHJcbiAgICAgKiBvciBtYXkgaGF2ZSBtdWx0aXBsZSBBdWRpb05vZGUgYmV0d2VlbiB0aGVtIHRvIGNyZWF0ZSBhbiBlZmZlY3QtZ3JhcGguXFxcclxuICAgICAqIE5vdGUgdGhhdCB7QGxpbmsgQ29tcG9uZW50QXVkaW99IGRvZXMgbm90IGtlZXAgdHJhY2sgb2YgaW5zZXJ0ZWQgQXVkaW9Ob2RlcyFcclxuICAgICAqIGBgYHRleHRcclxuICAgICAqIOKUjCBBdWRpb01hbmFnZXIoLmRlZmF1bHQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAgICog4pSCIOKUjCBDb21wb25lbnRBdWRpbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgICAg4pSCXHJcbiAgICAgKiDilIIg4pSCICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilJAg4pSCIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIgIFxyXG4gICAgICog4pSCIOKUgiAgICDilIJzb3VyY2XilIIg4oaSIOKUgnBhbm5lcuKUgiDihpIg4pSCX2lucHV04pSCIOKGkiAuLi4gIOKGkiDilIJfb3V0cHV04pSCIOKGkiDilIIgZ2FpbiDilIIg4oaSIOKUgiBnYWluIOKUgiDilIJcclxuICAgICAqIOKUgiDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiAgXHJcbiAgICAgKiDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgIOKUglxyXG4gICAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluc2VydEF1ZGlvTm9kZXMoX2lucHV0OiBBdWRpb05vZGUsIF9vdXRwdXQ6IEF1ZGlvTm9kZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnBhbm5lci5kaXNjb25uZWN0KDApO1xyXG4gICAgICBpZiAoIV9pbnB1dCAmJiAhX291dHB1dCkge1xyXG4gICAgICAgIHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdChfaW5wdXQpO1xyXG4gICAgICBfb3V0cHV0LmNvbm5lY3QodGhpcy5nYWluKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlIG92ZXJyaWRlLiBDb25uZWN0cyBvciBkaXNjb25uZWN0cyBBdWRpb05vZGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWN0aXZhdGUoX29uKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGlzIGNvbXBvbmVudHMgZ2Fpbi1ub2RlIHRvIHRoZSBnYWluIG5vZGUgb2YgdGhlIEF1ZGlvTWFuYWdlciB0aGlzIGNvbXBvbmVudCBydW5zIG9uLlxyXG4gICAgICogT25seSBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IGJ1dCBuZWVkcyB0byBiZSBoZWFyZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3QoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIGlmIChfb24pXHJcbiAgICAgICAgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5hdWRpb01hbmFnZXIuZ2Fpbik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmF1ZGlvTWFuYWdlci5nYWluKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJjb3JuZmxvd2VyYmx1ZVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25BdWRpbywgbXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSA9IHRoaXMuYXVkaW8/LmlkUmVzb3VyY2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ucGxheWluZyA9IHRoaXMucGxheWluZztcclxuICAgICAgc2VyaWFsaXphdGlvbi5sb29wID0gdGhpcy5sb29wO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnZvbHVtZSA9IHRoaXMudm9sdW1lO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdldE11dGF0b3JPZk5vZGUoQVVESU9fTk9ERV9UWVBFLlBBTk5FUikpO1xyXG4gICAgICAvLyBUT0RPOiBzZXJpYWxpemUgcGFubmVyIHBhcmFtZXRlcnNcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBhdWRpbzogQXVkaW8gPSA8QXVkaW8+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5jcmVhdGVTb3VyY2UoYXVkaW8sIF9zZXJpYWxpemF0aW9uLmxvb3ApO1xyXG4gICAgICB0aGlzLnZvbHVtZSA9IF9zZXJpYWxpemF0aW9uLnZvbHVtZTtcclxuICAgICAgdGhpcy5wbGF5KF9zZXJpYWxpemF0aW9uLnBsYXlpbmcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBsZXQgYXVkaW86IE11dGF0b3IgPSBtdXRhdG9yLmF1ZGlvO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5hdWRpbzsgLy8ganVzdCB0byByZWFycmFuZ2UgaW4gaW50ZXJmYWNlcy4uLlxyXG4gICAgICBtdXRhdG9yLmxvb3AgPSB0aGlzLmxvb3A7XHJcbiAgICAgIG11dGF0b3Iudm9sdW1lID0gdGhpcy52b2x1bWU7XHJcbiAgICAgIG11dGF0b3IuYXVkaW8gPSBhdWRpbzsgLy8uLi4gc28gYXVkaW8gY29tZXMgbGFzdFxyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvcik7XHJcbiAgICAvLyAgIC8vIHRoaXMudm9sdW1lID0gX211dGF0b3Iudm9sdW1lO1xyXG4gICAgLy8gICAvLyB0aGlzLmxvb3AgPSBfbXV0YXRvci5sb29wO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubGlzdGVuZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBobmRBdWRpb1JlYWR5OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJBdWRpbyBzdGFydFwiLCBSZWZsZWN0LmdldChfZXZlbnQudGFyZ2V0LCBcInVybFwiKSk7XHJcbiAgICAgIGlmICh0aGlzLnBsYXlpbmcpXHJcbiAgICAgICAgdGhpcy5wbGF5KHRydWUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGhuZEF1ZGlvRW5kZWQ6IEV2ZW50TGlzdGVuZXIgPSAoX2V2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBEZWJ1Zy5mdWRnZShcIkF1ZGlvIGVuZGVkXCIsIFJlZmxlY3QuZ2V0KF9ldmVudC50YXJnZXQsIFwidXJsXCIpKTtcclxuICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaW5zdGFsbChfYXVkaW9NYW5hZ2VyOiBBdWRpb01hbmFnZXIgPSBBdWRpb01hbmFnZXIuZGVmYXVsdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYWN0aXZlOiBib29sZWFuID0gdGhpcy5pc0FjdGl2ZTtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuYXVkaW9NYW5hZ2VyID0gX2F1ZGlvTWFuYWdlcjtcclxuICAgICAgdGhpcy5wYW5uZXIgPSBfYXVkaW9NYW5hZ2VyLmNyZWF0ZVBhbm5lcigpO1xyXG4gICAgICB0aGlzLmdhaW4gPSBfYXVkaW9NYW5hZ2VyLmNyZWF0ZUdhaW4oKTtcclxuICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgICB0aGlzLmdhaW4uY29ubmVjdChfYXVkaW9NYW5hZ2VyLmdhaW4pO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlKGFjdGl2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTb3VyY2UoX2F1ZGlvOiBBdWRpbywgX2xvb3A6IGJvb2xlYW4sIF9wbGF5YmFja1JhdGU6IG51bWJlciA9IDEuMCk6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5zb3VyY2UpIHtcclxuICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYnVmZmVyID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNvdXJjZSA9IHRoaXMuYXVkaW9NYW5hZ2VyLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMucGFubmVyKTtcclxuXHJcbiAgICAgIGlmIChfYXVkaW8pIHtcclxuICAgICAgICB0aGlzLmF1ZGlvID0gX2F1ZGlvO1xyXG4gICAgICAgIHRoaXMuc291cmNlLmJ1ZmZlciA9IF9hdWRpby5idWZmZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc291cmNlLmxvb3AgPSBfbG9vcDtcclxuICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBfcGxheWJhY2tSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ29ubmVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNvbm5lY3QodGhpcy5pc0FjdGl2ZSAmJiB0aGlzLmlzQXR0YWNoZWQgJiYgdGhpcy5saXN0ZW5lZCk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIC8vIG5vcFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljYWxseSBjb25uZWN0cy9kaXNjb25uZWN0cyBBdWRpb05vZGVzIHdoZW4gYWRkaW5nL3JlbW92aW5nIHRoaXMgY29tcG9uZW50IHRvL2Zyb20gYSBub2RlLiBcclxuICAgICAqIFRoZXJlZm9yZSB1bnVzZWQgQXVkaW9Ob2RlcyBtYXkgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhbiB1bnVzZWQgY29tcG9uZW50IGlzIGNvbGxlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUF0dGFjaCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhfZXZlbnQpO1xyXG4gICAgICBpZiAoX2V2ZW50LnR5cGUgPT0gRVZFTlQuQ09NUE9ORU5UX0FERCkge1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCwgdGhpcy5oYW5kbGVHcmFwaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfUkVNT1ZFLCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5VUERBVEUsIHRoaXMudXBkYXRlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVkID0gdGhpcy5ub2RlLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5ELCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlVQREFURSwgdGhpcy51cGRhdGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljYWxseSBjb25uZWN0cy9kaXNjb25uZWN0cyBBdWRpb05vZGVzIHdoZW4gYXBwZW5kaW5nL3JlbW92aW5nIHRoZSBGVURHRS1ncmFwaCB0aGUgY29tcG9uZW50IGlzIGluLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVHcmFwaCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhfZXZlbnQpO1xyXG4gICAgICB0aGlzLmxpc3RlbmVkID0gKF9ldmVudC50eXBlID09IEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBwYW5uZXIgbm9kZSwgaXRzIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24sIHVzaW5nIHRoZSB3b3JsZG1hdHJpeCBvZiB0aGUgY29udGFpbmVyIGFuZCB0aGUgcGl2b3Qgb2YgdGhpcyBjb21wb25lbnQuIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZSA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3Q7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG10eFJlc3VsdC50cmFuc2xhdGlvbjtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWigxKSwgbXR4UmVzdWx0LCBmYWxzZSk7XHJcblxyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvblgudmFsdWUgPSBwb3NpdGlvbi54O1xyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvblkudmFsdWUgPSBwb3NpdGlvbi55O1xyXG4gICAgICB0aGlzLnBhbm5lci5wb3NpdGlvbloudmFsdWUgPSBwb3NpdGlvbi56O1xyXG5cclxuICAgICAgdGhpcy5wYW5uZXIub3JpZW50YXRpb25YLnZhbHVlID0gZm9yd2FyZC54O1xyXG4gICAgICB0aGlzLnBhbm5lci5vcmllbnRhdGlvblkudmFsdWUgPSBmb3J3YXJkLnk7XHJcbiAgICAgIHRoaXMucGFubmVyLm9yaWVudGF0aW9uWi52YWx1ZSA9IGZvcndhcmQuejtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGZvcndhcmQpO1xyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lIHdoeSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzIGVycm9uZW91cyByZXN1bHRzLCBzZWUgdGVzdCBcIlNwYXRpYWwgQXVkaW9cIlxyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFNlcnZlcyB0byBzZXQgdGhlIHNwYXRpYWwgbG9jYXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIEF1ZGlvTGlzdGVuZXJzIHJlbGF0aXZlIHRvIHRoZVxyXG4gICAqIHdvcmxkIHRyYW5zZm9ybSBvZiB0aGUge0BsaW5rIE5vZGV9IGl0IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEF1ZGlvTGlzdGVuZXIpO1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gQXVkaW9MaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKF9saXN0ZW5lcjogQXVkaW9MaXN0ZW5lcik6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSB0aGlzLm10eFBpdm90O1xyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIG10eFJlc3VsdCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcblxyXG4gICAgICAvLyBEZWJ1Zy5sb2cobXR4UmVzdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBtdHhSZXN1bHQudHJhbnNsYXRpb247XHJcbiAgICAgIGxldCBmb3J3YXJkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihWZWN0b3IzLlooMSksIG10eFJlc3VsdCwgZmFsc2UpO1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWSgpLCBtdHhSZXN1bHQsIGZhbHNlKTtcclxuICAgICAgaWYgKF9saXN0ZW5lci5wb3NpdGlvblggIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWC52YWx1ZSA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWS52YWx1ZSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgX2xpc3RlbmVyLnBvc2l0aW9uWi52YWx1ZSA9IHBvc2l0aW9uLno7XHJcblxyXG4gICAgICAgIF9saXN0ZW5lci5mb3J3YXJkWC52YWx1ZSA9IGZvcndhcmQueDtcclxuICAgICAgICBfbGlzdGVuZXIuZm9yd2FyZFkudmFsdWUgPSBmb3J3YXJkLnk7XHJcbiAgICAgICAgX2xpc3RlbmVyLmZvcndhcmRaLnZhbHVlID0gZm9yd2FyZC56O1xyXG5cclxuICAgICAgICBfbGlzdGVuZXIudXBYLnZhbHVlID0gdXAueDtcclxuICAgICAgICBfbGlzdGVuZXIudXBZLnZhbHVlID0gdXAueTtcclxuICAgICAgICBfbGlzdGVuZXIudXBaLnZhbHVlID0gdXAuejtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGaXJlZm94IHN0aWxsIHVzZXMgZGVwcmVjYXRlZCBtZXRob2RzLiBUT0RPOiBkZWxldGUgYXMgc29vbiBhcyBwb3NzaWJsZSFcclxuICAgICAgICBfbGlzdGVuZXIuc2V0UG9zaXRpb24ocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcbiAgICAgICAgX2xpc3RlbmVyLnNldE9yaWVudGF0aW9uKGZvcndhcmQueCwgZm9yd2FyZC55LCBmb3J3YXJkLnosIHVwLngsIHVwLnksIHVwLnopO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShmb3J3YXJkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodXApO1xyXG4gICAgICBpZiAodGhpcy5ub2RlKVxyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcblxyXG4gICAgICAvLyBEZWJ1Zy5sb2cobXR4UmVzdWx0LnRyYW5zbGF0aW9uLnRvU3RyaW5nKCksIGZvcndhcmQudG9TdHJpbmcoKSwgdXAudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYSBibG9vbS1lZmZlY3QuXHJcbiAgICogQGF1dGhvcnMgUm9sYW5kIEhlZXIsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRCbG9vbSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Qmxvb20pO1xyXG4gICAgXHJcbiAgICAjdGhyZXNob2xkOiBudW1iZXI7XHJcbiAgICAjaW50ZW5zaXR5OiBudW1iZXI7XHJcbiAgICAjaGlnaGxpZ2h0RGVzYXR1cmF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90aHJlc2hvbGQ6IG51bWJlciA9IDAuOTUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDEuMCwgX2Rlc2F0dXJhdGVIaWdobGlnaHRzOiBudW1iZXIgPSAwLjUpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy4jdGhyZXNob2xkID0gX3RocmVzaG9sZDtcclxuICAgICAgdGhpcy4jaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gX2Rlc2F0dXJhdGVIaWdobGlnaHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0aHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpbnRlbnNpdHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ludGVuc2l0eTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaW50ZW5zaXR5KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2ludGVuc2l0eSA9IE1hdGgubWF4KDAsIF92YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoaWdobGlnaHREZXNhdHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaGlnaGxpZ2h0RGVzYXR1cmF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbiA9IENhbGMuY2xhbXAoX3ZhbHVlLCAwLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy4jdGhyZXNob2xkLFxyXG4gICAgICAgIGludGVuc2l0eTogdGhpcy4jaW50ZW5zaXR5LFxyXG4gICAgICAgIGRlc2F0dXJhdGVIaWdobGlnaHRzOiB0aGlzLiNoaWdobGlnaHREZXNhdHVyYXRpb24sXHJcbiAgICAgIH07XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy4jdGhyZXNob2xkID0gX3NlcmlhbGl6YXRpb24udGhyZXNob2xkO1xyXG4gICAgICB0aGlzLiNpbnRlbnNpdHkgPSBfc2VyaWFsaXphdGlvbi5pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmRlc2F0dXJhdGVIaWdobGlnaHRzO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQ7XHJcbiAgICAgIG11dGF0b3IuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcbiAgICAgIG11dGF0b3IuaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gdGhpcy5oaWdobGlnaHREZXNhdHVyYXRpb247XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiQ29tcG9uZW50LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgZW51bSBGSUVMRF9PRl9WSUVXIHtcclxuICAgIEhPUklaT05UQUwgPSBcImhvcml6b250YWxcIixcclxuICAgIFZFUlRJQ0FMID0gXCJ2ZXJ0aWNhbFwiLFxyXG4gICAgRElBR09OQUwgPSBcImRpYWdvbmFsXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgcHJvamVjdGlvbnMgYSBjYW1lcmEgY2FuIHByb3ZpZGUuICBcclxuICAgKiBUT0RPOiBjaGFuZ2UgYmFjayB0byBudW1iZXIgZW51bSBpZiBzdHJpbmdzIG5vdCBuZWVkZWRcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBQUk9KRUNUSU9OIHtcclxuICAgIENFTlRSQUwgPSBcImNlbnRyYWxcIixcclxuICAgIE9SVEhPR1JBUEhJQyA9IFwib3J0aG9ncmFwaGljXCIsXHJcbiAgICBESU1FVFJJQyA9IFwiZGltZXRyaWNcIixcclxuICAgIFNURVJFTyA9IFwic3RlcmVvXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIGNhbWVyYSBjb21wb25lbnQgaG9sZHMgdGhlIHByb2plY3Rpb24tbWF0cml4IGFuZCBvdGhlciBkYXRhIG5lZWRlZCB0byByZW5kZXIgYSBzY2VuZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgbm9kZSBpdCBpcyBhdHRhY2hlZCB0by5cclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudENhbWVyYSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Q2FtZXJhKTtcclxuXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIGNsckJhY2tncm91bmQ6IENvbG9yID0gbmV3IENvbG9yKDAsIDAsIDAsIDEpOyAvLyBUaGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmQgdGhlIGNhbWVyYSB3aWxsIHJlbmRlci5cclxuICAgIC8vcHJpdmF0ZSBvcnRob2dyYXBoaWM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbWFnZSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICBwcml2YXRlIHByb2plY3Rpb246IFBST0pFQ1RJT04gPSBQUk9KRUNUSU9OLkNFTlRSQUw7XHJcbiAgICBwcml2YXRlIGZpZWxkT2ZWaWV3OiBudW1iZXIgPSA0NTsgLy8gVGhlIGNhbWVyYSdzIHNlbnNvcmFuZ2xlLlxyXG4gICAgcHJpdmF0ZSBhc3BlY3RSYXRpbzogbnVtYmVyID0gMS4wO1xyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb246IEZJRUxEX09GX1ZJRVcgPSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMO1xyXG4gICAgcHJpdmF0ZSBuZWFyOiBudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBmYXI6IG51bWJlciA9IDIwMDA7XHJcbiAgICBwcml2YXRlIGJhY2tncm91bmRFbmFibGVkOiBib29sZWFuID0gdHJ1ZTsgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYmFja2dyb3VuZCBvZiB0aGlzIGNhbWVyYSB3aWxsIGJlIHJlbmRlcmVkLlxyXG4gICAgLy8gVE9ETzogZXhhbWluZSwgaWYgYmFja2dyb3VuZCBzaG91bGQgYmUgYW4gYXR0cmlidXRlIG9mIENhbWVyYSBvciBWaWV3cG9ydFxyXG5cclxuICAgICNtdHhXb3JsZFRvVmlldzogTWF0cml4NHg0O1xyXG4gICAgI210eENhbWVyYUludmVyc2U6IE1hdHJpeDR4NDtcclxuICAgICNtdHhQcm9qZWN0aW9uOiBNYXRyaXg0eDQgPSBuZXcgTWF0cml4NHg0OyAvLyBUaGUgbWF0cml4IHRvIG11bHRpcGx5IGVhY2ggc2NlbmUgb2JqZWN0cyB0cmFuc2Zvcm1hdGlvbiBieSwgdG8gZGV0ZXJtaW5lIHdoZXJlIGl0IHdpbGwgYmUgZHJhd24uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIHdvcmxkdHJhbnNmb3JtYXRpb24gbWF0cml4IGkuZS4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBncmFwaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhDYW1lcmE6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3QuY2xvbmU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbXR4Q2FtZXJhID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgLy8gbm8gY29udGFpbmVyIG5vZGUgb3Igbm8gd29ybGQgdHJhbnNmb3JtYXRpb24gZm91bmQgLT4gY29udGludWUgd2l0aCBwaXZvdCBvbmx5XHJcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgdXNlIGlmICgpIHRoZW4gaW5zdGVhZCBvZiB0cnkgY2F0Y2hcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbXR4Q2FtZXJhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhlIHdvcmxkdHJhbnNmb3JtYXRpb24gb2YgdGhlIGNhbWVyYSBjb250YWluZXIsIHRoZSBwaXZvdCBvZiB0aGlzIGNhbWVyYSBhbmQgdGhlIGludmVyc2lvbiBvZiB0aGUgcHJvamVjdGlvbiBtYXRyaXhcclxuICAgICAqIHlpZWxkaW5nIHRoZSB3b3JsZHNwYWNlIHRvIHZpZXdzcGFjZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhXb3JsZFRvVmlldygpOiBNYXRyaXg0eDQge1xyXG4gICAgICBpZiAodGhpcy4jbXR4V29ybGRUb1ZpZXcpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eFdvcmxkVG9WaWV3O1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4V29ybGRUb1ZpZXcgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLiNtdHhQcm9qZWN0aW9uLCB0aGlzLm10eENhbWVyYUludmVyc2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRUb1ZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnZlcnNpb24gb2YgdGhpcyBjYW1lcmFzIHdvcmxkdHJhbnNmb3JtYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhDYW1lcmFJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlO1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHByb2plY3Rpb25tYXRyaXggb2YgdGhpcyBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhQcm9qZWN0aW9uKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhQcm9qZWN0aW9uKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNtdHhQcm9qZWN0aW9uO1xyXG5cclxuICAgICAgLy9UT0RPOiBvcHRpbWl6ZSwgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBpZiBuZWl0aGVyIG10eFdvcmxkIG5vciBwaXZvdCBoYXZlIGNoYW5nZWRcclxuICAgICAgdGhpcy4jbXR4UHJvamVjdGlvbiA9IG5ldyBNYXRyaXg0eDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhQcm9qZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgY2FtZXJhcyB7QGxpbmsgbXR4V29ybGRUb1ZpZXd9IGFuZCB7QGxpbmsgbXR4Q2FtZXJhSW52ZXJzZX0gbWF0cmljZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0V29ybGRUb1ZpZXcoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZFRvVmlldykgUmVjeWNsZXIuc3RvcmUodGhpcy4jbXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBpZiAodGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSkgUmVjeWNsZXIuc3RvcmUodGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSk7XHJcbiAgICAgIHRoaXMuI210eFdvcmxkVG9WaWV3ID0gbnVsbDtcclxuICAgICAgdGhpcy4jbXR4Q2FtZXJhSW52ZXJzZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIHtAbGluayBQUk9KRUNUSU9OfSBtb2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9qZWN0aW9uKCk6IFBST0pFQ1RJT04ge1xyXG4gICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBjYW1lcmEgc2hvdWxkIGJlIHJlbmRlcmVkLCBmYWxzZSBpZiBub3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJhY2tncm91bmRFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgYXNwZWN0IHJhdGlvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBc3BlY3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIGZpZWxkIG9mIHZpZXcgaW4gZGVncmVlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmllbGRPZlZpZXcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmllbGRPZlZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIGRpcmVjdGlvbiBpLmUuIHRoZSBwbGFuZSBvbiB3aGljaCB0aGUgZmllbGRPZlZpZXctQW5nbGUgaXMgZ2l2ZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERpcmVjdGlvbigpOiBGSUVMRF9PRl9WSUVXIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBuZWFyIHZhbHVlIGkuZS4gdGhlIG1pbmltdW0gZGlzdGFuY2UgdG8gcmVuZGVyIG9iamVjdHMgYXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5lYXIoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmVhcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZmFyIHZhbHVlIGkuZS4gdGhlIG1heGltdW0gZGlzdGFuY2UgdG8gcmVuZGVyIG9iamVjdHMgYXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZhcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5mYXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbWVyYSB0byBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBUaGUgd29ybGQgb3JpZ2luIGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc2VsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0gX2FzcGVjdCBUaGUgYXNwZWN0IHJhdGlvIGJldHdlZW4gd2lkdGggYW5kIGhlaWdodCBvZiBwcm9qZWN0aW9uc3BhY2UuKERlZmF1bHQgPSBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuQ2xpZW50SGVpZ2h0KVxyXG4gICAgICogQHBhcmFtIF9maWVsZE9mVmlldyBUaGUgZmllbGQgb2YgdmlldyBpbiBEZWdyZWVzLiAoRGVmYXVsdCA9IDQ1KVxyXG4gICAgICogQHBhcmFtIF9kaXJlY3Rpb24gVGhlIHBsYW5lIG9uIHdoaWNoIHRoZSBmaWVsZE9mVmlldy1BbmdsZSBpcyBnaXZlbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2plY3RDZW50cmFsKF9hc3BlY3Q6IG51bWJlciA9IHRoaXMuYXNwZWN0UmF0aW8sIF9maWVsZE9mVmlldzogbnVtYmVyID0gdGhpcy5maWVsZE9mVmlldywgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVyA9IHRoaXMuZGlyZWN0aW9uLCBfbmVhcjogbnVtYmVyID0gdGhpcy5uZWFyLCBfZmFyOiBudW1iZXIgPSB0aGlzLmZhcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFzcGVjdFJhdGlvID0gX2FzcGVjdDtcclxuICAgICAgdGhpcy5maWVsZE9mVmlldyA9IF9maWVsZE9mVmlldztcclxuICAgICAgdGhpcy5kaXJlY3Rpb24gPSBfZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBQUk9KRUNUSU9OLkNFTlRSQUw7XHJcbiAgICAgIHRoaXMubmVhciA9IF9uZWFyO1xyXG4gICAgICB0aGlzLmZhciA9IF9mYXI7XHJcbiAgICAgIHRoaXMuI210eFByb2plY3Rpb24gPSBNYXRyaXg0eDQuUFJPSkVDVElPTl9DRU5UUkFMKF9hc3BlY3QsIHRoaXMuZmllbGRPZlZpZXcsIF9uZWFyLCBfZmFyLCB0aGlzLmRpcmVjdGlvbik7IC8vIFRPRE86IHJlbW92ZSBtYWdpYyBudW1iZXJzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbWVyYSB0byBvcnRob2dyYXBoaWMgcHJvamVjdGlvbi4gRGVmYXVsdCB2YWx1ZXMgYXJlIGRlcml2ZWQgdGhlIGNhbnZhcyBjbGllbnQgZGltZW5zaW9uc1xyXG4gICAgICogQHBhcmFtIF9sZWZ0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBsZWZ0IGJvcmRlci4gICAgXHJcbiAgICAgKiBAcGFyYW0gX3JpZ2h0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyByaWdodCBib3JkZXIuICBcclxuICAgICAqIEBwYXJhbSBfYm90dG9tIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBib3R0b20gYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF90b3AgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHRvcCBib3JkZXIuICAgICAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9qZWN0T3J0aG9ncmFwaGljKF9sZWZ0OiBudW1iZXIgPSAtUmVuZGVyLmdldENhbnZhcygpLmNsaWVudFdpZHRoIC8gMiwgX3JpZ2h0OiBudW1iZXIgPSBSZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50V2lkdGggLyAyLCBfYm90dG9tOiBudW1iZXIgPSBSZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50SGVpZ2h0IC8gMiwgX3RvcDogbnVtYmVyID0gLVJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRIZWlnaHQgLyAyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucHJvamVjdGlvbiA9IFBST0pFQ1RJT04uT1JUSE9HUkFQSElDO1xyXG4gICAgICB0aGlzLiNtdHhQcm9qZWN0aW9uID0gTWF0cml4NHg0LlBST0pFQ1RJT05fT1JUSE9HUkFQSElDKF9sZWZ0LCBfcmlnaHQsIF9ib3R0b20sIF90b3AsIDQwMCwgLTQwMCk7IC8vIFRPRE86IGV4YW1pbmUgbWFnaWMgbnVtYmVycyFcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gb2YgYSBwcm9qZWN0aW9uIHN1cmZhY2UgaW4gdGhlIGh5cG90aGV0aWNhbCBkaXN0YW5jZSBvZiAxIHRvIHRoZSBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb2plY3Rpb25SZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgbGV0IHRhbkZvdjogbnVtYmVyID0gTWF0aC50YW4oTWF0aC5QSSAqIHRoaXMuZmllbGRPZlZpZXcgLyAzNjApOyAvLyBIYWxmIG9mIHRoZSBhbmdsZSwgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbiBmcm9tIHRoZSBjZW50ZXIgLT4gcmlnaHQgYW5nbGVcclxuICAgICAgbGV0IHRhbkhvcml6b250YWw6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0YW5WZXJ0aWNhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMKSB7XHJcbiAgICAgICAgbGV0IGFzcGVjdDogbnVtYmVyID0gTWF0aC5zcXJ0KHRoaXMuYXNwZWN0UmF0aW8pO1xyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5Gb3YgKiBhc3BlY3Q7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Gb3YgLyBhc3BlY3Q7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5WRVJUSUNBTCkge1xyXG4gICAgICAgIHRhblZlcnRpY2FsID0gdGFuRm92O1xyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5WZXJ0aWNhbCAqIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICAgIH0gZWxzZSB7Ly9GT1ZfRElSRUNUSU9OLkhPUklaT05UQUxcclxuICAgICAgICB0YW5Ib3Jpem9udGFsID0gdGFuRm92O1xyXG4gICAgICAgIHRhblZlcnRpY2FsID0gdGFuSG9yaXpvbnRhbCAvIHRoaXMuYXNwZWN0UmF0aW87XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRhbkhvcml6b250YWwgKiAyLCB0YW5WZXJ0aWNhbCAqIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSB3b3JsZCBzcGFjZSB0byBjbGlwIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludFdvcmxkVG9DbGlwKF9wb2ludEluV29ybGRTcGFjZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gdGhpcy5tdHhXb3JsZFRvVmlldy5nZXQoKTtcclxuICAgICAgbGV0IHc6IG51bWJlciA9IG1bM10gKiBfcG9pbnRJbldvcmxkU3BhY2UueCArIG1bN10gKiBfcG9pbnRJbldvcmxkU3BhY2UueSArIG1bMTFdICogX3BvaW50SW5Xb3JsZFNwYWNlLnogKyBtWzE1XTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3BvaW50SW5Xb3JsZFNwYWNlLCB0aGlzLm10eFdvcmxkVG9WaWV3KTtcclxuICAgICAgcmVzdWx0LnNjYWxlKDEgLyB3KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHBvaW50IGZyb20gY2xpcCBzcGFjZSB0byB3b3JsZCBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGlwVG9Xb3JsZChfcG9pbnRJbkNsaXBTcGFjZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gbXR4Vmlld1RvV29ybGQuZ2V0KCk7XHJcbiAgICAgIGxldCByYXlXb3JsZDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3BvaW50SW5DbGlwU3BhY2UsIG10eFZpZXdUb1dvcmxkLCB0cnVlKTtcclxuICAgICAgbGV0IHc6IG51bWJlciA9IG1bM10gKiBfcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIF9wb2ludEluQ2xpcFNwYWNlLnkgKyBtWzExXSAqIF9wb2ludEluQ2xpcFNwYWNlLnogKyBtWzE1XTtcclxuICAgICAgcmF5V29ybGQuc2NhbGUoMSAvIHcpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheVdvcmxkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNjYWxpbmcgZmFjdG9yIHRoYXQsIGdpdmVuIGEgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UsIFxyXG4gICAgICogc2NhbGVzIGFuIG9iamVjdCBhdCB0aGF0IHBvc2l0aW9uIHNvIHRoYXQgb25lIHVuaXQgZXF1YWxzIG9uZSAobG9naWNhbCkgcGl4ZWwgb24gdGhlIHNjcmVlbiBcclxuICAgICAqIHdoZW4gc2VlbiB0aHJvdWdoIHRoaXMgY2FtZXJhLlxyXG4gICAgICogZS5nLiwgYWZ0ZXIgc2V0dGluZyB0aGUgc2NhbGluZywgMSB1bml0IGluIHRoZSB3b3JsZCBlcXVhbHMgb25lIChsb2dpY2FsKSBwaXhlbCBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0V29ybGRUb1BpeGVsU2NhbGUoX3Bvc1dvcmxkOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGRpc3RhbmNlOiBudW1iZXIgPSB0aGlzLm10eFdvcmxkLnRyYW5zbGF0aW9uLmdldERpc3RhbmNlKF9wb3NXb3JsZCk7XHJcbiAgICAgIGxldCBzY2FsZTogbnVtYmVyO1xyXG4gICAgICBsZXQgcmVjdDogUmVjdGFuZ2xlID0gUmVuZGVyLmdldFJlbmRlclJlY3RhbmdsZSgpO1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuZ2V0RGlyZWN0aW9uKCkpIHtcclxuICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuVkVSVElDQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyByZWN0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyByZWN0LndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuRElBR09OQUw6XHJcbiAgICAgICAgICBzY2FsZSA9IDEgLyBNYXRoLnNxcnQoKHJlY3Qud2lkdGggKiByZWN0LmhlaWdodCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHNjYWxlICogZGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuY2xyQmFja2dyb3VuZCxcclxuICAgICAgICBiYWNrZ3JvdW5kRW5hYmxlZDogdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCxcclxuICAgICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXHJcbiAgICAgICAgZmllbGRPZlZpZXc6IHRoaXMuZmllbGRPZlZpZXcsXHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhcixcclxuICAgICAgICBhc3BlY3Q6IHRoaXMuYXNwZWN0UmF0aW8sXHJcbiAgICAgICAgcGl2b3Q6IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsckJhY2tncm91bmQuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCA9IF9zZXJpYWxpemF0aW9uLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBfc2VyaWFsaXphdGlvbi5wcm9qZWN0aW9uO1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX3NlcmlhbGl6YXRpb24uZmllbGRPZlZpZXc7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfc2VyaWFsaXphdGlvbi5hc3BlY3Q7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX3NlcmlhbGl6YXRpb24uZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5wcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQzpcclxuICAgICAgICAgIHRoaXMucHJvamVjdE9ydGhvZ3JhcGhpYygpOyAvLyBUT0RPOiBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHBhcmFtZXRlcnNcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLmRpcmVjdGlvbilcclxuICAgICAgICB0eXBlcy5kaXJlY3Rpb24gPSBGSUVMRF9PRl9WSUVXO1xyXG4gICAgICBpZiAodHlwZXMucHJvamVjdGlvbilcclxuICAgICAgICB0eXBlcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMucHJvamVjdGlvbikge1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCh0aGlzLmFzcGVjdFJhdGlvLCB0aGlzLmZpZWxkT2ZWaWV3LCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25DYW1lcmEsIG10eFdvcmxkLCBjb2xvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIGNvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVGcnVzdHVtKHRoaXMuZ2V0QXNwZWN0KCksIHRoaXMuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5nZXROZWFyKCksIHRoaXMuZ2V0RmFyKCksIHRoaXMuZ2V0RGlyZWN0aW9uKCksIHRoaXMubXR4V29ybGQsIENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50cmFuc2Zvcm07XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFrZXMgdGhlIG5vZGUgZmFjZSB0aGUgY2FtZXJhIHdoZW4gcmVuZGVyaW5nLCByZXNwZWN0aW5nIHJlc3RyaWN0aW9ucyBmb3Igcm90YXRpb24gYXJvdW5kIHNwZWNpZmljIGF4aXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEZhY2VDYW1lcmEgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyB1cExvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB1cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgxKTtcclxuICAgIHB1YmxpYyByZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVkIHRvIGEge0BsaW5rIE5vZGV9IHdpdGggYW4gYXR0YWNoZWQge0BsaW5rIENvbXBvbmVudENhbWVyYX0gdGhpcyBjYXVzZXMgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHJlY2VpdmUgYSBmb2ctZWZmZWN0LlxyXG4gICAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50Rm9nIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRGb2cpO1xyXG4gICAgcHVibGljIGNvbG9yOiBDb2xvcjtcclxuICAgIHB1YmxpYyBuZWFyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZmFyOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSksIF9uZWFyOiBudW1iZXIgPSAxLCBfZmFyOiBudW1iZXIgPSA1MCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmNvbG9yID0gX2NvbG9yO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfbmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfZmFyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKCksXHJcbiAgICAgICAgbmVhcjogdGhpcy5uZWFyLFxyXG4gICAgICAgIGZhcjogdGhpcy5mYXJcclxuICAgICAgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbG9yLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNvbG9yKTtcclxuICAgICAgdGhpcy5uZWFyID0gX3NlcmlhbGl6YXRpb24ubmVhciA/PyB0aGlzLm5lYXI7XHJcbiAgICAgIHRoaXMuZmFyID0gX3NlcmlhbGl6YXRpb24uZmFyID8/IHRoaXMuZmFyO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEZpbHRlcnMgc3luY2hyb25pemF0aW9uIGJldHdlZW4gYSBncmFwaCBpbnN0YW5jZSBhbmQgdGhlIGdyYXBoIGl0IGlzIGNvbm5lY3RlZCB0by4gSWYgYWN0aXZlLCBubyBzeW5jaHJvbml6YXRpb24gb2NjdXJzLlxyXG4gICAqIE1heWJlIG1vcmUgZmluZWdyYWluZWQgaW4gdGhlIGZ1dHVyZS4uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9Db21wb25lbnRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50R3JhcGhGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2luZ2xldG9uID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgdHlwZSBUeXBlT2ZMaWdodCA9IG5ldyAoKSA9PiBMaWdodDtcclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBsaWdodHMuIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIExpZ2h0IGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIGludGVuc2l0eTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpLCBfaW50ZW5zaXR5OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUeXBlT2ZMaWdodH0gb2YgdGhpcyBsaWdodC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFR5cGUoKTogVHlwZU9mTGlnaHQge1xyXG4gICAgICByZXR1cm4gPFR5cGVPZkxpZ2h0PnRoaXMuY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaW50ZW5zaXR5OiB0aGlzLmludGVuc2l0eVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbG9yLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNvbG9yKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmludGVuc2l0eSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5pbnRlbnNpdHkgPSBfc2VyaWFsaXphdGlvbi5pbnRlbnNpdHk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKCk6IHZvaWQgey8qKi8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW1iaWVudCBsaWdodCwgY29taW5nIGZyb20gYWxsIGRpcmVjdGlvbnMsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIHdpdGggaXRzIGNvbG9yIGluZGVwZW5kZW50IG9mIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiAobGlrZSBhIGZvZ2d5IGRheSBvciBpbiB0aGUgc2hhZGVzKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggaXMgaWdub3JlZC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogfiB+IH4gIFxyXG4gICAqICB+IH4gfiAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0QW1iaWVudCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlyZWN0aW9uYWwgbGlnaHQsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0aW9uIHdpdGggaXRzIGNvbG9yIChsaWtlIHN0YW5kaW5nIGluIGJyaWdodCBzdW5saWdodCkgIFxyXG4gICAqIEF0dGFjaGVkIHRvIGEgbm9kZSBieSB7QGxpbmsgQ29tcG9uZW50TGlnaHR9LCB0aGUgcGl2b3QgbWF0cml4IHNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsaWdodCBvbmx5LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHREaXJlY3Rpb25hbCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT21uaWRpcmVjdGlvbmFsIGxpZ2h0IGVtaXR0aW5nIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yIChsaWtlIGEgY29sb3JlZCBsaWdodCBidWxiKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlnaHQsIGl0J3Mgc2hhcGUgYW5kIHJvdGF0aW9uLiBcclxuICAgKiBTbyB3aXRoIHVuZXZlbiBzY2FsaW5nLCBvdGhlciBzaGFwZXMgdGhhbiBhIHBlcmZlY3Qgc3BoZXJlLCBzdWNoIGFzIGFuIG92YWwgb3IgYSBkaXNjLCBhcmUgcG9zc2libGUsIHdoaWNoIGNyZWF0ZXMgYSB2aXNpYmxlIGVmZmVjdCBvZiB0aGUgcm90YXRpb24gdG9vLiBcclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHNoYXBlLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIC5cXHwvLlxyXG4gICAqICAgICAgICAtLSBvIC0tXHJcbiAgICogICAgICAgICDCtC98XFxgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0UG9pbnQgZXh0ZW5kcyBMaWdodCB7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNwb3QgbGlnaHQgZW1pdHRpbmcgd2l0aGluIGEgc3BlY2lmaWVkIGFuZ2xlIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yICBcclxuICAgKiBBdHRhY2hlZCB0byBhIG5vZGUgYnkge0BsaW5rIENvbXBvbmVudExpZ2h0fSwgdGhlIHBpdm90IG1hdHJpeCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaWdodCwgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIHNpemUgYW5kIGFuZ2xlcyBvZiB0aGUgY29uZS5cclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBvdXRlciBsaW1pdHMgb2YgdGhlIGNvbmUuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIG8gIFxyXG4gICAqICAgICAgICAgL3xcXCAgXHJcbiAgICogICAgICAgIC8gfCBcXCBcclxuICAgKiBgYGAgICBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHRTcG90IGV4dGVuZHMgTGlnaHQge1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0xpZ2h0L0xpZ2h0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGlnaHQgdGhpcyBjb21wb25lbnQgY2FuIHByb3ZpZGUuICBcclxuICAgKi9cclxuICAvLyBleHBvcnQgbGV0IExJR0hUX1RZUEU6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gIGV4cG9ydCBlbnVtIExJR0hUX1RZUEUge1xyXG4gICAgQU1CSUVOVCA9IFwiTGlnaHRBbWJpZW50XCIsXHJcbiAgICBESVJFQ1RJT05BTCA9IFwiTGlnaHREaXJlY3Rpb25hbFwiLFxyXG4gICAgUE9JTlQgPSBcIkxpZ2h0UG9pbnRcIixcclxuICAgIFNQT1QgPSBcIkxpZ2h0U3BvdFwiXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAgKiBBdHRhY2hlcyBhIHtAbGluayBMaWdodH0gdG8gdGhlIG5vZGVcclxuICAgICogVGhlIHBpdm90IG1hdHJpeCBoYXMgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgTGlnaHR9LiBTZWUgdGhlcmUgZm9yIGRldGFpbHMuXHJcbiAgICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRMaWdodCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TGlnaHQpO1xyXG5cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGNvbnN0cnVjdG9yczogeyBbdHlwZTogc3RyaW5nXTogR2VuZXJhbCB9ID0geyBbTElHSFRfVFlQRS5BTUJJRU5UXTogTGlnaHRBbWJpZW50LCBbTElHSFRfVFlQRS5ESVJFQ1RJT05BTF06IExpZ2h0RGlyZWN0aW9uYWwsIFtMSUdIVF9UWVBFLlBPSU5UXTogTGlnaHRQb2ludCwgW0xJR0hUX1RZUEUuU1BPVF06IExpZ2h0U3BvdCB9O1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgIHB1YmxpYyBsaWdodDogTGlnaHQgPSBudWxsO1xyXG4gICAgLy9UT0RPOiBzaW5jZSB0aGVyZSBpcyBhbG1vc3Qgbm8gZnVuY3Rpb25hbGl0eSBsZWZ0IGluIExpZ2h0LCBlbGltaW5hdGUgaXQgYW5kIHB1dCBhbGwgaW4gdGhlIGNvbXBvbmVudCBhcyB3aXRoIHRoZSBjYW1lcmEuLi5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xpZ2h0OiBMaWdodCA9IG5ldyBMaWdodEFtYmllbnQoKSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxpZ2h0ID0gX2xpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVzZSBUeXBlT2ZMaWdodCBhcyByZXR1cm4gdHlwZT9cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0eXBlIG9mIHtAbGluayBMaWdodH0gdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFR5cGU8VCBleHRlbmRzIExpZ2h0PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHJPbGQ6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKHRoaXMubGlnaHQpXHJcbiAgICAgICAgbXRyT2xkID0gdGhpcy5saWdodC5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICB0aGlzLmxpZ2h0ID0gbmV3IF9jbGFzcygpO1xyXG4gICAgICB0aGlzLmxpZ2h0Lm11dGF0ZShtdHJPbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHBpdm90OiB0aGlzLm10eFBpdm90LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGxpZ2h0OiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLmxpZ2h0KVxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIHRoaXMubGlnaHQgPSBhd2FpdCA8UHJvbWlzZTxMaWdodD4+U2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5saWdodCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudHlwZSA9IHRoaXMubGlnaHQuZ2V0VHlwZSgpLm5hbWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlKVxyXG4gICAgICAgIHR5cGVzLnR5cGUgPSBMSUdIVF9UWVBFO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBfbXV0YXRvci50eXBlO1xyXG4gICAgICBpZiAodHlwZW9mICh0eXBlKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlICE9IHRoaXMubGlnaHQuY29uc3RydWN0b3IubmFtZSlcclxuICAgICAgICB0aGlzLnNldFR5cGUoU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcjxMaWdodD4odHlwZSkpO1xyXG4gICAgICBkZWxldGUgKF9tdXRhdG9yLnR5cGUpOyAvLyBleGNsdWRlIGxpZ2h0IHR5cGUgZnJvbSBmdXJ0aGVyIG11dGF0aW9uXHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgX211dGF0b3IudHlwZSA9IHR5cGU7IC8vIHJlY29uc3RydWN0IG11dGF0b3JcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3SWNvbihUZXh0dXJlRGVmYXVsdC5pY29uTGlnaHQsIG10eFNoYXBlLCB0aGlzLmxpZ2h0LmNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2hhcGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJ5ZWxsb3dcIik7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMubGlnaHQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBMaWdodERpcmVjdGlvbmFsOlxyXG4gICAgICAgICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSAwLjU7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVDaXJjbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkoMTApLmZpbGwobnVsbCkubWFwKCgpID0+IFJlY3ljbGVyLmdldChWZWN0b3IzKSk7XHJcbiAgICAgICAgICBsaW5lc1swXS5zZXQoMCwgMCwgMCk7IGxpbmVzWzFdLnNldCgwLCAwLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzJdLnNldCgwLCByYWRpdXMsIDApOyBsaW5lc1szXS5zZXQoMCwgcmFkaXVzLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzZdLnNldCgwLCAtcmFkaXVzLCAwKTsgbGluZXNbN10uc2V0KDAsIC1yYWRpdXMsIDEpO1xyXG4gICAgICAgICAgbGluZXNbNF0uc2V0KHJhZGl1cywgMCwgMCk7IGxpbmVzWzVdLnNldChyYWRpdXMsIDAsIDEpO1xyXG4gICAgICAgICAgbGluZXNbOF0uc2V0KC1yYWRpdXMsIDAsIDApOyBsaW5lc1s5XS5zZXQoLXJhZGl1cywgMCwgMSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSguLi5saW5lcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExpZ2h0UG9pbnQ6XHJcbiAgICAgICAgICBtdHhTaGFwZS5zY2FsZShuZXcgVmVjdG9yMygyLCAyLCAyKSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVTcGhlcmUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTGlnaHRTcG90OlxyXG4gICAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBNYXRlcmlhbH0gdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAtIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWF0ZXJpYWwgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgIHB1YmxpYyBjbHJQcmltYXJ5OiBDb2xvciA9IENvbG9yLkNTUyhcIndoaXRlXCIpO1xyXG4gICAgcHVibGljIGNsclNlY29uZGFyeTogQ29sb3IgPSBDb2xvci5DU1MoXCJ3aGl0ZVwiKTtcclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICBAdHlwZShNYXRlcmlhbClcclxuICAgIHB1YmxpYyBtYXRlcmlhbDogTWF0ZXJpYWw7XHJcbiAgICAvKiogU3VwcG9ydCBzb3J0aW5nIG9mIG9iamVjdHMgd2l0aCB0cmFuc3BhcmVuY3kgd2hlbiByZW5kZXJpbmcsIHJlbmRlciBvYmplY3RzIGluIHRoZSBiYWNrIGZpcnN0LiBXaGVuIHRoaXMgY29tcG9uZW50IGlzIHVzZWQgYXMgYSBwYXJ0IG9mIGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfSwgdHJ5IGVuYWJsaW5nIHRoaXMgd2hlbiBkaXNhYmxpbmcge0BsaW5rIENvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlcHRoTWFza30gKi9cclxuICAgIHB1YmxpYyBzb3J0Rm9yQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIGEgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsP1xyXG4gICAgLy8gcHVibGljIG11dGF0b3JDb2F0OiBNdXRhdG9yRm9yQ29tcG9uZW50O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWF0ZXJpYWw6IE1hdGVyaWFsID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm1hdGVyaWFsID0gX21hdGVyaWFsO1xyXG4gICAgICAvLyB0aGlzLm11dGF0b3JDb2F0ID0gX21hdGVyaWFsLmdldENvYXQoKS5nZXRNdXRhdG9yRm9yQ29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc29ydEZvckFscGhhOiB0aGlzLnNvcnRGb3JBbHBoYSxcclxuICAgICAgICBjbHJQcmltYXJ5OiB0aGlzLmNsclByaW1hcnkuc2VyaWFsaXplKCksXHJcbiAgICAgICAgY2xyU2Vjb25kYXJ5OiB0aGlzLmNsclNlY29uZGFyeS5zZXJpYWxpemUoKSxcclxuICAgICAgICBwaXZvdDogdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGlkTWF0ZXJpYWw6IHRoaXMubWF0ZXJpYWwuaWRSZXNvdXJjZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tYXRlcmlhbCA9IDxNYXRlcmlhbD5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkTWF0ZXJpYWwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNsclByaW1hcnkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY2xyUHJpbWFyeSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2xyU2Vjb25kYXJ5LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNsclNlY29uZGFyeSk7XHJcbiAgICAgIHRoaXMuc29ydEZvckFscGhhID0gX3NlcmlhbGl6YXRpb24uc29ydEZvckFscGhhO1xyXG4gICAgICBhd2FpdCB0aGlzLm10eFBpdm90LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnBpdm90KTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIE1lc2h9IHRvIHRoZSBub2RlXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWVzaCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TWVzaCk7XHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICBAdHlwZShNZXNoKVxyXG4gICAgcHVibGljIG1lc2g6IE1lc2g7XHJcbiAgICBwdWJsaWMgc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWVzaD86IE1lc2gsIF9za2VsZXRvbj86IENvbXBvbmVudFNrZWxldG9uKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgICB0aGlzLnNrZWxldG9uID0gX3NrZWxldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5tdHhXb3JsZC5zY2FsaW5nO1xyXG4gICAgICBsZXQgc2NhbGU6IG51bWJlciA9IE1hdGgubWF4KE1hdGguYWJzKHNjYWxpbmcueCksIE1hdGguYWJzKHNjYWxpbmcueSksIE1hdGguYWJzKHNjYWxpbmcueikpO1xyXG4gICAgICByZXR1cm4gdGhpcy5tZXNoLnJhZGl1cyAqIHNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICogQ2FsY3VsYXRlcyB0aGUgcG9zaXRpb24gb2YgYSB2ZXJ0ZXggdHJhbnNmb3JtZWQgYnkgdGhlIHNrZWxldG9uXHJcbiAgICAvLyAgKiBAcGFyYW0gX2luZGV4IGluZGV4IG9mIHRoZSB2ZXJ0ZXhcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGdldFZlcnRleFBvc2l0aW9uKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIC8vIGV4dHJhY3QgdGhlIHZlcnRleCBkYXRhICh2ZXJ0aWNlczogM0QgdmVjdG9ycywgYm9uZSBpbmRpY2VzICYgd2VpZ2h0czogNEQgdmVjdG9ycylcclxuICAgIC8vICAgY29uc3QgaVZlcnRleDogbnVtYmVyID0gX2luZGV4ICogMztcclxuICAgIC8vICAgY29uc3QgaUJvbmVJbmZsdWVuY2U6IG51bWJlciA9IF9pbmRleCAqIDQ7XHJcblxyXG4gICAgLy8gICBjb25zdCB2ZXJ0ZXg6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyguLi5SZWZsZWN0LmdldCh0aGlzLm1lc2gsIFwicmVuZGVyTWVzaFwiKS52ZXJ0aWNlcy5zbGljZShpVmVydGV4LCBpVmVydGV4ICsgMykpO1xyXG4gICAgLy8gICBpZiAoISh0aGlzLm1lc2ggaW5zdGFuY2VvZiBNZXNoU2tpbikpIHJldHVybiB2ZXJ0ZXg7XHJcblxyXG4gICAgLy8gICBjb25zdCBpQm9uZXM6IFVpbnQ4QXJyYXkgPSB0aGlzLm1lc2guaUJvbmVzLnNsaWNlKGlCb25lSW5mbHVlbmNlLCBpQm9uZUluZmx1ZW5jZSArIDQpO1xyXG4gICAgLy8gICBjb25zdCB3ZWlnaHRzOiBGbG9hdDMyQXJyYXkgPSB0aGlzLm1lc2gud2VpZ2h0cy5zbGljZShpQm9uZUluZmx1ZW5jZSwgaUJvbmVJbmZsdWVuY2UgKyA0KTtcclxuXHJcbiAgICAvLyAgIC8vIGdldCBib25lIG1hdHJpY2VzXHJcbiAgICAvLyAgIGNvbnN0IG10eEJvbmVzOiBBcnJheTxNYXRyaXg0eDQ+ID0gdGhpcy5za2VsZXRvbi5tdHhCb25lcztcclxuXHJcbiAgICAvLyAgIC8vIHNraW4gbWF0cml4IFMgPSBzdW1faT0xXm17d19pICogQl9pfVxyXG4gICAgLy8gICBjb25zdCBza2luTWF0cml4OiBNYXRyaXg0eDQgPSBuZXcgTWF0cml4NHg0KCk7XHJcbiAgICAvLyAgIHNraW5NYXRyaXguc2V0KEFycmF5XHJcbiAgICAvLyAgICAgLmZyb20oaUJvbmVzKVxyXG4gICAgLy8gICAgIC5tYXAoKGlCb25lLCBpV2VpZ2h0KSA9PiBtdHhCb25lc1tpQm9uZV0uZ2V0KCkubWFwKHZhbHVlID0+IHZhbHVlICogd2VpZ2h0c1tpV2VpZ2h0XSkpIC8vIGFwcGx5IHdlaWdodCBvbiBlYWNoIG1hdHJpeFxyXG4gICAgLy8gICAgIC5yZWR1Y2UoKG10eFN1bSwgbXR4Qm9uZSkgPT4gbXR4U3VtLm1hcCgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSArIG10eEJvbmVbaW5kZXhdKSkgLy8gc3VtIHVwIHRoZSBtYXRyaWNlc1xyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgLy8gdHJhbnNmb3JtIHZlcnRleFxyXG4gICAgLy8gICB2ZXJ0ZXgudHJhbnNmb3JtKHNraW5NYXRyaXgpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIHZlcnRleDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBUT0RPOiByZW1vdmUgb3IgdGhpbmsgaWYgdGhlIHRyYW5zZm9ybWVkIGJvdW5kaW5nIGJveCBpcyBvZiB2YWx1ZSBvciBjYW4gYmUgbWFkZSB0byBiZVxyXG4gICAgLy8gcHVibGljIGdldCBib3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgLy8gICBsZXQgYm94OiBCb3ggPSBSZWN5Y2xlci5nZXQoQm94KTtcclxuICAgIC8vICAgYm94LnNldChcclxuICAgIC8vICAgICBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMubWVzaC5ib3VuZGluZ0JveC5taW4sIHRoaXMubXR4V29ybGQsIHRydWUpLFxyXG4gICAgLy8gICAgIFZlY3RvcjMuVFJBTlNGT1JNQVRJT04odGhpcy5tZXNoLmJvdW5kaW5nQm94Lm1heCwgdGhpcy5tdHhXb3JsZCwgdHJ1ZSlcclxuICAgIC8vICAgKTtcclxuICAgIC8vICAgcmV0dXJuIGJveDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uO1xyXG4gICAgICAvKiBhdCB0aGlzIHBvaW50IG9mIHRpbWUsIHNlcmlhbGl6YXRpb24gYXMgcmVzb3VyY2UgYW5kIGFzIGlubGluZSBvYmplY3QgaXMgcG9zc2libGUuIFRPRE86IGNoZWNrIGlmIGlubGluZSBiZWNvbWVzIG9ic29sZXRlICovXHJcbiAgICAgIGxldCBpZE1lc2g6IHN0cmluZyA9IHRoaXMubWVzaC5pZFJlc291cmNlO1xyXG4gICAgICBpZiAoaWRNZXNoKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb24gPSB7IGlkTWVzaDogaWRNZXNoIH07XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZXJpYWxpemF0aW9uID0geyBtZXNoOiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLm1lc2gpIH07XHJcblxyXG4gICAgICBpZiAodGhpcy5za2VsZXRvbilcclxuICAgICAgICBzZXJpYWxpemF0aW9uLnNrZWxldG9uID0gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgdGhpcy5za2VsZXRvbik7XHJcblxyXG4gICAgICBzZXJpYWxpemF0aW9uLnBpdm90ID0gdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBsZXQgbWVzaDogTWVzaDtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkTWVzaClcclxuICAgICAgICBtZXNoID0gPE1lc2g+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZE1lc2gpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbWVzaCA9IDxNZXNoPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubWVzaCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IG1lc2g7XHJcblxyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uc2tlbGV0b24pIHtcclxuICAgICAgICBjb25zdCBobmROb2RlRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGhuZEdyYXBoRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbiA9IE5vZGUuRklORCh0aGlzLCBfc2VyaWFsaXphdGlvbi5za2VsZXRvbik7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHVibGljIGRyYXdHaXptb3NTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLm1lc2gpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gQ29sb3IuQ1NTKFwic2FsbW9uXCIpO1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVNZXNoKHRoaXMubWVzaCwgdGhpcy5tdHhXb3JsZCwgY29sb3IsIDAuMSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgZW51bSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgcGFydGljbGUgc3lzdGVtIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCxcclxuICAgIC8qKlBsYXlzIHBhcnRpY2xlIHN5c3RlbSBvbmNlIGFuZCBzdG9wcyBhdCB0aGUgbGFzdCBwb2ludCBpbiB0aW1lLiovXHJcbiAgICBQTEFZX09OQ0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfSB0byB0aGUgbm9kZS4gXHJcbiAgICogV29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgQ29tcG9uZW50TWVzaH0gYW5kIHtAbGluayBDb21wb25lbnRNYXRlcmlhbH0gdG8gY3JlYXRlIGEgc2hhZGVyIHBhcnRpY2xlIHN5c3RlbS5cclxuICAgKiBBZGRpdGlvbmFsbHkgYSB7QGxpbmsgQ29tcG9uZW50RmFjZUNhbWVyYX0gY2FuIGJlIGF0dGFjaGVkIHRvIG1ha2UgdGhlIHBhcnRpY2xlcyBmYWNlIHRoZSBjYW1lcmEuXHJcbiAgICogQGF1dGhvciBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb21wb25lbnRQYXJ0aWNsZVN5c3RlbS5kZWNvcmF0ZVxyXG4gIEBlbnVtZXJhYmxlXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICBAdHlwZShQYXJ0aWNsZVN5c3RlbSlcclxuICAgIHB1YmxpYyBwYXJ0aWNsZVN5c3RlbTogUGFydGljbGVTeXN0ZW07XHJcbiAgICAvKiogV2hlbiBkaXNhYmxlZCB0cnkgZW5hYmxpbmcge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsLnNvcnRGb3JBbHBoYX0gKi9cclxuICAgIHB1YmxpYyBkZXB0aE1hc2s6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgYmxlbmRNb2RlOiBCTEVORDtcclxuICAgIHB1YmxpYyBwbGF5TW9kZTogUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFO1xyXG4gICAgcHVibGljIGR1cmF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBBIHRleHR1cmUgZmlsZWQgd2l0aCByYW5kb20gbnVtYmVycy4gVXNlZCBieSB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGE6IHVua25vd247XHJcblxyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzICovXHJcbiAgICAjc2l6ZTogbnVtYmVyO1xyXG4gICAgI3RpbWVTY2FsZTogbnVtYmVyID0gMTtcclxuICAgIHJlYWRvbmx5ICN0aW1lOiBUaW1lO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcGFydGljbGVTeXN0ZW06IFBhcnRpY2xlU3lzdGVtID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnBhcnRpY2xlU3lzdGVtID0gX3BhcnRpY2xlU3lzdGVtO1xyXG4gICAgICB0aGlzLmRlcHRoTWFzayA9IHRydWU7XHJcbiAgICAgIHRoaXMuYmxlbmRNb2RlID0gQkxFTkQuQURESVRJVkU7XHJcbiAgICAgIHRoaXMucGxheU1vZGUgPSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuTE9PUDtcclxuICAgICAgdGhpcy5kdXJhdGlvbiA9IDEwMDA7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IDEwO1xyXG4gICAgICB0aGlzLiN0aW1lID0gbmV3IFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgcGFydGljbGVzXHJcbiAgICAgKi9cclxuICAgIEBlbnVtZXJhYmxlXHJcbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMuIENhdXRpb246IFNldHRpbmcgdGhpcyB3aWxsIHJlaW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlcnMgYXJyYXkodGV4dHVyZSkgdXNlZCBpbiB0aGUgc2hhZGVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNpemUoX3NpemU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzaXplID0gX3NpemU7XHJcbiAgICAgIHRoaXMuZGVsZXRlUmVuZGVyRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGltZS5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUoX3RpbWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lLnNldChfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aW1lU2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWVTY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWVTY2FsZShfc2NhbGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lU2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZVNjYWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogR2VuZXJhdGVzIGFuZCBiaW5kcyB0aGUgcmFuZG9tIG51bWJlcnMgdGV4dHVyZSBpbiBXZWJHTFxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBEZWxldGVzIHRoZSByYW5kb20gbnVtYmVycyB0ZXh0dXJlIGluIFdlYkdMIGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBncHUgbWVtb3J5LlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaWRQYXJ0aWNsZVN5c3RlbTogdGhpcy5wYXJ0aWNsZVN5c3RlbT8uaWRSZXNvdXJjZSxcclxuICAgICAgICBkZXB0aE1hc2s6IHRoaXMuZGVwdGhNYXNrLFxyXG4gICAgICAgIGJsZW5kTW9kZTogdGhpcy5ibGVuZE1vZGUsXHJcbiAgICAgICAgcGxheU1vZGU6IHRoaXMucGxheU1vZGUsXHJcbiAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXHJcbiAgICAgICAgc2l6ZTogdGhpcy5zaXplXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFBhcnRpY2xlU3lzdGVtKSB0aGlzLnBhcnRpY2xlU3lzdGVtID0gPFBhcnRpY2xlU3lzdGVtPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgIHRoaXMuZGVwdGhNYXNrID0gX3NlcmlhbGl6YXRpb24uZGVwdGhNYXNrO1xyXG4gICAgICB0aGlzLmJsZW5kTW9kZSA9IF9zZXJpYWxpemF0aW9uLmJsZW5kTW9kZTtcclxuICAgICAgdGhpcy5wbGF5TW9kZSA9IF9zZXJpYWxpemF0aW9uLnBsYXlNb2RlO1xyXG4gICAgICB0aGlzLmR1cmF0aW9uID0gX3NlcmlhbGl6YXRpb24uZHVyYXRpb247XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zZXJpYWxpemF0aW9uLnNpemU7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvckFuaW1hdGlvbigpOiBNdXRhdG9yRm9yQW5pbWF0aW9uIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3JGb3JBbmltYXRpb24gPSA8TXV0YXRvckZvckFuaW1hdGlvbj50aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IucGFydGljbGVTeXN0ZW07XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnNpemU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5ibGVuZE1vZGUpXHJcbiAgICAgICAgdHlwZXMuYmxlbmRNb2RlID0gQkxFTkQ7XHJcbiAgICAgIGlmICh0eXBlcy5wbGF5TW9kZSlcclxuICAgICAgICB0eXBlcy5wbGF5TW9kZSA9IFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERTtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBobmRFdmVudCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIEVWRU5ULk5PREVfREVTRVJJQUxJWkVEOlxyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVRpbWVTY2FsZSk7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5DT01QT05FTlRfUkVNT1ZFOlxyXG4gICAgICAgICAgVGltZS5nYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVElNRV9TQ0FMRUQsIHRoaXMudXBkYXRlVGltZVNjYWxlKTtcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFTkRFUl9QUkVQQVJFLCB0aGlzLnVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnRpbWUgPiB0aGlzLmR1cmF0aW9uKVxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGF5TW9kZSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNhc2UgUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFLkxPT1A6XHJcbiAgICAgICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuUExBWV9PTkNFOlxyXG4gICAgICAgICAgICB0aGlzLnRpbWUgPSB0aGlzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVUaW1lU2NhbGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCB0aW1lU2NhbGU6IG51bWJlciA9IHRoaXMuI3RpbWVTY2FsZSAqIFRpbWUuZ2FtZS5nZXRTY2FsZSgpO1xyXG4gICAgICB0aGlzLiN0aW1lLnNldFNjYWxlKHRpbWVTY2FsZSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIFBJQ0sge1xyXG4gICAgUkFESVVTID0gXCJyYWRpdXNcIixcclxuICAgIENBTUVSQSA9IFwiY2FtZXJhXCIsXHJcbiAgICBQSFlTSUNTID0gXCJwaHlzaWNzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIHBpY2tpbmcgZnVuY3Rpb25hbGl0eSB0byB0aGUgbm9kZVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBpY2sgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFBpY2spO1xyXG4gICAgcHVibGljIHBpY2s6IFBJQ0sgPSBQSUNLLlJBRElVUztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIHRoZSBub2RlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFJheX0gYW5kIGludm9rZXMgZXZlbnRzIGFjY29yZGluZ2x5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrQW5kRGlzcGF0Y2goX3JheTogUmF5LCBfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IGNtcE1lc2ggPyBjbXBNZXNoLm10eFdvcmxkLnRyYW5zbGF0aW9uIDogdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLnBpY2spIHtcclxuICAgICAgICBjYXNlIFBJQ0suUkFESVVTOlxyXG4gICAgICAgICAgLy8gVE9ETzogc2hvdWxkIG9ubHkgYmUgbm9kZS5yYWRpdXMuIEFkanVzdG1lbnQgbmVlZGVkLCBpZiBtZXNoIHdhcyB0cmFuc2Zvcm1lZC4uLlxyXG4gICAgICAgICAgaWYgKF9yYXkuZ2V0RGlzdGFuY2UocG9zaXRpb24pLm1hZ25pdHVkZSA8IHRoaXMubm9kZS5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSy5QSFlTSUNTOlxyXG4gICAgICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBQaHlzaWNzLnJheWNhc3QoX3JheS5vcmlnaW4sIF9yYXkuZGlyZWN0aW9uLCBWZWN0b3IzLkRJRkZFUkVOQ0UocG9zaXRpb24sIF9yYXkub3JpZ2luKS5tYWduaXR1ZGVTcXVhcmVkKTtcclxuICAgICAgICAgIGlmIChoaXRJbmZvLmhpdClcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vVE9ETzogUElDSy5DQU1FUkFcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5waWNrKVxyXG4gICAgICAgIHR5cGVzLnBpY2sgPSBQSUNLO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3Igc2NyaXB0cyB0aGUgdXNlciB3cml0ZXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFNjcmlwdCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICAvLyByZWdpc3RlcmluZyB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgb25seSBpdHMgc3ViY2xhc3Nlcy4gT3IgdGhpcyBjb21wb25lbnQgbXVzdCByZWZlciB0byBzY3JpcHRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoaXMgY29tcG9uZW50XHJcbiAgICAvLyBUT0RPOiByZXRoaW5rICYgcmVmYWN0b3JcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRTY3JpcHQpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBUZXh0dXJlVGV4dH0gdG8gdGhlIG5vZGUuIFxyXG4gICAqIFdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIENvbXBvbmVudE1lc2h9IGFuZCB7QGxpbmsgQ29tcG9uZW50TWF0ZXJpYWx9IHRvIGNyZWF0ZSBhIHRleHQgbm9kZS5cclxuICAgKiBBICd0ZXh0dXJlZCcge0BsaW5rIE1hdGVyaWFsfSAoZS5nLiB7QGxpbmsgU2hhZGVyTGl0VGV4dHVyZWR9KSBtdXN0IGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgdGV4dCBwcm9wZXJseS4gSWRlYWxseSBhIHtAbGluayBNZXNoUXVhZH0gc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0ZXh0IG9udG8uXHJcbiAgICogQWRkaXRpb25hbGx5IGEge0BsaW5rIENvbXBvbmVudEZhY2VDYW1lcmF9IGNhbiBiZSBhdHRhY2hlZCB0byBtYWtlIHRoZSB0ZXh0IGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VGV4dCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VGV4dCk7XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmU6IFRleHR1cmVUZXh0O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgLyoqIC0gb246IFRoZSB0ZXh0cyBzaXplIGlzIGZpeGVkIHRvIG1hdGNoIHRoZSBzZXQgZm9udCBzaXplXHJcbiAgICAgKiAgLSBvZmY6IFRoZSBmb250IHNpemUgaXMgc3RyZXRjaGVkIHRvIG1hdGNoIHRoZSBhdHRhY2hlZCBtZXNoZXMgc2l6ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZml4ZWRTaXplOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGV4dD86IHN0cmluZywgX2ZvbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmVUZXh0KENvbXBvbmVudFRleHQubmFtZSwgX3RleHQsIF9mb250KTtcclxuICAgICAgdGhpcy5tdHhXb3JsZCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICB0aGlzLmZpeGVkU2l6ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiBNYXRyaXg0eDQge1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICB0aGlzLm10eFdvcmxkLmNvcHkoX210eE1lc2hUb1dvcmxkKTtcclxuXHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZml4ZWRTaXplKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlOiBudW1iZXIgPSBfY21wQ2FtZXJhLmdldFdvcmxkVG9QaXhlbFNjYWxlKF9tdHhNZXNoVG9Xb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgdGhpcy5tdHhXb3JsZC5zY2FsaW5nID0gc2NhbGluZy5zZXQodGhpcy50ZXh0dXJlLndpZHRoICogc2NhbGUsIHRoaXMudGV4dHVyZS5oZWlnaHQgKiBzY2FsZSwgMSk7O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBwaXhlbHNUb1VuaXRzOiBudW1iZXIgPSAxIC8gdGhpcy50ZXh0dXJlLmhlaWdodDtcclxuICAgICAgICBzY2FsaW5nLnNldCh0aGlzLnRleHR1cmUud2lkdGggKiBwaXhlbHNUb1VuaXRzLCB0aGlzLnRleHR1cmUuaGVpZ2h0ICogcGl4ZWxzVG9Vbml0cywgMSk7XHJcbiAgICAgICAgdGhpcy5tdHhXb3JsZC5zY2FsZShzY2FsaW5nKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzLm10eFdvcmxkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAgIGxldCBtZXNoOiBNZXNoID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKT8ubWVzaDtcclxuICAgICAgbGV0IGNtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICBpZiAobWVzaCA9PSBudWxsIHx8IGNtcE1hdGVyaWFsID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdXaXJlTWVzaChtZXNoLCB0aGlzLm10eFdvcmxkLCBjbXBNYXRlcmlhbC5jbHJQcmltYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRleHR1cmUubmFtZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gQkFTRSB7XHJcbiAgICBTRUxGLCBQQVJFTlQsIFdPUkxELCBOT0RFXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHRyYW5zZm9ybS17QGxpbmsgTWF0cml4NHg0fSB0byB0aGUgbm9kZSwgbW92aW5nLCBzY2FsaW5nIGFuZCByb3RhdGluZyBpdCBpbiBzcGFjZSByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFRyYW5zZm9ybSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VHJhbnNmb3JtKTtcclxuICAgIHB1YmxpYyBtdHhMb2NhbDogTWF0cml4NHg0O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbXR4SW5pdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5tdHhMb2NhbCA9IF9tdHhJbml0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2Zvcm1hdGlvbnMgcmVzcGVjdGluZyB0aGUgaGllcmFyY2h5XHJcbiAgICAvKipcclxuICAgICAqIHJlY2FsY3VsYXRlcyB0aGlzIGxvY2FsIG1hdHJpeCB0byB5aWVsZCB0aGUgaWRlbnRpY2FsIHdvcmxkIG1hdHJpeCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbm9kZS5cclxuICAgICAqIFVzZSByZWJhc2UgYmVmb3JlIGFwcGVuZGluZyB0aGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9uZW50IHRvIGFub3RoZXIgbm9kZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgd29ybGQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWJhc2UoX25vZGU6IE5vZGUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4TG9jYWw7XHJcbiAgICAgIGxldCBjb250YWluZXI6IE5vZGUgPSB0aGlzLm5vZGU7XHJcbiAgICAgIGlmIChjb250YWluZXIpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gY29udGFpbmVyLm10eFdvcmxkO1xyXG5cclxuICAgICAgaWYgKF9ub2RlKVxyXG4gICAgICAgIG10eFJlc3VsdCA9IE1hdHJpeDR4NC5SRUxBVElWRShtdHhSZXN1bHQsIG51bGwsIF9ub2RlLm10eFdvcmxkSW52ZXJzZSk7XHJcblxyXG4gICAgICB0aGlzLm10eExvY2FsID0gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGVkIGJhc2UgKFNFTEYsIFBBUkVOVCwgV09STEQpIG9yIGEgcGFydGljdWxhciBvdGhlciBub2RlIChOT0RFKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCwgX2Jhc2U6IEJBU0UgPSBCQVNFLlNFTEYsIF9ub2RlOiBOb2RlID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBzd2l0Y2ggKF9iYXNlKSB7XHJcbiAgICAgICAgY2FzZSBCQVNFLlNFTEY6XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCQVNFLlBBUkVOVDpcclxuICAgICAgICAgIHRoaXMubXR4TG9jYWwubXVsdGlwbHkoX210eFRyYW5zZm9ybSwgdHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJBU0UuTk9ERTpcclxuICAgICAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJBU0UuTk9ERSByZXF1aXJlcyBhIG5vZGUgZ2l2ZW4gYXMgYmFzZVwiKTtcclxuICAgICAgICBjYXNlIEJBU0UuV09STEQ6XHJcbiAgICAgICAgICB0aGlzLnJlYmFzZShfbm9kZSk7XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0sIHRydWUpO1xyXG5cclxuICAgICAgICAgIGxldCBub2RlOiBOb2RlID0gdGhpcy5ub2RlO1xyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgbGV0IG10eFRlbXA6IE1hdHJpeDR4NDtcclxuICAgICAgICAgICAgaWYgKF9iYXNlID09IEJBU0UuTk9ERSkge1xyXG4gICAgICAgICAgICAgIC8vIGZpeCBtdHhXb3JsZCBvZiBjb250YWluZXIgZm9yIHN1YnNlcXVlbnQgcmViYXNpbmcgXHJcbiAgICAgICAgICAgICAgbXR4VGVtcCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9ub2RlLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IE5vZGUgPSBub2RlLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgLy8gZml4IG10eExvY2FsIGZvciBjdXJyZW50IHBhcmVudFxyXG4gICAgICAgICAgICAgIHRoaXMucmViYXNlKG5vZGUuZ2V0UGFyZW50KCkpO1xyXG4gICAgICAgICAgICAgIG10eFRlbXAgPSBNYXRyaXg0eDQuUFJPRFVDVChub2RlLmdldFBhcmVudCgpLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGxvY2FsOiB0aGlzLm10eExvY2FsLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4TG9jYWwuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubG9jYWwpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2NhbC5tdXRhdGUoX211dGF0b3IpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7IFxyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLmxvY2FsLmdldE11dGF0b3IoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgIC8vICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHRoaXMubG9jYWwuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgIC8vICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLndvcmxkO1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgVlIgQ29udHJvbGxlciBhbmQgaXRzIGNhcGFiaWxpdGllcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVlJDb250cm9sbGVyIHtcclxuICAgIHB1YmxpYyBjbXBUcmFuc2Zvcm06IENvbXBvbmVudFRyYW5zZm9ybSA9IG51bGw7XHJcbiAgICBwdWJsaWMgZ2FtZVBhZDogR2FtZXBhZCA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1g6IG51bWJlciA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1k6IG51bWJlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWUiBDb21wb25lbnQgQ2xhc3MsIGZvciBTZXNzaW9uIE1hbmFnZW1lbnQsIENvbnRyb2xsZXIgTWFuYWdlbWVudCBhbmQgUmVmZXJlbmNlIFNwYWNlIE1hbmFnZW1lbnQuIFxyXG4gICAqIEBhdXRob3IgVmFsZW50aW4gU2NobWlkYmVyZ2VyLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VlJEZXZpY2UgZXh0ZW5kcyBDb21wb25lbnRDYW1lcmEge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFZSRGV2aWNlKTtcclxuICAgIHB1YmxpYyByaWdodENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcbiAgICBwdWJsaWMgbGVmdENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcblxyXG4gICAgI210eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5nZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYWN0dWFsIG1hdHJpeCBvZiB0aGUgdnIgLSBkZXZpY2UuXHJcbiAgICAgKiBDcmVhdG9ycyBzaG91bGQgdXNlIHRoaXMgZm9yIHJlYWRvbmx5IHB1cnBvc2VzLiAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbXR4TG9jYWwoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIFZlY3RvcjMgYXMgUG9zaXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGlvbihfdHJhbnNsYXRpb246IFZlY3RvcjMpIHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gX3RyYW5zbGF0aW9uLmNsb25lO1xyXG4gICAgICB0cmFuc2xhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbik7XHJcbiAgICAgIHRyYW5zbGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0odHJhbnNsYXRpb24pKTtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24gPSBfdHJhbnNsYXRpb247XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgVmVjdG9yMyBSb3RhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICBsZXQgcm90YXRpb246IFZlY3RvcjMgPSBfcm90YXRpb24uY2xvbmU7IFxyXG4gICAgICByb3RhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC5yb3RhdGlvbik7XHJcbiAgICAgIHJvdGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBsZXQgb3JpZW50YXRpb246IFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG4gICAgICBvcmllbnRhdGlvbi5ldWxlckFuZ2xlcyA9IHJvdGF0aW9uO1xyXG4gICAgICAvLyBSb3RhdGlvbiBuZWVkcyB0byBiZSBzZXQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0aW9uID0gX3JvdGF0aW9uO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVmVjdG9yMyBpbiBQb3NpdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBfYnkuY2xvbmU7XHJcbiAgICAgIHRyYW5zbGF0aW9uLnRyYW5zZm9ybSh0aGlzLiNtdHhMb2NhbC5xdWF0ZXJuaW9uKTtcclxuICAgICAgdHJhbnNsYXRpb24ubmVnYXRlKCk7XHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybSh0cmFuc2xhdGlvbikpO1xyXG4gICAgICB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGUoX2J5KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFZlY3RvcjMgaW4gUm90YXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZShfYnk6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHJvdGF0aW9uOiBWZWN0b3IzID0gX2J5LmNsb25lLm5lZ2F0ZSgpOyBcclxuICAgICAgbGV0IG9yaWVudGF0aW9uOiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgICAgb3JpZW50YXRpb24uZXVsZXJBbmdsZXMgPSByb3RhdGlvbjtcclxuICAgICAgLy8gUm90YXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0ZShfYnkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0oKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI210eExvY2FsID0gdGhpcy5ub2RlLm10eExvY2FsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX0NPTlRST0wge1xyXG4gICAgSU5QVVQgPSBcImlucHV0XCIsXHJcbiAgICBPVVRQVVQgPSBcIm91dHB1dFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgY29uc3QgZW51bSBDT05UUk9MX1RZUEUge1xyXG4gICAgLyoqIFRoZSBvdXRwdXQgc2ltcGx5IGZvbGxvd3MgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgUFJPUE9SVElPTkFMLFxyXG4gICAgLyoqIFRoZSBvdXRwdXQgdmFsdWUgY2hhbmdlcyBvdmVyIHRpbWUgd2l0aCBhIHJhdGUgZ2l2ZW4gYnkgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgSU5URUdSQUwsXHJcbiAgICAvKiogVGhlIG91dHB1dCB2YWx1ZSByZWFjdHMgdG8gY2hhbmdlcyBvZiB0aGUgc2NhbGVkIGlucHV0IGFuZCBkcm9wcyB0byAwIHdpdGggZ2l2ZW4gZGVsYXksIGlmIGlucHV0IHJlbWFpbnMgY29uc3RhbnQgKi9cclxuICAgIERJRkZFUkVOVElBTFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2Vzc2VzIGlucHV0IHNpZ25hbHMgb2YgdHlwZSBudW1iZXIgYW5kIGdlbmVyYXRlcyBhbiBvdXRwdXQgc2lnbmFsIG9mIHRoZSBzYW1lIHR5cGUgdXNpbmcgXHJcbiAgICogcHJvcG9ydGlvbmFsLCBpbnRlZ3JhbCBvciBkaWZmZXJlbnRpYWwgbWFwcGluZywgYW4gYW1wbGlmaWNhdGlvbiBmYWN0b3IgYW5kIGEgbGluZWFyIGRhbXBlbmluZy9kZWxheVxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAg4pSCICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgcGFzcyB0aHJvdWdoIChQcm9wb3J0aW9uYWwpICAgICAg4pSCXHJcbiAgICogSW5wdXQg4oaSIOKUgiDihpIg4pSCYW1wbGlmeeKUgiDihpIg4pSCZGVsYXnilIIg4oaSIOKanyBzdW0gdXAgb3ZlciB0aW1lIChJbnRlZ3JhbCkg4pqeIOKGkiDilIIg4oaSIE91dHB1dFxyXG4gICAqICAgICAgICAg4pSCICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgcGFzcyBjaGFuZ2UgIChEaWZmZXJlbnRpYWwpICAgICAg4pSCXHJcbiAgICogICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbnRyb2wgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQ09OVFJPTF9UWVBFO1xyXG4gICAgcHVibGljIGFjdGl2ZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJhdGVEaXNwYXRjaE91dHB1dDogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB2YWx1ZVByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dEJhc2U6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0VGFyZ2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFRhcmdldFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGZhY3RvcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdGltZTogVGltZSA9IFRpbWUuZ2FtZTtcclxuICAgIHByb3RlY3RlZCB0aW1lVmFsdWVEZWxheTogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB0aW1lT3V0cHV0VGFyZ2V0U2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGlkVGltZXI6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZywgX2ZhY3RvcjogbnVtYmVyID0gMSwgX3R5cGU6IENPTlRST0xfVFlQRSA9IENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUwsIF9kZWxheTogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmZhY3RvciA9IF9mYWN0b3I7XHJcbiAgICAgIHRoaXMudHlwZSA9IF90eXBlO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLnNldERlbGF5KF9kZWxheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRpbWUtb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IGluIHtAbGluayBDT05UUk9MX1RZUEUuSU5URUdSQUx9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUaW1lYmFzZShfdGltZTogVGltZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRpbWUgPSBfdGltZTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZlZWQgYW4gaW5wdXQgdmFsdWUgaW50byB0aGlzIGNvbnRyb2wgYW5kIGZpcmUgdGhlIGV2ZW50cyB7QGxpbmsgRVZFTlRfQ09OVFJPTC5JTlBVVH0gYW5kIHtAbGluayBFVkVOVF9DT05UUk9MLk9VVFBVVH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldElucHV0KF9pbnB1dDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5vdXRwdXRCYXNlID0gdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuICAgICAgdGhpcy5vdXRwdXRUYXJnZXQgPSB0aGlzLmZhY3RvciAqIF9pbnB1dDtcclxuICAgICAgdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0ID0gdGhpcy50aW1lLmdldCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudHlwZSA9PSBDT05UUk9MX1RZUEUuRElGRkVSRU5USUFMKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5vdXRwdXRUYXJnZXQgLSB0aGlzLm91dHB1dFRhcmdldFByZXZpb3VzO1xyXG4gICAgICAgIHRoaXMub3V0cHV0VGFyZ2V0UHJldmlvdXMgPSB0aGlzLm91dHB1dFRhcmdldDtcclxuICAgICAgICB0aGlzLm91dHB1dFRhcmdldCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlRfQ09OVFJPTC5JTlBVVCkpO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09IENPTlRST0xfVFlQRS5ESUZGRVJFTlRJQUwpXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dCh0aGlzLnZhbHVlUHJldmlvdXMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE86IGRlc2NyaWJlIVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHVsc2UoX2lucHV0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXRJbnB1dChfaW5wdXQpO1xyXG4gICAgICB0aGlzLnNldElucHV0KDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0aW1lIHRvIHRha2UgZm9yIHRoZSBpbnRlcm5hbCBsaW5lYXIgZGFtcGVuaW5nIHVudGlsIHRoZSBmaW5hbCBvdXB1dCB2YWx1ZSBpcyByZWFjaGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXREZWxheShfdGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGltZVZhbHVlRGVsYXkgPSBNYXRoLm1heCgwLCBfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBvdXRwdXQtZXZlbnRzIHRvIGRpc3BhdGNoIHBlciBzZWNvbmQuIFxyXG4gICAgICogQXQgdGhlIGRlZmF1bHQgb2YgMCwgdGhlIGNvbnRyb2wgb3V0cHV0IG11c3QgYmUgcG9sbGVkIGFuZCB3aWxsIG9ubHkgYWN0aXZlbHkgZGlzcGF0Y2hlZCBvbmNlIGVhY2ggdGltZSBpbnB1dCBvY2N1cnMgYW5kIHRoZSBvdXRwdXQgY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFJhdGVEaXNwYXRjaE91dHB1dChfcmF0ZURpc3BhdGNoT3V0cHV0OiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0ID0gX3JhdGVEaXNwYXRjaE91dHB1dDtcclxuICAgICAgdGhpcy50aW1lLmRlbGV0ZVRpbWVyKHRoaXMuaWRUaW1lcik7XHJcbiAgICAgIHRoaXMuaWRUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0KVxyXG4gICAgICAgIHRoaXMuaWRUaW1lciA9IHRoaXMudGltZS5zZXRUaW1lcigxMDAwIC8gdGhpcy5yYXRlRGlzcGF0Y2hPdXRwdXQsIDAsIHRoaXMuZGlzcGF0Y2hPdXRwdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmYWN0b3IgdG8gbXVsdGlwbHkgdGhlIGlucHV0IHZhbHVlIGdpdmVuIHdpdGgge0BsaW5rIHNldElucHV0fSB3aXRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRGYWN0b3IoX2ZhY3RvcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZmFjdG9yID0gX2ZhY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlT3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBvdXRwdXQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBDT05UUk9MX1RZUEUuSU5URUdSQUw6XHJcbiAgICAgICAgICBsZXQgdGltZUN1cnJlbnQ6IG51bWJlciA9IHRoaXMudGltZS5nZXQoKTtcclxuICAgICAgICAgIGxldCB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ6IG51bWJlciA9IHRpbWVDdXJyZW50IC0gdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0O1xyXG4gICAgICAgICAgb3V0cHV0ID0gdGhpcy5vdXRwdXRCYXNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVWYWx1ZURlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTaW5jZUlucHV0IDwgdGhpcy50aW1lVmFsdWVEZWxheSkge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgICB0aW1lRWxhcHNlZFNpbmNlSW5wdXQgLT0gdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb3V0cHV0ICs9IHZhbHVlICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgLy8gdmFsdWUgKz0gMC41ICogKHRoaXMuaW5wdXRQcmV2aW91cyAtIGlucHV0KSAqIHRoaXMudGltZUlucHV0RGVsYXkgKyBpbnB1dCAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09OVFJPTF9UWVBFLkRJRkZFUkVOVElBTDpcclxuICAgICAgICBjYXNlIENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUw6XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG91dHB1dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FsY3VsYXRlcyB0aGUgb3V0cHV0IGNvbnNpZGVyaW5nIHRoZSB0aW1lIG9mIHRoZSBkZWxheVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbHVlRGVsYXllZCgpOiBudW1iZXIge1xyXG4gICAgICBpZiAodGhpcy50aW1lVmFsdWVEZWxheSA+IDApIHtcclxuICAgICAgICBsZXQgdGltZUVsYXBzZWRTaW5jZUlucHV0OiBudW1iZXIgPSB0aGlzLnRpbWUuZ2V0KCkgLSB0aGlzLnRpbWVPdXRwdXRUYXJnZXRTZXQ7XHJcbiAgICAgICAgaWYgKHRpbWVFbGFwc2VkU2luY2VJbnB1dCA8IHRoaXMudGltZVZhbHVlRGVsYXkpXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVByZXZpb3VzICsgKHRoaXMub3V0cHV0VGFyZ2V0IC0gdGhpcy52YWx1ZVByZXZpb3VzKSAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dCAvIHRoaXMudGltZVZhbHVlRGVsYXk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzcGF0Y2hPdXRwdXQgPSAoX2V2ZW50T3JWYWx1ZTogRXZlbnRUaW1lciB8IG51bWJlcik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCB0aW1lcjogVGltZXIgPSB0aGlzLnRpbWUuZ2V0VGltZXIodGhpcy5pZFRpbWVyKTtcclxuICAgICAgbGV0IG91dHB1dDogbnVtYmVyO1xyXG4gICAgICBpZiAodHlwZW9mIChfZXZlbnRPclZhbHVlKSA9PSBcIm51bWJlclwiKVxyXG4gICAgICAgIG91dHB1dCA9IF9ldmVudE9yVmFsdWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgICBsZXQgb3V0cHV0Q2hhbmdlZDogYm9vbGVhbiA9IChvdXRwdXQgIT0gdGhpcy5vdXRwdXRQcmV2aW91cyk7XHJcblxyXG4gICAgICBpZiAodGltZXIpIHtcclxuICAgICAgICB0aW1lci5hY3RpdmUgPSBvdXRwdXRDaGFuZ2VkO1xyXG4gICAgICAgIGlmICghb3V0cHV0Q2hhbmdlZClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vdXRwdXRQcmV2aW91cyA9IG91dHB1dDtcclxuXHJcbiAgICAgIGxldCBldmVudDogQ3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRVZFTlRfQ09OVFJPTC5PVVRQVVQsIHtcclxuICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgIG91dHB1dDogb3V0cHV0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIkNvbnRyb2wudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgbXVsdGlwbGUgY29udHJvbHMgYXMgaW5wdXRzIGFuZCBjcmVhdGVzIGFuIG91dHB1dCBmcm9tIHRoYXQuXHJcbiAgICogQXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ29udHJvbH0sIGF4aXMgY2FsY3VsYXRlcyB0aGUgb3VwdXQgc3VtbWluZyB1cCB0aGUgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSByZXN1bHQgdXNpbmcgaXRzIG93biBzZXR0aW5ncy4gIFxyXG4gICAqIERpc3BhdGNoZXMge0BsaW5rIEVWRU5UX0NPTlRST0wuT1VUUFVUfSBhbmQge0BsaW5rIEVWRU5UX0NPTlRST0wuSU5QVVR9IHdoZW4gb25lIG9mIHRoZSBjb250cm9scyBkaXNwYXRjaGVzIHRoZW0uXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcclxuICAgKiAgICAgICAgICAg4pSCIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICBcXOKUjOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCLS0t4pSCc3Vt4pSCIOKGkiDilIJpbnRlcm5hbCBjb250cm9sIOKUgiDihpIg4pSCIOKGkiBPdXRwdXRcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgL+KUlOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICBJbnB1dCDihpIg4pSCIOKUgmNvbnRyb2zilIIvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggIFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBeGlzIGV4dGVuZHMgQ29udHJvbCB7XHJcbiAgICBwcml2YXRlIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBDb250cm9sPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgc3VtUHJldmlvdXM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgdGhlIGNvbnRyb2wgZ2l2ZW4gdG8gdGhlIGxpc3Qgb2YgY29udHJvbHMgZmVlZGluZyBpbnRvIHRoaXMgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQ29udHJvbChfY29udHJvbDogQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNvbnRyb2xzLnNldChfY29udHJvbC5uYW1lLCBfY29udHJvbCk7XHJcbiAgICAgIF9jb250cm9sLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQ09OVFJPTC5JTlBVVCwgdGhpcy5obmRJbnB1dEV2ZW50KTtcclxuICAgICAgX2NvbnRyb2wuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbnRyb2woX25hbWU6IHN0cmluZyk6IENvbnRyb2wge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb250cm9scy5nZXQoX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDb250cm9sKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgbGV0IGNvbnRyb2w6IENvbnRyb2wgPSB0aGlzLmdldENvbnRyb2woX25hbWUpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLklOUFVULCB0aGlzLmhuZElucHV0RXZlbnQpO1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9scy5kZWxldGUoX25hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF4aXMgYWZ0ZXIgc3VtbWluZyB1cCBhbGwgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSBzdW0gYWNjb3JkaW5nIHRvIHRoZSBheGlzJyBzZXR0aW5nc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzdW1JbnB1dDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xzKSB7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sWzFdLmFjdGl2ZSlcclxuICAgICAgICAgIHN1bUlucHV0ICs9IGNvbnRyb2xbMV0uZ2V0T3V0cHV0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdW1JbnB1dCAhPSB0aGlzLnN1bVByZXZpb3VzKVxyXG4gICAgICAgIHN1cGVyLnNldElucHV0KHN1bUlucHV0KTtcclxuXHJcbiAgICAgIHRoaXMuc3VtUHJldmlvdXMgPSBzdW1JbnB1dDtcclxuXHJcbiAgICAgIHJldHVybiBzdXBlci5nZXRPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZE91dHB1dEV2ZW50OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgY29udHJvbDogQ29udHJvbCA9ICg8Q29udHJvbD5fZXZlbnQudGFyZ2V0KTtcclxuICAgICAgbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVF9DT05UUk9MLk9VVFBVVCwge1xyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgY29udHJvbDogY29udHJvbCxcclxuICAgICAgICAgIGlucHV0OiAoPEN1c3RvbUV2ZW50Pl9ldmVudCkuZGV0YWlsLm91dHB1dCxcclxuICAgICAgICAgIG91dHB1dDogdGhpcy5nZXRPdXRwdXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaG5kSW5wdXRFdmVudDogRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGV2ZW50OiBFdmVudCA9IG5ldyBFdmVudChFVkVOVF9DT05UUk9MLklOUFVULCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBpbnRlcmZhY2UgS2V5UHJlc3NlZCB7XHJcbiAgICBbY29kZTogc3RyaW5nXTogYm9vbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxlY3RzIHRoZSBrZXlzIHByZXNzZWQgb24gdGhlIGtleWJvYXJkIGFuZCBzdG9yZXMgdGhlaXIgc3RhdHVzLiBcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5Ym9hcmQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMga2V5c1ByZXNzZWQ6IEtleVByZXNzZWQgPSBLZXlib2FyZC5pbml0aWFsaXplKCk7XHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBjb2RlX2VuOiBPYmplY3Q7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBnaXZlbiBrZXlzIGlzIGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZE9uZShfa2V5czogS0VZQk9BUkRfQ09ERVtdKTogYm9vbGVhbiB7XHJcbiAgICAgIGZvciAobGV0IGNvZGUgb2YgX2tleXMpIHtcclxuICAgICAgICBpZiAoS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZENvbWJvKF9rZXlzOiBLRVlCT0FSRF9DT0RFW10pOiBib29sZWFuIHtcclxuICAgICAgZm9yIChsZXQgY29kZSBvZiBfa2V5cykge1xyXG4gICAgICAgIGlmICghS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBnaXZlbiBhcyBfYWN0aXZlIGlmIG9uZSBvciwgd2hlbiBfY29tYm8gaXMgdHJ1ZSwgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBwcmVzc2VkLlxyXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZ2l2ZW4gYXMgX2luYWN0aXZlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1ZhbHVlPFQ+KF9hY3RpdmU6IFQsIF9pbmFjdGl2ZTogVCwgX2tleXM6IEtFWUJPQVJEX0NPREVbXSwgX2NvbWJvOiBib29sZWFuID0gZmFsc2UpOiBUIHtcclxuICAgICAgaWYgKCFfY29tYm8gJiYgS2V5Ym9hcmQuaXNQcmVzc2VkT25lKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgaWYgKEtleWJvYXJkLmlzUHJlc3NlZENvbWJvKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgcmV0dXJuIF9pbmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBiYWxhbmNlZCB0ZXJuYXJ5IHZhbHVlIChlaXRoZXIgLTEsIDAgb3IgMSkgXHJcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG1hdGNoIG9mIHRoZSBrZXlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGFuZCB0aGUgbGlzdHMgb2Yga2V5cyBnaXZlbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1RyaXQoX3Bvc2l0aXZlOiBLRVlCT0FSRF9DT0RFW10sIF9uZWdhdGl2ZTogS0VZQk9BUkRfQ09ERVtdKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIEtleWJvYXJkLm1hcFRvVmFsdWUoLTEsIDAsIF9uZWdhdGl2ZSkgKyBLZXlib2FyZC5tYXBUb1ZhbHVlKDEsIDAsIF9wb3NpdGl2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBsb2NhbGUoX2tleWJvYXJkOiBPYmplY3QpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFLZXlib2FyZC5jb2RlX2VuKSB7XHJcbiAgICAvLyAgICAgLy8gc2F2ZSBvcmlnaW5hbCBrZXlib2FyZCBjb2RlcyB0byBiZSBhYmxlIHRvIHN3aXRjaCBiYWNrIGxhdGVyXHJcbiAgICAvLyAgICAgS2V5Ym9hcmQuY29kZV9lbiA9IHt9O1xyXG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oS2V5Ym9hcmQuY29kZV9lbiwgS0VZQk9BUkRfQ09ERSk7XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGZvciAobGV0IGtleSBpbiBfa2V5Ym9hcmQpIHtcclxuICAgIC8vICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IFJlZmxlY3QuZ2V0KF9rZXlib2FyZCwga2V5KTtcclxuICAgIC8vICAgICBmb3IgKGxldCBvcmlnaW5hbCBpbiBLRVlCT0FSRF9DT0RFKVxyXG4gICAgLy8gICAgICAgaWYgKFJlZmxlY3QuZ2V0KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKSA9PSB2YWx1ZSlcclxuICAgIC8vICAgICAgICAgLy8gcmVtb3ZlIG9yaWdpbmFsIGtleSB0aGUgeWllbGRzIHRoZSB2YWx1ZVxyXG4gICAgLy8gICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKTtcclxuICAgIC8vICAgICAvLyBhZGQgbmV3IGtleSB0byB5aWVsZCB0aGF0IHZhbHVlXHJcbiAgICAvLyAgICAgUmVmbGVjdC5zZXQoS0VZQk9BUkRfQ09ERSwga2V5LCB2YWx1ZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbml0aWFsaXplKCk6IEtleVByZXNzZWQge1xyXG4gICAgICBsZXQgc3RvcmU6IEtleVByZXNzZWQgPSB7fTtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICByZXR1cm4gc3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaG5kS2V5SW50ZXJhY3Rpb24oX2V2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIEtleWJvYXJkLmtleXNQcmVzc2VkW19ldmVudC5jb2RlXSA9IChfZXZlbnQudHlwZSA9PSBcImtleWRvd25cIik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGluZyB0byB0aGUgYWxlcnQgYm94XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnQWxlcnQgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuSU5GT10pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkxPR106IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5MT0ddKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLldBUk5dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5FUlJPUl0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkZVREdFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuU09VUkNFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLlNPVVJDRV0pXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYXJnczogc3RyaW5nW10gPSBfYXJncy5tYXAoX2FyZyA9PiBfYXJnLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGxldCBvdXQ6IHN0cmluZyA9IF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIGFyZ3MpO1xyXG4gICAgICAgIGFsZXJ0KG91dCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIGEgSFRNTERpYWxvZ0VsZW1lbnRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWdEaWFsb2cgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICAvLyBUT0RPOiBjaGVja291dCBIVE1MRGlhbG9nRWxlbWVudDsgISEhXHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGUgdG8gYW4gSFRNTFRleHRBcmVhLCBtYXkgYmUgb2Jzb2xldGUgd2hlbiB1c2luZyBIVE1MRGlhbG9nRWxlbWVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z1RleHRBcmVhIGV4dGVuZHMgRGVidWdUYXJnZXQge1xyXG4gICAgcHVibGljIHN0YXRpYyB0ZXh0QXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYXV0b1Njcm9sbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWxlZ2F0ZXM6IE1hcERlYnVnRmlsdGVyVG9EZWxlZ2F0ZSA9IHtcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5JTkZPXTogRGVidWdUZXh0QXJlYS5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLklORk9dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuTE9HXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuV0FSTl06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5XQVJOXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuRVJST1JdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuRVJST1JdKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5GVURHRV0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkNMRUFSXTogRGVidWdUZXh0QXJlYS5jbGVhcixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUF06IERlYnVnVGV4dEFyZWEuZ3JvdXAsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRURdOiBEZWJ1Z1RleHRBcmVhLmdyb3VwLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQRU5EXTogRGVidWdUZXh0QXJlYS5ncm91cEVuZCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgIH07XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncm91cHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIHRleHQgYXJlYSBhbmQgdGhlIGdyb3Vwc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnRleHRDb250ZW50ID0gXCJcIjtcclxuICAgICAgRGVidWdUZXh0QXJlYS5ncm91cHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJlZ2lucyBhIG5ldyBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXAoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KFwi4pa8IFwiICsgX25hbWUpO1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wdXNoKF9uYW1lKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5kcyB0aGUgbGFzdCBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwRW5kKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIF9hcmdzKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJbmRlbnRhdGlvbihfbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfbGV2ZWw7IGkrKylcclxuICAgICAgICByZXN1bHQgKz0gXCJ8IFwiO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHByaW50KF90ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS50ZXh0Q29udGVudCArPSBEZWJ1Z1RleHRBcmVhLmdldEluZGVudGF0aW9uKERlYnVnVGV4dEFyZWEuZ3JvdXBzLmxlbmd0aCkgKyBfdGV4dCArIFwiXFxuXCI7XHJcbiAgICAgIGlmIChEZWJ1Z1RleHRBcmVhLmF1dG9TY3JvbGwpXHJcbiAgICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS5zY3JvbGxUb3AgPSBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnNjcm9sbEhlaWdodDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgY29kZXMgc2VudCBmcm9tIGEgc3RhbmRhcmQgZW5nbGlzaCBrZXlib2FyZCBsYXlvdXRcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFIHtcclxuICAgIEEgPSBcIktleUFcIixcclxuICAgIEIgPSBcIktleUJcIixcclxuICAgIEMgPSBcIktleUNcIixcclxuICAgIEQgPSBcIktleURcIixcclxuICAgIEUgPSBcIktleUVcIixcclxuICAgIEYgPSBcIktleUZcIixcclxuICAgIEcgPSBcIktleUdcIixcclxuICAgIEggPSBcIktleUhcIixcclxuICAgIEkgPSBcIktleUlcIixcclxuICAgIEogPSBcIktleUpcIixcclxuICAgIEsgPSBcIktleUtcIixcclxuICAgIEwgPSBcIktleUxcIixcclxuICAgIE0gPSBcIktleU1cIixcclxuICAgIE4gPSBcIktleU5cIixcclxuICAgIE8gPSBcIktleU9cIixcclxuICAgIFAgPSBcIktleVBcIixcclxuICAgIFEgPSBcIktleVFcIixcclxuICAgIFIgPSBcIktleVJcIixcclxuICAgIFMgPSBcIktleVNcIixcclxuICAgIFQgPSBcIktleVRcIixcclxuICAgIFUgPSBcIktleVVcIixcclxuICAgIFYgPSBcIktleVZcIixcclxuICAgIFcgPSBcIktleVdcIixcclxuICAgIFggPSBcIktleVhcIixcclxuICAgIFkgPSBcIktleVlcIixcclxuICAgIFogPSBcIktleVpcIixcclxuICAgIEVTQyA9IFwiRXNjYXBlXCIsXHJcbiAgICBaRVJPID0gXCJEaWdpdDBcIixcclxuICAgIE9ORSA9IFwiRGlnaXQxXCIsXHJcbiAgICBUV08gPSBcIkRpZ2l0MlwiLFxyXG4gICAgVEhSRUUgPSBcIkRpZ2l0M1wiLFxyXG4gICAgRk9VUiA9IFwiRGlnaXQ0XCIsXHJcbiAgICBGSVZFID0gXCJEaWdpdDVcIixcclxuICAgIFNJWCA9IFwiRGlnaXQ2XCIsXHJcbiAgICBTRVZFTiA9IFwiRGlnaXQ3XCIsXHJcbiAgICBFSUdIVCA9IFwiRGlnaXQ4XCIsXHJcbiAgICBOSU5FID0gXCJEaWdpdDlcIixcclxuICAgIE1JTlVTID0gXCJNaW51c1wiLFxyXG4gICAgRVFVQUwgPSBcIkVxdWFsXCIsXHJcbiAgICBCQUNLU1BBQ0UgPSBcIkJhY2tzcGFjZVwiLFxyXG4gICAgVEFCVUxBVE9SID0gXCJUYWJcIixcclxuICAgIEJSQUNLRVRfTEVGVCA9IFwiQnJhY2tldExlZnRcIixcclxuICAgIEJSQUNLRVRfUklHSFQgPSBcIkJyYWNrZXRSaWdodFwiLFxyXG4gICAgRU5URVIgPSBcIkVudGVyXCIsXHJcbiAgICBDVFJMX0xFRlQgPSBcIkNvbnRyb2xMZWZ0XCIsXHJcbiAgICBTRU1JQ09MT04gPSBcIlNlbWljb2xvblwiLFxyXG4gICAgUVVPVEUgPSBcIlF1b3RlXCIsXHJcbiAgICBCQUNLX1FVT1RFID0gXCJCYWNrcXVvdGVcIixcclxuICAgIFNISUZUX0xFRlQgPSBcIlNoaWZ0TGVmdFwiLFxyXG4gICAgQkFDS1NMQVNIID0gXCJCYWNrc2xhc2hcIixcclxuICAgIENPTU1BID0gXCJDb21tYVwiLFxyXG4gICAgUEVSSU9EID0gXCJQZXJpb2RcIixcclxuICAgIFNMQVNIID0gXCJTbGFzaFwiLFxyXG4gICAgU0hJRlRfUklHSFQgPSBcIlNoaWZ0UmlnaHRcIixcclxuICAgIE5VTVBBRF9NVUxUSVBMWSA9IFwiTnVtcGFkTXVsdGlwbHlcIixcclxuICAgIEFMVF9MRUZUID0gXCJBbHRMZWZ0XCIsXHJcbiAgICBTUEFDRSA9IFwiU3BhY2VcIixcclxuICAgIENBUFNfTE9DSyA9IFwiQ2Fwc0xvY2tcIixcclxuICAgIEYxID0gXCJGMVwiLFxyXG4gICAgRjIgPSBcIkYyXCIsXHJcbiAgICBGMyA9IFwiRjNcIixcclxuICAgIEY0ID0gXCJGNFwiLFxyXG4gICAgRjUgPSBcIkY1XCIsXHJcbiAgICBGNiA9IFwiRjZcIixcclxuICAgIEY3ID0gXCJGN1wiLFxyXG4gICAgRjggPSBcIkY4XCIsXHJcbiAgICBGOSA9IFwiRjlcIixcclxuICAgIEYxMCA9IFwiRjEwXCIsXHJcbiAgICBQQVVTRSA9IFwiUGF1c2VcIixcclxuICAgIFNDUk9MTF9MT0NLID0gXCJTY3JvbGxMb2NrXCIsXHJcbiAgICBOVU1QQUQ3ID0gXCJOdW1wYWQ3XCIsXHJcbiAgICBOVU1QQUQ4ID0gXCJOdW1wYWQ4XCIsXHJcbiAgICBOVU1QQUQ5ID0gXCJOdW1wYWQ5XCIsXHJcbiAgICBOVU1QQURfU1VCVFJBQ1QgPSBcIk51bXBhZFN1YnRyYWN0XCIsXHJcbiAgICBOVU1QQUQ0ID0gXCJOdW1wYWQ0XCIsXHJcbiAgICBOVU1QQUQ1ID0gXCJOdW1wYWQ1XCIsXHJcbiAgICBOVU1QQUQ2ID0gXCJOdW1wYWQ2XCIsXHJcbiAgICBOVU1QQURfQUREID0gXCJOdW1wYWRBZGRcIixcclxuICAgIE5VTVBBRDEgPSBcIk51bXBhZDFcIixcclxuICAgIE5VTVBBRDIgPSBcIk51bXBhZDJcIixcclxuICAgIE5VTVBBRDMgPSBcIk51bXBhZDNcIixcclxuICAgIE5VTVBBRDAgPSBcIk51bXBhZDBcIixcclxuICAgIE5VTVBBRF9ERUNJTUFMID0gXCJOdW1wYWREZWNpbWFsXCIsXHJcbiAgICBQUklOVF9TQ1JFRU4gPSBcIlByaW50U2NyZWVuXCIsXHJcbiAgICBJTlRMX0JBQ0tfU0xBU0ggPSBcIkludGxCYWNrU2xhc2hcIixcclxuICAgIEYxMSA9IFwiRjExXCIsXHJcbiAgICBGMTIgPSBcIkYxMlwiLFxyXG4gICAgTlVNUEFEX0VRVUFMID0gXCJOdW1wYWRFcXVhbFwiLFxyXG4gICAgRjEzID0gXCJGMTNcIixcclxuICAgIEYxNCA9IFwiRjE0XCIsXHJcbiAgICBGMTUgPSBcIkYxNVwiLFxyXG4gICAgRjE2ID0gXCJGMTZcIixcclxuICAgIEYxNyA9IFwiRjE3XCIsXHJcbiAgICBGMTggPSBcIkYxOFwiLFxyXG4gICAgRjE5ID0gXCJGMTlcIixcclxuICAgIEYyMCA9IFwiRjIwXCIsXHJcbiAgICBGMjEgPSBcIkYyMVwiLFxyXG4gICAgRjIyID0gXCJGMjJcIixcclxuICAgIEYyMyA9IFwiRjIzXCIsXHJcbiAgICBGMjQgPSBcIkYyNFwiLFxyXG4gICAgS0FOQV9NT0RFID0gXCJLYW5hTW9kZVwiLFxyXG4gICAgTEFORzIgPSBcIkxhbmcyXCIsXHJcbiAgICBMQU5HMSA9IFwiTGFuZzFcIixcclxuICAgIElOVExfUk8gPSBcIkludGxSb1wiLFxyXG4gICAgQ09OVkVSVCA9IFwiQ29udmVydFwiLFxyXG4gICAgTk9OX0NPTlZFUlQgPSBcIk5vbkNvbnZlcnRcIixcclxuICAgIElOVExfWUVOID0gXCJJbnRsWWVuXCIsXHJcbiAgICBOVU1QQURfQ09NTUEgPSBcIk51bXBhZENvbW1hXCIsXHJcbiAgICBVTkRPID0gXCJVbmRvXCIsXHJcbiAgICBQQVNURSA9IFwiUGFzdGVcIixcclxuICAgIE1FRElBX1RSQUNLX1BSRVZJT1VTID0gXCJNZWRpYVRyYWNrUHJldmlvdXNcIixcclxuICAgIENVVCA9IFwiQ3V0XCIsXHJcbiAgICBDT1BZID0gXCJDb3B5XCIsXHJcbiAgICBNRURJQV9UUkFDS19ORVhUID0gXCJNZWRpYVRyYWNrTmV4dFwiLFxyXG4gICAgTlVNUEFEX0VOVEVSID0gXCJOdW1wYWRFbnRlclwiLFxyXG4gICAgQ1RSTF9SSUdIVCA9IFwiQ29udHJvbFJpZ2h0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfTVVURSA9IFwiQXVkaW9Wb2x1bWVNdXRlXCIsXHJcbiAgICBMQVVOQ0hfQVBQMiA9IFwiTGF1bmNoQXBwMlwiLFxyXG4gICAgTUVESUFfUExBWV9QQVVTRSA9IFwiTWVkaWFQbGF5UGF1c2VcIixcclxuICAgIE1FRElBX1NUT1AgPSBcIk1lZGlhU3RvcFwiLFxyXG4gICAgRUpFQ1QgPSBcIkVqZWN0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfRE9XTiA9IFwiQXVkaW9Wb2x1bWVEb3duXCIsXHJcbiAgICBWT0xVTUVfRE9XTiA9IFwiVm9sdW1lRG93blwiLFxyXG4gICAgQVVESU9fVk9MVU1FX1VQID0gXCJBdWRpb1ZvbHVtZVVwXCIsXHJcbiAgICBWT0xVTUVfVVAgPSBcIlZvbHVtZVVwXCIsXHJcbiAgICBCUk9XU0VSX0hPTUUgPSBcIkJyb3dzZXJIb21lXCIsXHJcbiAgICBOVU1QQURfRElWSURFID0gXCJOdW1wYWREaXZpZGVcIixcclxuICAgIEFMVF9SSUdIVCA9IFwiQWx0UmlnaHRcIixcclxuICAgIEhFTFAgPSBcIkhlbHBcIixcclxuICAgIE5VTV9MT0NLID0gXCJOdW1Mb2NrXCIsXHJcbiAgICBIT01FID0gXCJIb21lXCIsXHJcbiAgICBBUlJPV19VUCA9IFwiQXJyb3dVcFwiLFxyXG4gICAgQVJST1dfUklHSFQgPSBcIkFycm93UmlnaHRcIixcclxuICAgIEFSUk9XX0RPV04gPSBcIkFycm93RG93blwiLFxyXG4gICAgQVJST1dfTEVGVCA9IFwiQXJyb3dMZWZ0XCIsXHJcbiAgICBFTkQgPSBcIkVuZFwiLFxyXG4gICAgUEFHRV9VUCA9IFwiUGFnZVVwXCIsXHJcbiAgICBQQUdFX0RPV04gPSBcIlBhZ2VEb3duXCIsXHJcbiAgICBJTlNFUlQgPSBcIkluc2VydFwiLFxyXG4gICAgREVMRVRFID0gXCJEZWxldGVcIixcclxuICAgIE1FVEFfTEVGVCA9IFwiTWV0YV9MZWZ0XCIsXHJcbiAgICBPU19MRUZUID0gXCJPU0xlZnRcIixcclxuICAgIE1FVEFfUklHSFQgPSBcIk1ldGFSaWdodFwiLFxyXG4gICAgT1NfUklHSFQgPSBcIk9TUmlnaHRcIixcclxuICAgIENPTlRFWFRfTUVOVSA9IFwiQ29udGV4dE1lbnVcIixcclxuICAgIFBPV0VSID0gXCJQb3dlclwiLFxyXG4gICAgQlJPV1NFUl9TRUFSQ0ggPSBcIkJyb3dzZXJTZWFyY2hcIixcclxuICAgIEJST1dTRVJfRkFWT1JJVEVTID0gXCJCcm93c2VyRmF2b3JpdGVzXCIsXHJcbiAgICBCUk9XU0VSX1JFRlJFU0ggPSBcIkJyb3dzZXJSZWZyZXNoXCIsXHJcbiAgICBCUk9XU0VSX1NUT1AgPSBcIkJyb3dzZXJTdG9wXCIsXHJcbiAgICBCUk9XU0VSX0ZPUldBUkQgPSBcIkJyb3dzZXJGb3J3YXJkXCIsXHJcbiAgICBCUk9XU0VSX0JBQ0sgPSBcIkJyb3dzZXJCYWNrXCIsXHJcbiAgICBMQVVOQ0hfQVBQMSA9IFwiTGF1bmNoQXBwMVwiLFxyXG4gICAgTEFVTkNIX01BSUwgPSBcIkxhdW5jaE1haWxcIixcclxuICAgIExBVU5DSF9NRURJQV9QTEFZRVIgPSBcIkxhdW5jaE1lZGlhUGxheWVyXCIsXHJcblxyXG4gICAgLy9tYWMgYnJpbmdzIHRoaXMgYnV0dHRvblxyXG4gICAgRk4gPSBcIkZuXCIsIC8vbm8gZXZlbnQgZmlyZWQgYWN0dWFsbHlcclxuXHJcbiAgICAvL0xpbnV4IGJyaW5ncyB0aGVzZVxyXG4gICAgQUdBSU4gPSBcIkFnYWluXCIsXHJcbiAgICBQUk9QUyA9IFwiUHJvcHNcIixcclxuICAgIFNFTEVDVCA9IFwiU2VsZWN0XCIsXHJcbiAgICBPUEVOID0gXCJPcGVuXCIsXHJcbiAgICBGSU5EID0gXCJGaW5kXCIsXHJcbiAgICBXQUtFX1VQID0gXCJXYWtlVXBcIixcclxuICAgIE5VTVBBRF9QQVJFTlRfTEVGVCA9IFwiTnVtcGFkUGFyZW50TGVmdFwiLFxyXG4gICAgTlVNUEFEX1BBUkVOVF9SSUdIVCA9IFwiTnVtcGFkUGFyZW50UmlnaHRcIixcclxuXHJcbiAgICAvL2FuZHJvaWRcclxuICAgIFNMRUVQID0gXCJTbGVlcFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFX0RFIHtcclxuICAgIFogPSBLRVlCT0FSRF9DT0RFLlksXHJcbiAgICBZID0gS0VZQk9BUkRfQ09ERS5aLFxyXG4gICAgw5YgPSBLRVlCT0FSRF9DT0RFLlNFTUlDT0xPTixcclxuICAgIMOEID0gS0VZQk9BUkRfQ09ERS5RVU9URSxcclxuICAgIMOcID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX0xFRlQsXHJcbiAgICBIQVNIID0gS0VZQk9BUkRfQ09ERS5CQUNLU0xBU0gsXHJcbiAgICBQTFVTID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX1JJR0hULFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIFxyXG4gICAgw58gPSBLRVlCT0FSRF9DT0RFLk1JTlVTLFxyXG4gICAgQUNVVEUgPSBLRVlCT0FSRF9DT0RFLkVRVUFMLFxyXG4gICAgTEVTU19USEFOID0gS0VZQk9BUkRfQ09ERS5JTlRMX0JBQ0tfU0xBU0gsXHJcbiAgICBNSU5VUyA9IEtFWUJPQVJEX0NPREUuU0xBU0hcclxuICB9XHJcblxyXG4gIC8qIFxyXG4gIEZpcmVmb3ggY2FuJ3QgbWFrZSB1c2Ugb2YgdGhvc2UgYnV0dG9ucyBhbmQgQ29tYmluYXRpb25zOlxyXG4gIFNJTkdFTEVfQlVUVE9OUzpcclxuICAgRHJ1Y2ssXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBTaGlmdCArIEYxMCwgU2hpZnQgKyBOdW1wYWQ1LFxyXG4gICBDVFJMICsgcSwgQ1RSTCArIEY0LFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEYzLCBBTFQgKyBGNywgQUxUICsgRjgsIEFMVCArIEYxMFxyXG4gIE9wZXJhIHdvbid0IGRvIGdvb2Qgd2l0aCB0aGVzZSBCdXR0b25zIGFuZCBjb21iaW5hdGlvbnM6XHJcbiAgU0lOR0xFX0JVVFRPTlM6XHJcbiAgIEZsb2F0MzJBcnJheSwgRjExLCBBTFQsXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBDVFJMICsgcSwgQ1RSTCArIHQsIENUUkwgKyBoLCBDVFJMICsgZywgQ1RSTCArIG4sIENUUkwgKyBmIFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEY0LCBBTFQgKyBGNSwgQUxUICsgRjYsIEFMVCArIEY3LCBBTFQgKyBGOCwgQUxUICsgRjEwXHJcbiAgICovXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVF9USU1FUiB7XHJcbiAgICBDQUxMID0gXCLGkmxhcHNlXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIGEgY2FsbCBmcm9tIGEge0BsaW5rIFRpbWVyfVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFRpbWVyIHtcclxuICAgIHB1YmxpYyB0eXBlOiBFVkVOVF9USU1FUiA9IEVWRU5UX1RJTUVSLkNBTEw7XHJcbiAgICBwdWJsaWMgdGFyZ2V0OiBUaW1lcjtcclxuICAgIHB1YmxpYyBhcmd1bWVudHM6IE9iamVjdFtdO1xyXG4gICAgcHVibGljIGZpcnN0Q2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgbGFzdENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZXI6IFRpbWVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSkge1xyXG4gICAgICB0aGlzLnRhcmdldCA9IF90aW1lcjtcclxuICAgICAgdGhpcy5hcmd1bWVudHMgPSBfYXJndW1lbnRzO1xyXG4gICAgICB0aGlzLmZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHRvdWNoIGV2ZW50c1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEVWRU5UX1RPVUNIIHtcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgaW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHRvdWNobW92ZSwgZGV0YWlscyBvZmZzZXQgdG8gc3RhcnRpbmcgdG91Y2ggKi9cclxuICAgIE1PVkUgPSBcInRvdWNoTW92ZVwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyAqL1xyXG4gICAgVEFQID0gXCJ0b3VjaFRhcFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmUgbW92ZWQgb3V0c2lkZSBvZiB0aGUgbm90Y2ggcmFkaXVzLCBkZXRhaWxzIG9mZnNldCBhbmQgY2FyZGluYWwgZGlyZWN0aW9uICovXHJcbiAgICBOT1RDSCA9IFwidG91Y2hOb3RjaFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyBmb3Igc29tZSB0aW1lICovXHJcbiAgICBMT05HID0gXCJ0b3VjaExvbmdcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0d28gdGFwcyB3ZXJlIGRldGVjdGVkIGluIHNob3J0IHN1Y2Nlc3Npb24gKi9cclxuICAgIERPVUJMRSA9IFwidG91Y2hEb3VibGVcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgb25seSB0d28gdG91Y2hlcyBjaGFuZ2VzIGJleW9uZCBhIHRvbGVyYW5jZSAqL1xyXG4gICAgUElOQ0ggPSBcInRvdWNoUGluY2hcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgbm90IGltcGxlbWVudGVkIHlldCAqL1xyXG4gICAgUk9UQVRFID0gXCJ0b3VjaFJvdGF0ZVwiXHJcbiAgfVxyXG5cclxuICAvKiogRGV0YWlscyBmb3IgQ3VzdG9tVG91Y2hFdmVudHMsIHVzZSBhcyBnZW5lcmljIEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+ICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBFdmVudFRvdWNoRGV0YWlsIHtcclxuICAgIHBvc2l0aW9uOiBWZWN0b3IyO1xyXG4gICAgdG91Y2hlczogVG91Y2hMaXN0O1xyXG4gICAgb2Zmc2V0PzogVmVjdG9yMjtcclxuICAgIG1vdmVtZW50PzogVmVjdG9yMjtcclxuICAgIGNhcmRpbmFsPzogVmVjdG9yMjtcclxuICAgIHBpbmNoPzogVmVjdG9yMjtcclxuICAgIHBpbmNoRGVsdGE/OiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaGVzIEN1c3RvbVRvdWNoRXZlbnRzIHRvIHRoZSBFdmVudFRhcmdldCBnaXZlbiB3aXRoIHRoZSBjb25zdHJ1Y3Rvci5cclxuICAgKiBXaGVuIHVzaW5nIHRvdWNoIGV2ZW50cywgbWFrZSBzdXJlIHRvIHNldCBgdG91Y2gtYWN0aW9uOiBub25lYCBpbiBDU1MgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUb3VjaEV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICBwdWJsaWMgcG9zU3RhcnQ6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHB1YmxpYyBwb3NOb3RjaDogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgcHVibGljIHJhZGl1c1RhcDogbnVtYmVyO1xyXG4gICAgcHVibGljIHJhZGl1c05vdGNoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldDogRXZlbnRUYXJnZXQ7XHJcbiAgICBwcml2YXRlIHBvc1ByZXY6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHByaXZhdGUgbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgdGltZXJEb3VibGU6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lckxvbmc6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lRG91YmxlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWVMb25nOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWU6IFRpbWUgPSBuZXcgVGltZSgpO1xyXG4gICAgcHJpdmF0ZSBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBwaW5jaFRvbGVyYW5jZTogbnVtYmVyID0gMTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RhcmdldDogRXZlbnRUYXJnZXQsIF9yYWRpdXNUYXA6IG51bWJlciA9IDUsIF9yYWRpdXNOb3RjaDogbnVtYmVyID0gNTAsIF90aW1lRG91YmxlOiBudW1iZXIgPSAyMDAsIF90aW1lckxvbmc6IG51bWJlciA9IDEwMDApIHtcclxuICAgICAgdGhpcy50YXJnZXQgPSBfdGFyZ2V0O1xyXG4gICAgICB0aGlzLnJhZGl1c1RhcCA9IF9yYWRpdXNUYXA7XHJcbiAgICAgIHRoaXMucmFkaXVzTm90Y2ggPSBfcmFkaXVzTm90Y2g7XHJcbiAgICAgIHRoaXMudGltZURvdWJsZSA9IF90aW1lRG91YmxlO1xyXG4gICAgICB0aGlzLnRpbWVMb25nID0gX3RpbWVyTG9uZztcclxuICAgICAgdGhpcy5hY3RpdmF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLS9BY3RpdmF0ZXMgdGhlIGRpc3BhdGNoIG9mIEN1c3RvbVRvdWNoRXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbikge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgPEV2ZW50TGlzdGVuZXI+dGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBfZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgbGV0IHRvdWNoRmlyc3Q6IFRvdWNoID0gX2V2ZW50LnRvdWNoZXNbMF07XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMiA9IHRoaXMuY2FsY0F2ZXJhZ2VQb3NpdGlvbihfZXZlbnQudG91Y2hlcyk7IC8vbmV3IFZlY3RvcjIodG91Y2hGaXJzdD8uY2xpZW50WCwgdG91Y2hGaXJzdD8uY2xpZW50WSk7XHJcbiAgICAgIGxldCBvZmZzZXQ6IFZlY3RvcjI7XHJcblxyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdWNoc3RhcnRcIjpcclxuICAgICAgICAgIHRoaXMubW92ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3RhcnRHZXN0dXJlKHBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgcGluY2hcclxuICAgICAgICAgICAgbGV0IHBpbmNoOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WCAtIHRvdWNoRmlyc3QuY2xpZW50WCwgX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvdWNoRmlyc3QuY2xpZW50WSk7XHJcbiAgICAgICAgICAgIHRoaXMucGluY2hEaXN0YW5jZSA9IHBpbmNoLm1hZ25pdHVkZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hMb25nOiBUaW1lckhhbmRsZXIgPSAoX2V2ZW50VGltZXI6IEV2ZW50VGltZXIpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILkxPTkcsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRpbWVyTG9uZz8uY2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMudGltZXJMb25nID0gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy50aW1lTG9uZywgMSwgZGlzcGF0Y2hMb25nKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxyXG4gICAgICAgICAgdGhpcy50aW1lckxvbmc/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgaWYgKF9ldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gc3RpbGwgdG91Y2hlcyBhY3RpdmVcclxuICAgICAgICAgICAgdGhpcy5zdGFydEdlc3R1cmUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hUYXA6IFRpbWVySGFuZGxlciA9IChfZXZlbnRUaW1lcjogRXZlbnRUaW1lcik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5UQVAsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgYSB0YXAgYmVmb3JlIGFuZCB0aW1lciBpcyBzdGlsbCBydW5uaW5nIC0+IGRvdWJsZSB0YXBcclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVyRG91YmxlPy5hY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZS5jbGVhcigpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5ET1VCTEUsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm1vdmVkKVxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgbW92ZW1lbnQsIG90aGVyd2lzZSBzZXQgdGltZXIgdG8gZmlyZSB0YXBcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZSA9IG5ldyBUaW1lcih0aGlzLnRpbWUsIHRoaXMudGltZURvdWJsZSwgMSwgZGlzcGF0Y2hUYXApO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcclxuICAgICAgICAgIHRoaXMuZGV0ZWN0UGluY2goX2V2ZW50LCBwb3NpdGlvbik7XHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodGhpcy5wb3NQcmV2LCB0aGlzLnBvc1N0YXJ0KTtcclxuICAgICAgICAgIHRoaXMubW92ZWQgfHw9IChvZmZzZXQubWFnbml0dWRlIDwgdGhpcy5yYWRpdXNUYXApOyAvLyByZW1lbWJlciB0aGF0IHRvdWNoIG1vdmVkIG92ZXIgdGFwIHJhZGl1c1xyXG4gICAgICAgICAgbGV0IG1vdmVtZW50OiBWZWN0b3IyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHBvc2l0aW9uLCB0aGlzLnBvc1ByZXYpO1xyXG4gICAgICAgICAgdGhpcy50YXJnZXQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILk1PVkUsIHtcclxuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgcG9zaXRpb246IHBvc2l0aW9uLCB0b3VjaGVzOiBfZXZlbnQudG91Y2hlcywgb2Zmc2V0OiBvZmZzZXQsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIC8vIGZpcmUgbm90Y2ggd2hlbiB0b3VjaGVzIG1vdmVkIG91dCBvZiBub3RjaCByYWRpdXMgYW5kIHJlc2V0IG5vdGNoXHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UocG9zaXRpb24sIHRoaXMucG9zTm90Y2gpO1xyXG4gICAgICAgICAgaWYgKG9mZnNldC5tYWduaXR1ZGUgPiB0aGlzLnJhZGl1c05vdGNoKSB7XHJcbiAgICAgICAgICAgIGxldCBjYXJkaW5hbDogVmVjdG9yMiA9IE1hdGguYWJzKG9mZnNldC54KSA+IE1hdGguYWJzKG9mZnNldC55KSA/XHJcbiAgICAgICAgICAgICAgVmVjdG9yMi5YKG9mZnNldC54IDwgMCA/IC0xIDogMSkgOlxyXG4gICAgICAgICAgICAgIFZlY3RvcjIuWShvZmZzZXQueSA8IDAgPyAtMSA6IDEpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5OT1RDSCwge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMsIG9mZnNldDogb2Zmc2V0LCBjYXJkaW5hbDogY2FyZGluYWwsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnBvc05vdGNoID0gcG9zaXRpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL1RPRE86IHBpbmNoLCByb3RhdGUuLi5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wb3NQcmV2LnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBkZXRlY3RQaW5jaCA9IChfZXZlbnQ6IFRvdWNoRXZlbnQsIF9wb3NpdGlvbjogVmVjdG9yMik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoICE9IDIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHQ6IFRvdWNoTGlzdCA9IF9ldmVudC50b3VjaGVzO1xyXG4gICAgICBsZXQgcGluY2g6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0WzFdLmNsaWVudFggLSB0WzBdLmNsaWVudFgsIHRbMV0uY2xpZW50WSAtIHRbMF0uY2xpZW50WSk7XHJcbiAgICAgIGxldCBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSBwaW5jaC5tYWduaXR1ZGU7XHJcbiAgICAgIGxldCBwaW5jaERlbHRhOiBudW1iZXIgPSBwaW5jaERpc3RhbmNlIC0gdGhpcy5waW5jaERpc3RhbmNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnMocGluY2hEZWx0YSkgPiB0aGlzLnBpbmNoVG9sZXJhbmNlKVxyXG4gICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4oRVZFTlRfVE9VQ0guUElOQ0gsIHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBfcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzLCBwaW5jaDogcGluY2gsIHBpbmNoRGVsdGE6IHBpbmNoRGVsdGEgfVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnBpbmNoRGlzdGFuY2UgPSBwaW5jaERpc3RhbmNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0R2VzdHVyZShfcG9zaXRpb246IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wb3NOb3RjaC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgICAgdGhpcy5wb3NTdGFydC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGNBdmVyYWdlUG9zaXRpb24oX3RvdWNoZXM6IFRvdWNoTGlzdCk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgYXZlcmFnZTogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgICBmb3IgKGxldCB0b3VjaCBvZiBfdG91Y2hlcykge1xyXG4gICAgICAgIGF2ZXJhZ2UueCArPSB0b3VjaC5jbGllbnRYO1xyXG4gICAgICAgIGF2ZXJhZ2UueSArPSB0b3VjaC5jbGllbnRZO1xyXG4gICAgICB9XHJcbiAgICAgIGF2ZXJhZ2Uuc2NhbGUoMSAvIF90b3VjaGVzLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBhdmVyYWdlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBub2RlIG1hbmFnZWQgYnkge0BsaW5rIFByb2plY3R9IHRoYXQgZnVuY3Rpb25zIGFzIGEgdGVtcGxhdGUgZm9yIHtAbGluayBHcmFwaEluc3RhbmNlfXMgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVzb3VyY2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGggZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIC8vICNzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIkdyYXBoXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCB0aGlzLmhuZE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnR5cGUgPSB0aGlzLnR5cGU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgYXdhaXQgUHJvamVjdC5yZXN5bmNHcmFwaEluc3RhbmNlcyh0aGlzKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfREVTRVJJQUxJWkVEKSk7XHJcbiAgICAgIERlYnVnLmxvZyhcIkRlc2VyaWFsaXplZFwiLCB0aGlzLm5hbWUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZE11dGF0ZSA9IGFzeW5jIChfZXZlbnQ6IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcblxyXG4gICAgICAvLyBUT0RPOiBpZiBwYXRoIGNvbnRhaW5zIGEgZ3JhcGggaW5zdGFuY2UgYmVsb3cgdGhpcywgZG9uJ3QgZGlzcGF0Y2ghXHJcbiAgICAgIC8vIGxldCBwYXRoOiBOb2RlW10gPSBSZWZsZWN0LmdldChfZXZlbnQsIFwicGF0aFwiKTtcclxuICAgICAgLy8gZm9yIChsZXQgbm9kZSBvZiBwYXRoKVxyXG4gICAgICAvLyAgIGlmIChub2RlIGluc3RhbmNlb2YgR3JhcGhJbnN0YW5jZSAmJiBub2RlLmlkU291cmNlICE9IHRoaXMuaWRSZXNvdXJjZSlcclxuICAgICAgLy8gICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiR3JhcGggbXV0YXRlc1wiLCB0aGlzLm5hbWUpO1xyXG4gICAgICAvLyB0aGlzLiNzeW5jaW5nID0gdHJ1ZTtcclxuICAgICAgX2V2ZW50LmRldGFpbC5wYXRoID0gUmVmbGVjdC5nZXQoX2V2ZW50LCBcInBhdGhcIik7IC8vIHNhdmUgcGF0aCB0byB0YXJnZXQgaW4gZGV0YWlsXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFX0dSQVBILCB7IGRldGFpbDogX2V2ZW50LmRldGFpbCB9KSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuR1JBUEhfTVVUQVRFRCwgeyBkZXRhaWw6IF9ldmVudC5kZXRhaWwgfSkpO1xyXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURV9JTlNUQU5DRSkpO1xyXG4gICAgICAvLyB0aGlzLiNzeW5jaW5nID0gZmFsc2U7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBHcmFwaH0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEdyYXBoR0xURiBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChHcmFwaCkge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8R3JhcGhHTFRGPiB7XHJcbiAgICAgIHRoaXMudXJsID0gX3VybDtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHJldHVybiBHTFRGTG9hZGVyLmxvYWRSZXNvdXJjZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBjb25zdCBzZXJpYWxpemF0aW9uRXh0ZXJuYWw6IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk5vZGU6IFNlcmlhbGl6YXRpb24gPSBOb2RlLnByb3RvdHlwZS5zZXJpYWxpemUuY2FsbCh0aGlzKTsgLy8gdGhpcyBpcyB3YXN0ZWZ1bCBhcyB3ZSBvbmx5IG5lZWQgdGhlIGNvbXBvbmVudHMgZGVzZXJpYWxpemVkXHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uTm9kZS5jb21wb25lbnRzW0NvbXBvbmVudFNrZWxldG9uLm5hbWVdO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbk5vZGUuY2hpbGRyZW47XHJcbiAgICAgIHJldHVybiB7IC4uLnNlcmlhbGl6YXRpb25Ob2RlLCAuLi5zZXJpYWxpemF0aW9uRXh0ZXJuYWwgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGF3YWl0IEdyYXBoLnByb3RvdHlwZS5kZXNlcmlhbGl6ZS5jYWxsKHRoaXMsIF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8vIGVudW0gU1lOQyB7XHJcbiAgLy8gICBSRUFEWSwgR1JBUEhfU1lOQ0VELCBHUkFQSF9ET05FLCBJTlNUQU5DRVxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgR3JhcGh9LiAgXHJcbiAgICogVGhpcyBub2RlIGtlZXBzIGEgcmVmZXJlbmNlIHRvIGl0cyByZXNvdXJjZSBhbiBjYW4gdGh1cyBvcHRpbWl6ZSBzZXJpYWxpemF0aW9uXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVzb3VyY2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGhJbnN0YW5jZSBleHRlbmRzIE5vZGUge1xyXG4gICAgLyoqIGlkIG9mIHRoZSByZXNvdXJjZSB0aGF0IGluc3RhbmNlIHdhcyBjcmVhdGVkIGZyb20gKi9cclxuICAgIC8vIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgR3JhcGgsIGluc3RlYWQgb2YgdGhlIGlkXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvdW50OiBudW1iZXIgPSAwO1xyXG4gICAgI2lkU291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAjc3luYzogU1lOQyA9IFNZTkMuUkVBRFk7XHJcbiAgICAjZGVzZXJpYWxpemVGcm9tU291cmNlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgY29uc3RydWN0b3IgYWxvbmUgd2lsbCBub3QgY3JlYXRlIGEgcmVjb25zdHJ1Y3Rpb24sIGJ1dCBvbmx5IHNhdmUgdGhlIGlkLlxyXG4gICAgICogVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBncmFwaCwgY2FsbCByZXNldCBvbiB0aGlzIG9yIHNldCB3aXRoIGEgZ3JhcGggYXMgcGFyYW1ldGVyLlxyXG4gICAgICogUHJlZmVyIFByb2plY3QuY3JlYXRlR3JhcGhJbnN0YW5jZShfZ3JhcGgpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2dyYXBoPzogR3JhcGgpIHtcclxuICAgICAgc3VwZXIoXCJHcmFwaEluc3RhbmNlXCIpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCB0aGlzLmhuZE11dGF0aW9uSW5zdGFuY2UpO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGgpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9ncmFwaC5pZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaWRTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2lkU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjcmVhdGUgdGhpcyBub2RlIGZyb20gdGhlIHtAbGluayBHcmFwaH0gcmVmZXJlbmNlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZTogR3JhcGggPSA8R3JhcGg+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZSh0aGlzLiNpZFNvdXJjZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0KHJlc291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IG9wdGltaXplIHVzaW5nIHRoZSByZWZlcmVuY2VkIEdyYXBoLCBzZXJpYWxpemUvZGVzZXJpYWxpemUgb25seSB0aGUgZGlmZmVyZW5jZXNcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBmaWx0ZXI6IENvbXBvbmVudEdyYXBoRmlsdGVyID0gdGhpcy5nZXRDb21wb25lbnQoQ29tcG9uZW50R3JhcGhGaWx0ZXIpO1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG5cclxuICAgICAgaWYgKGZpbHRlciAmJiBmaWx0ZXIuaXNBY3RpdmUpIHsgLy8gaWYgZ3JhcGggc3luY2hyb25pc2F0aW9uIGlzIHVuZmlsdGVyZWQsIGtub3dpbmcgdGhlIHNvdXJjZSBpcyBzdWZmaWNpZW50IGZvciBzZXJpYWxpemF0aW9uXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURikgeyAvLyBsaWtlIGZvciB0aGUgR3JhcGhHTFRGOiBjaGlsZHJlbiBhbmQgY29tcG9uZW50cyBsb2FkZWQgZnJvbSBnbHRmIG11c3QgbmV2ZXIgYmUgc2VyaWFsaXplZFxyXG4gICAgICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uY29tcG9uZW50c1tDb21wb25lbnRTa2VsZXRvbi5uYW1lXTtcclxuICAgICAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmNoaWxkcmVuO1xyXG4gICAgICAgICAgc2VyaWFsaXphdGlvbi51cmwgPSBncmFwaC51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemVGcm9tU291cmNlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkU291cmNlID0gdGhpcy4jaWRTb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuI2lkU291cmNlID0gX3NlcmlhbGl6YXRpb24uaWRTb3VyY2UgPz8gX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZTtcclxuICAgICAgaWYgKCFfc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZUZyb21Tb3VyY2UpIHtcclxuICAgICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gPEdyYXBoPjx1bmtub3duPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UodGhpcy4jaWRTb3VyY2UpO1xyXG4gICAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICAgIGF3YWl0IEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMsIF9zZXJpYWxpemF0aW9uLnVybCk7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTsgLy8gaW5zdGFuY2UgaXMgZGVzZXJpYWxpemVkIGZyb20gaW5kaXZpZHVhbCBkYXRhXHJcblxyXG4gICAgICAgIHRoaXMuI2Rlc2VyaWFsaXplRnJvbVNvdXJjZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gdGhpcy5nZXQoKTtcclxuICAgICAgaWYgKGdyYXBoKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvR3JhcGgoKTsgLy8gb3RoZXJ3aXNlIGp1c3QgY29ubmVjdFxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBEZWJ1Zy5sb2coXCJSZWdpc3RlciBmb3IgcmVzeW5jXCIsIF9zZXJpYWxpemF0aW9uLm5hbWUsIHRoaXMubmFtZSk7XHJcbiAgICAgICAgUHJvamVjdC5yZWdpc3RlckdyYXBoSW5zdGFuY2VGb3JSZXN5bmModGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGlzIGdyYXBoIGluc3RhbmNlIHRvIHRoZSBncmFwaCByZWZlcmVuY2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdFRvR3JhcGgoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAodGhpcy4jZGVzZXJpYWxpemVGcm9tU291cmNlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KGdyYXBoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIG5vZGUgdG8gYmUgYSByZWNyZWF0aW9uIG9mIHRoZSB7QGxpbmsgR3JhcGh9IGdpdmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzZXQoX2dyYXBoOiBHcmFwaCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9ncmFwaC5pZFJlc291cmNlO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRHcmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAoY3VycmVudEdyYXBoKSB7XHJcbiAgICAgICAgY3VycmVudEdyYXBoLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFX0dSQVBILCB0aGlzLmhuZE11dGF0aW9uR3JhcGgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lLCBpZiB0aGUgc2VyaWFsaXphdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBHcmFwaCBmb3Igb3B0aW1pemF0aW9uIDwtIGFsc28gdXNlZnVsIGZvciBzeW5jIHdpdGggaW5zdGFuY2VzXHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gU2VyaWFsaXplci5zZXJpYWxpemUoX2dyYXBoKTtcclxuICAgICAgZm9yIChsZXQgcGF0aCBpbiBzZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uW3BhdGhdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgRGVidWcuZnVkZ2UoXCJHcmFwaEluc3RhbmNlIHNldCB0byBcIiArIHRoaXMubmFtZSArIFwiIHwgXCIgKyBcIkluc3RhbmNlIGNvdW50OiBcIiArIEdyYXBoSW5zdGFuY2UuY291bnQrKyk7XHJcbiAgICAgIF9ncmFwaC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURV9HUkFQSCwgdGhpcy5obmRNdXRhdGlvbkdyYXBoKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVEKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZ3JhcGggdGhpcyBpbnN0YW5jZXMgcmVmZXJzIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogR3JhcGgge1xyXG4gICAgICByZXR1cm4gPEdyYXBoPlByb2plY3QucmVzb3VyY2VzW3RoaXMuI2lkU291cmNlXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvdXJjZSBncmFwaCBtdXRhdGVkLCByZWZsZWN0IG11dGF0aW9uIGluIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBobmRNdXRhdGlvbkdyYXBoID0gYXN5bmMgKF9ldmVudDogQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCgpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmbGVjdE11dGF0aW9uKF9ldmVudCwgPEdyYXBoPl9ldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLCBfZXZlbnQuZGV0YWlsLnBhdGgpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURV9JTlNUQU5DRSwgeyBidWJibGVzOiB0cnVlIH0pKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGluc3RhbmNlIG11dGF0ZWQsIHJlZmxlY3QgbXV0YXRpb24gaW4gc291cmNlIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaG5kTXV0YXRpb25JbnN0YW5jZSA9IGFzeW5jIChfZXZlbnQ6IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRmlsdGVyZWQoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlZmxlY3RNdXRhdGlvbihfZXZlbnQsIHRoaXMsIHRoaXMuZ2V0KCksIFJlZmxlY3QuZ2V0KF9ldmVudCwgXCJwYXRoXCIpKTtcclxuICAgICAgdGhpcy5nZXQoKS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5NVVRBVEUsIHsgZGV0YWlsOiBfZXZlbnQuZGV0YWlsIH0pKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcmVmbGVjdCBtdXRhdGlvbiBmcm9tIGEgc291cmNlIGdyYXBoIG9yIGluc3RhbmNlIHRvIGEgZGVzdGluYXRpb24gaW5zdGFuY2Ugb3IgZ3JhcGhcclxuICAgIHByaXZhdGUgYXN5bmMgcmVmbGVjdE11dGF0aW9uKF9ldmVudDogQ3VzdG9tRXZlbnQsIF9zb3VyY2U6IE5vZGUsIF9kZXN0aW5hdGlvbjogTm9kZSwgX3BhdGg6IE5vZGVbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIF9wYXRoKSAvLyBpdGVyYXRlIHVwIHRoZSBldmVudCBwYXRoLCB3aGljaCBtYXkgY29udGFpbiByZWd1bGFyIE5vZGVzIG9yIEdyYXBoSW5zdGFuY2VzXHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSAvLyB1bnRpbCB0aGlzIEdyYXBoSW5zdGFuY2UgaXMgZm91bmQgKG9yIG5vIEdyYXBoSW5zdGFuY2UuLi4pXHJcbiAgICAgICAgICBpZiAobm9kZSA9PSB0aGlzKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN5bmMgYWJvcnRlZCwgdGFyZ2V0IGFscmVhZHkgc3luY2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaW4gdGhlIGRlc3RpbmF0aW9uIGhpZXJhcmNoeVxyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IF9wYXRoLmluZGV4T2YoX3NvdXJjZSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgY2hpbGRJbmRleDogbnVtYmVyID0gX3BhdGhbaV0uZ2V0UGFyZW50KCkuZmluZENoaWxkKF9wYXRoW2ldKTsgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgY2hpbGRub2RlIGluIHRoZSBvcmlnaW5hbCBwYXRoXHJcbiAgICAgICAgX2Rlc3RpbmF0aW9uID0gX2Rlc3RpbmF0aW9uLmdldENoaWxkKGNoaWxkSW5kZXgpOyAvLyBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGQgaW4gdGhpcyBwYXRoXHJcbiAgICAgICAgLy8gVE9ETzogcmVzcGVjdCBpbmRleCBmb3Igbm9uLXNpbmdsZXRvbiBjb21wb25lbnRzLi4uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIG11dGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgaW4gdGhlIGRlc3RpbmF0aW9uXHJcbiAgICAgIGxldCBjbXBNdXRhdGU6IENvbXBvbmVudCA9IF9kZXN0aW5hdGlvbi5nZXRDb21wb25lbnQoX2V2ZW50LmRldGFpbC5jb21wb25lbnQuY29uc3RydWN0b3IpO1xyXG4gICAgICBpZiAoY21wTXV0YXRlKVxyXG4gICAgICAgIGF3YWl0IGNtcE11dGF0ZS5tdXRhdGUoX2V2ZW50LmRldGFpbC5tdXRhdG9yLCBudWxsLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgY21wRmlsdGVyOiBDb21wb25lbnRHcmFwaEZpbHRlciA9IHRoaXMuZ2V0Q29tcG9uZW50KENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIChjbXBGaWx0ZXIgJiYgY21wRmlsdGVyLmlzQWN0aXZlKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBIb2xkcyBkYXRhIHRvIGZlZWQgaW50byBhIHtAbGluayBTaGFkZXJ9IHRvIGRlc2NyaWJlIHRoZSBzdXJmYWNlIG9mIHtAbGluayBNZXNofS4gIFxyXG4gICAqIHtAbGluayBNYXRlcmlhbH1zIHJlZmVyZW5jZSB7QGxpbmsgQ29hdH0gYW5kIHtAbGluayBTaGFkZXJ9LiAgIFxyXG4gICAqIFRoZSBtZXRob2QgdXNlUmVuZGVyRGF0YSB3aWxsIGJlIGluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvcn0gYXQgcnVudGltZSwgZXh0ZW5kaW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgdG8gZGVhbCB3aXRoIHRoZSByZW5kZXJlci5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29hdCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gcHVibGljIG5hbWU6IHN0cmluZyA9IFwiQ29hdFwiO1xyXG4gICAgLy8gcHJvdGVjdGVkIHJlbmRlckRhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9OyAvLyB0aGlzIHdhc24ndCB1c2VkIGFueXdoZXJlLi4uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZW5kZXItcGFyYW1ldGVycyBmcm9tIHRoaXMgYW5kIHRoZSBnaXZlbiBtYXRlcmlhbCBpbnNpZGUgdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvYXR9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckRhdGE7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgc2ltcGxlc3Qge0BsaW5rIENvYXR9IHByb3ZpZGluZyBqdXN0IGEgY29sb3JcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRDb2xvcmVkIGV4dGVuZHMgQ29hdCB7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jb2xvciA9IF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uY29sb3IgPSB0aGlzLmNvbG9yLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgdGhpcy5jb2xvci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2xvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgY29sb3IgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSBwaG9uZyBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZSBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yKTtcclxuICAgICAgdGhpcy5kaWZmdXNlID0gX2RpZmZ1c2U7XHJcbiAgICAgIHRoaXMuc3BlY3VsYXIgPSBfc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy5tZXRhbGxpYyA9IF9tZXRhbGxpYztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG1ldGFsbGljKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXRhbGxpYztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWV0YWxsaWMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWV0YWxsaWMgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmRpZmZ1c2UgPSB0aGlzLmRpZmZ1c2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm1ldGFsbGljID0gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUZXh0dXJlZCBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuXHJcbiAgICBAdHlwZShUZXh0dXJlKVxyXG4gICAgcHVibGljIHRleHR1cmU6IFRleHR1cmU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleHR1cmU6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvcikge1xyXG4gICAgICBzdXBlcihfY29sb3IpO1xyXG4gICAgICB0aGlzLnRleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXh0dXJlID0gdGhpcy50ZXh0dXJlLmlkUmVzb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKVxyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IDxUZXh0dXJlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJDb2F0VGV4dHVyZWQudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlIGFuZCBhZGRpdGlvbmFsIGRhdGEgZm9yIHRleHR1cmluZ1xyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZVRleHR1cmVkIGV4dGVuZHMgQ29hdFRleHR1cmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfdGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZGlmZnVzZSA9IF9kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NwZWN1bGFyO1xyXG4gICAgICB0aGlzLmludGVuc2l0eSA9IF9pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMubWV0YWxsaWMgPSBfbWV0YWxsaWM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtZXRhbGxpYygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWV0YWxsaWM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1ldGFsbGljKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21ldGFsbGljID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiQ29hdFRleHR1cmVkLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHMgZXh0ZW5kcyBDb2F0UmVtaXNzaXZlVGV4dHVyZWQge1xyXG5cclxuICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICBwdWJsaWMgbm9ybWFsTWFwOiBUZXh0dXJlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCksIF90ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3IsIF9ub3JtYWxNYXA6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5ub3JtYWwsIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IHVuZGVmaW5lZCwgX2ludGVuc2l0eTogbnVtYmVyID0gdW5kZWZpbmVkLCBfbWV0YWxsaWM6IG51bWJlciA9IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdXBlcihfY29sb3IsIF90ZXh0dXJlLCBfZGlmZnVzZSwgX3NwZWN1bGFyLCBfaW50ZW5zaXR5LCBfbWV0YWxsaWMpO1xyXG4gICAgICB0aGlzLm5vcm1hbE1hcCA9IF9ub3JtYWxNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkTm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAuaWRSZXNvdXJjZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZE5vcm1hbE1hcClcclxuICAgICAgICB0aGlzLm5vcm1hbE1hcCA9IDxUZXh0dXJlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWROb3JtYWxNYXApO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSBjb2xvciBhbmQgcGFyYW1ldGVycyBmb3IgdGhlIHRvb24gc2hhZGluZyBtb2RlbC5cclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUb29uIGV4dGVuZHMgbWl4aW5Db2F0VG9vbihDb2F0UmVtaXNzaXZlKSB7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4VG9vbjogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LnRvb24sIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IDEuMiwgX2ludGVuc2l0eT86IG51bWJlciwgX21ldGFsbGljPzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvciwgX2RpZmZ1c2UsIF9zcGVjdWxhciwgX2ludGVuc2l0eSwgX21ldGFsbGljKTtcclxuICAgICAgdGhpcy50ZXhUb29uID0gX3RleFRvb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlLCBhIGNvbG9yIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgdG9vbiBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFRvb25UZXh0dXJlZCBleHRlbmRzIG1peGluQ29hdFRvb24oQ29hdFJlbWlzc2l2ZVRleHR1cmVkKSB7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfdGV4VG9vbjogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LnRvb24sIF9kaWZmdXNlPzogbnVtYmVyLCBfc3BlY3VsYXI6IG51bWJlciA9IDEuMiwgX2ludGVuc2l0eT86IG51bWJlciwgX21ldGFsbGljPzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvciwgX3RleHR1cmUsIF9kaWZmdXNlLCBfc3BlY3VsYXIsIF9pbnRlbnNpdHksIF9tZXRhbGxpYyk7XHJcbiAgICAgIHRoaXMudGV4VG9vbiA9IF90ZXhUb29uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbWl4aW5Db2F0VG9vbjxUQmFzZSBleHRlbmRzIG5ldyAoLi4uYXJnczogR2VuZXJhbFtdKSA9PiBTZXJpYWxpemFibGU+KF9iYXNlOiBUQmFzZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcbiAgICBhYnN0cmFjdCBjbGFzcyBDb2F0VG9vbiBleHRlbmRzIF9iYXNlIHtcclxuXHJcbiAgICAgIEB0eXBlKFRleHR1cmUpXHJcbiAgICAgIHB1YmxpYyB0ZXhUb29uOiBUZXh0dXJlO1xyXG5cclxuICAgICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXhUb29uID0gdGhpcy50ZXhUb29uLmlkUmVzb3VyY2U7XHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleFRvb24pXHJcbiAgICAgICAgICB0aGlzLnRleFRvb24gPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkVGV4VG9vbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gQ29hdFRvb247XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYSBjb2xvciBhcyB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMSBmb3IgdGhlIGZvdXIgY2hhbm5lbHMgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgKGZvciBvcGFjaXR5KVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb2xvciBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICAvLyBjcmMyIG9ubHkgdXNlZCBmb3IgY29udmVydGluZyBjb2xvcnMgZnJvbSBzdHJpbmdzIHByZWRlZmluZWQgYnkgQ1NTXHJcbiAgICBwcml2YXRlIHN0YXRpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSAoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcclxuICAgICAgY3JjMi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImNvcHlcIjtcclxuICAgICAgcmV0dXJuIGNyYzI7XHJcbiAgICB9KSgpO1xyXG5cclxuICAgIHB1YmxpYyByOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZzogbnVtYmVyO1xyXG4gICAgcHVibGljIGI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yOiBudW1iZXIgPSAxLCBfZzogbnVtYmVyID0gMSwgX2I6IG51bWJlciA9IDEsIF9hOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0Q2xhbXBlZChfciwgX2csIF9iLCBfYSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSB3aXRoIHRoZSA4LWJpdCBjb2xvciBjaGFubmVscyBpbiB0aGUgb3JkZXIgUkdCQS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeXRlc0Zyb21DU1MoX2tleXdvcmQ6IHN0cmluZyk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsU3R5bGUgPSBfa2V5d29yZDtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsUmVjdCgwLCAwLCAxLCAxKTtcclxuICAgICAgcmV0dXJuIENvbG9yLmNyYzIuZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBDb2xvcn0gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gY3NzIGNvbG9yIGtleXdvcmQuIFxyXG4gICAgICogUGFzc2luZyBhbiBfYWxwaGEgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgYWxwaGEgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBrZXl3b3JkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENTUyhfa2V5d29yZDogc3RyaW5nLCBfYWxwaGE/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5nZXQoQ29sb3IpLnNldENTUyhfa2V5d29yZCwgX2FscGhhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXRydW5zIHRoZSBwcm9kdWN0IG9mIHR3byBjb2xvcnMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX2NsckE6IENvbG9yLCBfY2xyQjogQ29sb3IpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHJ1bnMgdGhlIHByb2R1Y3Qgb2YgYSBjb2xvciB3aXRoIGEgc2NhbGFyIHZhbHVlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9jb2xvcjogQ29sb3IsIF9zY2FsYXI6IG51bWJlcik6IENvbG9yO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdWx0aXBsaWNhbnQ6IENvbG9yLCBfbXVsdGlwbGllcjogQ29sb3IgfCBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBfbXVsdGlwbGljYW50LmNsb25lLm11bHRpcGx5KDxHZW5lcmFsPl9tdWx0aXBsaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IENvbG9yIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKENvbG9yKS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGUgZ2l2ZW4gY29sb3IgaW50byB0aGlzIGNvbG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29weShfY29sb3I6IENvbG9yKTogQ29sb3Ige1xyXG4gICAgICB0aGlzLnIgPSBfY29sb3IucjtcclxuICAgICAgdGhpcy5nID0gX2NvbG9yLmc7XHJcbiAgICAgIHRoaXMuYiA9IF9jb2xvci5iO1xyXG4gICAgICB0aGlzLmEgPSBfY29sb3IuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuciA9IDE7IHRoaXMuZyA9IDE7IHRoaXMuYiA9IDE7IHRoaXMuYSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gY3NzIGNvbG9yIGtleXdvcmQuIE9wdGluYWxseSBzZXRzIHRoZSBhbHBoYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDU1MoX2tleXdvcmQ6IHN0cmluZywgX2FscGhhPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICBjb25zdCBieXRlc1JHQkE6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gQ29sb3IuZ2V0Qnl0ZXNGcm9tQ1NTKF9rZXl3b3JkKTtcclxuICAgICAgdGhpcy5zZXRCeXRlcyhieXRlc1JHQkFbMF0sIGJ5dGVzUkdCQVsxXSwgYnl0ZXNSR0JBWzJdLCBieXRlc1JHQkFbM10pO1xyXG4gICAgICB0aGlzLmEgPSBfYWxwaGEgPz8gdGhpcy5hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiA4LWJpdCB2YWx1ZXMgZm9yIHRoZSBjb2xvciBjaGFubmVscy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ5dGVzKF9yOiBudW1iZXIsIF9nOiBudW1iZXIsIF9iOiBudW1iZXIsIF9hOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCeXRlcyhfcmdiYTogVWludDhDbGFtcGVkQXJyYXkpOiBDb2xvcjtcclxuICAgIHB1YmxpYyBzZXRCeXRlcyhfcjogbnVtYmVyIHwgVWludDhDbGFtcGVkQXJyYXksIF9nPzogbnVtYmVyLCBfYj86IG51bWJlciwgX2E/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGlmIChfciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KVxyXG4gICAgICAgIHRoaXMuc2V0Qnl0ZXMoX3JbMF0sIF9yWzFdLCBfclsyXSwgX3JbM10pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5zZXRDbGFtcGVkKF9yIC8gMjU1LCBfZyAvIDI1NSwgX2IgLyAyNTUsIF9hIC8gMjU1KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGlzIGNvbG9yIGFuZCBjbGFtcHMgdGhlbSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDbGFtcGVkKF9yOiBudW1iZXIsIF9nOiBudW1iZXIsIF9iOiBudW1iZXIsIF9hOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIHtAbGluayBGbG9hdDMyQXJyYXl9IHdoaWxlIGNsYW1waW5nIHRoZSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q2xhbXBlZChfcmdiYTogRmxvYXQzMkFycmF5KTogQ29sb3I7XHJcbiAgICBwdWJsaWMgc2V0Q2xhbXBlZChfcjogbnVtYmVyIHwgRmxvYXQzMkFycmF5LCBfZz86IG51bWJlciwgX2I/OiBudW1iZXIsIF9hPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICBpZiAoX3IgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpXHJcbiAgICAgICAgdGhpcy5zZXRDbGFtcGVkKF9yWzBdLCBfclsxXSwgX3JbMl0sIF9yWzNdKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0KFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfciwgMCwgMSksXHJcbiAgICAgICAgICBDYWxjLmNsYW1wKF9nLCAwLCAxKSxcclxuICAgICAgICAgIENhbGMuY2xhbXAoX2IsIDAsIDEpLFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfYSwgMCwgMSlcclxuICAgICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3I6IG51bWJlciwgX2c6IG51bWJlciwgX2I6IG51bWJlciwgX2E6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgdGhpcy5yID0gX3I7IHRoaXMuZyA9IF9nOyB0aGlzLmIgPSBfYjsgdGhpcy5hID0gX2E7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSBvZiB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5dGVzKCk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShbdGhpcy5yICogMjU1LCB0aGlzLmcgKiAyNTUsIHRoaXMuYiAqIDI1NSwgdGhpcy5hICogMjU1XSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjc3MgY29sb3Iga2V5d29yZCByZXByZXNlbnRpbmcgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENTUygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgYnl0ZXM6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gdGhpcy5nZXRCeXRlcygpO1xyXG4gICAgICByZXR1cm4gYFJHQkEoJHtieXRlc1swXX0sICR7Ynl0ZXNbMV19LCAke2J5dGVzWzJdfSwgJHt0aGlzLmF9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRIZXgoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IGJ5dGVzOiBVaW50OENsYW1wZWRBcnJheSA9IHRoaXMuZ2V0Qnl0ZXMoKTtcclxuICAgICAgbGV0IGhleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgZm9yIChsZXQgYnl0ZSBvZiBieXRlcylcclxuICAgICAgICBoZXggKz0gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICByZXR1cm4gaGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIGhleCBzdHJpbmcgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRIZXgoX2hleDogc3RyaW5nKTogQ29sb3Ige1xyXG4gICAgICBsZXQgYnl0ZXM6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gdGhpcy5nZXRCeXRlcygpO1xyXG4gICAgICBsZXQgY2hhbm5lbDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgYnl0ZSBpbiBieXRlcylcclxuICAgICAgICBieXRlc1tieXRlXSA9IHBhcnNlSW50KF9oZXguc3Vic3RyKGNoYW5uZWwrKyAqIDIsIDIpLCAxNik7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldEJ5dGVzKGJ5dGVzKTs7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBjb2xvciB0byB0aGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkKF9jb2xvcjogQ29sb3IpOiBDb2xvciB7XHJcbiAgICAgIHRoaXMuciArPSBfY29sb3IucjtcclxuICAgICAgdGhpcy5nICs9IF9jb2xvci5nO1xyXG4gICAgICB0aGlzLmIgKz0gX2NvbG9yLmI7XHJcbiAgICAgIHRoaXMuYSArPSBfY29sb3IuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBsaWVzIHRoaXMgd2l0aCB0aGUgZ2l2ZW4gY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfY29sb3I6IENvbG9yKTogQ29sb3I7XHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGxpZXMgdGhpcyB3aXRoIHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfc2NhbGFyOiBudW1iZXIpOiBDb2xvcjtcclxuICAgIHB1YmxpYyBtdWx0aXBseShfbXVsdGlwbGllcjogQ29sb3IgfCBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGlmIChfbXVsdGlwbGllciBpbnN0YW5jZW9mIENvbG9yKSB7XHJcbiAgICAgICAgdGhpcy5yICo9IF9tdWx0aXBsaWVyLnI7XHJcbiAgICAgICAgdGhpcy5nICo9IF9tdWx0aXBsaWVyLmc7XHJcbiAgICAgICAgdGhpcy5iICo9IF9tdWx0aXBsaWVyLmI7XHJcbiAgICAgICAgdGhpcy5hICo9IF9tdWx0aXBsaWVyLmE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yICo9IF9tdWx0aXBsaWVyO1xyXG4gICAgICAgIHRoaXMuZyAqPSBfbXVsdGlwbGllcjtcclxuICAgICAgICB0aGlzLmIgKj0gX211bHRpcGxpZXI7XHJcbiAgICAgICAgdGhpcy5hICo9IF9tdWx0aXBsaWVyO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFubmVscyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gY29sb3IgYXJlIHRvIGJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIHdpdGhpbiB0aGUgZ2l2ZW4gdG9sZXJhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlcXVhbHMoX2NvbXBhcmU6IENvbG9yLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy5yIC0gX2NvbXBhcmUucikgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLmcgLSBfY29tcGFyZS5nKSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMuYiAtIF9jb21wYXJlLmIpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy5hIC0gX2NvbXBhcmUuYSkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGAocjogJHt0aGlzLnIudG9GaXhlZCgzKX0sIGc6ICR7dGhpcy5nLnRvRml4ZWQoMyl9LCBiOiAke3RoaXMuYi50b0ZpeGVkKDMpfSwgYTogJHt0aGlzLmEudG9GaXhlZCgzKX0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGB7IFwiclwiOiAke3RoaXMucn0sIFwiZ1wiOiAke3RoaXMuZ30sIFwiYlwiOiAke3RoaXMuYn0sIFwiYVwiOiAke3RoaXMuYX19YDsgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbi50b0pTT04gPSAoKSA9PiB7IHJldHVybiBgWyR7dGhpcy5yfSwgJHt0aGlzLmd9LCAke3RoaXMuYn0sICR7dGhpcy5hfV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfc2VyaWFsaXphdGlvbikgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIFt0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmFdID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1hdGVyaWFsfSBsb2FkZWQgZnJvbSBhIGdsVEYtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0ZXJpYWxHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1hdGVyaWFsKSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lKTogUHJvbWlzZTxNYXRlcmlhbEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFic3RyYWN0IGNsYXNzIHN1cHBvcnRpbmcgdmFyaW91cyBhcml0aG1ldGljYWwgaGVscGVyIGZ1bmN0aW9uc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWxjIHtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIGRlZ3JlZXMgeWllbGRzIHRoZSBhbmdsZSBpbiByYWRpYW4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVnMnJhZDogbnVtYmVyID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIHJhZGlhbiB5aWVsZHMgdGhlIGFuZ2xlIGluIGRlZ3JlZXMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmFkMmRlZzogbnVtYmVyID0gMSAvIENhbGMuZGVnMnJhZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSB2YWx1ZXMgcGFzc2VkIGluLCBlaXRoZXIgX3ZhbHVlIGlmIHdpdGhpbiBfbWluIGFuZCBfbWF4IG9yIHRoZSBib3VuZGFyeSBiZWluZyBleGNlZWRlZCBieSBfdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGFtcDxUPihfdmFsdWU6IFQsIF9taW46IFQsIF9tYXg6IFQsIF9pc1NtYWxsZXI6IChfdmFsdWUxOiBULCBfdmFsdWUyOiBUKSA9PiBib29sZWFuID0gKF92YWx1ZTE6IFQsIF92YWx1ZTI6IFQpID0+IHsgcmV0dXJuIF92YWx1ZTEgPCBfdmFsdWUyOyB9KTogVCB7XHJcbiAgICAgIGlmIChfaXNTbWFsbGVyKF92YWx1ZSwgX21pbikpIHJldHVybiBfbWluO1xyXG4gICAgICBpZiAoX2lzU21hbGxlcihfbWF4LCBfdmFsdWUpKSByZXR1cm4gX21heDtcclxuICAgICAgcmV0dXJuIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcyAoX2EsIF9iKSBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yIChfZikuIGYgaXMgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbGVycChfYTogbnVtYmVyLCBfYjogbnVtYmVyLCBfZjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hICsgKF9iIC0gX2EpICogQ2FsYy5jbGFtcChfZiwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3VuZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHRoZSBnaXZlbiBpbmNyZW1lbnQgdXNpbmcgdGhlIGdpdmVuIHJvdW5kaW5nIGZ1bmN0aW9uLiBcclxuICAgICAqIERlZmF1bHQgcm91bmRpbmcgZnVuY3Rpb24gaXMge0BsaW5rIE1hdGgucm91bmR9LCB1c2Uge0BsaW5rIE1hdGguZmxvb3J9IG9yIHtAbGluayBNYXRoLmNlaWx9IHRvIHJvdW5kIGRvd24gb3IgdXAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc25hcChfdmFsdWU6IG51bWJlciwgX2luY3JlbWVudDogbnVtYmVyLCBfcm91bmQ6IChfdmFsdWU6IG51bWJlcikgPT4gbnVtYmVyID0gTWF0aC5yb3VuZCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfcm91bmQoX3ZhbHVlIC8gX2luY3JlbWVudCkgKiBfaW5jcmVtZW50O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQm9yZGVyIHtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgcmlnaHQ6IG51bWJlcjtcclxuICAgIGJvdHRvbTogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnJhbWluZyBkZXNjcmliZXMgaG93IHRvIG1hcCBhIHJlY3RhbmdsZSBpbnRvIGEgZ2l2ZW4gZnJhbWVcclxuICAgKiBhbmQgaG93IHBvaW50cyBpbiB0aGUgZnJhbWUgY29ycmVzcG9uZCB0byBwb2ludHMgaW4gdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYW5kIHZpY2UgdmVyc2FcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAgXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9GcmFtaW5nXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZyYW1pbmcgZXh0ZW5kcyBNdXRhYmxlIHtcclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYSBwb2ludCBpbiB0aGUgZ2l2ZW4gZnJhbWUgYWNjb3JkaW5nIHRvIHRoaXMgZnJhbWluZ1xyXG4gICAgICogQHBhcmFtIF9wb2ludEluRnJhbWUgVGhlIHBvaW50IGluIHRoZSBmcmFtZSBnaXZlblxyXG4gICAgICogQHBhcmFtIF9yZWN0RnJhbWUgVGhlIGZyYW1lIHRoZSBwb2ludCBpcyByZWxhdGl2ZSB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYSBwb2ludCBpbiBhIGdpdmVuIHJlY3RhbmdsZSBiYWNrIHRvIGEgY2FsY3VsYXRlZCBmcmFtZSBvZiBvcmlnaW5cclxuICAgICAqIEBwYXJhbSBfcG9pbnQgVGhlIHBvaW50IGluIHRoZSByZWN0YW5nbGVcclxuICAgICAqIEBwYXJhbSBfcmVjdCBUaGUgcmVjdGFuZ2xlIHRoZSBwb2ludCBpcyByZWxhdGl2ZSB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHJlY3RhbmdsZSBhcyB0aGUgZnJhbWUgYW5kIGNyZWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIGFjY29yZGluZyB0byB0aGUgZnJhbWluZ1xyXG4gICAgICogQHBhcmFtIF9yZWN0RnJhbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgaGFzIGEgZml4ZWQgd2lkdGggYW5kIGhlaWdodCBhbmQgZGlzcGxheSBzaG91bGQgc2NhbGUgdG8gZml0IHRoZSBmcmFtZVxyXG4gICAqIFBvaW50cyBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIHJhdGlvXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZyYW1pbmdGaXhlZCBleHRlbmRzIEZyYW1pbmcge1xyXG4gICAgcHVibGljIHdpZHRoOiBudW1iZXIgPSAzMDA7XHJcbiAgICBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgPSAxNTA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF93aWR0aDogbnVtYmVyID0gMzAwLCBfaGVpZ2h0OiBudW1iZXIgPSAxNTApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXRTaXplKF93aWR0aCwgX2hlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgZnJhbWluZyB0byB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2l6ZShfd2lkdGg6IG51bWJlciwgX2hlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICB0aGlzLndpZHRoICogKF9wb2ludEluRnJhbWUueCAtIF9yZWN0RnJhbWUueCkgLyBfcmVjdEZyYW1lLndpZHRoLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICogKF9wb2ludEluRnJhbWUueSAtIF9yZWN0RnJhbWUueSkgLyBfcmVjdEZyYW1lLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludEludmVyc2UoX3BvaW50OiBWZWN0b3IyLCBfcmVjdDogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICBfcG9pbnQueCAqIF9yZWN0LndpZHRoIC8gdGhpcy53aWR0aCArIF9yZWN0LngsXHJcbiAgICAgICAgX3BvaW50LnkgKiBfcmVjdC5oZWlnaHQgLyB0aGlzLmhlaWdodCArIF9yZWN0LnlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYXJlIGZyYWN0aW9ucyBvZiB0aG9zZSBvZiB0aGUgZnJhbWUsIHNjYWxlZCBieSBub3JtZWQgdmFsdWVzIG5vcm1XaWR0aCBhbmQgbm9ybUhlaWdodC5cclxuICAgKiBEaXNwbGF5IHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIGZyYW1lIGFuZCBwb2ludHMgYXJlIHNjYWxlZCBpbiB0aGUgc2FtZSByYXRpb1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGcmFtaW5nU2NhbGVkIGV4dGVuZHMgRnJhbWluZyB7XHJcbiAgICBwdWJsaWMgbm9ybVdpZHRoOiBudW1iZXIgPSAxLjA7XHJcbiAgICBwdWJsaWMgbm9ybUhlaWdodDogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGZyYW1pbmcgdG8gdGhlIGdpdmVuIG5vcm1lZCB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTY2FsZShfbm9ybVdpZHRoOiBudW1iZXIsIF9ub3JtSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5ub3JtV2lkdGggPSBfbm9ybVdpZHRoO1xyXG4gICAgICB0aGlzLm5vcm1IZWlnaHQgPSBfbm9ybUhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICB0aGlzLm5vcm1XaWR0aCAqIChfcG9pbnRJbkZyYW1lLnggLSBfcmVjdEZyYW1lLngpLFxyXG4gICAgICAgIHRoaXMubm9ybUhlaWdodCAqIChfcG9pbnRJbkZyYW1lLnkgLSBfcmVjdEZyYW1lLnkpXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54IC8gdGhpcy5ub3JtV2lkdGggKyBfcmVjdC54LFxyXG4gICAgICAgIF9wb2ludC55IC8gdGhpcy5ub3JtSGVpZ2h0ICsgX3JlY3QueVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZWN0KF9yZWN0RnJhbWU6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMubm9ybVdpZHRoICogX3JlY3RGcmFtZS53aWR0aCwgdGhpcy5ub3JtSGVpZ2h0ICogX3JlY3RGcmFtZS5oZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgZml0cyBpbnRvIGEgbWFyZ2luIGdpdmVuIGFzIGZyYWN0aW9ucyBvZiB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgZ2l2ZW4gYnkgbm9ybUFuY2hvclxyXG4gICAqIHBsdXMgYW4gYWJzb2x1dGUgcGFkZGluZyBnaXZlbiBieSBwaXhlbEJvcmRlci4gRGlzcGxheSBzaG91bGQgZml0IGludG8gdGhpcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRnJhbWluZ0NvbXBsZXggZXh0ZW5kcyBGcmFtaW5nIHtcclxuICAgIHB1YmxpYyBtYXJnaW46IEJvcmRlciA9IHsgbGVmdDogMCwgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwIH07XHJcbiAgICBwdWJsaWMgcGFkZGluZzogQm9yZGVyID0geyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAgfTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnQoX3BvaW50SW5GcmFtZTogVmVjdG9yMiwgX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICBfcG9pbnRJbkZyYW1lLnggLSB0aGlzLnBhZGRpbmcubGVmdCAtIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdEZyYW1lLndpZHRoLFxyXG4gICAgICAgIF9wb2ludEluRnJhbWUueSAtIHRoaXMucGFkZGluZy50b3AgLSB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdEZyYW1lLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54ICsgdGhpcy5wYWRkaW5nLmxlZnQgKyB0aGlzLm1hcmdpbi5sZWZ0ICogX3JlY3Qud2lkdGgsXHJcbiAgICAgICAgX3BvaW50LnkgKyB0aGlzLnBhZGRpbmcudG9wICsgdGhpcy5tYXJnaW4udG9wICogX3JlY3QuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlIHtcclxuICAgICAgaWYgKCFfcmVjdEZyYW1lKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IG1pblg6IG51bWJlciA9IF9yZWN0RnJhbWUueCArIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdEZyYW1lLndpZHRoICsgdGhpcy5wYWRkaW5nLmxlZnQ7XHJcbiAgICAgIGxldCBtaW5ZOiBudW1iZXIgPSBfcmVjdEZyYW1lLnkgKyB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdEZyYW1lLmhlaWdodCArIHRoaXMucGFkZGluZy50b3A7XHJcbiAgICAgIGxldCBtYXhYOiBudW1iZXIgPSBfcmVjdEZyYW1lLnggKyAoMSAtIHRoaXMubWFyZ2luLnJpZ2h0KSAqIF9yZWN0RnJhbWUud2lkdGggLSB0aGlzLnBhZGRpbmcucmlnaHQ7XHJcbiAgICAgIGxldCBtYXhZOiBudW1iZXIgPSBfcmVjdEZyYW1lLnkgKyAoMSAtIHRoaXMubWFyZ2luLmJvdHRvbSkgKiBfcmVjdEZyYW1lLmhlaWdodCAtIHRoaXMucGFkZGluZy5ib3R0b207XHJcblxyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVChtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4geyBtYXJnaW46IHRoaXMubWFyZ2luLCBwYWRkaW5nOiB0aGlzLnBhZGRpbmcgfTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvcjIgYXMgcG9sYXIgY29vcmRpbmF0ZXMgXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICDihpUtIGFuZ2xlIChBbmdsZSB0byB0aGUgeC1heGlzKVxyXG4gICAqICAt4oaSIE1hZ25pdHVkZSAoRGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyKSAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEdlbzIgaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIG1hZ25pdHVkZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhbmdsZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2FuZ2xlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9hbmdsZSwgX21hZ25pdHVkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZSBhdCBvbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FuZ2xlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWFnbml0dWRlID0gX21hZ25pdHVkZTtcclxuICAgICAgdGhpcy5hbmdsZSA9IF9hbmdsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYGFuZ2xlOiAke3RoaXMuYW5nbGUudG9QcmVjaXNpb24oNSl9LCAgbWFnbml0dWRlOiAke3RoaXMubWFnbml0dWRlLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3IzIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXMgYXMgc2VlbiBvbiBhIGdsb2JlXHJcbiAgICogYGBgdGV4dFxyXG4gICAqIOKGkHzihpIgTG9uZ2l0dWRlIChBbmdsZSB0byB0aGUgei1heGlzKSBcclxuICAgKiAg4oaVLSBMYXRpdHVkZSAoQW5nbGUgdG8gdGhlIGVxdWF0b3IpXHJcbiAgICogIC3ihpIgTWFnbml0dWRlIChEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIpICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR2VvMyBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgbWFnbml0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxhdGl0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxvbmdpdHVkZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9sb25naXR1ZGUsIF9sYXRpdHVkZSwgX21hZ25pdHVkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZSBhdCBvbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWFnbml0dWRlID0gX21hZ25pdHVkZTtcclxuICAgICAgdGhpcy5sYXRpdHVkZSA9IF9sYXRpdHVkZTtcclxuICAgICAgdGhpcy5sb25naXR1ZGUgPSBfbG9uZ2l0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgbG9uZ2l0dWRlOiAke3RoaXMubG9uZ2l0dWRlLnRvUHJlY2lzaW9uKDUpfSwgbGF0aXR1ZGU6ICR7dGhpcy5sYXRpdHVkZS50b1ByZWNpc2lvbig1KX0sIG1hZ25pdHVkZTogJHt0aGlzLm1hZ25pdHVkZS50b1ByZWNpc2lvbig1KX1gO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIEZyb20gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xyXG4gIC8vIEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxyXG4gIGV4cG9ydCBmdW5jdGlvbiBNYXNoKCk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCBuOiBudW1iZXIgPSAweGVmYzgyNDlkO1xyXG5cclxuICAgIGxldCBtYXNoOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfZGF0YTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgX2RhdGEgPSBfZGF0YS50b1N0cmluZygpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBuICs9IF9kYXRhLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgbGV0IGg6IG51bWJlciA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xyXG4gICAgICAgIG4gPSBoID4+PiAwO1xyXG4gICAgICAgIGggLT0gbjtcclxuICAgICAgICBoICo9IG47XHJcbiAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIG1hc2gudmVyc2lvbiA9ICdNYXNoIDAuOSc7XHJcbiAgICByZXR1cm4gbWFzaDtcclxuICB9XHJcblxyXG5cclxuICAvLyBGcm9tIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cclxuICBleHBvcnQgZnVuY3Rpb24gTEZJQjQoKTogRnVuY3Rpb24ge1xyXG4gICAgLy8gR2VvcmdlIE1hcnNhZ2xpYSdzIExGSUI0LFxyXG4gICAgLy9odHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvc2NpLmNyeXB0L21zZy9lYjRkZGRlNzgyYjE3MDUxXHJcbiAgICBsZXQgYXJnczogbnVtYmVyW10gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgbGV0IGswOiBudW1iZXIgPSAwLFxyXG4gICAgICBrMTogbnVtYmVyID0gNTgsXHJcbiAgICAgIGsyOiBudW1iZXIgPSAxMTksXHJcbiAgICAgIGszOiBudW1iZXIgPSAxNzg7XHJcblxyXG4gICAgbGV0IHM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgbGV0IG1hc2g6IEZ1bmN0aW9uID0gTWFzaCgpO1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGFyZ3MgPSBbK25ldyBEYXRlKCldO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IDI1NjsgaisrKSB7XHJcbiAgICAgIHNbal0gPSBtYXNoKFwiIFwiKTtcclxuICAgICAgc1tqXSAtPSBtYXNoKFwiIFwiKSAqIDQuNzY4MzcxNTgyMDMxMjVlLTc7IC8vIDJeLTIxXHJcbiAgICAgIGlmIChzW2pdIDwgMCkge1xyXG4gICAgICAgIHNbal0gKz0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IDI1NjsgaisrKSB7XHJcbiAgICAgICAgc1tqXSAtPSBtYXNoKGFyZ3NbaV0pO1xyXG4gICAgICAgIHNbal0gLT0gbWFzaChhcmdzW2ldKSAqIDQuNzY4MzcxNTgyMDMxMjVlLTc7IC8vIDJeLTIxXHJcbiAgICAgICAgaWYgKHNbal0gPCAwKSB7XHJcbiAgICAgICAgICBzW2pdICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtYXNoID0gbnVsbDtcclxuXHJcbiAgICBsZXQgcmFuZG9tOiBGdW5jdGlvbiA9IGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgeDogbnVtYmVyO1xyXG5cclxuICAgICAgazAgPSAoazAgKyAxKSAmIDI1NTtcclxuICAgICAgazEgPSAoazEgKyAxKSAmIDI1NTtcclxuICAgICAgazIgPSAoazIgKyAxKSAmIDI1NTtcclxuICAgICAgazMgPSAoazMgKyAxKSAmIDI1NTtcclxuXHJcbiAgICAgIHggPSBzW2swXSAtIHNbazFdO1xyXG4gICAgICBpZiAoeCA8IDApIHtcclxuICAgICAgICB4ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeCAtPSBzW2syXTtcclxuICAgICAgaWYgKHggPCAwKSB7XHJcbiAgICAgICAgeCArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIHggLT0gc1trM107XHJcbiAgICAgIGlmICh4IDwgMCkge1xyXG4gICAgICAgIHggKz0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHNbazBdID0geDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcmFuZG9tLnVpbnQzMiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIC8vICAgcmV0dXJuIHJhbmRvbSgpICogMHgxMDAwMDAwMDAgPj4+IDA7IC8vIDJeMzJcclxuICAgIC8vIH07XHJcbiAgICAvLyByYW5kb20uZnJhY3Q1MyA9IHJhbmRvbTtcclxuICAgIC8vIHJhbmRvbS52ZXJzaW9uID0gXCJMRklCNCAwLjlcIjtcclxuICAgIC8vIHJhbmRvbS5hcmdzID0gYXJncztcclxuXHJcbiAgICByZXR1cm4gcmFuZG9tO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIHRoZSBtYXRyaXggYXMgdHJhbnNsYXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsaW5nIHtAbGluayBWZWN0b3IyfSwgYmVpbmcgY2FsY3VsYXRlZCBmcm9tIHRoZSBtYXRyaXhcclxuICAgKi9cclxuICBpbnRlcmZhY2UgVmVjdG9yUmVwcmVzZW50YXRpb24ge1xyXG4gICAgdHJhbnNsYXRpb246IFZlY3RvcjI7XHJcbiAgICByb3RhdGlvbjogbnVtYmVyO1xyXG4gICAgc2NhbGluZzogVmVjdG9yMjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpbXBsZSBjbGFzcyBmb3IgM3gzIG1hdHJpeCBvcGVyYXRpb25zXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNYXRyaXgzeDMgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDkpOyAvLyBUaGUgZGF0YSBvZiB0aGUgbWF0cml4LlxyXG4gICAgcHJpdmF0ZSBtdXRhdG9yOiBNdXRhdG9yID0gbnVsbDsgLy8gcHJlcGFyZWQgZm9yIG9wdGltaXphdGlvbiwga2VlcCBtdXRhdG9yIHRvIHJlZHVjZSByZWR1bmRhbnQgY2FsY3VsYXRpb24gYW5kIGZvciBjb21wYXJpc29uLiBTZXQgdG8gbnVsbCB3aGVuIGRhdGEgY2hhbmdlcyFcclxuICAgIHByaXZhdGUgdmVjdG9yczogVmVjdG9yUmVwcmVzZW50YXRpb247IC8vIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVE9ETzogZmlndXJlIG91dCB3aGF0IHRoaXMgaXMgdXNlZCBmb3JcclxuICAgIC8qKiBUT0RPOiBkZXNjcmliZSEgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTihfd2lkdGg6IG51bWJlciwgX2hlaWdodDogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gbmV3IE1hdHJpeDN4MztcclxuICAgICAgbXR4UmVzdWx0LmRhdGEuc2V0KFtcclxuICAgICAgICAyIC8gX3dpZHRoLCAwLCAwLFxyXG4gICAgICAgIDAsIC0yIC8gX2hlaWdodCwgMCxcclxuICAgICAgICAtMSwgMSwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIGEgbmV3IGlkZW50aXR5IG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBJREVOVElUWSgpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLmdldChNYXRyaXgzeDMpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHRyYW5zbGF0ZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtIGFuZCB5LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNMQVRJT04oX3RyYW5zbGF0ZTogVmVjdG9yMik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLFxyXG4gICAgICAgIF90cmFuc2xhdGUueCwgX3RyYW5zbGF0ZS55LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHotYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKiBAcGFyYW0gX2FuZ2xlSW5EZWdyZWVzIFRoZSB2YWx1ZSBvZiB0aGUgcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCBzaW4sIDAsXHJcbiAgICAgICAgLXNpbiwgY29zLCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgc2NhbGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSBhbmQgeS1heGlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTElORyhfc2NhbGFyOiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBfc2NhbGFyLngsIDAsIDAsXHJcbiAgICAgICAgMCwgX3NjYWxhci55LCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHR3byBwYXNzZWQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPRFVDVChfbXR4TGVmdDogTWF0cml4M3gzLCBfbXR4UmlnaHQ6IE1hdHJpeDN4Myk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCBhMDA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMCAqIDMgKyAwXTtcclxuICAgICAgbGV0IGEwMTogbnVtYmVyID0gX210eExlZnQuZGF0YVswICogMyArIDFdO1xyXG4gICAgICBsZXQgYTAyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzAgKiAzICsgMl07XHJcbiAgICAgIGxldCBhMTA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMSAqIDMgKyAwXTtcclxuICAgICAgbGV0IGExMTogbnVtYmVyID0gX210eExlZnQuZGF0YVsxICogMyArIDFdO1xyXG4gICAgICBsZXQgYTEyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzEgKiAzICsgMl07XHJcbiAgICAgIGxldCBhMjA6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMiAqIDMgKyAwXTtcclxuICAgICAgbGV0IGEyMTogbnVtYmVyID0gX210eExlZnQuZGF0YVsyICogMyArIDFdO1xyXG4gICAgICBsZXQgYTIyOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzIgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMDA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMDE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMDI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzAgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMTA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMTE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMTI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzEgKiAzICsgMl07XHJcbiAgICAgIGxldCBiMjA6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMF07XHJcbiAgICAgIGxldCBiMjE6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBiMjI6IG51bWJlciA9IF9tdHhSaWdodC5kYXRhWzIgKiAzICsgMl07XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMCxcclxuICAgICAgICBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjEsXHJcbiAgICAgICAgYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyLFxyXG4gICAgICAgIGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMCxcclxuICAgICAgICBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjEsXHJcbiAgICAgICAgYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyLFxyXG4gICAgICAgIGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMCxcclxuICAgICAgICBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjEsXHJcbiAgICAgICAgYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGludmVyc2Ugb2YgYSBwYXNzZWQgbWF0cml4LlxyXG4gICAgICogQHBhcmFtIF9tdHggVGhlIG1hdHJpeCB0byBjb21wdXRlIHRoZSBpbnZlcnNlIG9mLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX210eDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF9tdHguZGF0YTtcclxuICAgICAgbGV0IG0wMDogbnVtYmVyID0gbVswICogMyArIDBdO1xyXG4gICAgICBsZXQgbTAxOiBudW1iZXIgPSBtWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMDI6IG51bWJlciA9IG1bMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IG0xMDogbnVtYmVyID0gbVsxICogMyArIDBdO1xyXG4gICAgICBsZXQgbTExOiBudW1iZXIgPSBtWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMTI6IG51bWJlciA9IG1bMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IG0yMDogbnVtYmVyID0gbVsyICogMyArIDBdO1xyXG4gICAgICBsZXQgbTIxOiBudW1iZXIgPSBtWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBtMjI6IG51bWJlciA9IG1bMiAqIDMgKyAyXTtcclxuXHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSAxIC9cclxuICAgICAgICAobTAwICogKG0xMSAqIG0yMiAtIG0yMSAqIG0xMikgLVxyXG4gICAgICAgICAgbTAxICogKG0xMCAqIG0yMiAtIG0xMiAqIG0yMCkgK1xyXG4gICAgICAgICAgbTAyICogKG0xMCAqIG0yMSAtIG0xMSAqIG0yMCkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBkICogKG0xMSAqIG0yMiAtIG0yMSAqIG0xMiksIC8vIFswXVxyXG4gICAgICAgIGQgKiAobTAyICogbTIxIC0gbTAxICogbTIyKSwgLy8gWzFdXHJcbiAgICAgICAgZCAqIChtMDEgKiBtMTIgLSBtMDIgKiBtMTEpLCAvLyBbMl1cclxuICAgICAgICBkICogKG0xMiAqIG0yMCAtIG0xMCAqIG0yMiksIC8vIFszXVxyXG4gICAgICAgIGQgKiAobTAwICogbTIyIC0gbTAyICogbTIwKSwgLy8gWzRdXHJcbiAgICAgICAgZCAqIChtMTAgKiBtMDIgLSBtMDAgKiBtMTIpLCAvLyBbNV1cclxuICAgICAgICBkICogKG0xMCAqIG0yMSAtIG0yMCAqIG0xMSksIC8vIFs2XVxyXG4gICAgICAgIGQgKiAobTIwICogbTAxIC0gbTAwICogbTIxKSwgLy8gWzddXHJcbiAgICAgICAgZCAqIChtMDAgKiBtMTEgLSBtMTAgKiBtMDEpIC8vIFs4XVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB7QGxpbmsgVmVjdG9yMn0uICBcclxuICAgICAqICoqQ2F1dGlvbiEqKiBVc2UgaW1tZWRpYXRlbHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGJ5IFJlY3ljbGVyLiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXggaWdub3JpbmcgaXRzIHJvdGF0aW9uIGFuZCBzY2FsaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHJhbnNsYXRpb24oKTogVmVjdG9yMiB7XHJcbiAgICAgIGlmICghdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG5ldyBWZWN0b3IyKHRoaXMuZGF0YVs2XSwgdGhpcy5kYXRhWzddKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbjsgLy8gLmNsb25lO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGlvbihfdHJhbnNsYXRpb246IFZlY3RvcjIpIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfdHJhbnNsYXRpb24uZ2V0KCksIDYpO1xyXG4gICAgICAvLyBubyBmdWxsIGNhY2hlIHJlc2V0IHJlcXVpcmVkXHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IF90cmFuc2xhdGlvbjtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogYSBjb3B5IG9mIHRoZSBjYWxjdWxhdGVkIHJvdGF0aW9uIHtAbGluayBWZWN0b3IyfSAgIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgaWYgKCF0aGlzLnZlY3RvcnMucm90YXRpb24pXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnJvdGF0aW9uID0gdGhpcy5nZXRFdWxlckFuZ2xlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnZlY3RvcnMucm90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJyb3RhdGlvblwiOiBfcm90YXRpb24gfSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIERvIG5vdCBtYW5pcHVsYXRlIHJlc3VsdCwgaW5zdGVhZCBjcmVhdGUgYSBjbG9uZSEgICAgXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzY2FsaW5nKCk6IFZlY3RvcjIge1xyXG4gICAgICBpZiAoIXRoaXMudmVjdG9ycy5zY2FsaW5nKVxyXG4gICAgICAgIHRoaXMudmVjdG9ycy5zY2FsaW5nID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVswXSwgdGhpcy5kYXRhWzFdKSAqICh0aGlzLmRhdGFbMF0gPCAwID8gLTEgOiAxKSxcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzNdLCB0aGlzLmRhdGFbNF0pICogKHRoaXMuZGF0YVs0XSA8IDAgPyAtMSA6IDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy5zY2FsaW5nOyAvLyAuY2xvbmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNjYWxpbmcoX3NjYWxpbmc6IFZlY3RvcjIpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIG1hdHJpeCB0byB0aGUgaWRlbnRpdHktbWF0cml4IGFuZCBjbGVhcnMgY2FjaGUuIFVzZWQgYnkgdGhlIHJlY3ljbGVyIHRvIHJlc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMSwgMCxcclxuICAgICAgICAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2xhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYnkgdGhlIGdpdmVuIHtAbGluayBWZWN0b3IyfSB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZShfYnk6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5UUkFOU0xBVElPTihfYnkpKTtcclxuICAgICAgLy8gVE9ETzogcG9zc2libGUgb3B0aW1pemF0aW9uLCB0cmFuc2xhdGlvbiBtYXkgYWx0ZXIgbXV0YXRvciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LlxyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB4LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVYKF94OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGFbNl0gKz0gX3g7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVZKF95OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGFbN10gKz0gX3k7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMudmVjdG9ycy50cmFuc2xhdGlvbiA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFJvdGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHotQXhpcyB0byB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlKF9hbmdsZUluRGVncmVlczogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBNYXRyaXgzeDMuUk9UQVRJT04oX2FuZ2xlSW5EZWdyZWVzKSk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBNYXRyaXgzeDMuU0NBTElORyhfYnkpKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGFsb25nIHRoZSB4LUF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZVgoX2J5OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9ieSwgMSk7XHJcbiAgICAgIHRoaXMuc2NhbGUodmVjdG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodmVjdG9yKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBhbG9uZyB0aGUgeS1BeGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGVZKF9ieTogbnVtYmVyKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IHdpdGggdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoX210eFJpZ2h0OiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuUFJPRFVDVCh0aGlzLCBfbXR4UmlnaHQpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGV1bGVyLWFuZ2xlcyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcm90YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEV1bGVyQW5nbGUoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHNjYWxpbmc6IFZlY3RvcjIgPSB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICBsZXQgczA6IG51bWJlciA9IHRoaXMuZGF0YVswXSAvIHNjYWxpbmcueDtcclxuICAgICAgbGV0IHMxOiBudW1iZXIgPSB0aGlzLmRhdGFbMV0gLyBzY2FsaW5nLng7XHJcbiAgICAgIGxldCBzMzogbnVtYmVyID0gdGhpcy5kYXRhWzNdIC8gc2NhbGluZy55O1xyXG4gICAgICBsZXQgczQ6IG51bWJlciA9IHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueTtcclxuXHJcbiAgICAgIGxldCB4U2tldzogbnVtYmVyID0gTWF0aC5hdGFuMigtczMsIHM0KTtcclxuICAgICAgbGV0IHlTa2V3OiBudW1iZXIgPSBNYXRoLmF0YW4yKHMwLCBzMSk7XHJcblxyXG4gICAgICBsZXQgc3k6IG51bWJlciA9IE1hdGguaHlwb3QoczAsIHMxKTsgLy8gcHJvYmFibHkgMi4gcGFyYW0gc2hvdWxkIGJlIHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueVxyXG4gICAgICBsZXQgcm90YXRpb246IG51bWJlcjtcclxuXHJcbiAgICAgIGlmICghKHN5ID4gMWUtNikpXHJcbiAgICAgICAgcm90YXRpb24gPSB5U2tldztcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJvdGF0aW9uID0geFNrZXc7XHJcblxyXG4gICAgICByb3RhdGlvbiAqPSBDYWxjLnJhZDJkZWc7XHJcblxyXG4gICAgICByZXR1cm4gcm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpOyAvLyBUT0RPOiBmb3Igbm93IHJlc2V0IHRoZSBjYWNoZSwgYXMgaSBoYXZlIG5vIGlkZWEgaG93IHRoZSBjYWNoaW5nIHdvcmtzIGZvciBtYXRyaXgzeDMuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4M3gzKHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgLy8gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiB0aGlzLnRyYW5zbGF0aW9uLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiBhd2FpdCB0aGlzLnRyYW5zbGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnRyYW5zbGF0aW9uKSxcclxuICAgICAgICByb3RhdGlvbjogX3NlcmlhbGl6YXRpb24ucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogYXdhaXQgdGhpcy5zY2FsaW5nLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnNjYWxpbmcpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMubXV0YXRlKG11dGF0b3IpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgaWYgKHRoaXMubXV0YXRvcilcclxuICAgICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG5cclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgb2xkVHJhbnNsYXRpb246IFZlY3RvcjIgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICBsZXQgb2xkUm90YXRpb246IG51bWJlciA9IHRoaXMucm90YXRpb247XHJcbiAgICAgIGxldCBvbGRTY2FsaW5nOiBWZWN0b3IyID0gdGhpcy5zY2FsaW5nO1xyXG4gICAgICBsZXQgbmV3VHJhbnNsYXRpb246IFZlY3RvcjIgPSA8VmVjdG9yMj5fbXV0YXRvcltcInRyYW5zbGF0aW9uXCJdO1xyXG4gICAgICBsZXQgbmV3Um90YXRpb246IG51bWJlciA9IDxudW1iZXI+X211dGF0b3JbXCJyb3RhdGlvblwiXTtcclxuICAgICAgbGV0IG5ld1NjYWxpbmc6IFZlY3RvcjIgPSA8VmVjdG9yMj5fbXV0YXRvcltcInNjYWxpbmdcIl07XHJcbiAgICAgIGxldCB2ZWN0b3JzOiBWZWN0b3JSZXByZXNlbnRhdGlvbiA9IHsgdHJhbnNsYXRpb246IG9sZFRyYW5zbGF0aW9uLCByb3RhdGlvbjogb2xkUm90YXRpb24sIHNjYWxpbmc6IG9sZFNjYWxpbmcgfTtcclxuICAgICAgaWYgKG5ld1RyYW5zbGF0aW9uKSB7XHJcbiAgICAgICAgdmVjdG9ycy50cmFuc2xhdGlvbiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgbmV3VHJhbnNsYXRpb24ueCAhPSB1bmRlZmluZWQgPyBuZXdUcmFuc2xhdGlvbi54IDogb2xkVHJhbnNsYXRpb24ueCxcclxuICAgICAgICAgIG5ld1RyYW5zbGF0aW9uLnkgIT0gdW5kZWZpbmVkID8gbmV3VHJhbnNsYXRpb24ueSA6IG9sZFRyYW5zbGF0aW9uLnlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2ZWN0b3JzLnJvdGF0aW9uID0gKG5ld1JvdGF0aW9uID09IHVuZGVmaW5lZCkgPyBvbGRSb3RhdGlvbiA6IG5ld1JvdGF0aW9uO1xyXG5cclxuICAgICAgaWYgKG5ld1NjYWxpbmcpIHtcclxuICAgICAgICB2ZWN0b3JzLnNjYWxpbmcgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICAgIG5ld1NjYWxpbmcueCAhPSB1bmRlZmluZWQgPyBuZXdTY2FsaW5nLnggOiBvbGRTY2FsaW5nLngsXHJcbiAgICAgICAgICBuZXdTY2FsaW5nLnkgIT0gdW5kZWZpbmVkID8gbmV3U2NhbGluZy55IDogb2xkU2NhbGluZy55XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVE9ETzogcG9zc2libGUgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdoZW4gb25seSBvbmUgb3IgdHdvIGNvbXBvbmVudHMgY2hhbmdlLCB0aGVuIHVzZSBvbGQgbWF0cml4IGluc3RlYWQgb2YgSURFTlRJVFkgYW5kIHRyYW5zZm9ybSBieSBkaWZmZXJlbmNlcy9xdW90aWVudHNcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICAgIGlmICh2ZWN0b3JzLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgIG10eFJlc3VsdC50cmFuc2xhdGUodmVjdG9ycy50cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICh2ZWN0b3JzLnJvdGF0aW9uKSB7XHJcbiAgICAgICAgbXR4UmVzdWx0LnJvdGF0ZSh2ZWN0b3JzLnJvdGF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmVjdG9ycy5zY2FsaW5nKVxyXG4gICAgICAgIG10eFJlc3VsdC5zY2FsZSh2ZWN0b3JzLnNjYWxpbmcpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcblxyXG4gICAgICB0aGlzLnZlY3RvcnMgPSB2ZWN0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHt9O1xyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHR5cGVzLnRyYW5zbGF0aW9uID0gXCJWZWN0b3IyXCI7XHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiAhPSB1bmRlZmluZWQpIHR5cGVzLnJvdGF0aW9uID0gXCJudW1iZXJcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnNjYWxpbmcpIHR5cGVzLnNjYWxpbmcgPSBcIlZlY3RvcjJcIjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy52ZWN0b3JzID0geyB0cmFuc2xhdGlvbjogbnVsbCwgcm90YXRpb246IG51bGwsIHNjYWxpbmc6IG51bGwgfTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBTdG9yZXMgYSA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFuZCBwcm92aWRlcyBvcGVyYXRpb25zIGZvciBpdC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogWyAwLCAxLCAyLCAzIF0g4oaQIHJvdyB2ZWN0b3IgeFxyXG4gICAqIFsgNCwgNSwgNiwgNyBdIOKGkCByb3cgdmVjdG9yIHlcclxuICAgKiBbIDgsIDksMTAsMTEgXSDihpAgcm93IHZlY3RvciB6XHJcbiAgICogWzEyLDEzLDE0LDE1IF0g4oaQIHRyYW5zbGF0aW9uXHJcbiAgICogICAgICAgICAgICDihpEgIGhvbW9nZW5lb3VzIGNvbHVtblxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTkgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0cml4NHg0IGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgUmVjeWNhYmxlIHtcclxuICAgIHByaXZhdGUgZGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7IC8vIFRoZSBkYXRhIG9mIHRoZSBtYXRyaXguXHJcbiAgICBwcml2YXRlIG11dGF0b3I6IE11dGF0b3IgPSBudWxsOyAvLyBwcmVwYXJlZCBmb3Igb3B0aW1pemF0aW9uLCBrZWVwIG11dGF0b3IgdG8gcmVkdWNlIHJlZHVuZGFudCBjYWxjdWxhdGlvbiBhbmQgZm9yIGNvbXBhcmlzb24uIFNldCB0byBudWxsIHdoZW4gZGF0YSBjaGFuZ2VzIVxyXG5cclxuICAgIHJlYWRvbmx5ICN0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgcmVhZG9ubHkgI3NjYWxpbmc6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgIHJlYWRvbmx5ICNyb3RhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKCk7XHJcbiAgICByZWFkb25seSAjcXVhdGVybmlvbjogUXVhdGVybmlvbiA9IFF1YXRlcm5pb24uSURFTlRJVFkoKTtcclxuXHJcbiAgICAjdHJhbnNsYXRpb25EaXJ0eTogYm9vbGVhbjtcclxuICAgICNzY2FsaW5nRGlydHk6IGJvb2xlYW47XHJcbiAgICAjcm90YXRpb25EaXJ0eTogYm9vbGVhbjtcclxuICAgICNxdWF0ZXJuaW9uRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBJREVOVElUWSgpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcG9zZXMgYSBuZXcgbWF0cml4IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsaW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENPTVBPU0lUSU9OKF90cmFuc2xhdGlvbj86IFZlY3RvcjMsIF9yb3RhdGlvbj86IFZlY3RvcjMgfCBRdWF0ZXJuaW9uLCBfc2NhbGluZz86IFZlY3RvcjMpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgcmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICAgcmVzdWx0Lm11dGF0ZSh7IFwidHJhbnNsYXRpb25cIjogX3RyYW5zbGF0aW9uLCBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiwgXCJzY2FsaW5nXCI6IF9zY2FsaW5nIH0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdHdvIHBhc3NlZCBtYXRyaWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdHhMZWZ0OiBNYXRyaXg0eDQsIF9tdHhSaWdodDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IGE6IEZsb2F0MzJBcnJheSA9IF9tdHhMZWZ0LmRhdGE7XHJcbiAgICAgIGxldCBiOiBGbG9hdDMyQXJyYXkgPSBfbXR4UmlnaHQuZGF0YTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYTAwOiBudW1iZXIgPSBhWzAgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMDE6IG51bWJlciA9IGFbMCAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEwMjogbnVtYmVyID0gYVswICogNCArIDJdO1xyXG4gICAgICBsZXQgYTAzOiBudW1iZXIgPSBhWzAgKiA0ICsgM107XHJcbiAgICAgIGxldCBhMTA6IG51bWJlciA9IGFbMSAqIDQgKyAwXTtcclxuICAgICAgbGV0IGExMTogbnVtYmVyID0gYVsxICogNCArIDFdO1xyXG4gICAgICBsZXQgYTEyOiBudW1iZXIgPSBhWzEgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMTM6IG51bWJlciA9IGFbMSAqIDQgKyAzXTtcclxuICAgICAgbGV0IGEyMDogbnVtYmVyID0gYVsyICogNCArIDBdO1xyXG4gICAgICBsZXQgYTIxOiBudW1iZXIgPSBhWzIgKiA0ICsgMV07XHJcbiAgICAgIGxldCBhMjI6IG51bWJlciA9IGFbMiAqIDQgKyAyXTtcclxuICAgICAgbGV0IGEyMzogbnVtYmVyID0gYVsyICogNCArIDNdO1xyXG4gICAgICBsZXQgYTMwOiBudW1iZXIgPSBhWzMgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMzE6IG51bWJlciA9IGFbMyAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEzMjogbnVtYmVyID0gYVszICogNCArIDJdO1xyXG4gICAgICBsZXQgYTMzOiBudW1iZXIgPSBhWzMgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMDA6IG51bWJlciA9IGJbMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIwMTogbnVtYmVyID0gYlswICogNCArIDFdO1xyXG4gICAgICBsZXQgYjAyOiBudW1iZXIgPSBiWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMDM6IG51bWJlciA9IGJbMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIxMDogbnVtYmVyID0gYlsxICogNCArIDBdO1xyXG4gICAgICBsZXQgYjExOiBudW1iZXIgPSBiWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMTI6IG51bWJlciA9IGJbMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIxMzogbnVtYmVyID0gYlsxICogNCArIDNdO1xyXG4gICAgICBsZXQgYjIwOiBudW1iZXIgPSBiWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBiMjE6IG51bWJlciA9IGJbMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IGIyMjogbnVtYmVyID0gYlsyICogNCArIDJdO1xyXG4gICAgICBsZXQgYjIzOiBudW1iZXIgPSBiWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMzA6IG51bWJlciA9IGJbMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIzMTogbnVtYmVyID0gYlszICogNCArIDFdO1xyXG4gICAgICBsZXQgYjMyOiBudW1iZXIgPSBiWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMzM6IG51bWJlciA9IGJbMyAqIDQgKyAzXTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwICsgYjAzICogYTMwLFxyXG4gICAgICAgIGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMSArIGIwMyAqIGEzMSxcclxuICAgICAgICBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjIgKyBiMDMgKiBhMzIsXHJcbiAgICAgICAgYjAwICogYTAzICsgYjAxICogYTEzICsgYjAyICogYTIzICsgYjAzICogYTMzLFxyXG4gICAgICAgIGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMCArIGIxMyAqIGEzMCxcclxuICAgICAgICBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjEgKyBiMTMgKiBhMzEsXHJcbiAgICAgICAgYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyICsgYjEzICogYTMyLFxyXG4gICAgICAgIGIxMCAqIGEwMyArIGIxMSAqIGExMyArIGIxMiAqIGEyMyArIGIxMyAqIGEzMyxcclxuICAgICAgICBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjAgKyBiMjMgKiBhMzAsXHJcbiAgICAgICAgYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxICsgYjIzICogYTMxLFxyXG4gICAgICAgIGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMiArIGIyMyAqIGEzMixcclxuICAgICAgICBiMjAgKiBhMDMgKyBiMjEgKiBhMTMgKyBiMjIgKiBhMjMgKyBiMjMgKiBhMzMsXHJcbiAgICAgICAgYjMwICogYTAwICsgYjMxICogYTEwICsgYjMyICogYTIwICsgYjMzICogYTMwLFxyXG4gICAgICAgIGIzMCAqIGEwMSArIGIzMSAqIGExMSArIGIzMiAqIGEyMSArIGIzMyAqIGEzMSxcclxuICAgICAgICBiMzAgKiBhMDIgKyBiMzEgKiBhMTIgKyBiMzIgKiBhMjIgKyBiMzMgKiBhMzIsXHJcbiAgICAgICAgYjMwICogYTAzICsgYjMxICogYTEzICsgYjMyICogYTIzICsgYjMzICogYTMzXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHRyYW5zcG9zZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNQT1NFKF9tdHg6IE1hdHJpeDR4NCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBfbXR4LmNsb25lLnRyYW5zcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGludmVyc2Ugb2YgYSBwYXNzZWQgbWF0cml4LlxyXG4gICAgICogQHBhcmFtIF9tdHggVGhlIG1hdHJpeCB0byBjb21wdXRlIHRoZSBpbnZlcnNlIG9mLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX210eDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIF9tdHguY2xvbmUuaW52ZXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgaXRzIHotYXhpcyBwb2ludGluZyBkaXJlY3RseSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0LFxyXG4gICAgICogYW5kIGEgbWluaW1hbCBhbmdsZSBiZXR3ZWVuIGl0cyB5LWF4aXMgYW5kIHRoZSBnaXZlbiB1cC17QGxpbmsgVmVjdG9yM30sIHJlc3BldGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBhbmQgcGl0Y2guXHJcbiAgICAgKiBUaGUgcGl0Y2ggbWF5IGJlIHJlc3RyaWN0ZWQgdG8gdGhlIHVwLXZlY3RvciB0byBvbmx5IGNhbGN1bGF0ZSB5YXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTE9PS19BVChfdHJhbnNsYXRpb246IFZlY3RvcjMsIF90YXJnZXQ6IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpLCBfcmVzdHJpY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCBfdHJhbnNsYXRpb24pO1xyXG4gICAgICB6QXhpcy5ub3JtYWxpemUoKTtcclxuICAgICAgbGV0IHZjdENyb3NzOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKTtcclxuICAgICAgaWYgKHZjdENyb3NzLm1hZ25pdHVkZVNxdWFyZWQgPT0gMCkgLy8gZXhwZXJpbWVudGFsIHdvcmthcm91bmQ6IGlmIHogYW5kIHVwIGlzIHBhcmFsbGVsLCB0aGVyZSBpcyBubyB1cCB0byByZW1haW4uLi5cclxuICAgICAgICB2Y3RDcm9zcy54ID0gMC4wMDE7IC8vIHNvIHRpbHQgYSBsaXR0bGVcclxuICAgICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHZjdENyb3NzKTtcclxuICAgICAgbGV0IHlBeGlzOiBWZWN0b3IzID0gX3Jlc3RyaWN0ID8gX3VwIDogVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoekF4aXMsIHhBeGlzKSk7XHJcbiAgICAgIHpBeGlzID0gX3Jlc3RyaWN0ID8gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoeEF4aXMsIF91cCkpIDogekF4aXM7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgeEF4aXMueCwgeEF4aXMueSwgeEF4aXMueiwgMCxcclxuICAgICAgICB5QXhpcy54LCB5QXhpcy55LCB5QXhpcy56LCAwLFxyXG4gICAgICAgIHpBeGlzLngsIHpBeGlzLnksIHpBeGlzLnosIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLngsXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLnksXHJcbiAgICAgICAgX3RyYW5zbGF0aW9uLnosXHJcbiAgICAgICAgMVxyXG4gICAgICBdKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSh6QXhpcywgeEF4aXMsIHZjdENyb3NzKTsgLy8gZG9uJ3Qgc3RvcmUgeUF4aXMsIGl0IG1pZ2h0IGJlIF91cFxyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIGl0cyB6LWF4aXMgcG9pbnRpbmcgZGlyZWN0bHkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbixcclxuICAgICAqIGFuZCBhIG1pbmltYWwgYW5nbGUgYmV0d2VlbiBpdHMgeS1heGlzIGFuZCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LiBJZGVhbGx5IHVwIHNob3VsZCBiZSBwZXJwZW5kaWN1bGFyIHRvIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTE9PS19JTihfdHJhbnNsYXRpb246IFZlY3RvcjMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKF9kaXJlY3Rpb24pO1xyXG4gICAgICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKSk7XHJcbiAgICAgIGxldCB5QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHpBeGlzLCB4QXhpcykpO1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIHhBeGlzLngsIHhBeGlzLnksIHhBeGlzLnosIDAsXHJcbiAgICAgICAgeUF4aXMueCwgeUF4aXMueSwgeUF4aXMueiwgMCxcclxuICAgICAgICB6QXhpcy54LCB6QXhpcy55LCB6QXhpcy56LCAwLFxyXG4gICAgICAgIF90cmFuc2xhdGlvbi54LCBfdHJhbnNsYXRpb24ueSwgX3RyYW5zbGF0aW9uLnosIDFcclxuICAgICAgXSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUoekF4aXMsIHhBeGlzLCB5QXhpcyk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyBhIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgaXRzIHktYXhpcyBtYXRjaGluZyB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9XHJcbiAgICAgKiBhbmQgaXRzIHotYXhpcyBmYWNpbmcgdG93YXJkcyB0aGUgZ2l2ZW4gdGFyZ2V0IGF0IGEgbWluaW1hbCBhbmdsZSwgcmVzcGV0aXZlbHkgY2FsY3VsYXRpbmcgeWF3IG9ubHkuXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgU0hPV19UTyhfdHJhbnNsYXRpb246IFZlY3RvcjMsIF90YXJnZXQ6IFZlY3RvcjMsIF91cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgpKTogTWF0cml4NHg0IHtcclxuICAgIC8vICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5nZXQoTWF0cml4NHg0KTtcclxuICAgIC8vICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIF90cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIHpBeGlzLm5vcm1hbGl6ZSgpO1xyXG4gICAgLy8gICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyhfdXAsIHpBeGlzKSk7XHJcbiAgICAvLyAgIC8vIGxldCB5QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHpBeGlzLCB4QXhpcykpO1xyXG4gICAgLy8gICB6QXhpcyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihWZWN0b3IzLkNST1NTKHhBeGlzLCBfdXApKTtcclxuICAgIC8vICAgbXR4UmVzdWx0LmRhdGEuc2V0KFxyXG4gICAgLy8gICAgIFtcclxuICAgIC8vICAgICAgIHhBeGlzLngsIHhBeGlzLnksIHhBeGlzLnosIDAsXHJcbiAgICAvLyAgICAgICBfdXAueCwgX3VwLnksIF91cC56LCAwLFxyXG4gICAgLy8gICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgIC8vICAgICAgIF90cmFuc2xhdGlvbi54LFxyXG4gICAgLy8gICAgICAgX3RyYW5zbGF0aW9uLnksXHJcbiAgICAvLyAgICAgICBfdHJhbnNsYXRpb24ueixcclxuICAgIC8vICAgICAgIDFcclxuICAgIC8vICAgICBdKTtcclxuICAgIC8vICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCB0cmFuc2xhdGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSwgeS0gYW5kIHotYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0xBVElPTihfdHJhbnNsYXRlOiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMSwgMCxcclxuICAgICAgICBfdHJhbnNsYXRlLngsIF90cmFuc2xhdGUueSwgX3RyYW5zbGF0ZS56LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHgtYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT05fWChfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbGV0IGFuZ2xlSW5SYWRpYW5zOiBudW1iZXIgPSBfYW5nbGVJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBzaW46IG51bWJlciA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbGV0IGNvczogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIGNvcywgc2luLCAwLFxyXG4gICAgICAgIDAsIC1zaW4sIGNvcywgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgb24gdGhlIHktYXhpcyB3aGVuIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT05fWShfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB6LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1ooX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgY29zLCBzaW4sIDAsIDAsXHJcbiAgICAgICAgLXNpbiwgY29zLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIHJvdGF0aW9uIGV1bGVyIGFuZ2xlcyBvciB1bml0IHF1YXRlcm5pb24gZ2l2ZW4uXHJcbiAgICAgKiBSb3RhdGlvbiBvY2N1cnMgYXJvdW5kIHRoZSBheGlzIGluIHRoZSBvcmRlciBaLVktWCAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX3JvdGF0aW9uOiBWZWN0b3IzIHwgUXVhdGVybmlvbik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtdHhSZXN1bHQuZGF0YSwgX3JvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCBzY2FsZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtLCB5LSBhbmQgei1heGlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTElORyhfc2NhbGFyOiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBfc2NhbGFyLngsIDAsIDAsIDAsXHJcbiAgICAgICAgMCwgX3NjYWxhci55LCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIF9zY2FsYXIueiwgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtYXRyaXggcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGJhc2UuXHJcbiAgICAgKiBJZiBrbm93biwgcGFzcyB0aGUgaW52ZXJzZSBvZiB0aGUgYmFzZSB0byBhdm9pZCB1bm5lY2Nlc2FyeSBjYWxjdWxhdGlvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSRUxBVElWRShfbXR4OiBNYXRyaXg0eDQsIF9tdHhCYXNlOiBNYXRyaXg0eDQsIF9tdHhJbnZlcnNlPzogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKF9tdHhJbnZlcnNlKVxyXG4gICAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVChfbXR4SW52ZXJzZSwgX210eCk7XHJcblxyXG4gICAgICBsZXQgbXR4SW52ZXJzZTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UoX210eEJhc2UpO1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChtdHhJbnZlcnNlLCBfbXR4KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4SW52ZXJzZSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUFJPSkVDVElPTlNcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggdGhhdCBhcHBsaWVzIHBlcnNwZWN0aXZlIHRvIGFuIG9iamVjdCwgaWYgaXRzIHRyYW5zZm9ybSBpcyBtdWx0aXBsaWVkIGJ5IGl0LlxyXG4gICAgICogQHBhcmFtIF9hc3BlY3QgVGhlIGFzcGVjdCByYXRpbyBiZXR3ZWVuIHdpZHRoIGFuZCBoZWlnaHQgb2YgcHJvamVjdGlvbnNwYWNlLihEZWZhdWx0ID0gY2FudmFzLmNsaWVudFdpZHRoIC8gY2FudmFzLkNsaWVudEhlaWdodClcclxuICAgICAqIEBwYXJhbSBfZmllbGRPZlZpZXdJbkRlZ3JlZXMgVGhlIGZpZWxkIG9mIHZpZXcgaW4gRGVncmVlcy4gKERlZmF1bHQgPSA0NSlcclxuICAgICAqIEBwYXJhbSBfbmVhciBUaGUgbmVhciBjbGlwc3BhY2UgYm9yZGVyIG9uIHRoZSB6LWF4aXMuXHJcbiAgICAgKiBAcGFyYW0gX2ZhciBUaGUgZmFyIGNsaXBzcGFjZSBib3JkZXIgb24gdGhlIHotYXhpcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBwbGFuZSBvbiB3aGljaCB0aGUgZmllbGRPZlZpZXctQW5nbGUgaXMgZ2l2ZW4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTl9DRU5UUkFMKF9hc3BlY3Q6IG51bWJlciwgX2ZpZWxkT2ZWaWV3SW5EZWdyZWVzOiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIC8vVE9ETzogY2FtZXJhIGxvb2tzIGRvd24gbmVnYXRpdmUgei1kaXJlY3Rpb24sIHNob3VsZCBiZSBwb3NpdGl2ZVxyXG4gICAgICBsZXQgZmllbGRPZlZpZXdJblJhZGlhbnM6IG51bWJlciA9IF9maWVsZE9mVmlld0luRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IGY6IG51bWJlciA9IE1hdGgudGFuKDAuNSAqIChNYXRoLlBJIC0gZmllbGRPZlZpZXdJblJhZGlhbnMpKTtcclxuICAgICAgbGV0IHJhbmdlSW52OiBudW1iZXIgPSAxLjAgLyAoX25lYXIgLSBfZmFyKTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBmLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIGYsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgKF9uZWFyICsgX2ZhcikgKiByYW5nZUludiwgLTEsXHJcbiAgICAgICAgMCwgMCwgX25lYXIgKiBfZmFyICogcmFuZ2VJbnYgKiAyLCAwXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgaWYgKF9kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5ESUFHT05BTCkge1xyXG4gICAgICAgIF9hc3BlY3QgPSBNYXRoLnNxcnQoX2FzcGVjdCk7XHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbMF0gPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICBtdHhSZXN1bHQuZGF0YVs1XSA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICB9IGVsc2UgaWYgKF9kaXJlY3Rpb24gPT0gRklFTERfT0ZfVklFVy5WRVJUSUNBTClcclxuICAgICAgICBtdHhSZXN1bHQuZGF0YVswXSA9IGYgLyBfYXNwZWN0O1xyXG4gICAgICBlbHNlIC8vRk9WX0RJUkVDVElPTi5IT1JJWk9OVEFMXHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbNV0gPSBmICogX2FzcGVjdDtcclxuXHJcbiAgICAgIC8vIEhBQ0s6IG1hdHJpeCBzaG91bGQgbG9vayBpbiBwb3NpdGl2ZSB6LWRpcmVjdGlvbiwgcHJlZmVyYWJseSB0aGUgbWF0cml4IHNob3VsZCBiZSBjYWxjdWxhdGVkIGxpa2UgdGhhdCByaWdodCBhd2F5XHJcbiAgICAgIG10eFJlc3VsdC5yb3RhdGVZKDE4MCk7XHJcblxyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggdGhhdCBhcHBsaWVzIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHRvIGFuIG9iamVjdCwgaWYgaXRzIHRyYW5zZm9ybSBpcyBtdWx0aXBsaWVkIGJ5IGl0LlxyXG4gICAgICogQHBhcmFtIF9sZWZ0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBsZWZ0IGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfcmlnaHQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHJpZ2h0IGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfYm90dG9tIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBib3R0b20gYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF90b3AgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHRvcCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX25lYXIgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIG5lYXIgYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF9mYXIgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGZhciBib3JkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9KRUNUSU9OX09SVEhPR1JBUEhJQyhfbGVmdDogbnVtYmVyLCBfcmlnaHQ6IG51bWJlciwgX2JvdHRvbTogbnVtYmVyLCBfdG9wOiBudW1iZXIsIF9uZWFyOiBudW1iZXIgPSAtNDAwLCBfZmFyOiBudW1iZXIgPSA0MDApOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIDIgLyAoX3JpZ2h0IC0gX2xlZnQpLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIC0yIC8gKF90b3AgLSBfYm90dG9tKSwgMCwgMCxcclxuICAgICAgICAwLCAwLCAyIC8gKF9mYXIgLSBfbmVhciksIDAsXHJcbiAgICAgICAgKF9sZWZ0ICsgX3JpZ2h0KSAvIChfbGVmdCAtIF9yaWdodCksXHJcbiAgICAgICAgKF9ib3R0b20gKyBfdG9wKSAvIChfYm90dG9tIC0gX3RvcCksXHJcbiAgICAgICAgKF9uZWFyICsgX2ZhcikgLyAoX25lYXIgLSBfZmFyKSxcclxuICAgICAgICAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSByb3RhdGlvbiBwYXJ0IG9mIHRoZSBnaXZlbiBtYXRyaXhlcyBkYXRhIGFycmF5IHRvIHRoZSBnaXZlbiByb3RhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2V0Um90YXRpb24oX206IEZsb2F0MzJBcnJheSwgX3JvdGF0aW9uOiBWZWN0b3IzIHwgUXVhdGVybmlvbik6IHZvaWQge1xyXG4gICAgICBpZiAoX3JvdGF0aW9uIGluc3RhbmNlb2YgVmVjdG9yMykge1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlc1JhZDogVmVjdG9yMyA9IFZlY3RvcjMuU0NBTEUoX3JvdGF0aW9uLCBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICAgIGNvbnN0IHNpblg6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlc1JhZC54KTtcclxuICAgICAgICBjb25zdCBjb3NYOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZXNSYWQueCk7XHJcbiAgICAgICAgY29uc3Qgc2luWTogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVzUmFkLnkpO1xyXG4gICAgICAgIGNvbnN0IGNvc1k6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlc1JhZC55KTtcclxuICAgICAgICBjb25zdCBzaW5aOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZXNSYWQueik7XHJcbiAgICAgICAgY29uc3QgY29zWjogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVzUmFkLnopO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGFuZ2xlc1JhZCk7XHJcblxyXG4gICAgICAgIF9tWzBdID0gY29zWiAqIGNvc1k7IC8qKi8gICAgICAgICAgICAgICAgIF9tWzFdID0gc2luWiAqIGNvc1k7IC8qKi8gICAgICAgICAgICAgICAgIF9tWzJdID0gLXNpblk7XHJcbiAgICAgICAgX21bNF0gPSBjb3NaICogc2luWSAqIHNpblggLSBzaW5aICogY29zWDsgX21bNV0gPSBzaW5aICogc2luWSAqIHNpblggKyBjb3NaICogY29zWDsgX21bNl0gPSBjb3NZICogc2luWDtcclxuICAgICAgICBfbVs4XSA9IGNvc1ogKiBzaW5ZICogY29zWCArIHNpblogKiBzaW5YOyBfbVs5XSA9IHNpblogKiBzaW5ZICogY29zWCAtIGNvc1ogKiBzaW5YOyBfbVsxMF0gPSBjb3NZICogY29zWDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByb3RhdGlvbk5vcm1hbGl6ZWQ6IFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLk5PUk1BTElaQVRJT04oX3JvdGF0aW9uKTtcclxuICAgICAgICBjb25zdCB4OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQueCwgeTogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLnksIHo6IG51bWJlciA9IHJvdGF0aW9uTm9ybWFsaXplZC56LCB3OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQudztcclxuICAgICAgICBjb25zdCB4eDogbnVtYmVyID0geCAqIHgsIHh5OiBudW1iZXIgPSB4ICogeSwgeHo6IG51bWJlciA9IHggKiB6LCB4dzogbnVtYmVyID0geCAqIHc7XHJcbiAgICAgICAgY29uc3QgeXk6IG51bWJlciA9IHkgKiB5LCB5ejogbnVtYmVyID0geSAqIHosIHl3OiBudW1iZXIgPSB5ICogdztcclxuICAgICAgICBjb25zdCB6ejogbnVtYmVyID0geiAqIHosIHp3OiBudW1iZXIgPSB6ICogdztcclxuICAgICAgICBjb25zdCB3dzogbnVtYmVyID0gdyAqIHc7XHJcblxyXG4gICAgICAgIF9tWzBdID0gd3cgKyB4eCAtIHl5IC0geno7IF9tWzFdID0gMiAqICh4eSArIHp3KTsvKiovIF9tWzJdID0gMiAqICh4eiAtIHl3KTtcclxuICAgICAgICBfbVs0XSA9IDIgKiAoeHkgLSB6dyk7LyoqLyBfbVs1XSA9IHd3IC0geHggKyB5eSAtIHp6OyBfbVs2XSA9IDIgKiAoeXogKyB4dyk7XHJcbiAgICAgICAgX21bOF0gPSAyICogKHh6ICsgeXcpOy8qKi8gX21bOV0gPSAyICogKHl6IC0geHcpOy8qKi8gX21bMTBdID0gd3cgLSB4eCAtIHl5ICsgeno7XHJcblxyXG4gICAgICAgIC8vIF9tWzBdID0gMSAtIDIgKiAoeXkgKyB6eik7IF9tWzFdID0gMiAqICh4eSArIHp3KTsvKiovIF9tWzJdID0gMiAqICh4eiAtIHl3KTtcclxuICAgICAgICAvLyBfbVs0XSA9IDIgKiAoeHkgLSB6dyk7LyoqLyBfbVs1XSA9IDEgLSAyICogKHh4ICsgenopOyBfbVs2XSA9IDIgKiAoeXogKyB4dyk7XHJcbiAgICAgICAgLy8gX21bOF0gPSAyICogKHh6ICsgeXcpOy8qKi8gX21bOV0gPSAyICogKHl6IC0geHcpOy8qKi8gX21bMTBdID0gMSAtIDIgKiAoeHggKyB5eSk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUocm90YXRpb25Ob3JtYWxpemVkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uICBBY2Nlc3NvcnNcclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeCBpZ25vcmluZyBpdHMgcm90YXRpb24gYW5kIHNjYWxpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0cmFuc2xhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uRGlydHkpIHtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbi5zZXQodGhpcy5kYXRhWzEyXSwgdGhpcy5kYXRhWzEzXSwgdGhpcy5kYXRhWzE0XSk7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb25EaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiN0cmFuc2xhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdHJhbnNsYXRpb24oX3RyYW5zbGF0aW9uOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJ0cmFuc2xhdGlvblwiOiBfdHJhbnNsYXRpb24gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcm90YXRpb24ge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNyb3RhdGlvbkRpcnR5KSB7XHJcbiAgICAgICAgbGV0IHNjYWxpbmc6IFZlY3RvcjMgPSB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGxldCBzMDogbnVtYmVyID0gdGhpcy5kYXRhWzBdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzMTogbnVtYmVyID0gdGhpcy5kYXRhWzFdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzMjogbnVtYmVyID0gdGhpcy5kYXRhWzJdIC8gc2NhbGluZy54O1xyXG4gICAgICAgIGxldCBzNjogbnVtYmVyID0gdGhpcy5kYXRhWzZdIC8gc2NhbGluZy55O1xyXG4gICAgICAgIGxldCBzMTA6IG51bWJlciA9IHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLno7XHJcblxyXG4gICAgICAgIGxldCBzeTogbnVtYmVyID0gTWF0aC5oeXBvdChzMCwgczEpOyAvLyBwcm9iYWJseSAyLiBwYXJhbSBzaG91bGQgYmUgdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55XHJcblxyXG4gICAgICAgIGxldCBzaW5ndWxhcjogYm9vbGVhbiA9IHN5IDwgMWUtNjsgLy8gSWZcclxuXHJcbiAgICAgICAgbGV0IHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHoxOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHoyOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmICghc2luZ3VsYXIpIHtcclxuICAgICAgICAgIHgxID0gTWF0aC5hdGFuMihzNiwgczEwKTtcclxuICAgICAgICAgIHkxID0gTWF0aC5hdGFuMigtczIsIHN5KTtcclxuICAgICAgICAgIHoxID0gTWF0aC5hdGFuMihzMSwgczApO1xyXG5cclxuICAgICAgICAgIHgyID0gTWF0aC5hdGFuMigtczYsIC1zMTApO1xyXG4gICAgICAgICAgeTIgPSBNYXRoLmF0YW4yKC1zMiwgLXN5KTtcclxuICAgICAgICAgIHoyID0gTWF0aC5hdGFuMigtczEsIC1zMCk7XHJcblxyXG4gICAgICAgICAgaWYgKE1hdGguYWJzKHgyKSArIE1hdGguYWJzKHkyKSArIE1hdGguYWJzKHoyKSA8IE1hdGguYWJzKHgxKSArIE1hdGguYWJzKHkxKSArIE1hdGguYWJzKHoxKSkge1xyXG4gICAgICAgICAgICB4MSA9IHgyO1xyXG4gICAgICAgICAgICB5MSA9IHkyO1xyXG4gICAgICAgICAgICB6MSA9IHoyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB4MSA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs5XSAvIHNjYWxpbmcueiwgdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55KTtcclxuICAgICAgICAgIHkxID0gTWF0aC5hdGFuMigtdGhpcy5kYXRhWzJdIC8gc2NhbGluZy54LCBzeSk7XHJcbiAgICAgICAgICB6MSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5zZXQoeDEsIHkxLCB6MSk7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb24uc2NhbGUoQ2FsYy5yYWQyZGVnKTtcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90YXRpb24oX3JvdGF0aW9uOiBRdWF0ZXJuaW9uIHwgVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwicm90YXRpb25cIjogX3JvdGF0aW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxpbmcge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IGVmZmVjdCB0aGUgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc2NhbGluZygpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3NjYWxpbmdEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuI3NjYWxpbmcuc2V0KFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdKSwgLy8qICh0aGlzLmRhdGFbMF0gPCAwID8gLTEgOiAxKSxcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSksIC8vKiAodGhpcy5kYXRhWzVdIDwgMCA/IC0xIDogMSksXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdKSAvLyAqICh0aGlzLmRhdGFbMTBdIDwgMCA/IC0xIDogMSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5kZXRlcm1pbmFudCA8IDApIC8vIOKaoO+4j0VYUEVSTUlORVRBTCBmcm9tIHRocmVlIGpzOiBpZiBkZXRlcm1pbmFudCBpcyBuZWdhdGl2ZSwgaW52ZXJ0IG9uZSBzY2FsZVxyXG4gICAgICAgIC8vICAgdGhpcy4jc2NhbGluZy54ID0gLXRoaXMuI3NjYWxpbmcueDtcclxuXHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjYWxpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNjYWxpbmcoX3NjYWxpbmc6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHVuaXQgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSBxdWF0ZXJuaW9uIGlzIGdvaW5nIHRvIGJlIHJldXNlZCBpbnRlcm5hbGx5LiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBxdWF0ZXJuaW9uKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBpZiAodGhpcy4jcXVhdGVybmlvbkRpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5ldWxlckFuZ2xlcyA9IHRoaXMucm90YXRpb247XHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNxdWF0ZXJuaW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBxdWF0ZXJuaW9uKF9xdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uKSB7XHJcbiAgICAgIHRoaXMubXV0YXRlKHsgXCJyb3RhdGlvblwiOiBfcXVhdGVybmlvbiB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoaXMgbWF0cml4LiBDb21wdXRhdGlvbmFsIGhlYXZ5IG9wZXJhdGlvbiwgbm90IGNhY2hlZCBzbyB1c2Ugd2l0aCBjYXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGRldGVybWluYW50KCk6IG51bWJlciB7XHJcbiAgICAgIGNvbnN0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgIGNvbnN0IGRldDAwOiBudW1iZXIgPSBtWzEwXSAqIG1bMTVdIC0gbVsxMV0gKiBtWzE0XTtcclxuICAgICAgY29uc3QgZGV0MDE6IG51bWJlciA9IG1bOV0gKiBtWzE1XSAtIG1bMTFdICogbVsxM107XHJcbiAgICAgIGNvbnN0IGRldDAyOiBudW1iZXIgPSBtWzldICogbVsxNF0gLSBtWzEwXSAqIG1bMTNdO1xyXG4gICAgICBjb25zdCBkZXQwMzogbnVtYmVyID0gbVs4XSAqIG1bMTVdIC0gbVsxMV0gKiBtWzEyXTtcclxuICAgICAgY29uc3QgZGV0MDQ6IG51bWJlciA9IG1bOF0gKiBtWzE0XSAtIG1bMTBdICogbVsxMl07XHJcbiAgICAgIGNvbnN0IGRldDA1OiBudW1iZXIgPSBtWzhdICogbVsxM10gLSBtWzldICogbVsxMl07XHJcblxyXG4gICAgICBjb25zdCBkZXQ6IG51bWJlciA9XHJcbiAgICAgICAgbVswXSAqIChtWzVdICogZGV0MDAgLSBtWzZdICogZGV0MDEgKyBtWzddICogZGV0MDIpIC1cclxuICAgICAgICBtWzFdICogKG1bNF0gKiBkZXQwMCAtIG1bNl0gKiBkZXQwMyArIG1bN10gKiBkZXQwNCkgK1xyXG4gICAgICAgIG1bMl0gKiAobVs0XSAqIGRldDAxIC0gbVs1XSAqIGRldDAzICsgbVs3XSAqIGRldDA1KSAtXHJcbiAgICAgICAgbVszXSAqIChtWzRdICogZGV0MDIgLSBtWzVdICogZGV0MDQgKyBtWzZdICogZGV0MDUpO1xyXG5cclxuICAgICAgcmV0dXJuIGRldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgeC1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJpZ2h0KCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgcmlnaHQ6IFZlY3RvcjMgPSB0aGlzLmdldFgoKTtcclxuICAgICAgcmlnaHQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiByaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgeS1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHVwKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSB0aGlzLmdldFkoKTtcclxuICAgICAgdXAubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiB1cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2FyZGluYWwgei1heGlzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZvcndhcmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBmb3J3YXJkOiBWZWN0b3IzID0gdGhpcy5nZXRaKCk7XHJcbiAgICAgIGZvcndhcmQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBmb3J3YXJkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS4gVXNlZCBieSB0aGUgcmVjeWNsZXIgdG8gcmVzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zcG9zZSB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNwb3NlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIHRoaXMuc2V0KFtcclxuICAgICAgICBtWzBdLCBtWzRdLCBtWzhdLCBtWzEyXSxcclxuICAgICAgICBtWzFdLCBtWzVdLCBtWzldLCBtWzEzXSxcclxuICAgICAgICBtWzJdLCBtWzZdLCBtWzEwXSwgbVsxNF0sXHJcbiAgICAgICAgbVszXSwgbVs3XSwgbVsxMV0sIG1bMTVdXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludmVydCB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52ZXJ0KCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIGxldCBtMDA6IG51bWJlciA9IG1bMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0wMTogbnVtYmVyID0gbVswICogNCArIDFdO1xyXG4gICAgICBsZXQgbTAyOiBudW1iZXIgPSBtWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMDM6IG51bWJlciA9IG1bMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IG0xMDogbnVtYmVyID0gbVsxICogNCArIDBdO1xyXG4gICAgICBsZXQgbTExOiBudW1iZXIgPSBtWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMTI6IG51bWJlciA9IG1bMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0xMzogbnVtYmVyID0gbVsxICogNCArIDNdO1xyXG4gICAgICBsZXQgbTIwOiBudW1iZXIgPSBtWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBtMjE6IG51bWJlciA9IG1bMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IG0yMjogbnVtYmVyID0gbVsyICogNCArIDJdO1xyXG4gICAgICBsZXQgbTIzOiBudW1iZXIgPSBtWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBtMzA6IG51bWJlciA9IG1bMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0zMTogbnVtYmVyID0gbVszICogNCArIDFdO1xyXG4gICAgICBsZXQgbTMyOiBudW1iZXIgPSBtWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMzM6IG51bWJlciA9IG1bMyAqIDQgKyAzXTtcclxuICAgICAgbGV0IHRtcDA6IG51bWJlciA9IG0yMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDE6IG51bWJlciA9IG0zMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDI6IG51bWJlciA9IG0xMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDM6IG51bWJlciA9IG0zMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDQ6IG51bWJlciA9IG0xMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDU6IG51bWJlciA9IG0yMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDY6IG51bWJlciA9IG0wMiAqIG0zMztcclxuICAgICAgbGV0IHRtcDc6IG51bWJlciA9IG0zMiAqIG0wMztcclxuICAgICAgbGV0IHRtcDg6IG51bWJlciA9IG0wMiAqIG0yMztcclxuICAgICAgbGV0IHRtcDk6IG51bWJlciA9IG0yMiAqIG0wMztcclxuICAgICAgbGV0IHRtcDEwOiBudW1iZXIgPSBtMDIgKiBtMTM7XHJcbiAgICAgIGxldCB0bXAxMTogbnVtYmVyID0gbTEyICogbTAzO1xyXG4gICAgICBsZXQgdG1wMTI6IG51bWJlciA9IG0yMCAqIG0zMTtcclxuICAgICAgbGV0IHRtcDEzOiBudW1iZXIgPSBtMzAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAxNDogbnVtYmVyID0gbTEwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTU6IG51bWJlciA9IG0zMCAqIG0xMTtcclxuICAgICAgbGV0IHRtcDE2OiBudW1iZXIgPSBtMTAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAxNzogbnVtYmVyID0gbTIwICogbTExO1xyXG4gICAgICBsZXQgdG1wMTg6IG51bWJlciA9IG0wMCAqIG0zMTtcclxuICAgICAgbGV0IHRtcDE5OiBudW1iZXIgPSBtMzAgKiBtMDE7XHJcbiAgICAgIGxldCB0bXAyMDogbnVtYmVyID0gbTAwICogbTIxO1xyXG4gICAgICBsZXQgdG1wMjE6IG51bWJlciA9IG0yMCAqIG0wMTtcclxuICAgICAgbGV0IHRtcDIyOiBudW1iZXIgPSBtMDAgKiBtMTE7XHJcbiAgICAgIGxldCB0bXAyMzogbnVtYmVyID0gbTEwICogbTAxO1xyXG5cclxuICAgICAgbGV0IHQwOiBudW1iZXIgPSAodG1wMCAqIG0xMSArIHRtcDMgKiBtMjEgKyB0bXA0ICogbTMxKSAtXHJcbiAgICAgICAgKHRtcDEgKiBtMTEgKyB0bXAyICogbTIxICsgdG1wNSAqIG0zMSk7XHJcblxyXG4gICAgICBsZXQgdDE6IG51bWJlciA9ICh0bXAxICogbTAxICsgdG1wNiAqIG0yMSArIHRtcDkgKiBtMzEpIC1cclxuICAgICAgICAodG1wMCAqIG0wMSArIHRtcDcgKiBtMjEgKyB0bXA4ICogbTMxKTtcclxuICAgICAgbGV0IHQyOiBudW1iZXIgPSAodG1wMiAqIG0wMSArIHRtcDcgKiBtMTEgKyB0bXAxMCAqIG0zMSkgLVxyXG4gICAgICAgICh0bXAzICogbTAxICsgdG1wNiAqIG0xMSArIHRtcDExICogbTMxKTtcclxuICAgICAgbGV0IHQzOiBudW1iZXIgPSAodG1wNSAqIG0wMSArIHRtcDggKiBtMTEgKyB0bXAxMSAqIG0yMSkgLVxyXG4gICAgICAgICh0bXA0ICogbTAxICsgdG1wOSAqIG0xMSArIHRtcDEwICogbTIxKTtcclxuXHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSAxLjAgLyAobTAwICogdDAgKyBtMTAgKiB0MSArIG0yMCAqIHQyICsgbTMwICogdDMpO1xyXG5cclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIGQgKiB0MCwgLy8gWzBdXHJcbiAgICAgICAgZCAqIHQxLCAvLyBbMV1cclxuICAgICAgICBkICogdDIsIC8vIFsyXVxyXG4gICAgICAgIGQgKiB0MywgLy8gWzNdXHJcbiAgICAgICAgZCAqICgodG1wMSAqIG0xMCArIHRtcDIgKiBtMjAgKyB0bXA1ICogbTMwKSAtICh0bXAwICogbTEwICsgdG1wMyAqIG0yMCArIHRtcDQgKiBtMzApKSwgICAgICAgIC8vIFs0XVxyXG4gICAgICAgIGQgKiAoKHRtcDAgKiBtMDAgKyB0bXA3ICogbTIwICsgdG1wOCAqIG0zMCkgLSAodG1wMSAqIG0wMCArIHRtcDYgKiBtMjAgKyB0bXA5ICogbTMwKSksICAgICAgICAvLyBbNV1cclxuICAgICAgICBkICogKCh0bXAzICogbTAwICsgdG1wNiAqIG0xMCArIHRtcDExICogbTMwKSAtICh0bXAyICogbTAwICsgdG1wNyAqIG0xMCArIHRtcDEwICogbTMwKSksICAgICAgLy8gWzZdXHJcbiAgICAgICAgZCAqICgodG1wNCAqIG0wMCArIHRtcDkgKiBtMTAgKyB0bXAxMCAqIG0yMCkgLSAodG1wNSAqIG0wMCArIHRtcDggKiBtMTAgKyB0bXAxMSAqIG0yMCkpLCAgICAgIC8vIFs3XVxyXG4gICAgICAgIGQgKiAoKHRtcDEyICogbTEzICsgdG1wMTUgKiBtMjMgKyB0bXAxNiAqIG0zMykgLSAodG1wMTMgKiBtMTMgKyB0bXAxNCAqIG0yMyArIHRtcDE3ICogbTMzKSksICAvLyBbOF1cclxuICAgICAgICBkICogKCh0bXAxMyAqIG0wMyArIHRtcDE4ICogbTIzICsgdG1wMjEgKiBtMzMpIC0gKHRtcDEyICogbTAzICsgdG1wMTkgKiBtMjMgKyB0bXAyMCAqIG0zMykpLCAgLy8gWzldXHJcbiAgICAgICAgZCAqICgodG1wMTQgKiBtMDMgKyB0bXAxOSAqIG0xMyArIHRtcDIyICogbTMzKSAtICh0bXAxNSAqIG0wMyArIHRtcDE4ICogbTEzICsgdG1wMjMgKiBtMzMpKSwgIC8vIFsxMF1cclxuICAgICAgICBkICogKCh0bXAxNyAqIG0wMyArIHRtcDIwICogbTEzICsgdG1wMjMgKiBtMjMpIC0gKHRtcDE2ICogbTAzICsgdG1wMjEgKiBtMTMgKyB0bXAyMiAqIG0yMykpLCAgLy8gWzExXVxyXG4gICAgICAgIGQgKiAoKHRtcDE0ICogbTIyICsgdG1wMTcgKiBtMzIgKyB0bXAxMyAqIG0xMikgLSAodG1wMTYgKiBtMzIgKyB0bXAxMiAqIG0xMiArIHRtcDE1ICogbTIyKSksICAvLyBbMTJdXHJcbiAgICAgICAgZCAqICgodG1wMjAgKiBtMzIgKyB0bXAxMiAqIG0wMiArIHRtcDE5ICogbTIyKSAtICh0bXAxOCAqIG0yMiArIHRtcDIxICogbTMyICsgdG1wMTMgKiBtMDIpKSwgIC8vIFsxM11cclxuICAgICAgICBkICogKCh0bXAxOCAqIG0xMiArIHRtcDIzICogbTMyICsgdG1wMTUgKiBtMDIpIC0gKHRtcDIyICogbTMyICsgdG1wMTQgKiBtMDIgKyB0bXAxOSAqIG0xMikpLCAgLy8gWzE0XVxyXG4gICAgICAgIGQgKiAoKHRtcDIyICogbTIyICsgdG1wMTYgKiBtMDIgKyB0bXAyMSAqIG0xMikgLSAodG1wMjAgKiBtMTIgKyB0bXAyMyAqIG0yMiArIHRtcDE3ICogbTAyKSkgIC8vIFsxNV1cclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2xhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYnkgdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfSB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqIElmIF9sb2NhbCBpcyB0cnVlLCB0aGUgdHJhbnNsYXRpb24gb2NjdXJzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3RhdGlvbiBhbmQgc2NhbGluZyBvZiB0aGlzIG1hdHJpeCxcclxuICAgICAqIG90aGVyd2lzZSwgaXQgb2NjdXJzIGFjY29yZGluZyB0byB0aGUgcGFyZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMywgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmIChfbG9jYWwpIHtcclxuICAgICAgICBsZXQgbXR4VHJhbnNsYXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5UUkFOU0xBVElPTihfYnkpO1xyXG4gICAgICAgIGxldCByb3RhdGlvbkRpcnR5OiBib29sZWFuID0gdGhpcy4jcm90YXRpb25EaXJ0eTsgLy8gcHJlc2VydmUgZGlydHkgZmxhZ3MgZm9yIHJvdGF0aW9uIGFuZCBzY2FsaW5nIGFzIHRoZXkgYXJlIG5vdCBhZmZlY3RlZCBieSB0cmFuc2xhdGlvblxyXG4gICAgICAgIGxldCBzY2FsaW5nRGlydHk6IGJvb2xlYW4gPSB0aGlzLiNzY2FsaW5nRGlydHk7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBseShtdHhUcmFuc2xhdGlvbik7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHJvdGF0aW9uRGlydHk7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gc2NhbGluZ0RpcnR5O1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFRyYW5zbGF0aW9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGFbMTJdICs9IF9ieS54O1xyXG4gICAgICAgIHRoaXMuZGF0YVsxM10gKz0gX2J5Lnk7XHJcbiAgICAgICAgdGhpcy5kYXRhWzE0XSArPSBfYnkuejtcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zdCBtYXRyaXg6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5NVUxUSVBMSUNBVElPTih0aGlzLCBNYXRyaXg0eDQuVFJBTlNMQVRJT04oX2J5KSk7XHJcbiAgICAgIC8vIC8vIFRPRE86IHBvc3NpYmxlIG9wdGltaXphdGlvbiwgdHJhbnNsYXRpb24gbWF5IGFsdGVyIG11dGF0b3IgaW5zdGVhZCBvZiBkZWxldGluZyBpdC5cclxuICAgICAgLy8gdGhpcy5zZXQobWF0cml4KTtcclxuICAgICAgLy8gUmVjeWNsZXIuc3RvcmUobWF0cml4KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVgoX3g6IG51bWJlciwgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWChfeCk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlKHRyYW5zbGF0aW9uLCBfbG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2xhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVZKF95OiBudW1iZXIsIF9sb2NhbDogYm9vbGVhbiA9IHRydWUpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlkoX3kpO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZSh0cmFuc2xhdGlvbiwgX2xvY2FsKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgei1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlWihfejogbnVtYmVyLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aKF96KTtcclxuICAgICAgdGhpcy50cmFuc2xhdGUodHJhbnNsYXRpb24sIF9sb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUm90YXRpb25cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB0aGlzIG1hdHJpeCBieSBnaXZlbiB7QGxpbmsgVmVjdG9yM30gaW4gdGhlIG9yZGVyIFosIFksIFguIFJpZ2h0IGhhbmQgcm90YXRpb24gaXMgdXNlZCwgdGh1bWIgcG9pbnRzIGluIGF4aXMgZGlyZWN0aW9uLCBmaW5nZXJzIGN1cmxpbmcgaW5kaWNhdGUgcm90YXRpb25cclxuICAgICAqIFRoZSByb3RhdGlvbiBpcyBhcHBlbmRlZCB0byBhbHJlYWR5IGFwcGxpZWQgdHJhbnNmb3JtcywgdGh1cyBtdWx0aXBsaWVkIGZyb20gdGhlIHJpZ2h0LiBTZXQgX2Zyb21MZWZ0IHRvIHRydWUgdG8gc3dpdGNoIGFuZCBwdXQgaXQgaW4gZnJvbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGUoX2J5OiBWZWN0b3IzIHwgUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihfYnkpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgeC1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlWChfYW5nbGVJbkRlZ3JlZXM6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9YKF9hbmdsZUluRGVncmVlcyk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4Um90YXRpb24sIF9mcm9tTGVmdCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYXJvdW5kIHRoZSB5LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVZKF9hbmdsZUluRGVncmVlczogbnVtYmVyLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1koX2FuZ2xlSW5EZWdyZWVzKTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZVooX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWihfYW5nbGVJbkRlZ3JlZXMpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgcm90YXRpb24gb2YgdGhpcyBtYXRyaXggdG8gcG9pbnQgdGhlIHotYXhpcyBkaXJlY3RseSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0IGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LFxyXG4gICAgICogcmVzcGVjdGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBhbmQgcGl0Y2guIElmIG5vIHVwLXtAbGluayBWZWN0b3IzfSBpcyBnaXZlbiwgdGhlIHByZXZpb3VzIHVwLXtAbGluayBWZWN0b3IzfSBpcyB1c2VkLiBcclxuICAgICAqIFRoZSBwaXRjaCBtYXkgYmUgcmVzdHJpY3RlZCB0byB0aGUgdXAtdmVjdG9yIHRvIG9ubHkgY2FsY3VsYXRlIHlhdy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvb2tBdChfdGFyZ2V0OiBWZWN0b3IzLCBfdXA/OiBWZWN0b3IzLCBfcmVzdHJpY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIF91cCA9IF91cCA/IFZlY3RvcjMuTk9STUFMSVpBVElPTihfdXApIDogdGhpcy51cDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy50cmFuc2xhdGlvbiwgX3RhcmdldCwgX3VwLCBfcmVzdHJpY3QpO1xyXG4gICAgICBtdHhSZXN1bHQuc2NhbGUodGhpcy5zY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIGFsaWduIHRoZSB6LWF4aXMgd2l0aCB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LlxyXG4gICAgICogVXAgc2hvdWxkIGJlIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWYgbm8gdXAtdmVjdG9yIGlzIHByb3ZpZGVkLCB7QGxpbmsgdXB9IGlzIHVzZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb29rSW4oX2RpcmVjdGlvbjogVmVjdG9yMywgX3VwOiBWZWN0b3IzID0gdGhpcy51cCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odGhpcy50cmFuc2xhdGlvbiwgX2RpcmVjdGlvbiwgX3VwKTtcclxuICAgICAgbXR4UmVzdWx0LnNjYWxlKHRoaXMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTYW1lIGFzIHtAbGluayBNYXRyaXg0eDQubG9va0F0fSwgYnV0IG9wdGltaXplZCBhbmQgbmVlZHMgdGVzdGluZ1xyXG4gICAgICovXHJcbiAgICAvLyBUT0RPOiB0ZXN0aW5nIGxvb2thdCB0aGF0IHJlYWxseSBqdXN0IHJvdGF0ZXMgdGhlIG1hdHJpeCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmVcclxuICAgIC8vIHB1YmxpYyBsb29rQXRSb3RhdGUoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3ByZXNlcnZlU2NhbGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFfdXApXHJcbiAgICAvLyAgICAgX3VwID0gdGhpcy5nZXRZKCk7XHJcblxyXG4gICAgLy8gICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMuc2NhbGluZztcclxuICAgIC8vICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy50cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIGRpZmZlcmVuY2Uubm9ybWFsaXplKCk7XHJcbiAgICAvLyAgIGxldCBjb3M6IG51bWJlciA9IFZlY3RvcjMuRE9UKFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmdldFooKSksIGRpZmZlcmVuY2UpO1xyXG4gICAgLy8gICBsZXQgc2luOiBudW1iZXIgPSBWZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRYKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgLy8gICAgIDAsIDEsIDAsIDAsXHJcbiAgICAvLyAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIC8vICAgY29zID0gVmVjdG9yMy5ET1QoVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHRoaXMuZ2V0WigpKSwgZGlmZmVyZW5jZSk7XHJcbiAgICAvLyAgIHNpbiA9IC1WZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRZKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgMSwgMCwgMCwgMCxcclxuICAgIC8vICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgIC8vICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG4gICAgLy8gICB0aGlzLnNjYWxpbmcgPSBzY2FsaW5nO1xyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IzLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFNjYWxpbmc6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKF9ieSk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4U2NhbGluZywgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2NhbGluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfYnksIDEsIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWShfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnksIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWihfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCAxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbWF0cml4OiBNYXRyaXg0eDQsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBfZnJvbUxlZnQgPyBNYXRyaXg0eDQuUFJPRFVDVChfbWF0cml4LCB0aGlzKSA6IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMsIF9tYXRyaXgpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBwdWJsaWMgZ2V0RXVsZXJBbmdsZXNOZXcoKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgIC8vICAgbGV0IHRoZXRhWDogbnVtYmVyLCB0aGV0YVk6IG51bWJlciwgdGhldGFaOiBudW1iZXI7XHJcbiAgICAvLyAgIGxldCByMDI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcuejtcclxuICAgIC8vICAgbGV0IHIxMTogbnVtYmVyID0gdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55O1xyXG5cclxuICAgIC8vICAgaWYgKHIwMiA8IDEpIHtcclxuICAgIC8vICAgICBpZiAocjAyID4gLTEpIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguYXNpbigtcjAyKTtcclxuICAgIC8vICAgICAgIHRoZXRhWiA9IE1hdGguYXRhbjIodGhpcy5kYXRhWzFdIC8gc2NhbGluZy55LCB0aGlzLmRhdGFbMF0gLyBzY2FsaW5nLngpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gTWF0aC5hdGFuMih0aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLnopO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgICAgdGhldGFaID0gLU1hdGguYXRhbjIodGhpcy5kYXRhWzZdIC8gc2NhbGluZy55LCByMTEpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gMDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgZWxzZSB7XHJcbiAgICAvLyAgICAgdGhldGFZID0gLU1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgIHRoZXRhWiA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueSwgcjExKTtcclxuICAgIC8vICAgICB0aGV0YVggPSAwO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgtdGhldGFYLCB0aGV0YVksIHRoZXRhWik7XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKE1hdGhlbWF0aWMucmFkMmRlZyk7XHJcblxyXG4gICAgLy8gICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3RyYW5zbGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3JvdGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IF9vcmlnaW5hbC4jc2NhbGluZ0RpcnR5O1xyXG4gICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBfb3JpZ2luYWwuI3F1YXRlcm5pb25EaXJ0eTtcclxuICAgICAgaWYgKCF0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KVxyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uLmNvcHkoX29yaWdpbmFsLiN0cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICghdGhpcy4jcm90YXRpb25EaXJ0eSlcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5jb3B5KF9vcmlnaW5hbC4jcm90YXRpb24pO1xyXG4gICAgICBpZiAoIXRoaXMuI3NjYWxpbmdEaXJ0eSlcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLmNvcHkoX29yaWdpbmFsLiNzY2FsaW5nKTtcclxuICAgICAgaWYgKCF0aGlzLiNxdWF0ZXJuaW9uRGlydHkpXHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5jb3B5KF9vcmlnaW5hbC4jcXVhdGVybmlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4NHg0KHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIC8vIFRPRE86IG9wdGltaXphdGlvbiwgaXQgc2hvdWxkbid0IGFsd2F5cyByZXR1cm4gYSBjb3B5LCBzaW5jZSB0aGlzIGJsb2F0cyBtZW1vcnlcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB4LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFgoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB5LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB6LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFooKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHR3byBjYXJkaW5hbCBheGlzIGFuZCByZXZlcnNlcyB0aGUgdGhpcmQsIGVmZmVjdGl2ZWx5IHJvdGF0aW5nIHRoZSB0cmFuc2Zvcm0gMTgwIGRlZ3JlZXMgYXJvdW5kIG9uZSBhbmQgOTAgZGVncmVlcyBhcm91bmQgYSBzZWNvbmQgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3dhcFhZKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGVtcDogbnVtYmVyW10gPSBbdGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXV07IC8vIHN0b3JlIHgtYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KFt0aGlzLmRhdGFbNF0sIHRoaXMuZGF0YVs1XSwgdGhpcy5kYXRhWzZdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA0KTsgLy8gb3ZlcndyaXRlIFkgd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbOF0sIC10aGlzLmRhdGFbOV0sIC10aGlzLmRhdGFbMTBdXSwgOCk7IC8vIHJldmVyc2Ugei1heGlzXHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgdHdvIGNhcmRpbmFsIGF4aXMgYW5kIHJldmVyc2VzIHRoZSB0aGlyZCwgZWZmZWN0aXZlbHkgcm90YXRpbmcgdGhlIHRyYW5zZm9ybSAxODAgZGVncmVlcyBhcm91bmQgb25lIGFuZCA5MCBkZWdyZWVzIGFyb3VuZCBhIHNlY29uZCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2FwWFooKTogdm9pZCB7XHJcbiAgICAgIGxldCB0ZW1wOiBudW1iZXJbXSA9IFt0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdXTsgLy8gc3RvcmUgeC1heGlzXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoW3RoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB6LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA4KTsgLy8gb3ZlcndyaXRlIFogd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbNF0sIC10aGlzLmRhdGFbNV0sIC10aGlzLmRhdGFbNl1dLCA0KTsgLy8gcmV2ZXJzZSB5LWF4aXNcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN3YXBzIHRoZSB0d28gY2FyZGluYWwgYXhpcyBhbmQgcmV2ZXJzZXMgdGhlIHRoaXJkLCBlZmZlY3RpdmVseSByb3RhdGluZyB0aGUgdHJhbnNmb3JtIDE4MCBkZWdyZWVzIGFyb3VuZCBvbmUgYW5kIDkwIGRlZ3JlZXMgYXJvdW5kIGEgc2Vjb25kIGF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN3YXBZWigpOiB2b2lkIHtcclxuICAgICAgbGV0IHRlbXA6IG51bWJlcltdID0gW3RoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl1dOyAvLyBzdG9yZSB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldChbdGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF1dLCA0KTsgLy8gb3ZlcndyaXRlIHktYXhpcyB3aXRoIHotYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KHRlbXAsIDgpOyAvLyBvdmVyd3JpdGUgWiB3aXRoIHRlbXBcclxuICAgICAgdGhpcy5kYXRhLnNldChbLXRoaXMuZGF0YVswXSwgLXRoaXMuZGF0YVsxXSwgLXRoaXMuZGF0YVsyXV0sIDApOyAvLyByZXZlcnNlIHgtYXhpc1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRyYW5sYXRpb24gZnJvbSB0aGlzIG1hdHJpeCB0byB0aGUgdGFyZ2V0IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRpb25UbyhfbXR4VGFyZ2V0OiBNYXRyaXg0eDQpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGRpZmZlcmVuY2Uuc2V0KF9tdHhUYXJnZXQuZGF0YVsxMl0gLSB0aGlzLmRhdGFbMTJdLCBfbXR4VGFyZ2V0LmRhdGFbMTNdIC0gdGhpcy5kYXRhWzEzXSwgX210eFRhcmdldC5kYXRhWzE0XSAtIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBhd2FpdCB0aGlzLnJvdGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJvdGF0aW9uKSxcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHtcclxuICAgICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICAgIHRyYW5zbGF0aW9uLm11dGF0ZShfbXV0YXRvci50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgbVsxMl0gPSB0cmFuc2xhdGlvbi54OyBtWzEzXSA9IHRyYW5zbGF0aW9uLnk7IG1bMTRdID0gdHJhbnNsYXRpb24uejtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiB8fCBfbXV0YXRvci5zY2FsaW5nKSB7XHJcbiAgICAgICAgLy8gVE9ETzogbWFrZSBmdWxsIHZlY3RvciBhbmQgcXVhdGVybmlvbiBtdXRhdG9ycyBtYW5kYXRvcnk/XHJcblxyXG4gICAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24gPSBfbXV0YXRvci5yb3RhdGlvbj8udyAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgdGhpcy4jcXVhdGVybmlvbiA6IC8vIHVzaW5nIHRoaXMuI3F1YXRlcm5pb24gYXNzdW1lcyB3ZSBnZXQgYSBmdWxsIHF1YXRlcm5pb24gbXV0YXRvciB3aXRoIHgsIHksIHogYW5kIHcgc2V0IHNvIHdlIG5ldmVyIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gaGVyZS4gVGhpcyBtaWdodCBjYXVzZSB0cm91YmxlIGlmIHdlIGV2ZXIgd2FudCB0byBtdXRhdGUgb25seSBhIHBhcnQgb2YgYSBxdWF0ZXJuaW9uLi4uXHJcbiAgICAgICAgICBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yLnJvdGF0aW9uKSA/IHRoaXMuI3JvdGF0aW9uIDogdGhpcy5yb3RhdGlvbjsgLy8gaGFjayB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9uIG9mIHJvdGF0aW9uIGFuZCBzY2FsaW5nLiBUaGlzIHJlY2FsY3VsYXRpb24gaXMgdW5uZWNlc3Nhcnkgd2hlbiB3ZSBnZXQgYSBmdWxsIG11dGF0b3IgaS5lLiB3aXRoIHgsIHkgYW5kIHogc2V0XHJcblxyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gaXNGdWxsVmVjdG9yTXV0YXRvcihfbXV0YXRvci5zY2FsaW5nKSA/IHRoaXMuI3NjYWxpbmcgOiB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbilcclxuICAgICAgICAgIHJvdGF0aW9uLm11dGF0ZShfbXV0YXRvci5yb3RhdGlvbik7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5zY2FsaW5nKVxyXG4gICAgICAgICAgc2NhbGluZy5tdXRhdGUoX211dGF0b3Iuc2NhbGluZyk7XHJcblxyXG4gICAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtLCByb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgaXNFdWxlclJvdGF0aW9uOiBib29sZWFuID0gcm90YXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSAhaXNFdWxlclJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IGlzRXVsZXJSb3RhdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3g6IG51bWJlciA9IHNjYWxpbmcueCwgc3k6IG51bWJlciA9IHNjYWxpbmcueSwgc3o6IG51bWJlciA9IHNjYWxpbmcuejtcclxuICAgICAgICBtWzBdICo9IHN4OyBtWzFdICo9IHN4OyBtWzJdICo9IHN4O1xyXG4gICAgICAgIG1bNF0gKj0gc3k7IG1bNV0gKj0gc3k7IG1bNl0gKj0gc3k7XHJcbiAgICAgICAgbVs4XSAqPSBzejsgbVs5XSAqPSBzejsgbVsxMF0gKj0gc3o7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcblxyXG4gICAgICBmdW5jdGlvbiBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yICYmIF9tdXRhdG9yLnggIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnkgIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnogIT0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjNcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uKSB0eXBlcy5yb3RhdGlvbiA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIE5vaXNlMiwgTm9pc2UzIGFuZCBOb2lzZTRcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vaXNlIHtcclxuICAgIHByb3RlY3RlZCBwZXJtOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoNTEyKTtcclxuICAgIHByb3RlY3RlZCBwZXJtTW9kMTI6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSg1MTIpO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgYmV0d2VlbiAtMSBhbmQgMSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IHNhbXBsZTogKC4uLl9hcmdzOiBudW1iZXJbXSkgPT4gbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIGNvbnN0IHA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjU2OyBpKyspXHJcbiAgICAgICAgcFtpXSA9IGk7XHJcblxyXG4gICAgICBsZXQgbjogbnVtYmVyO1xyXG4gICAgICBsZXQgcTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyNTU7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBuID0gTWF0aC5mbG9vcigoaSArIDEpICogX3JhbmRvbSgpKTtcclxuICAgICAgICBxID0gcFtpXTtcclxuICAgICAgICBwW2ldID0gcFtuXTtcclxuICAgICAgICBwW25dID0gcTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDUxMjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5wZXJtW2ldID0gcFtpICYgMjU1XTtcclxuICAgICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuL05vaXNlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2UyIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoMy4wIC0gTWF0aC5zcXJ0KDMuMCkpIC8gNi4wO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JhZGllbnQ6IG51bWJlcltdW10gPSBbWzEsIDFdLCBbLTEsIDFdLCBbMSwgLTFdLCBbLTEsIC0xXSwgWzEsIDBdLCBbLTEsIDBdLCBbMSwgMF0sIFstMSwgMF0sIFswLCAxXSwgWzAsIC0xXSwgWzAsIDFdLCBbMCwgLTFdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kpICogMC41ICogKE1hdGguc3FydCgzLjApIC0gMS4wKTsgLy8gSGFpcnkgZmFjdG9yIGZvciAyRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgdDogbnVtYmVyID0gKGkgKyBqKSAqIE5vaXNlMi5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSkgc3BhY2VcclxuICAgICAgICBjb25zdCBZMDogbnVtYmVyID0gaiAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXHJcbiAgICAgICAgY29uc3QgeTA6IG51bWJlciA9IF95IC0gWTA7XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpbi5cclxuICAgICAgICBjb25zdCBpMTogbnVtYmVyID0geDAgPiB5MCA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoxOiBudW1iZXIgPSB4MCA+IHkwID8gMCA6IDE7XHJcblxyXG4gICAgICAgIC8vIE9mZnNldDpudW1iZXJzIGZvciBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgeDE6IG51bWJlciA9IHgwIC0gaTEgKyBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2UyLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MjogbnVtYmVyID0geDAgLSAxLjAgKyAyLjAgKiBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkyOiBudW1iZXIgPSB5MCAtIDEuMCArIDIuMCAqIE5vaXNlMi5vZmZzZXQ7XHJcblxyXG4gICAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgdGhyZWUgc2ltcGxleCBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgaWk6IG51bWJlciA9IGkgJiAyNTU7XHJcbiAgICAgICAgY29uc3Qgamo6IG51bWJlciA9IGogJiAyNTU7XHJcbiAgICAgICAgY29uc3QgZzA6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgdGhpcy5wZXJtW2pqXV1dO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlMi5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIGkxICsgdGhpcy5wZXJtW2pqICsgajFdXV07XHJcbiAgICAgICAgY29uc3QgZzI6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgMSArIHRoaXMucGVybVtqaiArIDFdXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMCA/IDAuMCA6IE1hdGgucG93KHQwLCA0KSAqIChnMFswXSAqIHgwICsgZzBbMV0gKiB5MCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHQxOiBudW1iZXIgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwID8gMC4wIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxKTtcclxuXHJcbiAgICAgICAgY29uc3QgdDI6IG51bWJlciA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDAgPyAwLjAgOiBNYXRoLnBvdyh0MiwgNCkgKiAoZzJbMF0gKiB4MiArIGcyWzFdICogeTIpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggY29ybmVyIHRvIGdldCB0aGUgZmluYWwgbm9pc2UgdmFsdWUuXHJcbiAgICAgICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLCAxXVxyXG4gICAgICAgIHJldHVybiA3MC4xNDgwNTc3MDY1Mzk1MiAqIChuMCArIG4xICsgbjIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYW1wbGUgPSAoX3g6IG51bWJlciwgX3k6IG51bWJlcik6IG51bWJlciA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzYW1wbGUoX3gsIF95KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyBhbiBhZGFwdGlvbiBvZiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mYXN0LXNpbXBsZXgtbm9pc2VcclxuICAgKiBkb25lIGJ5IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICpcclxuICAgKiBCYXNlZCBvbiBleGFtcGxlIGNvZGUgYnkgU3RlZmFuIEd1c3RhdnNvbiAoc3RlZ3VAaXRuLmxpdS5zZSkuXHJcbiAgICogT3B0aW1pc2F0aW9ucyBieSBQZXRlciBFYXN0bWFuIChwZWFzdG1hbkBkcml6emxlLnN0YW5mb3JkLmVkdSkuXHJcbiAgICogQmV0dGVyIHJhbmsgb3JkZXJpbmcgbWV0aG9kIGJ5IFN0ZWZhbiBHdXN0YXZzb24gaW4gMjAxMi5cclxuICAgKlxyXG4gICAqIFRoaXMgY29kZSB3YXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IGl0cyBvcmlnaW5hbCBhdXRob3IsXHJcbiAgICogU3RlZmFuIEd1c3RhdnNvbi4gWW91IG1heSB1c2UgaXQgYXMgeW91IHNlZSBmaXQsIGJ1dFxyXG4gICAqIGF0dHJpYnV0aW9uIGlzIGFwcHJlY2lhdGVkLlxyXG4gICAqL1xyXG4gIC8vIFRPRE86IFRlc3RcclxuICBleHBvcnQgY2xhc3MgTm9pc2UzIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAxLjAgLyA2LjA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncmFkaWVudDogbnVtYmVyW11bXSA9IFtbMSwgMSwgMF0sIFstMSwgMSwgMF0sIFsxLCAtMSwgMF0sIFstMSwgLTEsIDBdLCBbMSwgMCwgMV0sIFstMSwgMCwgMV0sIFsxLCAwLCAtMV0sIFstMSwgMCwgLTFdLCBbMCwgMSwgMV0sIFswLCAtMSwgLTFdLCBbMCwgMSwgLTFdLCBbMCwgLTEsIC0xXVxyXG4gICAgXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kgKyBfeikgLyAzLjA7IC8vIFZlcnkgbmljZSBhbmQgc2ltcGxlIHNrZXcgZmFjdG9yIGZvciAzRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgazogbnVtYmVyID0gTWF0aC5mbG9vcihfeiArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGspICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCBYMDogbnVtYmVyID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCB4MDogbnVtYmVyID0gX3ggLSBYMDsgLy8gVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG5cclxuICAgICAgICAvLyBEZXRlcmluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpblxyXG4gICAgICAgIGxldCBpMTogbnVtYmVyLCBqMTogbnVtYmVyLCBrMTogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xyXG4gICAgICAgICAgO1xyXG4gICAgICAgIGxldCBpMjogbnVtYmVyLCBqMjogbnVtYmVyLCBrMjogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXHJcbiAgICAgICAgICA7XHJcbiAgICAgICAgaWYgKHgwID49IHkwKSB7XHJcbiAgICAgICAgICBpZiAoeTAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGoyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGsyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoeDAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGoyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGsxID0gaTIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBqMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh5MCA8IHowKSB7XHJcbiAgICAgICAgICAgIGsxID0gajIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBpMiA9IDA7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHgwIDwgejApIHtcclxuICAgICAgICAgICAgajEgPSBqMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgaTEgPSBrMSA9IGkyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGoxID0gaTIgPSBqMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gazEgPSBrMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlMy5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MTogbnVtYmVyID0geTAgLSBqMSArIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejE6IG51bWJlciA9IHowIC0gazEgKyBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2UzLm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXHJcbiAgICAgICAgY29uc3QgeTI6IG51bWJlciA9IHkwIC0gajIgKyAyLjAgKiBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHoyOiBudW1iZXIgPSB6MCAtIGsyICsgMi4wICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSAxLjAgKyAzLjAgKiBOb2lzZTMub2Zmc2V0OyAvLyBPZmZzZXRzIGZvciBsYXN0IGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIDEuMCArIDMuMCAqIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejM6IG51bWJlciA9IHowIC0gMS4wICsgMy4wICogTm9pc2UzLm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayA6bnVtYmVydXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmb3VyIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtra11dXV07XHJcbiAgICAgICAgY29uc3QgZzE6IG51bWJlcltdID0gTm9pc2UzLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgaTEgKyB0aGlzLnBlcm1bamogKyBqMSArIHRoaXMucGVybVtrayArIGsxXV1dXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTMuZ3JhZGllbnRbdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV1dO1xyXG4gICAgICAgIGNvbnN0IGczOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIDEgKyB0aGlzLnBlcm1bamogKyAxICsgdGhpcy5wZXJtW2trICsgMV1dXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1Om51bWJlcmF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIGZvdXIgY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IHQwOiBudW1iZXIgPSAwLjUgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDAsIDQpICogKGcwWzBdICogeDAgKyBnMFsxXSAqIHkwICsgZzBbMl0gKiB6MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MSwgNCkgKiAoZzFbMF0gKiB4MSArIGcxWzFdICogeTEgKyBnMVsyXSAqIHoxKTtcclxuICAgICAgICBjb25zdCB0MjogbnVtYmVyID0gMC41IC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIpO1xyXG4gICAgICAgIGNvbnN0IHQzOiBudW1iZXIgPSAwLjUgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejM7XHJcbiAgICAgICAgY29uc3QgbjM6IG51bWJlciA9IHQzIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDMsIDQpICogKGczWzBdICogeDMgKyBnM1sxXSAqIHkzICsgZzNbMl0gKiB6Myk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cclxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIHNjYWxlZCB0byBzdGF5IGp1c3QgaW5zaWRlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA5NC42ODQ5MzE1MDY4MTk3MiAqIChuMCArIG4xICsgbjIgKyBuMyk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhbXBsZSA9IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NhbXBsZShfeCwgX3ksIF96KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gVE9ETzogVGVzdFxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2U0IGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoNS4wIC0gTWF0aC5zcXJ0KDUuMCkpIC8gMjAuMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGdyYWRpZW50OiBudW1iZXJbXVtdID0gW1swLCAxLCAxLCAxXSwgWzAsIDEsIDEsIC0xXSwgWzAsIDEsIC0xLCAxXSwgWzAsIDEsIC0xLCAtMV0sIFswLCAtMSwgMSwgMV0sIFswLCAtMSwgMSwgLTFdLCBbMCwgLTEsIC0xLCAxXSwgWzAsIC0xLCAtMSwgLTFdLCBbMSwgMCwgMSwgMV0sIFsxLCAwLCAxLCAtMV0sIFsxLCAwLCAtMSwgMV0sIFsxLCAwLCAtMSwgLTFdLCBbLTEsIDAsIDEsIDFdLCBbLTEsIDAsIDEsIC0xXSwgWy0xLCAwLCAtMSwgMV0sIFstMSwgMCwgLTEsIC0xXSwgWzEsIDEsIDAsIDFdLCBbMSwgMSwgMCwgLTFdLCBbMSwgLTEsIDAsIDFdLCBbMSwgLTEsIDAsIC0xXSwgWy0xLCAxLCAwLCAxXSwgWy0xLCAxLCAwLCAtMV0sIFstMSwgLTEsIDAsIDFdLCBbLTEsIC0xLCAwLCAtMV0sIFsxLCAxLCAxLCAwXSwgWzEsIDEsIC0xLCAwXSwgWzEsIC0xLCAxLCAwXSwgWzEsIC0xLCAtMSwgMF0sIFstMSwgMSwgMSwgMF0sIFstMSwgMSwgLTEsIDBdLCBbLTEsIC0xLCAxLCAwXSwgWy0xLCAtMSwgLTEsIDBdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyLCBfdzogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIC8vIFNrZXcgdGhlICh4LHkseix3KSBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbCBvZiAyNCBzaW1wbGljZXMgd2UncmUgaW5cclxuICAgICAgICBjb25zdCBzOiBudW1iZXIgPSAoX3ggKyBfeSArIF96ICsgX3cpICogKE1hdGguc3FydCg1LjApIC0gMS4wKSAvIDQuMDsgLy8gRmFjdG9yIGZvciA0RCBza2V3aW5nXHJcbiAgICAgICAgY29uc3QgaTogbnVtYmVyID0gTWF0aC5mbG9vcihfeCArIHMpO1xyXG4gICAgICAgIGNvbnN0IGo6IG51bWJlciA9IE1hdGguZmxvb3IoX3kgKyBzKTtcclxuICAgICAgICBjb25zdCBrOiBudW1iZXIgPSBNYXRoLmZsb29yKF96ICsgcyk7XHJcbiAgICAgICAgY29uc3QgbDogbnVtYmVyID0gTWF0aC5mbG9vcihfdyArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGsgKyBsKSAqIE5vaXNlNC5vZmZzZXQ7IC8vIEZhY3RvciBmb3IgNEQgdW5za2V3aW5nXHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6LHcpIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCBXMDogbnVtYmVyID0gbCAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkseix3IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG4gICAgICAgIGNvbnN0IHcwOiBudW1iZXIgPSBfdyAtIFcwO1xyXG5cclxuICAgICAgICAvLyBUbyBmaW5kIG91dCB3aGljaCBvZiB0aGUgMjQgcG9zc2libGUgc2ltcGxpY2VzIHdlJ3JlIGluLCB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGVcclxuICAgICAgICAvLyBtYWduaXR1ZGUgb3JkZXJpbmcgb2YgeDAsIHkwLCB6MCBhbmQgdzAuIFNpeCBwYWlyLXdpc2UgY29tcGFyaXNvbnMgYXJlIHBlcmZvcm1lZCBiZXR3ZWVuXHJcbiAgICAgICAgLy8gZWFjaCBwb3NzaWJsZSBwYWlyIG9mIHRoZSBmb3VyIGNvb3JkaW5hdGVzLCBhbmQgdGhlIHJlc3VsdHMgYXJlIHVzZWQgdG8gcmFuayB0aGUgbnVtYmVycy5cclxuICAgICAgICBsZXQgcmFua3g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmt5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5rejogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFua3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKHgwID4geTApIHJhbmt4Kys7XHJcbiAgICAgICAgZWxzZSByYW5reSsrO1xyXG4gICAgICAgIGlmICh4MCA+IHowKSByYW5reCsrO1xyXG4gICAgICAgIGVsc2UgcmFua3orKztcclxuICAgICAgICBpZiAoeDAgPiB3MCkgcmFua3grKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcbiAgICAgICAgaWYgKHkwID4gejApIHJhbmt5Kys7XHJcbiAgICAgICAgZWxzZSByYW5reisrO1xyXG4gICAgICAgIGlmICh5MCA+IHcwKSByYW5reSsrO1xyXG4gICAgICAgIGVsc2UgcmFua3crKztcclxuICAgICAgICBpZiAoejAgPiB3MCkgcmFua3orKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcblxyXG4gICAgICAgIC8vIHNpbXBsZXhbY10gaXMgYSA0LXZlY3RvciB3aXRoIHRoZSBudW1iZXJzIDAsIDEsIDIgYW5kIDMgaW4gc29tZSBvcmRlci5cclxuICAgICAgICAvLyBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dyBtYWtlcyB4PHosIHk8dyBhbmQgeDx3XHJcbiAgICAgICAgLy8gaW1wb3NzaWJsZS4gT25seSB0aGUgMjQgaW5kaWNlcyB3aGljaCBoYXZlIG5vbi16ZXJvIGVudHJpZXMgbWFrZSBhbnkgc2Vuc2UuXHJcbiAgICAgICAgLy8gV2UgdXNlIGEgdGhyZXNob2xkaW5nIHRvIHNldCB0aGUgY29vcmRpbmF0ZXMgaW4gdHVybiBmcm9tIHRoZSBsYXJnZXN0IG1hZ25pdHVkZS5cclxuICAgICAgICAvLyBSYW5rIDMgZGVub3RlcyB0aGUgbGFyZ2VzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkxOiBudW1iZXIgPSByYW5reCA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajE6IG51bWJlciA9IHJhbmt5ID49IDMgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMTogbnVtYmVyID0gcmFua3ogPj0gMyA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwxOiBudW1iZXIgPSByYW5rdyA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgLy8gUmFuayA6IDIgZGVub3RlcyB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS5cclxuICAgICAgICBjb25zdCBpMjogbnVtYmVyID0gcmFua3ggPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoyOiBudW1iZXIgPSByYW5reSA+PSAyID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgazI6IG51bWJlciA9IHJhbmt6ID49IDIgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBsMjogbnVtYmVyID0gcmFua3cgPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIC8vIFJhbmsgOiAxIGRlbm90ZXMgdGhlIHNlY29uZCBzbWFsbGVzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkzOiBudW1iZXIgPSByYW5reCA+PSAxID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajM6IG51bWJlciA9IHJhbmt5ID49IDEgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMzogbnVtYmVyID0gcmFua3ogPj0gMSA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwzOiBudW1iZXIgPSByYW5rdyA+PSAxID8gMSA6IDA7XHJcblxyXG4gICAgICAgIC8vIFRoZSBmaWZ0aCBjb3JuZXIgaGFzIGFsbCBjb29yZGluYXRlIG9mZnNldHMgPSAxLCBzbyBubyBuZWVkIHRvIGNvbXB1dGUgdGhhdC5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MTogbnVtYmVyID0gejAgLSBrMSArIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzE6IG51bWJlciA9IHcwIC0gbDEgKyBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2U0Lm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MjogbnVtYmVyID0geTAgLSBqMiArIDIuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejI6IG51bWJlciA9IHowIC0gazIgKyAyLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHcyOiBudW1iZXIgPSB3MCAtIGwyICsgMi4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSBpMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGZvdXJ0aCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIGozICsgMy4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MzogbnVtYmVyID0gejAgLSBrMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzM6IG51bWJlciA9IHcwIC0gbDMgKyAzLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHg0OiBudW1iZXIgPSB4MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5NDogbnVtYmVyID0geTAgLSAxLjAgKyA0LjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHo0OiBudW1iZXIgPSB6MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzQ6IG51bWJlciA9IHcwIC0gMS4wICsgNC4wICogTm9pc2U0Lm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayBvdXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmaXZlIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGxsOiBudW1iZXIgPSBsICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtrayArIHRoaXMucGVybVtsbF1dXV0gJVxyXG4gICAgICAgICAgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyBpMSArIHRoaXMucGVybVtqaiArIGoxICsgdGhpcy5wZXJtW2trICsgazEgKyB0aGlzLnBlcm1bbGwgKyBsMV1dXVxyXG4gICAgICAgICAgXSAlIDMyXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTQuZ3JhZGllbnRbXHJcbiAgICAgICAgICB0aGlzLnBlcm1bXHJcbiAgICAgICAgICAgIGlpICsgaTIgKyB0aGlzLnBlcm1bamogKyBqMiArIHRoaXMucGVybVtrayArIGsyICsgdGhpcy5wZXJtW2xsICsgbDJdXV1cclxuICAgICAgICAgIF0gJSAzMlxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZzM6IG51bWJlcltdID0gTm9pc2U0LmdyYWRpZW50W1xyXG4gICAgICAgICAgdGhpcy5wZXJtW1xyXG4gICAgICAgICAgICBpaSArIGkzICsgdGhpcy5wZXJtW2pqICsgajMgKyB0aGlzLnBlcm1ba2sgKyBrMyArIHRoaXMucGVybVtsbCArIGwzXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGc0OiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDEgKyB0aGlzLnBlcm1bbGwgKyAxXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmaXZlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTAgLSB6MCAqIHowIC0gdzAgKiB3MDtcclxuICAgICAgICBjb25zdCBuMDogbnVtYmVyID0gdDAgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MCwgNCkgKiAoZzBbMF0gKiB4MCArIGcwWzFdICogeTAgKyBnMFsyXSAqIHowICsgZzBbM10gKiB3MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MSAtIHcxICogdzE7XHJcbiAgICAgICAgY29uc3QgbjE6IG51bWJlciA9IHQxIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxICsgZzFbMl0gKiB6MSArIGcxWzNdICogdzEpO1xyXG4gICAgICAgIGNvbnN0IHQyOiBudW1iZXIgPSAwLjUgLSB4MiAqIHgyIC0geTIgKiB5MiAtIHoyICogejIgLSB3MiAqIHcyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIgKyBnMlszXSAqIHcyKTtcclxuICAgICAgICBjb25zdCB0MzogbnVtYmVyID0gMC41IC0geDMgKiB4MyAtIHkzICogeTMgLSB6MyAqIHozIC0gdzMgKiB3MztcclxuICAgICAgICBjb25zdCBuMzogbnVtYmVyID0gdDMgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MywgNCkgKiAoZzNbMF0gKiB4MyArIGczWzFdICogeTMgKyBnM1syXSAqIHozICsgZzNbM10gKiB3Myk7XHJcbiAgICAgICAgY29uc3QgdDQ6IG51bWJlciA9IDAuNSAtIHg0ICogeDQgLSB5NCAqIHk0IC0gejQgKiB6NCAtIHc0ICogdzQ7XHJcbiAgICAgICAgY29uc3QgbjQ6IG51bWJlciA9IHQ0IDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDQsIDQpICogKGc0WzBdICogeDQgKyBnNFsxXSAqIHk0ICsgZzRbMl0gKiB6NCArIGc0WzNdICogdzQpO1xyXG5cclxuICAgICAgICAvLyBTdW0gdXAgYW5kIHNjYWxlIHRoZSByZXN1bHQgdG8gY292ZXIgdGhlIHJhbmdlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA3Mi4zNzg1NTc2NTE1MzY2NSAqIChuMCArIG4xICsgbjIgKyBuMyArIG40KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2FtcGxlKF94LCBfeSwgX3osIF93KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIFN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyByb3RhdGlvbnMgaW4gdGhlIGZvcm0gb2YgcXVhdGVybmlvbnMuXHJcbiAgICAqIENvbnN0cnVjdGVkIG91dCBvZiB0aGUgNCBjb21wb25lbnRzOiAoeCwgeSwgeiwgdykuIE1hdGhlbWF0aWNhbCBub3RhdGlvbjogdyArIHhpICsgeWogKyB6ay5cclxuICAgICogQSBRdWF0ZXJuaW9uIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhbiBheGlzIGFuZCBhbmdsZTogKHgsIHksIHopID0gc2luKGFuZ2xlLzIpKmF4aXM7IHcgPSBjb3MoYW5nbGUvMikuXHJcbiAgICAqIHJvbGw6IHgsIHBpdGNoOiB5LCB5YXc6IHouIE5vdGUgdGhhdCBvcGVyYXRpb25zIGFyZSBhZGFwdGVkIHRvIHdvcmsgd2l0aCB2ZWN0b3JzIHdoZXJlIHkgaXMgdXAgYW5kIHogaXMgZm9yd2FyZC5cclxuICAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgejogbnVtYmVyO1xyXG4gICAgcHVibGljIHc6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI2V1bGVyQW5nbGVzOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7IC8vIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVhdGVybmlvbiBpbiBkZWdyZWVzLlxyXG4gICAgI2V1bGVyQW5nbGVzRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDAsIF93OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSwgX3osIF93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBxdWF0ZXJuaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSURFTlRJVFkoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBzY2FsZWQgdG8gbGVuZ3RoIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYW5nbGVzIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2V1bGVyQW5nbGVzOiBWZWN0b3IzKTogUXVhdGVybmlvbjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHF1YXRlcm5pb24gdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIGF4aXMgYW5kIGFuZ2xlIGdpdmVuLlxyXG4gICAgICogQXhpcyBtdXN0IGJlIG5vcm1hbGl6ZWQuIEFuZ2xlIGlzIGluIGRlZ3JlZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2F4aXM6IFZlY3RvcjMsIF9hbmdsZTogbnVtYmVyKTogUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2FuZ2xlPzogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgaWYgKF9hbmdsZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXN1bHQuZXVsZXJBbmdsZXMgPSBfdmVjdG9yO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBoYWxmQW5nbGU6IG51bWJlciA9IF9hbmdsZSAqIENhbGMuZGVnMnJhZCAvIDI7XHJcbiAgICAgICAgbGV0IHNpbkhhbGZBbmdsZTogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXN1bHQuc2V0KFxyXG4gICAgICAgICAgX3ZlY3Rvci54ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgX3ZlY3Rvci55ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgX3ZlY3Rvci56ICogc2luSGFsZkFuZ2xlLFxyXG4gICAgICAgICAgTWF0aC5jb3MoaGFsZkFuZ2xlKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYXhpcyBhbmQgYW5nbGUgZ2l2ZW4uXHJcbiAgICAgKiDimqDvuI8gVU5URVNURUQhXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2F4aXM6IFZlY3RvcjMsIF9hbmdsZTogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAvLyAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuXHJcbiAgICAvLyAgIC8vIE5vcm1hbGl6ZSB0aGUgYXhpc1xyXG4gICAgLy8gICBjb25zdCBheGlzOiBWZWN0b3IzID0gX2F4aXMuY2xvbmU7XHJcbiAgICAvLyAgIGF4aXMubm9ybWFsaXplKCk7XHJcblxyXG4gICAgLy8gICAvLyBDYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gY29tcG9uZW50c1xyXG4gICAgLy8gICBjb25zdCBoYWxmQW5nbGU6IG51bWJlciA9IF9hbmdsZSAvIDI7XHJcbiAgICAvLyAgIGNvbnN0IHM6IG51bWJlciA9IE1hdGguc2luKGhhbGZBbmdsZSk7XHJcbiAgICAvLyAgIHJlc3VsdC54ID0gYXhpcy54ICogcztcclxuICAgIC8vICAgcmVzdWx0LnkgPSBheGlzLnkgKiBzO1xyXG4gICAgLy8gICByZXN1bHQueiA9IGF4aXMueiAqIHM7XHJcbiAgICAvLyAgIHJlc3VsdC53ID0gTWF0aC5jb3MoaGFsZkFuZ2xlKTtcclxuXHJcbiAgICAvLyAgIFJlY3ljbGVyLnN0b3JlKGF4aXMpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHR3byBwYXNzZWQgcXVhdGVybmlvbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPRFVDVChfcUxlZnQ6IFF1YXRlcm5pb24sIF9xUmlnaHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xTGVmdC5jbG9uZS5tdWx0aXBseShfcVJpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBpbnZlcnNlIG9mIGEgcGFzc2VkIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUuaW52ZXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgY29uanVnYXRlIG9mIGEgcGFzc2VkIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ09OSlVHQVRJT04oX3E6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xLmNsb25lLmNvbmp1Z2F0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXRlcm5pb25zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfcTE6IFF1YXRlcm5pb24sIF9xMjogUXVhdGVybmlvbik6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfcTEueCAqIF9xMi54ICsgX3ExLnkgKiBfcTIueSArIF9xMS56ICogX3EyLnogKyBfcTEudyAqIF9xMi53O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0ZXJuaW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gX2ZhY3Rvci4gV2hlbiBfZmFjdG9yIGlzIDAgdGhlIHJlc3VsdCBpcyBfZnJvbSwgd2hlbiBfZmFjdG9yIGlzIDEgdGhlIHJlc3VsdCBpcyBfdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTEVSUChfZnJvbTogUXVhdGVybmlvbiwgX3RvOiBRdWF0ZXJuaW9uLCBfZmFjdG9yOiBudW1iZXIpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgbGV0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAoX2Zyb20ueCAqICgxIC0gX2ZhY3RvcikgKyBfdG8ueCAqIF9mYWN0b3IpLFxyXG4gICAgICAgIChfZnJvbS55ICogKDEgLSBfZmFjdG9yKSArIF90by55ICogX2ZhY3RvciksXHJcbiAgICAgICAgKF9mcm9tLnogKiAoMSAtIF9mYWN0b3IpICsgX3RvLnogKiBfZmFjdG9yKSxcclxuICAgICAgICAoX2Zyb20udyAqICgxIC0gX2ZhY3RvcikgKyBfdG8udyAqIF9mYWN0b3IpXHJcbiAgICAgICk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0ZXJuaW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gX2ZhY3Rvci4gV2hlbiBfZmFjdG9yIGlzIDAgdGhlIHJlc3VsdCBpcyBfZnJvbSwgd2hlbiBfZmFjdG9yIGlzIDEgdGhlIHJlc3VsdCBpcyBfdG8uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNMRVJQKF9mcm9tOiBRdWF0ZXJuaW9uLCBfdG86IFF1YXRlcm5pb24sIF9mYWN0b3I6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cclxuICAgICAgbGV0IGNvc0hhbGZUaGV0YTogbnVtYmVyID0gX2Zyb20udyAqIF90by53ICsgX2Zyb20ueCAqIF90by54ICsgX2Zyb20ueSAqIF90by55ICsgX2Zyb20ueiAqIF90by56O1xyXG4gICAgICBpZiAoTWF0aC5hYnMoY29zSGFsZlRoZXRhKSA+PSAxKVxyXG4gICAgICAgIHJldHVybiBfZnJvbTtcclxuICAgICAgbGV0IGhhbGZUaGV0YTogbnVtYmVyID0gTWF0aC5hY29zKGNvc0hhbGZUaGV0YSk7XHJcbiAgICAgIGxldCBzaW5IYWxmVGhldGE6IG51bWJlciA9IE1hdGguc3FydCgxIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhKTtcclxuICAgICAgaWYgKE1hdGguYWJzKHNpbkhhbGZUaGV0YSkgPCAwLjAwMSkge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAgIChfZnJvbS54ICogMC41ICsgX3RvLnggKiAwLjUpLFxyXG4gICAgICAgICAgKF9mcm9tLnkgKiAwLjUgKyBfdG8ueSAqIDAuNSksXHJcbiAgICAgICAgICAoX2Zyb20ueiAqIDAuNSArIF90by56ICogMC41KSxcclxuICAgICAgICAgIChfZnJvbS53ICogMC41ICsgX3RvLncgKiAwLjUpXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCByYXRpb0E6IG51bWJlciA9IE1hdGguc2luKCgxIC0gX2ZhY3RvcikgKiBoYWxmVGhldGEpIC8gc2luSGFsZlRoZXRhO1xyXG4gICAgICBsZXQgcmF0aW9COiBudW1iZXIgPSBNYXRoLnNpbihfZmFjdG9yICogaGFsZlRoZXRhKSAvIHNpbkhhbGZUaGV0YTtcclxuICAgICAgbGV0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAoX2Zyb20ueCAqIHJhdGlvQSArIF90by54ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20ueSAqIHJhdGlvQSArIF90by55ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20ueiAqIHJhdGlvQSArIF90by56ICogcmF0aW9CKSxcclxuICAgICAgICAoX2Zyb20udyAqIHJhdGlvQSArIF90by53ICogcmF0aW9CKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5yZXVzZShRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LmNvcHkodGhpcyk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIHRoZSBldWxlciBhbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcm90YXRpb24gaW4gZGVncmVlcy4gXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgaW50ZXJuYWxseS4gQ3JlYXRlIGEgY2xvbmUgdG8ga2VlcCBsb25nZXIgYW5kIG1hbmlwdWxhdGUuIFxyXG4gICAgICogLSBzZXQ6IHNldCB0aGUgZXVsZXIgYW5nbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIGluIGRlZ3JlZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZXVsZXJBbmdsZXMoKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNldWxlckFuZ2xlc0RpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXNEaXJ0eSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy54ID09IDAgJiYgdGhpcy55ID09IDAgJiYgdGhpcy56ID09IDAgJiYgdGhpcy53ID09IDEpIHtcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgwLCAwLCAwKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLiNldWxlckFuZ2xlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJvbGwgKHgtYXhpcyByb3RhdGlvbilcclxuICAgICAgICBsZXQgc2lucmNvc3A6IG51bWJlciA9IDIgKiAodGhpcy53ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy56KTtcclxuICAgICAgICBsZXQgY29zcmNvc3A6IG51bWJlciA9IDEgLSAyICogKHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueCA9IE1hdGguYXRhbjIoc2lucmNvc3AsIGNvc3Jjb3NwKTtcclxuXHJcbiAgICAgICAgLy8gcGl0Y2ggKHktYXhpcyByb3RhdGlvbilcclxuICAgICAgICBsZXQgc2lucDogbnVtYmVyID0gMiAqICh0aGlzLncgKiB0aGlzLnkgLSB0aGlzLnogKiB0aGlzLngpO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhzaW5wKSA+PSAxKVxyXG4gICAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueSA9IHNpbnAgPCAwID8gLU1hdGguYWJzKE1hdGguUEkgLyAyKSA6IE1hdGguYWJzKE1hdGguUEkgLyAyKTsgLy8gdXNlIDkwIGRlZ3JlZXMgaWYgb3V0IG9mIHJhbmdlXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMueSA9IE1hdGguYXNpbihzaW5wKTtcclxuXHJcbiAgICAgICAgLy8geWF3ICh6LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnljb3NwOiBudW1iZXIgPSAyICogKHRoaXMudyAqIHRoaXMueiArIHRoaXMueCAqIHRoaXMueSk7XHJcbiAgICAgICAgbGV0IGNvc3ljb3NwOiBudW1iZXIgPSAxIC0gMiAqICh0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnopO1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnogPSBNYXRoLmF0YW4yKHNpbnljb3NwLCBjb3N5Y29zcCk7XHJcblxyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKENhbGMucmFkMmRlZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNldWxlckFuZ2xlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGV1bGVyQW5nbGVzKF9ldWxlckFuZ2xlczogVmVjdG9yMykge1xyXG4gICAgICBjb25zdCBoYWxmQW5nbGVzSW5SYWRpYW5zOiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShfZXVsZXJBbmdsZXMsIENhbGMuZGVnMnJhZCAvIDIpO1xyXG4gICAgICBjb25zdCBjb3NYOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLngpO1xyXG4gICAgICBjb25zdCBjb3NZOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLnkpO1xyXG4gICAgICBjb25zdCBjb3NaOiBudW1iZXIgPSBNYXRoLmNvcyhoYWxmQW5nbGVzSW5SYWRpYW5zLnopO1xyXG4gICAgICBjb25zdCBzaW5YOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLngpO1xyXG4gICAgICBjb25zdCBzaW5ZOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLnkpO1xyXG4gICAgICBjb25zdCBzaW5aOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGVzSW5SYWRpYW5zLnopO1xyXG5cclxuICAgICAgdGhpcy5zZXQoXHJcbiAgICAgICAgc2luWCAqIGNvc1kgKiBjb3NaIC0gY29zWCAqIHNpblkgKiBzaW5aLFxyXG4gICAgICAgIGNvc1ggKiBzaW5ZICogY29zWiArIHNpblggKiBjb3NZICogc2luWixcclxuICAgICAgICBjb3NYICogY29zWSAqIHNpblogLSBzaW5YICogc2luWSAqIGNvc1osXHJcbiAgICAgICAgY29zWCAqIGNvc1kgKiBjb3NaICsgc2luWCAqIHNpblkgKiBzaW5aXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlcy5jb3B5KF9ldWxlckFuZ2xlcyk7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyBxdWF0ZXJuaW9uIHRvIGEgbGVuZ3RoIG9mIDEgKGEgdW5pdCBxdWF0ZXJuaW9uKSBtYWtpbmcgaXQgYSB2YWxpZCByb3RhdGlvbiByZXByZXNlbnRhdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSBNYXRoLnNxcnQodGhpcy54ICoqIDIgKyB0aGlzLnkgKiogMiArIHRoaXMueiAqKiAyICsgdGhpcy53ICoqIDIpO1xyXG4gICAgICB0aGlzLnggLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnkgLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnogLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLncgLz0gbGVuZ3RoO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhpcyBxdWF0ZXJuaW9uIGFuZCByZXR1cm5zIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCAqPSAtMTtcclxuICAgICAgdGhpcy55ICo9IC0xO1xyXG4gICAgICB0aGlzLnogKj0gLTE7XHJcbiAgICAgIHRoaXMudyAqPSAtMTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBxdWF0ZXJuaW9uIHRvIHRoZSBpZGVudGl0eS1xdWF0ZXJuaW9uIGFuZCBjbGVhcnMgY2FjaGUuIFVzZWQgYnkgdGhlIHJlY3ljbGVyIHRvIHJlc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZlcnQgdGhpcyBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52ZXJ0KCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICAvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxyXG4gICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbmp1Z2F0ZXMgdGhpcyBxdWF0ZXJuaW9uIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uanVnYXRlKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggKj0gLTE7XHJcbiAgICAgIHRoaXMueSAqPSAtMTtcclxuICAgICAgdGhpcy56ICo9IC0xO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoaXMgcXVhdGVybmlvbiBhcm91bmQgdGhlIGdpdmVuIGF4aXMgYnkgdGhlIGdpdmVuIGFuZ2xlLlxyXG4gICAgICogVGhlIHJvdGF0aW9uIGlzIGFwcGVuZGVkIHRvIGFscmVhZHkgYXBwbGllZCByb3RhdGlvbnMsIHRodXMgbXVsdGlwbGllZCBmcm9tIHRoZSByaWdodC4gU2V0IF9mcm9tTGVmdCB0byB0cnVlIHRvIHN3aXRjaCBhbmQgcHV0IGl0IGluIGZyb250LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlKF9heGlzOiBWZWN0b3IzLCBfYW5nbGU6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3Qgcm90YXRpb246IFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLlJPVEFUSU9OKF9heGlzLCBfYW5nbGUpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KHJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBxdWF0ZXJuaW9uIHdpdGggdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG11bHRpcGx5KF9vdGhlcjogUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3QgYTogUXVhdGVybmlvbiA9IF9mcm9tTGVmdCA/IF9vdGhlciA6IHRoaXM7XHJcbiAgICAgIGNvbnN0IGI6IFF1YXRlcm5pb24gPSBfZnJvbUxlZnQgPyB0aGlzIDogX290aGVyO1xyXG4gICAgICAvLyBmcm9tOiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXHJcbiAgICAgIGNvbnN0IGF4OiBudW1iZXIgPSBhLng7XHJcbiAgICAgIGNvbnN0IGF5OiBudW1iZXIgPSBhLnk7XHJcbiAgICAgIGNvbnN0IGF6OiBudW1iZXIgPSBhLno7XHJcbiAgICAgIGNvbnN0IGF3OiBudW1iZXIgPSBhLnc7XHJcbiAgICAgIGNvbnN0IGJ4OiBudW1iZXIgPSBiLng7XHJcbiAgICAgIGNvbnN0IGJ5OiBudW1iZXIgPSBiLnk7XHJcbiAgICAgIGNvbnN0IGJ6OiBudW1iZXIgPSBiLno7XHJcbiAgICAgIGNvbnN0IGJ3OiBudW1iZXIgPSBiLnc7XHJcblxyXG4gICAgICB0aGlzLnNldChcclxuICAgICAgICBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnkgKyBhdyAqIGJ4LFxyXG4gICAgICAgIC1heCAqIGJ6ICsgYXkgKiBidyArIGF6ICogYnggKyBhdyAqIGJ5LFxyXG4gICAgICAgIGF4ICogYnkgLSBheSAqIGJ4ICsgYXogKiBidyArIGF3ICogYnosXHJcbiAgICAgICAgLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBieiArIGF3ICogYndcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3o6IG51bWJlciwgX3c6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggPSBfeDsgdGhpcy55ID0gX3k7IHRoaXMueiA9IF96OyB0aGlzLncgPSBfdztcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBpbnRvIHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCA9IF9vcmlnaW5hbC54OyB0aGlzLnkgPSBfb3JpZ2luYWwueTsgdGhpcy56ID0gX29yaWdpbmFsLno7IHRoaXMudyA9IF9vcmlnaW5hbC53O1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gX29yaWdpbmFsLiNldWxlckFuZ2xlc0RpcnR5O1xyXG4gICAgICBpZiAoIXRoaXMuI2V1bGVyQW5nbGVzRGlydHkpXHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfb3JpZ2luYWwuI2V1bGVyQW5nbGVzKTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuUXVhdGVybmlvbih4OiAke3RoaXMueH0sIHk6ICR7dGhpcy55fSwgejogJHt0aGlzLnp9LCB3OiAke3RoaXMud30pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjdXJyZW50bHkgcXVhdGVybmlvbnMgYXJlIG5ldmVyIHNlcmlhbGl6ZWQsIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4gQnV0IG1heWJlIGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYFske3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud31dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxRdWF0ZXJuaW9uPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMud10gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAoIXRoaXMubXV0YXRvcilcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnosIHc6IHRoaXMudyB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy54ID0gX211dGF0b3IueCA/PyB0aGlzLng7XHJcbiAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnkgPz8gdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSBfbXV0YXRvci56ID8/IHRoaXMuejtcclxuICAgICAgdGhpcy53ID0gX211dGF0b3IudyA/PyB0aGlzLnc7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0Q2FjaGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIGZvciBjcmVhdGluZyByYW5kb20gdmFsdWVzLCBzdXBwb3J0aW5nIEphdmFzY3JpcHQncyBNYXRoLnJhbmRvbSBhbmQgYSBkZXRlcm1pbmlzdGlnIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoUFJORykgXHJcbiAgICogdGhhdCBjYW4gYmUgZmVkIHdpdGggYSBzZWVkIGFuZCB0aGVuIHJldHVybnMgYSByZXByb2R1Y2FibGUgc2V0IG9mIHJhbmRvbSBudW1iZXJzIChpZiB0aGUgcHJlY2lzaW9uIG9mIEphdmFzY3JpcHQgYWxsb3dzKSBcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJhbmRvbSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHQ6IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxuICAgIHByaXZhdGUgZ2VuZXJhdGU6IEZ1bmN0aW9uID0gTWF0aC5yYW5kb207XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJhbmRvbX0uIFxyXG4gICAgICogSWYgYSBzZWVkIGlzIGdpdmVuLCBMRklCNCBpcyB1c2VkIGFzIGdlbmVyYXRvciwgcmVwcm9kdWNpbmcgYSBzZXJpZXMgb2YgbnVtYmVycyBmcm9tIHRoYXQgc2VlZC5cclxuICAgICAqIElmIGEgZnVuY3Rpb24gcHJvZHVjaW5nIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZCBhcyBnZW5lcmF0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2VlZE9yRnVuY3Rpb24/OiBudW1iZXIgfCBGdW5jdGlvbikge1xyXG4gICAgICBpZiAoX3NlZWRPckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZSA9IF9zZWVkT3JGdW5jdGlvbjtcclxuICAgICAgZWxzZSBpZiAoX3NlZWRPckZ1bmN0aW9uID09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gTWF0aC5yYW5kb207XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gbmV3IExGSUI0KF9zZWVkT3JGdW5jdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbm9ybWVkIHJhbmRvbSBudW1iZXIsIHRodXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9ybSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIGdpdmVuIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2UoX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX21pbiArIHRoaXMuZ2VuZXJhdGUoKSAqIChfbWF4IC0gX21pbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBnaXZlbiBmbG9vcmVkIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2VGbG9vcmVkKF9taW46IG51bWJlciwgX21heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5nZXRSYW5nZShfbWluLCBfbWF4KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKCkgPCAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIC0xIG9yIDEgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbigpID8gMSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGluZGV4IGludG8gdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbmRleDxUPihfYXJyYXk6IEFycmF5PFQ+KTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJhbmdlRmxvb3JlZCgwLCBfYXJyYXkubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFbGVtZW50PFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiBfYXJyYXlbdGhpcy5nZXRJbmRleChfYXJyYXkpXTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcmFuZG9tbHkgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheSBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaWNlPFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgcmV0dXJuIF9hcnJheS5zcGxpY2UodGhpcy5nZXRJbmRleChfYXJyYXkpLCAxKVswXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb21seSBzZWxlY3RlZCBrZXkgZnJvbSB0aGUgZ2l2ZW4gTWFwLWluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXk8VCwgVT4oX21hcDogTWFwPFQsIFU+KTogVCB7XHJcbiAgICAgIGxldCBrZXlzOiBHZW5lcmFsID0gQXJyYXkuZnJvbShfbWFwLmtleXMoKSk7XHJcbiAgICAgIHJldHVybiBrZXlzW3RoaXMuZ2V0SW5kZXgoa2V5cyldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eU5hbWU8VD4oX29iamVjdDogVCk6IGtleW9mIFQge1xyXG4gICAgICBsZXQga2V5czogc3RyaW5nW10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIDxrZXlvZiBUPmtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tbHkgc2VsZWN0ZWQgc3ltYm9sIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgaWYgc3ltYm9scyBhcmUgdXNlZCBhcyBrZXlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eVN5bWJvbDxUPihfb2JqZWN0OiBUKTogc3ltYm9sIHtcclxuICAgICAgbGV0IGtleXM6IHN5bWJvbFtdID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIGtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHRocmVlLWRpbWVuc2lvbmFsIHZlY3RvciBpbiB0aGUgbGltaXRzIG9mIHRoZSBib3ggZGVmaW5lZCBieSB0aGUgdmVjdG9ycyBnaXZlbiBhcyBbX2Nvcm5lcjAsIF9jb3JuZXIxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVjdG9yMyhfY29ybmVyMDogVmVjdG9yMywgX2Nvcm5lcjE6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueCwgX2Nvcm5lcjEueCksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueSwgX2Nvcm5lcjEueSksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueiwgX2Nvcm5lcjEueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB0d28tZGltZW5zaW9uYWwgdmVjdG9yIGluIHRoZSBsaW1pdHMgb2YgdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIGdpdmVuIGFzIFtfY29ybmVyMCwgX2Nvcm5lcjFbXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZWN0b3IyKF9jb3JuZXIwOiBWZWN0b3IyLCBfY29ybmVyMTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy5nZXRSYW5nZShfY29ybmVyMC54LCBfY29ybmVyMS54KSwgdGhpcy5nZXRSYW5nZShfY29ybmVyMC55LCBfY29ybmVyMS55KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFuZGFyZCB7QGxpbmsgUmFuZG9tfS1pbnN0YW5jZSB1c2luZyBNYXRoLnJhbmRvbSgpLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCByYW5kb206IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0aHJlZWRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSBhbmQgelxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICt5XHJcbiAgICogICAgICAgICAgICAgfF9fICt4XHJcbiAgICogICAgICAgICAgICAvXHJcbiAgICogICAgICAgICAgK3ogICBcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjIgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXQoX3gsIF95LCBfeik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB4LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB5LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFkoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB6LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFooX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDAsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIHZhbHVlIDAgb24gZWFjaCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IzIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCwgMCk7IC8vIHNob3VsZCBiZSBzZXQgdG8gMCBieSByZWN5Y2xlciBhbHJlYWR5P1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciBvZiB0aGUgZ2l2ZW4gc2l6ZSBvbiBlYWNoIG9mIHRoZSB0aHJlZSBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXggb3Igcm90YXRpb24gcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IzLCBfdHJhbnNmb3JtOiBNYXRyaXg0eDQgfCBRdWF0ZXJuaW9uLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuXHJcbiAgICAgIGlmIChfdHJhbnNmb3JtIGluc3RhbmNlb2YgTWF0cml4NHg0KSB7XHJcbiAgICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF90cmFuc2Zvcm0uZ2V0KCk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueSArIG1bOF0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs1XSAqIF92ZWN0b3IueSArIG1bOV0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzJdICogX3ZlY3Rvci54ICsgbVs2XSAqIF92ZWN0b3IueSArIG1bMTBdICogX3ZlY3Rvci56XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICByZXN1bHQuYWRkKF90cmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy90cmFuc2Zvcm1zL2luZGV4Lmh0bVxyXG4gICAgICAgIC8vIHJlc3VsdCA9IHEgKiBxdWF0ZXJuaW9uKHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIDApICogY29uaihxKVxyXG5cclxuICAgICAgICAvLyBxICogcXVhdGVybmlvbih2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCAwKSAuLi5cclxuICAgICAgICBjb25zdCBxeDogbnVtYmVyID0gX3RyYW5zZm9ybS53ICogX3ZlY3Rvci54ICsgX3RyYW5zZm9ybS55ICogX3ZlY3Rvci56IC0gX3RyYW5zZm9ybS56ICogX3ZlY3Rvci55O1xyXG4gICAgICAgIGNvbnN0IHF5OiBudW1iZXIgPSBfdHJhbnNmb3JtLncgKiBfdmVjdG9yLnkgKyBfdHJhbnNmb3JtLnogKiBfdmVjdG9yLnggLSBfdHJhbnNmb3JtLnggKiBfdmVjdG9yLno7XHJcbiAgICAgICAgY29uc3QgcXo6IG51bWJlciA9IF90cmFuc2Zvcm0udyAqIF92ZWN0b3IueiArIF90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueDtcclxuICAgICAgICBjb25zdCBxdzogbnVtYmVyID0gLV90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueCAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueiAqIF92ZWN0b3IuejtcclxuXHJcbiAgICAgICAgLy8gLi4uICogY29uaihxKVxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBxeCAqIF90cmFuc2Zvcm0udyArIHF3ICogLSBfdHJhbnNmb3JtLnggKyBxeSAqIC0gX3RyYW5zZm9ybS56IC0gcXogKiAtIF90cmFuc2Zvcm0ueSxcclxuICAgICAgICAgIHF5ICogX3RyYW5zZm9ybS53ICsgcXcgKiAtIF90cmFuc2Zvcm0ueSArIHF6ICogLSBfdHJhbnNmb3JtLnggLSBxeCAqIC0gX3RyYW5zZm9ybS56LFxyXG4gICAgICAgICAgcXogKiBfdHJhbnNmb3JtLncgKyBxdyAqIC0gX3RyYW5zZm9ybS56ICsgcXggKiAtIF90cmFuc2Zvcm0ueSAtIHF5ICogLSBfdHJhbnNmb3JtLnhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgdG8gdGhlIGdpdmVuIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yM1tdKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGZvciAobGV0IHZlY3RvciBvZiBfdmVjdG9ycylcclxuICAgICAgICByZXN1bHQuc2V0KHJlc3VsdC54ICsgdmVjdG9yLngsIHJlc3VsdC55ICsgdmVjdG9yLnksIHJlc3VsdC56ICsgdmVjdG9yLnopO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBESUZGRVJFTkNFKF9taW51ZW5kOiBWZWN0b3IzLCBfc3VidHJhaGVuZDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoX21pbnVlbmQueCAtIF9zdWJ0cmFoZW5kLngsIF9taW51ZW5kLnkgLSBfc3VidHJhaGVuZC55LCBfbWludWVuZC56IC0gX3N1YnRyYWhlbmQueik7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIHNjYWxpbmcgZmFjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU0NBTEUoX3ZlY3RvcjogVmVjdG9yMywgX3NjYWxpbmc6IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgc2NhbGVkOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHNjYWxlZC5zZXQoX3ZlY3Rvci54ICogX3NjYWxpbmcsIF92ZWN0b3IueSAqIF9zY2FsaW5nLCBfdmVjdG9yLnogKiBfc2NhbGluZyk7XHJcbiAgICAgIHJldHVybiBzY2FsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyB0aGUgY3Jvc3Nwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDUk9TUyhfYTogVmVjdG9yMywgX2I6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KFxyXG4gICAgICAgIF9hLnkgKiBfYi56IC0gX2EueiAqIF9iLnksXHJcbiAgICAgICAgX2EueiAqIF9iLnggLSBfYS54ICogX2IueixcclxuICAgICAgICBfYS54ICogX2IueSAtIF9hLnkgKiBfYi54XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBkb3Rwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX2E6IFZlY3RvcjMsIF9iOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hLnggKiBfYi54ICsgX2EueSAqIF9iLnkgKyBfYS56ICogX2Iuejs7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSByZWZsZWN0aW9uIG9mIHRoZSBpbmNvbWluZyB2ZWN0b3IgYXQgdGhlIGdpdmVuIG5vcm1hbCB2ZWN0b3IuIFRoZSBsZW5ndGggb2Ygbm9ybWFsIHNob3VsZCBiZSAxLlxyXG4gICAgICogICAgIF9fX19fX19fX19fX19fX19fX1xyXG4gICAgICogICAgICAgICAgIC98XFxcclxuICAgICAqIGluY29taW5nIC8gfCBcXCByZWZsZWN0aW9uXHJcbiAgICAgKiAgICAgICAgIC8gIHwgIFxcICAgXHJcbiAgICAgKiAgICAgICAgICBub3JtYWxcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJFRkxFQ1RJT04oX2luY29taW5nOiBWZWN0b3IzLCBfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBkb3Q6IG51bWJlciA9IC1WZWN0b3IzLkRPVChfaW5jb21pbmcsIF9ub3JtYWwpO1xyXG4gICAgICBsZXQgcmVmbGVjdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKF9pbmNvbWluZywgVmVjdG9yMy5TQ0FMRShfbm9ybWFsLCAyICogZG90KSk7XHJcbiAgICAgIHJldHVybiByZWZsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyB0aGUgZGl2aWRlbmQgYnkgdGhlIGRpdmlzb3IgY29tcG9uZW50IGJ5IGNvbXBvbmVudCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU8oX2RpdmlkZW5kOiBWZWN0b3IzLCBfZGl2aXNvcjogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoX2RpdmlkZW5kLnggLyBfZGl2aXNvci54LCBfZGl2aWRlbmQueSAvIF9kaXZpc29yLnksIF9kaXZpZGVuZC56IC8gX2Rpdmlzb3Iueik7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2FydGVzaWFuIHZlY3RvciBmcm9tIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHRU8oX2xvbmdpdHVkZTogbnVtYmVyID0gMCwgX2xhdGl0dWRlOiBudW1iZXIgPSAwLCBfbWFnbml0dWRlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLnJldXNlKEdlbzMpO1xyXG4gICAgICBnZW8uc2V0KF9sb25naXR1ZGUsIF9sYXRpdHVkZSwgX21hZ25pdHVkZSk7XHJcbiAgICAgIHZlY3Rvci5nZW8gPSBnZW87XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGdlbyk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGFuZ2xlIGluIGRlZ3JlZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBBTkdMRShfZnJvbTogVmVjdG9yMywgX3RvOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSBNYXRoLmFjb3MoQ2FsYy5jbGFtcChWZWN0b3IzLkRPVChfZnJvbSwgX3RvKSAvIChfZnJvbS5tYWduaXR1ZGUgKiBfdG8ubWFnbml0dWRlKSwgLTEsIDEpKTsgLy8gY2xhbXAgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBlcnJvcnMgd2hlbiBmcm9tID09IHRvXHJcbiAgICAgIHJldHVybiBhbmdsZSAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcHJvamVjdGlvbiBvZiBhIG9udG8gYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0pFQ1RJT04oX2E6IFZlY3RvcjMsIF9iOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBfYS5jbG9uZS5wcm9qZWN0KF9iKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnksIHRoaXMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMy5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJucyBhIGdlb2dyYXBoaWMgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IgIFxyXG4gICAgICogLSBzZXQ6IGFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBnZW8oX2dlbzogR2VvMykge1xyXG4gICAgICB0aGlzLnNldCgwLCAwLCBfZ2VvLm1hZ25pdHVkZSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9YKC1fZ2VvLmxhdGl0dWRlKSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9nZW8ubG9uZ2l0dWRlKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGdlbygpOiBHZW8zIHtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLmdldChHZW8zKTtcclxuICAgICAgZ2VvLm1hZ25pdHVkZSA9IHRoaXMubWFnbml0dWRlO1xyXG5cclxuICAgICAgaWYgKGdlby5tYWduaXR1ZGUgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIGdlbztcclxuXHJcbiAgICAgIGdlby5sb25naXR1ZGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueCAvIGdlby5tYWduaXR1ZGUsIHRoaXMueiAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgZ2VvLmxhdGl0dWRlID0gMTgwICogTWF0aC5hc2luKHRoaXMueSAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55LCBfb3JpZ2luYWwueik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yIGFyZSB0byBiZSBjb25zaWRlcmVkIGlkZW50aWNhbCB3aXRoaW4gdGhlIGdpdmVuIHRvbGVyYW5jZVxyXG4gICAgICogVE9ETzogZXhhbWluZSwgaWYgdG9sZXJhbmNlIGFzIGNyaXRlcml1bSBmb3IgdGhlIGRpZmZlcmVuY2UgaXMgYXBwcm9wcmlhdGUgd2l0aCB2ZXJ5IGxhcmdlIGNvb3JkaW5hdGUgdmFsdWVzIG9yIGlmIF90b2xlcmFuY2Ugc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgY29vcmRpbmF0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXF1YWxzKF9jb21wYXJlOiBWZWN0b3IzLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy54IC0gX2NvbXBhcmUueCkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnkgLSBfY29tcGFyZS55KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueiAtIF9jb21wYXJlLnopID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9zaXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgaXMgd2l0aGluIGEgY3ViZSB3aXRoIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIDEgYW5kIDJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlQ3ViZShfY29ybmVyMTogVmVjdG9yMywgX2Nvcm5lcjI6IFZlY3RvcjMpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGRpYWdvbmFsOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9jb3JuZXIyLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByZWxhdGl2ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByYXRpbzogVmVjdG9yMyA9IFZlY3RvcjMuUkFUSU8ocmVsYXRpdmUsIGRpYWdvbmFsKTtcclxuICAgICAgaWYgKHJhdGlvLnggPiAxIHx8IHJhdGlvLnggPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnkgPiAxIHx8IHJhdGlvLnkgPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnogPiAxIHx8IHJhdGlvLnogPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvc2l0aW9uIGRlc2NyaWJlZCBieSB0aGlzIGlzIHdpdGhpbiBhIHNwaGVyZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXIgYW5kIHJhZGl1c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGVTcGhlcmUoX2NlbnRlcjogVmVjdG9yMywgX3JhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMsIF9jZW50ZXIpO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZS5tYWduaXR1ZGVTcXVhcmVkIDwgKF9yYWRpdXMgKiBfcmFkaXVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHRoaXMueiArPSBfYWRkZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54O1xyXG4gICAgICB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTtcclxuICAgICAgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnogKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGVzIHRoaXMgdmVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBzaWducyBvZiBpdHMgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSAtdGhpcy54O1xyXG4gICAgICB0aGlzLnkgPSAtdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2plY3RzIHRoaXMgdmVjdG9yIG9udG8gdGhlIGdpdmVuIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvamVjdChfb246IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHNjYWxhcjogbnVtYmVyID0gVmVjdG9yMy5ET1QodGhpcywgX29uKSAvIF9vbi5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICB0aGlzLnggPSBfb24ueCAqIHNjYWxhcjtcclxuICAgICAgdGhpcy55ID0gX29uLnkgKiBzY2FsYXI7XHJcbiAgICAgIHRoaXMueiA9IF9vbi56ICogc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHRoaXMueiA9IF96O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3RoaXMueCwgdGhpcy55LCB0aGlzLnpdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCBvciByb3RhdGlvbiBxdWF0ZXJuaW9uLiBcclxuICAgICAqIEluY2x1ZGluZyBvciBleGx1ZGluZyB0aGUgdHJhbnNsYXRpb24gaWYgYSBtYXRyaXggaXMgcGFzc2VkLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX3RyYW5zZm9ybTogTWF0cml4NHg0IHwgUXVhdGVybmlvbiwgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTih0aGlzLCBfdHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyb3BzIHRoZSB6LWNvbXBvbmVudCBhbmQgcmV0dXJucyBhIFZlY3RvcjIgY29uc2lzdGluZyBvZiB0aGUgeC0gYW5kIHktY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IyKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmbGVjdHMgdGhpcyB2ZWN0b3IgYXQgYSBnaXZlbiBub3JtYWwuIFNlZSB7QGxpbmsgVmVjdG9yMy5SRUZMRUNUSU9OfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmbGVjdChfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHJlZmxlY3RlZDogVmVjdG9yMyA9IFZlY3RvcjMuUkVGTEVDVElPTih0aGlzLCBfbm9ybWFsKTtcclxuICAgICAgdGhpcy5zZXQocmVmbGVjdGVkLngsIHJlZmxlY3RlZC55LCByZWZsZWN0ZWQueik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlZmxlY3RlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNodWZmbGUoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBhOiBudW1iZXJbXSA9IFt0aGlzLngsIHRoaXMueSwgdGhpcy56XTtcclxuICAgICAgdGhpcy5zZXQoUmFuZG9tLmRlZmF1bHQuc3BsaWNlKGEpLCBSYW5kb20uZGVmYXVsdC5zcGxpY2UoYSksIGFbMF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGJld3R3ZWVuIHRoaXMgdmVjdG9yIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZShfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZGlmZmVyZW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfdG8pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShkaWZmZXJlbmNlKTtcclxuICAgICAgcmV0dXJuIGRpZmZlcmVuY2UubWFnbml0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICB0aGlzLnogPSBNYXRoLm1pbih0aGlzLnosIF9jb21wYXJlLnopO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgdGhpcy56ID0gTWF0aC5tYXgodGhpcy56LCBfY29tcGFyZS56KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKF92YWx1ZTogbnVtYmVyLCBfaW5kZXg6IG51bWJlciwgX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnksIHRoaXMuel0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIChtb2RpZnlpbmcgaXQpIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHkoX2Z1bmN0aW9uOiAoX3ZhbHVlOiBudW1iZXIsIF9pbmRleDogbnVtYmVyLCBfY29tcG9uZW50OiBcInhcIiB8IFwieVwiIHwgXCJ6XCIpID0+IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfZnVuY3Rpb24odGhpcy54LCAwLCBcInhcIik7XHJcbiAgICAgIHRoaXMueSA9IF9mdW5jdGlvbih0aGlzLnksIDEsIFwieVwiKTtcclxuICAgICAgdGhpcy56ID0gX2Z1bmN0aW9uKHRoaXMueiwgMiwgXCJ6XCIpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgKCR7dGhpcy54LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnkudG9QcmVjaXNpb24oNSl9LCAke3RoaXMuei50b1ByZWNpc2lvbig1KX0pYDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFZlY3RvcjM+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX3NlcmlhbGl6YXRpb24pID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBbdGhpcy54LCB0aGlzLnksIHRoaXMuel0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLnggPSBfbXV0YXRvci54O1xyXG4gICAgICBpZiAoX211dGF0b3IueSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnk7XHJcbiAgICAgIGlmIChfbXV0YXRvci56ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy56ID0gX211dGF0b3IuejtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnogfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gVHJhbnNmZXJcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgZm91cmRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSwgeiBhbmQgdy5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yNCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF96OiBudW1iZXIgPSAwLCBfdzogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3ksIF96LCBfdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIHRoZSB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBNYXRoLmh5cG90KHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3F1YXJlZCBtYWduaXR1ZGUgKGxlbmd0aCkgb2YgdGhlIHZlY3Rvci4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5kb3QodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShWZWN0b3I0KS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnksIF9vcmlnaW5hbC56LCBfb3JpZ2luYWwudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgdGhpcy54ID0gX3g7IHRoaXMueSA9IF95OyB0aGlzLnogPSBfejsgdGhpcy53ID0gX3c7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgIHJldHVybiBbdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7IHRoaXMueSArPSBfYWRkZW5kLnk7IHRoaXMueiArPSBfYWRkZW5kLno7IHRoaXMudyArPSBfYWRkZW5kLnc7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54OyB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTsgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7IHRoaXMudyAtPSBfc3VidHJhaGVuZC53O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyOyB0aGlzLnkgKj0gX3NjYWxhcjsgdGhpcy56ICo9IF9zY2FsYXI7IHRoaXMudyAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKF9sZW5ndGg6IG51bWJlciA9IDEpOiBWZWN0b3I0IHtcclxuICAgICAgbGV0IG1hZ25pdHVkZVNxdWFyZWQ6IG51bWJlciA9IHRoaXMubWFnbml0dWRlU3F1YXJlZDtcclxuICAgICAgaWYgKG1hZ25pdHVkZVNxdWFyZWQgPT0gMClcclxuICAgICAgICB0aHJvdyAobmV3IFJhbmdlRXJyb3IoXCJJbXBvc3NpYmxlIG5vcm1hbGl6YXRpb25cIikpO1xyXG4gICAgICB0aGlzLnNjYWxlKF9sZW5ndGggLyBNYXRoLnNxcnQobWFnbml0dWRlU3F1YXJlZCkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgaW5zdGFuY2UgYW5kIGFub3RoZXIgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG90KF9vdGhlcjogVmVjdG9yNCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnggKiBfb3RoZXIueCArIHRoaXMueSAqIF9vdGhlci55ICsgdGhpcy56ICogX290aGVyLnogKyB0aGlzLncgKiBfb3RoZXIudztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHsgdG9KU09OOiAoKSA9PiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0sICR7dGhpcy53fV1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3I0PiB7XHJcbiAgICAgIFt0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLnddID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsgLyoqICovIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgZmFjZSBvZiBhIHtAbGluayBNZXNofSBieSByZWZlcmVuY2luZyB0aHJlZSB7QGxpbmsgVmVydGljZXN9IHdpdGggdGhlaXIgaW5kaXplc1xyXG4gICAqIGFuZCBjYWxjdWxhdGVzIGZhY2Ugbm9ybWFscy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGYWNlIHtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGFuZ2xlczogbnVtYmVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBub3JtYWxVbnNjYWxlZDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHZlcnRpY2VzOiBWZXJ0aWNlcztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmluZGljZXMgPSBbX2luZGV4MCwgX2luZGV4MSwgX2luZGV4Ml07XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBfdmVydGljZXM7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTm9ybWFscygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIHZlcnRleCByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmVydGljZXMucG9zaXRpb24odGhpcy5pbmRpY2VzW19pbmRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogbXVzdCBiZSBjb3BsYW5hclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IzKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGluZGV4IG9mIHRoaXMuaW5kaWNlcykge1xyXG4gICAgICAgIGxldCBkaWZmOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMudmVydGljZXMucG9zaXRpb24oaW5kZXgpLCBfcG9pbnQpO1xyXG4gICAgICAgIGRpZmZzLnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG4wOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhkaWZmc1sxXSwgZGlmZnNbMF0pO1xyXG4gICAgICBsZXQgbjE6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKGRpZmZzWzJdLCBkaWZmc1sxXSk7XHJcbiAgICAgIGxldCBuMjogVmVjdG9yMyA9IFZlY3RvcjMuQ1JPU1MoZGlmZnNbMF0sIGRpZmZzWzJdKTtcclxuXHJcbiAgICAgIGxldCBkb3QxOiBudW1iZXIgPSBWZWN0b3IzLkRPVChuMCwgbjEpO1xyXG4gICAgICBsZXQgZG90MjogbnVtYmVyID0gVmVjdG9yMy5ET1QobjAsIG4yKTtcclxuXHJcbiAgICAgIHJldHVybiAhKGRvdDEgPCAwIHx8IGRvdDIgPCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZU5vcm1hbHMoKTogdm9pZCB7XHJcbiAgICAgIGxldCB0cmlnb246IFZlY3RvcjNbXSA9IHRoaXMuaW5kaWNlcy5tYXAoKF9pbmRleDogbnVtYmVyKSA9PiB0aGlzLnZlcnRpY2VzLnBvc2l0aW9uKF9pbmRleCkpO1xyXG4gICAgICBsZXQgdjE6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzFdLCB0cmlnb25bMF0pO1xyXG4gICAgICBsZXQgdjI6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMF0pO1xyXG4gICAgICB0aGlzLm5vcm1hbFVuc2NhbGVkID0gVmVjdG9yMy5DUk9TUyh2MSwgdjIpO1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLm5vcm1hbFVuc2NhbGVkKTtcclxuICAgICAgdGhpcy5hbmdsZXMucHVzaChcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKHYxLCB2MiksXHJcbiAgICAgICAgVmVjdG9yMy5BTkdMRShWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMV0pLCBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzBdLCB0cmlnb25bMV0pKSxcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMF0sIHRyaWdvblsyXSksIFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMV0sIHRyaWdvblsyXSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBzaW1wbGUgY3ViZSB3aXRoIGVkZ2VzIG9mIGxlbmd0aCAxLCBlYWNoIGZhY2UgY29uc2lzdGluZyBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAoMTIpIDRfX19fNyAgKDExKVxyXG4gICAqICAgICAgICg4KSAwL19fMy98ICgxMClcclxuICAgKiAgICAgICAoMTUpIHx8NV98fDYgKDE0KVxyXG4gICAqICAgICAgICg5KSAxfC9fMnwvICgxMylcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoQ3ViZSBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoQ3ViZSk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hDdWJlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG5cclxuICAgICAgLy8gbm8gc2hhcmVkIHZlcnRpY2VzLCBjb3JuZXJzIG5lZWQgdGhyZWUgbm9ybWFscyBmb3IgUGhvbmcgYW5kIEdvdXJhdWRcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcyhcclxuICAgICAgICAvLyBmcm9udCB2ZXJ0aWNlc1xyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC41LCAwLjUpLCBuZXcgVmVjdG9yMigwLCAwKSksIC8vIDBcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIC0wLjUsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDEpKSwgLy8gMVxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAtMC41LCAwLjUpLCBuZXcgVmVjdG9yMigxLCAxKSksIC8vIDJcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpLCBuZXcgVmVjdG9yMigxLCAwKSkgLy8zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBvbiBzaWRlc1xyXG4gICAgICBmb3IgKGxldCBhbmdsZTogbnVtYmVyID0gOTA7IGFuZ2xlIDwgMzYwOyBhbmdsZSArPSA5MCkge1xyXG4gICAgICAgIGxldCB0cmFuc2Zvcm06IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihWZWN0b3IzLlkoYW5nbGUpKTtcclxuICAgICAgICBsZXQgc2lkZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLnNsaWNlKDAsIDQpLm1hcCgoX3Y6IFZlcnRleCkgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgdHJhbnNmb3JtKSwgX3YudXYpKTtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2goLi4uc2lkZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMgZm9yIHRvcCBhbmQgYm90dG9tXHJcbiAgICAgIGZvciAobGV0IGFuZ2xlOiBudW1iZXIgPSA5MDsgYW5nbGUgPCAzNjA7IGFuZ2xlICs9IDE4MCkge1xyXG4gICAgICAgIGxldCB0cmFuc2Zvcm06IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTihWZWN0b3IzLlgoYW5nbGUpKTtcclxuICAgICAgICBsZXQgc2lkZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLnNsaWNlKDAsIDQpLm1hcCgoX3Y6IFZlcnRleCkgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgdHJhbnNmb3JtKSwgX3YudXYpKTtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2goLi4uc2lkZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDI0OyBpICs9IDQpXHJcbiAgICAgICAgLy8gZ2VuZXJhdGUgZmFjZXNcclxuICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ubmV3IFF1YWQodGhpcy52ZXJ0aWNlcywgaSArIDAsIGkgKyAxLCBpICsgMiwgaSArIDMpLmZhY2VzKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIGZsYXQgcG9seWdvbi4gQWxsIHRyaWdvbnMgc2hhcmUgdmVydGV4IDAsIHNvIGNhcmVmdWwgZGVzaWduIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBjb25jYXZlIHBvbHlnb25zLiBcclxuICAgKiBWZXJ0ZXggMCBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFjZSBub3JtYWwuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICAgIDAgXHJcbiAgICogICAgICAgICAgIDHilbF84pWyICA0IC4uLlxyXG4gICAqICAgICAgICAgICAg4pWyfF/ilbLilbEgXHJcbiAgICogICAgICAgICAgICAyICAgM1xyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFBvbHlnb24gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFBvbHlnb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBzaGFwZURlZmF1bHQ6IFZlY3RvcjJbXSA9IFsgLy8gdHJpZ29uIGlzIHRoZSBtaW5pbWFsIHNoYXBlXHJcbiAgICAgIG5ldyBWZWN0b3IyKC0xLCAtMSksXHJcbiAgICAgIG5ldyBWZWN0b3IyKDEsIC0xKSxcclxuICAgICAgbmV3IFZlY3RvcjIoMCwgMSlcclxuICAgIF07XHJcbiAgICBwcm90ZWN0ZWQgc2hhcGU6IE11dGFibGVBcnJheTxWZWN0b3IyPiA9IG5ldyBNdXRhYmxlQXJyYXk8VmVjdG9yMj4oVmVjdG9yMik7XHJcbiAgICBwcm90ZWN0ZWQgZml0VGV4dHVyZTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFBvbHlnb25cIiwgX3NoYXBlOiBWZWN0b3IyW10gPSBNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9zaGFwZSwgX2ZpdFRleHR1cmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXQgbWluVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgdGhpcyBtZXNoIGZyb20gdGhlIGdpdmVuIHZlcnRpY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9zaGFwZTogVmVjdG9yMltdID0gW10sIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNoYXBlID0gPE11dGFibGVBcnJheTxWZWN0b3IyPj5NdXRhYmxlQXJyYXkuZnJvbShfc2hhcGUubWFwKF92ZXJ0ZXggPT4gX3ZlcnRleC5jbG9uZSkpO1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuZml0VGV4dHVyZSA9IF9maXRUZXh0dXJlO1xyXG5cclxuICAgICAgaWYgKF9zaGFwZS5sZW5ndGggPCB0aGlzLm1pblZlcnRpY2VzKSB7XHJcbiAgICAgICAgRGVidWcud2FybihgQXQgbGVhc3QgJHt0aGlzLm1pblZlcnRpY2VzfSB2ZXJ0aWNlcyBuZWVkZWQgdG8gY29uc3RydWN0IE1lc2hQb2x5Z29uLCBkZWZhdWx0IHRyaWdvbiB1c2VkYCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGUoTWVzaFBvbHlnb24uc2hhcGVEZWZhdWx0LCB0cnVlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gX3NoYXBlO1xyXG5cclxuICAgICAgbGV0IG1pbjogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgICBsZXQgbWF4OiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgICAgZm9yIChsZXQgdmVydGV4IG9mIHNoYXBlKSB7XHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgodmVydGV4LnRvVmVjdG9yMygpKSk7XHJcblxyXG4gICAgICAgIG1pbi54ID0gTWF0aC5taW4obWluLngsIHZlcnRleC54KTtcclxuICAgICAgICBtYXgueCA9IE1hdGgubWF4KG1heC54LCB2ZXJ0ZXgueCk7XHJcbiAgICAgICAgbWluLnkgPSBNYXRoLm1pbihtaW4ueSwgdmVydGV4LnkpO1xyXG4gICAgICAgIG1heC55ID0gTWF0aC5tYXgobWF4LnksIHZlcnRleC55KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKG1heC54IC0gbWluLngsIG1heC55IC0gbWluLnkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZml0VGV4dHVyZSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRleHR1cmVVVjogVmVjdG9yMiA9IFZlY3RvcjIuRElGRkVSRU5DRShzaGFwZVtpXSwgbWluKTtcclxuICAgICAgICAgIHRoaXMudmVydGljZXNbaV0udXYgPSBuZXcgVmVjdG9yMih0ZXh0dXJlVVYueCAvIHNpemUueCwgMSAtIHRleHR1cmVVVi55IC8gc2l6ZS55KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX3NoYXBlLmZvckVhY2goKF92ZXJ0ZXgsIF9pKSA9PiB0aGlzLnZlcnRpY2VzW19pXS51diA9IG5ldyBWZWN0b3IyKF92ZXJ0ZXgueCwgLV92ZXJ0ZXgueSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmZhY2VzID0gW107XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCBpIC0gMSwgaSwgMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zaGFwZSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoVmVjdG9yMiwgdGhpcy5zaGFwZSk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uZml0VGV4dHVyZSA9IHRoaXMuZml0VGV4dHVyZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCB2ZWN0b3JzOiBWZWN0b3IyW10gPSA8VmVjdG9yMltdPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbi5zaGFwZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHZlY3RvcnMsIF9zZXJpYWxpemF0aW9uLmZpdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnNoYXBlLCB0aGlzLmZpdFRleHR1cmUpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiTWVzaFBvbHlnb24udHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBleHRydXNpb24gb2YgYSBwb2x5Z29uIGJ5IGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uc1xyXG4gICAqIGBgYHRleHQgIFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgIF9fX19cclxuICAgKiBQb2x5Z29uICAgICAgICAgX19fX+KVseKVsiAgIOKVsiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAqIFRyYW5zZm9ybSAwICDihpIg4pWxIOKVsl9f4pWyX+KVsl9fX+KVsiDihpAgVHJhbnNmb3JtIDIgICAgICAgICAgeiBfX+KUglxyXG4gICAqIChiYXNlKSAgICAgICAgIOKVsl/ilbFfX+KVsSDilbEgICDilbEgICAobGlkKSAgICAgICAgICAgICAgICAgICAgIOKVsiAgICAgICBcclxuICAgKiAgICAgVHJhbnNmb3JtIDEgIOKGkiAg4pWy4pWxX19f4pWxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hFeHRydXNpb24gZXh0ZW5kcyBNZXNoUG9seWdvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hFeHRydXNpb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBtdHhEZWZhdWx0czogTWF0cml4NHg0W10gPSBbIC8vIG9mZnNldCBvZiArMC41eiBhbmQgLTAuNXogYXMgZGVmYXVsdFxyXG4gICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oVmVjdG9yMy5aKDAuNSkpLFxyXG4gICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oVmVjdG9yMy5aKC0wLjUpKVxyXG4gICAgXTtcclxuICAgIHByaXZhdGUgbXR4VHJhbnNmb3JtczogTXV0YWJsZUFycmF5PE1hdHJpeDR4ND4gPSBuZXcgTXV0YWJsZUFycmF5KE1hdHJpeDR4NCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hFeHRydXNpb25cIiwgX3ZlcnRpY2VzOiBWZWN0b3IyW10gPSBNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIF9tdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXSA9IE1lc2hFeHRydXNpb24ubXR4RGVmYXVsdHMsIF9maXRUZXh0dXJlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICBzdXBlcihfbmFtZSwgX3ZlcnRpY2VzLCBfZml0VGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZShfbXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiTXV0YXRvclwiLCB0aGlzLmdldE11dGF0b3IoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMgPSBTZXJpYWxpemVyLnNlcmlhbGl6ZUFycmF5KE1hdHJpeDR4NCwgdGhpcy5tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBsZXQgbXR4VHJhbnNmb3JtczogTWF0cml4NHg0W107XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi50cmFuc2Zvcm1zKVxyXG4gICAgICAgIG10eFRyYW5zZm9ybXMgPSA8TWF0cml4NHg0W10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMpO1xyXG4gICAgICB0aGlzLmV4dHJ1ZGUobXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZSh0aGlzLm10eFRyYW5zZm9ybXMpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBleHRydWRlKF9tdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXSA9IE1lc2hFeHRydXNpb24ubXR4RGVmYXVsdHMpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tdHhUcmFuc2Zvcm1zID0gPE11dGFibGVBcnJheTxNYXRyaXg0eDQ+Pk11dGFibGVBcnJheS5mcm9tKDxNdXRhYmxlQXJyYXk8TWF0cml4NHg0Pj5fbXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIGxldCBuVHJhbnNmb3JtczogbnVtYmVyID0gX210eFRyYW5zZm9ybXMubGVuZ3RoO1xyXG4gICAgICBsZXQgblZlcnRpY2VzU2hhcGU6IG51bWJlciA9IHRoaXMudmVydGljZXMubGVuZ3RoO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIG5ldyB2ZXJ0ZXggY2xvdWQsIGN1cnJlbnQgY2xvdWQgaG9sZHMgTWVzaFBvbHlnb25cclxuICAgICAgbGV0IHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGJhc2UgYnkgdHJhbnNmb3JtYXRpb24gb2YgcG9seWdvbiB3aXRoIGZpcnN0IHRyYW5zZm9ybVxyXG4gICAgICBsZXQgYmFzZTogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCkgPT4gbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCBfbXR4VHJhbnNmb3Jtc1swXSwgdHJ1ZSksIF92LnV2KSk7XHJcbiAgICAgIHZlcnRpY2VzLnB1c2goLi4uYmFzZSk7XHJcbiAgICAgIC8vIGNyZWF0ZSBsaWQgYnkgdHJhbnNmb3JtYXRpb24gb2YgcG9seWdvbiB3aXRoIGxhc3QgdHJhbnNmb3JtXHJcbiAgICAgIGxldCBsaWQ6IFZlcnRleFtdID0gdGhpcy52ZXJ0aWNlcy5tYXAoKF92OiBWZXJ0ZXgpID0+IG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgX210eFRyYW5zZm9ybXNbblRyYW5zZm9ybXMgLSAxXSwgdHJ1ZSksIF92LnV2KSk7XHJcbiAgICAgIHZlcnRpY2VzLnB1c2goLi4ubGlkKTtcclxuXHJcbiAgICAgIC8vIHJlY3JlYXRlIGJhc2UgZmFjZXMgdG8gcmVjYWxjdWxhdGUgbm9ybWFsc1xyXG4gICAgICB0aGlzLmZhY2VzID0gdGhpcy5mYWNlcy5tYXAoKF9mYWNlOiBGYWNlKSA9PiBuZXcgRmFjZSh2ZXJ0aWNlcywgX2ZhY2UuaW5kaWNlc1swXSwgX2ZhY2UuaW5kaWNlc1sxXSwgX2ZhY2UuaW5kaWNlc1syXSkpO1xyXG4gICAgICAvLyBjcmVhdGUgdGhlIGxpZCBmYWNlcyB1c2luZyB0aGUgaW5kaWNlcyBvZiB0aGUgYmFzZSBmYWNlcywgYnV0IHdpdGggYW4gaW5kZXggb2Zmc2V0IGFuZCByZXZlcnNlIG9yZGVyIG9mIGluZGljZXNcclxuICAgICAgdGhpcy5mYWNlcy5wdXNoKC4uLnRoaXMuZmFjZXMubWFwKF9mYWNlID0+XHJcbiAgICAgICAgbmV3IEZhY2UodmVydGljZXMsIF9mYWNlLmluZGljZXNbMl0gKyBuVmVydGljZXNTaGFwZSwgX2ZhY2UuaW5kaWNlc1sxXSArIG5WZXJ0aWNlc1NoYXBlLCBfZmFjZS5pbmRpY2VzWzBdICsgblZlcnRpY2VzU2hhcGUpXHJcbiAgICAgICkpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdDogbnVtYmVyID0gMDsgdCA8IG5UcmFuc2Zvcm1zOyB0KyspIHtcclxuICAgICAgICBsZXQgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBfbXR4VHJhbnNmb3Jtc1t0XTtcclxuICAgICAgICBsZXQgcmVmZXJUb0Nsb3NlOiBudW1iZXIgPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHdyYXA6IFZlcnRleFtdID0gdGhpcy52ZXJ0aWNlcy5tYXAoKF92OiBWZXJ0ZXgsIF9pOiBudW1iZXIpID0+XHJcbiAgICAgICAgICBuZXcgVmVydGV4KFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3YucG9zaXRpb24sIG10eFRyYW5zZm9ybSwgdHJ1ZSksIG5ldyBWZWN0b3IyKF9pIC8gblZlcnRpY2VzU2hhcGUsIHQgLyBuVHJhbnNmb3JtcykpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB2ZXJ0aWNlcy5wdXNoKC4uLndyYXApO1xyXG4gICAgICAgIHZlcnRpY2VzLnB1c2gobmV3IFZlcnRleChyZWZlclRvQ2xvc2UsIG5ldyBWZWN0b3IyKDEsIHQgLyBuVHJhbnNmb3JtcykpKTtcclxuICAgICAgICAvLyBpZiAoaSA+IDAgJiYgaSA8IG5UcmFuc2Zvcm1zIC0gMSlcclxuICAgICAgICAvLyAgIHZlcnRpY2VzLnB1c2goLi4ud3JhcC5tYXAoKF92ZWN0b3I6IFZlY3RvcjMpID0+IF92ZWN0b3IuY2xvbmUpKTsgPC0gbm8gc2xpY2luZyBmb3IgZmxhdCBzaGFkaW5nIHlldC4uLlxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjcmVhdGUgaW5kaXplcyBmb3Igd3JhcHBlclxyXG4gICAgICBmb3IgKGxldCB0OiBudW1iZXIgPSAwOyB0IDwgblRyYW5zZm9ybXMgLSAxOyB0KyspXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WZXJ0aWNlc1NoYXBlOyBpKyspIHtcclxuICAgICAgICAgIGxldCBpbmRleDogbnVtYmVyID1cclxuICAgICAgICAgICAgKyAyICogblZlcnRpY2VzU2hhcGUgLy8gYmFzZSAmIGxpZCBhcmUgb2Zmc2V0cyBcclxuICAgICAgICAgICAgKyB0ICogKG5WZXJ0aWNlc1NoYXBlICsgMSkgLy8gb2Zmc2V0IGZvciBlYWNoIHRyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgICAgICsgaTtcclxuICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQodmVydGljZXMsIGluZGV4LCBpbmRleCArIG5WZXJ0aWNlc1NoYXBlICsgMSwgaW5kZXggKyBuVmVydGljZXNTaGFwZSArIDIsIGluZGV4ICsgMSwgUVVBRFNQTElULkFUXzApO1xyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKC4uLnF1YWQuZmFjZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlcztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBwcml2YXRlIGNhbGN1bGF0ZVBvbHlnb25MZW5ndGhzKCk6IG51bWJlcltdIHtcclxuICAgIC8vICAgbGV0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuICAgIC8vICAgbGV0IGZpcnN0OiBWZWN0b3IzO1xyXG4gICAgLy8gICBsZXQgcHJldjogVmVjdG9yMztcclxuICAgIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgIC8vICAgICBsZXQgY3VycmVudDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKHRoaXMudmVydGljZXNbaV0sIHRoaXMudmVydGljZXNbaSArIDFdLCB0aGlzLnZlcnRpY2VzW2kgKyAyXSk7XHJcbiAgICAvLyAgICAgaWYgKHByZXYpXHJcbiAgICAvLyAgICAgICByZXN1bHQucHVzaChWZWN0b3IzLkRJRkZFUkVOQ0UoY3VycmVudCwgcHJldikubWFnbml0dWRlKTtcclxuICAgIC8vICAgICBlbHNlXHJcbiAgICAvLyAgICAgICBmaXJzdCA9IGN1cnJlbnQ7XHJcbiAgICAvLyAgICAgcHJldiA9IGN1cnJlbnQ7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgcmVzdWx0LnB1c2goVmVjdG9yMy5ESUZGRVJFTkNFKGZpcnN0LCBwcmV2KS5tYWduaXR1ZGUpO1xyXG4gICAgLy8gICByZXR1cm4gcmVzdWx0O1xyXG4gICAgLy8gfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIG1lc2ggbG9hZGVkIGZyb20gYW4gRkJYLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaEZCWCBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChNZXNoKSB7XHJcbiAgICAvLyBwdWJsaWMgdXJsOiBSZXF1ZXN0SW5mbztcclxuICAgIHB1YmxpYyBpTWVzaDogbnVtYmVyO1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX2lNZXNoOiBudW1iZXIgPSB0aGlzLmlNZXNoKTogUHJvbWlzZTxNZXNoRkJYPiB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLmlNZXNoID0gX2lNZXNoO1xyXG4gICAgICBjb25zdCBsb2FkZXI6IEZCWExvYWRlciA9IGF3YWl0IEZCWExvYWRlci5MT0FEKHRoaXMudXJsLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjb25zdCBnZW9tZXRyeUZCWDogRkJYLkdlb21ldHJ5ID0gKFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5nZW9tZXRyaWVzW19pTWVzaF0gfHxcclxuICAgICAgICBsb2FkZXIuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5maW5kKF9vYmplY3QgPT4gX29iamVjdC5uYW1lID09IHRoaXMubmFtZSkgfHxcclxuICAgICAgICBsb2FkZXIuZmJ4Lm9iamVjdHMubW9kZWxzLmZpbmQoX29iamVjdCA9PiBfb2JqZWN0Lm5hbWUgPT0gdGhpcy5uYW1lICYmIF9vYmplY3Quc3VidHlwZSA9PSBcIk1lc2hcIikuY2hpbGRyZW5bMF1cclxuICAgICAgKS5sb2FkKCk7XHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWClcclxuICAgICAgICB0aGlzLm5hbWUgPSBnZW9tZXRyeUZCWC5uYW1lLmxlbmd0aCA+IDAgPyBnZW9tZXRyeUZCWC5uYW1lIDogZ2VvbWV0cnlGQlgucGFyZW50c1swXS5uYW1lO1xyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGxldCB2ZXJ0ZXhCdWZmZXI6IEZsb2F0MzJBcnJheSA9IGdlb21ldHJ5RkJYLlZlcnRpY2VzO1xyXG4gICAgICBmb3IgKGxldCBpVmVydGV4OiBudW1iZXIgPSAwOyBpVmVydGV4IDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaVZlcnRleCArPSAzKSB7XHJcbiAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjModmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAwXSwgdmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAxXSwgdmVydGV4QnVmZmVyW2lWZXJ0ZXggKyAyXSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgdXZzOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgaWYgKGdlb21ldHJ5RkJYLkxheWVyRWxlbWVudFVWKSB7XHJcbiAgICAgICAgbGV0IHV2QnVmZmVyOiBGbG9hdDMyQXJyYXkgPSBnZW9tZXRyeUZCWC5MYXllckVsZW1lbnRVVi5VVjtcclxuICAgICAgICBmb3IgKGxldCBpdXY6IG51bWJlciA9IDA7IGl1diA8IHV2QnVmZmVyLmxlbmd0aDsgaXV2ICs9IDIpIHtcclxuICAgICAgICAgIHV2cy5wdXNoKG5ldyBWZWN0b3IyKHV2QnVmZmVyW2l1dl0sIDEgLSB1dkJ1ZmZlcltpdXYgKyAxXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG5vcm1hbHM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBpZiAoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsKSB7XHJcbiAgICAgICAgbGV0IG5vcm1hbEJ1ZmZlcjogRmxvYXQzMkFycmF5ID0gZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLk5vcm1hbHM7XHJcbiAgICAgICAgZm9yIChsZXQgaU5vcm1hbDogbnVtYmVyID0gMDsgaU5vcm1hbCA8IG5vcm1hbEJ1ZmZlci5sZW5ndGg7IGlOb3JtYWwgKz0gMykge1xyXG4gICAgICAgICAgbm9ybWFscy5wdXNoKG5ldyBWZWN0b3IzKG5vcm1hbEJ1ZmZlcltpTm9ybWFsXSwgbm9ybWFsQnVmZmVyW2lOb3JtYWwgKyAxXSwgbm9ybWFsQnVmZmVyW2lOb3JtYWwgKyAyXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG1hcFZlcnRleFRvSW5kZXg6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcbiAgICAgIGxldCBuZXdWZXJ0ZXhJbmRpY2VzOiBudW1iZXJbXVtdID0gW107XHJcbiAgICAgIGxldCBpUG9seWdvbjogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGlzRW5kT2ZQb2x5Z29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBwb2x5Z29uOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgZ2VvbWV0cnlGQlguUG9seWdvblZlcnRleEluZGV4LmZvckVhY2goKF9pVmVydGV4LCBfaVBvbHlnb25WZXJ0ZXgpID0+IHtcclxuICAgICAgICBpZiAoX2lWZXJ0ZXggPCAwKSB7XHJcbiAgICAgICAgICBfaVZlcnRleCA9IF9pVmVydGV4IF4gLSAxO1xyXG4gICAgICAgICAgaXNFbmRPZlBvbHlnb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gcG9zaXRpb25zW19pVmVydGV4XTtcclxuICAgICAgICBsZXQgdXY6IFZlY3RvcjIgPSB1dnNbdGhpcy5nZXREYXRhSW5kZXgoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50VVYsIF9pVmVydGV4LCBpUG9seWdvbiwgX2lQb2x5Z29uVmVydGV4KV07XHJcblxyXG4gICAgICAgIGxldCB2ZXJ0ZXhLZXk6IHN0cmluZyA9IHBvc2l0aW9uLnRvU3RyaW5nKCkgKyB1di50b1N0cmluZygpO1xyXG4gICAgICAgIGlmICghbWFwVmVydGV4VG9JbmRleC5oYXModmVydGV4S2V5KSkge1xyXG4gICAgICAgICAgbGV0IG5vcm1hbDogVmVjdG9yMyA9IG5vcm1hbHNbdGhpcy5nZXREYXRhSW5kZXgoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLCBfaVZlcnRleCwgaVBvbHlnb24sIF9pUG9seWdvblZlcnRleCldO1xyXG5cclxuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChuZXcgVmVydGV4KHBvc2l0aW9uLCB1diwgbm9ybWFsKSk7XHJcbiAgICAgICAgICBtYXBWZXJ0ZXhUb0luZGV4LnNldCh2ZXJ0ZXhLZXksIHRoaXMudmVydGljZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICBpZiAoIW5ld1ZlcnRleEluZGljZXNbX2lWZXJ0ZXhdKVxyXG4gICAgICAgICAgICBuZXdWZXJ0ZXhJbmRpY2VzW19pVmVydGV4XSA9IFtdO1xyXG4gICAgICAgICAgbmV3VmVydGV4SW5kaWNlc1tfaVZlcnRleF0ucHVzaCh0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwb2x5Z29uLnB1c2gobWFwVmVydGV4VG9JbmRleC5nZXQodmVydGV4S2V5KSk7XHJcblxyXG4gICAgICAgIGlmIChpc0VuZE9mUG9seWdvbikge1xyXG4gICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID09IDMpIHtcclxuICAgICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKHRoaXMudmVydGljZXMsIHBvbHlnb25bMF0sIHBvbHlnb25bMV0sIHBvbHlnb25bMl0pKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocG9seWdvbi5sZW5ndGggPT0gNCkge1xyXG4gICAgICAgICAgICBsZXQgcXVhZDogUXVhZCA9IG5ldyBRdWFkKHRoaXMudmVydGljZXMsIHBvbHlnb25bMF0sIHBvbHlnb25bMV0sIHBvbHlnb25bMl0sIHBvbHlnb25bM10pO1xyXG4gICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvbltpIC0gMV0sIHBvbHlnb25baSAtIDBdKSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgJHtNZXNoTG9hZGVyRkJYLm5hbWV9OiBQb2x5Z29ucyB3aXRoIG1vcmUgdGhhbiA0IHZlcnRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9seWdvbiA9IFtdO1xyXG4gICAgICAgICAgaXNFbmRPZlBvbHlnb24gPSBmYWxzZTtcclxuICAgICAgICAgIGlQb2x5Z29uKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWC5jaGlsZHJlbj8uWzBdLnR5cGUgPT0gXCJEZWZvcm1lclwiKSB7XHJcbiAgICAgICAgY29uc3QgZmJ4RGVmb3JtZXI6IEZCWC5EZWZvcm1lciA9IGdlb21ldHJ5RkJYLmNoaWxkcmVuWzBdO1xyXG4gICAgICAgIGNvbnN0IHNrZWxldG9uOiBDb21wb25lbnRTa2VsZXRvbiA9IGF3YWl0IGxvYWRlci5nZXRTa2VsZXRvbihmYnhEZWZvcm1lci5jaGlsZHJlblswXS5jaGlsZHJlblswXSk7IC8vIERlZm9ybWVyLlN1YkRlZm9ybWVyLkxpbWJOb2RlXHJcbiAgICAgICAgdGhpcy5jcmVhdGVCb25lcyhmYnhEZWZvcm1lciwgc2tlbGV0b24sIHRoaXMudmVydGljZXMsIG5ld1ZlcnRleEluZGljZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pTWVzaCA9IHRoaXMuaU1lc2g7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuaU1lc2ggPSBfc2VyaWFsaXphdGlvbi5pTWVzaDtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldERhdGFJbmRleChfbGF5ZXJFbGVtZW50OiBGQlguTGF5ZXJFbGVtZW50VVYgfCBGQlguTGF5ZXJFbGVtZW50Tm9ybWFsLCBfaVZlcnRleDogbnVtYmVyLCBfaVBvbHlnb246IG51bWJlciwgX2lQb2x5Z29uVmVydGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9XHJcbiAgICAgICAgX2xheWVyRWxlbWVudC5NYXBwaW5nSW5mb3JtYXRpb25UeXBlID09IFwiQnlWZXJ0ZXhcIiA/XHJcbiAgICAgICAgICBfaVZlcnRleCA6XHJcbiAgICAgICAgICBfbGF5ZXJFbGVtZW50Lk1hcHBpbmdJbmZvcm1hdGlvblR5cGUgPT0gXCJCeVBvbHlnb25cIiA/XHJcbiAgICAgICAgICAgIF9pUG9seWdvbiA6XHJcbiAgICAgICAgICAgIF9pUG9seWdvblZlcnRleDtcclxuXHJcbiAgICAgIGlmIChfbGF5ZXJFbGVtZW50LlJlZmVyZW5jZUluZm9ybWF0aW9uVHlwZSA9PT0gJ0luZGV4VG9EaXJlY3QnKSB7XHJcbiAgICAgICAgbGV0IGluZGljZXM6IFVpbnQxNkFycmF5ID0gKF9sYXllckVsZW1lbnQgYXMgRkJYLkxheWVyRWxlbWVudFVWKS5VVkluZGV4IHx8IChfbGF5ZXJFbGVtZW50IGFzIEZCWC5MYXllckVsZW1lbnROb3JtYWwpLk5vcm1hbHNJbmRleDtcclxuICAgICAgICBpbmRleCA9IGluZGljZXNbaW5kZXhdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVCb25lcyhfZGVmb3JtZXJGQlg6IEZCWC5EZWZvcm1lciwgX3NrZWxldG9uOiBDb21wb25lbnRTa2VsZXRvbiwgX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX25ld1ZlcnRleEluZGljZXM/OiBudW1iZXJbXVtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAoY29uc3QgZmJ4U3ViRGVmb3JtZXIgb2YgX2RlZm9ybWVyRkJYLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgZmJ4U3ViRGVmb3JtZXIubG9hZCgpO1xyXG4gICAgICAgIGlmIChmYnhTdWJEZWZvcm1lci5JbmRleGVzKVxyXG4gICAgICAgICAgZm9yIChsZXQgaUJvbmVJbmZsdWVuY2U6IG51bWJlciA9IDA7IGlCb25lSW5mbHVlbmNlIDwgZmJ4U3ViRGVmb3JtZXIuSW5kZXhlcy5sZW5ndGg7IGlCb25lSW5mbHVlbmNlKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaVZlcnRleDogbnVtYmVyID0gZmJ4U3ViRGVmb3JtZXIuSW5kZXhlc1tpQm9uZUluZmx1ZW5jZV07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaVZlcnRleE5ldyBvZiBfbmV3VmVydGV4SW5kaWNlcyA/IF9uZXdWZXJ0ZXhJbmRpY2VzW2lWZXJ0ZXhdIDogW2lWZXJ0ZXhdKSB7XHJcbiAgICAgICAgICAgICAgKF92ZXJ0aWNlc1tpVmVydGV4TmV3XS5ib25lcyB8fCAoX3ZlcnRpY2VzW2lWZXJ0ZXhOZXddLmJvbmVzID0gW10pKS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGluZGV4OiBfc2tlbGV0b24uaW5kZXhPZihmYnhTdWJEZWZvcm1lci5jaGlsZHJlblswXS5uYW1lKSxcclxuICAgICAgICAgICAgICAgIHdlaWdodDogZmJ4U3ViRGVmb3JtZXIuV2VpZ2h0c1tpQm9uZUluZmx1ZW5jZV0gfHwgMVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKiogQWxsb3dzIHRvIGNyZWF0ZSBjdXN0b20gbWVzaGVzIGZyb20gZ2l2ZW4gRGF0YSAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoRnJvbURhdGEgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHByb3RlY3RlZCB2ZXJ0aWNlc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBwcm90ZWN0ZWQgdGV4dHVyZVVWc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBwcm90ZWN0ZWQgaW5kaWNlc1RvU2V0OiBVaW50MTZBcnJheTtcclxuICAgIHByb3RlY3RlZCBmYWNlTm9ybWFsc1RvU2V0OiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF92ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBfdGV4dHVyZVVWczogRmxvYXQzMkFycmF5LCBfaW5kaWNlczogVWludDE2QXJyYXksIF9mYWNlTm9ybWFsczogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMudmVydGljZXNUb1NldCA9IF92ZXJ0aWNlcztcclxuICAgICAgdGhpcy50ZXh0dXJlVVZzVG9TZXQgPSBfdGV4dHVyZVVWcztcclxuICAgICAgdGhpcy5pbmRpY2VzVG9TZXQgPSBfaW5kaWNlcztcclxuICAgICAgdGhpcy5mYWNlTm9ybWFsc1RvU2V0ID0gX2ZhY2VOb3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVUZXh0dXJlVVZzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRleHR1cmVVVnNUb1NldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSW5kaWNlcygpOiBVaW50MTZBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZGljZXNUb1NldDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlRmxhdE5vcm1hbHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmFjZU5vcm1hbHNUb1NldDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1lc2h9IGxvYWRlZCBmcm9tIGEgZ2xURi1GaWxlLlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoR0xURiBleHRlbmRzIG1peGluU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbChNZXNoKSB7XHJcbiAgICBwdWJsaWMgaVByaW1pdGl2ZTogbnVtYmVyOyAvLyBtb3N0IGxpa2VseSB3aWxsIG5vdCBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUgZ2xURiBmaWxlLi4uXHJcblxyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSwgX2lQcmltaXRpdmU6IG51bWJlciA9IHRoaXMuaVByaW1pdGl2ZSk6IFByb21pc2U8TWVzaEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5pUHJpbWl0aXZlID0gX2lQcmltaXRpdmU7XHJcbiAgICAgIHJldHVybiBHTFRGTG9hZGVyLmxvYWRSZXNvdXJjZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBjb25zdCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaVByaW1pdGl2ZSA9IHRoaXMuaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5pUHJpbWl0aXZlID0gX3NlcmlhbGl6YXRpb24uaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIG1lc2ggbG9hZGVkIGZyb20gYW4gT0JKLWZpbGUuXHJcbiAgICogU2ltcGxlIFdhdmVmcm9udCBPQkogaW1wb3J0LiBUYWtlcyBhIHdhdmVmcm9udCBvYmogc3RyaW5nLiBUbyBMb2FkIGZyb20gYSBmaWxlIHVybCwgdXNlIHRoZVxyXG4gICAqIHN0YXRpYyBMT0FEIE1ldGhvZC4gQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCB0cmlhbmd1bGF0ZWQgTWVzaGVzXHJcbiAgICogKGFjdGl2YXRlICdHZW9tZW50cnkg4oaSIFRyaWFuZ3VsYXRlIEZhY2VzJyBpbiBCbGVuZGVycyBvYmogZXhwb3J0ZXIpXHJcbiAgICogQHRvZG8gTG9hZCBNYXRlcmlhbHMsIFN1cHBvcnQgUXVhZHNcclxuICAgKiBAYXV0aG9ycyBTaW1vbiBTdG9ybC1TY2h1bGtlIDIwMjEgfCBMdWlzIEtlY2ssIEhGVSwgMjAyMSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjIgfCBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoT0JKIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsKTogUHJvbWlzZTxNZXNoT0JKPiB7XHJcbiAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gbmV3IFVSTChfdXJsLnRvU3RyaW5nKCksIFByb2plY3QuYmFzZVVSTCkudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgZGF0YTogc3RyaW5nID0gYXdhaXQgKGF3YWl0IGZldGNoKHVybCkpLnRleHQoKTtcclxuICAgICAgdGhpcy5uYW1lID0gdXJsLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG5cclxuICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gZGF0YS5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGNvbnN0IHV2czogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGNvbnN0IG5vcm1hbHM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBjb25zdCBub3JtczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAgIGNvbnN0IHZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBjb25zdCBmYWNlczogRmFjZVtdID0gW107XHJcbiAgICAgIGNvbnN0IG1hcFBvc2l0aW9uVVZOb3JtYWxUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgIGNvbnN0IG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgY3JlYXRpbmcgdGhlIG5lZWRlZCBidWZmZXJzIGZvciByZW5kZXJtZXNoIGhlcmUgYWxyZWFkeS4uLlxyXG4gICAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gbGluZS50cmltKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIHN3aXRjaCAocGFydHMuc2hpZnQoKSkge1xyXG4gICAgICAgICAgY2FzZSBcInZcIjogLy9WZXJ0ZXggLSBleGFtcGxlOiB2IDAuNzAgLTAuNDUgLTAuNTIgICAgICAgICBcclxuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2gobmV3IFZlY3RvcjMoLi4ucGFydHMubWFwKF92YWx1ZSA9PiArX3ZhbHVlKSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJ2blwiOiAvL05vcm1hbCAtIGV4YW1wbGU6IHZuIDAuMDAgMC4wMCAxLjAwXHJcbiAgICAgICAgICAgIG5vcm1hbHMucHVzaChuZXcgVmVjdG9yMyguLi5wYXJ0cy5tYXAoX3ZhbHVlID0+ICtfdmFsdWUpKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInZ0XCI6IC8vVGV4Y29vcmQgLSBleGFtcGxlOiB2dCAwLjU0NTQ1NCAwLjQ3MjM4MlxyXG4gICAgICAgICAgICB1dnMucHVzaChuZXcgVmVjdG9yMiguLi5wYXJ0cy5tYXAoKF92YWx1ZSwgX2luZGV4KSA9PiArX3ZhbHVlICogKF9pbmRleCA9PSAxID8gLTEgOiAxKSkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZlwiOiAvKkZhY2UgSW5kaWNlcyAtIGV4YW1wbGU6IGYgMS8xLzEgMi8yLzEgMy8zLzEgLS0+IHZlcnRleDEvdGV4Y29vcmQxL25vcm1hbDEgdmVydGV4Mi90ZXhjb29yZDIvbm9ybWFsMiB2ZXJ0ZXgzL3RleGNvb3JkMy9ub3JtYWwzKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDM7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBrZXk6IHN0cmluZyA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICAgIGxldCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXhba2V5XTtcclxuICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhJbmZvOiBzdHJpbmdbXSA9IHBhcnRzW2ldLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IHBvc2l0aW9uc1srdmVydGV4SW5mb1swXSAtIDFdOyAvLyBvYmogdXNlcyAxLWJhc2VkIGluZGljZXNcclxuICAgICAgICAgICAgICAgIGxldCB1djogVmVjdG9yMiA9IHV2c1srdmVydGV4SW5mb1sxXSAtIDFdID8/IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSBub3JtYWxzWyt2ZXJ0ZXhJbmZvWzJdIC0gMV0gPz8gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWwpXHJcbiAgICAgICAgICAgICAgICAgIG5vcm1zLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGtleVBvc05vcm06IHN0cmluZyA9IGAke3ZlcnRleEluZm9bMF19LyR7dmVydGV4SW5mb1syXX1gO1xyXG4gICAgICAgICAgICAgICAgdmVydGljZXMucHVzaChuZXcgVmVydGV4KG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA/PyBwb3NpdGlvbiwgdXYsIG5vcm1hbCkpO1xyXG4gICAgICAgICAgICAgICAgbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXhba2V5XSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgIG1hcFBvc2l0aW9uTm9ybWFsVG9JbmRleFtrZXlQb3NOb3JtXSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgZmFjZXMucHVzaChuZXcgRmFjZSh2ZXJ0aWNlcywgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDJdLCBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0sIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAzXSkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xyXG4gICAgICB0aGlzLmZhY2VzID0gZmFjZXM7XHJcbiAgICAgIGlmIChub3Jtcy5sZW5ndGggPiAwKSAvLyBUT0RPOiByZW5kZXJtZXNoIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSB1bmRlZmluZWQgbm9ybWFscyBjb3JyZWN0bHksIGkuZS4gY2FsY3VsYXRlIHRoZW0gb25seSBpZiB0aGV5IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgdmVydGljZXNcclxuICAgICAgICB0aGlzLnJlbmRlck1lc2gubm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkobm9ybXMpO1xyXG4gICAgICAvLyBfbWVzaC5yZW5kZXJNZXNoLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoaW5kaWNlcyk7IC8vIGRvZW5zJ3Qgc2VlbSB0byBhZmZlY3Qgc2NlbmUgbG9hZGluZyB0aW1lLi4uXHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIHNpbXBsZSBweXJhbWlkIHdpdGggZWRnZXMgYXQgdGhlIGJhc2Ugb2YgbGVuZ3RoIDEgYW5kIGEgaGVpZ2h0IG9mIDEuIFRoZSBzaWRlcyBjb25zaXN0aW5nIG9mIG9uZSwgdGhlIGJhc2Ugb2YgdHdvIHRyaWdvbnNcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAgICA0XHJcbiAgICogICAgICAgICAgICAgIC9cXGAuXHJcbiAgICogICAgICAgICAgICAzL19fXFxfXFwgMlxyXG4gICAqICAgICAgICAgICAwL19fX19cXC8xXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFB5cmFtaWQgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFB5cmFtaWQpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUHlyYW1pZFwiKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgLy8gdGhpcy5jcmVhdGUoKTtcclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoXHJcbiAgICAgICAgLy8gZ3JvdW5kIHZlcnRpY2VzXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjAsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC4wLCAwLjUpLCBuZXcgVmVjdG9yMigxLCAxKSksXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygwLjUsIDAuMCwgLTAuNSksIG5ldyBWZWN0b3IyKDEsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIDAuMCwgLTAuNSksIG5ldyBWZWN0b3IyKDAsIDApKSxcclxuICAgICAgICAvLyB0aXAgKHZlcnRleCAjNClcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuMCwgMS4wLCAwLjApLCBuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxyXG4gICAgICAgIC8vIGZsb29yIGFnYWluIGZvciBkb3duc2lkZSB0ZXh0dXJlXHJcbiAgICAgICAgbmV3IFZlcnRleCgwLCBuZXcgVmVjdG9yMigwLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgxLCBuZXcgVmVjdG9yMigxLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgyLCBuZXcgVmVjdG9yMigxLCAxKSksXHJcbiAgICAgICAgbmV3IFZlcnRleCgzLCBuZXcgVmVjdG9yMigwLCAxKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAwLCAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAxLCAyKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAyLCAzKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA0LCAzLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA1ICsgMCwgNSArIDIsIDUgKyAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCA1ICsgMCwgNSArIDMsIDUgKyAyKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc2ltcGxlIHF1YWQgd2l0aCBlZGdlcyBvZiBsZW5ndGggMSwgdGhlIGZhY2UgY29uc2lzdGluZyBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgMCBfXyAzXHJcbiAgICogICAgICAgICB8X1xcfFxyXG4gICAqICAgICAgICAxICAgIDIgICAgICAgICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFF1YWQgZXh0ZW5kcyBNZXNoUG9seWdvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hRdWFkKTtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgc2hhcGU6IFZlY3RvcjJbXSA9IFtcclxuICAgICAgbmV3IFZlY3RvcjIoLTAuNSwgMC41KSwgbmV3IFZlY3RvcjIoLTAuNSwgLTAuNSksIG5ldyBWZWN0b3IyKDAuNSwgLTAuNSksIG5ldyBWZWN0b3IyKDAuNSwgMC41KVxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFF1YWRcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSwgTWVzaFF1YWQuc2hhcGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8vIGZsYXQgZXF1YWxzIHNtb290aFxyXG4gICAgLy8gcHVibGljIGdldCB2ZXJ0aWNlc0ZsYXQoKTogRmxvYXQzMkFycmF5IHsgcmV0dXJuIHRoaXMudmVydGljZXM7IH1cclxuICAgIC8vIHB1YmxpYyBnZXQgaW5kaWNlc0ZsYXQoKTogVWludDE2QXJyYXkgeyByZXR1cm4gdGhpcy5pbmRpY2VzOyB9XHJcbiAgICAvLyBwdWJsaWMgZ2V0IG5vcm1hbHNGbGF0KCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLm5vcm1hbHNWZXJ0ZXg7IH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNnZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmNyZWF0ZShNZXNoUXVhZC5zaGFwZSwgdHJ1ZSk7IC8vIHRoaXMgc2VlbXMgdG8gYmUgZGlzcGF0Y2hlZCBkb3VibGVkIHdoaWxlIGRlc2VyaWFsaXppbmcgdGhlIHJlc291cmNlc1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5maXRUZXh0dXJlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKiogXHJcbiAgICogVGhpcyBmdW5jdGlvbiB0eXBlIHRha2VzIHggYW5kIHogYXMgUGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIG51bWJlciBiZXR3ZWVuIC0xIGFuZCAxIHRvIGJlIHVzZWQgYXMgYSBoZWlnaHRtYXAuIFxyXG4gICAqIHggKiB6ICogMiByZXByZXNlbnQgdGhlIGFtb3V0IG9mIGZhY2VzIHdoaWNoIGFyZSBjcmVhdGVkLiBBcyBhIHJlc3VsdCB5b3UgZ2V0IDEgdmVydGV4IG1vcmUgaW4gZWFjaCBkaXJlY3Rpb24gKHggYW5kIHogYXhpcylcclxuICAgKiBUaGUgeS1jb21wb25lbnQgb2YgdGhlIHJlc3VsdGluZyBtZXNoIG1heSBiZSBtb3ZlZCB0byB2YWx1ZXMgYmV0d2VlbiAwIGFuZCBhIG1heGltdW0gaGVpZ2h0LlxyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgdHlwZSBIZWlnaHRNYXBGdW5jdGlvbiA9ICh4OiBudW1iZXIsIHo6IG51bWJlcikgPT4gbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVydGljYWwgcHJvamVjdGlvbiBvZiBhIGdpdmVuIHBvc2l0aW9uIG9udG8gdGhlIHRlcnJhaW5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGVycmFpbkluZm8ge1xyXG4gICAgLyoqIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9pbnQgdmVydGljYWxseSBwcm9qZWN0ZWQgb24gdGhlIHRlcnJhaW4gaW4gd29ybGQgY29vcmRpbmF0ZXMgKi9cclxuICAgIHB1YmxpYyBwb3NpdGlvbjogVmVjdG9yMztcclxuICAgIC8qKiB0aGUgbm9ybWFsIG9mIHRoZSBmYWNlIG9mIHRoZSB0ZXJyYWluIHVuZGVyIHRoZSBwb2ludCBpbiB3b3JsZCBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIG5vcm1hbDogVmVjdG9yMztcclxuICAgIC8qKiB2ZXJ0aWNhbCBkaXN0YW5jZSBvZiB0aGUgcG9pbnQgdG8gdGhlIHRlcnJhaW4sIG5lZ2F0aXZlIGlmIGJlbG93ICovXHJcbiAgICBwdWJsaWMgZGlzdGFuY2U6IG51bWJlcjtcclxuICAgIC8qKiB0aGUgcG9zaXRpb24gaW4gZmFjZSBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uRmFjZTogVmVjdG9yMztcclxuICAgIC8qKiB0aGUgaW5kZXggb2YgdGhlIGZhY2UgdGhlIHBvc2l0aW9uIGlzIGluc2lkZSAqL1xyXG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XHJcbiAgICAvKiogdGhlIGdyaWQgY29vcmRpbmF0ZXMgb2YgdGhlIHF1YWQgdGhlIGZhY2UgYmVsb25ncyB0byAqL1xyXG4gICAgcHVibGljIGdyaWQ6IFZlY3RvcjI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHRlcnJhaW4gc3ByZWFkcyBvdXQgaW4gdGhlIHgtei1wbGFuZSwgeSBpcyB0aGUgaGVpZ2h0IGRlcml2ZWQgZnJvbSB0aGUgaGVpZ2h0bWFwIGZ1bmN0aW9uLiBcclxuICAgKiBUaGUgdGVycmFpbiBpcyBhbHdheXMgMSBpbiBzaXplIGluIGFsbCBkaW1lbnNpb25zLCBmaXR0aW5nIGludG8gdGhlIHVuaXQtY3ViZS4gXHJcbiAgICogUmVzb2x1dGlvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcXVhZHMgaW4geCBhbmQgeiBkaW1lbnNpb24sIHNjYWxlIHRoZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgeCx6LWNvb3JkaW5hdGVzIHBhc3NlZCB0byB0aGUgaGVpZ2h0bWFwIGZ1bmN0aW9uLlxyXG4gICAqIFN0YW5kYXJkIGZ1bmN0aW9uIGlzIHRoZSBzaW1wbGV4IG5vaXNlIGltcGxlbWVudGVkIHdpdGggRlVER0UsIGJ1dCBhbm90aGVyIGZ1bmN0aW9uIGNhbiBiZSBnaXZlbi5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyIHwgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgTW9yaXR6IEJlYXVncmFuZCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hUZXJyYWluIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hUZXJyYWluKTtcclxuICAgIHByb3RlY3RlZCByZXNvbHV0aW9uOiBWZWN0b3IyO1xyXG4gICAgcHJvdGVjdGVkIHNjYWxlOiBWZWN0b3IyO1xyXG4gICAgcHJvdGVjdGVkIHNlZWQ6IG51bWJlcjtcclxuICAgIHByb3RlY3RlZCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoVGVycmFpblwiLCBfcmVzb2x1dGlvbjogVmVjdG9yMiA9IFZlY3RvcjIuT05FKDIpLCBfc2NhbGVJbnB1dDogVmVjdG9yMiA9IFZlY3RvcjIuT05FKCksIF9mdW5jdGlvbk9yU2VlZDogSGVpZ2h0TWFwRnVuY3Rpb24gfCBudW1iZXIgPSAwKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3Jlc29sdXRpb24sIF9zY2FsZUlucHV0LCBfZnVuY3Rpb25PclNlZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgbWVzaCBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3Jlc29sdXRpb246IFZlY3RvcjIgPSBWZWN0b3IyLk9ORSgyKSwgX3NjYWxlSW5wdXQ6IFZlY3RvcjIgPSBWZWN0b3IyLk9ORSgpLCBfZnVuY3Rpb25PclNlZWQ6IEhlaWdodE1hcEZ1bmN0aW9uIHwgbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuc2VlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5yZXNvbHV0aW9uID0gbmV3IFZlY3RvcjIoTWF0aC5yb3VuZChfcmVzb2x1dGlvbi54KSwgTWF0aC5yb3VuZChfcmVzb2x1dGlvbi55KSk7XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2NhbGVJbnB1dC5jbG9uZTtcclxuXHJcbiAgICAgIGlmIChfZnVuY3Rpb25PclNlZWQgaW5zdGFuY2VvZiBGdW5jdGlvbilcclxuICAgICAgICB0aGlzLmhlaWdodE1hcEZ1bmN0aW9uID0gX2Z1bmN0aW9uT3JTZWVkO1xyXG4gICAgICBlbHNlIGlmICh0eXBlb2YgKF9mdW5jdGlvbk9yU2VlZCkgPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgIHRoaXMuc2VlZCA9IF9mdW5jdGlvbk9yU2VlZDtcclxuICAgICAgICBsZXQgcHJuZzogUmFuZG9tID0gbmV3IFJhbmRvbSh0aGlzLnNlZWQpO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBuZXcgTm9pc2UyKCgpID0+IHBybmcuZ2V0Tm9ybSgpKS5zYW1wbGU7IC8vIFRPRE8gY2FsbCBQUk5HXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBuZXcgTm9pc2UyKCkuc2FtcGxlO1xyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICAvL0l0ZXJhdGUgb3ZlciBlYWNoIGNlbGwgdG8gZ2VuZXJhdGUgZ3JpZCBvZiB2ZXJ0aWNlc1xyXG4gICAgICBmb3IgKGxldCB6OiBudW1iZXIgPSAwOyB6IDw9IHRoaXMucmVzb2x1dGlvbi55OyB6KyspIHtcclxuICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDw9IHRoaXMucmVzb2x1dGlvbi54OyB4KyspIHtcclxuICAgICAgICAgIGxldCB4Tm9ybTogbnVtYmVyID0geCAvIHRoaXMucmVzb2x1dGlvbi54O1xyXG4gICAgICAgICAgbGV0IHpOb3JtOiBudW1iZXIgPSB6IC8gdGhpcy5yZXNvbHV0aW9uLnk7XHJcbiAgICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IFZlcnRleChcclxuICAgICAgICAgICAgbmV3IFZlY3RvcjMoeE5vcm0gLSAwLjUsIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24oeE5vcm0gKiB0aGlzLnNjYWxlLngsIHpOb3JtICogdGhpcy5zY2FsZS55KSwgek5vcm0gLSAwLjUpLFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMih4Tm9ybSwgek5vcm0pXHJcbiAgICAgICAgICApKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBxdWFkczogUXVhZFtdID0gW107XHJcbiAgICAgIGxldCBzcGxpdDogUVVBRFNQTElUID0gUVVBRFNQTElULkFUXzA7XHJcbiAgICAgIGZvciAobGV0IHo6IG51bWJlciA9IDA7IHogPCB0aGlzLnJlc29sdXRpb24ueTsgeisrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgeDogbnVtYmVyID0gMDsgeCA8IHRoaXMucmVzb2x1dGlvbi54OyB4KyspIHtcclxuICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFF1YWQoXHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXMsXHJcbiAgICAgICAgICAgICh4ICsgMCkgKyAoeiArIDApICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMCkgKyAoeiArIDEpICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMSkgKyAoeiArIDEpICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgICh4ICsgMSkgKyAoeiArIDApICogKHRoaXMucmVzb2x1dGlvbi54ICsgMSksXHJcbiAgICAgICAgICAgIHNwbGl0XHJcbiAgICAgICAgICApKTtcclxuICAgICAgICAgIHNwbGl0ID0gKHNwbGl0ID09IFFVQURTUExJVC5BVF8wKSA/IFFVQURTUExJVC5BVF8xIDogUVVBRFNQTElULkFUXzA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlc29sdXRpb24ueCAlIDIgPT0gMCkgLy8gcmV2ZXJzZSBsYXN0IHNwbGl0IGNoYW5nZSBpZiB4LXJlc29sdXRpb24gaXMgZXZlblxyXG4gICAgICAgICAgc3BsaXQgPSAoc3BsaXQgPT0gUVVBRFNQTElULkFUXzApID8gUVVBRFNQTElULkFUXzEgOiBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZhY2VzID0gcXVhZHMuZmxhdE1hcCgoX3F1YWQ6IFF1YWQpID0+IF9xdWFkLmZhY2VzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnRpY2FsIHByb2plY3Rpb24gb2YgdGhlIGdpdmVuIHBvc2l0aW9uIG9udG8gdGhlIHRlcnJhaW4uXHJcbiAgICAgKiBQYXNzIHRoZSBvdmVyYWxsIHdvcmxkIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSB0ZXJyYWluIGlmIHRoZSBwb3NpdGlvbiBpcyBnaXZlbiBpbiB3b3JsZCBjb29yZGluYXRlcy5cclxuICAgICAqIElmIGF0IGhhbmQsIHBhc3MgdGhlIGludmVyc2UgdG9vIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGN1bGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VGVycmFpbkluZm8oX3Bvc2l0aW9uOiBWZWN0b3IzLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfbXR4SW52ZXJzZT86IE1hdHJpeDR4NCk6IFRlcnJhaW5JbmZvIHtcclxuICAgICAgaWYgKCFfbXR4SW52ZXJzZSlcclxuICAgICAgICBfbXR4SW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKF9tdHhXb3JsZCk7XHJcblxyXG4gICAgICBsZXQgdGVycmFpbkluZm86IFRlcnJhaW5JbmZvID0gbmV3IFRlcnJhaW5JbmZvO1xyXG5cclxuICAgICAgbGV0IHBvc0xvY2FsOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9zaXRpb24sIF9tdHhJbnZlcnNlLCB0cnVlKTtcclxuXHJcblxyXG4gICAgICBsZXQgejogbnVtYmVyID0gTWF0aC5mbG9vcigocG9zTG9jYWwueiArIDAuNSkgKiB0aGlzLnJlc29sdXRpb24ueSk7XHJcbiAgICAgIGxldCB4OiBudW1iZXIgPSBNYXRoLmZsb29yKChwb3NMb2NhbC54ICsgMC41KSAqIHRoaXMucmVzb2x1dGlvbi54KTtcclxuICAgICAgaWYgKHogPCAwIHx8IHogPiB0aGlzLnJlc29sdXRpb24ueSAtIDEgfHwgeCA8IDAgfHwgeCA+IHRoaXMucmVzb2x1dGlvbi54IC0gMSlcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gKHogKiB0aGlzLnJlc29sdXRpb24ueCArIHgpICogMjtcclxuICAgICAgbGV0IGZhY2U6IEZhY2UgPSB0aGlzLmZhY2VzW2luZGV4XTtcclxuXHJcbiAgICAgIGxldCByYXk6IFJheSA9IG5ldyBSYXkoVmVjdG9yMy5ZKCksIHBvc0xvY2FsKTtcclxuICAgICAgbGV0IHBvaW50OiBWZWN0b3IzID0gcmF5LmludGVyc2VjdEZhY2VQbGFuZShmYWNlKTtcclxuICAgICAgaWYgKCFmYWNlLmlzSW5zaWRlKHBvaW50KSkge1xyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgZmFjZSA9IHRoaXMuZmFjZXNbaW5kZXhdO1xyXG4gICAgICAgIHBvaW50ID0gcmF5LmludGVyc2VjdEZhY2VQbGFuZShmYWNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGVycmFpbkluZm8uaW5kZXggPSBpbmRleDtcclxuICAgICAgdGVycmFpbkluZm8ucG9zaXRpb25GYWNlID0gcG9pbnQ7XHJcbiAgICAgIHRlcnJhaW5JbmZvLnBvc2l0aW9uID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludCwgX210eFdvcmxkLCB0cnVlKTtcclxuICAgICAgdGVycmFpbkluZm8ubm9ybWFsID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihmYWNlLm5vcm1hbCwgTWF0cml4NHg0LlRSQU5TUE9TRShfbXR4SW52ZXJzZSksIGZhbHNlKTtcclxuICAgICAgdGVycmFpbkluZm8uZGlzdGFuY2UgPSBfcG9zaXRpb24ueSAtIHRlcnJhaW5JbmZvLnBvc2l0aW9uLnk7XHJcbiAgICAgIHRlcnJhaW5JbmZvLmdyaWQgPSB0aGlzLmdldEdyaWRGcm9tRmFjZUluZGV4KGluZGV4KTtcclxuICAgICAgcmV0dXJuIHRlcnJhaW5JbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ3JpZCBjb29yZGluYXRlcyBvZiB0aGUgcXVhZCB0aGUgZ2l2ZW4gZmFjZSBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0R3JpZEZyb21GYWNlSW5kZXgoX2luZGV4OiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLmdldChWZWN0b3IyKTtcclxuICAgICAgbGV0IGlRdWFkOiBudW1iZXIgPSBNYXRoLmZsb29yKF9pbmRleCAvIDIpO1xyXG4gICAgICByZXN1bHQuc2V0KGlRdWFkICUgdGhpcy5yZXNvbHV0aW9uLnksIE1hdGguZmxvb3IoaVF1YWQgLyB0aGlzLnJlc29sdXRpb24ueCkpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgdHdvIGZhY2VzIGZvcm1pbmcgdGhlIHF1YWQgdGhlIGdpdmVuIGdyaWQgcG9zaXRpb24gYmVsb25ncyB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZhY2VJbmRpY2VzRnJvbUdyaWQoX2dyaWQ6IFZlY3RvcjIpOiBudW1iZXJbXSB7XHJcbiAgICAgIGxldCBpUXVhZDogbnVtYmVyID0gX2dyaWQueSAqIDIgKiB0aGlzLnJlc29sdXRpb24ueCArIF9ncmlkLnggKiAyO1xyXG4gICAgICByZXR1cm4gW2lRdWFkLCBpUXVhZCArIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zZWVkID0gdGhpcy5zZWVkO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNjYWxlID0gdGhpcy5zY2FsZS5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHV0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJlc29sdXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLnNjYWxlLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnNjYWxlKTtcclxuICAgICAgdGhpcy5zZWVkID0gX3NlcmlhbGl6YXRpb24uc2VlZDtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5yZXNvbHV0aW9uLCB0aGlzLnNjYWxlLCB0aGlzLnNlZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnJlc29sdXRpb24sIHRoaXMuc2NhbGUsIHRoaXMuc2VlZCk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJNZXNoVGVycmFpbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcGxhbmFyIEdyaWQgYW5kIGFwcGxpZXMgYSBIZWlnaHRtYXAtRnVuY3Rpb24gdG8gaXQuXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBNb3JpdHogQmVhdWdyYW5kLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBAZW51bWVyYWJsZVxyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUmVsaWVmIGV4dGVuZHMgTWVzaFRlcnJhaW4ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUmVsaWVmKTtcclxuXHJcbiAgICAjdGV4dHVyZTogVGV4dHVyZUltYWdlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUmVsaWVmXCIsIF90ZXh0dXJlPzogVGV4dHVyZUltYWdlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBWZWN0b3IyLk9ORSgyKSwgdW5kZWZpbmVkLCAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4gMCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IF90ZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUhlaWdodE1hcEZ1bmN0aW9uKF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBIZWlnaHRNYXBGdW5jdGlvbiB7XHJcbiAgICAgIGxldCBhcnJheTogVWludDhDbGFtcGVkQXJyYXkgPSBNZXNoUmVsaWVmLnRleHR1cmVUb0NsYW1wZWRBcnJheShfdGV4dHVyZSk7XHJcbiAgICAgIGxldCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBwaXhlbDogbnVtYmVyID0gTWF0aC5yb3VuZChfeiAqIF90ZXh0dXJlLmltYWdlLndpZHRoICsgX3gpO1xyXG4gICAgICAgIHJldHVybiBhcnJheVtwaXhlbCAqIDRdIC8gMjU1O1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gaGVpZ2h0TWFwRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4dHVyZVRvQ2xhbXBlZEFycmF5KF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgY2FudmFzLndpZHRoID0gX3RleHR1cmUuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBfdGV4dHVyZS5pbWFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgY3JjOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjcmMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNyYy5kcmF3SW1hZ2UoX3RleHR1cmUuaW1hZ2UsIDAsIDApO1xyXG5cclxuICAgICAgcmV0dXJuIGNyYy5nZXRJbWFnZURhdGEoMCwgMCwgX3RleHR1cmUuaW1hZ2Uud2lkdGgsIF90ZXh0dXJlLmltYWdlLmhlaWdodCkuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgdGV4dHVyZSB0byBiZSB1c2VkIGFzIHRoZSBoZWlnaHRtYXAuXHJcbiAgICAgKiAqKkNhdXRpb24hKiogU2V0dGluZyB0aGlzIGNhdXNlcyB0aGUgbWVzaCB0byBiZSByZWNyZWF0ZWQgd2hpY2ggY2FuIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBlbnVtZXJhYmxlXHJcbiAgICBAdHlwZShUZXh0dXJlSW1hZ2UpXHJcbiAgICBwdWJsaWMgZ2V0IHRleHR1cmUoKTogVGV4dHVyZUltYWdlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RleHR1cmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmUoX3RleHR1cmU6IFRleHR1cmVJbWFnZSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlID0gX3RleHR1cmU7XHJcbiAgICAgIGlmICghX3RleHR1cmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcmVzb2x1dGlvbjogVmVjdG9yMiA9IF90ZXh0dXJlID8gbmV3IFZlY3RvcjIoX3RleHR1cmUuaW1hZ2Uud2lkdGggLSAxLCBfdGV4dHVyZS5pbWFnZS5oZWlnaHQgLSAxKSA6IHVuZGVmaW5lZDtcclxuICAgICAgc3VwZXIuY3JlYXRlKHJlc29sdXRpb24sIHJlc29sdXRpb24sIE1lc2hSZWxpZWYuY3JlYXRlSGVpZ2h0TWFwRnVuY3Rpb24oX3RleHR1cmUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNjYWxlO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3RleHR1cmUpXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbi5pZFRleHR1cmUgPSB0aGlzLnRleHR1cmUuaWRSZXNvdXJjZTtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKSBcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZUltYWdlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2VlZDtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNjYWxlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVzb2x1dGlvbjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vIC88cmVmZXJlbmNlIHBhdGg9XCJNZXNoUG9seWdvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcm90YXRpb24gb2YgYSBwb2x5Z29uIGFyb3VuZCB0aGUgeS1heGlzXHJcbiAgICogYGBgdGV4dCAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgKiAgICAgICAgICAgICAgICAgIF8gIOKGkSAwXzFcclxuICAgKiAgICAgICAgICAgICAgICAg4pSCICAg4pSC4oaSeCDilIIyICAgICAgICAgXHJcbiAgICogICAgICAgICAgICAgICAgICDilbIgIOKUgiAg4pWxMyAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgICAg4pWxICDilIIgIOKVsiAgIFxyXG4gICAqICAgICAgICAgICAgICAgICDilbFfX1/ilIJfX1/ilbI0IFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgIDVcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMS0yMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hSb3RhdGlvbiBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUm90YXRpb24pO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJ0aWNlc0RlZmF1bHQ6IFZlY3RvcjJbXSA9IFsgLy8gbGluZSBpcyB0aGUgbWluaW1hbCBzaGFwZVxyXG4gICAgICBuZXcgVmVjdG9yMigwLjUsIDAuNSksXHJcbiAgICAgIG5ldyBWZWN0b3IyKDAuNSwgLTAuNSlcclxuICAgIF07XHJcbiAgICBwcm90ZWN0ZWQgc2hhcGU6IE11dGFibGVBcnJheTxWZWN0b3IyPiA9IG5ldyBNdXRhYmxlQXJyYXk8VmVjdG9yMj4oVmVjdG9yMik7XHJcbiAgICBwcm90ZWN0ZWQgbG9uZ2l0dWRlczogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUm90YXRpb25cIiwgX3NoYXBlOiBWZWN0b3IyW10gPSBNZXNoUm90YXRpb24udmVydGljZXNEZWZhdWx0LCBfbG9uZ2l0dWRlczogbnVtYmVyID0gMykge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMucm90YXRlKF9zaGFwZSwgX2xvbmdpdHVkZXMpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIk11dGF0b3JcIiwgdGhpcy5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXQgbWluVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNoYXBlID0gU2VyaWFsaXplci5zZXJpYWxpemVBcnJheShWZWN0b3IyLCB0aGlzLnNoYXBlKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzID0gdGhpcy5sb25naXR1ZGVzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gPFZlY3RvcjJbXT5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplQXJyYXkoX3NlcmlhbGl6YXRpb24uc2hhcGUpO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBfc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzO1xyXG4gICAgICB0aGlzLnJvdGF0ZShzaGFwZSwgdGhpcy5sb25naXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5yb3RhdGUodGhpcy5zaGFwZSwgdGhpcy5sb25naXR1ZGVzKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEUpKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCByb3RhdGUoX3NoYXBlOiBWZWN0b3IyW10sIF9sb25naXR1ZGVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnNoYXBlID0gPE11dGFibGVBcnJheTxWZWN0b3IyPj5NdXRhYmxlQXJyYXkuZnJvbShfc2hhcGUubWFwKF92ZXJ0ZXggPT4gX3ZlcnRleC5jbG9uZSkpO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBNYXRoLnJvdW5kKF9sb25naXR1ZGVzKTtcclxuICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSAzNjAgLyB0aGlzLmxvbmdpdHVkZXM7XHJcbiAgICAgIGxldCBtdHhSb3RhdGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9ZKGFuZ2xlKTtcclxuICAgICAgLy8gY29weSBvcmlnaW5hbCBwb2x5Z29uIGFzIFZlY3RvcjMgYXJyYXlcclxuICAgICAgbGV0IHBvbHlnb246IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBsZXQgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFswXTtcclxuICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5zaGFwZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvbHlnb24ucHVzaCh0aGlzLnNoYXBlW2ldLnRvVmVjdG9yMygpKTtcclxuICAgICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICAgIGxldCBkaXN0YW5jZTogbnVtYmVyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHRoaXMuc2hhcGVbaV0sIHRoaXMuc2hhcGVbaSAtIDFdKS5tYWduaXR1ZGU7XHJcbiAgICAgICAgICB0b3RhbCArPSBkaXN0YW5jZTtcclxuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHRvdGFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGlzdGFuY2VzLmZvckVhY2goKF9lbnRyeSwgX2luZGV4KSA9PiB7IGRpc3RhbmNlc1tfaW5kZXhdID0gX2VudHJ5IC8gdG90YWw7IH0pO1xyXG5cclxuICAgICAgbGV0IG5WZXJ0aWNlc1BvbHlnb246IG51bWJlciA9IHBvbHlnb24ubGVuZ3RoO1xyXG5cclxuICAgICAgbGV0IGNsb3VkOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBmb3IgKGxldCBsb25naXR1ZGU6IG51bWJlciA9IDA7IGxvbmdpdHVkZSA8PSB0aGlzLmxvbmdpdHVkZXM7IGxvbmdpdHVkZSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5WZXJ0aWNlc1BvbHlnb247IGkrKykge1xyXG4gICAgICAgICAgbGV0IHV2OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIobG9uZ2l0dWRlIC8gdGhpcy5sb25naXR1ZGVzLCBkaXN0YW5jZXNbaV0pO1xyXG4gICAgICAgICAgLy8gVE9ETzogbGFzdCBzZWN0b3Igc2hvdWxkIG9ubHkgYmUgcmVmZXJlbmNlcyB0byB0aGUgZmlyc3QgbWVyaWRpYW5cclxuICAgICAgICAgIGlmIChsb25naXR1ZGUgPT0gdGhpcy5sb25naXR1ZGVzKVxyXG4gICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgoaSwgdXYpKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9uZ2l0dWRlID4gMCAmJiB0aGlzLnNoYXBlW2ldLnggPT0gMCkgLy8gdXNlIGEgc2luZ2xlIHZlcnRleCB3aGVuIGl0J3Mgb24gdGhlIHJvdGF0aW9uIGF4aXNcclxuICAgICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgoaSwgdXYpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGNsb3VkLnB1c2gobmV3IFZlcnRleChwb2x5Z29uW2ldLmNsb25lLCB1dikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb2x5Z29uLmZvckVhY2goKF92ZWN0b3I6IFZlY3RvcjMpID0+IF92ZWN0b3IudHJhbnNmb3JtKG10eFJvdGF0ZSkpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gY29weSBpbmRpY2VzIHRvIG5ldyBpbmRleCBhcnJheVxyXG4gICAgICBsZXQgZmFjZXM6IEZhY2VbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgbG9uZ2l0dWRlOiBudW1iZXIgPSAwOyBsb25naXR1ZGUgPCB0aGlzLmxvbmdpdHVkZXM7IGxvbmdpdHVkZSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDwgblZlcnRpY2VzUG9seWdvbiAtIDE7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gbG9uZ2l0dWRlICogblZlcnRpY2VzUG9seWdvbiArIGxhdGl0dWRlO1xyXG4gICAgICAgICAgbGV0IHF1YWQ6IFF1YWQgPSBuZXcgUXVhZChjbG91ZCwgc3RhcnQgKyAxLCBzdGFydCArIDEgKyBuVmVydGljZXNQb2x5Z29uLCBzdGFydCArIG5WZXJ0aWNlc1BvbHlnb24sIHN0YXJ0KTtcclxuICAgICAgICAgIGZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgICAvLyBUT0RPOiBjYXRjaCBpbnZhbGlkIGZhY2VzIHJpZ2h0IGhlcmUuLi5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBjbG91ZDtcclxuICAgICAgdGhpcy5mYWNlcyA9IGZhY2VzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgVVYgU3BoZXJlIHdpdGggYSBnaXZlbiBudW1iZXIgb2Ygc2VjdG9ycyBhbmQgc3RhY2tzIChjbGFtcGVkIGF0IDEyOCoxMjgpXHJcbiAgICogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gaHR0cDovL3d3dy5zb25naG8uY2Evb3BlbmdsL2dsX3NwaGVyZS5odG1sXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFNwaGVyZSBleHRlbmRzIE1lc2hSb3RhdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hTcGhlcmUpO1xyXG4gICAgcHJpdmF0ZSBsYXRpdHVkZXM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFNwaGVyZVwiLCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gOCkge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9sb25naXR1ZGVzLCBfbGF0aXR1ZGVzKTsgLy8gVE9ETzogd2hlbiBkZXNlcmlhbGl6ZWQgdGhpcyBjYXVzZXMgdGhpcyBjYXVzZXMgdGhlIG1lc2ggdG8gYmUgY3JlYXRlZCB0d2ljZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgc3BoZXJlIHdpdGggYSBnaXZlbiBudW1iZXIgb2YgbG9uZ2l0dWRlcyBhbmQgbGF0aXR1ZGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX2xvbmdpdHVkZXM6IG51bWJlciA9IDMsIF9sYXRpdHVkZXM6IG51bWJlciA9IDIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAvL0NsYW1wIHJlc29sdXRpb24gdG8gcHJldmVudCBwZXJmb3JtYW5jZSBpc3N1ZXNcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5taW4oTWF0aC5yb3VuZChfbG9uZ2l0dWRlcyksIDEyOCk7XHJcbiAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5taW4oTWF0aC5yb3VuZChfbGF0aXR1ZGVzKSwgMTI4KTtcclxuXHJcbiAgICAgIGlmIChfbG9uZ2l0dWRlcyA8IDMgfHwgX2xhdGl0dWRlcyA8IDIpIHtcclxuICAgICAgICBEZWJ1Zy53YXJuKFwiVVYgU3BoZXJlIG11c3QgaGF2ZSBhdCBsZWFzdCAzIGxvbmdpdHVkZXMgYW5kIDIgbGF0aXR1ZGVzIHRvIGZvcm0gYSAzLWRpbWVuc2lvbmFsIHNoYXBlLlwiKTtcclxuICAgICAgICB0aGlzLmxvbmdpdHVkZXMgPSBNYXRoLm1heCgzLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgyLCBfbGF0aXR1ZGVzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgbGV0IHN0ZXA6IG51bWJlciA9IE1hdGguUEkgLyB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8PSB0aGlzLmxhdGl0dWRlczsgKytpKSB7XHJcbiAgICAgICAgbGV0IGFuZ2xlOiBudW1iZXIgPSBNYXRoLlBJIC8gMiAtIGkgKiBzdGVwO1xyXG4gICAgICAgIGxldCB4OiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgbGV0IHk6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgc2hhcGUucHVzaChuZXcgVmVjdG9yMih4IC8gMiwgeSAvIDIpKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBwbGFjZSBmaXJzdCBhbmQgbGFzdCB2ZXJ0ZXggZXhhY3RseSBvbiByb3RhdGlvbiBheGlzXHJcbiAgICAgIHNoYXBlWzBdLnggPSAwO1xyXG4gICAgICBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXS54ID0gMDtcclxuXHJcbiAgICAgIHN1cGVyLnJvdGF0ZShzaGFwZSwgX2xvbmdpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNoYXBlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxhdGl0dWRlcyA9IHRoaXMubGF0aXR1ZGVzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHRoaXMuY3JlYXRlKF9zZXJpYWxpemF0aW9uLmxvbmdpdHVkZXMsIF9zZXJpYWxpemF0aW9uLmxhdGl0dWRlcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMubG9uZ2l0dWRlcywgdGhpcy5sYXRpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSB0d28gcXVhZHMgcGxhY2VkIGJhY2sgdG8gYmFjaywgdGhlIG9uZSBmYWNpbmcgaW4gbmVnYXRpdmUgWi1kaXJlY3Rpb24gaXMgdGV4dHVyZWQgcmV2ZXJzZWRcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgIDAgX18gM1xyXG4gICAqICAgICAgICAgfF9ffFxyXG4gICAqICAgICAgICAxICAgIDIgICAgICAgICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hTcHJpdGUgZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFNwcml0ZSk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hTcHJpdGVcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgVmVydGljZXMoXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjUsIDApLCBuZXcgVmVjdG9yMigwLCAwKSksXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAtMC41LCAwKSwgbmV3IFZlY3RvcjIoMCwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAtMC41LCAwKSwgbmV3IFZlY3RvcjIoMSwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjUsIDApLCBuZXcgVmVjdG9yMigxLCAwKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAxLCAyLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAyLCAzLCAwKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAwLCAzLCAxKSxcclxuICAgICAgICBuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCAzLCAyLCAxKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZsYXQgaXMgc3RhbmRhcmQgaGVyZSAvLyBUT0RPOiBpcyB0aGlzIHN0aWxsIG5lZWRlZD9cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXNGbGF0KCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLnJlbmRlck1lc2gudmVydGljZXM7IH1cclxuICAgIHB1YmxpYyBnZXQgaW5kaWNlc0ZsYXQoKTogVWludDE2QXJyYXkgeyByZXR1cm4gdGhpcy5yZW5kZXJNZXNoLmluZGljZXM7IH1cclxuXHJcbiAgICAvLyBpbnN0ZWFkLCBzbW9vdGggc2hhZGluZyB3b3VsZCBuZWVkIGV4dHJhIGF0dGVudGlvbiBidXQgaXMgbm90IHJlbGV2YW50Li4uXHJcblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgdG9ydXMgd2l0aCBhIGdpdmVuIHJpbmcgcmFkaXVzLCB0dWJlIHJhZGl1cyBhbmQgdGhlIG51bWJlciBvZiBtYWpvci0gYW5kIG1pbm9yIHNlZ21lbnRzXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFRvcnVzIGV4dGVuZHMgTWVzaFJvdGF0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFRvcnVzKTtcclxuICAgIHByaXZhdGUgbGF0aXR1ZGVzOiBudW1iZXIgPSAxMjtcclxuICAgIHByaXZhdGUgcmFkaXVzUmluZzogbnVtYmVyID0gMC41IC0gMC4xMjU7XHJcbiAgICBwcml2YXRlIHJhZGl1c1R1YmU6IG51bWJlciA9IDAuMTI1O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoVG9ydXNcIiwgX3JhZGl1c1Jpbmc6IG51bWJlciA9IDAuNSAtIDAuMTI1LCBfcmFkaXVzVHViZTogbnVtYmVyID0gMC4xMjUgLCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gNikge1xyXG4gICAgICBzdXBlcihfbmFtZSwgTWVzaFRvcnVzLmdldFNoYXBlKF9yYWRpdXNSaW5nLCBfcmFkaXVzVHViZSwgTWF0aC5tYXgoMywgX2xhdGl0dWRlcykpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMucmFkaXVzVHViZSA9IF9yYWRpdXNUdWJlO1xyXG4gICAgICB0aGlzLnJhZGl1c1JpbmcgPSBfcmFkaXVzUmluZztcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gX2xvbmdpdHVkZXM7XHJcbiAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5tYXgoMywgX2xhdGl0dWRlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0U2hhcGUoX3JhZGl1c1Jpbmc6IG51bWJlciwgX3JhZGl1c1R1YmU6IG51bWJlciwgX2xhdGl0dWRlczogbnVtYmVyKTogVmVjdG9yMltdIHtcclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgbGV0IGNlbnRlcjogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKF9yYWRpdXNSaW5nLCAwKTtcclxuICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDw9IF9sYXRpdHVkZXM7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICBsZXQgYW5nbGU6IG51bWJlciA9IDIgKiBNYXRoLlBJICogbGF0aXR1ZGUgLyBfbGF0aXR1ZGVzO1xyXG4gICAgICAgIHNoYXBlLnB1c2goVmVjdG9yMi5TVU0oY2VudGVyLCBuZXcgVmVjdG9yMihfcmFkaXVzVHViZSAqIC1NYXRoLmNvcyhhbmdsZSksIF9yYWRpdXNUdWJlICogTWF0aC5zaW4oYW5nbGUpKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzaGFwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIHRvcnVzIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfcmFkaXVzUmluZzogbnVtYmVyID0gMC41IC0gMC4xMjUsIF9yYWRpdXNUdWJlOiBudW1iZXIgPSAwLjEyNSwgIF9sb25naXR1ZGVzOiBudW1iZXIgPSA4LCBfbGF0aXR1ZGVzOiBudW1iZXIgPSA2KTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmFkaXVzVHViZSA9IF9yYWRpdXNUdWJlO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlcyA9IE1hdGgubWF4KDMsIF9sYXRpdHVkZXMpO1xyXG4gICAgICB0aGlzLnJhZGl1c1JpbmcgPSBfcmFkaXVzUmluZztcclxuICAgICAgc3VwZXIucm90YXRlKE1lc2hUb3J1cy5nZXRTaGFwZShfcmFkaXVzUmluZywgX3JhZGl1c1R1YmUsIF9sYXRpdHVkZXMpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMgPSB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgc2VyaWFsaXphdGlvbi5yYWRpdXNSaW5nID0gdGhpcy5yYWRpdXNSaW5nO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnJhZGl1c1R1YmUgPSB0aGlzLnJhZGl1c1R1YmU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NlcmlhbGl6YXRpb24ucmFkaXVzUmluZywgX3NlcmlhbGl6YXRpb24ucmFkaXVzVHViZSwgX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcywgX3NlcmlhbGl6YXRpb24ubGF0aXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5yYWRpdXNSaW5nLCB0aGlzLnJhZGl1c1R1YmUsIHRoaXMubG9uZ2l0dWRlcywgdGhpcy5sYXRpdHVkZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhcGU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgZW51bSBRVUFEU1BMSVQge1xyXG4gICAgUExBTkFSLCBBVF8wLCBBVF8xXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHN1cmZhY2UgY3JlYXRlZCB3aXRoIGZvdXIgdmVydGljZXMgd2hpY2ggaW1tZWRpYXRlbHkgY3JlYXRlcyBub25lLCBvbmUgb3IgdHdvIHtAbGluayBGYWNlfXMgZGVwZW5kaW5nIG9uIHZlcnRpY2VzIGF0IGlkZW50aWNhbCBwb3NpdGlvbnMuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqIFFVQURTUExJVDogIFBMQU5BUiAgICAgICAgICAgICAgICAgIEFUXzAgICAgICAgICAgICAgICAgICAgICBBVF8xXHJcbiAgICogICAgICAgICAgICAgMCBfIDMgICAgICAgICAgICAgICAgICAgMCBfIDMgICAgICAgICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICB8XFx8ICAgICAgICAgICAgICAgICAgICAgfFxcfCAgICAgICAgICAgICAgICAgICAgICB8L3wgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICogICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAxIOKAviAyICAgICAgICAgICAgICAgICAgICAxIOKAviAyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICogIHNoYXJlZCBsYXN0IHZlcnRleCAyICAgICAgbGFzdCB2ZXJ0aWNlcyAyICsgMyAgICAgIGxhc3QgdmVydGljZXMgMyArIDAgXHJcbiAgICogICAgICBcclxuICAgKiBgYGAgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUXVhZCB7XHJcbiAgICBwdWJsaWMgZmFjZXM6IEZhY2VbXTtcclxuICAgICNzcGxpdDogUVVBRFNQTElUO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdmVydGljZXM6IFZlcnRpY2VzLCBfaW5kZXgwOiBudW1iZXIsIF9pbmRleDE6IG51bWJlciwgX2luZGV4MjogbnVtYmVyLCBfaW5kZXgzOiBudW1iZXIsIF9zcGxpdDogUVVBRFNQTElUID0gUVVBRFNQTElULlBMQU5BUikge1xyXG4gICAgICB0aGlzLmZhY2VzID0gW107XHJcbiAgICAgIHRoaXMuI3NwbGl0ID0gX3NwbGl0O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChfc3BsaXQgIT0gUVVBRFNQTElULkFUXzEpXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgwLCBfaW5kZXgxLCBfaW5kZXgyKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MSwgX2luZGV4MiwgX2luZGV4MykpO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChfc3BsaXQgPT0gUVVBRFNQTElULlBMQU5BUilcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDMsIF9pbmRleDAsIF9pbmRleDIpKTtcclxuICAgICAgICBlbHNlIGlmIChfc3BsaXQgPT0gUVVBRFNQTElULkFUXzApXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgwLCBfaW5kZXgyLCBfaW5kZXgzKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MSwgX2luZGV4MywgX2luZGV4MCkpO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKFwiRmFjZSBleGNsdWRlZFwiLCAoPEVycm9yPl9lKS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc3BsaXQoKTogUVVBRFNQTElUIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwbGl0O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEJvbmUge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIHdlaWdodDogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogdGhlIHJlZmVyIHRvICBkZXNjcmlwdGlvbiBpcyBubyBsb25nZXIgY29ycmVjdCBhcyByZWZlciB0byBhbHNvIHdvcmtzIGZvciBib25lIGluZGljZXNcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgdmVydGV4IG9mIGEgbWVzaCB3aXRoIGV4dGVuZGVkIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHV2IGNvb3JkaW5hdGVzIGFuZCB0aGUgdmVydGV4IG5vcm1hbC5cclxuICAgKiBJdCBtYXkgcmVmZXIgdG8gYW5vdGhlciB2ZXJ0ZXggdmlhIGFuIGluZGV4IGludG8gc29tZSBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgcG9zaXRpb24gYW5kIHRoZSBub3JtYWwgYXJlIHN0b3JlZCB0aGVyZS5cclxuICAgKiBUaGlzIHdheSwgdmVydGV4IHBvc2l0aW9uIGFuZCBub3JtYWwgaXMgYSAxOjEgYXNzb2NpYXRpb24sIHZlcnRleCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVzIGEgMTpuIGFzc29jaWF0aW9uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFZlcnRleCB7XHJcbiAgICBwdWJsaWMgcG9zaXRpb246IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgdXY6IFZlY3RvcjIgfCBudWxsO1xyXG4gICAgcHVibGljIG5vcm1hbDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBjb2xvcjogQ29sb3I7XHJcbiAgICBwdWJsaWMgdGFuZ2VudDogVmVjdG9yNCB8IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJUbzogbnVtYmVyO1xyXG4gICAgcHVibGljIGJvbmVzOiBCb25lW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXByZXNlbnRzIGEgdmVydGV4IG9mIGEgbWVzaCB3aXRoIGV4dGVuZGVkIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHV2IGNvb3JkaW5hdGVzIHRoZSB2ZXJ0ZXggbm9ybWFsIGFuZCBpdHMgdGFuZ2VudHMuXHJcbiAgICAgKiBJdCBtYXkgcmVmZXIgdG8gYW5vdGhlciB2ZXJ0ZXggdmlhIGFuIGluZGV4IGludG8gc29tZSBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgcG9zaXRpb24gYW5kIHRoZSBub3JtYWwgYXJlIHN0b3JlZCB0aGVyZS5cclxuICAgICAqIFRoaXMgd2F5LCB2ZXJ0ZXggcG9zaXRpb24gYW5kIG5vcm1hbCBpcyBhIDE6MSBhc3NvY2lhdGlvbiwgdmVydGV4IHRvIHRleHR1cmUgY29vcmRpbmF0ZXMgYSAxOm4gYXNzb2NpYXRpb24uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9wb3NpdGlvbk9ySW5kZXg6IFZlY3RvcjMgfCBudW1iZXIsIF91djogVmVjdG9yMiA9IG51bGwsIF9ub3JtYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKSwgX3RhbmdlbnQ6IFZlY3RvcjQgPSBudWxsLCBfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpLCBfYm9uZXM6IEJvbmVbXSA9IG51bGwpIHtcclxuICAgICAgaWYgKF9wb3NpdGlvbk9ySW5kZXggaW5zdGFuY2VvZiBWZWN0b3IzKVxyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBfcG9zaXRpb25PckluZGV4O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5yZWZlclRvID0gX3Bvc2l0aW9uT3JJbmRleDtcclxuXHJcbiAgICAgIHRoaXMudXYgPSBfdXY7XHJcbiAgICAgIHRoaXMubm9ybWFsID0gX25vcm1hbDtcclxuICAgICAgdGhpcy50YW5nZW50ID0gX3RhbmdlbnQ7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMuYm9uZXMgPSBfYm9uZXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXJyYXkgd2l0aCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHRvIHNlcnZlIGFzIGEge0BsaW5rIFZlcnRleH0tY2xvdWQuIFxyXG4gICAqIEFjY2Vzc29ycyB5aWVsZCBwb3NpdGlvbiBvciBub3JtYWwgYWxzbyBmb3IgdmVydGljZXMgcmVmZXJlbmNpbmcgb3RoZXIgdmVydGljZXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWZXJ0aWNlcyBleHRlbmRzIEFycmF5PFZlcnRleD4ge1xyXG4gICAgLy8gVE9ETzogdGhpcyBjbGFzcyBtYXkgYmVjb21lIG1vcmUgcG93ZXJmdWwgYnkgaGlkaW5nIHRoZSBhcnJheSBhbmQgYWRkIG1vcmUgc2VydmljZSBtZXRob2RzIGxpa2UgY2FsY3VsYXRpbmcgYm91bmRpbmcgYm94LCByYWRpdXMgZXRjLlxyXG4gICAgLy8gc2VlIGlmIGEgcHJveHkgb2YgdGhlIGFycmF5IGludGVyZmFjaW5nIFtdIHdvdWxkIGRvIGEgZ29vZCBqb2IgLT4gdGVzdGVkOiBwcm94eSBpcyBhYm91dCAyMCB0aW1lcyBzbG93ZXIhXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzdWJzZXQgb2YgdmVydGljZXMgdGhhdCBkbyBub3QgcmVmZXIgdG8gb3RoZXIgdmVydGljZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBvcmlnaW5hbHMoKTogQXJyYXk8VmVydGV4PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgcG9zaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXgucG9zaXRpb24gOiB0aGlzW3ZlcnRleC5yZWZlclRvXS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIG5vcm1hbCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWQsIHJlc29sdmluZyByZWZlcmVuY2VzIGJldHdlZW4gdmVydGljZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWwoX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXgubm9ybWFsIDogdGhpc1t2ZXJ0ZXgucmVmZXJUb10ubm9ybWFsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgdGFuZ2VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRhbmdlbnQoX2luZGV4OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgcmV0dXJuIHRoaXNbX2luZGV4XS50YW5nZW50OyAvLyB0YW5nZW50cyBjYW4gbm90IGJlIHNoYXJlZCBhcyB0aGV5IGFyZSBkZXBlbmRlbnQgb24gdGhlIHV2LWNvb3JkaW5hdGVzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSB1di1jb29yZGluYXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHV2KF9pbmRleDogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIHJldHVybiB0aGlzW19pbmRleF0udXY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSBjb2xvciBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcnRleCBhZGRyZXNzZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbG9yKF9pbmRleDogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICByZXR1cm4gdGhpc1tfaW5kZXhdLmNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgYm9uZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYm9uZXMoX2luZGV4OiBudW1iZXIpOiBCb25lW10ge1xyXG4gICAgICBsZXQgdmVydGV4OiBWZXJ0ZXggPSB0aGlzW19pbmRleF07XHJcbiAgICAgIHJldHVybiAodmVydGV4LnJlZmVyVG8gPT0gdW5kZWZpbmVkKSA/IHZlcnRleC5ib25lcyA6IHRoaXNbdmVydGV4LnJlZmVyVG9dLmJvbmVzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBIFdlYkdMIHNoYWRlcnByb2dyYW0gZm9yIGEgcGFydGljbGUgc3lzdGVtLiBNYW5hZ2VkIGJ5IGEge0BsaW5rIFBhcnRpY2xlU3lzdGVtfS4gSXQgdXNlcyB7QGxpbmsgUGFydGljbGVTeXN0ZW0uZGF0YX0gdG8gZ2VuZXJhdGUgYW5kIGluamVjdCBjb2RlIGludG8gYSBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlIChHTFNMKSB0aHVzIGNyZWF0aW5nIGEgc2hhZGVyIHBhcnRpY2xlIHN5c3RlbSBmcm9tIGEgc3VwcGxpZWQge0BsaW5rIFNoYWRlcn1zIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZSBjb2RlLlxyXG4gICAqIEBhdXRob3IgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgU2hhZGVyUGFydGljbGVTeXN0ZW0gaW1wbGVtZW50cyBTaGFkZXJJbnRlcmZhY2Uge1xyXG4gICAgcHVibGljIGRhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW07XHJcbiAgICBwdWJsaWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcIlBBUlRJQ0xFXCJdO1xyXG4gICAgcHVibGljIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG4gICAgcHVibGljIGZyYWdtZW50U2hhZGVyU291cmNlOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIHB1YmxpYyBhdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICAgIHB1YmxpYyB1bmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyAvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJcIjsgLyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUHJvZ3JhbSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VQcm9ncmFtKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZVByb2dyYW0oKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBFbmFibGVzIHRoaXMgbm9kZSB0byBhY2Nlc3MgdGhlIHdheXBvaW50IGdyaWQgZXN0YWJsaXNoZWQgdGhyb3VnaCB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9cyBhbmQgdGhlaXIge0BsaW5rIENvbm5lY3Rpb259cyxcclxuICAgKiBmaW5kIGEgcGF0aCB0aHJvdWdoIHRoZW0gYW5kIGV2ZW4gd2FsayBkb3duIHRoZSBwYXRoLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50V2Fsa2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRXYWxrZXIpO1xyXG4gICAgLyoqIFRoZSBzcGVlZCB0aGUgd2Fsa2VyIHNob3VsZCBtb3ZlIHdpdGguIENvcnJlc3BvbmRzIHRvIHVuaXRzL3MuICovXHJcbiAgICBwdWJsaWMgc3BlZWQ6IG51bWJlciA9IDE7XHJcbiAgICAvKiogSWYgdHJ1ZSwgbW92ZSB0aGUgbm9kZSB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0byB0aHJvdWdoIGZvcmNlcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHRocm91Z2ggdGhlIHRyYW5zZm9ybS4gUmVxdWlyZXMgYSBbW0NvbXBvbmVudFJpZ2lkYm9keV1dIGlmIHRydWUuICovXHJcbiAgICAvLyBwdWJsaWMgbW92ZVRocm91Z2hQaHlzaWNzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIGtlZXBzIHRoZSBkYXRhIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgd2FsayAqL1xyXG4gICAgI3dhbGtEYXRhOiBXYWxrRGF0YSA9IHsgcGF0aDogW10sIHRvdGFsUHJvZ3Jlc3M6IC0xIH07XHJcbiAgICAvKioga2VlcHMgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSB3aGVuIHRoZSB3YWxrZXIgaGFzIHJlYWNoZWQgdGhlIGdvYWwgKi9cclxuICAgICNwcm9taXNlUmVzb2x2ZXJPbldhbGtGaW5pc2hlZDogKCkgPT4gdm9pZDtcclxuICAgIC8qKiBzdGF0dXMgb2Ygd2hldGhlciBpdCBzaG91bGQgcm90YXRlIHRoZSB3YWxrZXIgdG8gdGhlIHdhbGtpbmcgZGlyZWN0aW9uICovXHJcbiAgICAjcm90YXRlSW5XYWxrRGlyZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgIGlmIChQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy4jaGFuZGxlQXR0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy4jaGFuZGxlRGV0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgc3BlZWQ6IHRoaXMuc3BlZWRcclxuICAgICAgICAvLyBtb3ZlVGhyb3VnaFBoeXNpY3M6IHRoaXMubW92ZVRocm91Z2hQaHlzaWNzLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5zcGVlZCA9IF9zZXJpYWxpemF0aW9uLnNwZWVkO1xyXG4gICAgICAvLyB0aGlzLm1vdmVUaHJvdWdoUGh5c2ljcyA9IF9zZXJpYWxpemF0aW9uLm1vdmVUaHJvdWdoUGh5c2ljcztcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGVwb3J0cyAobW92ZXMgaW5zdGFudGx5KSB0byB0aGUgX3RhcmdldCBXYXlwb2ludC5cclxuICAgICAqIEBwYXJhbSBfdGFyZ2V0XHJcbiAgICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfdGFyZ2V0OiBXYXlwb2ludCk6IFByb21pc2U8dm9pZD47XHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSB3YWxrZXIgZnJvbSB0aGUgX3N0YXJ0IHRvIHRoZSBfZW5kIFdheXBvaW50LlxyXG4gICAgICogVGVsZXBvcnRzIChtb3ZlcyBpbnN0YW50bHkpIHRvIHRoZSBfc3RhcnQgcG9pbnQsIHRoZW4gbW92ZXMgdGhyb3VnaCB0aGUgd2F5cG9pbnQgY29ubmVjdGlvbnMgdG8gdGhlIF9lbmQgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0gX3N0YXJ0IFxyXG4gICAgICogQHBhcmFtIF9lbmRcclxuICAgICAqIEBwYXJhbSBfcm90YXRlIFJvdGF0ZXMgdGhlIHdhbGtlciB0byBsb29rIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHdheXBvaW50XHJcbiAgICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBfZW5kIHBvaW50IGlzIHJlYWNoZWQuIFJlamVjdHMgaWYgX2VuZCBjYW4ndCBiZSByZWFjaGVkIChubyBwYXRoIGZvdW5kKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfc3RhcnQ6IFdheXBvaW50LCBfZW5kOiBXYXlwb2ludCwgX3JvdGF0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgcHVibGljIGFzeW5jIG1vdmVUbyhfc3RhcnQ6IFdheXBvaW50LCBfZW5kPzogV2F5cG9pbnQsIF9yb3RhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoIV9zdGFydCkgcmV0dXJuO1xyXG4gICAgICBsZXQgdHJhbnNsYXRlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9zdGFydC5tdHhXb3JsZC50cmFuc2xhdGlvbiwgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZSh0cmFuc2xhdGUpO1xyXG4gICAgICBpZiAoIV9lbmQgfHwgX3N0YXJ0ID09PSBfZW5kKSB7XHJcbiAgICAgICAgdGhpcy4jd2Fsa0RhdGEgPSB7IHBhdGg6IFtdLCB0b3RhbFByb2dyZXNzOiAtMSB9O1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiNyb3RhdGVJbldhbGtEaXJlY3Rpb24gPSBfcm90YXRlO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIGxldCBwYXRoOiBQYXRoaW5nTm9kZVtdIHwgbnVsbCA9IHRoaXMuZ2V0UGF0aChfc3RhcnQsIF9lbmQpO1xyXG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgX3JlamVjdCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLiN3YWxrRGF0YSA9IHsgcGF0aCwgdG90YWxQcm9ncmVzczogMCB9O1xyXG4gICAgICAgIHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkID0gX3Jlc29sdmU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLiNyb3RhdGVJbldhbGtEaXJlY3Rpb24gJiYgdGhpcy4jd2Fsa0RhdGEucGF0aC5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgdGhpcy5yb3RhdGVUb3dhcmRzKHRoaXMuI3dhbGtEYXRhLnBhdGhbMF0ud2F5cG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRha2VzIGNhcmUgb2YgdGhlIG1vdmluZyBhbGdvcml0aG0gYnkgY2FsY3VsYXRpbmcgdGhlIG5leHQgc3RlcCBhbmQgbW92aW5nIGFsb25nIHRoaXMgc3RlcCAqL1xyXG4gICAgcHJvdGVjdGVkIG1vdmluZygpOiB2b2lkIHtcclxuICAgICAgLy8gYXJlIHdlIGN1cnJlbnRseSBtb3Zpbmc/XHJcbiAgICAgIGlmICh0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzIDwgMCB8fCB0aGlzLiN3YWxrRGF0YS5wYXRoLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICAgIC8vIGRvIHdlIGhhdmUgYSBjdXJyZW50IHBhdGggd2UgY2FuIGZvbGxvd1xyXG4gICAgICBsZXQgY3VycmVudFBhdGg6IFBhdGhpbmdOb2RlID0gdGhpcy4jd2Fsa0RhdGEucGF0aFt0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzXTtcclxuICAgICAgaWYgKCFjdXJyZW50UGF0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gaG93IGJpZyBvZiBhIHN0ZXAgYXJlIHdlIHRha2luZyB0aGlzIGZyYW1lP1xyXG4gICAgICBsZXQgZGVsdGE6IG51bWJlciA9IHRoaXMuc3BlZWQgKiBjdXJyZW50UGF0aC5wcmV2aW91c0Nvbm5lY3Rpb24uc3BlZWRNb2RpZmllciAqIExvb3AudGltZUZyYW1lR2FtZSAvIDEwMDA7XHJcbiAgICAgIC8vIGhvdyBmYXIgYXdheSBhcmUgd2UgZnJvbSB0aGUgbmV4dCB3YXlwb2ludD9cclxuICAgICAgbGV0IHN0ZXA6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoXHJcbiAgICAgICAgY3VycmVudFBhdGgud2F5cG9pbnQubXR4V29ybGQudHJhbnNsYXRpb24sXHJcbiAgICAgICAgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBsZXQgc3RlcFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09OU1RSVUNUSU9OKHN0ZXApO1xyXG4gICAgICAvLyBzdGVwUm90YXRpb24ucm90YXRlKHRoaXMubm9kZS5tdHhXb3JsZC5yb3RhdGlvbik7XHJcbiAgICAgIC8vIHN0ZXAgPSBzdGVwUm90YXRpb24udHJhbnNsYXRpb247XHJcblxyXG4gICAgICBsZXQgc2NhbGU6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoXHJcbiAgICAgICAgY3VycmVudFBhdGgud2F5cG9pbnQubXR4V29ybGQuc2NhbGluZyxcclxuICAgICAgICB0aGlzLm5vZGUubXR4V29ybGQuc2NhbGluZ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGRlbHRhICogZGVsdGEgPCBzdGVwLm1hZ25pdHVkZVNxdWFyZWQpIHsgLy8gd29uJ3QgcmVhY2ggbmV4dCB3YXlwb2ludCB5ZXQuIFVzaW5nIHNxdWFyZXMgYmVjYXVzZSB0aGF0J3MgZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBzcXJ0XHJcbiAgICAgICAgc3RlcC5ub3JtYWxpemUoZGVsdGEpO1xyXG4gICAgICAgIHRoaXMubm9kZS5tdHhMb2NhbC50cmFuc2xhdGUoc3RlcCwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChzY2FsZS5tYWduaXR1ZGVTcXVhcmVkID4gMCkge1xyXG4gICAgICAgICAgc2NhbGUubm9ybWFsaXplKGRlbHRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcgPSBWZWN0b3IzLlNVTShzY2FsZSwgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcpO1xyXG4gICAgICAgIC8vIHRoaXMubm9kZS5tdHhMb2NhbC5zY2FsZShWZWN0b3IzLlNVTShzY2FsZSwgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcpKTtcclxuICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBtb3ZlbWVudCB0aHJvdWdoIHBoeXNpY3NcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gcmVhY2hlZCBuZXh0IHBvaW50XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuV0FZUE9JTlRfUkVBQ0hFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IGN1cnJlbnRQYXRoLndheXBvaW50IH0pKTtcclxuICAgICAgKDxDb21wb25lbnRXYXlwb2ludD5jdXJyZW50UGF0aC53YXlwb2ludCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuV0FZUE9JTlRfUkVBQ0hFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHRoaXMgfSkpO1xyXG4gICAgICBcclxuICAgICAgbGV0IHRyYW5zbGF0ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbiwgdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZSh0cmFuc2xhdGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnNjYWxpbmcgPSBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC5zY2FsaW5nO1xyXG4gICAgICB0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzKys7XHJcblxyXG4gICAgICAvLyByZWFjaGVkIGZpbmFsIHBvaW50LCBmaW5pc2hlZCB3YWxraW5nXHJcbiAgICAgIGlmICh0aGlzLiN3YWxrRGF0YS50b3RhbFByb2dyZXNzID49IHRoaXMuI3dhbGtEYXRhLnBhdGgubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkKSB0aGlzLiNwcm9taXNlUmVzb2x2ZXJPbldhbGtGaW5pc2hlZCgpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuUEFUSElOR19DT05DTFVERUQsIHsgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiBjdXJyZW50UGF0aC53YXlwb2ludCB9KSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzaG91bGQgd2Ugcm90YXRlIHdhbGtlcj9cclxuICAgICAgaWYgKHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbikge1xyXG4gICAgICAgIHRoaXMucm90YXRlVG93YXJkcyh0aGlzLiN3YWxrRGF0YS5wYXRoW3RoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3NdLndheXBvaW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBmaW5kIHRoZSBwYXRoIGJldHdlZW4gdHdvIGdpdmVuIHdheXBvaW50cyAqL1xyXG4gICAgcHJvdGVjdGVkIGdldFBhdGgoX3N0YXJ0OiBXYXlwb2ludCwgX2VuZDogV2F5cG9pbnQpOiBQYXRoaW5nTm9kZVtdIHtcclxuICAgICAgLy8gVE9ETzogdXNlIGEgbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtIGxpa2UgQSogaW5zdGVhZCBvZiBEaWprc3RyYVxyXG4gICAgICAvLyBzZXR1cCB0aGUgZ3JhcGggb2YgcGF0aHMgYmFzZWQgb24gdGhlIHN0YXJ0IG5vZGVcclxuICAgICAgbGV0IHVudmlzaXRlZE5vZGVzOiBQYXRoaW5nTm9kZVtdID0gW107XHJcbiAgICAgIGxldCBwcm9jZXNzZWRXYXlwb2ludHM6IFdheXBvaW50W10gPSBbX3N0YXJ0XTtcclxuICAgICAgbGV0IHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaDogV2F5cG9pbnRbXSA9IFtfc3RhcnRdO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgbGV0IHdheXBvaW50OiBXYXlwb2ludCA9IHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaC5wb3AoKTtcclxuICAgICAgICBmb3IgKGxldCBjb25uZWN0aW9uIG9mIHdheXBvaW50LmNvbm5lY3Rpb25zKSB7XHJcbiAgICAgICAgICBpZiAoIXByb2Nlc3NlZFdheXBvaW50cy5pbmNsdWRlcyhjb25uZWN0aW9uLmVuZCkgJiYgY29ubmVjdGlvbi5zdGFydC5pc0FjdGl2ZSAmJiBjb25uZWN0aW9uLmVuZC5pc0FjdGl2ZSkge1xyXG4gICAgICAgICAgICB3YXlwb2ludHNUb1NlYXJjaFRocm91Z2gucHVzaChjb25uZWN0aW9uLmVuZCk7XHJcbiAgICAgICAgICAgIHByb2Nlc3NlZFdheXBvaW50cy5wdXNoKGNvbm5lY3Rpb24uZW5kKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdW52aXNpdGVkTm9kZXMucHVzaCh7IHdheXBvaW50LCBkaXN0YW5jZTogd2F5cG9pbnQgPT09IF9zdGFydCA/IDAgOiBJbmZpbml0eSwgcHJldmlvdXM6IG51bGwsIHByZXZpb3VzQ29ubmVjdGlvbjogbnVsbCB9KTtcclxuICAgICAgfSB3aGlsZSAod2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgLy8gZG8gdGhlIGRpamtzdHJhXHJcbiAgICAgIHdoaWxlICh1bnZpc2l0ZWROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdW52aXNpdGVkTm9kZXMuc29ydCgoX2E6IFBhdGhpbmdOb2RlLCBfYjogUGF0aGluZ05vZGUpID0+IF9hLmRpc3RhbmNlIC0gX2IuZGlzdGFuY2UpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTogUGF0aGluZ05vZGUgPSB1bnZpc2l0ZWROb2Rlcy5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS53YXlwb2ludCA9PT0gX2VuZCkgcmV0dXJuIHRoaXMucGF0aGluZ05vZGVUb1BhdGgoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb24gb2YgY3VycmVudE5vZGUud2F5cG9pbnQuY29ubmVjdGlvbnMpIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3Rpb25Vc2FibGUoY29uKSkgY29udGludWU7XHJcbiAgICAgICAgICBsZXQgZW5kTm9kZTogUGF0aGluZ05vZGUgPSB1bnZpc2l0ZWROb2Rlcy5maW5kKF9uID0+IF9uLndheXBvaW50ID09PSBjb24uZW5kKTtcclxuICAgICAgICAgIGlmICghZW5kTm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICBsZXQgbmV3RGlzdGFuY2U6IG51bWJlciA9IGN1cnJlbnROb2RlLmRpc3RhbmNlICsgdGhpcy5jYWxjdWxhdGVDb25uZWN0aW9uQ29zdChjb24pO1xyXG4gICAgICAgICAgaWYgKG5ld0Rpc3RhbmNlID49IGVuZE5vZGUuZGlzdGFuY2UpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgZW5kTm9kZS5kaXN0YW5jZSA9IG5ld0Rpc3RhbmNlO1xyXG4gICAgICAgICAgZW5kTm9kZS5wcmV2aW91cyA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgZW5kTm9kZS5wcmV2aW91c0Nvbm5lY3Rpb24gPSBjb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIGEgY29ubmVjdGlvbiBpcyB1c2FibGUgYnkgdGhpcyBzcGVjaWZpYyB3YWxrZXIuXHJcbiAgICAgKiAqKkFsd2F5cyByZXR1cm5zIHRydWUsIHVubGVzcyBvdmVyd3JpdHRlbiBpbiBhIGN1c3RvbSBXYWxrZXIgc3ViY2xhc3MuKipcclxuICAgICAqIENhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgcGF0aGZpbmRpbmcgYWxnb3JpdGhtIGZvciBjdXN0b20gd2F5cG9pbnQgLyBjb25uZWN0aW9uIHN5c3RlbXMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvbm5lY3Rpb24gQSBjb25uZWN0aW9uIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHVzYWJsZSBieSB0aGlzIHdhbGtlciwgZmFsc2UgaWYgbm90XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBpc0Nvbm5lY3Rpb25Vc2FibGUoX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBuZXcgZGlzdGFuY2UgYmFzZWQgb24gYSBjb25uZWN0aW9uLlxyXG4gICAgICogKipBbHdheXMgcmV0dXJucyB0aGUgcGxhaW4gY29ubmVjdGlvbnMgY29zdCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gYSBjdXN0b20gd2Fsa2VyIHN1YmNsYXNzLioqXHJcbiAgICAgKiBDYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgdGhlIHBhdGhmaW5kaW5nIGFsZ29yaXRobSBmb3IgY3VzdG9tIHdheXBvaW50IC8gY29ubmVjdGlvbiBzeXN0ZW1zLlxyXG4gICAgICogQHBhcmFtIF9jb25uZWN0aW9uIEEgY29ubmVjdGlvbiB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMgdGhlIGFtb3VudCBvZiBjb3N0IGEgY29ubmVjdGlvbiBlbmN1cnMgdG8gdGhlIGN1cnJlbnQgd2Fsa2VyIG9yIDAgaWYgY29zdCBpcyBuZWdhdGl2ZS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUNvbm5lY3Rpb25Db3N0KF9jb25uZWN0aW9uOiBDb25uZWN0aW9uKTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9jb25uZWN0aW9uLmNvc3QgPj0gMClcclxuICAgICAgICByZXR1cm4gX2Nvbm5lY3Rpb24uY29zdDtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXRoaW5nTm9kZVRvUGF0aChfbm9kZTogUGF0aGluZ05vZGUpOiBQYXRoaW5nTm9kZVtdIHtcclxuICAgICAgbGV0IHBhdGg6IFBhdGhpbmdOb2RlW10gPSBbXTtcclxuICAgICAgaWYgKCFfbm9kZSkgcmV0dXJuIHBhdGg7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBwYXRoLnB1c2goX25vZGUpO1xyXG4gICAgICAgIF9ub2RlID0gX25vZGUucHJldmlvdXM7XHJcbiAgICAgIH0gd2hpbGUgKF9ub2RlPy5wcmV2aW91cyk7XHJcbiAgICAgIHJldHVybiBwYXRoLnJldmVyc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJvdGF0ZVRvd2FyZHMoX3dheXBvaW50OiBXYXlwb2ludCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4TG9vazogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uLCBfd2F5cG9pbnQubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwucm90YXRpb24gPSBtdHhMb29rLnJvdGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVBdHRhY2goKTogdm9pZCB7XHJcbiAgICAgIExvb3AuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5MT09QX0ZSQU1FLCB0aGlzLm1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAjaGFuZGxlRGV0YWNoKCk6IHZvaWQge1xyXG4gICAgICBMb29wLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTE9PUF9GUkFNRSwgdGhpcy5tb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIG1hbmFnZSBwYXRoaW5nIGRhdGEgaW5zaWRlIHRoZSBXYWxrZXJcclxuICAgKi9cclxuICBpbnRlcmZhY2UgUGF0aGluZ05vZGUge1xyXG4gICAgd2F5cG9pbnQ6IFdheXBvaW50O1xyXG4gICAgZGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHByZXZpb3VzOiBQYXRoaW5nTm9kZTtcclxuICAgIHByZXZpb3VzQ29ubmVjdGlvbjogQ29ubmVjdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGludGVybmFsIGludGVyZmFjZSB0byBtYW5hZ2UgdGhlIGRhdGEgb2YgdGhlIGN1cnJlbnRseSB3YWxrZWQgcGF0aFxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBXYWxrRGF0YSB7XHJcbiAgICBwYXRoOiBQYXRoaW5nTm9kZVtdO1xyXG4gICAgdG90YWxQcm9ncmVzczogbnVtYmVyO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBVbmlmaWVzIFdheXBvaW50cyBvZiB0aGUgcGF0aGluZyBhbGdvcml0aG1zXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgV2F5cG9pbnQge1xyXG4gICAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXTtcclxuICAgIG10eExvY2FsOiBNYXRyaXg0eDQ7XHJcbiAgICBtdHhXb3JsZDogTWF0cml4NHg0O1xyXG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGEgcG9zaXRpb24gdGhhdCBhIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IGNhbiB1c2UgYXMgYSB0YXJnZXQgcG9pbnQuXHJcbiAgICogSW1wbGVtZW50cyB7QGxpbmsgV2F5cG9pbnR9LlxyXG4gICAqIFJlZ2lzdGVycyBpdHNlbGYgdG8gYSBzdGF0aWMgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHdheXBvaW50c1xyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50V2F5cG9pbnQgZXh0ZW5kcyBDb21wb25lbnQgaW1wbGVtZW50cyBXYXlwb2ludCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3ModGhpcyk7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgI3dheXBvaW50czogQ29tcG9uZW50V2F5cG9pbnRbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBtdHhMb2NhbDogTWF0cml4NHg0O1xyXG5cclxuICAgICNjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbXR4SW5pdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCksIF9jb25uZWN0aW9uczogQ29ubmVjdGlvbltdID0gW10pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMgPSBfY29ubmVjdGlvbnM7XHJcbiAgICAgIHRoaXMubXR4TG9jYWwgPSBfbXR4SW5pdDtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuI2hhbmRsZUF0dGFjaC5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuI2hhbmRsZURldGFjaC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWxsIHRoZSB3YXlwb2ludHMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBpbiB0aGUgc2NlbmUuICoqRG8gbm90IGVkaXQsIHRyZWF0IGFzIHJlYWRvbmx5ISoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB3YXlwb2ludHMoKTogQ29tcG9uZW50V2F5cG9pbnRbXSB7XHJcbiAgICAgIHJldHVybiBDb21wb25lbnRXYXlwb2ludC4jd2F5cG9pbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaG9ydGhhbmQgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9c1xyXG4gICAgICogQHBhcmFtIF9zdGFydCBUaGUge0BsaW5rIENvbXBvbmVudFdheXBvaW50fSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uLlxyXG4gICAgICogQHBhcmFtIF9lbmQgVGhlIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gdG8gd2hpY2ggdGhlIGNvbm5lY3Rpb24gbGVhZHMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvc3QgVGhlIGNvc3Qgb2YgdGhlIGNvbm5lY3Rpb24uIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbGVzcyBsaWtlbHkgaXQgaXMgdG8gYmUgdGFrZW4uIENhbm5vdCBiZSBuZWdhdGl2ZS5cclxuICAgICAqIEBwYXJhbSBfc3BlZWRNb2RpZmllciBIb3cgZmFzdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgd2Fsa2VkIG9uLiBEZWZhdWx0cyB0byAxXHJcbiAgICAgKiBAcGFyYW0gX2JvdGhXYXlzIElmIHRydWUsIGNyZWF0ZXMgYSBjb25uZWN0aW9uIGluIGJvdGggZGlyZWN0aW9ucy4gRGVmYXVsdDogZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRDb25uZWN0aW9uKF9zdGFydDogQ29tcG9uZW50V2F5cG9pbnQsIF9lbmQ6IENvbXBvbmVudFdheXBvaW50LCBfY29zdDogbnVtYmVyLCBfc3BlZWRNb2RpZmllcjogbnVtYmVyID0gMSwgX2JvdGhXYXlzOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgX3N0YXJ0LmFkZENvbm5lY3Rpb24oeyBjb3N0OiBfY29zdCwgZW5kOiBfZW5kLCBzdGFydDogX3N0YXJ0LCBzcGVlZE1vZGlmaWVyOiBfc3BlZWRNb2RpZmllciB9KTtcclxuICAgICAgaWYgKF9ib3RoV2F5cylcclxuICAgICAgICBfZW5kLmFkZENvbm5lY3Rpb24oeyBjb3N0OiBfY29zdCwgZW5kOiBfc3RhcnQsIHN0YXJ0OiBfZW5kLCBzcGVlZE1vZGlmaWVyOiBfc3BlZWRNb2RpZmllciB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBDb25uZWN0aW9uW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBjdXJyZW50IHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBXYXlwb2ludC4gUmV0dXJucyBhIG5ldyBNYXRyaXggd2l0aG91dCBjb25uZWN0aW9uIHRvIHRoZSBXYXlwb2ludCAqL1xyXG4gICAgcHVibGljIGdldCBtdHhXb3JsZCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5tdHhMb2NhbCwgdGhpcy5ub2RlLm10eFdvcmxkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkcyBhIG5ldyB7QGxpbmsgQ29ubmVjdGlvbn0gdG8gdGhpcyB3YXlwb2ludCAqL1xyXG4gICAgcHVibGljIGFkZENvbm5lY3Rpb24oX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMucHVzaChfY29ubmVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlbW92ZXMgYSB7QGxpbmsgQ29ubmVjdGlvbn0gZnJvbSB0aGlzIHdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29ubmVjdGlvbihfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHRoaXMuI2Nvbm5lY3Rpb25zLmluZGV4T2YoX2Nvbm5lY3Rpb24pO1xyXG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcbiAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBtYXRyaXg6IHRoaXMubXR4TG9jYWwuc2VyaWFsaXplKCksXHJcbiAgICAgICAgY29ubmVjdGlvbnM6IHRoaXMuI2Nvbm5lY3Rpb25zLm1hcChfY29uID0+IHtcclxuICAgICAgICAgIGxldCBjb25uZWN0aW9uOiBTZXJpYWxpemVkQ29ubmVjdGlvbiA9IHsgY29zdDogX2Nvbi5jb3N0LCBlbmQ6IF9jb24uZW5kLCBzcGVlZE1vZGlmaWVyOiBfY29uLnNwZWVkTW9kaWZpZXIgfTtcclxuICAgICAgICAgIGlmIChjb25uZWN0aW9uLmVuZCBpbnN0YW5jZW9mIENvbXBvbmVudFdheXBvaW50KSB7XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uZW5kID0gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgY29ubmVjdGlvbi5lbmQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XHJcbiAgICAgICAgfSlcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdHhMb2NhbC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5tYXRyaXgpO1xyXG4gICAgICBjb25zdCBobmROb2RlRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLiNjb25uZWN0aW9ucyA9IF9zZXJpYWxpemF0aW9uLmNvbm5lY3Rpb25zLm1hcCgoX2NvbjogU2VyaWFsaXplZENvbm5lY3Rpb24pID0+IHtcclxuICAgICAgICAgIGxldCBjb25uZWN0aW9uOiBDb25uZWN0aW9uID0geyBjb3N0OiBfY29uLmNvc3QsIGVuZDogdGhpcy5zZXJpYWxpemVkV2F5cG9pbnRUb1dheXBvaW50KF9jb24uZW5kKSwgc3BlZWRNb2RpZmllcjogX2Nvbi5zcGVlZE1vZGlmaWVyLCBzdGFydDogdGhpcyB9O1xyXG4gICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IHNjYWxlVmVjdG9yOiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLk9ORSgpLCAwLjEpO1xyXG4gICAgICBsZXQgbXR4OiBNYXRyaXg0eDQgPSB0aGlzLm10eFdvcmxkO1xyXG4gICAgICBHaXptb3MuZHJhd1NwaGVyZShNYXRyaXg0eDQuQ09NUE9TSVRJT04obXR4LnRyYW5zbGF0aW9uLCBWZWN0b3IzLlpFUk8oKSwgc2NhbGVWZWN0b3IpLCBDb2xvci5DU1MoXCJvcmFuZ2VcIikpO1xyXG4gICAgICAvLyByZXR1cm47XHJcbiAgICAgIGxldCBsaW5lczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNvbm5lY3Rpb24gb2YgdGhpcy5jb25uZWN0aW9ucykge1xyXG4gICAgICAgIC8vIGlmIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50IGFyZSBvbiB0aGUgc2FtZSBwb2ludCwgZG9uJ3QgZHJhdyBsaW5lLlxyXG4gICAgICAgIGxldCB0bXBNdHg6IE1hdHJpeDR4NCA9IGNvbm5lY3Rpb24uZW5kLm10eFdvcmxkLmNsb25lO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb25WZWN0b3I6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UobXR4LnRyYW5zbGF0aW9uLCB0bXBNdHgudHJhbnNsYXRpb24pO1xyXG4gICAgICAgIGlmIChkaXJlY3Rpb25WZWN0b3IubWFnbml0dWRlU3F1YXJlZCA9PT0gMCkgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIGlmIG9uZSBvZiB0aGUgd2F5cG9pbnRzIGlzIGluYWN0aXZlLCBkb24ndCBkcmF3IGdpem1vc1xyXG4gICAgICAgIGlmICghY29ubmVjdGlvbi5lbmQuaXNBY3RpdmUgfHwgIWNvbm5lY3Rpb24uc3RhcnQuaXNBY3RpdmUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBhY3R1YWwgbGluZVxyXG4gICAgICAgIGxpbmVzLnB1c2gobXR4LnRyYW5zbGF0aW9uKTtcclxuICAgICAgICBsaW5lcy5wdXNoKHRtcE10eC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIC8vIGFycm93IGhlYWRzXHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbk10eDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odG1wTXR4LnRyYW5zbGF0aW9uLCBkaXJlY3Rpb25WZWN0b3IpO1xyXG4gICAgICAgIGRpcmVjdGlvbk10eC5zY2FsZShzY2FsZVZlY3Rvcik7XHJcbiAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShkaXJlY3Rpb25NdHgsIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICAgIH1cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhsaW5lcywgTWF0cml4NHg0LklERU5USVRZKCksIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGhlbHAgdGhlIGRlc2VyaWFsaXphenRpb24gcHJvY2Vzcy4gKi9cclxuICAgIHByaXZhdGUgc2VyaWFsaXplZFdheXBvaW50VG9XYXlwb2ludChfcG9pbnQ6IHN0cmluZyB8IFdheXBvaW50KTogV2F5cG9pbnQge1xyXG4gICAgICBpZiAodHlwZW9mIF9wb2ludCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIF9wb2ludDtcclxuICAgICAgcmV0dXJuIE5vZGUuRklORCh0aGlzLCBfcG9pbnQpIGFzIENvbXBvbmVudFdheXBvaW50O1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVBdHRhY2goKTogdm9pZCB7XHJcbiAgICAgIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAjaGFuZGxlRGV0YWNoKCk6IHZvaWQge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMuaW5kZXhPZih0aGlzKTtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICBDb21wb25lbnRXYXlwb2ludC4jd2F5cG9pbnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBEZWZpbmVzIGEgQ29ubmVjdGlvbiBpbiB0aGUgd2F5IGl0J3Mgc2VyaWFsaXplZCBpbiByZXNvdXJjZXMgQGludGVybmFsICovXHJcbiAgaW50ZXJmYWNlIFNlcmlhbGl6ZWRDb25uZWN0aW9uIHtcclxuICAgIGVuZDogV2F5cG9pbnQgfCBzdHJpbmc7XHJcbiAgICBjb3N0OiBudW1iZXI7XHJcbiAgICBzcGVlZE1vZGlmaWVyOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEgZGlyZWN0ZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB3YXlwb2ludHNcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICAgIC8qKiBUaGUgc3RhcnQgLyBvcmlnaW4gd2F5cG9pbnQgb2YgdGhpcyBjb25uZWN0aW9uLiAqL1xyXG4gICAgc3RhcnQ6IFdheXBvaW50O1xyXG4gICAgLyoqIFRoZSBlbmQgLyB0YXJnZXQgd2F5cG9pbnQgb2YgdGhpcyBjb25uZWN0aW9uLiAqL1xyXG4gICAgZW5kOiBXYXlwb2ludDtcclxuICAgIC8qKiBUaGUgY29zdCBvZiB0aGUgY29ubmVjdGlvbiwgdGhlIGhpZ2hlciB0aGUgbGVzcyBsaWtlbHkgdG8gYmUgdGFrZW4uIENhbm5vdCBiZSBuZWdhdGl2ZS4gKi9cclxuICAgIGNvc3Q6IG51bWJlcjtcclxuICAgIC8qKiBNb2RpZmllcyB0aGUgc3BlZWQgdGhhdCBhIHdhbGtlciBjYW4gd2FsayBwYXN0IHRoaXMgY29ubmVjdGlvbiBieSBtdWx0aXBseWluZyB0aGUgc3BlZWQgd2l0aCB0aGlzIHZhbHVlLiBOZWVkcyB0byBiZSA+MCAqL1xyXG4gICAgc3BlZWRNb2RpZmllcjogbnVtYmVyO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGF1dG9tYXRpYyBhZGp1c3RtZW50IG9mIHRoZSBjb2xsaWRlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEJPRFlfSU5JVCB7XHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyB0aGUgcGl2b3Qgb2YgdGhlIG1lc2ggZm9yIGluaXRpbGlhbGl6YXRpb24gKi9cclxuICAgIFRPX01FU0gsXHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyB0aGUgdHJhbnNmb3JtIG9mIHRoZSBub2RlIGZvciBpbml0aWxpYWxpemF0aW9uICovXHJcbiAgICBUT19OT0RFLFxyXG4gICAgLyoqIENvbGxpZGVyIHVzZXMgaXRzIG93biBwaXZvdCBmb3IgaW5pdGlsaWFsaXphdGlvbiAqL1xyXG4gICAgVE9fUElWT1RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdHMgYXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgTm9kZX0gaXQncyBhdHRhY2hlZCB0by5cclxuICAgKiBJdCdzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIEZVREdFIHJlbmRlcmVkIHdvcmxkIGFuZCB0aGUgUGh5c2ljcyB3b3JsZC5cclxuICAgKiBGb3IgdGhlIHBoeXNpY3MgdG8gY29ycmVjdGx5IGdldCB0aGUgdHJhbnNmb3JtYXRpb25zIHJvdGF0aW9ucyBuZWVkIHRvIGJlIGFwcGxpZWQgd2l0aCBmcm9tIGxlZnQgPSB0cnVlLlxyXG4gICAqIE9yIHJvdGF0aW9ucyBuZWVkIHRvIGhhcHBlbiBiZWZvcmUgc2NhbGluZy5cclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFJpZ2lkYm9keSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuICAgIHByaXZhdGUgc3RhdGljIG1hcEJvZHlUeXBlOiB7IFt0eXBlOiBudW1iZXJdOiBudW1iZXIgfSA9ICh0eXBlb2YgT0lNTyA9PSBcInVuZGVmaW5lZFwiKSA/XHJcbiAgICAgIHtcclxuICAgICAgICBbQk9EWV9UWVBFLkRZTkFNSUNdOiBCT0RZX1RZUEUuRFlOQU1JQywgW0JPRFlfVFlQRS5TVEFUSUNdOiBCT0RZX1RZUEUuU1RBVElDLCBbQk9EWV9UWVBFLktJTkVNQVRJQ106IEJPRFlfVFlQRS5LSU5FTUFUSUNcclxuICAgICAgfSA6IHtcclxuICAgICAgICBbQk9EWV9UWVBFLkRZTkFNSUNdOiBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQywgW0JPRFlfVFlQRS5TVEFUSUNdOiBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDLCBbQk9EWV9UWVBFLktJTkVNQVRJQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5LSU5FTUFUSUNcclxuICAgICAgfTtcclxuXHJcbiAgICAvKiogVHJhbnNmb3JtYXRpb24gb2YgdGhlIGNvbGxpZGVyIHJlbGF0aXZlIHRvIHRoZSBub2RlJ3MgdHJhbnNmb3JtLiBPbmNlIHNldCBtb3N0bHkgcmVtYWlucyBjb25zdGFudC4gXHJcbiAgICAgKiBJZiBhbHRlcmVkLCB7QGxpbmsgaXNJbml0aWFsaXplZH0gbXVzdCBiZSByZXNldCB0byBmYWxzZSB0byByZWNyZWF0ZSB0aGUgY29sbGlkZXIgaW4gdGhlIG5leHQge0BsaW5rIFJlbmRlci5wcmVwYXJlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFZlcnRpY2VzIHRoYXQgYnVpbGQgYSBjb252ZXggbWVzaCAoZm9ybSB0aGF0IGlzIGluIGl0c2VsZiBjbG9zZWQpLiBOZWVkcyB0byBzZXQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgcmIgaWYgbm9uZSBvZiB0aGUgc3RhbmRhcmQgY29sbGlkZXJzIGlzIHVzZWQuIFxyXG4gICAgICogVW50ZXN0ZWQgYW5kIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkIGJ5IHNlcmlhbGl6YXRpb24gYW5kIG11dGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udmV4TWVzaDogRmxvYXQzMkFycmF5ID0gbnVsbDtcclxuXHJcbiAgICAvKiogQ29sbGlzaW9ucyB3aXRoIHJpZ2lkYm9kaWVzIGhhcHBlbmluZyB0byB0aGlzIGJvZHksIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgY3VzdG9tIG9uQ29sbGlzaW9uU3RheSBmdW5jdGlvbmFsaXR5LiAqL1xyXG4gICAgcHVibGljIGNvbGxpc2lvbnM6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcbiAgICAvKiogVHJpZ2dlcnMgdGhhdCBhcmUgY3VycmVudGx5IHRyaWdnZXJpbmcgdGhpcyBib2R5ICovXHJcbiAgICBwdWJsaWMgdHJpZ2dlcmluZ3M6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogVGhlIGdyb3VwcyB0aGlzIG9iamVjdCBjb2xsaWRlcyB3aXRoLiBHcm91cHMgbXVzdCBiZSB3cml0ZW4gaW4gZm9ybSBvZlxyXG4gICAgICogIGUuZy4gY29sbGlzaW9uTWFzayA9IHtAbGluayBDT0xMSVNJT05fR1JPVVAuREVGQVVMVH0gfCB7QGxpbmsgQ09MTElTSU9OX0dST1VQfS4uLi4gYW5kIHNvIG9uIHRvIGNvbGxpZGUgd2l0aCBtdWx0aXBsZSBncm91cHMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uTWFzazogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEF1dG9tYXRpYyBhZGp1c3RtZW50IG9mIHRoZSBwaXZvdCB3aGVuIHtAbGluayBSZW5kZXIucHJlcGFyZX0gaXMgY2FsbGVkIGFjY29yZGluZyB0byB7QGxpbmsgQk9EWV9JTklUfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6YXRpb246IEJPRFlfSU5JVCA9IEJPRFlfSU5JVC5UT19QSVZPVDtcclxuICAgIC8qKiBNYXJrcyBpZiBjb2xsaWRlciB3YXMgaW5pdGlhbGl6ZWQuIFJlc2V0IHRvIGZhbHNlIHRvIGluaXRpYWxpemUgYWdhaW4gZS5nLiBhZnRlciBtYW5pcHVsYXRpb24gb2YgbXR4UGl2b3QgKi9cclxuICAgIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIElEIHRvIHJlZmVyZW5jZSB0aGlzIHNwZWNpZmljIENvbXBvbmVudFJpZ2lkYm9keSAqL1xyXG4gICAgI2lkOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vUHJpdmF0ZSBpbmZvcm1hdGlvbnMgLSBNb3N0bHkgT2ltb1BoeXNpY3MgdmFyaWFibGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkIHRvIHRoZSBGVURHRSBVc2VyIGFuZCBtYW5pcHVsYXRlZCBieSB0aGVtXHJcbiAgICAjY29sbGlkZXI6IE9JTU8uU2hhcGU7XHJcbiAgICAjY29sbGlkZXJJbmZvOiBPSU1PLlNoYXBlQ29uZmlnO1xyXG4gICAgI2NvbGxpc2lvbkdyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVDtcclxuICAgICN0eXBlQ29sbGlkZXI6IENPTExJREVSX1RZUEUgPSBDT0xMSURFUl9UWVBFLkNVQkU7XHJcblxyXG4gICAgI3JpZ2lkYm9keTogT0lNTy5SaWdpZEJvZHk7XHJcbiAgICAjcmlnaWRib2R5SW5mbzogT0lNTy5SaWdpZEJvZHlDb25maWcgPSBuZXcgT0lNTy5SaWdpZEJvZHlDb25maWcoKTtcclxuICAgICN0eXBlQm9keTogQk9EWV9UWVBFID0gQk9EWV9UWVBFLkRZTkFNSUM7XHJcblxyXG4gICAgI21hc3NEYXRhOiBPSU1PLk1hc3NEYXRhID0gbmV3IE9JTU8uTWFzc0RhdGEoKTtcclxuICAgICNyZXN0aXR1dGlvbjogbnVtYmVyO1xyXG4gICAgI2ZyaWN0aW9uOiBudW1iZXI7XHJcbiAgICAjZGFtcGluZ0xpbmVhcjogbnVtYmVyID0gMC4xO1xyXG4gICAgI2RhbXBpbmdBbmd1bGFyOiBudW1iZXIgPSAwLjE7XHJcbiAgICAjZWZmZWN0Um90YXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgpO1xyXG4gICAgI2VmZmVjdEdyYXZpdHk6IG51bWJlciA9IDE7XHJcbiAgICAjaXNUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAjbXR4UGl2b3RVbnNjYWxlZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAjbXR4UGl2b3RJbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuXHJcbiAgICAjY2FsbGJhY2tzOiBPSU1PLkNvbnRhY3RDYWxsYmFjazsgLy9DYWxsYmFjayBNZXRob2RzIHdoZW4gd2l0aGluIHRoZSBvaW1vU3lzdGVtIGEgZXZlbnQgaXMgaGFwcGVuaW5nXHJcblxyXG4gICAgLy8gI3BoeXNpY3M6IFBoeXNpY3M7IC8vVE9ETzoga2VlcCBhIHBvaW50ZXIgdG8gdGhlIHBoeXNpY3MgaW5zdGFuY2UgdXNlZCBieSB0aGlzIGNvbXBvbmVudFxyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIG5ldyByaWdpZGJvZHkgd2l0aCBhIHdlaWdodCBpbiBrZywgYSBwaHlzaWNzIHR5cGUgKGRlZmF1bHQgPSBkeW5hbWljKSwgYSBjb2xsaWRlciB0eXBlIHdoYXQgcGh5c2ljYWwgZm9ybSBoYXMgdGhlIGNvbGxpZGVyLCB0byB3aGF0IGdyb3VwIGRvZXMgaXQgYmVsb25nLCBpcyB0aGVyZSBhIHRyYW5zZm9ybSBNYXRyaXggdGhhdCBzaG91bGQgYmUgdXNlZCwgYW5kIGlzIHRoZSBjb2xsaWRlciBkZWZpbmVkIGFzIGEgZ3JvdXAgb2YgcG9pbnRzIHRoYXQgcmVwcmVzZW50IGEgY29udmV4IG1lc2guICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX21hc3M6IG51bWJlciA9IDEsIF90eXBlOiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0ID0gbnVsbCwgX2NvbnZleE1lc2g6IEZsb2F0MzJBcnJheSA9IG51bGwpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX21hc3MsIF90eXBlLCBfY29sbGlkZXJUeXBlLCBfZ3JvdXAsIF9tdHhUcmFuc2Zvcm0sIF9jb252ZXhNZXNoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIEFjY2Vzc29yc1xyXG4gICAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSBnZW9tZXRyaWNhbCByZWxhdGlvbnNoaXAgb2Ygbm9kZSBhbmQgY29sbGlkZXIgYnkge0BsaW5rIFJlbmRlcn0qL1xyXG4gICAgcHVibGljIGdldCBtdHhQaXZvdEludmVyc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eFBpdm90SW52ZXJzZTtcclxuICAgIH1cclxuICAgIC8qKiBVc2VkIGZvciBjYWxjdWxhdGlvbiBvZiB0aGUgZ2VvbWV0cmljYWwgcmVsYXRpb25zaGlwIG9mIG5vZGUgYW5kIGNvbGxpZGVyIGJ5IHtAbGluayBSZW5kZXJ9Ki9cclxuICAgIHB1YmxpYyBnZXQgbXR4UGl2b3RVbnNjYWxlZCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4UGl2b3RVbnNjYWxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmV0cmlldmUgdGhlIGJvZHkgdHlwZS4gU2VlIHtAbGluayBCT0RZX1RZUEV9ICovXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGVCb2R5KCk6IEJPRFlfVFlQRSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0eXBlQm9keTtcclxuICAgIH1cclxuICAgIC8qKiBTZXQgdGhlIGJvZHkgdHlwZS4gU2VlIHtAbGluayBCT0RZX1RZUEV9ICovXHJcbiAgICBwdWJsaWMgc2V0IHR5cGVCb2R5KF92YWx1ZTogQk9EWV9UWVBFKSB7XHJcbiAgICAgIHRoaXMuI3R5cGVCb2R5ID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0VHlwZShDb21wb25lbnRSaWdpZGJvZHkubWFwQm9keVR5cGVbdGhpcy4jdHlwZUJvZHldKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTsgLy9oYXZlIHRvIHJlc2V0IG1hc3MgYWZ0ZXIgY2hhbmdpbmcgdGhlIHR5cGUsIHNpbmNlIE9pbW8gaXMgaGFuZGxpbmcgbWFzcyBpbnRlcm5hbGx5IHdyb25nIHdoZW4gc3dpdGNoaW5nIHR5cGVzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgd29ybGQuIERlZmF1bHQgaXMgYSBDdWJlLiAqL1xyXG4gICAgcHVibGljIGdldCB0eXBlQ29sbGlkZXIoKTogQ09MTElERVJfVFlQRSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0eXBlQ29sbGlkZXI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHR5cGVDb2xsaWRlcihfdmFsdWU6IENPTExJREVSX1RZUEUpIHtcclxuICAgICAgaWYgKF92YWx1ZSAhPSB0aGlzLiN0eXBlQ29sbGlkZXIgJiYgdGhpcy4jcmlnaWRib2R5ICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLiN0eXBlQ29sbGlkZXIgPSBfdmFsdWU7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGNvbGxpc2lvbiBncm91cCB0aGlzIHtAbGluayBOb2RlfSBiZWxvbmdzIHRvIGl0J3MgdGhlIGRlZmF1bHQgZ3JvdXAgbm9ybWFsbHkgd2hpY2ggbWVhbnMgaXQgcGh5c2ljYWxseSBjb2xsaWRlcyB3aXRoIGV2ZXJ5IGdyb3VwIGJlc2lkZXMgdHJpZ2dlci4gKi9cclxuICAgIHB1YmxpYyBnZXQgY29sbGlzaW9uR3JvdXAoKTogQ09MTElTSU9OX0dST1VQIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbGxpc2lvbkdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBjb2xsaXNpb25Hcm91cChfdmFsdWU6IENPTExJU0lPTl9HUk9VUCkge1xyXG4gICAgICB0aGlzLiNjb2xsaXNpb25Hcm91cCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5zZXRDb2xsaXNpb25Hcm91cCh0aGlzLiNjb2xsaXNpb25Hcm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1hcmtpbmcgdGhlIEJvZHkgYXMgYSB0cmlnZ2VyIHRoZXJlZm9yZSBub3QgaW5mbHVlbmNpbmcgdGhlIGNvbGxpc2lvbiBzeXN0ZW0gYnV0IG9ubHkgc2VuZGluZyB0cmlnZ2VyRXZlbnRzICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzVHJpZ2dlcigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2lzVHJpZ2dlcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaXNUcmlnZ2VyKF92YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLiNpc1RyaWdnZXIgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmdldE9pbW9SaWdpZGJvZHkoKSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5nZXRPaW1vUmlnaWRib2R5KCkuX2lzVHJpZ2dlciA9IHRoaXMuI2lzVHJpZ2dlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGh5c2ljYWwgd2VpZ2h0IG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXNzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0TWFzcygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0aW5nIHRoZSBwaHlzaWNhbCB3ZWlnaHQgb2YgdGhlIHtAbGluayBOb2RlfSBpbiBrZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1hc3MoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWFzc0RhdGEubWFzcyA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMubm9kZSAhPSBudWxsKVxyXG4gICAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkgIT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRNYXNzRGF0YSh0aGlzLiNtYXNzRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERyYWcgb2YgbGluZWFyIG1vdmVtZW50LiBBIEJvZHkgZG9lcyBzbG93IGRvd24gZXZlbiBvbiBhIHN1cmZhY2Ugd2l0aG91dCBmcmljdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGFtcFRyYW5zbGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0TGluZWFyRGFtcGluZygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkYW1wVHJhbnNsYXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZGFtcGluZ0xpbmVhciA9IF92YWx1ZTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldExpbmVhckRhbXBpbmcoX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhZyBvZiByb3RhdGlvbi4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGFtcFJvdGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyaWdpZGJvZHkuZ2V0QW5ndWxhckRhbXBpbmcoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGFtcFJvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2RhbXBpbmdBbmd1bGFyID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QW5ndWxhckRhbXBpbmcoX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGZhY3RvciB0aGlzIHJpZ2lkYm9keSByZWFjdHMgcm90YXRpb25zIHRoYXQgaGFwcGVuIGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gMCB0byBsb2NrIHJvdGF0aW9uIHRoaXMgYXhpcy4gKi9cclxuICAgIHB1YmxpYyBnZXQgZWZmZWN0Um90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNlZmZlY3RSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZWZmZWN0Um90YXRpb24oX2VmZmVjdDogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNlZmZlY3RSb3RhdGlvbiA9IF9lZmZlY3Q7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRSb3RhdGlvbkZhY3RvcihuZXcgT0lNTy5WZWMzKHRoaXMuI2VmZmVjdFJvdGF0aW9uLngsIHRoaXMuI2VmZmVjdFJvdGF0aW9uLnksIHRoaXMuI2VmZmVjdFJvdGF0aW9uLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGZhY3RvciB0aGlzIHJpZ2lkYm9keSByZWFjdHMgdG8gd29ybGQgZ3Jhdml0eS4gRGVmYXVsdCA9IDEgZS5nLiAxKjkuODEgbS9zLiAqL1xyXG4gICAgcHVibGljIGdldCBlZmZlY3RHcmF2aXR5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNlZmZlY3RHcmF2aXR5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBlZmZlY3RHcmF2aXR5KF9lZmZlY3Q6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNlZmZlY3RHcmF2aXR5ID0gX2VmZmVjdDtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKSB0aGlzLiNyaWdpZGJvZHkuc2V0R3Jhdml0eVNjYWxlKHRoaXMuI2VmZmVjdEdyYXZpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mIHNsaWRpbmcgcmVzaXN0YW5jZSBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZyaWN0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmcmljdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnJpY3Rpb24gb2YgdGhlIHJpZ2lkYm9keSwgd2hpY2ggaXMgdGhlIGZhY3RvciBvZiAgc2xpZGluZyByZXNpc3RhbmNlIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgZnJpY3Rpb24oX2ZyaWN0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZnJpY3Rpb24gPSBfZnJpY3Rpb247XHJcbiAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkgIT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByZXN0aXR1dGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mIGJvdW5jaW5lc3Mgb2YgdGhpcyByaWdpZGJvZHkgb24gc3VyZmFjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZXN0aXR1dGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcmVzdGl0dXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHJlc3RpdHV0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2YgYm91bmNpbmVzcyBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHJlc3RpdHV0aW9uKF9yZXN0aXR1dGlvbjogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3Jlc3RpdHV0aW9uID0gX3Jlc3RpdHV0aW9uO1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJpZ2lkYm9keSBpbiB0aGUgZm9ybSB0aGUgcGh5c2ljcyBlbmdpbmUgaXMgdXNpbmcgaXQsIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgYSBmdW5jdGlvbmFsaXR5XHJcbiAgICAgKiBpcyBub3QgcHJvdmlkZWQgdGhyb3VnaCB0aGUgRlVER0UgSW50ZWdyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vUmlnaWRib2R5KCk6IE9JTU8uUmlnaWRCb2R5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUm90YXRpbmcgdGhlIHJpZ2lkYm9keSB0aGVyZWZvcmUgY2hhbmdpbmcgaXQncyByb3RhdGlvbiBvdmVyIHRpbWUgZGlyZWN0bHkgaW4gcGh5c2ljcy4gVGhpcyB3YXkgcGh5c2ljcyBpcyBjaGFuZ2luZyBpbnN0ZWFkIG9mIHRyYW5zZm9ybS4gXHJcbiAgICAgKiAgQnV0IHlvdSBhcmUgYWJsZSB0byBpbmNyZW1lbnRhbCBjaGFuZ2luZyBpdCBpbnN0ZWFkIG9mIGEgZGlyZWN0IHJvdGF0aW9uLiAgQWx0aG91Z2ggaXQncyBhbHdheXMgcHJlZmVyZWQgdG8gdXNlIGZvcmNlcyBpbiBwaHlzaWNzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlQm9keShfcm90YXRpb25DaGFuZ2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnJvdGF0ZVh5eihuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbkNoYW5nZS54ICogQ2FsYy5kZWcycmFkLCBfcm90YXRpb25DaGFuZ2UueSAqIENhbGMuZGVnMnJhZCwgX3JvdGF0aW9uQ2hhbmdlLnogKiBDYWxjLmRlZzJyYWQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJhbnNsYXRpbmcgdGhlIHJpZ2lkYm9keSB0aGVyZWZvcmUgY2hhbmdpbmcgaXQncyBwbGFjZSBvdmVyIHRpbWUgZGlyZWN0bHkgaW4gcGh5c2ljcy4gVGhpcyB3YXkgcGh5c2ljcyBpcyBjaGFuZ2luZyBpbnN0ZWFkIG9mIHRyYW5zZm9ybS4gXHJcbiAgICAgKiAgQnV0IHlvdSBhcmUgYWJsZSB0byBpbmNyZW1lbnRhbGx5IGNoYW5naW5nIGl0IGluc3RlYWQgb2YgYSBkaXJlY3QgcG9zaXRpb24uIEFsdGhvdWdoIGl0J3MgYWx3YXlzIHByZWZlcmVkIHRvIHVzZSBmb3JjZXMgaW4gcGh5c2ljcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVCb2R5KF90cmFuc2xhdGlvbkNoYW5nZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkudHJhbnNsYXRlKG5ldyBPSU1PLlZlYzMoX3RyYW5zbGF0aW9uQ2hhbmdlLngsIF90cmFuc2xhdGlvbkNoYW5nZS55LCBfdHJhbnNsYXRpb25DaGFuZ2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjdXJyZW50IFBPU0lUSU9OIG9mIHRoZSB7QGxpbmsgTm9kZX0gaW4gdGhlIHBoeXNpY2FsIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NpdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRtcFBvczogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldFBvc2l0aW9uKCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0bXBQb3MueCwgdG1wUG9zLnksIHRtcFBvcy56KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgUE9TSVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFBvc2l0aW9uKF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0UG9zaXRpb24obmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgUk9UQVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2UuIE5vdGUgdGhpcyByYW5nZSBmcm9tIC1waSB0byBwaSwgc28gLTkwIHRvIDkwLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Um90YXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbjogT0lNTy5RdWF0ID0gdGhpcy4jcmlnaWRib2R5LmdldE9yaWVudGF0aW9uKCk7XHJcbiAgICAgIGxldCB0bXBRdWF0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICB0bXBRdWF0LnNldChvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCBvcmllbnRhdGlvbi53KTtcclxuICAgICAgbGV0IGV1bGVyQW5nbGVzOiBWZWN0b3IzID0gdG1wUXVhdC5ldWxlckFuZ2xlcy5jbG9uZTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodG1wUXVhdCk7XHJcbiAgICAgIHJldHVybiBldWxlckFuZ2xlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgUk9UQVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2UsIGluIGRlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFJvdGF0aW9uKF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgcXVhdDogT0lNTy5RdWF0ID0gbmV3IE9JTU8uUXVhdCgpO1xyXG4gICAgICBsZXQgbXR4Um90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICAgbXR4Um90LnJvdGF0ZShuZXcgVmVjdG9yMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICAgIGxldCBhcnJheTogRmxvYXQzMkFycmF5ID0gbXR4Um90LmdldCgpO1xyXG4gICAgICBsZXQgcm90OiBPSU1PLk1hdDMgPSBuZXcgT0lNTy5NYXQzKGFycmF5WzBdLCBhcnJheVs0XSwgYXJyYXlbOF0sIGFycmF5WzFdLCBhcnJheVs1XSwgYXJyYXlbOV0sIGFycmF5WzJdLCBhcnJheVs2XSwgYXJyYXlbMTBdKTtcclxuICAgICAgcXVhdC5mcm9tTWF0Myhyb3QpO1xyXG4gICAgICAvLyBxdWF0Lm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0T3JpZW50YXRpb24ocXVhdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCB0aGUgY3VycmVudCBTQ0FMSU5HIGluIHRoZSBwaHlzaWNhbCBzcGFjZS4gKi9cclxuICAgIHB1YmxpYyBnZXRTY2FsaW5nKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nLmNsb25lO1xyXG4gICAgICBzY2FsaW5nLnggKj0gdGhpcy5tdHhQaXZvdC5zY2FsaW5nLng7XHJcbiAgICAgIHNjYWxpbmcueSAqPSB0aGlzLm10eFBpdm90LnNjYWxpbmcueTtcclxuICAgICAgc2NhbGluZy56ICo9IHRoaXMubXR4UGl2b3Quc2NhbGluZy56O1xyXG4gICAgICByZXR1cm4gc2NhbGluZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2NhbGluZyByZXF1aXJlcyB0aGUgY29sbGlkZXIgdG8gYmUgY29tcGxldGVseSByZWNyZWF0ZWQgYW5ldyAqL1xyXG4gICAgcHVibGljIHNldFNjYWxpbmcoX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIC8vIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gX3ZhbHVlLmNsb25lOyAgIFxyXG4gICAgICB0aGlzLmNyZWF0ZUNvbGxpZGVyKG5ldyBPSU1PLlZlYzMoX3ZhbHVlLnggLyAyLCBfdmFsdWUueSAvIDIsIF92YWx1ZS56IC8gMiksIHRoaXMuI3R5cGVDb2xsaWRlcik7IC8vcmVjcmVhdGUgdGhlIGNvbGxpZGVyXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyID0gbmV3IE9JTU8uU2hhcGUodGhpcy4jY29sbGlkZXJJbmZvKTtcclxuICAgICAgbGV0IG9sZENvbGxpZGVyOiBPSU1PLlNoYXBlID0gdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkU2hhcGUodGhpcy4jY29sbGlkZXIpOyAvL2FkZCBuZXcgY29sbGlkZXIsIGJlZm9yZSByZW1vdmluZyB0aGUgb2xkLCBzbyB0aGUgcmIgaXMgbmV2ZXIgYWN0aXZlIHdpdGggMCBjb2xsaWRlcnNcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnJlbW92ZVNoYXBlKG9sZENvbGxpZGVyKTsgLy9yZW1vdmUgdGhlIG9sZCBjb2xsaWRlclxyXG4gICAgICB0aGlzLiNjb2xsaWRlci51c2VyRGF0YSA9IHRoaXM7IC8vcmVzZXQgdGhlIGV4dHJhIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhpcyBjb2xsaWRlciBrbm93cyB0byB3aGljaCBGVURHRSBDb21wb25lbnQgaXQncyBjb25uZWN0ZWRcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uR3JvdXAodGhpcy5jb2xsaXNpb25Hcm91cCk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbk1hc2sodGhpcy5jb2xsaXNpb25NYXNrKTtcclxuXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRDb250YWN0Q2FsbGJhY2sodGhpcy4jY2FsbGJhY2tzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSByaWdpZGJvZHkgYWNjb3JkaW5nIHRvIGl0cyBpbml0aWFsaXphdGlvbiBzZXR0aW5nIHRvIG1hdGNoIHRoZSBtZXNoLCB0aGUgbm9kZSBvciBpdHMgb3duIHBpdm90IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpIC8vIGRlbGF5IGluaXRpYWxpemF0aW9uIHVudGlsIHRoaXMgcmlnaWRib2R5IGlzIGF0dGFjaGVkIHRvIGEgbm9kZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgc3dpdGNoIChOdW1iZXIodGhpcy5pbml0aWFsaXphdGlvbikpIHtcclxuICAgICAgICBjYXNlIEJPRFlfSU5JVC5UT19OT0RFOlxyXG4gICAgICAgICAgdGhpcy5tdHhQaXZvdCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX0lOSVQuVE9fTUVTSDpcclxuICAgICAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICAgIGlmIChjbXBNZXNoKVxyXG4gICAgICAgICAgICB0aGlzLm10eFBpdm90ID0gY21wTWVzaC5tdHhQaXZvdC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQk9EWV9JTklULlRPX1BJVk9UOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gbXR4V29ybGQudHJhbnNsYXRpb247IC8vQWRkaW5nIHRoZSBvZmZzZXRzIGZyb20gdGhlIHBpdm90XHJcbiAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyA9IG10eFdvcmxkLnJvdGF0aW9uO1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IG10eFdvcmxkLnNjYWxpbmc7XHJcbiAgICAgIC8vc2NhbGluZyByZXF1aXJlcyBjb2xsaWRlciB0byBiZSByZWNyZWF0ZWRcclxuICAgICAgdGhpcy5zZXRTY2FsaW5nKHNjYWxpbmcpO1xyXG5cclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb3NpdGlvbik7IC8vc2V0IHRoZSBhY3R1YWwgbmV3IHJvdGF0aW9uL3Bvc2l0aW9uIGZvciB0aGlzIFJiIGFnYWluIHNpbmNlIGl0J3Mgbm93IHVwZGF0ZWRcclxuICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbik7XHJcblxyXG4gICAgICBsZXQgc2NhbGluZ0ludmVyc2U6IFZlY3RvcjMgPSB0aGlzLm5vZGUubXR4V29ybGQuc2NhbGluZy5tYXAoX2kgPT4gMSAvIF9pKTtcclxuICAgICAgdGhpcy4jbXR4UGl2b3RVbnNjYWxlZCA9IE1hdHJpeDR4NC5DT01QT1NJVElPTih0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLCB0aGlzLm10eFBpdm90LnJvdGF0aW9uLCBzY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgIHRoaXMuI210eFBpdm90SW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMuI210eFBpdm90VW5zY2FsZWQpO1xyXG5cclxuICAgICAgdGhpcy5hZGRSaWdpZGJvZHlUb1dvcmxkKCk7XHJcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVmVsb2NpdHkgYW5kIEZvcmNlc1xyXG4gICAgLyoqXHJcbiAgICAqIEdldCB0aGUgY3VycmVudCBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldFZlbG9jaXR5KCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IHRoaXMuI3JpZ2lkYm9keS5nZXRMaW5lYXJWZWxvY2l0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHZlbG9jaXR5OiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyVmVsb2NpdHkodmVsb2NpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjdXJyZW50IEFOR1VMQVIgLSBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBbmd1bGFyVmVsb2NpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldEFuZ3VsYXJWZWxvY2l0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBBTkdVTEFSIC0gVkVMT0NJVFkgb2YgdGhlIHtAbGluayBOb2RlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QW5ndWxhclZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRBbmd1bGFyVmVsb2NpdHkodmVsb2NpdHkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGNvbnRpbm91cyBGT1JDRSBhdCB0aGUgY2VudGVyIG9mIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTLlxyXG4gICAgKiBUaGUgZm9yY2UgaXMgbWVhc3VyZWQgaW4gbmV3dG9uLCAxa2cgbmVlZHMgYWJvdXQgMTAgTmV3dG9uIHRvIGZpZ2h0IGFnYWluc3QgZ3Jhdml0eS5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlGb3JjZShfZm9yY2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5Rm9yY2VUb0NlbnRlcihuZXcgT0lNTy5WZWMzKF9mb3JjZS54LCBfZm9yY2UueSwgX2ZvcmNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGNvbnRpbm91cyBGT1JDRSBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSB3b3JsZCB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUZvcmNlQXRQb2ludChfZm9yY2U6IFZlY3RvcjMsIF93b3JsZFBvaW50OiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUZvcmNlKG5ldyBPSU1PLlZlYzMoX2ZvcmNlLngsIF9mb3JjZS55LCBfZm9yY2UueiksIG5ldyBPSU1PLlZlYzMoX3dvcmxkUG9pbnQueCwgX3dvcmxkUG9pbnQueSwgX3dvcmxkUG9pbnQueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIFJPVEFUSU9OQUwgRk9SQ0UgKFRvcnF1ZSkgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1NcclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlUb3JxdWUoX3JvdGF0aW9uYWxGb3JjZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlUb3JxdWUobmV3IE9JTU8uVmVjMyhfcm90YXRpb25hbEZvcmNlLngsIF9yb3RhdGlvbmFsRm9yY2UueSwgX3JvdGF0aW9uYWxGb3JjZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBpbnN0YW50IEZPUkNFIGF0IGEgcG9pbnQvcmlnaWRib2R5Y2VudGVyIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZCdzIE1BU1NcclxuICAgICogSW5mbHVlbmNpbmcgdGhlIGFuZ3VsYXIgc3BlZWQgYW5kIHRoZSBsaW5lYXIgc3BlZWQuIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUltcHVsc2VBdFBvaW50KF9pbXB1bHNlOiBWZWN0b3IzLCBfd29ybGRQb2ludDogVmVjdG9yMyA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgX3dvcmxkUG9pbnQgPSBfd29ybGRQb2ludCAhPSBudWxsID8gX3dvcmxkUG9pbnQgOiB0aGlzLmdldFBvc2l0aW9uKCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUltcHVsc2UobmV3IE9JTU8uVmVjMyhfaW1wdWxzZS54LCBfaW1wdWxzZS55LCBfaW1wdWxzZS56KSwgbmV3IE9JTU8uVmVjMyhfd29ybGRQb2ludC54LCBfd29ybGRQb2ludC55LCBfd29ybGRQb2ludC56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBpbnN0YW50IEZPUkNFIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAqIE9ubHkgaW5mbHVlbmNpbmcgaXQncyBzcGVlZCBub3Qgcm90YXRpb24uXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5TGluZWFySW1wdWxzZShfaW1wdWxzZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlMaW5lYXJJbXB1bHNlKG5ldyBPSU1PLlZlYzMoX2ltcHVsc2UueCwgX2ltcHVsc2UueSwgX2ltcHVsc2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhIGluc3RhbnQgUk9UQVRJT05BTC1GT1JDRSB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgICogT25seSBpbmZsdWVuY2luZyBpdCdzIHJvdGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlBbmd1bGFySW1wdWxzZShfcm90YXRpb25hbEltcHVsc2U6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5QW5ndWxhckltcHVsc2UobmV3IE9JTU8uVmVjMyhfcm90YXRpb25hbEltcHVsc2UueCwgX3JvdGF0aW9uYWxJbXB1bHNlLnksIF9yb3RhdGlvbmFsSW1wdWxzZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgVkVMT0NJVFkgb2YgdGhlIFJJR0lEQk9EWS4gT25seSBpbmZsdWVuY2luZyB0aGUgbGluZWFyIHNwZWVkIG5vdCBhbmd1bGFyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZExpbmVhclZlbG9jaXR5KG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdpbmcgdGhlIFZFTE9DSVRZIG9mIHRoZSBSSUdJREJPRFkuIE9ubHkgaW5mbHVlbmNpbmcgdGhlIGFuZ3VsYXIgc3BlZWQgbm90IHRoZSBsaW5lYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZEFuZ3VsYXJWZWxvY2l0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZEFuZ3VsYXJWZWxvY2l0eShuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoZSByaWdpZGJvZGllcyBhdXRvLXNsZWVwaW5nIGZ1bmN0aW9uLlxyXG4gICAgICogSWYgYWN0aXZhdGVkIHRoZSByaWdpZGJvZHkgd2lsbCBhdXRvbWF0aWNhbGx5IHNsZWVwIHdoZW4gbmVlZGVkLCBpbmNyZWFzaW5nIHBlcmZvcm1hbmNlLlxyXG4gICAgICogSWYgZGVhY3RpdmF0ZWQgdGhlIHJpZ2lkYm9keSBnZXRzIHN0b3BwZWQgZnJvbSBzbGVlcGluZyB3aGVuIG1vdmVtZW50IGlzIHRvbyBtaW5pbWFsLiBEZWNyZWFzaW5nIHBlcmZvcm1hbmNlLCBmb3IgcmFyZWx5IG1vcmUgcHJlY2lzZSBwaHlzaWNzIHJlc3VsdHMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZUF1dG9TbGVlcChfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEF1dG9TbGVlcChfb24pO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIENvbGxpc2lvblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBDaGVja2luZyBmb3IgQ29sbGlzaW9uIHdpdGggb3RoZXIgQ29sbGlkZXJzIGFuZCBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxpZGVyLlxyXG4gICAgLy8gICogQXV0b21hdGljYWxseSBjYWxsZWQgaW4gdGhlIFJlbmRlck1hbmFnZXIsIG5vIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGNoZWNrQ29sbGlzaW9uRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgLy8gICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkgLy8gY2hlY2sgY29sbGlzaW9ucyBvbmx5IGlmIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZFxyXG4gICAgLy8gICAgIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGxldCBjb250YWN0TGluazogT0lNTy5Db250YWN0TGluayA9IHRoaXMuI3JpZ2lkYm9keS5nZXRDb250YWN0TGlua0xpc3QoKTsgLy8gYWxsIHBoeXNpY2FsIGNvbnRhY3RzIGJldHdlZW4gY29sbGlkaW5nIGJvZGllcyBvbiB0aGlzIHJiXHJcbiAgICAvLyAgIHdoaWxlIChjb250YWN0TGluayAhPSBudWxsKSB7XHJcbiAgICAvLyAgICAgbGV0IG90aGVyOiBDb21wb25lbnRSaWdpZGJvZHkgPSBjb250YWN0TGluay5nZXRPdGhlcigpLnVzZXJEYXRhOyAvLyBnZXQgdGhlIG90aGVyIGNvbXBvbmVudCByaWdpZGJvZHkgaW52b2x2ZWQgaW4gdGhlIGNvbGxpc2lvblxyXG4gICAgLy8gICAgIGlmICghb3RoZXIuaXNJbml0aWFsaXplZCkge1xyXG4gICAgLy8gICAgICAgY29udGFjdExpbmsgPSBjb250YWN0TGluay5nZXROZXh0KCk7XHJcbiAgICAvLyAgICAgICBjb250aW51ZTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGxldCBjb250YWN0OiBPSU1PLkNvbnRhY3QgPSBjb250YWN0TGluay5nZXRDb250YWN0KCk7XHJcbiAgICAvLyAgICAgbGV0IHdhc1RvdWNoaW5nOiBib29sZWFuID0gdGhpcy5jb2xsaXNpb25zLmluY2x1ZGVzKG90aGVyKTtcclxuICAgIC8vICAgICBsZXQgaXNUb3VjaGluZzogYm9vbGVhbiA9IGNvbnRhY3QuaXNUb3VjaGluZygpO1xyXG5cclxuICAgIC8vICAgICBpZiAoIXdhc1RvdWNoaW5nICYmIGlzVG91Y2hpbmcpIHsgLy8gRU5URVJcclxuICAgIC8vICAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IGNvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgIC8vICAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IC8vIEFsbCBwb2ludHMgaW4gdGhlIGNvbGxpc2lvbiB3aGVyZSB0aGUgdHdvIGJvZGllcyBhcmUgdG91Y2hpbmcsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIGltcGFjdFxyXG4gICAgLy8gICAgICAgbGV0IG5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBsZXQgYmlub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgbGV0IHRhbmdlbnRJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgZm9yIChsZXQgbWFuaWZvbGRQb2ludCBvZiBwb2ludHMpIHsgLy8gVGhlIGltcGFjdCBvZiB0aGUgY29sbGlzaW9uIGludm9sdmluZyBhbGwgdG91Y2hpbmcgcG9pbnRzXHJcbiAgICAvLyAgICAgICAgIG5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXROb3JtYWxJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICAgIGJpbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldEJpbm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgLy8gICAgICAgICB0YW5nZW50SW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldFRhbmdlbnRJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgIC8vICAgICAgIGxldCBjb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyhub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56KTtcclxuICAgIC8vICAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IHRoaXMuY29sbGlzaW9uQ2VudGVyUG9pbnQocG9pbnRzLCBtYW5pZm9sZC5nZXROdW1Qb2ludHMoKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLmNvbGxpc2lvbnMucHVzaChvdGhlcik7XHJcbiAgICAvLyAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FTlRFUiwgb3RoZXIsIG5vcm1hbEltcHVsc2UsIHRhbmdlbnRJbXB1bHNlLCBiaW5vcm1hbEltcHVsc2UsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTsgLy8gU2VuZGluZyB0aGUgZ2l2ZW4gZXZlbnRcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKHdhc1RvdWNoaW5nICYmICFpc1RvdWNoaW5nKSB7IC8vIEVYSVRcclxuICAgIC8vICAgICAgIHRoaXMuY29sbGlzaW9ucy5zcGxpY2UodGhpcy5jb2xsaXNpb25zLmluZGV4T2Yob3RoZXIpLCAxKTtcclxuICAgIC8vICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VYSVQsIG90aGVyLCAwLCAwLCAwKSk7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb250YWN0TGluayA9IGNvbnRhY3RMaW5rLmdldE5leHQoKTsgLy8gU3RhcnQgdGhlIHNhbWUgcm91dGluZSB3aXRoIHRoZSBuZXh0IGNvbGxpc2lvbiBpbiB0aGUgbGlzdFxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyBhIHJheSB0aHJvdWdoIHRoaXMgc3BlY2lmaWMgYm9keSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgd29ybGQgYW5kIGNoZWNrcyBpZiB0aGlzIGJvZHkgd2FzIGhpdCBieSB0aGUgcmF5LFxyXG4gICAgICogcmV0dXJuaW5nIGluZm8gYWJvdXQgdGhlIGhpdC4gUHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhbmQgaW5mb3JtYXRpb24gYSByZWd1bGFyIHJheWNhc3QgZG9lcyBidXQgdGhlIHJheSBpcyBvbmx5IHRlc3RpbmcgYWdhaW5zdCB0aGlzIHNwZWNpZmljIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByYXljYXN0VGhpc0JvZHkoX29yaWdpbjogVmVjdG9yMywgX2RpcmVjdGlvbjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyLCBfZGVidWdEcmF3OiBib29sZWFuID0gZmFsc2UpOiBSYXlIaXRJbmZvIHtcclxuICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBuZXcgUmF5SGl0SW5mbygpO1xyXG4gICAgICBsZXQgZ2VvbWV0cnk6IE9JTU8uR2VvbWV0cnkgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgbGV0IHRyYW5zZm9ybTogT0lNTy5UcmFuc2Zvcm0gPSB0aGlzLiNyaWdpZGJvZHkuZ2V0VHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCBzY2FsZWREaXJlY3Rpb246IFZlY3RvcjMgPSBfZGlyZWN0aW9uLmNsb25lO1xyXG4gICAgICBzY2FsZWREaXJlY3Rpb24uc2NhbGUoX2xlbmd0aCk7XHJcbiAgICAgIGxldCBlbmRwb2ludDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHNjYWxlZERpcmVjdGlvbiwgX29yaWdpbi5jbG9uZSk7XHJcbiAgICAgIGxldCBvaW1vUmF5OiBPSU1PLlJheUNhc3RIaXQgPSBuZXcgT0lNTy5SYXlDYXN0SGl0KCk7XHJcbiAgICAgIGxldCBoaXQ6IGJvb2xlYW4gPSBnZW9tZXRyeS5yYXlDYXN0KG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueiksIG5ldyBPSU1PLlZlYzMoZW5kcG9pbnQueCwgZW5kcG9pbnQueSwgZW5kcG9pbnQueiksIHRyYW5zZm9ybSwgb2ltb1JheSk7IC8vdGhlIGFjdHVhbCBPaW1vUGh5c2ljcyBSYXljYXN0XHJcbiAgICAgIGlmIChoaXQpIHsgIC8vSWYgaGl0IHJldHVybiBhIGJ1bmNoIG9mIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgaGl0XHJcbiAgICAgICAgaGl0SW5mby5oaXQgPSB0cnVlO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhvaW1vUmF5LnBvc2l0aW9uLngsIG9pbW9SYXkucG9zaXRpb24ueSwgb2ltb1JheS5wb3NpdGlvbi56KTtcclxuICAgICAgICBoaXRJbmZvLmhpdE5vcm1hbCA9IG5ldyBWZWN0b3IzKG9pbW9SYXkubm9ybWFsLngsIG9pbW9SYXkubm9ybWFsLnksIG9pbW9SYXkubm9ybWFsLnopO1xyXG4gICAgICAgIGxldCBkeDogbnVtYmVyID0gX29yaWdpbi54IC0gaGl0SW5mby5oaXRQb2ludC54OyAgLy9jYWxjdWxhdGUgaGl0IGRpc3RhbmNlXHJcbiAgICAgICAgbGV0IGR5OiBudW1iZXIgPSBfb3JpZ2luLnkgLSBoaXRJbmZvLmhpdFBvaW50Lnk7XHJcbiAgICAgICAgbGV0IGR6OiBudW1iZXIgPSBfb3JpZ2luLnogLSBoaXRJbmZvLmhpdFBvaW50Lno7XHJcbiAgICAgICAgaGl0SW5mby5oaXREaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHopO1xyXG4gICAgICAgIGhpdEluZm8ucmlnaWRib2R5Q29tcG9uZW50ID0gdGhpcztcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgICAgaGl0SW5mby5yYXlFbmQgPSBlbmRwb2ludDtcclxuICAgICAgfSBlbHNlIHsgLy9Pbmx5IHRlbGwgdGhlIG9yaWdpbiwgYW5kIHRoZSBoaXQgcG9pbnQgaXMgdGhlIGVuZCBvZiB0aGUgcmF5LlxyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgICBoaXRJbmZvLmhpdFBvaW50ID0gbmV3IFZlY3RvcjMoZW5kcG9pbnQueCwgZW5kcG9pbnQueSwgZW5kcG9pbnQueik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKF9kZWJ1Z0RyYXcpIHtcclxuICAgICAgICBQaHlzaWNzLmRlYnVnRHJhdy5kZWJ1Z1JheShoaXRJbmZvLnJheU9yaWdpbiwgaGl0SW5mby5oaXRQb2ludCwgbmV3IENvbG9yKDAsIDEsIDAsIDEpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaGl0SW5mbztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmcgLSBTb21lIHByb3BlcnRpZXMgbWlnaHQgYmUgbWlzc2luZywgZS5nLiBjb252ZXhNZXNoIChGbG9hdDMyQXJyYXkpXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuZ2V0TXV0YXRvcigpO1xyXG5cclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24ubXR4UGl2b3Q7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmFjdGl2ZTtcclxuXHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHlwZUJvZHkgPSBCT0RZX1RZUEVbdGhpcy4jdHlwZUJvZHldO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnR5cGVDb2xsaWRlciA9IENPTExJREVSX1RZUEVbdGhpcy4jdHlwZUNvbGxpZGVyXTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbiA9IEJPRFlfSU5JVFt0aGlzLmluaXRpYWxpemF0aW9uXTtcclxuXHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWQgPSB0aGlzLiNpZDtcclxuICAgICAgc2VyaWFsaXphdGlvbi5waXZvdCA9IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLm10eFBpdm90LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnBpdm90KTtcclxuICAgICAgdGhpcy4jaWQgPSBfc2VyaWFsaXphdGlvbi5pZDtcclxuICAgICAgdGhpcy5tYXNzID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24ubWFzcywgdGhpcy5tYXNzKTtcclxuICAgICAgdGhpcy5kYW1wVHJhbnNsYXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5kYW1wVHJhbnNsYXRpb24sIHRoaXMuZGFtcFRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5kYW1wUm90YXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5kYW1wUm90YXRpb24sIHRoaXMuZGFtcFJvdGF0aW9uKTtcclxuICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cCA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmNvbGxpc2lvbkdyb3VwLCB0aGlzLmNvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy5lZmZlY3RSb3RhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmVmZmVjdFJvdGF0aW9uIHx8IHRoaXMuZWZmZWN0Um90YXRpb247XHJcbiAgICAgIHRoaXMuZWZmZWN0R3Jhdml0eSA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmVmZmVjdEdyYXZpdHksIHRoaXMuZWZmZWN0R3Jhdml0eSk7XHJcbiAgICAgIHRoaXMuZnJpY3Rpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5mcmljdGlvbiwgdGhpcy5mcmljdGlvbik7XHJcbiAgICAgIHRoaXMucmVzdGl0dXRpb24gPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5yZXN0aXR1dGlvbiwgdGhpcy5yZXN0aXR1dGlvbik7XHJcbiAgICAgIHRoaXMuaXNUcmlnZ2VyID0gX3NlcmlhbGl6YXRpb24uaXNUcmlnZ2VyIHx8IHRoaXMuaXNUcmlnZ2VyO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb24uaW5pdGlhbGl6YXRpb247XHJcblxyXG4gICAgICB0aGlzLmluaXRpYWxpemF0aW9uID0gPG51bWJlcj48dW5rbm93bj5CT0RZX0lOSVRbX3NlcmlhbGl6YXRpb24uaW5pdGlhbGl6YXRpb25dO1xyXG4gICAgICB0aGlzLnR5cGVCb2R5ID0gPG51bWJlcj48dW5rbm93bj5CT0RZX1RZUEVbX3NlcmlhbGl6YXRpb24udHlwZUJvZHldO1xyXG4gICAgICB0aGlzLnR5cGVDb2xsaWRlciA9IDxudW1iZXI+PHVua25vd24+Q09MTElERVJfVFlQRVtfc2VyaWFsaXphdGlvbi50eXBlQ29sbGlkZXJdO1xyXG4gICAgICAvLyB0aGlzLmNyZWF0ZSh0aGlzLm1hc3MsIHRoaXMuI3R5cGVCb2R5LCB0aGlzLiN0eXBlQ29sbGlkZXIsIHRoaXMuY29sbGlzaW9uR3JvdXAsIG51bGwsIHRoaXMuY29udmV4TWVzaCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGFuZ2UgcHJvcGVydGllcyBieSBhbiBhc3NvY2lhdGl2ZSBhcnJheSAqL1xyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmIChfbXV0YXRvci50eXBlQm9keSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IudHlwZUJvZHkgPSBwYXJzZUludChfbXV0YXRvci50eXBlQm9keSk7XHJcbiAgICAgIGlmIChfbXV0YXRvci50eXBlQ29sbGlkZXIgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIF9tdXRhdG9yLnR5cGVDb2xsaWRlciA9IHBhcnNlSW50KF9tdXRhdG9yLnR5cGVDb2xsaWRlcik7XHJcbiAgICAgIGlmIChfbXV0YXRvci5pbml0aWFsaXphdGlvbiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IuaW5pdGlhbGl6YXRpb24gPSBwYXJzZUludChfbXV0YXRvci5pbml0aWFsaXphdGlvbik7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgaWYgKF9tdXRhdG9yLmluaXRpYWxpemF0aW9uICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzQWN0aXZlKVxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAvLyBUT0RPOiBzZWUgaWYgdGhpcyBhbHRlcm5hdGl2ZSBzaG91bGQgYmUsIGF0IGxlYXN0IHBhcnRpYWxseSwgZG9uZSB3aXRoIG11dGF0ZVNlbGVjdGlvblxyXG4gICAgICAvLyBsZXQgY2FsbElmRXhpc3Q6IEZ1bmN0aW9uID0gKF9rZXk6IHN0cmluZywgX3NldHRlcjogRnVuY3Rpb24pID0+IHtcclxuICAgICAgLy8gICBpZiAoX211dGF0b3JbX2tleV0pXHJcbiAgICAgIC8vICAgICBfc2V0dGVyKF9tdXRhdG9yW19rZXldKTtcclxuICAgICAgLy8gfTtcclxuXHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZnJpY3Rpb25cIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmZyaWN0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJyZXN0aXR1dGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMucmVzdGl0dXRpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcIm1hc3NcIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLm1hc3MgPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcImRhbXBUcmFuc2xhdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZGFtcFRyYW5zbGF0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJkYW1wUm90YXRpb25cIiwgKF92YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmRhbXBSb3RhdGlvbiA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZWZmZWN0R3Jhdml0eVwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZWZmZWN0R3Jhdml0eSA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiY29sbGlzaW9uR3JvdXBcIiwgKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSA9PiB0aGlzLmNvbGxpc2lvbkdyb3VwID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJ0eXBlQm9keVwiLCAoX3ZhbHVlOiBzdHJpbmcpID0+IHRoaXMudHlwZUJvZHkgPSBwYXJzZUludChfdmFsdWUpKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJ0eXBlQ29sbGlkZXJcIiwgKF92YWx1ZTogc3RyaW5nKSA9PiB0aGlzLnR5cGVDb2xsaWRlciA9IHBhcnNlSW50KF92YWx1ZSkpO1xyXG5cclxuICAgICAgLy8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG5cclxuICAgICAgbXV0YXRvci5mcmljdGlvbiA9IHRoaXMuZnJpY3Rpb247XHJcbiAgICAgIG11dGF0b3IucmVzdGl0dXRpb24gPSB0aGlzLnJlc3RpdHV0aW9uO1xyXG4gICAgICBtdXRhdG9yLm1hc3MgPSB0aGlzLm1hc3M7XHJcbiAgICAgIG11dGF0b3IuZGFtcFRyYW5zbGF0aW9uID0gdGhpcy5kYW1wVHJhbnNsYXRpb247XHJcbiAgICAgIG11dGF0b3IuZGFtcFJvdGF0aW9uID0gdGhpcy5kYW1wUm90YXRpb247XHJcbiAgICAgIG11dGF0b3IuZWZmZWN0R3Jhdml0eSA9IHRoaXMuZWZmZWN0R3Jhdml0eTtcclxuICAgICAgbXV0YXRvci50eXBlQm9keSA9IHRoaXMuI3R5cGVCb2R5O1xyXG4gICAgICBtdXRhdG9yLnR5cGVDb2xsaWRlciA9IHRoaXMuI3R5cGVDb2xsaWRlcjtcclxuICAgICAgbXV0YXRvci5pc1RyaWdnZXIgPSB0aGlzLiNpc1RyaWdnZXI7XHJcblxyXG4gICAgICAvLyBPYmplY3QucHJldmVudEV4dGVuc2lvbnMobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlQm9keSlcclxuICAgICAgICB0eXBlcy50eXBlQm9keSA9IEJPRFlfVFlQRTtcclxuICAgICAgaWYgKHR5cGVzLnR5cGVDb2xsaWRlcilcclxuICAgICAgICB0eXBlcy50eXBlQ29sbGlkZXIgPSBDT0xMSURFUl9UWVBFO1xyXG4gICAgICBpZiAodHlwZXMuaW5pdGlhbGl6YXRpb24pXHJcbiAgICAgICAgdHlwZXMuaW5pdGlhbGl6YXRpb24gPSBCT0RZX0lOSVQ7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmNvbnZleE1lc2g7IC8vQ29udmV4IE1lc2ggY2FuJ3QgYmUgc2hvd24gaW4gdGhlIGVkaXRvciBiZWNhdXNlIGZsb2F0MzJBcnJheSBpcyBub3QgYSB2aWFibGUgbXV0YXRvclxyXG4gICAgICBkZWxldGUgX211dGF0b3IuY29sbGlzaW9uTWFzaztcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmlzSW5pdGlhbGl6ZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyBBY3RpdmF0ZSB0aGUgZnVuY3Rpb25zIG9mIHRoaXMgY29tcG9uZW50IGFzIHJlc3BvbnNlIHRvIGV2ZW50c1xyXG4gICAgcHJpdmF0ZSBobmRFdmVudCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9BREQ6XHJcbiAgICAgICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFLCB0aGlzLnJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCk7XHJcbiAgICAgICAgICAvLyB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQsIHRydWUpOyAvLyB1c2UgY2FwdHVyZSB0byByZWFjdCB0byBicm9hZGNhc3QhXHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkLCB0cnVlKTtcclxuICAgICAgICAgIGlmICghdGhpcy5ub2RlLmNtcFRyYW5zZm9ybSlcclxuICAgICAgICAgICAgRGVidWcud2FybihcIkNvbXBvbmVudFJpZ2lkYm9keSBhdHRhY2hlZCB0byBub2RlIG1pc3NpbmcgQ29tcG9uZW50VHJhbnNmb3JtXCIsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9SRU1PVkU6XHJcbiAgICAgICAgICAvLyB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5hZGRSaWdpZGJvZHlUb1dvcmxkKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLnJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCk7XHJcbiAgICAgICAgICAvLyB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0FDVElWQVRFLCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQsIHRydWUpOyAvLyB1c2UgY2FwdHVyZSB0byByZWFjdCB0byBicm9hZGNhc3QhXHJcbiAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEVWRU5ULk5PREVfREVTRVJJQUxJWkVEOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLm5vZGUuY21wVHJhbnNmb3JtKVxyXG4gICAgICAgICAgICBEZWJ1Zy5lcnJvcihcIkNvbXBvbmVudFJpZ2lkYm9keSBhdHRhY2hlZCB0byBub2RlIG1pc3NpbmcgQ29tcG9uZW50VHJhbnNmb3JtXCIsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gQ3JlYXRpb25cclxuICAgIHByaXZhdGUgY3JlYXRlKF9tYXNzOiBudW1iZXIgPSAxLCBfdHlwZTogQk9EWV9UWVBFID0gQk9EWV9UWVBFLkRZTkFNSUMsIF9jb2xsaWRlclR5cGU6IENPTExJREVSX1RZUEUgPSBDT0xMSURFUl9UWVBFLkNVQkUsIF9ncm91cDogQ09MTElTSU9OX0dST1VQID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0Q29sbGlzaW9uR3JvdXAsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCA9IG51bGwsIF9jb252ZXhNZXNoOiBGbG9hdDMyQXJyYXkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIC8vU2V0dGluZyB1cCBhbGwgaW5jb21pbmcgdmFsdWVzIHRvIGJlIGludGVybmFsIHZhbHVlc1xyXG4gICAgICB0aGlzLmNvbnZleE1lc2ggPSBfY29udmV4TWVzaDtcclxuICAgICAgdGhpcy4jdHlwZUJvZHkgPSBfdHlwZTtcclxuICAgICAgdGhpcy4jY29sbGlzaW9uR3JvdXAgPSBfZ3JvdXA7XHJcbiAgICAgIHRoaXMuI3R5cGVDb2xsaWRlciA9IF9jb2xsaWRlclR5cGU7XHJcbiAgICAgIHRoaXMubWFzcyA9IF9tYXNzO1xyXG4gICAgICB0aGlzLiNyZXN0aXR1dGlvbiA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdFJlc3RpdHV0aW9uO1xyXG4gICAgICB0aGlzLiNmcmljdGlvbiA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdEZyaWN0aW9uO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbk1hc2sgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25NYXNrO1xyXG4gICAgICAvL0NyZWF0ZSB0aGUgYWN0dWFsIHJpZ2lkYm9keSBpbiB0aGUgT2ltb1BoeXNpY3MgU3BhY2VcclxuICAgICAgdGhpcy5jcmVhdGVSaWdpZGJvZHkoX21hc3MsIF90eXBlLCB0aGlzLiN0eXBlQ29sbGlkZXIsIF9tdHhUcmFuc2Zvcm0sIHRoaXMuI2NvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jaWQgPSBQaHlzaWNzLmRpc3RyaWJ1dGVCb2R5SUQoKTtcclxuXHJcbiAgICAgIC8vIEV2ZW50IENhbGxiYWNrcyBkaXJlY3RseSBmcm9tIE9JTU8gUGh5c2ljc1xyXG4gICAgICB0aGlzLiNjYWxsYmFja3MgPSBuZXcgT0lNTy5Db250YWN0Q2FsbGJhY2soKTsgLy9mZWhtXHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5iZWdpblRyaWdnZXJDb250YWN0ID0gdGhpcy50cmlnZ2VyRW50ZXI7XHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5lbmRUcmlnZ2VyQ29udGFjdCA9IHRoaXMudHJpZ2dlckV4aXQ7XHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcy5wb3N0U29sdmUgPSB0aGlzLmNvbGxpc2lvbkVudGVyOyAvLyB1c2UgcG9zdFNvbHZlIGZvciBjb2xsaXNpb25FbnRlciB0byBnZXQgdGhlIGltcHVsc2VcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmVuZENvbnRhY3QgPSB0aGlzLmNvbGxpc2lvbkV4aXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgdGhlIGFjdHVhbCBPaW1vUGh5c2ljcyBSaWdpZGJvZHkgb3V0IG9mIGluZm9ybWF0aW9ucyB0aGUgRlVER0UgQ29tcG9uZW50IGhhcy4gKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUmlnaWRib2R5KF9tYXNzOiBudW1iZXIsIF90eXBlOiBCT0RZX1RZUEUsIF9jb2xsaWRlclR5cGU6IENPTExJREVSX1RZUEUsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCwgX2NvbGxpc2lvbkdyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVCk6IHZvaWQge1xyXG4gICAgICBsZXQgb2ltb1R5cGU6IG51bWJlcjsgLy9OZWVkIHRoZSBjb252ZXJzaW9uIGZyb20gc2ltcGxlIGVudW0gdG8gbnVtYmVyIGJlY2F1c2UgaWYgZW51bSBpcyBkZWZpbmVkIGFzIE9pbW8uUmlnaWR5Qm9keVR5cGUgeW91IGhhdmUgdG8gaW5jbHVkZSBPaW1vIHRvIHVzZSBGVURHRSBhdCBhbGxcclxuICAgICAgc3dpdGNoIChfdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQk9EWV9UWVBFLkRZTkFNSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5EWU5BTUlDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuU1RBVElDOlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuS0lORU1BVElDOlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuS0lORU1BVElDO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG9pbW9UeXBlID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGFsbCBwcmV2aW91cyBzaGFwZXMgZnJvbSB3b3JsZC4gTmVjZXNzYXJ5P1xyXG4gICAgICAvLyB3aGlsZSAodGhpcy4jcmlnaWRib2R5ICYmIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSAhPSBudWxsKVxyXG4gICAgICAvLyAgIHRoaXMuI3JpZ2lkYm9keS5yZW1vdmVTaGFwZSh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkpO1xyXG5cclxuICAgICAgbGV0IHRtcFRyYW5zZm9ybTogTWF0cml4NHg0ID0gX210eFRyYW5zZm9ybSA9PSBudWxsID8gc3VwZXIubm9kZSAhPSBudWxsID8gc3VwZXIubm9kZS5tdHhXb3JsZCA6IE1hdHJpeDR4NC5JREVOVElUWSgpIDogX210eFRyYW5zZm9ybTsgLy9HZXQgdHJhbnNmb3JtIGluZm9ybWF0aW9ucyBmcm9tIHRoZSB3b3JsZCwgc2luY2UgcGh5c2ljcyBkb2VzIG5vdCBjYXJlIGFib3V0IGhpZXJhcmNoeVxyXG4gICAgICAvL0NvbnZlcnQgaW5mb3JtYXRpb25zIGZyb20gRlVER0UgdG8gT2ltb1BoeXNpY3MgYW5kIGNyZWF0aW5nIGEgY29sbGlkZXIgd2l0aCBpdCwgd2hpbGUgYWxzbyBhZGRpbmcgYSBwaXZvdCB0byBkZXJpdmF0ZSBmcm9tIHRoZSB0cmFuc2Zvcm0gaW5mb3JtYXRpb25zIGlmIG5lZWRlZFxyXG4gICAgICBsZXQgc2NhbGU6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoKHRtcFRyYW5zZm9ybS5zY2FsaW5nLnggKiB0aGlzLm10eFBpdm90LnNjYWxpbmcueCkgLyAyLCAodG1wVHJhbnNmb3JtLnNjYWxpbmcueSAqIHRoaXMubXR4UGl2b3Quc2NhbGluZy55KSAvIDIsICh0bXBUcmFuc2Zvcm0uc2NhbGluZy56ICogdGhpcy5tdHhQaXZvdC5zY2FsaW5nLnopIC8gMik7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyh0bXBUcmFuc2Zvcm0udHJhbnNsYXRpb24ueCArIHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24ueCwgdG1wVHJhbnNmb3JtLnRyYW5zbGF0aW9uLnkgKyB0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLnksIHRtcFRyYW5zZm9ybS50cmFuc2xhdGlvbi56ICsgdGhpcy5tdHhQaXZvdC50cmFuc2xhdGlvbi56KTtcclxuICAgICAgbGV0IHJvdGF0aW9uOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKHRtcFRyYW5zZm9ybS5yb3RhdGlvbi54ICsgdGhpcy5tdHhQaXZvdC5yb3RhdGlvbi54LCB0bXBUcmFuc2Zvcm0ucm90YXRpb24ueSArIHRoaXMubXR4UGl2b3Qucm90YXRpb24ueSwgdG1wVHJhbnNmb3JtLnJvdGF0aW9uLnogKyB0aGlzLm10eFBpdm90LnJvdGF0aW9uLnopO1xyXG4gICAgICB0aGlzLmNyZWF0ZUNvbGxpZGVyKHNjYWxlLCBfY29sbGlkZXJUeXBlKTtcclxuICAgICAgLy9TZXR0aW5nIGluZm9ybWF0aW9ucyBhYm91dCBtYXNzLCBwb3NpdGlvbi9yb3RhdGlvbiBhbmQgcGh5c2ljYWwgcmVhY3Rpb24gdHlwZVxyXG4gICAgICB0aGlzLiNtYXNzRGF0YS5tYXNzID0gX21hc3M7IC8vX3R5cGUgIT0gUEhZU0lDU19UWVBFLlNUQVRJQyA/IF9tYXNzIDogMDsgLy9JZiBhIG9iamVjdCBpcyBzdGF0aWMgaXQgYWN0cyBhcyBpZiBpdCBoYXMgbm8gbWFzc1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnR5cGUgPSBvaW1vVHlwZTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5SW5mby5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnJvdGF0aW9uLmZyb21FdWxlclh5eihuZXcgT0lNTy5WZWMzKHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopKTsgLy9Db252ZXJ0IGV1bGVyQW5nbGVzIGluIGRlZ3JlZSB0byB0aGUgaW50ZXJuYWxseSB1c2VkIHF1YXRlcm5pb25zXHJcbiAgICAgIC8vQ3JlYXRpbmcgdGhlIGFjdHVhbCByaWdpZGJvZHkgYW5kIGl0J3MgY29sbGlkZXJcclxuICAgICAgdGhpcy4jcmlnaWRib2R5ID0gbmV3IE9JTU8uUmlnaWRCb2R5KHRoaXMuI3JpZ2lkYm9keUluZm8pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlciA9IG5ldyBPSU1PLlNoYXBlKHRoaXMuI2NvbGxpZGVySW5mbyk7XHJcbiAgICAgIC8vRmlsbGluZyB0aGUgYWRkaXRpb25hbCBzZXR0aW5ncyBhbmQgaW5mb3JtYXRpb25zIHRoZSByaWdpZGJvZHkgbmVlZHMuIFdobyBpcyBjb2xsaWRpbmcsIGhvdyBpcyB0aGUgY29sbGlzaW9uIGhhbmRsZWQgKGRhbXBpbmcsIGluZmx1ZW5jZSBmYWN0b3JzKVxyXG4gICAgICB0aGlzLiNjb2xsaWRlci51c2VyRGF0YSA9IHRoaXM7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbkdyb3VwKF9jb2xsaXNpb25Hcm91cCk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbGxpc2lvbk1hc2sodGhpcy5jb2xsaXNpb25NYXNrKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFkZFNoYXBlKHRoaXMuI2NvbGxpZGVyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldFJlc3RpdHV0aW9uKHRoaXMuI3Jlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldEZyaWN0aW9uKHRoaXMuI2ZyaWN0aW9uKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldENvbnRhY3RDYWxsYmFjayh0aGlzLiNjYWxsYmFja3MpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyRGFtcGluZyh0aGlzLiNkYW1waW5nTGluZWFyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEFuZ3VsYXJEYW1waW5nKHRoaXMuI2RhbXBpbmdBbmd1bGFyKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEdyYXZpdHlTY2FsZSh0aGlzLiNlZmZlY3RHcmF2aXR5KTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldFJvdGF0aW9uRmFjdG9yKG5ldyBPSU1PLlZlYzModGhpcy4jZWZmZWN0Um90YXRpb24ueCwgdGhpcy4jZWZmZWN0Um90YXRpb24ueSwgdGhpcy4jZWZmZWN0Um90YXRpb24ueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGVzIGEgY29sbGlkZXIgYSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCBpbiB0aGUgcGh5c2ljYWwgd29ybGQuICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb2xsaWRlcihfc2NhbGU6IE9JTU8uVmVjMywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSk6IHZvaWQge1xyXG4gICAgICBsZXQgc2hhcGVDb25mOiBPSU1PLlNoYXBlQ29uZmlnID0gbmV3IE9JTU8uU2hhcGVDb25maWcoKTsgLy9Db2xsaWRlciB3aXRoIGdlb21ldHJ5IGFuZCBpbmZvcyBsaWtlIGZyaWN0aW9uL3Jlc3RpdHV0aW9uIGFuZCBtb3JlXHJcbiAgICAgIGxldCBnZW9tZXRyeTogT0lNTy5HZW9tZXRyeTtcclxuICAgICAgaWYgKHRoaXMudHlwZUNvbGxpZGVyICE9IF9jb2xsaWRlclR5cGUpIC8vSWYgdGhlIGNvbGxpZGVyIHR5cGUgd2FzIGNoYW5nZWQgc2V0IHRoZSBpbnRlcm5hbCBvbmUgbmV3LCBlbHNlIGRvbid0IHNvIHRoZXJlIGlzIG5vdCBpbmZpbml0ZSBzZXQgY2FsbHNcclxuICAgICAgICB0aGlzLnR5cGVDb2xsaWRlciA9IF9jb2xsaWRlclR5cGU7XHJcbiAgICAgIHN3aXRjaCAoX2NvbGxpZGVyVHlwZSkgeyAgLy9DcmVhdGUgYSBkaWZmZXJlbnQgT2ltb1BoeXNpY3MgZ2VvbWV0cnkgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUuIFRoYXQgaXMgb25seSB0aGUgbWF0aGVtYXRpY2FsIHNoYXBlIG9mIHRoZSBjb2xsaWRlclxyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DVUJFOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5Cb3hHZW9tZXRyeShfc2NhbGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLlNQSEVSRTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uU3BoZXJlR2VvbWV0cnkoX3NjYWxlLngpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNBUFNVTEU6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkNhcHN1bGVHZW9tZXRyeShfc2NhbGUueCwgX3NjYWxlLnkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNZTElOREVSOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5DeWxpbmRlckdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ09ORTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uQ29uZUdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuUFlSQU1JRDpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gdGhpcy5jcmVhdGVDb252ZXhHZW9tZXRyeUNvbGxpZGVyKHRoaXMuY3JlYXRlUHlyYW1pZFZlcnRpY2VzKCksIF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ09OVkVYOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSB0aGlzLmNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIodGhpcy5jb252ZXhNZXNoLCBfc2NhbGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgc2hhcGVDb25mLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVySW5mbyA9IHNoYXBlQ29uZjsgLy90aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbnMgdGhhdCBhcmUgdXNlZCB0byBhZGQgYW4gYWN0dWFsIGNvbGxpZGVyIHRvIHRoZSByaWdpZGJvZHkgaW4gY3JlYXRlUmlnaWRib2R5XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgc2hhcGUgdGhhdCByZXByZXNlbnRzIGEgaW4gaXRzZWxmIGNsb3NlZCBmb3JtLCBvdXQgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb252ZXhHZW9tZXRyeUNvbGxpZGVyKF92ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBfc2NhbGU6IE9JTU8uVmVjMyk6IE9JTU8uQ29udmV4SHVsbEdlb21ldHJ5IHtcclxuICAgICAgbGV0IHZlcnRpY2VzQXNWZWMzOiBPSU1PLlZlYzNbXSA9IG5ldyBBcnJheSgpOyAvL0NvbnZlcnQgRlVER0UgVmVjdG9yMyB0byBPaW1vVmVjM1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX3ZlcnRpY2VzLmxlbmd0aDsgaSArPSAzKSB7IC8vMyBWYWx1ZXMgZm9yIG9uZSBwb2ludFxyXG4gICAgICAgIHZlcnRpY2VzQXNWZWMzLnB1c2gobmV3IE9JTU8uVmVjMyhfdmVydGljZXNbaV0gKiBfc2NhbGUueCwgX3ZlcnRpY2VzW2kgKyAxXSAqIF9zY2FsZS55LCBfdmVydGljZXNbaSArIDJdICogX3NjYWxlLnopKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3IE9JTU8uQ29udmV4SHVsbEdlb21ldHJ5KHZlcnRpY2VzQXNWZWMzKTsgLy9UZWxsIE9pbW9QaHlzaWNzIHRvIGNyZWF0ZSBhIGh1bGwgdGhhdCBpbnZvbHZlcyBhbGwgcG9pbnRzIGJ1dCBjbG9zZSBpdCBvZi4gQSBjb252ZXggc2hhcGUgY2FuIG5vdCBoYXZlIGEgaG9sZSBpbiBpdC5cclxuICAgIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdmVydGljZXMgdGhhdCBjb25zdHJ1Y3QgYSBweXJhbWlkLiBUaGUgdmVydGljZXMgb2YgdGhlIGltcGxlbWVudGVkIHB5cmFtaWQgbWVzaCBjYW4gYmUgdXNlZCB0b28uIEJ1dCB0aGV5IGFyZSBoYWxmZWQgYW5kIGRvdWJsZSBzaWRlZCwgc28gaXQncyBtb3JlIHBlcmZvcm1hbnQgdG8gdXNlIHRoaXMuICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVB5cmFtaWRWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICBsZXQgdmVydGljZXM6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgIC8qMCovLTEsIDAsIDEsIC8qMSovIDEsIDAsIDEsICAvKjIqLyAxLCAwLCAtMSwgLyozKi8gLTEsIDAsIC0xLFxyXG4gICAgICAgIC8qNCovIDAsIDIsIDBcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB2ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWRkaW5nIHRoaXMgQ29tcG9uZW50UmlnaWRib2R5IHRvIHRoZSBQaHlzaXNjcy53b3JsZCBnaXZpbmcgdGhlIG9pbW9QaHlzaWNzIHN5c3RlbSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkICovXHJcbiAgICBwcml2YXRlIGFkZFJpZ2lkYm9keVRvV29ybGQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy4jcmlnaWRib2R5Ll93b3JsZClcclxuICAgICAgICBQaHlzaWNzLmFkZFJpZ2lkYm9keSh0aGlzKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIFJlbW92aW5nIHRoaXMgQ29tcG9uZW50UmlnaWRib2R5IGZyb20gdGhlIFBoeXNpc2NzLndvcmxkIHRha2luZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIG9pbW9QaHlzaWNzIHN5c3RlbSAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIFBoeXNpY3MucmVtb3ZlUmlnaWRib2R5KHRoaXMpO1xyXG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBwcml2YXRlIEVWRU5UIGZ1bmN0aW9uc1xyXG4gICAgLy9DYWxjdWxhdGluZyB0aGUgY2VudGVyIG9mIGEgY29sbGlzaW9uIGFzIGEgc2luZ3VsYXIgcG9pbnQgLSBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcG9pbnQgLSBieSBnZXR0aW5nIHRoZSBnZW9tZXRyaWNhbCBjZW50ZXIgb2YgYWxsIGNvbGxpZGluZyBwb2ludHNcclxuICAgIHByaXZhdGUgY29sbGlzaW9uQ2VudGVyUG9pbnQoX2NvbFBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10sIF9udW1Qb2ludHM6IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdG90YWxQb2ludHM6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFg6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFk6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB0b3RhbFo6IG51bWJlciA9IDA7XHJcbiAgICAgIF9jb2xQb2ludHMuZm9yRWFjaCgoX3ZhbHVlOiBPSU1PLk1hbmlmb2xkUG9pbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAodG90YWxQb2ludHMgPCBfbnVtUG9pbnRzKSB7XHJcbiAgICAgICAgICB0b3RhbFBvaW50cysrO1xyXG4gICAgICAgICAgdG90YWxYICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS54O1xyXG4gICAgICAgICAgdG90YWxZICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS55O1xyXG4gICAgICAgICAgdG90YWxaICs9IF92YWx1ZS5nZXRQb3NpdGlvbjIoKS56O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0b3RhbFggLyBfbnVtUG9pbnRzLCB0b3RhbFkgLyBfbnVtUG9pbnRzLCB0b3RhbFogLyBfbnVtUG9pbnRzKTs7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGNvbGxpc2lvbkVudGVyKF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgYm9keUEuY29sbGlzaW9ucy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZW50ZXJlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLmNvbGxpc2lvbnMucHVzaChib2R5Qik7XHJcbiAgICAgIGJvZHlCLmNvbGxpc2lvbnMucHVzaChib2R5QSk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBtYXliZSByYXRoZXIgZXhwb3NlIHRoZSBtYW5pZm9sZCB0byB0aGUgZXZlbnQgb3Igc29tZXRoaW5nXHJcbiAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IF9jb250YWN0LmdldE1hbmlmb2xkKCk7XHJcbiAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IC8vIEFsbCBwb2ludHMgaW4gdGhlIGNvbGxpc2lvbiB3aGVyZSB0aGUgdHdvIGJvZGllcyBhcmUgdG91Y2hpbmcsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIGltcGFjdFxyXG4gICAgICBsZXQgbm9ybWFsSW1wdWxzZTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRhbmdlbnRJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgYmlub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBtYW5pZm9sZFBvaW50IG9mIHBvaW50cykgeyAvLyBUaGUgaW1wYWN0IG9mIHRoZSBjb2xsaXNpb24gaW52b2x2aW5nIGFsbCB0b3VjaGluZyBwb2ludHNcclxuICAgICAgICBub3JtYWxJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0Tm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgICAgIHRhbmdlbnRJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0VGFuZ2VudEltcHVsc2UoKTtcclxuICAgICAgICBiaW5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXRCaW5vcm1hbEltcHVsc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgICBsZXQgY29sbGlzaW9uQ2VudGVyUG9pbnQ6IFZlY3RvcjMgPSBib2R5QS5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VOVEVSLCBib2R5Qiwgbm9ybWFsSW1wdWxzZSwgdGFuZ2VudEltcHVsc2UsIGJpbm9ybWFsSW1wdWxzZSwgY29sbGlzaW9uQ2VudGVyUG9pbnQsIGNvbGxpc2lvbk5vcm1hbCkpO1xyXG4gICAgICBib2R5Qi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRU5URVIsIGJvZHlBLCBub3JtYWxJbXB1bHNlLCB0YW5nZW50SW1wdWxzZSwgYmlub3JtYWxJbXB1bHNlLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb2xsaXNpb25FeGl0KF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgIWJvZHlBLmNvbGxpc2lvbnMuaW5jbHVkZXMoYm9keUIpKSAvLyBhbHJlYWR5IGV4aXRlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLmNvbGxpc2lvbnMuc3BsaWNlKGJvZHlBLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QiksIDEpO1xyXG4gICAgICBib2R5Qi5jb2xsaXNpb25zLnNwbGljZShib2R5Qi5jb2xsaXNpb25zLmluZGV4T2YoYm9keUEpLCAxKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FWElULCBib2R5QiwgMCwgMCwgMCkpO1xyXG4gICAgICBib2R5Qi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRVhJVCwgYm9keUEsIDAsIDAsIDApKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVHJpZ2dlciBFbnRlcmluZ0V2ZW50IENhbGxiYWNrLCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBPSU1PIFBoeXNpY3Mgd2l0aGluIHRoZWlyIGNhbGN1bGF0aW9ucy5cclxuICAgICogU2luY2UgdGhlIGV2ZW50IGRvZXMgbm90IGtub3cgd2hpY2ggYm9keSBpcyB0aGUgdHJpZ2dlciBpbmlhdG9yLCB0aGUgZXZlbnQgY2FuIGJlIGxpc3RlbmVkIHRvXHJcbiAgICAqIG9uIGVpdGhlciB0aGUgdHJpZ2dlciBvciB0aGUgdHJpZ2dlcmVkLiAoVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggdGhlIEZVREdFIE9JTU8gRm9yayEpXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmlnZ2VyRW50ZXIoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCBib2R5QS50cmlnZ2VyaW5ncy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZW50ZXJlZFxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGJvZHlBLnRyaWdnZXJpbmdzLnB1c2goYm9keUIpO1xyXG4gICAgICBib2R5Qi50cmlnZ2VyaW5ncy5wdXNoKGJvZHlBKTtcclxuXHJcbiAgICAgIGxldCBtYW5pZm9sZDogT0lNTy5NYW5pZm9sZCA9IF9jb250YWN0LmdldE1hbmlmb2xkKCk7XHJcbiAgICAgIGxldCBwb2ludHM6IE9JTU8uTWFuaWZvbGRQb2ludFtdID0gbWFuaWZvbGQuZ2V0UG9pbnRzKCk7IFxyXG4gICAgICBsZXQgbm9ybWFsOiBPSU1PLlZlYzMgPSBtYW5pZm9sZC5nZXROb3JtYWwoKTtcclxuICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgICBsZXQgY29sbGlzaW9uQ2VudGVyUG9pbnQ6IFZlY3RvcjMgPSBib2R5QS5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRU5URVIsIGJvZHlCLCAwLCAwLCAwLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRU5URVIsIGJvZHlBLCAwLCAwLCAwLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRyaWdnZXIgTGVhdmluZ0V2ZW50IENhbGxiYWNrLCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBPSU1PIFBoeXNpY3Mgd2l0aGluIHRoZWlyIGNhbGN1bGF0aW9ucy5cclxuICAgICogU2luY2UgdGhlIGV2ZW50IGRvZXMgbm90IGtub3cgd2hpY2ggYm9keSBpcyB0aGUgdHJpZ2dlciBpbmlhdG9yLCB0aGUgZXZlbnQgY2FuIGJlIGxpc3RlbmVkIHRvXHJcbiAgICAqIG9uIGVpdGhlciB0aGUgdHJpZ2dlciBvciB0aGUgdHJpZ2dlcmVkLiAoVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggdGhlIEZVREdFIE9JTU8gRm9yayEpXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmlnZ2VyRXhpdChfY29udGFjdDogT0lNTy5Db250YWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBib2R5QTogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUxKCk/LnVzZXJEYXRhO1xyXG4gICAgICBsZXQgYm9keUI6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMigpPy51c2VyRGF0YTtcclxuXHJcbiAgICAgIGlmICghYm9keUEgfHwgIWJvZHlCIHx8ICFib2R5QS50cmlnZ2VyaW5ncy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZXhpdGVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEudHJpZ2dlcmluZ3Muc3BsaWNlKGJvZHlBLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QiksIDEpO1xyXG4gICAgICBib2R5Qi50cmlnZ2VyaW5ncy5zcGxpY2UoYm9keUIuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlBKSwgMSk7XHJcblxyXG4gICAgICBib2R5QS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5UUklHR0VSX0VYSVQsIGJvZHlCLCAwLCAwLCAwKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRVhJVCwgYm9keUEsIDAsIDAsIDApKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIGhvbGRpbmcgZGF0YSBhYm91dCBwaHlzaWNzIGRlYnVnIHZlcnRpY2VzLiovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlciB7XHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICBwdWJsaWMgbnVtVmVydGljZXM6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgYXR0cmliczogQXJyYXk8UGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlPjtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG9mZnNldHM6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgc3RyaWRlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBkYXRhTGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIFNldHVwIHRoZSByZW5kZXJpbmcgY29udGV4dCBmb3IgdGhpcyBidWZmZXIgYW5kIGNyZWF0ZSB0aGUgYWN0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb250ZXh0LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yZW5kZXJpbmdDb250ZXh0OiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KSB7XHJcbiAgICAgIHRoaXMuZ2wgPSBfcmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGaWxsIHRoZSBib3VuZCBidWZmZXIgd2l0aCBkYXRhLiBVc2VkIGF0IGJ1ZmZlciBpbml0aWFsaXphdGlvbiAqL1xyXG4gICAgcHVibGljIHNldERhdGEoX2FycmF5OiBBcnJheTxudW1iZXI+KTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLmF0dHJpYnMgPT0gbnVsbCkgdGhyb3cgXCJzZXQgYXR0cmlidXRlcyBmaXJzdFwiO1xyXG4gICAgICB0aGlzLm51bVZlcnRpY2VzID0gX2FycmF5Lmxlbmd0aCAvICh0aGlzLnN0cmlkZSAvIDQpO1xyXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KF9hcnJheSksIHRoaXMuZ2wuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgLy9ub3QgbmVjZXNzYXJ5IGFuIGluIHdlYmdsMiBhbnltb3JlIHRvIHJlYmluZCB0aGUgc2FtZSBsYXN0IGJ1ZmZlciAod2hpY2ggaXMgYWNoaWV2ZWQgYnkgZ2l2aW5nIGEgbnVsbCBidWZmZXIpLCBhZnRlciBidWZmZXIgaXMgY2hhbmdlZC4gUmVtb3ZlZCBpdCBvbiBhbGwgb3RoZXIgb2NjYXNpb25zXHJcbiAgICAgIC8vIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTZXQgU2hhZGVyIEF0dHJpYnV0ZXMgaW5mb3JtYXRpb25zIGJ5IGdldHRpbmcgdGhlaXIgcG9zaXRpb24gaW4gdGhlIHNoYWRlciwgc2V0dGluZyB0aGUgb2Zmc2V0LCBzdHJpZGUgYW5kIHNpemUuIEZvciBsYXRlciB1c2UgaW4gdGhlIGJpbmRpbmcgcHJvY2VzcyAqL1xyXG4gICAgcHVibGljIHNldEF0dHJpYnMoX2F0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4pOiB2b2lkIHtcclxuICAgICAgdGhpcy5hdHRyaWJzID0gX2F0dHJpYnM7XHJcbiAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xyXG4gICAgICB0aGlzLnN0cmlkZSA9IDA7XHJcbiAgICAgIGxldCBuOiBudW1iZXIgPSBfYXR0cmlicy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICB0aGlzLm9mZnNldHMucHVzaCh0aGlzLnN0cmlkZSk7XHJcbiAgICAgICAgdGhpcy5zdHJpZGUgKz0gX2F0dHJpYnNbaV0uZmxvYXQzMkNvdW50ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyAzMmJpdCBmbG9hdCBCeXRlcyBhcmUgYSBjb25zdGFudCBvZiA0XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSBzaGFkZXIgKi9cclxuICAgIHB1YmxpYyBsb2FkQXR0cmliSW5kaWNlcyhfcHJvZ3JhbTogUGh5c2ljc0RlYnVnU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuaW5kaWNlcyA9IF9wcm9ncmFtLmdldEF0dHJpYkluZGljZXModGhpcy5hdHRyaWJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRW5hYmxlIGEgYXR0cmlidXRlIGluIGEgc2hhZGVyIGZvciB0aGlzIGNvbnRleHQsICovXHJcbiAgICBwdWJsaWMgYmluZEF0dHJpYnMoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLmluZGljZXMgPT0gbnVsbCkgdGhyb3cgXCJpbmRpY2VzIGFyZSBub3QgbG9hZGVkXCI7XHJcbiAgICAgIGxldCBuOiBudW1iZXIgPSB0aGlzLmF0dHJpYnMubGVuZ3RoO1xyXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTsgLy9tYWtpbmcgdGhlIGJ1ZmZlciBvZiB0aGlzIGNsYXNzIHRoZSBjdXJyZW50IGJ1ZmZlclxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLmluZGljZXNbaV0pOyAvL2VuYWJsZSB0aGUgQXR0cmlidXRlXHJcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuaW5kaWNlc1tpXSwgdGhpcy5hdHRyaWJzW2ldLmZsb2F0MzJDb3VudCwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIHRoaXMuc3RyaWRlLCB0aGlzLm9mZnNldHNbaV0pOyAvL2NyZWF0ZXMgYSBwb2ludGVyIGFuZCBzdHJ1Y3R1cmUgZm9yIHRoaXMgYXR0cmlidXRlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBJbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBkYXRhIGFib3V0IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcnMgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIge1xyXG4gICAgcHVibGljIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgcHVibGljIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XHJcbiAgICBwdWJsaWMgY291bnQ6IG51bWJlcjtcclxuXHJcbiAgICAvKiogU2V0dXAgdGhlIHJlbmRlcmluZyBjb250ZXh0IGZvciB0aGlzIGJ1ZmZlciBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGlzIGNvbnRleHQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZpbGwgdGhlIGJvdW5kIGJ1ZmZlciB3aXRoIGRhdGEgYW1vdW50LiBVc2VkIGF0IGJ1ZmZlciBpbml0aWFsaXphdGlvbiAqL1xyXG4gICAgcHVibGljIHNldERhdGEoX2FycmF5OiBBcnJheTxudW1iZXI+KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuZXcgSW50MTZBcnJheShfYXJyYXkpLCB0aGlzLmdsLkRZTkFNSUNfRFJBVyk7XHJcbiAgICAgIHRoaXMuY291bnQgPSBfYXJyYXkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgYWN0dWFsIERyYXdDYWxsIGZvciBwaHlzaWNzRGVidWdEcmF3IEJ1ZmZlcnMuIFRoaXMgaXMgd2hlcmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGRlYnVnIGlzIGFjdHVhbGx5IGRyYXduLiAqL1xyXG4gICAgcHVibGljIGRyYXcoX21vZGU6IG51bWJlciA9IHRoaXMuZ2wuVFJJQU5HTEVTLCBfY291bnQ6IG51bWJlciA9IC0xKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmJ1ZmZlcik7XHJcbiAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKF9tb2RlLCBfY291bnQgPj0gMCA/IF9jb3VudCA6IHRoaXMuY291bnQsIHRoaXMuZ2wuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBtYW5hZ2luZyBkYXRhIGFib3V0IHdlYkdMIEF0dHJpYnV0ZXMgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlIHtcclxuICAgIHB1YmxpYyBmbG9hdDMyQ291bnQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9mbG9hdDMyQ291bnQ6IG51bWJlciwgX25hbWU6IHN0cmluZykge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5mbG9hdDMyQ291bnQgPSBfZmxvYXQzMkNvdW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBTaGFkZXJzIHVzZWQgb25seSBieSB0aGUgcGh5c2ljcyBkZWJ1Z0RyYXcgKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnU2hhZGVyIHtcclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgIHB1YmxpYyBwcm9ncmFtOiBXZWJHTFByb2dyYW07XHJcbiAgICBwdWJsaWMgdmVydGV4U2hhZGVyOiBXZWJHTFNoYWRlcjtcclxuICAgIHB1YmxpYyBmcmFnbWVudFNoYWRlcjogV2ViR0xTaGFkZXI7XHJcbiAgICBwdWJsaWMgdW5pZm9ybUxvY2F0aW9uTWFwOiBNYXA8c3RyaW5nLCBXZWJHTFVuaWZvcm1Mb2NhdGlvbj47XHJcblxyXG4gICAgLyoqIEludHJvZHVjZSB0aGUgRlVER0UgUmVuZGVyaW5nIENvbnRleHQgdG8gdGhpcyBjbGFzcywgY3JlYXRpbmcgYSBwcm9ncmFtIGFuZCB2ZXJ0ZXgvZnJhZ21lbnQgc2hhZGVyIGluIHRoaXMgY29udGV4dCAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yZW5kZXJpbmdDb250ZXh0OiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KSB7XHJcbiAgICAgIHRoaXMuZ2wgPSBfcmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgdGhpcy5wcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XHJcbiAgICAgIHRoaXMudmVydGV4U2hhZGVyID0gdGhpcy5nbC5jcmVhdGVTaGFkZXIodGhpcy5nbC5WRVJURVhfU0hBREVSKTtcclxuICAgICAgdGhpcy5mcmFnbWVudFNoYWRlciA9IHRoaXMuZ2wuY3JlYXRlU2hhZGVyKHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGFrZSBnbHNsIHNoYWRlcnMgYXMgc3RyaW5ncyBhbmQgY29tcGlsZSB0aGVtLCBhdHRhY2hpbmcgdGhlIGNvbXBpbGVkIHNoYWRlcnMgdG8gYSBwcm9ncmFtIHRoYXRzIHVzZWQgYnkgdGhpcyByZW5kZXJpbmcgY29udGV4dC4gKi9cclxuICAgIHB1YmxpYyBjb21waWxlKF92ZXJ0ZXhTb3VyY2U6IHN0cmluZywgX2ZyYWdtZW50U291cmNlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy51bmlmb3JtTG9jYXRpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgV2ViR0xVbmlmb3JtTG9jYXRpb24+KCk7XHJcbiAgICAgIHRoaXMuY29tcGlsZVNoYWRlcih0aGlzLnZlcnRleFNoYWRlciwgX3ZlcnRleFNvdXJjZSk7XHJcbiAgICAgIHRoaXMuY29tcGlsZVNoYWRlcih0aGlzLmZyYWdtZW50U2hhZGVyLCBfZnJhZ21lbnRTb3VyY2UpO1xyXG4gICAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMudmVydGV4U2hhZGVyKTtcclxuICAgICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB0aGlzLmZyYWdtZW50U2hhZGVyKTtcclxuICAgICAgdGhpcy5nbC5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgICBpZiAoIXRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuTElOS19TVEFUVVMpKSB7ICAvL21ha2Ugc3VyZSB0aGUgbGlua2luZyB3b3JrZWQsIHNvIHRoZSBwcm9ncmFtIGlzIHZhbGlkLCBhbmQgc2hhZGVycyBhcmUgd29ya2luZ1xyXG4gICAgICAgIERlYnVnLmxvZyh0aGlzLmdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5WQUxJREFURV9TVEFUVVMpKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVSUk9SIHZhbGlkYXRpbmcgcHJvZ3JhbSFcIiwgdGhpcy5nbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IGluZGV4IG9mIGEgYXR0cmlidXRlIGluIGEgc2hhZGVyIGluIHRoaXMgcHJvZ3JhbSAqL1xyXG4gICAgcHVibGljIGdldEF0dHJpYkluZGV4KF9uYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIF9uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHVuaWZvcm0gaW4gYSBzaGFkZXIgaW4gdGhpcyBwcm9ncmFtICovXHJcbiAgICBwdWJsaWMgZ2V0VW5pZm9ybUxvY2F0aW9uKF9uYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XHJcbiAgICAgIGlmICh0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5oYXMoX25hbWUpKSByZXR1cm4gdGhpcy51bmlmb3JtTG9jYXRpb25NYXAuZ2V0KF9uYW1lKTtcclxuICAgICAgbGV0IGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgX25hbWUpO1xyXG4gICAgICB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5zZXQoX25hbWUsIGxvY2F0aW9uKTtcclxuICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgYWxsIGluZGljZXMgZm9yIGV2ZXJ5IGF0dHJpYnV0ZSBpbiB0aGUgc2hhZGVycyBvZiB0aGlzIHByb2dyYW0gKi9cclxuICAgIHB1YmxpYyBnZXRBdHRyaWJJbmRpY2VzKF9hdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+KTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgIGxldCBpbmRpY2VzOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICAgIF9hdHRyaWJzLmZvckVhY2goX3ZhbHVlID0+IHtcclxuICAgICAgICBpbmRpY2VzLnB1c2godGhpcy5nZXRBdHRyaWJJbmRleChfdmFsdWUubmFtZSkpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRlbGwgdGhlIEZVREdFIFJlbmRlcmluZyBDb250ZXh0IHRvIHVzZSB0aGlzIHByb2dyYW0gdG8gZHJhdy4gKi9cclxuICAgIHB1YmxpYyB1c2UoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb21waWxlIGEgc2hhZGVyIG91dCBvZiBhIHN0cmluZyBhbmQgdmFsaWRhdGUgaXQuICovXHJcbiAgICBwdWJsaWMgY29tcGlsZVNoYWRlcihfc2hhZGVyOiBXZWJHTFNoYWRlciwgX3NvdXJjZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKF9zaGFkZXIsIF9zb3VyY2UpO1xyXG4gICAgICB0aGlzLmdsLmNvbXBpbGVTaGFkZXIoX3NoYWRlcik7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRTaGFkZXJQYXJhbWV0ZXIoX3NoYWRlciwgdGhpcy5nbC5DT01QSUxFX1NUQVRVUykpIHtcclxuICAgICAgICBEZWJ1Zy5sb2codGhpcy5nbC5nZXRTaGFkZXJJbmZvTG9nKF9zaGFkZXIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIENsYXNzIHVzZWQgdG8gZHJhdyBkZWJ1Z0luZm9ybWF0aW9ucyBhYm91dCB0aGUgcGh5c2ljcyBzaW11bGF0aW9uIG9udG8gdGhlIHJlbmRlckNvbnRleHQuIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwIC8vQmFzZWQgb24gT2ltb1BoeXNpY3MgSGF4ZSBEZWJ1Z0RyYXdEZW1vIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdEcmF3IGV4dGVuZHMgUmVuZGVyV2ViR0wge1xyXG4gICAgcHVibGljIG9pbW9EZWJ1Z0RyYXc6IE9JTU8uRGVidWdEcmF3OyAvL3RoZSBvcmlnaW5hbCBwaHlzaWNzIGVuZ2luZSBkZWJ1Z0RyYXcgY2xhc3MgcmVjZWl2aW5nIGNhbGxzIGZyb20gdGhlIG9pbW9QaHlzaWNzLldvcmxkLCBhbmQgcHJvdmlkaW5nIGluZm9ybWF0aW9ucyBpbiBmb3JtIG9mIHBvaW50cy9saW5lcy90cmlhbmdsZXMgd2hhdCB0aGUgcGh5c2ljcyB3b3JsZCBsb29rcyBsaWtlXHJcbiAgICBwdWJsaWMgc3R5bGU6IE9JTU8uRGVidWdEcmF3U3R5bGU7IC8vY29sb3JzIG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbnMsIHVuY2hhbmdlZCBpbiBGVURHRSBpbnRlZ3JhdGlvbiwgYmFzaWNhbGx5IGNvbG9yaW5nIHRoaW5ncyBsaWtlIHNsZWVwaW5nL2FjdGl2ZSByYidzIGRpZmZlcmVudGx5LCBqb2ludHMgd2hpdGUgYW5kIHN1Y2guIE5vIG5lZWQgdG8gaGF2ZSB1c2VycyBjaGFuZ2UgYW55dGhpbmcuXHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcblxyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTsgLy9wcm9ncmFtIHRoYXQgaXMgdXNlZCBpbiB0aGUgRlVER0UgcmVuZGVyaW5nIGNvbnRleHQgY29udGFpbmluZyBzaGFkZXJzIGFuZCB1c2UgaW5mb3JtYXRpb25zIGZvciB0aGUgY29udGV4dCB0byBrbm93IGhvdyB0byBkcmF3XHJcbiAgICBwdWJsaWMgc2hhZGVyOiBQaHlzaWNzRGVidWdTaGFkZXI7XHJcblxyXG4gICAgLy9CdWZmZXJzIGZvciBwb2ludHMvbGluZXMvdHJpYW5nbGVzLiBJbmRleCBCdWZmZXIgZm9yIHRoZSBhbW91bnQgb2YgZHJhd0NhbGxzIGFuZCBWZXJ0ZXggQnVmZmVyIGZvciB0aGUgaW5mb3JtYXRpb25zXHJcbiAgICBwdWJsaWMgcG9pbnRWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBwb2ludElCTzogUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXI7XHJcblxyXG4gICAgcHVibGljIGxpbmVWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBsaW5lSUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgdHJpVkJPOiBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXI7XHJcbiAgICBwdWJsaWMgdHJpSUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgcG9pbnREYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIHBvaW50SWJvRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBudW1Qb2ludERhdGE6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgbGluZURhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbGluZUlib0RhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbnVtTGluZURhdGE6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgdHJpRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyB0cmlJYm9EYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG51bVRyaURhdGE6IG51bWJlcjtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgdGhlIGRlYnVnIGZvciBwaHlzaWNzIGluIEZVREdFLiBUZWxsIGl0IHRvIGRyYXcgb25seSB3aXJlZnJhbWUgb2JqZWN0cywgc2luY2UgRlVER0UgaXMgaGFuZGxpbmcgcmVuZGVyaW5nIG9mIHRoZSBvYmplY3RzIGJlc2lkZXMgcGh5c2ljcy4gXHJcbiAgICAgKiBPdmVycmlkZSBPaW1vUGh5c2ljcyBGdW5jdGlvbnMgd2l0aCBvd24gcmVuZGVyaW5nLiBJbml0aWFsaXplIGJ1ZmZlcnMgYW5kIGNvbm5lY3QgdGhlbSB3aXRoIHRoZSBjb250ZXh0IGZvciBsYXRlciB1c2UuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICB0aGlzLnN0eWxlID0gbmV3IE9JTU8uRGVidWdEcmF3U3R5bGUoKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3ID0gbmV3IE9JTU8uRGVidWdEcmF3KCk7XHJcbiAgICAgIHRoaXMub2ltb0RlYnVnRHJhdy53aXJlZnJhbWUgPSB0cnVlOyAvL1RyaWFuZ2xlIFJlbmRlcmluZyBpcyBoYW5kbGVkIGJ5IEZVREdFIHNvLCBvbmx5IHRoZSBwaHlzaWNzIGxpbmVzL3BvaW50cyBuZWVkIHRvIGJlIHJlbmRlcmVkLCBhbHRob3VnaCB0cmlhbmdsZSBpcyBzdGlsbCBpbXBsZW1lbnRlZFxyXG5cclxuICAgICAgdGhpcy5nbCA9IFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU92ZXJyaWRlKCk7XHJcbiAgICAgIHRoaXMuc2hhZGVyID0gbmV3IFBoeXNpY3NEZWJ1Z1NoYWRlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5zaGFkZXIuY29tcGlsZSh0aGlzLnZlcnRleFNoYWRlclNvdXJjZSgpLCB0aGlzLmZyYWdtZW50U2hhZGVyU291cmNlKCkpO1xyXG5cclxuICAgICAgdGhpcy5pbml0aWFsaXplQnVmZmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZWNlaXZlIHRoZSBjdXJyZW50IERlYnVnTW9kZSBmcm9tIHRoZSBwaHlzaWNzIHNldHRpbmdzIGFuZCBzZXQgdGhlIE9pbW9QaHlzaWNzLkRlYnVnRHJhdyBib29sZWFucyB0byBzaG93IG9ubHkgY2VydGFpbiBpbmZvcm1hdGlvbnMuXHJcbiAgICAgKiBOZWVkZWQgc2luY2Ugc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbnMgZXhjbHVkZSBvdGhlcnMsIGFuZCBjYW4ndCBiZSBkcmF3biBhdCB0aGUgc2FtZSB0aW1lLCBieSBPaW1vUGh5c2ljcy4gQW5kIGZvciB1c2VycyBpdCBwcm92aWRlcyBtb3JlIHJlYWRhYmlsaXR5XHJcbiAgICAgKiB0byBkZWJ1ZyBvbmx5IHdoYXQgdGhleSBuZWVkIGFuZCBpcyBjb21tb25seSBkZWJ1Z2dlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldERlYnVnTW9kZShfbW9kZTogUEhZU0lDU19ERUJVR01PREUgPSBQSFlTSUNTX0RFQlVHTU9ERS5OT05FKTogdm9pZCB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICBsZXQgZHJhdyA9IHsgZHJhd0FhYmJzOiBmYWxzZSwgZHJhd0Jhc2VzOiBmYWxzZSwgZHJhd0J2aDogZmFsc2UsIGRyYXdDb250YWN0QmFzZXM6IGZhbHNlLCBkcmF3Q29udGFjdHM6IGZhbHNlLCBkcmF3Sm9pbnRMaW1pdHM6IGZhbHNlLCBkcmF3Sm9pbnRzOiBmYWxzZSwgZHJhd1BhaXJzOiBmYWxzZSwgZHJhd1NoYXBlczogZmFsc2UgfTtcclxuXHJcbiAgICAgIHN3aXRjaCAoX21vZGUpIHtcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkNPTExJREVSUzogLy9Db2xsaWRlcnMgYW5kIEJhc2VzXHJcbiAgICAgICAgICBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd1NoYXBlcyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkpPSU5UU19BTkRfQ09MTElERVI6IC8vQ29sbGlkZXJzIGFuZCBqb2ludHNcclxuICAgICAgICAgIGRyYXcuZHJhd0pvaW50cyA9IGRyYXcuZHJhd0pvaW50TGltaXRzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuUEhZU0lDX09CSkVDVFNfT05MWTogLy9QaHlzaWNzIE9iamVjdHMgb25seSwgc2hvd3Mgc2FtZSBhcyBDb2xsaWRlciAvIEpvaW50cyBidXQgYWxzbyBoaWRpbmcgZXZlcnkgb3RoZXIgZnVkZ2Ugb2JqZWN0XHJcbiAgICAgICAgICBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd0pvaW50TGltaXRzID0gZHJhdy5kcmF3Sm9pbnRzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQ09OVEFDVFM6IC8vQ29udGFjdHNcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3Q29udGFjdEJhc2VzID0gZHJhdy5kcmF3Q29udGFjdHMgPSBkcmF3LmRyYXdQYWlycyA9IGRyYXcuZHJhd1NoYXBlcyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBIWVNJQ1NfREVCVUdNT0RFLkJPVU5ESU5HX0JPWEVTOiAvL0JvdW5kaW5nIEJveCAvIEJyb2FkcGhhc2UgQnZoIC8gQmFzZXNcclxuICAgICAgICAgIGRyYXcuZHJhd0FhYmJzID0gZHJhdy5kcmF3QmFzZXMgPSBkcmF3LmRyYXdCdmggPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9pbW9EZWJ1Z0RyYXcsIGRyYXcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGluZyB0aGUgZW1wdHkgcmVuZGVyIGJ1ZmZlcnMuIERlZmluaW5nIHRoZSBhdHRyaWJ1dGVzIHVzZWQgaW4gc2hhZGVycy5cclxuICAgICAqIE5lZWRzIHRvIGNyZWF0ZSBlbXB0eSBidWZmZXJzIHRvIGFscmVhZHkgaGF2ZSB0aGVtIHJlYWR5IHRvIGRyYXcgbGF0ZXIgb24sIGxpbmtpbmcgaXMgb25seSBwb3NzaWJsZSB3aXRoIGV4aXN0aW5nIGJ1ZmZlcnMuICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZUJ1ZmZlcnMoKTogdm9pZCB7XHJcbiAgICAgIGxldCBhdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+ID0gW1xyXG4gICAgICAgIG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGUoMywgXCJhUG9zaXRpb25cIiksXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFOb3JtYWxcIiksXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFDb2xvclwiKVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgdGhpcy5wb2ludFZCTyA9IG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMucG9pbnRJQk8gPSBuZXcgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMucG9pbnRWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy5wb2ludFZCTy5sb2FkQXR0cmliSW5kaWNlcyh0aGlzLnNoYWRlcik7XHJcbiAgICAgIHRoaXMubGluZVZCTyA9IG5ldyBQaHlzaWNzRGVidWdWZXJ0ZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMubGluZUlCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5saW5lVkJPLnNldEF0dHJpYnMoYXR0cmlicyk7XHJcbiAgICAgIHRoaXMubGluZVZCTy5sb2FkQXR0cmliSW5kaWNlcyh0aGlzLnNoYWRlcik7XHJcbiAgICAgIHRoaXMudHJpVkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy50cmlJQk8gPSBuZXcgUGh5c2ljc0RlYnVnSW5kZXhCdWZmZXIodGhpcy5nbCk7XHJcbiAgICAgIHRoaXMudHJpVkJPLnNldEF0dHJpYnMoYXR0cmlicyk7XHJcbiAgICAgIHRoaXMudHJpVkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuXHJcbiAgICAgIHRoaXMuY2xlYXJCdWZmZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEJlZm9yZSBPaW1vUGh5c2ljcy53b3JsZCBpcyBmaWxsaW5nIHRoZSBkZWJ1Zy4gTWFrZSBzdXJlIHRoZSBidWZmZXJzIGFyZSByZXNldC4gQWxzbyByZWNlaXZpbmcgdGhlIGRlYnVnTW9kZSBmcm9tIHNldHRpbmdzIGFuZCB1cGRhdGluZyB0aGUgY3VycmVudCBwcm9qZWN0aW9uIGZvciB0aGUgdmVydGV4U2hhZGVyLiAqL1xyXG4gICAgcHVibGljIGNsZWFyQnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5saW5lV2lkdGgoMi4wKTsgLy9Eb2VzIG5vdCBhZmZlY3QgYW55dGhpbmcgYmVjYXVzZSBsaW5lV2lkdGggaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IE1pY3Jvc29mdCBFZGdlIGFuZCBGVURHRSBpcyBvcHRpbWl6ZWQgZm9yIENocm9tZVxyXG5cclxuICAgICAgdGhpcy5wb2ludERhdGEgPSBbXTsgLy9SZXNldHRpbmcgdGhlIGRhdGEgdG8gYmUgZmlsbGVkIGFnYWluXHJcbiAgICAgIHRoaXMubGluZURhdGEgPSBbXTtcclxuICAgICAgdGhpcy50cmlEYXRhID0gW107XHJcblxyXG4gICAgICB0aGlzLm51bVBvaW50RGF0YSA9IDA7IC8vUmVzZXR0aW5nIHRoZSBhbW91bnQgb2YgZGF0YSBjYWxsc1xyXG4gICAgICB0aGlzLm51bUxpbmVEYXRhID0gMDtcclxuICAgICAgdGhpcy5udW1UcmlEYXRhID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWZ0ZXIgT2ltb1BoeXNpY3Mud29ybGQgZmlsbGVkIHRoZSBkZWJ1Zy4gUmVuZGVyaW5nIGNhbGxzLiBTZXR0aW5nIHRoaXMgcHJvZ3JhbSB0byBiZSB1c2VkIGJ5IHRoZSBGVURHRSByZW5kZXJpbmcgY29udGV4dC4gQW5kIGRyYXcgZWFjaCB1cGRhdGVkIGJ1ZmZlciBhbmQgcmVzZXR0aW5nIHRoZW0uICovXHJcbiAgICBwdWJsaWMgZHJhd0J1ZmZlcnMoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhZGVyLnVzZSgpO1xyXG4gICAgICBsZXQgcHJvamVjdGlvbjogRmxvYXQzMkFycmF5ID0gUGh5c2ljcy5tYWluQ2FtLm10eFdvcmxkVG9WaWV3LmdldCgpO1xyXG4gICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5zaGFkZXIuZ2V0VW5pZm9ybUxvY2F0aW9uKFwidV9tdHhNZXNoVG9WaWV3XCIpLCBmYWxzZSwgcHJvamVjdGlvbik7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMubnVtUG9pbnREYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMucG9pbnRJYm9EYXRhID0gW107ICAvL0J1ZmZlciBzaXplIG1hdGNoaW5nIHRvIHdoYXRzIG5lZWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVBvaW50RGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnBvaW50SWJvRGF0YS5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvaW50SUJPLnNldERhdGEodGhpcy5wb2ludElib0RhdGEpOyAvL1NldCBJbmRleCBidWZmZXIgdG8gY29ycmVjdCBzaXplXHJcbiAgICAgICAgdGhpcy5wb2ludFZCTy5zZXREYXRhKHRoaXMucG9pbnREYXRhKTsgLy9TZXQgVmVydGV4IEJ1ZmZlciB0byBjdXJyZW50IERhdGFcclxuICAgICAgICB0aGlzLnBvaW50VkJPLmJpbmRBdHRyaWJzKCk7XHJcbiAgICAgICAgdGhpcy5wb2ludElCTy5kcmF3KHRoaXMuZ2wuUE9JTlRTLCB0aGlzLm51bVBvaW50RGF0YSk7IC8vVGhlIGFjdHVhbCBkcmF3IGNhbGwgZm9yIGVhY2ggaW5kZXggaW4gaWJvXHJcbiAgICAgICAgdGhpcy5udW1Qb2ludERhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm51bUxpbmVEYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMubGluZUlib0RhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5udW1MaW5lRGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLmxpbmVJYm9EYXRhLnB1c2goaSAqIDIpO1xyXG4gICAgICAgICAgdGhpcy5saW5lSWJvRGF0YS5wdXNoKGkgKiAyICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZUlCTy5zZXREYXRhKHRoaXMubGluZUlib0RhdGEpO1xyXG4gICAgICAgIHRoaXMubGluZVZCTy5zZXREYXRhKHRoaXMubGluZURhdGEpO1xyXG4gICAgICAgIHRoaXMubGluZVZCTy5iaW5kQXR0cmlicygpO1xyXG4gICAgICAgIHRoaXMubGluZUlCTy5kcmF3KHRoaXMuZ2wuTElORVMsIHRoaXMubnVtTGluZURhdGEgKiAyKTtcclxuICAgICAgICB0aGlzLm51bUxpbmVEYXRhID0gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5udW1UcmlEYXRhID4gMCkge1xyXG4gICAgICAgIHRoaXMudHJpSWJvRGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVRyaURhdGE7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMpO1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMgKyAxKTtcclxuICAgICAgICAgIHRoaXMudHJpSWJvRGF0YS5wdXNoKGkgKiAzICsgMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJpSUJPLnNldERhdGEodGhpcy50cmlJYm9EYXRhKTtcclxuICAgICAgICB0aGlzLnRyaVZCTy5zZXREYXRhKHRoaXMudHJpRGF0YSk7XHJcbiAgICAgICAgdGhpcy50cmlWQk8uYmluZEF0dHJpYnMoKTtcclxuICAgICAgICB0aGlzLnRyaUlCTy5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLCB0aGlzLm51bVRyaURhdGEgKiAzKTtcclxuICAgICAgICB0aGlzLm51bVRyaURhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERyYXdpbmcgdGhlIHJheSBpbnRvIHRoZSBkZWJ1Z0RyYXcgQ2FsbC4gQnkgdXNpbmcgdGhlIG92ZXJ3cml0dGVuIGxpbmUgcmVuZGVyaW5nIGZ1bmN0aW9ucyBhbmQgZHJhd2luZyBhIHBvaW50IChwb2ludFNpemUgZGVmaW5lZCBpbiB0aGUgc2hhZGVyKSBhdCB0aGUgZW5kIG9mIHRoZSByYXkuICovXHJcbiAgICBwdWJsaWMgZGVidWdSYXkoX29yaWdpbjogVmVjdG9yMywgX2VuZDogVmVjdG9yMywgX2NvbG9yOiBDb2xvcik6IHZvaWQge1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcubGluZShuZXcgT0lNTy5WZWMzKF9vcmlnaW4ueCwgX29yaWdpbi55LCBfb3JpZ2luLnopLCBuZXcgT0lNTy5WZWMzKF9lbmQueCwgX2VuZC55LCBfZW5kLnopLCBuZXcgT0lNTy5WZWMzKF9jb2xvci5yLCBfY29sb3IuZywgX2NvbG9yLmIpKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3LnBvaW50KG5ldyBPSU1PLlZlYzMoX2VuZC54LCBfZW5kLnksIF9lbmQueiksIG5ldyBPSU1PLlZlYzMoX2NvbG9yLnIsIF9jb2xvci5nLCBfY29sb3IuYikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBPdmVycmlkaW5nIHRoZSBleGlzdGluZyBmdW5jdGlvbnMgZnJvbSBPaW1vUGh5c2ljcy5EZWJ1Z0RyYXcgd2l0aG91dCBhY3R1YWxseSBpbmhlcml0IGZyb20gdGhlIGNsYXNzLCB0byBhdm9pZCBjb21waWxlciBwcm9ibGVtcy4gXHJcbiAgICAgKiBPdmVycmlkaW5nIHRoZW0gdG8gcmVjZWl2ZSBkZWJ1Z0luZm9ybWF0aW9ucyBpbiB0aGUgZm9ybWF0IHRoZSBwaHlzaWMgZW5naW5lIHByb3ZpZGVzIHRoZW0gYnV0IGhhbmRsaW5nIHRoZSByZW5kZXJpbmcgaW4gdGhlIGZ1ZGdlIGNvbnRleHQuICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVPdmVycmlkZSgpOiB2b2lkIHtcclxuICAgICAgLy9PdmVycmlkZSBwb2ludC9saW5lL3RyaWFuZ2xlIGZ1bmN0aW9ucyBvZiBPaW1vUGh5c2ljcyB3aGljaCBhcmUgdXNlZCB0byBkcmF3IHdpcmVmcmFtZXMgb2Ygb2JqZWN0cywgbGluZXMgb2YgcmF5Y2FzdHMgb3IgdHJpYW5nbGVzIHdoZW4gdGhlIG9iamVjdHMgYXJlIHJlbmRlcmVkIGJ5IHRoZSBwaHlzaWNzIG5vdCBGVURHRSAodW51c2VkKVxyXG5cclxuICAgICAgT0lNTy5EZWJ1Z0RyYXcucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gKF92OiBPSU1PLlZlYzMsIF9jb2xvcjogT0lNTy5WZWMzKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGRlYnVnV3JhcHBlcjogUGh5c2ljc0RlYnVnRHJhdyA9IFBoeXNpY3MuZGVidWdEcmF3OyAvL0dldCB0aGUgY3VzdG9tIHBoeXNpY3MgZGVidWcgY2xhc3MgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGRhdGEuXHJcbiAgICAgICAgaWYgKFBoeXNpY3MubWFpbkNhbSAhPSBudWxsKSB7IC8vb25seSBhY3Qgd2hlbiB0aGVyZSBpcyBhIGNhbWVyYSB0aGF0IGlzIHJlbmRlcmluZ1xyXG4gICAgICAgICAgbGV0IGRhdGE6IEFycmF5PE51bWJlcj4gPSBkZWJ1Z1dyYXBwZXIucG9pbnREYXRhOyAvL2dldCB0aGUgYWxyZWFkeSB3cml0dGVuIGJ1ZmZlciBpbmZvcm1hdGlvbnNcclxuICAgICAgICAgIGRhdGEucHVzaChfdi54LCBfdi55LCBfdi56KTsgLy9Db29yZGluYXRlcyBvZiB0aGUgcG9pbnRcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTsgLy9Qb2ludCBOb3JtYWxzIC0gRW1wdHkgc2luY2UgaXQncyBub3QgYSBwb2x5Z29uXHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7IC8vQ29sb3Igb2YgdGhlIHBvaW50XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtUG9pbnREYXRhKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgT0lNTy5EZWJ1Z0RyYXcucHJvdG90eXBlLmxpbmUgPSBmdW5jdGlvbiAoX3YxOiBPSU1PLlZlYzMsIF92MjogT0lNTy5WZWMzLCBfY29sb3I6IE9JTU8uVmVjMyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkZWJ1Z1dyYXBwZXI6IFBoeXNpY3NEZWJ1Z0RyYXcgPSBQaHlzaWNzLmRlYnVnRHJhdztcclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBkYXRhOiBBcnJheTxudW1iZXI+ID0gZGVidWdXcmFwcGVyLmxpbmVEYXRhO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92MS54LCBfdjEueSwgX3YxLnopOyAvL1BvaW50IDEgQ29vcmRpbmF0ZXNcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTsgLy9QMSBOb3JtYWxzIC0gRW1wdHkgc2luY2UgaXQncyBub3QgYSBwb2x5Z29uXHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7IC8vUDEgQ29sb3JcclxuICAgICAgICAgIGRhdGEucHVzaChfdjIueCwgX3YyLnksIF92Mi56KTsgLy9Qb2ludCAyIENvb3JkaW5hdGVzXHJcbiAgICAgICAgICBkYXRhLnB1c2goMCwgMCwgMCk7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtTGluZURhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUudHJpYW5nbGUgPSBmdW5jdGlvbiAoX3YxOiBPSU1PLlZlYzMsIF92MjogT0lNTy5WZWMzLCBfdjM6IE9JTU8uVmVjMywgX24xOiBPSU1PLlZlYzMsIF9uMjogT0lNTy5WZWMzLCBfbjM6IE9JTU8uVmVjMywgX2NvbG9yOiBPSU1PLlZlYzMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZGVidWdXcmFwcGVyOiBQaHlzaWNzRGVidWdEcmF3ID0gUGh5c2ljcy5kZWJ1Z0RyYXc7XHJcbiAgICAgICAgaWYgKFBoeXNpY3MubWFpbkNhbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YTogQXJyYXk8bnVtYmVyPiA9IGRlYnVnV3JhcHBlci50cmlEYXRhO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92MS54LCBfdjEueSwgX3YxLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMS54LCBfbjEueSwgX24xLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92Mi54LCBfdjIueSwgX3YyLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMi54LCBfbjIueSwgX24yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92My54LCBfdjMueSwgX3YzLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9uMy54LCBfbjMueSwgX24zLnopO1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF9jb2xvci54LCBfY29sb3IueSwgX2NvbG9yLnopO1xyXG4gICAgICAgICAgZGVidWdXcmFwcGVyLm51bVRyaURhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzb3VyY2UgY29kZSAoc3RyaW5nKSBvZiB0aGUgaW4gcGh5c2ljc0RlYnVnIHVzZWQgdmVyeSBzaW1wbGUgdmVydGV4U2hhZGVyLlxyXG4gICAgICogIEhhbmRsaW5nIHRoZSBwcm9qZWN0aW9uICh3aGljaCBpbmNsdWRlcywgdmlldy93b3JsZFtpcyBhbHdheXMgaWRlbnRpdHkgaW4gdGhpcyBjYXNlXS9wcm9qZWN0aW9uIGluIEZVREdFKS4gSW5jcmVhc2luZyB0aGUgc2l6ZSBvZiBzaW5nbGUgcG9pbnRzIGRyYXduLlxyXG4gICAgICogIEFuZCB0cmFuc2ZlciBwb3NpdGlvbiBjb2xvciB0byB0aGUgZnJhZ21lbnRTaGFkZXIuICovXHJcbiAgICBwcml2YXRlIHZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYFxyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0YXR0cmlidXRlIHZlYzMgYVBvc2l0aW9uO1xyXG5cdFx0XHRhdHRyaWJ1dGUgdmVjMyBhQ29sb3I7XHJcblx0XHRcdGF0dHJpYnV0ZSB2ZWMzIGFOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG5cdFx0XHR1bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3O1xyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cdFx0XHRcdHZQb3NpdGlvbiA9IGFQb3NpdGlvbjtcclxuXHRcdFx0XHR2Q29sb3IgPSBhQ29sb3I7XHJcblx0XHRcdFx0dk5vcm1hbCA9IGFOb3JtYWw7XHJcblx0XHRcdFx0Z2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFQb3NpdGlvbiwxLjApO1xyXG5cdFx0XHRcdGdsX1BvaW50U2l6ZSA9IDYuMDtcclxuXHRcdFx0fWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBzb3VyY2UgY29kZSAoc3RyaW5nKSBvZiB0aGUgaW4gcGh5c2ljc0RlYnVnIHVzZWQgc3VwZXIgc2ltcGxlIGZyYWdtZW50U2hhZGVyLiBVbmxpdCAtIG9ubHkgY29sb3JpemluZyB0aGUgZHJhd24gcGl4ZWxzLCBub3JtYWxzL3Bvc2l0aW9uIGFyZSBnaXZlbiB0byBtYWtlIGl0IGV4cGFuZGFibGUgKi9cclxuICAgIHByaXZhdGUgZnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBcclxuICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQodkNvbG9yLCAxLjApO1xyXG5cdFx0XHR9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgb2YgdHJhbnNsYXRpb24gYW5kIHJvdGF0aW9uLiBUd28gRGVncmVlcyBvZiBGcmVlZG9tIGluIHRoZSBkZWZpbmVkIGF4aXMuXHJcbiAgICogVHdvIFJpZ2lkQm9kaWVzIG5lZWQgdG8gYmUgZGVmaW5lZCB0byB1c2UgaXQuIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgZm9yIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGlvbiwgYWxvbmcgd2l0aCBzcHJpbmcgc2V0dGluZ3MuXHJcbiAgICogXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIEpvaW50SG9sZGVyIC0gYm9keUFuY2hvclxyXG4gICAqICAgICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilJBcclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICogICAgICAgICAgIDzilIDilIDilIDilIDilIDilIDilIDilIDilIIgICDilILilIDilIDilIDilIDilIDilIA+IHRpZWQgYm9keSwgc2xpZGluZyBvbiBheGlzID0gMXN0IGRlZ3JlZSBvZiBmcmVlZG9tXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUgiAgICAgICAgcm90YXRpbmcgYXJvdW5kIGF4aXMgPSAybmQgZGVncmVlIG9mIGZyZWVkb20gXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxyXG4gICAqIGBgYCAgXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludEN5bGluZHJpY2FsIGV4dGVuZHMgSm9pbnRBeGlhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludEN5bGluZHJpY2FsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uQ3lsaW5kcmljYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uQ3lsaW5kcmljYWxKb2ludENvbmZpZyA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnRDb25maWcoKTtcclxuICAgIHByb3RlY3RlZCBtb3RvcjogT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcjtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1JvdGF0aW9uOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvckZvcmNlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvcjogbnVtYmVyID0gMzYwO1xyXG4gICAgI21pblJvdG9yOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI3JvdG9yOiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI3JvdG9yU3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBjeWxpbmRyaWNhbCBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBtb3Zpbmcgb24gb25lIGF4aXMgYW5kIHJvdGF0aW5nIGFyb3VuZCBhbm90aGVyIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5zcHJpbmdEYW1waW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3koX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIuc3ByaW5nRnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuIEluZmx1ZW5jaW5nIFRPUlFVRSAvIFJPVEFUSU9OXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nUm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ1JvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdSb3RhdGlvbiA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsU3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIEluZmx1ZW5jaW5nIFRPUlFVRSAvIFJPVEFUSU9OXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5Um90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhSb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heFJvdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Sb3RvcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pblJvdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgcm90YXRpb25hbCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RvclNwZWVkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclNwZWVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3JvdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWF4TW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWF4TW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLmxvd2VyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciBmb3JjZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvckZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvckZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvckZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5tb3RvckZvcmNlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLiNnZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyb3RvclNwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uLCB0aGlzLnNwcmluZ0RhbXBpbmdSb3RhdGlvbik7XHJcblxyXG4gICAgICB0aGlzLm1vdG9yID0gbmV3IE9JTU8uVHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHMoc3VwZXIubWluTW90b3IsIHN1cGVyLm1heE1vdG9yKTtcclxuICAgICAgdGhpcy5tb3Rvci5zZXRNb3RvcihzdXBlci5tb3RvclNwZWVkLCB0aGlzLm1vdG9yRm9yY2UpO1xyXG4gICAgICB0aGlzLiNyb3RvciA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluUm90b3IgKiBDYWxjLmRlZzJyYWQsIHRoaXMubWF4Um90b3IgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNyb3Rvci5zZXRNb3Rvcih0aGlzLnJvdG9yU3BlZWQsIHRoaXMucm90b3JUb3JxdWUpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5DeWxpbmRyaWNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy50cmFuc2xhdGlvbmFsU3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yID0gdGhpcy5tb3RvcjtcclxuICAgICAgdGhpcy5jb25maWcucm90YXRpb25hbExpbWl0TW90b3IgPSB0aGlzLiNyb3RvcjtcclxuICAgICAgdGhpcy5jb25maWcucm90YXRpb25hbFNwcmluZ0RhbXBlciA9IHRoaXMuI3JvdG9yU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIG1vdG9yRm9yY2U6IHRoaXMubW90b3JGb3JjZSxcclxuICAgICAgICBzcHJpbmdEYW1waW5nUm90YXRpb246IHRoaXMuc3ByaW5nRGFtcGluZ1JvdGF0aW9uLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uOiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uLFxyXG4gICAgICAgIG1heFJvdG9yOiB0aGlzLm1heFJvdG9yLFxyXG4gICAgICAgIG1pblJvdG9yOiB0aGlzLm1pblJvdG9yLFxyXG4gICAgICAgIHJvdG9yVG9ycXVlOiB0aGlzLnJvdG9yVG9ycXVlLFxyXG4gICAgICAgIHJvdG9yU3BlZWQ6IHRoaXMucm90b3JTcGVlZFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcIm1vdG9yRm9yY2VcIiwgXCJyb3RvclRvcnF1ZVwiLCBcInJvdG9yU3BlZWRcIiwgXCJtYXhSb3RvclwiLCBcIm1pblJvdG9yXCIsIFwic3ByaW5nRGFtcGluZ1JvdGF0aW9uXCIsIFwic3ByaW5nRnJlcXVlbmN5Um90YXRpb25cIiwgXCJzcHJpbmdGcmVxdWVuY3lcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMgd2l0aCBhIGRlZmluZWQgYXhlIG1vdmVtZW50LlxyXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSBzbGlkaW5nIGpvaW50IGFsb25nIG9uZSBheGlzLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC5cclxuICAgICAqIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgdG8gbW92ZSB0aGUgY29ubmVjdGVkIGFsb25nIHRoZSBkZWZpbmVkIGF4aXMuIEdyZWF0IHRvIGNvbnN0cnVjdCBzdGFuZGFyZCBzcHJpbmdzIG9yIHBoeXNpY2FsIHNsaWRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIGBgYHRleHRcclxuICAgICAqICAgICAgICAgIEpvaW50SG9sZGVyIC0gYm9keUFuY2hvclxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUglxyXG4gICAgICogICAgICAgICAgIDzilIDilIDilIDilIDilIDilIDilIDilIDilIIgICDilILilIDilIDilIDilIDilIDilIA+IHRpZWQgYm9keSwgc2xpZGluZyBvbiBvbmUgQXhpcywgMSBEZWdyZWUgb2YgRnJlZWRvbVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUgiAgIOKUglxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxyXG4gICAgICogYGBgXHJcbiAgICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRQcmlzbWF0aWMgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UHJpc21hdGljKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUHJpc21hdGljSm9pbnQ7XHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBPSU1PLlByaXNtYXRpY0pvaW50Q29uZmlnID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcoKTtcclxuICAgIHByb3RlY3RlZCBtb3RvcjogT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcjtcclxuICAgIC8vSW50ZXJuYWxseSB1c2VkIHZhcmlhYmxlcyAtIEpvaW50IFByb3BlcnRpZXMgdGhhdCBhcmUgdXNlZCBldmVuIHdoZW4gbm8gYWN0dWFsIGpvaW50IGlzIGN1cnJlbnRseSBleGlzdGVudFxyXG5cclxuICAgICNtb3RvckZvcmNlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIHByaXNtYXRpYyBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBvbmx5IG1vdmluZyBvbiBvbmUgYXhpcyBib3VuZCBvbiBhIGxvY2FsIGFuY2hvcnBvaW50LiAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQsIF9heGlzLCBfbG9jYWxBbmNob3IpO1xyXG5cclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDEwO1xyXG4gICAgICB0aGlzLm1pbk1vdG9yID0gLTEwO1xyXG4gICAgfVxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFRoaXMgaXMgdGhlIGZvcmNlIHRoYXQgdGhlIG1vdG9yIGlzIHVzaW5nIHRvIGhvbGQgdGhlIHBvc2l0aW9uLCBvciByZWFjaCBpdCBpZiBhIG1vdG9yU3BlZWQgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvckZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvckZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvckZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLm1vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG1vdG9yRm9yY2U6IHRoaXMubW90b3JGb3JjZSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubW90b3JGb3JjZSA9IF9zZXJpYWxpemF0aW9uLm1vdG9yRm9yY2U7XHJcbiAgICAgIHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLm1vdG9yRm9yY2UgPSB0aGlzLm1vdG9yRm9yY2U7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tb3RvckZvcmNlKSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLm1vdG9yRm9yY2UgPSBfbXV0YXRvci5tb3RvckZvcmNlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3JGb3JjZTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqIEFjdHVhbCBjcmVhdGlvbiBvZiBhIGpvaW50IGluIHRoZSBPaW1vUGh5c2ljcyBzeXN0ZW0gKi9cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tb3RvciA9IG5ldyBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluTW90b3IsIHRoaXMubWF4TW90b3IpOyAvL0NyZWF0ZSBtb3RvciBzZXR0aW5ncywgdG8gaG9sZCBwb3NpdGlvbnMsIHNldCBjb25zdHJhaW50IG1pbi9tYXhcclxuICAgICAgdGhpcy5tb3Rvci5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWQsIHRoaXMubW90b3JGb3JjZSk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlByaXNtYXRpY0pvaW50Q29uZmlnKCk7IC8vQ3JlYXRlIGEgc3BlY2lmaWMgY29uZmlnIGZvciB0aGlzIGpvaW50IHR5cGUgdGhhdCBpcyBjYWxjdWxhdGluZyB0aGUgbG9jYWwgYXhpcyBmb3IgYm90aCBib2RpZXNcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQoKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLnNwcmluZ0RhbXBlciA9IHRoaXMuc3ByaW5nRGFtcGVyOyAvL1RlbGxpbmcgdGhlIGNvbmZpZyB0byB1c2UgdGhlIG1vdG9yL3NwcmluZyBvZiB0aGUgRlVER0UgQ29tcG9uZW50XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IgPSB0aGlzLm1vdG9yO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLlByaXNtYXRpY0pvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgdGhpcy5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzLCBkZXNpZ25lZCB0byBzaW11bGF0ZSBiZWhhdmlvdXIgd2l0aGluIGEgcmVhbCBib2R5LiBJdCBoYXMgdHdvIGF4aXMsIGEgc3dpbmcgYW5kIHR3aXN0IGF4aXMsIGFuZCBhbHNvIHRoZSBwZXJwZW5kaWN1bGFyIGF4aXMsIFxyXG4gICAgKiBzaW1pbGFyIHRvIGEgU3BoZXJpY2FsIGpvaW50LCBidXQgbW9yZSByZXN0cmljdGl2ZSBpbiBpdCdzIGFuZ2xlcyBhbmQgb25seSB0d28gZGVncmVlcyBvZiBmcmVlZG9tLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gTW9zdGx5IHVzZWQgdG8gY3JlYXRlIGh1bWFubGlrZSBqb2ludHMgdGhhdCBiZWhhdmUgbGlrZSBhIFxyXG4gICAgKiBsaWZlbGVzcyBib2R5LlxyXG4gICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIC0gaXQgY2FuIHR3aXN0IG9uIG9uZSBheGlzIGFuZCBzd2luZyBvbiBhbm90aGVyXHJcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAgKiAgICAgICAgIHogICAgICAgICAgICDilIzilIDilIDilIDilJAg4pSCIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAgKiAgICAgICAgIOKGkSAgICAgICAgICAgIOKUgiAgIOKUgiDihpMg4pSCICAg4pSCICAgICAgICBlLmcuIHogPSBUd2lzdEF4aXMsIGl0IGNhbiByb3RhdGUgaW4taXRzZWxmIGFyb3VuZCB0aGlzIGF4aXMgXHJcbiAgICAqICAgIC14IOKGkOKUgOKUvOKUgOKGkiB4ICAgICAgICDilIIgICDilIIgeCDilIIgICDilIIgICAgICAgIGUuZy4geCA9IFN3aW5nQXhpcywgaXQgY2FuIHJvdGF0ZSBhbmNob3JlZCBhcm91bmQgdGhlIGJhc2Ugb24gdGhpcyBheGlzICAgXHJcbiAgICAqICAgICAgICAg4oaTICAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICAgICAgICBcclxuICAgICogICAgICAgIC16ICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSYICAgICAgICAgZS5nLiB5b3UgY2FuIHR3aXN0IHRoZSBsZWcgaW4taXRzZWxmIHRvIGEgY2VydGFpbiBkZWdyZWUsXHJcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgYWxzbyByb3RhdGUgaXQgZm9yd2FyZC9iYWNrd2FyZC9sZWZ0L3JpZ2h0IHRvIGEgY2VydGFpbiBkZWdyZWVcclxuICAgICogICAgICAgICAgICAgICAgYm9keUFuY2hvciAgICAgICAgICBib2R5VGllZFxyXG4gICAgKiAgICAgICAgICAgICAgKGUuZy4gcGVsdmlzKSAgICAgICAgIChlLmcuIHVwcGVyLWxlZylcclxuICAgICogXHJcbiAgICAqIGBgYFxyXG4gICAgKiBUd2lzdCBlcXVhbHMgYSByb3RhdGlvbiBhcm91bmQgYSBwb2ludCB3aXRob3V0IG1vdmluZyBvbiBhbiBheGlzLlxyXG4gICAgKiBTd2luZyBlcXVhbHMgYSByb3RhdGlvbiBvbiBhIHBvaW50IHdpdGggYSBtb3ZpbmcgbG9jYWwgYXhpcy5cclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50UmFnZG9sbCBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UmFnZG9sbCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLlJhZ2RvbGxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdUd2lzdDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lUd2lzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1N3aW5nOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVN3aW5nOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhNb3RvclR3aXN0OiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluTW90b3JUd2lzdDogbnVtYmVyID0gMDtcclxuICAgICNtb3RvclRvcnF1ZVR3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21vdG9yU3BlZWRUd2lzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbW90b3JUd2lzdDogT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcjtcclxuICAgICNzcHJpbmdEYW1wZXJUd2lzdDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjc3ByaW5nRGFtcGVyU3dpbmc6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG4gICAgI2F4aXNGaXJzdDogT0lNTy5WZWMzO1xyXG4gICAgI2F4aXNTZWNvbmQ6IE9JTU8uVmVjMztcclxuXHJcbiAgICAjbWF4QW5nbGVGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNtYXhBbmdsZVNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXNGaXJzdDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDEsIDAsIDApLCBfYXhpc1NlY29uZDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDEpLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkKTtcclxuICAgICAgdGhpcy5heGlzRmlyc3QgPSBfYXhpc0ZpcnN0O1xyXG4gICAgICB0aGlzLmF4aXNTZWNvbmQgPSBfYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy5hbmNob3IgPSBfbG9jYWxBbmNob3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgICogIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXhpc0ZpcnN0KCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpc0ZpcnN0LngsIHRoaXMuI2F4aXNGaXJzdC55LCB0aGlzLiNheGlzRmlyc3Queik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXNGaXJzdChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc0ZpcnN0ID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNTZWNvbmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzU2Vjb25kLngsIHRoaXMuI2F4aXNTZWNvbmQueSwgdGhpcy4jYXhpc1NlY29uZC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc1NlY29uZChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc1NlY29uZCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSBhbmdsZSBvZiByb3RhdGlvbiBhbG9uZyB0aGUgZmlyc3QgYXhpcy4gVmFsdWUgbmVlZHMgdG8gYmUgcG9zaXRpdmUuIENoYW5nZXMgZG8gcmVidWlsZCB0aGUgam9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhBbmdsZUZpcnN0QXhpcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4QW5nbGVGaXJzdCAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4QW5nbGVGaXJzdEF4aXMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4QW5nbGVGaXJzdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIGFuZ2xlIG9mIHJvdGF0aW9uIGFsb25nIHRoZSBzZWNvbmQgYXhpcy4gVmFsdWUgbmVlZHMgdG8gYmUgcG9zaXRpdmUuIENoYW5nZXMgZG8gcmVidWlsZCB0aGUgam9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhBbmdsZVNlY29uZEF4aXMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heEFuZ2xlU2Vjb25kICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhBbmdsZVNlY29uZEF4aXMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4QW5nbGVTZWNvbmQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ1R3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1R3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5VHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZ1N3aW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nU3dpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdTd2luZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nU3dpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3dpbmdTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lTd2luZygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5U3dpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVN3aW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVN3aW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFN3aW5nU3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhNb3RvclR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhNb3RvclR3aXN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhNb3RvclR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuI21heE1vdG9yVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Nb3RvclR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Nb3RvclR3aXN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtaW5Nb3RvclR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIHRoaXMuI21pbk1vdG9yVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JTcGVlZFR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclNwZWVkVHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yU3BlZWRUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclNwZWVkVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JUb3JxdWVUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbW90b3JUb3JxdWVUd2lzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JUb3JxdWVUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclRvcnF1ZVR3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0TGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzRmlyc3QgPSB0aGlzLmF4aXNGaXJzdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXhpc0ZpcnN0LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNGaXJzdCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXhpc1NlY29uZC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc0ZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmF4aXNGaXJzdCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzRmlyc3QpKSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXNTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc1NlY29uZCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzU2Vjb25kKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc0ZpcnN0O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBlclR3aXN0ID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5VHdpc3QsIHRoaXMuc3ByaW5nRGFtcGluZ1R3aXN0KTtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyU3dpbmcgPSBuZXcgT0lNTy5TcHJpbmdEYW1wZXIoKS5zZXRTcHJpbmcodGhpcy5zcHJpbmdGcmVxdWVuY3lTd2luZywgdGhpcy5zcHJpbmdEYW1waW5nU3dpbmcpO1xyXG5cclxuICAgICAgdGhpcy4jbW90b3JUd2lzdCA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMubWluTW90b3JUd2lzdCwgdGhpcy5tYXhNb3RvclR3aXN0KTtcclxuICAgICAgdGhpcy4jbW90b3JUd2lzdC5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWRUd2lzdCwgdGhpcy5tb3RvclRvcnF1ZVR3aXN0KTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuYXhpc0ZpcnN0LCB0aGlzLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zd2luZ1NwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlclN3aW5nO1xyXG4gICAgICB0aGlzLmNvbmZpZy50d2lzdFNwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlclR3aXN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy50d2lzdExpbWl0TW90b3IgPSB0aGlzLiNtb3RvclR3aXN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5tYXhTd2luZ0FuZ2xlMSA9IHRoaXMuI21heEFuZ2xlRmlyc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLm1heFN3aW5nQW5nbGUyID0gdGhpcy4jbWF4QW5nbGVTZWNvbmQ7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uUmFnZG9sbEpvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgc3VwZXIuY29uZmlndXJlSm9pbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbWF4QW5nbGVGaXJzdDogdGhpcy4jbWF4QW5nbGVGaXJzdCxcclxuICAgICAgICBtYXhBbmdsZVNlY29uZDogdGhpcy4jbWF4QW5nbGVTZWNvbmQsXHJcbiAgICAgICAgc3ByaW5nRGFtcGluZ1R3aXN0OiB0aGlzLnNwcmluZ0RhbXBpbmdUd2lzdCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lUd2lzdDogdGhpcy5zcHJpbmdGcmVxdWVuY3lUd2lzdCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nU3dpbmc6IHRoaXMuc3ByaW5nRGFtcGluZ1N3aW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVN3aW5nOiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVN3aW5nLFxyXG4gICAgICAgIG1heE1vdG9yVHdpc3Q6IHRoaXMuI21heE1vdG9yVHdpc3QsXHJcbiAgICAgICAgbWluTW90b3JUd2lzdDogdGhpcy4jbWluTW90b3JUd2lzdCxcclxuICAgICAgICBtb3RvclNwZWVkVHdpc3Q6IHRoaXMubW90b3JTcGVlZFR3aXN0LFxyXG4gICAgICAgIG1vdG9yVG9ycXVlVHdpc3Q6IHRoaXMubW90b3JUb3JxdWVUd2lzdFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tYXhBbmdsZUZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLiNtYXhBbmdsZUZpcnN0ID0gX211dGF0b3IubWF4QW5nbGVGaXJzdDtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IubWF4QW5nbGVTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuI21heEFuZ2xlU2Vjb25kID0gX211dGF0b3IubWF4QW5nbGVTZWNvbmQ7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1xyXG4gICAgICAgIFwic3ByaW5nRGFtcGluZ1R3aXN0XCIsIFwic3ByaW5nRnJlcXVlbmN5VHdpc3RcIiwgXCJzcHJpbmdEYW1waW5nU3dpbmdcIiwgXCJzcHJpbmdGcmVxdWVuY3lTd2luZ1wiLCBcIm1heE1vdG9yVHdpc3RcIiwgXCJtaW5Nb3RvclR3aXN0XCIsIFwibW90b3JTcGVlZFR3aXN0XCIsIFwibW90b3JUb3JxdWVUd2lzdFwiXHJcbiAgICAgIF0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMgd2l0aCBhIGRlZmluZWQgYXhlIG9mIHJvdGF0aW9uLiBBbHNvIGtub3duIGFzIEhJTkdFIGpvaW50LlxyXG4gICAgICogVHdvIFJpZ2lkQm9kaWVzIG5lZWQgdG8gYmUgZGVmaW5lZCB0byB1c2UgaXQuIEEgbW90b3IgY2FuIGJlIGRlZmluZWQgdG8gcm90YXRlIHRoZSBjb25uZWN0ZWQgYWxvbmcgdGhlIGRlZmluZWQgYXhpcy5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dCAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uIGF4aXMsIDFzdCBEZWdyZWUgb2YgZnJlZWRvbVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgIOKGkVxyXG4gICAgICogICAgICAgICAgICAgICDilIzilIDilIDilIDilJDilILilIzilIDilIDilIDilIDilJAgICAgIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCICBcclxuICAgICAqICAgICAgICAgICAgICAg4pSCICAg4pSC4pSC4pSCICAgIOKUgiBcclxuICAgICAqICAgICAgICAgICAgICAg4pSCICAg4pSC4pSC4pSCICAgIOKUgiBcclxuICAgICAqICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSY4pSC4pSU4pSA4pSA4pSA4pSA4pSYXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAgXHJcbiAgICAgKiAgICAgIGJvZHlBbmNob3IgICAgICAgICBib2R5VGllZFxyXG4gICAgICogICAoZS5nLiBEb29yaGluZ2UpICAgICAgIChlLmcuIERvb3IpXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFJldm9sdXRlIGV4dGVuZHMgSm9pbnRBeGlhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludFJldm9sdXRlKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUmV2b2x1dGVKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZyA9IG5ldyBPSU1PLlJldm9sdXRlSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjbW90b3JUb3JxdWU6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3I6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMSwgMCksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQsIF9heGlzLCBfbG9jYWxBbmNob3IpO1xyXG5cclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDM2MDtcclxuICAgICAgdGhpcy5taW5Nb3RvciA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1heE1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICBfdmFsdWUgKj0gQ2FsYy5kZWcycmFkO1xyXG4gICAgICBpZiAodGhpcy5qb2ludClcclxuICAgICAgICB0aGlzLmpvaW50LmdldExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLm1pbk1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludClcclxuICAgICAgICB0aGlzLmpvaW50LmdldExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclRvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBtb3RvclRvcnF1ZTogdGhpcy5tb3RvclRvcnF1ZSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubW90b3JUb3JxdWUgPSBfc2VyaWFsaXphdGlvbi5tb3RvclRvcnF1ZTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3IubW90b3JUb3JxdWUgPSB0aGlzLm1vdG9yVG9ycXVlO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IubW90b3JUb3JxdWUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMubW90b3JUb3JxdWUgPSBfbXV0YXRvci5tb3RvclRvcnF1ZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1vdG9yVG9ycXVlO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JvdG9yID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHMoc3VwZXIubWluTW90b3IgKiBDYWxjLmRlZzJyYWQsIHN1cGVyLm1heE1vdG9yICogQ2FsYy5kZWcycmFkKTtcclxuICAgICAgdGhpcy4jcm90b3Iuc2V0TW90b3IodGhpcy5tb3RvclNwZWVkLCB0aGlzLm1vdG9yVG9ycXVlKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZygpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IgPSB0aGlzLiNyb3RvcjtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5SZXZvbHV0ZUpvaW50KHRoaXMuY29uZmlnKTtcclxuICAgICAgdGhpcy5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIHRocmVlIERlZ3JlZXMgb2YgRnJlZWRvbSwgYWxzbyBrbm93biBhcyBiYWxsIGFuZCBzb2NrZXQgam9pbnQuIFR3byBib2RpZXMgY29ubmVjdGVkIGF0IHRoZWlyIGFuY2hvciBidXQgZnJlZSB0byByb3RhdGUuXHJcbiAgICAgKiBVc2VkIGZvciB0aGluZ3MgbGlrZSB0aGUgY29ubmVjdGlvbiBvZiBib25lcyBpbiB0aGUgaHVtYW4gc2hvdWxkZXIgKGlmIHNpbXBsaWZpZWQsIGVsc2UgYmV0dGVyIHVzZSBKb2ludFJhZ2RvbGwpLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gT25seSBzcHJpbmcgc2V0dGluZ3MgY2FuIGJlIGRlZmluZWQuXHJcbiAgICAgKiAzIERlZ3JlZXMgYXJlIHN3aW5nIGhvcml6b250YWwsIHN3aW5nIHZlcnRpY2FsIGFuZCB0d2lzdC5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICogICAgICAgICAgICAgIEpvaW50SG9sZGVyXHJcbiAgICAgKiAgICAgICAgIHogICAgICBib2R5QW5jaG9yIChlLmcuIEh1bWFuLVNob3VsZGVyKSAgICAgXHJcbiAgICAgKiAgICAgIHkgIOKGkSAgICAgICAgICBcclxuICAgICAqICAgICAgICBcXHwgICAgICAgICAg4pSA4pSA4pSAKOKXj+KUgOKUgOKUgFxyXG4gICAgICogIC14IDwtLS18LS0tPiB4ICAgICAgICAgICBib2R5VGllZCAgICAgICAgXHJcbiAgICAgKiAgICAgICAgIHxcXCAgICAgICAgICAgICAgICAoZS5nLiBVcHBlci1Bcm0pIFxyXG4gICAgICogICAgICAgICDihpMgLXkgICAgICAgXHJcbiAgICAgKiAgICAgICAgLXogICAgICAgICAgXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFNwaGVyaWNhbCBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50U3BoZXJpY2FsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uU3BoZXJpY2FsSm9pbnQ7XHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBPSU1PLlNwaGVyaWNhbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uU3BoZXJpY2FsSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZzogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3k6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gbmV3IFZlY3RvcjMoX2xvY2FsQW5jaG9yLngsIF9sb2NhbEFuY2hvci55LCBfbG9jYWxBbmNob3Iueik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdHJhbnNmb3Igb2YgZnVkZ2UgcHJvcGVydGllcyB0byB0aGUgcGh5c2ljcyBlbmdpbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3koX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgc3ByaW5nRGFtcGluZzogdGhpcy5zcHJpbmdEYW1waW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeTogdGhpcy5zcHJpbmdGcmVxdWVuY3ksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLnNwcmluZ0RhbXBpbmcgPSBfc2VyaWFsaXphdGlvbi5zcHJpbmdEYW1waW5nO1xyXG4gICAgICB0aGlzLnNwcmluZ0ZyZXF1ZW5jeSA9IF9zZXJpYWxpemF0aW9uLnNwcmluZ0ZyZXF1ZW5jeTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3Iuc3ByaW5nRGFtcGluZyA9IHRoaXMuc3ByaW5nRGFtcGluZztcclxuICAgICAgbXV0YXRvci5zcHJpbmdGcmVxdWVuY3kgPSB0aGlzLnNwcmluZ0ZyZXF1ZW5jeTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wic3ByaW5nRGFtcGluZ1wiLCBcInNwcmluZ0ZyZXF1ZW5jeVwiXSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdEYW1waW5nO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBlciA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeSwgdGhpcy5zcHJpbmdEYW1waW5nKTtcclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludENvbmZpZygpO1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIgPSB0aGlzLiNzcHJpbmdEYW1wZXI7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uU3BoZXJpY2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIHR3byBkZWZpbmVkIGF4aXMgKG5vcm1hbGx5IGUuZy4gKDAsMCwxKSBhbmQgcm90YXRpb24oMSwwLDApKSwgdGhleSBzaGFyZSB0aGUgc2FtZSBhbmNob3IgYW5kIGhhdmUgZnJlZSByb3RhdGlvbiwgYnV0IHRyYW5zZmVyIHRoZSB0d2lzdC5cclxuICAgICAqIEluIHJlYWxpdHkgdXNlZCBpbiBjYXJzIHRvIHRyYW5zZmVyIHRoZSBtb3JlIHN0YWJsZSBzdGF0aW9uYXJ5IGZvcmNlIG9uIHRoZSB2ZWxvY2l0eSBheGlzIHRvIHRoZSBidW1waW5nLCBkYW1wZWQgbW92aW5nIHdoZWVsLiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC5cclxuICAgICAqIFRoZSB0d28gbW90b3JzIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgdHdvIHJvdGF0aW9uIGF4aXMsIGFsb25nIHdpdGggc3ByaW5ncy4gXHJcbiAgICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgLSB0d2lzdCBpcyB0cmFuc2ZlcmVkIGJldHdlZW4gYm9kaWVzXHJcbiAgICAgKiAgICAgICAgIHogICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogICAgICAgICDihpEgICAgICAgICAgICAtLS0tLSAgfCAgLS0tLS0tLS0tLS0tXHJcbiAgICAgKiAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwg4oaTIHwgICAgICAgICAgICB8IFxyXG4gICAgICogIC14IDwtLS18LS0tPiB4ICAgICB8ICAgICB8IHggfCAgICAgICAgICAgIHwgICAgICAgICAgIGUuZy4gd2hlZWwgY2FuIHN0aWxsIHR1cm4gdXAvZG93biwgXHJcbiAgICAgKiAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgbGVmdCByaWdodCBidXQgdHJhbnNmZXJpbmcgaXQncyByb3RhdGlvbiBvbiB0byB0aGUgd2hlZWwtYXhpcy5cclxuICAgICAqICAgICAgICAg4oaTICAgICAgICAgICAgLS0tLS0gICAgIC0tLS0tLS0tLS0tLVxyXG4gICAgICogICAgICAgIC16ICAgIFxyXG4gICAgICogICAgICAgICAgICAgICAgIGF0dGFjaGVkUkIgICAgICAgICAgY29ubmVjdGVkUkJcclxuICAgICAqICAgICAgICAgICAgICAgIChlLmcuIHdoZWVsKSAgICAgICAoZS5nLiB3aGVlbC1heGlzKVxyXG4gICAgICogYGBgXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50VW5pdmVyc2FsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRVbml2ZXJzYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5Vbml2ZXJzYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uVW5pdmVyc2FsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5Vbml2ZXJzYWxKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nRmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5Rmlyc3Q6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdTZWNvbmQ6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5U2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvckZpcnN0OiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluUm90b3JGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclRvcnF1ZUZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWRGaXJzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjbWF4Um90b3JTZWNvbmQ6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Sb3RvclNlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclRvcnF1ZVNlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNyb3RvclNwZWVkU2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvckZpcnN0OiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI21vdG9yU2Vjb25kOiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI2F4aXNTcHJpbmdEYW1wZXJGaXJzdDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc1NwcmluZ0RhbXBlclNlY29uZDogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc0ZpcnN0OiBPSU1PLlZlYzM7XHJcbiAgICAjYXhpc1NlY29uZDogT0lNTy5WZWMzO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpc0ZpcnN0OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMSwgMCwgMCksIF9heGlzU2Vjb25kOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMSksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IF9heGlzRmlyc3Q7XHJcbiAgICAgIHRoaXMuYXhpc1NlY29uZCA9IF9heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzRmlyc3QoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzRmlyc3QueCwgdGhpcy4jYXhpc0ZpcnN0LnksIHRoaXMuI2F4aXNGaXJzdC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc0ZpcnN0KF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzRmlyc3QgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICogIFdoZW4gY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbiB0aGUgam9pbnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzU2Vjb25kKCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy4jYXhpc1NlY29uZC54LCB0aGlzLiNheGlzU2Vjb25kLnksIHRoaXMuI2F4aXNTZWNvbmQueik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGF4aXNTZWNvbmQoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXNTZWNvbmQgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ0ZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIxKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5Rmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIxKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyMigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdGcmVxdWVuY3lTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heFJvdG9yRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3JGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLnVwcGVyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pblJvdG9yRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pblJvdG9yRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluUm90b3JGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWRGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcm90b3JTcGVlZEZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclNwZWVkRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZEZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIHRvcnF1ZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RvclRvcnF1ZUZpcnN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZUZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3JvdG9yVG9ycXVlRmlyc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjEoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzLUFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYXhSb3RvclNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3JTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heFJvdG9yU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heFJvdG9yU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWluUm90b3JTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pblJvdG9yU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtaW5Sb3RvclNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtaW5Sb3RvclNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWRTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yU3BlZWRTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWRTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZFNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclRvcnF1ZVNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JUb3JxdWVTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWVTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjIoKS5tb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBJZiB0aGUgdHdvIGNvbm5lY3RlZCBSaWdpZEJvZGllcyBjb2xsaWRlIHdpdGggZWF0aCBvdGhlci4gKERlZmF1bHQgPSBmYWxzZSlcclxuICAgICAqL1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLiNnZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uZmlyc3RBeGlzID0gdGhpcy5heGlzRmlyc3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2Vjb25kQXhpcyA9IHRoaXMuYXhpc1NlY29uZC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpc0ZpcnN0KTtcclxuICAgICAgdGhpcy5heGlzU2Vjb25kID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc0ZpcnN0KSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmF4aXNGaXJzdCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzRmlyc3QpKSk7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLmF4aXNTZWNvbmQpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc1NlY29uZCA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5heGlzU2Vjb25kKSkpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc0ZpcnN0O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuYXhpc1NlY29uZDtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5heGlzU2Vjb25kID0gdGhpcy5heGlzU2Vjb25kLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJGaXJzdCA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCwgdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0KTtcclxuICAgICAgdGhpcy4jYXhpc1NwcmluZ0RhbXBlclNlY29uZCA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQsIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQpO1xyXG5cclxuICAgICAgdGhpcy4jbW90b3JGaXJzdCA9IG5ldyBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yKCkuc2V0TGltaXRzKHRoaXMuI21pblJvdG9yRmlyc3QgKiBDYWxjLmRlZzJyYWQsIHRoaXMuI21heFJvdG9yRmlyc3QgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNtb3RvckZpcnN0LnNldE1vdG9yKHRoaXMuI3JvdG9yU3BlZWRGaXJzdCwgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCk7XHJcbiAgICAgIHRoaXMuI21vdG9yU2Vjb25kID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy4jbWluUm90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCwgdGhpcy4jbWF4Um90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI21vdG9yU2Vjb25kLnNldE1vdG9yKHRoaXMuI3JvdG9yU3BlZWRGaXJzdCwgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlVuaXZlcnNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuI2F4aXNGaXJzdCwgdGhpcy4jYXhpc1NlY29uZCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0TW90b3IxID0gdGhpcy4jbW90b3JGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvcjIgPSB0aGlzLiNtb3RvclNlY29uZDtcclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyMSA9IHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyMiA9IHRoaXMuI2F4aXNTcHJpbmdEYW1wZXJTZWNvbmQ7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uVW5pdmVyc2FsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nRmlyc3Q6IHRoaXMuI3NwcmluZ0RhbXBpbmdGaXJzdCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lGaXJzdDogdGhpcy4jc3ByaW5nRnJlcXVlbmN5Rmlyc3QsXHJcbiAgICAgICAgc3ByaW5nRGFtcGluZ1NlY29uZDogdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCxcclxuICAgICAgICBzcHJpbmdGcmVxdWVuY3lTZWNvbmQ6IHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVNlY29uZCxcclxuICAgICAgICBtYXhSb3RvckZpcnN0OiB0aGlzLiNtYXhSb3RvckZpcnN0LFxyXG4gICAgICAgIG1pblJvdG9yRmlyc3Q6IHRoaXMuI21pblJvdG9yRmlyc3QsXHJcbiAgICAgICAgcm90b3JTcGVlZEZpcnN0OiB0aGlzLiNyb3RvclNwZWVkRmlyc3QsXHJcbiAgICAgICAgcm90b3JUb3JxdWVGaXJzdDogdGhpcy4jcm90b3JUb3JxdWVGaXJzdCxcclxuICAgICAgICBtYXhSb3RvclNlY29uZDogdGhpcy4jbWF4Um90b3JTZWNvbmQsXHJcbiAgICAgICAgbWluUm90b3JTZWNvbmQ6IHRoaXMuI21pblJvdG9yU2Vjb25kLFxyXG4gICAgICAgIHJvdG9yU3BlZWRTZWNvbmQ6IHRoaXMuI3JvdG9yU3BlZWRTZWNvbmQsXHJcbiAgICAgICAgcm90b3JUb3JxdWVTZWNvbmQ6IHRoaXMuI3JvdG9yVG9ycXVlU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1xyXG4gICAgICAgIFwic3ByaW5nRGFtcGluZ0ZpcnN0XCIsIFwic3ByaW5nRnJlcXVlbmN5Rmlyc3RcIiwgXCJzcHJpbmdEYW1waW5nU2Vjb25kXCIsIFwic3ByaW5nRnJlcXVlbmN5U2Vjb25kXCIsXHJcbiAgICAgICAgXCJtYXhSb3RvckZpcnN0XCIsIFwibWluUm90b3JGaXJzdFwiLCBcInJvdG9yU3BlZWRGaXJzdFwiLCBcInJvdG9yVG9ycXVlRmlyc3RcIixcclxuICAgICAgICBcIm1heFJvdG9yU2Vjb25kXCIsIFwibWluUm90b3JTZWNvbmRcIiwgXCJyb3RvclNwZWVkU2Vjb25kXCIsIFwiLnJvdG9yVG9ycXVlU2Vjb25kXCJdXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIG5vIG1vdmVtZW50LiBcclxuICAgICAqIEJlc3Qgd2F5IHRvIHNpbXVsYXRlIGNvbnZleCBvYmplY3RzIGxpa2UgYSBjaGFpciBzZWF0IGNvbm5lY3RlZCB0byBjaGFpciBsZWdzLlxyXG4gICAgICogVGhlIGFjdHVhbCBhbmNob3IgcG9pbnQgZG9lcyBub3QgbWF0dGVyIHRoYXQgbXVjaCwgb25seSBpbiB2ZXJ5IHNwZWNpZmljIGVkZ2UgY2FzZXMuXHJcbiAgICAgKiBCZWNhdXNlIHdlbGRpbmcgbWVhbnMgdGhleSBzaW1wbHkgZG8gbm90IGRpc2Nvbm5lY3QuICh1bmxlc3MgeW91IGFkZCBCcmVha2FiaWxpdHkpXHJcbiAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50V2VsZGluZyBleHRlbmRzIEpvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50V2VsZGluZyk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLkdlbmVyaWNKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnID0gbmV3IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG5cclxuICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyhfbG9jYWxBbmNob3IueCwgX2xvY2FsQW5jaG9yLnksIF9sb2NhbEFuY2hvci56KTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uR2VuZXJpY0pvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KG5ldyBPSU1PLk1hdDMoKSwgbmV3IE9JTU8uTWF0MygpKTtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmpvaW50LnNldEFsbG93Q29sbGlzaW9uKHRoaXMuaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9EaXN0cmlidXRpb24vT2ltb1BoeXNpY3MuZC50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgKiBNYW5hZ2VzIHRoZSBPSU1PIHBoeXNpY3MgZW5naW5lIGZvciBGVURHRS4gTXVsdGlwbGUgaW5zdGFuY2VzIG1heSBiZSBjcmVhdGVkLCBvbmUgaXMgYWN0aXZlIGF0IGEgdGltZS5cclxuICAgICogQWxsIG1ldGhvZHMgYXJlIHN0YXRpYyBhbmQgdXNlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGluc3RhbmNlLiBBdCBzdGFydHVwLCBhIGRlZmF1bHQgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgYmVjb21lIHRoZSBhY3RpdmUgaW5zdGFuY2VcclxuICAgICogQXR0YWNoaW5nIGEge0BsaW5rIENvbXBvbmVudFJpZ2lkYm9keX0gdG8gYSB7QGxpbmsgTm9kZX0gcGxhY2VzIGEgcGh5c2ljcyBjb2xsaWRlciBpbiB0aGUgcGh5c2ljcyBpbnN0YW5jZSBhY3RpdmUgYXQgdGhhdCB0aW1lLlxyXG4gICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwXHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzIHtcclxuICAgIC8qKiBUaGUgU0VUVElOR1MgdGhhdCBhcHBseSB0byB0aGUgcGh5c2ljYWwgd29ybGQuIFJhbmdpbmcgZnJvbSB0aGluZ3MgbGlrZSBzbGVlcGluZywgY29sbGlzaW9uU2hhcGVUaGlja25lc3MgYW5kIG90aGVycyAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXR0aW5nczogUGh5c2ljc1NldHRpbmdzID0gbmV3IFBoeXNpY3NTZXR0aW5ncyhDT0xMSVNJT05fR1JPVVAuREVGQVVMVCwgKENPTExJU0lPTl9HUk9VUC5ERUZBVUxUIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzEgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfMiB8IENPTExJU0lPTl9HUk9VUC5HUk9VUF8zIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzQpKTtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSYWN0aXZlOiBQaHlzaWNzID0gbmV3IFBoeXNpY3MoKTtcclxuXHJcbiAgICBwcml2YXRlIG9pbW9Xb3JsZDogT0lNTy5Xb3JsZDtcclxuICAgIHByaXZhdGUgYm9keUxpc3Q6IENvbXBvbmVudFJpZ2lkYm9keVtdID0gbmV3IEFycmF5KCk7XHJcbiAgICBwcml2YXRlIGpvaW50TGlzdDogSm9pbnRbXSA9IG5ldyBBcnJheSgpO1xyXG5cclxuICAgIC8qKiBUaGUgcmVuZGVyaW5nIG9mIHBoeXNpY2FsIGRlYnVnIGluZm9ybWF0aW9ucy4gVXNlZCBpbnRlcm5hbGx5IG5vIGludGVyYWN0aW9uIG5lZWRlZC4qL1xyXG4gICAgI2RlYnVnRHJhdzogUGh5c2ljc0RlYnVnRHJhdztcclxuICAgIC8qKiBUaGUgY2FtZXJhL3ZpZXdwb3J0IHRoZSBwaHlzaWNzIGFyZSBkZWJ1Z2dlZCB0by4gVXNlZCBpbnRlcm5hbGx5IG5vIGludGVyYWN0aW9uIG5lZWRlZC4gKi9cclxuICAgICNtYWluQ2FtOiBDb21wb25lbnRDYW1lcmE7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBpZiAodHlwZW9mIE9JTU8gPT0gXCJ1bmRlZmluZWRcIikgey8vIENoZWNrIGlmIE9JTU8gTmFtZXNwYWNlIHdhcyBsb2FkZWQsIGVsc2UgZG8gbm90IHVzZSBhbnkgcGh5c2ljcy4gQ2hlY2sgaXMgbmVlZGVkIHRvIGVuc3VyZSBGVURHRSBjYW4gYmUgdXNlZCB3aXRob3V0IFBoeXNpY3NcclxuICAgICAgICBEZWJ1Zy5lcnJvcihcIk9JTU8gcGh5c2ljcyBlbmdpbmUgbm90IGNvbm5lY3RlZCFcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vaW1vV29ybGQgPSBuZXcgT0lNTy5Xb3JsZCgpO1xyXG4gICAgICB0aGlzLiNkZWJ1Z0RyYXcgPSBuZXcgUGh5c2ljc0RlYnVnRHJhdygpOyAgLy9DcmVhdGUgYSBGVURHRSBQaHlzaWNzIGRlYnVnZ2luZyBoYW5kbGluZyBvYmplY3RcclxuICAgICAgdGhpcy5vaW1vV29ybGQuc2V0RGVidWdEcmF3KHRoaXMuI2RlYnVnRHJhdy5vaW1vRGVidWdEcmF3KTsgLy9UZWxsIE9pbW9QaHlzaWNzIHdoZXJlIHRvIGRlYnVnIHRvIGFuZCBob3cgaXQgd2lsbCBiZSBoYW5kbGVkXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBQaHlzaWNzIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IGFjdGl2ZUluc3RhbmNlKF9waHlzaWNzOiBQaHlzaWNzKSB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUgPSBfcGh5c2ljcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIFBoeXNpY3MgaW5zdGFuY2UgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGFjdGl2ZUluc3RhbmNlKCk6IFBoeXNpY3Mge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWJ1Z0RyYXcoKTogUGh5c2ljc0RlYnVnRHJhdyB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBtYWluQ2FtKCk6IENvbXBvbmVudENhbWVyYSB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLiNtYWluQ2FtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDYXN0IGEgUkFZIGludG8gdGhlIHBoeXNpY2FsIHdvcmxkIGZyb20gYSBvcmlnaW4gcG9pbnQgaW4gYSBjZXJ0YWluIGRpcmVjdGlvbi4gUmVjZWl2aW5nIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgaGl0IG9iamVjdCBhbmQgdGhlXHJcbiAgICAqIGhpdCBwb2ludC4gRG8gbm90IHNwZWNpZnkgYSBfZ3JvdXAgdG8gcmF5Y2FzdCB0aGUgd2hvbGUgd29ybGQsIGVsc2Ugb25seSBib2RpZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCBjYW4gYmUgaGl0LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmF5Y2FzdChfb3JpZ2luOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfbGVuZ3RoOiBudW1iZXIgPSAxLCBfZGVidWdEcmF3OiBib29sZWFuID0gZmFsc2UsIF9ncm91cDogQ09MTElTSU9OX0dST1VQID0gQ09MTElTSU9OX0dST1VQLkRFRkFVTFQpOiBSYXlIaXRJbmZvIHtcclxuICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBuZXcgUmF5SGl0SW5mbygpO1xyXG4gICAgICBsZXQgcmF5OiBPSU1PLlJheUNhc3RDbG9zZXN0ID0gbmV3IE9JTU8uUmF5Q2FzdENsb3Nlc3QoKTtcclxuICAgICAgbGV0IGJlZ2luOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF9vcmlnaW4ueCwgX29yaWdpbi55LCBfb3JpZ2luLnopO1xyXG4gICAgICBsZXQgZW5kOiBPSU1PLlZlYzMgPSB0aGlzLmdldFJheUVuZFBvaW50KGJlZ2luLCBuZXcgVmVjdG9yMyhfZGlyZWN0aW9uLngsIF9kaXJlY3Rpb24ueSwgX2RpcmVjdGlvbi56KSwgX2xlbmd0aCk7XHJcbiAgICAgIHJheS5jbGVhcigpO1xyXG4gICAgICBpZiAoX2dyb3VwID09IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUKSB7IC8vQ2FzZSAxOiBSYXljYXN0aW5nIHRoZSB3aG9sZSB3b3JsZCwgbm9ybWFsIG1vZGVcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5yYXlDYXN0KGJlZ2luLCBlbmQsIHJheSk7XHJcbiAgICAgIH0gZWxzZSB7IC8vQ2FzZTI6IFJheWNhc3Rpbmcgb24gZWFjaCBib2R5IGluIGEgc3BlY2lmaWMgZ3JvdXBcclxuICAgICAgICBsZXQgYWxsSGl0czogUmF5SGl0SW5mb1tdID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChfdmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICAgICAgaWYgKF92YWx1ZS5jb2xsaXNpb25Hcm91cCA9PSBfZ3JvdXApIHtcclxuICAgICAgICAgICAgaGl0SW5mbyA9IF92YWx1ZS5yYXljYXN0VGhpc0JvZHkoX29yaWdpbiwgX2RpcmVjdGlvbiwgX2xlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChoaXRJbmZvLmhpdCA9PSB0cnVlKSB7IC8vRXZlcnkgaGl0IGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIHRoZSBjbG9zZXN0XHJcbiAgICAgICAgICAgICAgYWxsSGl0cy5wdXNoKGhpdEluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYWxsSGl0cy5mb3JFYWNoKGZ1bmN0aW9uIChfdmFsdWU6IFJheUhpdEluZm8pOiB2b2lkIHsgLy9nZXQgdGhlIGNsb3Nlc3QgaGl0SW5mb1xyXG4gICAgICAgICAgaWYgKF92YWx1ZS5oaXREaXN0YW5jZSA8IGhpdEluZm8uaGl0RGlzdGFuY2UgfHwgaGl0SW5mby5oaXQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaGl0SW5mbyA9IF92YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmF5LmhpdCkgeyAvL0ZpbGwgaW4gaW5mb3JtYXRpb25zIG9uIHRoZSBoaXRcclxuICAgICAgICBoaXRJbmZvLmhpdCA9IHRydWU7XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKHJheS5wb3NpdGlvbi54LCByYXkucG9zaXRpb24ueSwgcmF5LnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGhpdEluZm8uaGl0Tm9ybWFsID0gbmV3IFZlY3RvcjMocmF5Lm5vcm1hbC54LCByYXkubm9ybWFsLnksIHJheS5ub3JtYWwueik7XHJcbiAgICAgICAgaGl0SW5mby5oaXREaXN0YW5jZSA9IHRoaXMuZ2V0UmF5RGlzdGFuY2UoX29yaWdpbiwgaGl0SW5mby5oaXRQb2ludCk7XHJcbiAgICAgICAgaGl0SW5mby5yaWdpZGJvZHlDb21wb25lbnQgPSByYXkuc2hhcGUudXNlckRhdGE7XHJcbiAgICAgICAgaGl0SW5mby5yYXlFbmQgPSBuZXcgVmVjdG9yMyhlbmQueCwgZW5kLnksIGVuZC56KTtcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGl0SW5mby5yYXlPcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhlbmQueCwgZW5kLnksIGVuZC56KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX2RlYnVnRHJhdykgeyAvL0hhbmRsZSBkZWJ1Z2dpbmdcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXcuZGVidWdSYXkoaGl0SW5mby5yYXlPcmlnaW4sIGhpdEluZm8uaGl0UG9pbnQsIG5ldyBDb2xvcigwLCAxLCAwLCAxKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGhpdEluZm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTaW11bGF0ZXMgdGhlIHBoeXNpY2FsIHdvcmxkLiBfZGVsdGFUaW1lIGlzIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHBoeXNpY2FsIHN0ZXBzIGluIHNlY29uZHMuIERlZmF1bHQgaXMge0BsaW5rIExvb3AudGltZUZyYW1lR2FtZX0gLyAxMDAwIHRvIHJ1biBpbiBzeW5jIHdpdGggdGhlIHtAbGluayBMb29wfS5cclxuICAgICogVGhlIG1heGltdW0gdmFsdWUgaXMgMS8zMCBvZiBhIHNlY29uZCwgdG8gaGF2ZSBtb3JlIGNvbnNpc3RlbnQgZnJhbWUgY2FsY3VsYXRpb25zLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2ltdWxhdGUoX2RlbHRhVGltZTogbnVtYmVyID0gTG9vcC50aW1lRnJhbWVHYW1lIC8gMTAwMCk6IHZvaWQge1xyXG4gICAgICBpZiAoUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QubGVuZ3RoID4gMClcclxuICAgICAgICBQaHlzaWNzLmNvbm5lY3RKb2ludHMoKTsgLy8gQ29ubmVjdCBqb2ludHMgaWYgYW55dGhpbmcgaGFzIGhhcHBlbmVkIGJldHdlZW4gdGhlIGxhc3QgY2FsbCB0byBhbnkgb2YgdGhlIHR3byBwYWlyZWQgcmlnaWRib2RpZXNcclxuICAgICAgaWYgKF9kZWx0YVRpbWUgPT0gMCkgLy8gTm8gdGltZSBwYXNzZWQsIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBwaHlzaWNzIHdvcmxkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgX2RlbHRhVGltZSA9IF9kZWx0YVRpbWUgPiAxIC8gMzAgPyAxIC8gMzAgOiBfZGVsdGFUaW1lOyAvLyBJZiBpbnN0ZWFkIG9mIGEgZml4ZWQgcmF0ZSB0aGUgZ2FtZSBmcmFtZXJhdGUgaXMgdXNlZCwgbWFrZSBzdXJlIGlycmVndWxhciB0aW1pbmdzIGFyZSBmaXhlZCB0byAzMGZwc1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5zdGVwKF9kZWx0YVRpbWUpOyAgLy8gVXBkYXRlIHRoZSBzaW11bGF0aW9uIGJ5IHRoZSBnaXZlbiBkZWx0YVRpbWVcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGluc3RhbmNlIHVzaW5nIHRoZSB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSBnaXZlblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfbW9kZT86IFBIWVNJQ1NfREVCVUdNT0RFKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5zZXREZWJ1Z01vZGUoX21vZGUpO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLiNtYWluQ2FtID0gX2NtcENhbWVyYTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZGVidWdEcmF3KCk7IC8vRmlsbGluZyB0aGUgcGh5c2ljcyB3b3JsZCBkZWJ1ZyBpbmZvcm1hdGlvbnMgaW50byB0aGUgZGVidWcgcmVuZGVyaW5nIGhhbmRsZXJcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LmRyYXdCdWZmZXJzKCk7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5jbGVhckJ1ZmZlcnMoKTsgIC8vVXBkYXRlcyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IHByb2plY3Rpb24sIHJlc2V0dGluZyB0aGUgcG9pbnRzL2xpbmVzL3RyaWFuZ2xlcyB0aGF0IG5lZWQgdG8gYmUgZHJhd24gZnJvbSBkZWJ1Z1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIEFkanVzdHMgdGhlIHRyYW5zZm9ybXMgb2YgdGhlIHtAbGluayBDb21wb25lbnRSaWdpZGJvZHl9cyBpbiB0aGUgZ2l2ZW4gYnJhbmNoIHRvIG1hdGNoIHRoZWlyIG5vZGVzIG9yIG1lc2hlc1xyXG4gICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGp1c3RUcmFuc2Zvcm1zKF9icmFuY2g6IE5vZGUsIF90b01lc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBSZW5kZXIucHJlcGFyZShfYnJhbmNoLCB7IGlnbm9yZVBoeXNpY3M6IHRydWUgfSk7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgUmVuZGVyLm5vZGVzUGh5c2ljcylcclxuICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpLmluaXRpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogR2V0IHRoZSBhcHBsaWVkIGdyYXZpdGF0aW9uYWwgZm9yY2Ugb2YgdGhlIGFjdGl2ZSBpbnN0YW5jZS4gRGVmYXVsdCBlYXJ0aCBncmF2aXR5ID0gOS44MSBtL3NcclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEdyYXZpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB0bXBWZWM6IE9JTU8uVmVjMyA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLmdldEdyYXZpdHkoKTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRtcFZlYy54LCB0bXBWZWMueSwgdG1wVmVjLnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXQgdGhlIGFwcGxpZWQgZ3Jhdml0YXRpb25hbCBmb3JjZSBvZiB0aGUgYWN0aXZlIGluc3RhbmNlLiBEZWZhdWx0IGVhcnRoIGdyYXZpdHkgPSA5LjgxIG0vc1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0R3Jhdml0eShfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHRtcFZlYzogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuc2V0R3Jhdml0eSh0bXBWZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGQgYSBuZXcgT0lNTyBSaWdpZGJvZHkgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gYWRkaW5nIGEgRlVER0UgUmlnaWRib2R5IENvbXBvbmVudC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZFJpZ2lkYm9keShfY21wUkI6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LnB1c2goX2NtcFJCKTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuYWRkUmlnaWRCb2R5KF9jbXBSQi5nZXRPaW1vUmlnaWRib2R5KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZW1vdmUgdGhlIE9JTU8gUmlnaWRib2R5IHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UsIGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHJlbW92aW5nIGEgRlVER0UgUmlnaWRib2R5IENvbXBvbmVudFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUmlnaWRib2R5KF9jbXBSQjogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgIC8vIFRPRE86IHR3byBsaXN0cyBhcmUgYmVpbmcgbWFuYWdlZCwgaW5mbyBtaWdodCBkZXZpYXRlLiBDbGVhbnVwIVxyXG4gICAgICBsZXQgb2ltb1JpZ2lkQm9keTogT0lNTy5SaWdpZEJvZHkgPSBfY21wUkIuZ2V0T2ltb1JpZ2lkYm9keSgpO1xyXG4gICAgICBpZiAob2ltb1JpZ2lkQm9keS5fd29ybGQpXHJcbiAgICAgICAgb2ltb1JpZ2lkQm9keS5fd29ybGQucmVtb3ZlUmlnaWRCb2R5KG9pbW9SaWdpZEJvZHkpO1xyXG4gICAgICAvLyB3aGF0IGlmIHRoZSByaWdpZGJvZHlzIG9pbW8td29ybGQgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBhY3RpdmUgaW5zdGFuY2U/XHJcbiAgICAgIGxldCBpZDogbnVtYmVyID0gUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5pbmRleE9mKF9jbXBSQik7XHJcbiAgICAgIGlmIChpZCA+IC0xKVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3Quc3BsaWNlKGlkLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQWRkIGEgbmV3IE9JTU8gSm9pbnQvQ29uc3RyYWludCB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgYSBGVURHRSBKb2ludCBDb21wb25lbnRcclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEpvaW50KF9jbXBKb2ludDogSm9pbnQpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuYWRkSm9pbnQoX2NtcEpvaW50LmdldE9pbW9Kb2ludCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gaW5mb3JtIHRoZSBwaHlzaWNzIHN5c3RlbSB0aGF0IGEgam9pbnQgaGFzIGEgY2hhbmdlIG9mIGNvcmUgcHJvcGVydGllcyBhbmQgbmVlZHMgdG8gYmUgcmVjcmVhdGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hhbmdlSm9pbnRTdGF0dXMoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICBpZiAoUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QuaW5kZXhPZihfY21wSm9pbnQpIDwgMClcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5wdXNoKF9jbXBKb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogUmVtb3ZlIHRoZSBPSU1PIEpvaW50L0NvbnN0cmFpbnQgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gcmVtb3ZpbmcgYSBGVURHRSBKb2ludCBDb21wb25lbnRcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlSm9pbnQoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnJlbW92ZUpvaW50KF9jbXBKb2ludC5nZXRPaW1vSm9pbnQoKSk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIERlYnVnLmZ1ZGdlKF9lcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmV0dXJucyBhbGwgdGhlIENvbXBvbmVudFJpZ2lkYm9kaWVzIHRoYXQgYXJlIGtub3duIHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UuICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEJvZHlMaXN0KCk6IENvbXBvbmVudFJpZ2lkYm9keVtdIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdpdmluZyBhIENvbXBvbmVudFJpZ2lkYm9keSBhIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uIG51bWJlciBzbyBpdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgbG9hZGluZyBwcm9jZXNzLiBBbmQgcmVtb3ZlZCByYidzIGNhbiByZWNlaXZlIGEgbmV3IGlkLiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkaXN0cmlidXRlQm9keUlEKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBmcmVlSWQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBmcmVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QuZm9yRWFjaCgoX3ZhbHVlOiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoX3ZhbHVlLmlkICE9IGZyZWVJZCkge1xyXG4gICAgICAgICAgZnJlZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZyZWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmcmVlKSB7XHJcbiAgICAgICAgICBmcmVlSWQrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZyZWVJZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBDb25uZWN0IGFsbCBqb2ludHMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB5ZXQuIFVzZWQgaW50ZXJuYWxseSBubyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNhbGxlZCBhbmQgbmVlZGVkIHRvIG1ha2Ugc3VyZSBqb2ludHMgY29ubmVjdC9kaXNjb25uZWN0XHJcbiAgICAgKiBpZiBhbnkgb2YgdGhlIHR3byBwYWlyZWQgQ29tcG9uZW50UmlnaWRib2RpZXMgY2hhbmdlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbm5lY3RKb2ludHMoKTogdm9pZCB7IC8vVHJ5IHRvIGNvbm5lY3QgZGlydHkgam9pbnRzIHVudGlsIHRoZXkgYXJlIGNvbm5lY3RlZFxyXG4gICAgICBsZXQgam9pbnRzVG9Db25uZWN0OiBKb2ludFtdID0gUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3Q7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuam9pbnRMaXN0ID0gW107XHJcbiAgICAgIGpvaW50c1RvQ29ubmVjdC5mb3JFYWNoKChfam9pbnQ6IEpvaW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKF9qb2ludC5pc0Nvbm5lY3RlZCgpID09IGZhbHNlKVxyXG4gICAgICAgICAgaWYgKF9qb2ludC5pc0FjdGl2ZSlcclxuICAgICAgICAgICAgX2pvaW50LmNvbm5lY3QoKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QucHVzaChfam9pbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlIGFsbCBvaW1vIGpvaW50cyBhbmQgcmlnaWRib2RpZXMsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgd29ybGQgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFudXAoKTogdm9pZCB7XHJcbiAgICAgIGxldCBvaW1vV29ybGQ6IE9JTU8uV29ybGQgPSBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZDtcclxuICAgICAgaWYgKG9pbW9Xb3JsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy9SZXNldHRpbmcgdGhlIHdvcmxkIHNvIGEgbmV3IHdvcmxkIGNhbiBiZSBjcmVhdGVkLCBmaXggZm9yIHJlLW9wZW5pbmcgYSBwcm9qZWN0IGluIGVkaXRvciwgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIG9sZCB0aGluZ3MgY2FsY3VsYXRlZFxyXG4gICAgICAgIGxldCBqb2ludHNXb3JsZDogbnVtYmVyID0gb2ltb1dvcmxkLmdldE51bUpvaW50cygpO1xyXG4gICAgICAgIGxldCBib2RpZXNXb3JsZDogbnVtYmVyID0gb2ltb1dvcmxkLmdldE51bVJpZ2lkQm9kaWVzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgYm9keSBvZiBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0KVxyXG4gICAgICAgICAgYm9keS5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QgPSBuZXcgQXJyYXkoKTsgLy8gVE9ETzogc2VlIGlmIGl0IHdvdWxkIGJlIHNtYXJ0ZXIsIGRvIHVzZSB0aGVzZSBhcnJheXMuIERlZmluaXRlbHkgbW9yZSBpbnR1aXRpdmUuLi5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgam9pbnRzV29ybGQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG9pbW9Kb2ludDogT0lNTy5Kb2ludCA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLmdldEpvaW50TGlzdCgpO1xyXG4gICAgICAgICAgb2ltb1dvcmxkLnJlbW92ZUpvaW50KG9pbW9Kb2ludCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBib2RpZXNXb3JsZDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb2ltb0JvZHk6IE9JTU8uUmlnaWRCb2R5ID0gb2ltb1dvcmxkLmdldFJpZ2lkQm9keUxpc3QoKTtcclxuICAgICAgICAgIG9pbW9Xb3JsZC5yZW1vdmVSaWdpZEJvZHkob2ltb0JvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKiBSZXR1cm5zIHRoZSBDb21wb25lbnRSaWdpZGJvZHkgd2l0aCB0aGUgZ2l2ZW4gaWQuIFVzZWQgaW50ZXJuYWxseSB0byByZWNvbm5lY3Qgam9pbnRzIG9uIGxvYWRpbmcgaW4gdGhlIGVkaXRvci4gKi9cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGdldEJvZHlCeUlEKF9pZDogbnVtYmVyKTogQ29tcG9uZW50UmlnaWRib2R5IHtcclxuICAgIC8vICAgbGV0IGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGw7XHJcbiAgICAvLyAgIFBoeXNpY3MuI2FjdGl2ZVBoeXNpY3MuYm9keUxpc3QuZm9yRWFjaCgodmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQgPT4ge1xyXG4gICAgLy8gICAgIGlmICh2YWx1ZS5pZCA9PSBfaWQpIHtcclxuICAgIC8vICAgICAgIGJvZHkgPSB2YWx1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gICByZXR1cm4gYm9keTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBlbmRwb2ludCBvZiBtYXRoZW1hdGljYWwgcmF5LiBCeSBhZGRpbmcgdGhlIG11bHRpcGxpZWQgZGlyZWN0aW9uIHRvIHRoZSBvcmlnaW4uIFxyXG4gICAgICAgKiBVc2VkIGJlY2F1c2UgT2ltb1BoeXNpY3MgZGVmaW5lcyByYXkgYnkgc3RhcnQvZW5kLiBCdXQgR2FtZUVuZ2luZXMgY29tbW9ubHkgdXNlIG9yaWdpbi9kaXJlY3Rpb24uXHJcbiAgICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmF5RW5kUG9pbnQoX3N0YXJ0OiBPSU1PLlZlYzMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlcik6IE9JTU8uVmVjMyB7XHJcbiAgICAgIGxldCBvcmlnaW46IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIG9yaWdpbi5zZXQoX3N0YXJ0LngsIF9zdGFydC55LCBfc3RhcnQueik7XHJcbiAgICAgIGxldCBzY2FsZWREaXJlY3Rpb246IFZlY3RvcjMgPSBfZGlyZWN0aW9uLmNsb25lO1xyXG4gICAgICBzY2FsZWREaXJlY3Rpb24uc2NhbGUoX2xlbmd0aCk7XHJcbiAgICAgIGxldCBlbmRwb2ludDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHNjYWxlZERpcmVjdGlvbiwgb3JpZ2luKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGVkRGlyZWN0aW9uKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZW5kcG9pbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShvcmlnaW4pO1xyXG4gICAgICByZXR1cm4gbmV3IE9JTU8uVmVjMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkaXN0YW5jZSBpbiB3aGljaCBhIHJheSBoaXQgYnkgc3VidHJhY3RpbmcgcG9pbnRzIGZyb20gZWFjaCBvdGhlciBhbmQgZ2V0IHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc3F1YXJlZCBwcm9kdWN0IG9mIGVhY2ggY29tcG9uZW50LiAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmF5RGlzdGFuY2UoX29yaWdpbjogVmVjdG9yMywgX2hpdFBvaW50OiBWZWN0b3IzKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGR4OiBudW1iZXIgPSBfb3JpZ2luLnggLSBfaGl0UG9pbnQueDtcclxuICAgICAgbGV0IGR5OiBudW1iZXIgPSBfb3JpZ2luLnkgLSBfaGl0UG9pbnQueTtcclxuICAgICAgbGV0IGR6OiBudW1iZXIgPSBfb3JpZ2luLnogLSBfaGl0UG9pbnQuejtcclxuICAgICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBhY3R1YWwgdXNlZCB3b3JsZCBvZiB0aGUgT0lNTyBwaHlzaWNzIGVuZ2luZS4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQgLSBPbmx5IGZvciBhZHZhbmNlZCB1c2VycyB0aGF0IG5lZWQgdG8gYWNjZXNzIGl0IGRpcmVjdGx5ICovXHJcbiAgICBwdWJsaWMgZ2V0T2ltb1dvcmxkKCk6IE9JTU8uV29ybGQge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqIFVwZGF0ZXMgYWxsIHtAbGluayBSaWdpZGJvZGllc30ga25vd24gdG8gdGhlIFBoeXNpY3Mud29ybGQgdG8gbWF0Y2ggdGhlaXIgY29udGFpbmVycyBvciBtZXNoZXMgdHJhbnNmb3JtYXRpb25zICovXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVdvcmxkRnJvbVdvcmxkTWF0cml4KF90b01lc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy8gICBmb3IgKGxldCBib2R5IG9mIHRoaXMuYm9keUxpc3QpXHJcbiAgICAvLyAgICAgYm9keS51cGRhdGVGcm9tV29ybGQoX3RvTWVzaCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBhIHRocmVlZGltZW5zaW9uYWwgYm94IGJ5IHR3byBjb3JuZXItcG9pbnRzLCBvbmUgd2l0aCBtaW5pbWFsIHZhbHVlcyBhbmQgb25lIHdpdGggbWF4aW11bSB2YWx1ZXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQm94IGltcGxlbWVudHMgUmVjeWNhYmxlIHtcclxuICAgIHB1YmxpYyBtaW46IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgbWF4OiBWZWN0b3IzO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWluOiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoSW5maW5pdHkpLCBfbWF4OiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoLUluZmluaXR5KSkge1xyXG4gICAgICB0aGlzLnNldChfbWluLCBfbWF4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSB0aGUgY29ybmVycyBvZiB0aGlzIGJveCwgc3RhbmRhcmQgdmFsdWVzIGFyZSBJbmZpbml0eSBmb3IgbWluLCBhbmQgLUluZmluaXR5IGZvciBtYXgsIFxyXG4gICAgICogY3JlYXRpbmcgYW4gaW1wb3NzaWJsZSBpbnZlcnRlZCBib3ggdGhhdCBjYW4gbm90IGNvbnRhaW4gYW55IHBvaW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF9taW46IFZlY3RvcjMgPSBWZWN0b3IzLk9ORShJbmZpbml0eSksIF9tYXg6IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgtSW5maW5pdHkpKTogdm9pZCB7XHJcbiAgICAgIHRoaXMubWluID0gX21pbjtcclxuICAgICAgdGhpcy5tYXggPSBfbWF4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXhwYW5kIHRoZSBib3ggaWYgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIGdpdmVuIHBvaW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBhbmQoX2luY2x1ZGU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4ubWluKF9pbmNsdWRlKTtcclxuICAgICAgdGhpcy5tYXgubWF4KF9pbmNsdWRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4uc2V0KEluZmluaXR5LCBJbmZpbml0eSwgSW5maW5pdHkpO1xyXG4gICAgICB0aGlzLm1heC5zZXQoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHtAbGluayBSZW5kZXJ9LXBpY2tpbmcgZS5nLiB1c2luZyB7QGxpbmsgUGlja2VyfSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgZnVydGhlciBjYWxjdWxhdGlvbiBvZiBwb3NpdGlvbnMgYW5kIG5vcm1hbHMgZXRjLlxyXG4gICAqIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2sge1xyXG4gICAgcHVibGljIG5vZGU6IE5vZGU7XHJcbiAgICBwdWJsaWMgekJ1ZmZlcjogbnVtYmVyO1xyXG4gICAgcHVibGljIGNvbG9yOiBDb2xvcjtcclxuICAgIHB1YmxpYyB0ZXh0dXJlVVY6IFZlY3RvcjI7XHJcbiAgICBwdWJsaWMgZ2l6bW8/OiBHaXptbztcclxuICAgICNtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0O1xyXG4gICAgI3Bvc1dvcmxkOiBWZWN0b3IzO1xyXG4gICAgI3Bvc01lc2g6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ub2RlOiBOb2RlKSB7XHJcbiAgICAgIHRoaXMubm9kZSA9IF9ub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB3b3JsZCBwb3NpdGlvbiBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NXb3JsZCgpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3Bvc1dvcmxkKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNwb3NXb3JsZDtcclxuICAgICAgbGV0IHBvaW50SW5DbGlwU3BhY2U6IFZlY3RvcjMgPSBWZWN0b3IzLloodGhpcy56QnVmZmVyKTtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuI210eFZpZXdUb1dvcmxkLmdldCgpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludEluQ2xpcFNwYWNlLCB0aGlzLiNtdHhWaWV3VG9Xb3JsZCwgdHJ1ZSk7XHJcbiAgICAgIGxldCB3OiBudW1iZXIgPSBtWzNdICogcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIHBvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogcG9pbnRJbkNsaXBTcGFjZS56ICsgbVsxNV07XHJcbiAgICAgIHJlc3VsdC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICB0aGlzLiNwb3NXb3JsZCA9IHJlc3VsdDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2Vzc29yIHRvIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcG9zaXRpb24gaW4gbWVzaC1zcGFjZSBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NNZXNoKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcG9zTWVzaClcclxuICAgICAgICByZXR1cm4gdGhpcy4jcG9zTWVzaDtcclxuICAgICAgbGV0IG10eFdvcmxkVG9NZXNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRSh0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpLm10eFdvcmxkKTtcclxuICAgICAgbGV0IHBvc01lc2g6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMucG9zV29ybGQsIG10eFdvcmxkVG9NZXNoKTtcclxuICAgICAgdGhpcy4jcG9zTWVzaCA9IHBvc01lc2g7XHJcbiAgICAgIHJldHVybiBwb3NNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgZmFjZSBub3JtYWwgaW4gd29ybGQtc3BhY2UgYXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB7QGxpbmsgUmF5fSBhbmQge0BsaW5rIE1lc2h9IG9ubHkgd2hlbiB1c2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG5cclxuICAgICAgZm9yIChsZXQgZmFjZSBvZiBjbXBNZXNoLm1lc2guZmFjZXMpIHtcclxuICAgICAgICBpZiAoZmFjZS5pc0luc2lkZSh0aGlzLnBvc01lc2gpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBmYWNlLm5vcm1hbC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzdWx0LnRyYW5zZm9ybShjbXBNZXNoLm10eFdvcmxkLCBmYWxzZSk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBzb2xlbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGVuYWJsZSBjYWxjdWxhdGlvbiBvZiB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhpcyB7QGxpbmsgUGlja31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtdHhWaWV3VG9Xb3JsZChfbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCkge1xyXG4gICAgICB0aGlzLiNtdHhWaWV3VG9Xb3JsZCA9IF9tdHhWaWV3VG9Xb3JsZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBQcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgcGlja2luZyB1c2luZyB7QGxpbmsgUmVuZGVyfVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2tlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmF5IHBsdXMgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgbmVhciBhbmQgZmFyIHBsYW5lcyB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX25vZGVzOiBOb2RlW10sIF9yYXk6IFJheSwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBQaWNrW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX2dpem1vczogR2l6bW9bXSwgX3JheTogUmF5LCBfbWluOiBudW1iZXIsIF9tYXg6IG51bWJlcik6IFBpY2tbXTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja1JheShfZnJvbTogTm9kZVtdIHwgR2l6bW9bXSwgX3JheTogUmF5LCBfbWluOiBudW1iZXIsIF9tYXg6IG51bWJlcik6IFBpY2tbXSB7XHJcbiAgICAgIGlmIChfZnJvbS5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gW107XHJcblxyXG4gICAgICBsZXQgY21wQ2FtZXJhUGljazogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG4gICAgICBjbXBDYW1lcmFQaWNrLm10eFBpdm90LnRyYW5zbGF0aW9uID0gX3JheS5vcmlnaW47XHJcbiAgICAgIGNtcENhbWVyYVBpY2subXR4UGl2b3QubG9va0F0KFZlY3RvcjMuU1VNKF9yYXkub3JpZ2luLCBfcmF5LmRpcmVjdGlvbikpO1xyXG4gICAgICBjbXBDYW1lcmFQaWNrLnByb2plY3RDZW50cmFsKDEsIDAuMDAxLCBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMLCBfbWluLCBfbWF4KTtcclxuXHJcbiAgICAgIGlmIChfZnJvbVswXSBpbnN0YW5jZW9mIE5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFJlbmRlci5waWNrKDxOb2RlW10+X2Zyb20sIGNtcENhbWVyYVBpY2spO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIEdpem1vcy5waWNrKDxHaXptb1tdPl9mcm9tLCBjbXBDYW1lcmFQaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY2FtZXJhIGFuZCBhIHBvaW50IG9uIGl0cyB2aXJ0dWFsIG5vcm1lZCBwcm9qZWN0aW9uIHBsYW5lIChkaXN0YW5jZSAxKSB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tDYW1lcmEoX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3Bvc1Byb2plY3Rpb246IFZlY3RvcjIpOiBQaWNrW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tDYW1lcmEoX25vZGVzOiBHaXptb1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9wb3NQcm9qZWN0aW9uOiBWZWN0b3IyKTogUGlja1tdO1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrQ2FtZXJhKF9mcm9tOiBOb2RlW10gfCBHaXptb1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9wb3NQcm9qZWN0aW9uOiBWZWN0b3IyKTogUGlja1tdIHtcclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShuZXcgVmVjdG9yMygtX3Bvc1Byb2plY3Rpb24ueCwgX3Bvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSByYXkuZGlyZWN0aW9uLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChfY21wQ2FtZXJhLm5vZGUpIHtcclxuICAgICAgICBsZXQgbXR4Q2FtZXJhOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfY21wQ2FtZXJhLm5vZGUubXR4V29ybGQsIF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG4gICAgICAgIHJheS50cmFuc2Zvcm0obXR4Q2FtZXJhKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhDYW1lcmEpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByYXkudHJhbnNmb3JtKF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja1JheSg8R2VuZXJhbD5fZnJvbSwgcmF5LCBsZW5ndGggKiBfY21wQ2FtZXJhLmdldE5lYXIoKSwgbGVuZ3RoICogX2NtcENhbWVyYS5nZXRGYXIoKSk7XHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIHRoZSBjYW1lcmEgb2YgdGhlIGdpdmVuIHZpZXdwb3J0IGFuZCBhIHBvaW50IHRoZSBjbGllbnQgc3VyZmFjZSB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tWaWV3cG9ydChfdmlld3BvcnQ6IFZpZXdwb3J0LCBfcG9zQ2xpZW50OiBWZWN0b3IyKTogUGlja1tdIHtcclxuICAgICAgbGV0IHBvc1Byb2plY3Rpb246IFZlY3RvcjIgPSBfdmlld3BvcnQucG9pbnRDbGllbnRUb1Byb2plY3Rpb24oX3Bvc0NsaWVudCk7XHJcbiAgICAgIGxldCBub2RlczogTm9kZVtdID0gQXJyYXkuZnJvbShfdmlld3BvcnQuZ2V0QnJhbmNoKCkuZ2V0SXRlcmF0b3IodHJ1ZSkpO1xyXG4gICAgICBsZXQgcGlja3M6IFBpY2tbXSA9IFBpY2tlci5waWNrQ2FtZXJhKG5vZGVzLCBfdmlld3BvcnQuY2FtZXJhLCBwb3NQcm9qZWN0aW9uKTtcclxuICAgICAgaWYgKF92aWV3cG9ydC5naXptb3NFbmFibGVkKSBcclxuICAgICAgICBwaWNrcyA9IHBpY2tzLmNvbmNhdChQaWNrZXIucGlja0NhbWVyYShfdmlld3BvcnQuZ2V0R2l6bW9zKG5vZGVzKSwgX3ZpZXdwb3J0LmNhbWVyYSwgcG9zUHJvamVjdGlvbikpOyAvLyB0aGlzIGlzIGtpbmQgb2Ygd2FzdGVmdWwgYmVjYXVzZSB3ZSBkbyB0aGUgc2FtZSBjYWxjdWxhdGlvbnMgdHdpY2VcclxuICAgICAgXHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lZCBieSBhbiBvcmlnaW4gYW5kIGEgZGlyZWN0aW9uIG9mIHR5cGUge0BsaW5rIFBpY2t9LCByYXlzIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBwaWNraW5nIGFuZCBpbnRlcnNlY3Rpb25zXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmF5IHtcclxuICAgIHB1YmxpYyBvcmlnaW46IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgZGlyZWN0aW9uOiBWZWN0b3IzO1xyXG4gICAgLyoqIFRPRE86IHN1cHBvcnQgbGVuZ3RoICovXHJcbiAgICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9kaXJlY3Rpb246IFZlY3RvcjMgPSBWZWN0b3IzLlooMSksIF9vcmlnaW46IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKSwgX2xlbmd0aDogbnVtYmVyID0gMSkge1xyXG4gICAgICB0aGlzLm9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX2RpcmVjdGlvbjtcclxuICAgICAgdGhpcy5sZW5ndGggPSBfbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmF5IHdpdGggYSBwbGFuZSBkZWZpbmVkIGJ5IFxyXG4gICAgICogdGhlIGdpdmVuIHBvaW50IG9mIG9yaWdpbiBhbmQgdGhlIHBsYW5lcyBub3JtYWwuIEFsbCB2YWx1ZXMgYW5kIGNhbGN1bGF0aW9uc1xyXG4gICAgICogbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSwgcHJlZmVyYWJseSB0aGUgd29ybGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVyc2VjdFBsYW5lKF9vcmlnaW46IFZlY3RvcjMsIF9ub3JtYWw6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX29yaWdpbiwgdGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgZmFjdG9yOiBudW1iZXIgPSBWZWN0b3IzLkRPVChkaWZmZXJlbmNlLCBfbm9ybWFsKSAvIFZlY3RvcjMuRE9UKHRoaXMuZGlyZWN0aW9uLCBfbm9ybWFsKTtcclxuICAgICAgbGV0IGludGVyc2VjdDogVmVjdG9yMyA9IFZlY3RvcjMuU1VNKHRoaXMub3JpZ2luLCBWZWN0b3IzLlNDQUxFKHRoaXMuZGlyZWN0aW9uLCBmYWN0b3IpKTtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0aGlzIHJheSB3aXRoIGEgcGxhbmUgZGVmaW5lZCBieSB0aGUgZmFjZS4gXHJcbiAgICAgKiBBbGwgdmFsdWVzIGFuZCBjYWxjdWxhdGlvbnMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSwgcHJlZmVyYWJseSB0aGUgd29ybGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVyc2VjdEZhY2VQbGFuZShfZmFjZTogRmFjZSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RQbGFuZShfZmFjZS5nZXRQb3NpdGlvbigwKSwgX2ZhY2Uubm9ybWFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIGZyb20gdGhlIHJheSB0byB0aGUgZ2l2ZW4gdGFyZ2V0IHBvaW50LlxyXG4gICAgICogQWxsIHZhbHVlcyBhbmQgY2FsY3VsYXRpb25zIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGlzdGFuY2UoX3RhcmdldDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgb3JpZ2luVG9UYXJnZXQ6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgcmF5U2VjdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmRpcmVjdGlvbiwgMSk7XHJcbiAgICAgIGxldCBwcm9qZWN0ZWRMZW5ndGg6IG51bWJlciA9IFZlY3RvcjMuRE9UKG9yaWdpblRvVGFyZ2V0LCByYXlTZWN0aW9uKTtcclxuICAgICAgcmF5U2VjdGlvbi5zY2FsZShwcm9qZWN0ZWRMZW5ndGgpO1xyXG4gICAgICByYXlTZWN0aW9uLmFkZCh0aGlzLm9yaWdpbik7XHJcbiAgICAgIGxldCBkaXN0YW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCByYXlTZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIGRpc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtIHRoZSByYXkgYnkgdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm9yaWdpbi50cmFuc2Zvcm0oX210eFRyYW5zZm9ybSk7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybShfbXR4VHJhbnNmb3JtLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYG9yaWdpbjogJHt0aGlzLm9yaWdpbi50b1N0cmluZygpfSwgZGlyZWN0aW9uOiAke3RoaXMuZGlyZWN0aW9uLnRvU3RyaW5nKCl9LCBsZW5ndGg6ICR7dGhpcy5sZW5ndGgudG9QcmVjaXNpb24oNSl9YDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGludGVyZmFjZSB0byByZW5kZXIgdmlzdWFsIGFpZHMgaW4gdGhlIGVkaXRvci4gSW1wbGVtZW50ZWQgYnkge0BsaW5rIENvbXBvbmVudH1zLiBDYW4gYmUgdXNlZCBvbiBpdHMgb3duIHRvIGRyYXcgYW5kIHBpY2sgdmlzdWFsIGFpZHMgaW5kZXBlbmRlbnQgb2YgYSBzY2VuZSBncmFwaC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEdpem1vIHtcclxuICAgIG5vZGU/OiBOb2RlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnQgdGhpcyB0byBkcmF3IHZpc3VhbCBhaWRzIGluc2lkZSB0aGUgZWRpdG9ycyByZW5kZXIgdmlldy4gVXNlIHtAbGluayBHaXptb3N9IGluc2lkZSB0aGUgb3ZlcnJpZGUgdG8gZHJhdyBzdHVmZi5cclxuICAgICAqL1xyXG4gICAgZHJhd0dpem1vcz8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSwgX3BpY2tpbmc/OiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgZHJhd0dpem1vc30uIE9ubHkgZGlzcGxheWVkIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIGRyYXdHaXptb3NTZWxlY3RlZD8oX2NtcENhbWVyYT86IENvbXBvbmVudENhbWVyYSk6IHZvaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZ2l6bW9zIGRyYXdpbmcgaW50ZXJmYWNlLiB7QGxpbmsgQ29tcG9uZW50fXMgY2FuIHVzZSB0aGlzIHRvIGRyYXcgdmlzdWFsIGFpZHMgaW5zaWRlIHtAbGluayBDb21wb25lbnQuZHJhd0dpem1vc30gYW5kIHtAbGluayBDb21wb25lbnQuZHJhd0dpem1vc1NlbGVjdGVkfS5cclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgR2l6bW9zIHtcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSBkZWZhdWx0IG9wYWNpdHkgb2Ygb2NjbHVkZWQgZ2l6bW8gcGFydHMuIFVzZSB0aGlzIHRvIGNvbnRyb2wgdGhlIHZpc2liaWxpdHkgb2YgZ2l6bW9zIGJlaGluZCBvYmplY3RzLlxyXG4gICAgICogU2V0IHRvIDAgdG8gbWFrZSBvY2NsdWRlZCBnaXptbyBwYXJ0cyBkaXNhcHBlYXIuIFNldCB0byAxIHRvIG1ha2Ugb2NjbHVkZWQgZ2l6bW8gcGFydHMgZnVsbHkgdmlzaWJsZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gMC4zOyAvLyBjdXJyZW50bHkgZ2l6bW9zIGNhbiBhbHdheXMgYmUgcGlja2VkIGV2ZW4gaWYgdGhpcyBpcyBzZXQgdG8gMC4uLlxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGFycmF5QnVmZmVyOiBXZWJHTEJ1ZmZlciA9IFJlbmRlcldlYkdMLmFzc2VydChSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkuY3JlYXRlQnVmZmVyKCkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW5kZXhCdWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5jcmVhdGVCdWZmZXIoKSk7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGlja0lkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwb3NJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIGNhY2hlIHRoZSBwb3NpdGlvbnMgb2YgaWNvbnMgdG8gYXZvaWQgZHJhd2luZyB0aGVtIHdpdGhpbiBlYWNoIG90aGVyXHJcblxyXG4gICAgc3RhdGljICNjYW1lcmE6IENvbXBvbmVudENhbWVyYTtcclxuXHJcbiAgICBzdGF0aWMgI21lc2hlczogeyBba2V5OiBzdHJpbmddOiBNZXNoIH0gPSB7fTtcclxuXHJcbiAgICAvLyBUT0RPOiB0aGluayBhYm91dCBkcmF3aW5nIHRoZXNlIG9uIHRoZSBmbHkgaW5zdGVhZCBvZiBjYWNoaW5nIHRoZW0uIFRoZW4gd2UgY291bGQgYWNjZXB0IGEgcG9zaXRpb24sIHJhZGl1cyBldGMuIHBhcmFtZXRlciBhbmQgZHJhdyB0aGVtIGluZGVwZW5kZW50IGZyb20gdGhlIG10eFdvcmxkXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZUNpcmNsZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3Qgc2VnbWVudHM6IG51bWJlciA9IDQ1O1xyXG4gICAgICBjb25zdCBjaXJjbGU6IFZlY3RvcjNbXSA9IG5ldyBBcnJheShzZWdtZW50cykuZmlsbChudWxsKS5tYXAoKCkgPT4gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspIHtcclxuICAgICAgICBjb25zdCBhbmdsZTogbnVtYmVyID0gKGkgLyBzZWdtZW50cykgKiAyICogTWF0aC5QSTtcclxuICAgICAgICBjb25zdCB4OiBudW1iZXIgPSByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgY29uc3QgeTogbnVtYmVyID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xyXG4gICAgICAgIGNpcmNsZVtpXS5zZXQoeCwgeSwgMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspXHJcbiAgICAgICAgbGluZXMucHVzaChjaXJjbGVbaV0sIGNpcmNsZVsoaSArIDEpICUgc2VnbWVudHNdKTtcclxuXHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcIndpcmVDaXJjbGVcIiwgeyB2YWx1ZTogbGluZXMgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Mud2lyZUNpcmNsZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZVNwaGVyZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBsZXQgbGluZXM6IFZlY3RvcjNbXSA9IEdpem1vcy53aXJlQ2lyY2xlLmNvbmNhdCgpO1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9YKDkwKTtcclxuICAgICAgbGluZXMucHVzaCguLi5HaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIG10eFJvdGF0aW9uKSkpO1xyXG4gICAgICBtdHhSb3RhdGlvbi5yb3RhdGVZKDkwKTtcclxuICAgICAgbGluZXMucHVzaCguLi5HaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIG10eFJvdGF0aW9uKSkpO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZVNwaGVyZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlU3BoZXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ29uZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAxO1xyXG4gICAgICBjb25zdCBhcGV4OiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGNvbnN0IHF1YWQ6IFZlY3RvcjNbXSA9IFtcclxuICAgICAgICBuZXcgVmVjdG9yMyhyYWRpdXMsIDAsIGhlaWdodCksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoLXJhZGl1cywgMCwgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygwLCByYWRpdXMsIGhlaWdodCksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoMCwgLXJhZGl1cywgaGVpZ2h0KVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgbGV0IGxpbmVzOiBWZWN0b3IzW10gPSBHaXptb3Mud2lyZUNpcmNsZS5tYXAoKF9wb2ludDogVmVjdG9yMykgPT4gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnQsIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooMSkpKSk7XHJcblxyXG4gICAgICBsaW5lcy5wdXNoKC4uLlthcGV4LCBxdWFkWzBdLCBhcGV4LCBxdWFkWzFdLCBhcGV4LCBxdWFkWzJdLCBhcGV4LCBxdWFkWzNdXSk7XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlQ29uZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ29uZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgd2lyZUN1YmUoKTogVmVjdG9yM1tdIHtcclxuICAgICAgY29uc3QgaGFsZlNpemU6IG51bWJlciA9IDAuNTtcclxuICAgICAgY29uc3QgY3ViZTogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIG5ldyBWZWN0b3IzKGhhbGZTaXplLCBoYWxmU2l6ZSwgaGFsZlNpemUpLCBuZXcgVmVjdG9yMygtaGFsZlNpemUsIGhhbGZTaXplLCBoYWxmU2l6ZSksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoLWhhbGZTaXplLCAtaGFsZlNpemUsIGhhbGZTaXplKSwgbmV3IFZlY3RvcjMoaGFsZlNpemUsIC1oYWxmU2l6ZSwgaGFsZlNpemUpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKGhhbGZTaXplLCBoYWxmU2l6ZSwgLWhhbGZTaXplKSwgbmV3IFZlY3RvcjMoLWhhbGZTaXplLCBoYWxmU2l6ZSwgLWhhbGZTaXplKSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtaGFsZlNpemUsIC1oYWxmU2l6ZSwgLWhhbGZTaXplKSwgbmV3IFZlY3RvcjMoaGFsZlNpemUsIC1oYWxmU2l6ZSwgLWhhbGZTaXplKVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgbGluZXM6IFZlY3RvcjNbXSA9IFtcclxuICAgICAgICBjdWJlWzBdLCBjdWJlWzFdLCBjdWJlWzFdLCBjdWJlWzJdLCBjdWJlWzJdLCBjdWJlWzNdLCBjdWJlWzNdLCBjdWJlWzBdLFxyXG4gICAgICAgIGN1YmVbNF0sIGN1YmVbNV0sIGN1YmVbNV0sIGN1YmVbNl0sIGN1YmVbNl0sIGN1YmVbN10sIGN1YmVbN10sIGN1YmVbNF0sXHJcbiAgICAgICAgY3ViZVswXSwgY3ViZVs0XSwgY3ViZVsxXSwgY3ViZVs1XSwgY3ViZVsyXSwgY3ViZVs2XSwgY3ViZVszXSwgY3ViZVs3XVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZUN1YmVcIiwgeyB2YWx1ZTogbGluZXMgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Mud2lyZUN1YmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgd2UgY3VycmVudGx5IHJlbmRlcmluZyBmb3IgcGlja2luZz9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldCAjcGlja2luZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGlja0lkICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGUgZ2l2ZW4gZ2l6bW9zIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3KF9naXptb3M6IEdpem1vW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3NlbGVjdGVkPzogTm9kZVtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAoY29uc3QgZ2l6bW8gb2YgX2dpem1vcylcclxuICAgICAgICBpZiAoZ2l6bW8ubm9kZSlcclxuICAgICAgICAgIFJlZmxlY3Quc2V0KGdpem1vLm5vZGUsIFwiekNhbWVyYVwiLCBfY21wQ2FtZXJhLnBvaW50V29ybGRUb0NsaXAoZ2l6bW8ubm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBfZ2l6bW9zID0gX2dpem1vcy5zb3J0KChfYSwgX2IpID0+XHJcbiAgICAgICAgKF9iLm5vZGUgPyBSZWZsZWN0LmdldChfYi5ub2RlLCBcInpDYW1lcmFcIikgOiAyKSAtXHJcbiAgICAgICAgKF9hLm5vZGUgPyBSZWZsZWN0LmdldChfYS5ub2RlLCBcInpDYW1lcmFcIikgOiAyKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgR2l6bW9zLiNjYW1lcmEgPSBfY21wQ2FtZXJhO1xyXG4gICAgICBHaXptb3MucG9zSWNvbnMuY2xlYXIoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgZ2l6bW8gb2YgX2dpem1vcykge1xyXG4gICAgICAgIGdpem1vLmRyYXdHaXptb3M/LihfY21wQ2FtZXJhLCBHaXptb3MuI3BpY2tpbmcpO1xyXG4gICAgICAgIGlmIChfc2VsZWN0ZWQ/LmluY2x1ZGVzKGdpem1vLm5vZGUpKVxyXG4gICAgICAgICAgZ2l6bW8uZHJhd0dpem1vc1NlbGVjdGVkPy4oX2NtcENhbWVyYSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIGFsbCBnaXptb3MgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybnMgYW4gdW5zb3J0ZWQgYXJyYXkgb2Yge0BsaW5rIFBpY2t9cyBlYWNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l6bW8gdGhlIHBpY2sgcmF5IGhpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrKF9naXptb3M6IEdpem1vc1tdLCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiBQaWNrW10ge1xyXG4gICAgICByZXR1cm4gUmVuZGVyV2ViR0wucGlja0Zyb20oX2dpem1vcywgX2NtcENhbWVyYSwgcGljayk7XHJcblxyXG4gICAgICBmdW5jdGlvbiBwaWNrKF9naXptb3M6IEdpem1vW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7XHJcbiAgICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoU2hhZGVyUGlja1RleHR1cmVkLnVuaWZvcm1zW1widV9tdHhQaXZvdFwiXSwgZmFsc2UsIE1hdHJpeDN4My5JREVOVElUWSgpLmdldCgpKTsgLy8gb25seSBuZWVkZWQgZm9yIHRleHR1cmVkIHBpY2sgc2hhZGVyLCBidXQgZ2l6bW9zIGhhdmUgbm8gcGl2b3RcclxuXHJcbiAgICAgICAgR2l6bW9zLiNjYW1lcmEgPSBfY21wQ2FtZXJhO1xyXG4gICAgICAgIEdpem1vcy5wb3NJY29ucy5jbGVhcigpO1xyXG5cclxuICAgICAgICBsZXQgcGlja3M6IFBpY2tbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGdpem1vIG9mIF9naXptb3MpIHtcclxuICAgICAgICAgIGlmICghZ2l6bW8uZHJhd0dpem1vcylcclxuICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgR2l6bW9zLnBpY2tJZCA9IHBpY2tzLmxlbmd0aDtcclxuICAgICAgICAgIGdpem1vLmRyYXdHaXptb3MoX2NtcENhbWVyYSwgR2l6bW9zLiNwaWNraW5nKTtcclxuICAgICAgICAgIGxldCBwaWNrOiBQaWNrID0gbmV3IFBpY2soZ2l6bW8ubm9kZSk7XHJcbiAgICAgICAgICBwaWNrLmdpem1vID0gZ2l6bW87XHJcbiAgICAgICAgICBwaWNrcy5wdXNoKHBpY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR2l6bW9zLnBpY2tJZCA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBwaWNrcztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBjYW1lcmEgZnJ1c3R1bSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFRoZSBmcnVzdHVtIGlzIG9yaWVudGVkIGFsb25nIHRoZSB6LWF4aXMsIHdpdGggdGhlIHRpcCBvZiB0aGUgdHJ1bmNhdGVkIHB5cmFtaWQgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUZydXN0dW0oX2FzcGVjdDogbnVtYmVyLCBfZm92OiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVywgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBmOiBudW1iZXIgPSBNYXRoLnRhbihDYWxjLmRlZzJyYWQgKiBfZm92IC8gMik7XHJcblxyXG4gICAgICBsZXQgc2NhbGVYOiBudW1iZXIgPSBmO1xyXG4gICAgICBsZXQgc2NhbGVZOiBudW1iZXIgPSBmO1xyXG5cclxuICAgICAgc3dpdGNoIChfZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZVkgPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5WRVJUSUNBTDpcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMOlxyXG4gICAgICAgICAgY29uc3QgZGlhZ29uYWxBc3BlY3Q6IG51bWJlciA9IE1hdGguc3FydChfYXNwZWN0KTtcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIHNjYWxlWSA9IGYgLyBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZWFyWDogbnVtYmVyID0gX25lYXIgKiBzY2FsZVg7XHJcbiAgICAgIGNvbnN0IG5lYXJZOiBudW1iZXIgPSBfbmVhciAqIHNjYWxlWTtcclxuICAgICAgY29uc3QgZmFyWDogbnVtYmVyID0gX2ZhciAqIHNjYWxlWDtcclxuICAgICAgY29uc3QgZmFyWTogbnVtYmVyID0gX2ZhciAqIHNjYWxlWTtcclxuXHJcbiAgICAgIGNvbnN0IGZydXN0dW06IFZlY3RvcjNbXSA9IG5ldyBBcnJheSg4KS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG5cclxuICAgICAgZnJ1c3R1bVswXS5zZXQoLW5lYXJYLCBuZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzFdLnNldChuZWFyWCwgbmVhclksIF9uZWFyKTtcclxuICAgICAgZnJ1c3R1bVsyXS5zZXQobmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzNdLnNldCgtbmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG5cclxuICAgICAgZnJ1c3R1bVs0XS5zZXQoLWZhclgsIGZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzVdLnNldChmYXJYLCBmYXJZLCBfZmFyKTtcclxuICAgICAgZnJ1c3R1bVs2XS5zZXQoZmFyWCwgLWZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzddLnNldCgtZmFyWCwgLWZhclksIF9mYXIpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhbXHJcbiAgICAgICAgZnJ1c3R1bVswXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVswXSwgLy8gbmVhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bNF0sIGZydXN0dW1bNV0sIGZydXN0dW1bNV0sIGZydXN0dW1bNl0sIGZydXN0dW1bNl0sIGZydXN0dW1bN10sIGZydXN0dW1bN10sIGZydXN0dW1bNF0sIC8vIGZhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bMF0sIGZydXN0dW1bNF0sIGZydXN0dW1bMV0sIGZydXN0dW1bNV0sIGZydXN0dW1bMl0sIGZydXN0dW1bNl0sIGZydXN0dW1bM10sIGZydXN0dW1bN10gIC8vIHNpZGVzXHJcbiAgICAgIF0sIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKC4uLmZydXN0dW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgY3ViZS4gVGhlIGN1YmUgaGFzIGEgc2lkZS1sZW5ndGggb2YgMSBhbmQgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhHaXptb3Mud2lyZUN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgc3BoZXJlLiBUaGUgc3BoZXJlIGhhcyBhIGRpYW1ldGVyIG9mIDEgYW5kIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgb3JpZ2luLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdXaXJlU3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlU3BoZXJlLCBtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tBdChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIEdpem1vcy5kcmF3V2lyZUNpcmNsZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGNvbmUgd2l0aCBhIGhlaWdodCBhbmQgZGlhbWV0ZXIgb2YgMS4gVGhlIGNvbmUgaXMgb3JpZW50ZWQgYWxvbmcgdGhlIHotYXhpcyB3aXRoIHRoZSB0aXAgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUNvbmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ29uZSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgY2lyY2xlIHdpdGggYSBkaWFtZXRlciBvZiAxLiBUaGUgY2lyY2xlIGxpZXMgaW4gdGhlIHgteSBwbGFuZSwgd2l0aCBpdHMgY2VudGVyIGF0IHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDaXJjbGUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ2lyY2xlLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiBcclxuICAgICAqIFZlcnRpY2VzIGFyZSBwYWlyZWQgc2VxdWVudGlhbGx5LCBzbyBmb3IgZXhhbXBsZSwgbGluZXMgd2lsbCBiZSBkcmF3biBiZXR3ZWVuIHZlcnRpY2VzIDAgYW5kIDEsIDIgYW5kIDMsIDQgYW5kIDUsIGV0Yy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TGluZXMoX3ZlcnRpY2VzOiBWZWN0b3IzW10sIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgc2hhZGVyOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyR2l6bW87XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICBjb25zdCBsaW5lRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShfdmVydGljZXMubGVuZ3RoICogMyk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwb2ludDogVmVjdG9yMyA9IF92ZXJ0aWNlc1tpXTtcclxuICAgICAgICBsaW5lRGF0YS5zZXQocG9pbnQuZ2V0KCksIGkgKiAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIEdpem1vcy5hcnJheUJ1ZmZlcik7XHJcbiAgICAgIEdpem1vcy5idWZmZXJNYXRyaXgoc2hhZGVyLCBfbXR4V29ybGQpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIGxpbmVEYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3QXJyYXlzLCBfdmVydGljZXMubGVuZ3RoLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgd2lyZWZyYW1lIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVNZXNoKF9tZXNoOiBNZXNoLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNvbnN0IHNoYWRlcjogdHlwZW9mIFNoYWRlciA9IFNoYWRlckdpem1vO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IF9tZXNoLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuICAgICAgY29uc3QgcmVuZGVyTWVzaDogUmVuZGVyTWVzaCA9IF9tZXNoLnJlbmRlck1lc2g7IC8vIFRPRE86IGRvbid0IGJyZWFjaCBlbmNhcHN1bGF0aW9uIGhlcmUuLi5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgeyAvLyBUT0RPOiB0aGluayBhYm91dCBjYWNoaW5nIHRoaXMgaW4gdGhlIG1lc2hcclxuICAgICAgICBjb25zdCBhOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaV07XHJcbiAgICAgICAgY29uc3QgYjogbnVtYmVyID0gcmVuZGVyTWVzaC5pbmRpY2VzW2kgKyAxXTtcclxuICAgICAgICBjb25zdCBjOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaSArIDJdO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIGxpbmUgc2VnbWVudHMgZm9yIHRoZSB0cmlhbmdsZSB0byB0aGUgbGluZSBpbmRpY2VzXHJcbiAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGIsIGMsIGMsIGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgR2l6bW9zLmluZGV4QnVmZmVyKTtcclxuICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMpO1xyXG4gICAgICBHaXptb3MuYnVmZmVyTWF0cml4KHNoYWRlciwgX210eFdvcmxkKTtcclxuXHJcbiAgICAgIEdpem1vcy5kcmF3R2l6bW9zKHNoYWRlciwgR2l6bW9zLmRyYXdFbGVtZW50c0xpbmVzLCBpbmRpY2VzLmxlbmd0aCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhbiBhcnJvdyBhdCB0aGUgZ2l2ZW4gd29ybGQgcG9zaXRpb24sIGZhY2luZyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBhbmQgd2lkdGguIFxyXG4gICAgICogU2l6ZSByZWZlcnMgdG8gdGhlIHNpemUgb2YgdGhlIGFycm93IGhlYWQ6IHRoZSBoZWlnaHQgb2YgdGhlIHB5cmFtaWQ7IHRoZSBzaXplIG9mIHRoZSBjdWJlOyB0aGUgZGlhbWV0ZXIgb2YgdGhlIHNwaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3QXJyb3coX3Bvc2l0aW9uOiBWZWN0b3IzLCBfY29sb3I6IENvbG9yLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9zaXplOiBudW1iZXIsIF9oZWFkOiB0eXBlb2YgTWVzaEN1YmUgfCB0eXBlb2YgTWVzaFB5cmFtaWQgfCB0eXBlb2YgTWVzaFNwaGVyZSB8IG51bGwgPSBNZXNoUHlyYW1pZCwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IHNjYWxpbmc6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKS5zZXQoX3dpZHRoLCBfd2lkdGgsIF9sZW5ndGggLSBfc2l6ZSk7XHJcbiAgICAgIGNvbnN0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09NUE9TSVRJT04oX3Bvc2l0aW9uKTtcclxuICAgICAgbXR4V29ybGQuc2NhbGluZyA9IHNjYWxpbmc7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tJbihfZGlyZWN0aW9uLCBfdXApO1xyXG4gICAgICBtdHhXb3JsZC50cmFuc2xhdGVaKDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3Q3ViZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLnRyYW5zbGF0ZVooMC41KTtcclxuXHJcbiAgICAgIGlmIChfaGVhZCA9PSBNZXNoUHlyYW1pZCkge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoSGVhZDogbnVtYmVyID0gX3NpemUgLyAyO1xyXG4gICAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBzY2FsaW5nLnNldCh3aWR0aEhlYWQsIHdpZHRoSGVhZCwgX3NpemUpO1xyXG4gICAgICAgIG10eFdvcmxkLnJvdGF0ZVgoOTApOyAvLyByb3RhdGUgdGhlIHB5cmFtaWQgc28gaXQgcG9pbnRzIGluIHRoZSByaWdodCBkaXJlY3Rpb25cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtdHhXb3JsZC5zY2FsaW5nID0gc2NhbGluZy5zZXQoX3NpemUsIF9zaXplLCBfc2l6ZSk7XHJcbiAgICAgICAgbXR4V29ybGQudHJhbnNsYXRlWigwLjUpOyAvLyB0cmFuc2xhdGUgY3ViZS9zcGhlcmUgc28gaXQgc2l0cyBvbiB0b3Agb2YgdGhlIGFycm93XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5kcmF3TWVzaChHaXptb3MuZ2V0TWVzaChfaGVhZCksIG10eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIHNjYWxpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBjdWJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hDdWJlKSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgc29saWQgc3BoZXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdTcGhlcmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmdldE1lc2goTWVzaFNwaGVyZSksIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIHF1YWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1F1YWQoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmdldE1lc2goTWVzaFF1YWQpLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBkb3VibGUgc2lkZWQgcXVhZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3U3ByaXRlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hTcHJpdGUpLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBzb2xpZCBweXJhbWlkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdQeXJhbWlkKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5nZXRNZXNoKE1lc2hQeXJhbWlkKSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgc29saWQgbWVzaC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TWVzaChfbWVzaDogTWVzaCwgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IEdpem1vcy4jcGlja2luZyA/IFNoYWRlclBpY2sgOiBTaGFkZXJHaXptbztcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gX21lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIF9tdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCksIEdpem1vcy5waWNrSWQpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGFuIGljb24gZnJvbSBhIHtAbGluayBUZXh0dXJlfSBvbiBhIHtAbGluayBNZXNoUXVhZH0uIFRoZSBpY29uIGlzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2Zvcm0gYW5kIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdJY29uKF90ZXh0dXJlOiBUZXh0dXJlLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogc3RyaW5nID0gX210eFdvcmxkLnRyYW5zbGF0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmIChHaXptb3MucG9zSWNvbnMuaGFzKHBvc2l0aW9uKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5hZGQocG9zaXRpb24pO1xyXG5cclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gR2l6bW9zLiNwaWNraW5nID8gU2hhZGVyUGlja1RleHR1cmVkIDogU2hhZGVyR2l6bW9UZXh0dXJlZDtcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCBtdHhXb3JsZDogTWF0cml4NHg0ID0gX210eFdvcmxkLmNsb25lO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gX2NvbG9yLmNsb25lO1xyXG5cclxuICAgICAgbGV0IGJhY2s6IFZlY3RvcjMgPSBHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC5mb3J3YXJkLm5lZ2F0ZSgpO1xyXG4gICAgICBsZXQgdXA6IFZlY3RvcjMgPSBHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC51cDtcclxuICAgICAgbXR4V29ybGQubG9va0luKGJhY2ssIHVwKTtcclxuXHJcbiAgICAgIGxldCBkaXN0YW5jZTogbnVtYmVyID0gVmVjdG9yMy5ESUZGRVJFTkNFKEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLnRyYW5zbGF0aW9uLCBtdHhXb3JsZC50cmFuc2xhdGlvbikubWFnbml0dWRlO1xyXG4gICAgICBsZXQgZmFkZUZhcjogbnVtYmVyID0gNDtcclxuICAgICAgbGV0IGZhZGVOZWFyOiBudW1iZXIgPSAxLjU7XHJcbiAgICAgIGlmIChkaXN0YW5jZSA+IDAgJiYgZGlzdGFuY2UgPCBmYWRlRmFyKSB7XHJcbiAgICAgICAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgLSBmYWRlTmVhcikgLyAoZmFkZUZhciAtIGZhZGVOZWFyKTtcclxuICAgICAgICBjb2xvci5hID0gQ2FsYy5sZXJwKDAsIGNvbG9yLmEsIGRpc3RhbmNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSBHaXptb3MuZ2V0TWVzaChNZXNoUXVhZCkudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIG10eFdvcmxkLCBNYXRyaXg0eDQuUFJPRFVDVChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZFRvVmlldywgbXR4V29ybGQpLCBHaXptb3MucGlja0lkKTtcclxuICAgICAgX3RleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShzaGFkZXIudW5pZm9ybXNbVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5JTkRFWCk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3RWxlbWVudHNUcmlhbmxnZXMsIHJlbmRlckJ1ZmZlcnMubkluZGljZXMsIGNvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFdvcmxkLCBjb2xvciwgYmFjaywgdXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJ1ZmZlclBvc2l0aW9ucyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9idWZmZXI6IFdlYkdMQnVmZmVyKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIF9idWZmZXIpO1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBudW1iZXIgPSBfc2hhZGVyLmF0dHJpYnV0ZXNbXCJhX3ZjdFBvc2l0aW9uXCJdO1xyXG4gICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYnV0ZSk7XHJcbiAgICAgIGNyYzMudmVydGV4QXR0cmliUG9pbnRlcihhdHRyaWJ1dGUsIDMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIGZhbHNlLCAwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBidWZmZXJDb2xvcihfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9jb2xvcjogQ29sb3IpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLnVuaWZvcm00ZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfdmN0Q29sb3JcIl0sIF9jb2xvci5nZXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyTWF0cml4KF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX210eFdvcmxkOiBNYXRyaXg0eDQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtTWF0cml4NGZ2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE1lc2hUb1ZpZXdcIl0sIGZhbHNlLCBtdHhNZXNoVG9WaWV3LmdldCgpKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4TWVzaFRvVmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0dpem1vcyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9kcmF3OiBGdW5jdGlvbiwgX2NvdW50OiBudW1iZXIsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgaWYgKF9hbHBoYU9jY2x1ZGVkID4gMCkge1xyXG4gICAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBfY29sb3IuY2xvbmU7XHJcbiAgICAgICAgY29sb3IuYSAqPSBfYWxwaGFPY2NsdWRlZDtcclxuICBcclxuICAgICAgICAvLyBkcmF3IG9jY2x1ZGVkIHBhcnRzIHdoZXJlIHRoZSBkZXB0aCB0ZXN0IGZhaWxlZCAoYnkgaW52ZXJ0aW5nIHRoZSBkZXB0aCB0ZXN0ICsgbm8gZGVwdGggd3JpdGUpXHJcbiAgICAgICAgY3JjMy5kZXB0aEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5HRVFVQUwpO1xyXG4gICAgICAgIGNyYzMuZGVwdGhNYXNrKGZhbHNlKTtcclxuICAgICAgICBHaXptb3MuYnVmZmVyQ29sb3IoX3NoYWRlciwgY29sb3IpO1xyXG4gICAgICAgIF9kcmF3KF9jb3VudCk7XHJcbiAgICAgICAgY3JjMy5kZXB0aEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MRVNTKTtcclxuICAgICAgICBjcmMzLmRlcHRoTWFzayh0cnVlKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5idWZmZXJDb2xvcihfc2hhZGVyLCBfY29sb3IpO1xyXG4gICAgICBfZHJhdyhfY291bnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdFbGVtZW50c1RyaWFubGdlcyhfY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCBfY291bnQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdFbGVtZW50c0xpbmVzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FUywgX2NvdW50LCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBkcmF3QXJyYXlzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORVMsIDAsIF9jb3VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVzaChfY29uc3RydWN0b3I6IG5ldyAoX25hbWU6IHN0cmluZykgPT4gTWVzaCk6IE1lc2gge1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgbGV0IG1lc2g6IE1lc2ggPSBHaXptb3MuI21lc2hlc1trZXldO1xyXG4gICAgICBpZiAobWVzaClcclxuICAgICAgICByZXR1cm4gbWVzaDtcclxuXHJcbiAgICAgIG1lc2ggPSBuZXcgX2NvbnN0cnVjdG9yKGtleSk7XHJcbiAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgR2l6bW9zLiNtZXNoZXNba2V5XSA9IG1lc2g7XHJcbiAgICAgIHJldHVybiBtZXNoO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCB0eXBlIE1hcExpZ2h0VHlwZVRvTGlnaHRMaXN0ID0gTWFwPFR5cGVPZkxpZ2h0LCBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4+O1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlclByZXBhcmVPcHRpb25zIHtcclxuICAgIGlnbm9yZVBoeXNpY3M/OiBib29sZWFuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSByZW5kZXIgZW5naW5lLCBoZXJlIFdlYkdMIChzZWUgc3VwZXJjbGFzcyB7QGxpbmsgUmVuZGVyV2ViR0x9IGFuZCB0aGUgUmVuZGVySW5qZWN0b3JzXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlciBleHRlbmRzIFJlbmRlcldlYkdMIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjdENsaXA6IFJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUoLTEsIDEsIDIsIC0yKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja0J1ZmZlcjogSW50MzJBcnJheTsgICAvLyBUT0RPOiByZXNlYXJjaCBpZiBwaWNraW5nIHNob3VsZCBiZSBvcHRpbWl6ZWQgdXNpbmcgcmFkaXVzIHBpY2tpbmcgdG8gZmlsdGVyXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5vZGVzUGh5c2ljczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29tcG9uZW50c1BpY2s6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFBpY2s+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpZ2h0czogTWFwTGlnaHRUeXBlVG9MaWdodExpc3QgPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBub2Rlc1NpbXBsZTogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG5vZGVzQWxwaGE6IFJlY3ljYWJsZUFycmF5PE5vZGU+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzU2tlbGV0b246IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFNrZWxldG9uPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGltZXN0YW1wVXBkYXRlOiBudW1iZXI7XHJcblxyXG4gICAgLy8jcmVnaW9uIFByZXBhcmVcclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYnJhbmNoIHN0YXJ0aW5nIHdpdGggdGhlIG5vZGUgZ2l2ZW4sIHJlY2FsY3VsYXRlcyBhbGwgd29ybGQgdHJhbnNmb3JtcywgXHJcbiAgICAgKiBjb2xsZWN0cyBhbGwgbGlnaHRzIGFuZCBmZWVkcyBhbGwgc2hhZGVycyB1c2VkIGluIHRoZSBncmFwaCB3aXRoIHRoZXNlIGxpZ2h0cy4gU29ydHMgbm9kZXMgZm9yIGRpZmZlcmVudFxyXG4gICAgICogcmVuZGVyIHBhc3Nlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwcmVwYXJlKF9icmFuY2g6IE5vZGUsIF9vcHRpb25zOiBSZW5kZXJQcmVwYXJlT3B0aW9ucyA9IHt9LCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfc2hhZGVyc1VzZWQ6IChTaGFkZXJJbnRlcmZhY2UpW10gPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBmaXJzdExldmVsOiBib29sZWFuID0gKF9zaGFkZXJzVXNlZCA9PSBudWxsKTtcclxuICAgICAgaWYgKGZpcnN0TGV2ZWwpIHtcclxuICAgICAgICBfc2hhZGVyc1VzZWQgPSBbXTtcclxuICAgICAgICBSZW5kZXIudGltZXN0YW1wVXBkYXRlID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzQWxwaGEucmVzZXQoKTtcclxuICAgICAgICBSZW5kZXIubm9kZXNQaHlzaWNzLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNTa2VsZXRvbi5yZXNldCgpO1xyXG4gICAgICAgIFJlbmRlci5saWdodHMuZm9yRWFjaChfYXJyYXkgPT4gX2FycmF5LnJlc2V0KCkpO1xyXG4gICAgICAgIF9icmFuY2guZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkVfU1RBUlQpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFfYnJhbmNoLmlzQWN0aXZlKVxyXG4gICAgICAgIHJldHVybjsgLy8gZG9uJ3QgYWRkIGJyYW5jaCB0byByZW5kZXIgbGlzdCBpZiBub3QgYWN0aXZlXHJcblxyXG4gICAgICBfYnJhbmNoLm5Ob2Rlc0luQnJhbmNoID0gMTtcclxuICAgICAgX2JyYW5jaC5yYWRpdXMgPSAwO1xyXG5cclxuICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50VG9UYXJnZXRPbmx5KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRSkpO1xyXG4gICAgICBfYnJhbmNoLnRpbWVzdGFtcFVwZGF0ZSA9IFJlbmRlci50aW1lc3RhbXBVcGRhdGU7XHJcblxyXG4gICAgICBpZiAoX2JyYW5jaC5jbXBUcmFuc2Zvcm0gJiYgX2JyYW5jaC5jbXBUcmFuc2Zvcm0uaXNBY3RpdmUpIHtcclxuICAgICAgICBsZXQgbXR4V29ybGRCcmFuY2g6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9tdHhXb3JsZCwgX2JyYW5jaC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwpO1xyXG4gICAgICAgIF9icmFuY2gubXR4V29ybGQuY29weShtdHhXb3JsZEJyYW5jaCk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4V29ybGRCcmFuY2gpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBfYnJhbmNoLm10eFdvcmxkLmNvcHkoX210eFdvcmxkKTsgLy8gb3ZlcndyaXRlIHJlYWRvbmx5IG10eFdvcmxkIG9mIHRoZSBjdXJyZW50IG5vZGVcclxuXHJcbiAgICAgIGxldCBjbXBSaWdpZGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSk7XHJcbiAgICAgIGlmIChjbXBSaWdpZGJvZHkgJiYgY21wUmlnaWRib2R5LmlzQWN0aXZlKSB7IC8vVE9ETzogc3VwcG9ydCBkZS0vYWN0aXZhdGlvbiB0aHJvdWdob3V0XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzUGh5c2ljcy5wdXNoKF9icmFuY2gpOyAvLyBhZGQgdGhpcyBub2RlIHRvIHBoeXNpY3MgbGlzdFxyXG4gICAgICAgIGlmICghX29wdGlvbnM/Lmlnbm9yZVBoeXNpY3MpXHJcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJ5UGh5c2ljcyhfYnJhbmNoLCBjbXBSaWdpZGJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY21wUGljazogQ29tcG9uZW50UGljayA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFBpY2spO1xyXG4gICAgICBpZiAoY21wUGljayAmJiBjbXBQaWNrLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnB1c2goY21wUGljayk7IC8vIGFkZCB0aGlzIGNvbXBvbmVudCB0byBwaWNrIGxpc3RcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcExpZ2h0czogQ29tcG9uZW50TGlnaHRbXSA9IF9icmFuY2guZ2V0Q29tcG9uZW50cyhDb21wb25lbnRMaWdodCk7XHJcbiAgICAgIFJlbmRlci5hZGRMaWdodHMoY21wTGlnaHRzKTtcclxuXHJcbiAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcblxyXG4gICAgICBpZiAoY21wTWVzaCAmJiBjbXBNZXNoLmlzQWN0aXZlICYmIGNtcE1hdGVyaWFsICYmIGNtcE1hdGVyaWFsLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eFdvcmxkTWVzaDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoX2JyYW5jaC5tdHhXb3JsZCwgY21wTWVzaC5tdHhQaXZvdCk7XHJcbiAgICAgICAgY21wTWVzaC5tdHhXb3JsZC5jb3B5KG10eFdvcmxkTWVzaCk7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4V29ybGRNZXNoKTsgLy8gVE9ETzogZXhhbWluZSwgd2h5IHJlY3ljbGluZyB0aGlzIGNhdXNlcyBtZXNoZXMgdG8gYmUgbWlzcGxhY2VkLi4uXHJcbiAgICAgICAgbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuZ2V0U2hhZGVyKCk7XHJcbiAgICAgICAgbGV0IGNtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTtcclxuICAgICAgICBpZiAoY21wUGFydGljbGVTeXN0ZW0gJiYgY21wUGFydGljbGVTeXN0ZW0uaXNBY3RpdmUgJiYgY21wUGFydGljbGVTeXN0ZW0ucGFydGljbGVTeXN0ZW0gIT0gbnVsbClcclxuICAgICAgICAgIHNoYWRlciA9IGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtLmdldFNoYWRlckZyb20oc2hhZGVyKTtcclxuICAgICAgICBpZiAoX3NoYWRlcnNVc2VkLmluZGV4T2Yoc2hhZGVyKSA8IDApXHJcbiAgICAgICAgICBfc2hhZGVyc1VzZWQucHVzaChzaGFkZXIpO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gY21wTWVzaC5yYWRpdXM7XHJcbiAgICAgICAgaWYgKGNtcE1hdGVyaWFsLnNvcnRGb3JBbHBoYSB8fCBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRUZXh0KSkgLy8gYWx3YXlzIHNvcnQgdGV4dCBmb3IgYWxwaGFcclxuICAgICAgICAgIFJlbmRlci5ub2Rlc0FscGhhLnB1c2goX2JyYW5jaCk7IC8vIGFkZCB0aGlzIG5vZGUgdG8gcmVuZGVyIGxpc3RcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBSZW5kZXIubm9kZXNTaW1wbGUucHVzaChfYnJhbmNoKTsgLy8gYWRkIHRoaXMgbm9kZSB0byByZW5kZXIgbGlzdFxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY21wU2tlbGV0b25zOiBDb21wb25lbnRTa2VsZXRvbltdID0gX2JyYW5jaC5nZXRDb21wb25lbnRzKENvbXBvbmVudFNrZWxldG9uKTtcclxuICAgICAgZm9yIChsZXQgY21wU2tlbGV0b24gb2YgY21wU2tlbGV0b25zKVxyXG4gICAgICAgIGlmIChjbXBTa2VsZXRvbiAmJiBjbXBTa2VsZXRvbi5pc0FjdGl2ZSlcclxuICAgICAgICAgIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24ucHVzaChjbXBTa2VsZXRvbik7XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIHtcclxuICAgICAgICBSZW5kZXIucHJlcGFyZShjaGlsZCwgX29wdGlvbnMsIF9icmFuY2gubXR4V29ybGQsIF9zaGFkZXJzVXNlZCk7XHJcblxyXG4gICAgICAgIF9icmFuY2gubk5vZGVzSW5CcmFuY2ggKz0gY2hpbGQubk5vZGVzSW5CcmFuY2g7XHJcbiAgICAgICAgbGV0IGNtcE1lc2hDaGlsZDogQ29tcG9uZW50TWVzaCA9IGNoaWxkLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBjbXBNZXNoQ2hpbGQgPyBjbXBNZXNoQ2hpbGQubXR4V29ybGQudHJhbnNsYXRpb24gOiBjaGlsZC5tdHhXb3JsZC50cmFuc2xhdGlvbjtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gTWF0aC5tYXgoX2JyYW5jaC5yYWRpdXMsIHBvc2l0aW9uLmdldERpc3RhbmNlKF9icmFuY2gubXR4V29ybGQudHJhbnNsYXRpb24pICsgY2hpbGQucmFkaXVzKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShwb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaXJzdExldmVsKSB7XHJcbiAgICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNtcFNrZWxldG9uIG9mIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24pIHtcclxuICAgICAgICAgIGNtcFNrZWxldG9uLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgY21wU2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlbmRlci5idWZmZXJMaWdodHMoUmVuZGVyLmxpZ2h0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZExpZ2h0cyhfY21wTGlnaHRzOiBDb21wb25lbnRMaWdodFtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGNtcExpZ2h0IG9mIF9jbXBMaWdodHMpIHtcclxuICAgICAgICBpZiAoIWNtcExpZ2h0LmlzQWN0aXZlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCB0eXBlOiBUeXBlT2ZMaWdodCA9IGNtcExpZ2h0LmxpZ2h0LmdldFR5cGUoKTtcclxuICAgICAgICBsZXQgbGlnaHRzT2ZUeXBlOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4gPSBSZW5kZXIubGlnaHRzLmdldCh0eXBlKTtcclxuICAgICAgICBpZiAoIWxpZ2h0c09mVHlwZSkge1xyXG4gICAgICAgICAgbGlnaHRzT2ZUeXBlID0gbmV3IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PigpO1xyXG4gICAgICAgICAgUmVuZGVyLmxpZ2h0cy5zZXQodHlwZSwgbGlnaHRzT2ZUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlnaHRzT2ZUeXBlLnB1c2goY21wTGlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIG5vZGUgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybiB0aGF0IGFzIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2soX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IFBpY2tbXSB7IC8vIFRPRE86IHNlZSBpZiB0aGlyZCBwYXJhbWV0ZXIgX3dvcmxkPzogTWF0cml4NHg0IHdvdWxkIGJlIHVzZWZ1bGxcclxuICAgICAgcmV0dXJuIFJlbmRlci5waWNrRnJvbShfbm9kZXMsIF9jbXBDYW1lcmEsIHN1cGVyLnBpY2spO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIERyYXdpbmdcclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIHNjZW5lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGdpdmVuIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgUmVuZGVyLm5vZGVzQWxwaGEpXHJcbiAgICAgICAgUmVmbGVjdC5zZXQobm9kZSwgXCJ6Q2FtZXJhXCIsIF9jbXBDYW1lcmEucG9pbnRXb3JsZFRvQ2xpcChub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWQ6IE5vZGVbXSA9IFJlbmRlci5ub2Rlc0FscGhhLmdldFNvcnRlZCgoX2E6IE5vZGUsIF9iOiBOb2RlKSA9PiBSZWZsZWN0LmdldChfYiwgXCJ6Q2FtZXJhXCIpIC0gUmVmbGVjdC5nZXQoX2EsIFwiekNhbWVyYVwiKSk7XHJcblxyXG4gICAgICBSZW5kZXIuZHJhd05vZGVzKFJlbmRlci5ub2Rlc1NpbXBsZSwgc29ydGVkLCBfY21wQ2FtZXJhKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQaHlzaWNzXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0cmFuc2Zvcm1CeVBoeXNpY3MoX25vZGU6IE5vZGUsIF9jbXBSaWdpZGJvZHk6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQge1xyXG4gICAgICBpZiAoIV9jbXBSaWdpZGJvZHkuaXNJbml0aWFsaXplZCkgLy8gfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SKVxyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgICAgaWYgKCFQaHlzaWNzLmdldEJvZHlMaXN0KCkubGVuZ3RoKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGlmICghX25vZGUubXR4TG9jYWwpIHtcclxuICAgICAgICB0aHJvdyAobmV3IEVycm9yKFwiQ29tcG9uZW50UmlnaWRib2R5IHJlcXVpcmVzIENvbXBvbmVudFRyYW5zZm9ybSBhdCB0aGUgc2FtZSBOb2RlXCIpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gX2NtcFJpZ2lkYm9keS5jaGVja0NvbGxpc2lvbkV2ZW50cygpO1xyXG5cclxuICAgICAgaWYgKF9jbXBSaWdpZGJvZHkudHlwZUJvZHkgPT0gQk9EWV9UWVBFLktJTkVNQVRJQyB8fCBQcm9qZWN0Lm1vZGUgPT0gTU9ERS5FRElUT1IpIHsgLy9DYXNlIG9mIEtpbmVtYXRpYyBSaWdpZGJvZHlcclxuICAgICAgICBsZXQgbXR4UGl2b3RXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoX25vZGUubXR4V29ybGQsIF9jbXBSaWdpZGJvZHkubXR4UGl2b3RVbnNjYWxlZCk7XHJcbiAgICAgICAgX2NtcFJpZ2lkYm9keS5zZXRQb3NpdGlvbihtdHhQaXZvdFdvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgICBfY21wUmlnaWRib2R5LnNldFJvdGF0aW9uKG10eFBpdm90V29ybGQucm90YXRpb24pO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFBpdm90V29ybGQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuQ09NUE9TSVRJT04oX2NtcFJpZ2lkYm9keS5nZXRQb3NpdGlvbigpLCBfY21wUmlnaWRib2R5LmdldFJvdGF0aW9uKCkpO1xyXG4gICAgICBtdHhXb3JsZC5tdWx0aXBseShfY21wUmlnaWRib2R5Lm10eFBpdm90SW52ZXJzZSk7XHJcbiAgICAgIF9ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uID0gbXR4V29ybGQudHJhbnNsYXRpb247XHJcbiAgICAgIF9ub2RlLm10eFdvcmxkLnJvdGF0aW9uID0gbXR4V29ybGQucm90YXRpb247XHJcbiAgICAgIGxldCBwYXJlbnQ6IE5vZGUgPSBfbm9kZS5nZXRQYXJlbnQoKTtcclxuICAgICAgbGV0IG10eExvY2FsOiBNYXRyaXg0eDQgPSBwYXJlbnQgP1xyXG4gICAgICAgIE1hdHJpeDR4NC5SRUxBVElWRShfbm9kZS5tdHhXb3JsZCwgcGFyZW50Lm10eFdvcmxkLCBwYXJlbnQubXR4V29ybGRJbnZlcnNlKSA6XHJcbiAgICAgICAgX25vZGUubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIF9ub2RlLm10eExvY2FsLmNvcHkobXR4TG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eExvY2FsKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgdmVydGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGluZGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRleHR1cmVVVnM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIG5vcm1hbHM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGNvbG9ycz86IFdlYkdMQnVmZmVyO1xyXG4gICAgYm9uZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRhbmdlbnRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICB3ZWlnaHRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICBuSW5kaWNlcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydGVkIGludG8gYSB7QGxpbmsgTWVzaH0sIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FsY3VsYXRlcyBhbmQgcmVwcmVzZW50cyB0aGUgbWVzaCBkYXRhIGluIHRoZSBmb3JtIG5lZWRlZCBieSB0aGUgcmVuZGVyIGVuZ2luZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJNZXNoIHtcclxuICAgIHB1YmxpYyBidWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbnVsbDtcclxuICAgIHB1YmxpYyBtZXNoOiBNZXNoO1xyXG5cclxuICAgIC8qKiB2ZXJ0aWNlcyBvZiB0aGUgYWN0dWFsIHBvaW50IGNsb3VkLCBzb21lIHBvaW50cyBtaWdodCBiZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiBvcmRlciB0byByZWZlciB0byBkaWZmZXJlbnQgdGV4ZWxzICovXHJcbiAgICAjdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiBpbmRpY2VzIHRvIGNyZWF0ZSBmYWNlcyBmcm9tIHRoZSB2ZXJ0aWNlcywgcm90YXRpb24gZGV0ZXJtaW5lcyBkaXJlY3Rpb24gb2YgZmFjZS1ub3JtYWwgKi9cclxuICAgICNpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgIC8qKiB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGljZXMgYnkgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSAqL1xyXG4gICAgI3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggbm9ybWFscyBmb3Igc21vb3RoIHNoYWRpbmcsIGludGVycG9sYXRlZCBiZXR3ZWVuIHZlcnRpY2VzIGR1cmluZyByZW5kZXJpbmcgKi9cclxuICAgICNub3JtYWxzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiBjb2xvcnMgKi9cclxuICAgICNjb2xvcnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggdGFuZ2VudHMgZm9yIG5vcm1hbCBtYXBwaW5nLCBiYXNlZCBvbiB0aGUgdmVydGV4IG5vcm1hbHMgYW5kIHRoZSBVViBjb29yZGluYXRlcyAqL1xyXG4gICAgI3RhbmdlbnRzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiogYm9uZXMgKi9cclxuICAgICNib25lczogVWludDhBcnJheTtcclxuICAgICN3ZWlnaHRzOiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tZXNoOiBNZXNoKSB7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3ZlcnRpY2VzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIC8vIC4uLiBmbGF0dGVuIGFsbCB2ZXJ0ZXggcG9zaXRpb25zIGZyb20gY2xvdWQgaW50byBhIHR5cGVkIGFycmF5XHJcbiAgICAgICAgdGhpcy4jdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihfaW5kZXgpLmdldCgpXTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2ZXJ0aWNlcyhfdmVydGljZXM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN2ZXJ0aWNlcyA9IF92ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW5kaWNlcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgaW5kaWNlcyBmcm9tIHRoZSBmYWNlcyBpbnRvIGEgdHlwZWQgYXJyYXlcclxuICAgICAgICB0aGlzLiNpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubWVzaC5mYWNlcy5mbGF0TWFwKChfZmFjZTogRmFjZSkgPT4gWy4uLl9mYWNlLmluZGljZXNdKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbmRpY2VzKF9pbmRpY2VzOiBVaW50MTZBcnJheSkge1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gX2luZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3JtYWxzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGlmICh0aGlzLiNub3JtYWxzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgY2hlY2sgc2ltaWxpYXIgdG8gdGhlIG9uZSBmb3IgdGFuZ2VudHMgYmVsb3csIHRvIHNlZSBpZiBub3JtYWxzIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHZlcnRpY2VzXHJcblxyXG4gICAgICAgIC8vIHN1bSB1cCBhbGwgdW5zY2FsZWQgbm9ybWFscyBvZiBmYWNlcyBjb25uZWN0ZWQgdG8gb25lIHZlcnRleCwgd2VpZ2h0ZWQgYnkgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBuZWlnaGJvdXIgdmVydGljZXMuLi5cclxuICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaChfdmVydGV4ID0+IF92ZXJ0ZXgubm9ybWFsLnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGZhY2Ugb2YgdGhpcy5tZXNoLmZhY2VzKVxyXG4gICAgICAgICAgZmFjZS5pbmRpY2VzLmZvckVhY2goKF9pVmVydGV4LCBfaUZhY2VWZXJ0ZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZXNoLnZlcnRpY2VzLm5vcm1hbChfaVZlcnRleCkuYWRkKFZlY3RvcjMuU0NBTEUoZmFjZS5ub3JtYWxVbnNjYWxlZCwgZmFjZS5hbmdsZXNbX2lGYWNlVmVydGV4XSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBub3JtYWxpemUgdGhlbVxyXG4gICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4ge1xyXG4gICAgICAgICAgLy8gc29tZSB2ZXJ0aWNlcyBtaWdodCBiZSB1bnVzZWQgYW5kIHlpZWxkIGEgemVyby1ub3JtYWwuLi5cclxuICAgICAgICAgIGlmIChfdmVydGV4Lm5vcm1hbC5tYWduaXR1ZGVTcXVhcmVkID4gMClcclxuICAgICAgICAgICAgX3ZlcnRleC5ub3JtYWwubm9ybWFsaXplKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuxpJub3JtYWxzVmVydGV4ID0gbmV3IEZsb2F0MzJBcnJheShub3JtYWxzVmVydGV4LmZsYXRNYXAoKF9ub3JtYWw6IFZlY3RvcjMpID0+IFsuLi5fbm9ybWFsLmdldCgpXSkpO1xyXG5cclxuICAgICAgICB0aGlzLiNub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShcclxuICAgICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4LCBfaW5kZXgpID0+IFsuLi50aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCkuZ2V0KCldKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNub3JtYWxzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBub3JtYWxzKF9ub3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jbm9ybWFscyA9IF9ub3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGFuZ2VudHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgaWYgKHRoaXMuI3RhbmdlbnRzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudXYpKSB7IC8vIGFzc3VtZSBhbGwgdmVydGljZXMgaGF2ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9yIG5vbmVcclxuICAgICAgICAgIHRoaXMuI3RhbmdlbnRzID0gbmV3IEZsb2F0MzJBcnJheSgpOyAvLyBubyB0ZXh0dXJlIGNvb3JkaW5hdGVzLCBubyB0YW5nZW50c1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuI3RhbmdlbnRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudGFuZ2VudCkpIHsgLy8gYXNzdW1lIGFsbCB2ZXJ0aWNlcyBoYXZlIHRhbmdlbnRzIG9yIG5vbmVcclxuICAgICAgICAgIGNvbnN0IHRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBjb25zdCBiaXRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaV0gPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpXSA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4gX3ZlcnRleC50YW5nZW50LnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmFjZSBvZiB0aGlzLm1lc2guZmFjZXMpIHtcclxuICAgICAgICAgICAgbGV0IGkwOiBudW1iZXIgPSBmYWNlLmluZGljZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpMTogbnVtYmVyID0gZmFjZS5pbmRpY2VzWzFdO1xyXG4gICAgICAgICAgICBsZXQgaTI6IG51bWJlciA9IGZhY2UuaW5kaWNlc1syXTtcclxuXHJcbiAgICAgICAgICAgIC8vdmVydGljZXMgc3Vycm91bmRpbmcgb25lIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxldCB2MDogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMCk7XHJcbiAgICAgICAgICAgIGxldCB2MTogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMSk7XHJcbiAgICAgICAgICAgIGxldCB2MjogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMik7XHJcblxyXG4gICAgICAgICAgICAvL3RoZWlyIFVWc1xyXG4gICAgICAgICAgICBsZXQgdXYwOiBWZWN0b3IyID0gdGhpcy5tZXNoLnZlcnRpY2VzLnV2KGkwKTtcclxuICAgICAgICAgICAgbGV0IHV2MTogVmVjdG9yMiA9IHRoaXMubWVzaC52ZXJ0aWNlcy51dihpMSk7XHJcbiAgICAgICAgICAgIGxldCB1djI6IFZlY3RvcjIgPSB0aGlzLm1lc2gudmVydGljZXMudXYoaTIpO1xyXG5cclxuICAgICAgICAgICAgLy9XZSBjb21wdXRlIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUuLi5cclxuICAgICAgICAgICAgbGV0IGRlbHRhUG9zMDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh2MSwgdjApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFQb3MxOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHYyLCB2MCk7XHJcblxyXG4gICAgICAgICAgICAvLy4uLmFuZCB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlcyBpbiBVViBzcGFjZS4uLlxyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjA6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYxLCB1djApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjE6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYyLCB1djApO1xyXG5cclxuICAgICAgICAgICAgLy8uLi5hbmQgY29tcHV0ZSB0aGUgdGFuZ2VudFxyXG4gICAgICAgICAgICBsZXQgcjogbnVtYmVyID0gMSAvIFZlY3RvcjIuQ1JPU1MoZGVsdGFVVjAsIGRlbHRhVVYxKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VUYW5nZW50OiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLkRJRkZFUkVOQ0UoVmVjdG9yMy5TQ0FMRShkZWx0YVBvczAsIGRlbHRhVVYxLnkpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgZGVsdGFVVjAueSkpLCByKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VCaXRhbmdlbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgLWRlbHRhVVYwLngpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMCwgLWRlbHRhVVYxLngpKSwgcik7IC8vIGZvciB3aW5kaW5nIG9yZGVyIGNvdW50ZXIgY2xvY2t3aXNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZVRhbmdlbnQsIGZhY2UuYW5nbGVzWzBdKSk7XHJcbiAgICAgICAgICAgIHRhbmdlbnRzW2kxXS5hZGQoVmVjdG9yMy5TQ0FMRShmYWNlVGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaTJdLmFkZChWZWN0b3IzLlNDQUxFKGZhY2VUYW5nZW50LCBmYWNlLmFuZ2xlc1syXSkpO1xyXG5cclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMF0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMV0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMl0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMl0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaCgoX3ZlcnRleCwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSB0aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCk7XHJcbiAgICAgICAgICAgIGxldCB0YW5nZW50OiBWZWN0b3IzID0gdGFuZ2VudHNbX2luZGV4XTtcclxuICAgICAgICAgICAgbGV0IGJpdGFuZ2VudDogVmVjdG9yMyA9IGJpdGFuZ2VudHNbX2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlb3J0aG9nb25hbGl6ZVxyXG4gICAgICAgICAgICB0YW5nZW50LmFkZChWZWN0b3IzLlNDQUxFKG5vcm1hbCwgLSBWZWN0b3IzLkRPVChub3JtYWwsIHRhbmdlbnQpKSk7XHJcbiAgICAgICAgICAgIGlmICh0YW5nZW50Lm1hZ25pdHVkZVNxdWFyZWQgPiAwKSAvLyBzb21lIHZlcnRpY2VzIG1pZ2h0IGJlIHVudXNlZCBhbmQgeWllbGQgYSB6ZXJvLXRhbmdlbnQuLi5cclxuICAgICAgICAgICAgICB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGhhbmRlZG5lc3M6IG51bWJlciA9IChWZWN0b3IzLkRPVChWZWN0b3IzLkNST1NTKG5vcm1hbCwgdGFuZ2VudCksIGJpdGFuZ2VudCkgPCAwKSA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgICAgIF92ZXJ0ZXgudGFuZ2VudCA9IG5ldyBWZWN0b3I0KHRhbmdlbnQueCwgdGFuZ2VudC55LCB0YW5nZW50LnosIGhhbmRlZG5lc3MpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiN0YW5nZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZmxhdE1hcChfdmVydGV4ID0+IF92ZXJ0ZXgudGFuZ2VudC5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jdGFuZ2VudHM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhbmdlbnRzKF90YW5nZW50czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3RhbmdlbnRzID0gX3RhbmdlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dHVyZVVWcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dHVyZVVWcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgdXZzIGZyb20gdGhlIGNsb3VzIGludG8gYSB0eXBlZCBhcnJheVxyXG4gICAgICAgIHRoaXMuI3RleHR1cmVVVnMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlc1xyXG4gICAgICAgICAgLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgudXYpXHJcbiAgICAgICAgICAuZmxhdE1hcCgoX3ZlcnRleDogVmVydGV4KSA9PiBbLi4uX3ZlcnRleC51di5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmVVVnMoX3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlVVZzID0gX3RleHR1cmVVVnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb2xvcnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbG9ycyB8fCAoXHJcbiAgICAgICAgdGhpcy4jY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm1lc2gudmVydGljZXNcclxuICAgICAgICAgIC5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LmNvbG9yKVxyXG4gICAgICAgICAgLmZsYXRNYXAoX3ZlcnRleCA9PiBbLi4uX3ZlcnRleC5jb2xvci5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbG9ycyhfY29sb3JzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jY29sb3JzID0gX2NvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvbmVzKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9uZXMgfHwgKCAvLyByZXR1cm4gY2FjaGUgb3IgLi4uXHJcbiAgICAgICAgdGhpcy4jYm9uZXMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvbmVzOiBCb25lW10gPSB0aGlzLm1lc2gudmVydGljZXMuYm9uZXMoX2luZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIFtib25lcz8uWzBdPy5pbmRleCB8fCAwLCBib25lcz8uWzFdPy5pbmRleCB8fCAwLCBib25lcz8uWzJdPy5pbmRleCB8fCAwLCBib25lcz8uWzNdPy5pbmRleCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9uZXMoX2lCb25lczogVWludDhBcnJheSkge1xyXG4gICAgICB0aGlzLiNib25lcyA9IF9pQm9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3ZWlnaHRzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN3ZWlnaHRzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIHRoaXMuI3dlaWdodHMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmZsYXRNYXAoKF92ZXJ0ZXg6IFZlcnRleCwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYm9uZXM6IEJvbmVbXSA9IHRoaXMubWVzaC52ZXJ0aWNlcy5ib25lcyhfaW5kZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gW2JvbmVzPy5bMF0/LndlaWdodCB8fCAwLCBib25lcz8uWzFdPy53ZWlnaHQgfHwgMCwgYm9uZXM/LlsyXT8ud2VpZ2h0IHx8IDAsIGJvbmVzPy5bM10/LndlaWdodCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgd2VpZ2h0cyhfd2VpZ2h0czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBfd2VpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGlzIHJlbmRlciBtZXNoIGFuZCBhbGwgaXRzIGJ1ZmZlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmJ1ZmZlcnMgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy4jdmVydGljZXMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gbnVsbDtcclxuICAgICAgdGhpcy4jdGV4dHVyZVVWcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI25vcm1hbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNjb2xvcnMgPSBudWxsO1xyXG4gICAgICB0aGlzLiN0YW5nZW50cyA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLiNib25lcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSByZW5kZXJpbmcgb2YgYSBicmFuY2gsIHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSxcclxuICAgKiBhbmQgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSByZW5kZXJlZCBpbWFnZSBmcm9tIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHRvIHRoZSB0YXJnZXQgY2FudmFzXHJcbiAgICogdGhyb3VnaCBhIHNlcmllcyBvZiB7QGxpbmsgRnJhbWluZ30gb2JqZWN0cy4gVGhlIHN0YWdlcyBpbnZvbHZlZCBhcmUgaW4gb3JkZXIgb2YgcmVuZGVyaW5nXHJcbiAgICoge0BsaW5rIFJlbmRlcn0udmlld3BvcnQgLT4ge0BsaW5rIFZpZXdwb3J0fS5zb3VyY2UgLT4ge0BsaW5rIFZpZXdwb3J0fS5kZXN0aW5hdGlvbiAtPiBET00tQ2FudmFzIC0+IENsaWVudChDU1MpXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS0yMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9WaWV3cG9ydFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmb2N1czogVmlld3BvcnQ7XHJcblxyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiVmlld3BvcnRcIjsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIHZpZXdwb3J0IGJ5LlxyXG4gICAgcHVibGljIGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbnVsbDsgLy8gVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIHZpZXcgcGFyYW1ldGVycyB0byByZW5kZXIgdGhlIGJyYW5jaC5cclxuICAgIHB1YmxpYyByZWN0U291cmNlOiBSZWN0YW5nbGU7XHJcbiAgICBwdWJsaWMgcmVjdERlc3RpbmF0aW9uOiBSZWN0YW5nbGU7XHJcblxyXG4gICAgLy8gVE9ETzogdmVyaWZ5IGlmIGNsaWVudCB0byBjYW52YXMgc2hvdWxkIGJlIGluIFZpZXdwb3J0IG9yIHNvbWV3aGVyZSBlbHNlIChXaW5kb3csIENvbnRhaW5lcj8pXHJcbiAgICAvLyBNdWx0aXBsZSB2aWV3cG9ydHMgdXNpbmcgdGhlIHNhbWUgY2FudmFzIHNob3VsZG4ndCBkaWZmZXIgaGVyZS4uLlxyXG4gICAgLy8gZGlmZmVyZW50IGZyYW1pbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gICAgcHVibGljIGZyYW1lQ2xpZW50VG9DYW52YXM6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lQ2FudmFzVG9EZXN0aW5hdGlvbjogRnJhbWluZ0NvbXBsZXggPSBuZXcgRnJhbWluZ0NvbXBsZXgoKTtcclxuICAgIHB1YmxpYyBmcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2U6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lU291cmNlVG9SZW5kZXI6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG5cclxuICAgIHB1YmxpYyBhZGp1c3RpbmdGcmFtZXM6IGJvb2xlYW4gPSB0cnVlOyAvLyBUT0RPOiBtYXliZSBvbmx5IGFkanVzdCBmcmFtZXMgd2hlbiBhbnl0aGluZyBjaGFuZ2VzIGluc3RlYWQgb2YgZXZlcnkgZHJhd24gZnJhbWU/XHJcbiAgICBwdWJsaWMgYWRqdXN0aW5nQ2FtZXJhOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwaHlzaWNzRGVidWdNb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkU7XHJcblxyXG4gICAgcHVibGljIGdpem1vc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBnaXptb3NTZWxlY3RlZDogTm9kZVtdO1xyXG4gICAgcHVibGljIGdpem1vc0ZpbHRlcjogeyBbX2dpem1vOiBzdHJpbmddOiBib29sZWFuIH0gPSBPYmplY3QuZnJvbUVudHJpZXMoQ29tcG9uZW50LnN1YmNsYXNzZXMgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIGxhenkgVE9ETzogY2hhbmdlIHRvIGpzIG9iamVjdFxyXG4gICAgICAuZmlsdGVyKChfY2xhc3M6IHR5cGVvZiBDb21wb25lbnQpID0+IChfY2xhc3MucHJvdG90eXBlKS5kcmF3R2l6bW9zIHx8IChfY2xhc3MucHJvdG90eXBlKS5kcmF3R2l6bW9zU2VsZWN0ZWQpXHJcbiAgICAgIC5tYXAoKF9jbGFzczogdHlwZW9mIENvbXBvbmVudCkgPT4gW19jbGFzcy5uYW1lLCB0cnVlXSlcclxuICAgICk7XHJcblxyXG4gICAgcHVibGljIGNvbXBvbmVudHNQaWNrOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRQaWNrPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG5cclxuICAgICNicmFuY2g6IE5vZGUgPSBudWxsOyAvLyBUaGUgdG8gcmVuZGVyIHdpdGggYWxsIGl0cyBkZXNjZW5kYW50cy5cclxuICAgICNjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBudWxsO1xyXG4gICAgI2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBudWxsO1xyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBFdmVudHMgKHBhc3NpbmcgZnJvbSBjYW52YXMgdG8gdmlld3BvcnQgYW5kIGZyb20gdGhlcmUgaW50byBicmFuY2gpXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZpZXdwb3J0IGN1cnJlbnRseSBoYXMgZm9jdXMgYW5kIHRodXMgcmVjZWl2ZXMga2V5Ym9hcmQgZXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGFzRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoVmlld3BvcnQuZm9jdXMgPT0gdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVzdGluYXRpb24gY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NhbnZhcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIDJELWNvbnRleHQgYXR0YWNoZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NyYzI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGUgdmlld3BvcnQgdG8gdGhlIGdpdmVuIGNhbnZhcyB0byByZW5kZXIgdGhlIGdpdmVuIGJyYW5jaCB0byB1c2luZyB0aGUgZ2l2ZW4gY2FtZXJhLWNvbXBvbmVudCwgYW5kIG5hbWVzIHRoZSB2aWV3cG9ydCBhcyBnaXZlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXRpYWxpemUoX25hbWU6IHN0cmluZywgX2JyYW5jaDogTm9kZSwgX2NhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5jYW1lcmEgPSBfY2FtZXJhO1xyXG4gICAgICB0aGlzLiNjYW52YXMgPSBfY2FudmFzO1xyXG4gICAgICB0aGlzLiNjcmMyID0gX2NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy50YWJJbmRleCA9IDA7IC8vIGNhbiBnZXQgZm9jdXMgYW5kIHJlY2VpdmUga2V5Ym9hcmQgZXZlbnRzXHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UgPSBSZW5kZXIuZ2V0Q2FudmFzUmVjdCgpO1xyXG4gICAgICB0aGlzLnJlY3REZXN0aW5hdGlvbiA9IHRoaXMuZ2V0Q2xpZW50UmVjdGFuZ2xlKCk7XHJcblxyXG4gICAgICB0aGlzLnNldEJyYW5jaChfYnJhbmNoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGNhbnZhcyBhcyBhIHJlY3RhbmdsZSwgeCBhbmQgeSBhcmUgYWx3YXlzIDAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDYW52YXNSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGhpcy4jY2FudmFzLndpZHRoLCB0aGlzLiNjYW52YXMuaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIGNsaWVudCByZWN0YW5nbGUgdGhlIGNhbnZhcyBpcyBkaXNwbGF5ZWQgYW5kIGZpdCBpbiwgeCBhbmQgeSBhcmUgYWx3YXlzIDAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDbGllbnRSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgLy8gRlVER0UgZG9lc24ndCBjYXJlIGFib3V0IHdoZXJlIHRoZSBjbGllbnQgcmVjdCBpcywgb25seSBhYm91dCB0aGUgc2l6ZSBtYXR0ZXJzLlxyXG4gICAgICAvLyByZXR1cm4gUmVjdGFuZ2xlLkdFVCh0aGlzLmNhbnZhcy5vZmZzZXRMZWZ0LCB0aGlzLmNhbnZhcy5vZmZzZXRUb3AsIHRoaXMuY2FudmFzLmNsaWVudFdpZHRoLCB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLiNjYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuI2NhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBicmFuY2ggdG8gYmUgZHJhd24gaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnJhbmNoKF9icmFuY2g6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgaWYgKF9icmFuY2gpIHtcclxuICAgICAgICBfYnJhbmNoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVC5BVFRBQ0hfQlJBTkNIKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy4jYnJhbmNoID0gX2JyYW5jaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBicmFuY2ggdGhpcyB2aWV3cG9ydCByZW5kZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCcmFuY2goKTogTm9kZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmFuY2g7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBEcmF3aW5nXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgdGhpcyB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhdyhfcHJlcGFyZUJyYW5jaDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wcmVwYXJlKF9wcmVwYXJlQnJhbmNoKTtcclxuXHJcbiAgICAgIFJlbmRlci5yZXNldEZyYW1lYnVmZmVyKCk7XHJcbiAgICAgIFJlbmRlci5jbGVhcih0aGlzLmNhbWVyYS5jbHJCYWNrZ3JvdW5kKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuUEhZU0lDX09CSkVDVFNfT05MWSkge1xyXG4gICAgICAgIFJlbmRlci5kcmF3KHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2l6bW9zRW5hYmxlZClcclxuICAgICAgICAgIEdpem1vcy5kcmF3KHRoaXMuZ2V0R2l6bW9zKCksIHRoaXMuY2FtZXJhLCB0aGlzLmdpem1vc1NlbGVjdGVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5OT05FKSB7XHJcbiAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlJFTkRFUl9FTkQpKTtcclxuXHJcbiAgICAgIHRoaXMuI2NyYzIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuI2NyYzIuZHJhd0ltYWdlKFxyXG4gICAgICAgIFJlbmRlci5nZXRDYW52YXMoKSxcclxuICAgICAgICB0aGlzLnJlY3RTb3VyY2UueCwgdGhpcy5yZWN0U291cmNlLnksIHRoaXMucmVjdFNvdXJjZS53aWR0aCwgdGhpcy5yZWN0U291cmNlLmhlaWdodCxcclxuICAgICAgICB0aGlzLnJlY3REZXN0aW5hdGlvbi54LCB0aGlzLnJlY3REZXN0aW5hdGlvbi55LCB0aGlzLnJlY3REZXN0aW5hdGlvbi53aWR0aCwgdGhpcy5yZWN0RGVzdGluYXRpb24uaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkanVzdHMgYWxsIGZyYW1lcyBhbmQgdGhlIGNhbWVyYSB0byBmaXQgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FudmFzLiBQcmVwYXJlcyB0aGUgYnJhbmNoIGZvciByZW5kZXJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHByZXBhcmUoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy4jYnJhbmNoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgaWYgKCF0aGlzLmNhbWVyYS5pc0FjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBpZiAodGhpcy5hZGp1c3RpbmdGcmFtZXMpXHJcbiAgICAgICAgdGhpcy5hZGp1c3RGcmFtZXMoKTtcclxuICAgICAgaWYgKHRoaXMuYWRqdXN0aW5nQ2FtZXJhKVxyXG4gICAgICAgIHRoaXMuYWRqdXN0Q2FtZXJhKCk7XHJcbiAgICAgIGlmIChfcHJlcGFyZUJyYW5jaClcclxuICAgICAgICB0aGlzLnByZXBhcmVCcmFuY2goKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBhcmVzIGFsbCBub2RlcyBpbiB0aGUgYnJhbmNoIGZvciByZW5kZXJpbmcgYnkgdXBkYXRpbmcgdGhlaXIgd29ybGQgdHJhbnNmb3JtcyBldGMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmVwYXJlQnJhbmNoKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4Um9vdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAgIGlmICh0aGlzLiNicmFuY2guZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgbXR4Um9vdCA9IHRoaXMuI2JyYW5jaC5nZXRQYXJlbnQoKS5tdHhXb3JsZDtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9TVEFSVCkpO1xyXG4gICAgICBSZW5kZXIucHJlcGFyZSh0aGlzLiNicmFuY2gsIHt9LCBtdHhSb290KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRzUGljayA9IFJlbmRlci5jb21wb25lbnRzUGljaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgcGljayBvbiBhbGwge0BsaW5rIENvbXBvbmVudFBpY2t9cyBpbiB0aGUgYnJhbmNoIG9mIHRoaXMgdmlld3BvcnRcclxuICAgICAqIHVzaW5nIGEgcmF5IGZyb20gaXRzIGNhbWVyYSB0aHJvdWdoIHRoZSBjbGllbnQgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4gdGhlIGV2ZW50LlxyXG4gICAgICogRGlzcGF0Y2hlcyB0aGUgZXZlbnQgdG8gYWxsIG5vZGVzIGhpdC4gIFxyXG4gICAgICogSWYge0BsaW5rIFBJQ0suQ0FNRVJBfSB3YXMgY2hvc2VuIGFzIHRoZSBtZXRob2QgdG8gcGljaywgYSBwaWNrIHByb3BlcnR5IGdldHMgYWRkZWQgdG8gdGhlIGV2ZW50LCBcclxuICAgICAqIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgYnV0IGlzIG92ZXJ3cml0dGVuIGZvciBlYWNoIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwYXRjaFBvaW50ZXJFdmVudChfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQ2xpZW50OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LmNsaWVudFgsIF9ldmVudC5jbGllbnRZKTtcclxuICAgICAgbGV0IHJheTogUmF5ID0gdGhpcy5nZXRSYXlGcm9tQ2xpZW50KHBvc0NsaWVudCk7XHJcbiAgICAgIC8vIGxldCBjYW1lcmFQaWNrczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBSZWN5Y2xlci5nZXQoUmVjeWNhYmxlQXJyYXkpOyAvL1RPRE86IHRoaW5rIGFib3V0IG9wdGltaXphdGlvbiBsYXRlclxyXG4gICAgICBsZXQgY2FtZXJhUGlja3M6IE5vZGVbXSA9IFtdO1xyXG4gICAgICBsZXQgb3RoZXJQaWNrczogQ29tcG9uZW50UGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNtcFBpY2sgb2YgdGhpcy5jb21wb25lbnRzUGljaylcclxuICAgICAgICBpZiAoY21wUGljay5waWNrID09IFBJQ0suQ0FNRVJBKVxyXG4gICAgICAgICAgY2FtZXJhUGlja3MucHVzaChjbXBQaWNrLm5vZGUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG90aGVyUGlja3MucHVzaChjbXBQaWNrKTtcclxuXHJcblxyXG4gICAgICBpZiAoY2FtZXJhUGlja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja0NhbWVyYShjYW1lcmFQaWNrcywgdGhpcy5jYW1lcmEsIHRoaXMucG9pbnRDbGllbnRUb1Byb2plY3Rpb24ocG9zQ2xpZW50KSk7XHJcbiAgICAgICAgZm9yIChsZXQgcGljayBvZiBwaWNrcykge1xyXG4gICAgICAgICAgUmVmbGVjdC5zZXQoX2V2ZW50LCBcInBpY2tcIiwgcGljayk7XHJcbiAgICAgICAgICBwaWNrLm5vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgY21wUGljayBvZiBvdGhlclBpY2tzKSB7XHJcbiAgICAgICAgY21wUGljay5waWNrQW5kRGlzcGF0Y2gocmF5LCBfZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgYWxsIGZyYW1lcyBpbnZvbHZlZCBpbiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MgZnJvbSB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBjbGllbnQgdXAgdG8gdGhlIHJlbmRlcmVyIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRqdXN0RnJhbWVzKCk6IHZvaWQge1xyXG4gICAgICAvLyBnZXQgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY2FudmFzIGFyZWEgYXMgZGlzcGxheWVkIChjb25zaWRlciBjc3MpXHJcbiAgICAgIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGNhbnZhcyBzaXplIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZnJhbWluZyBhcHBsaWVkIHRvIGNsaWVudFxyXG4gICAgICBsZXQgcmVjdENhbnZhczogUmVjdGFuZ2xlID0gdGhpcy5mcmFtZUNsaWVudFRvQ2FudmFzLmdldFJlY3QocmVjdENsaWVudCk7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy53aWR0aCA9IHJlY3RDYW52YXMud2lkdGg7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy5oZWlnaHQgPSByZWN0Q2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGxldCByZWN0VGVtcDogUmVjdGFuZ2xlO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGRlc3RpbmF0aW9uIGFyZWEgb24gdGhlIHRhcmdldC1jYW52YXMgdG8gcmVuZGVyIHRvIGJ5IGFwcGx5aW5nIHRoZSBmcmFtaW5nIHRvIGNhbnZhc1xyXG4gICAgICByZWN0VGVtcCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFJlY3QocmVjdENhbnZhcyk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uLmNvcHkocmVjdFRlbXApO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0VGVtcCk7XHJcbiAgICAgIC8vIGFkanVzdCB0aGUgYXJlYSBvbiB0aGUgc291cmNlLWNhbnZhcyB0byByZW5kZXIgZnJvbSBieSBhcHBseWluZyB0aGUgZnJhbWluZyB0byBkZXN0aW5hdGlvbiBhcmVhXHJcbiAgICAgIHJlY3RUZW1wID0gdGhpcy5mcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2UuZ2V0UmVjdCh0aGlzLnJlY3REZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UuY29weShyZWN0VGVtcCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RUZW1wKTtcclxuXHJcbiAgICAgIC8vIGhhdmluZyBhbiBvZmZzZXQgc291cmNlIGRvZXMgbWFrZSBzZW5zZSBvbmx5IHdoZW4gbXVsdGlwbGUgdmlld3BvcnRzIGRpc3BsYXkgcGFydHMgb2YgdGhlIHNhbWUgcmVuZGVyaW5nLiBGb3Igbm93OiBzaGlmdCBpdCB0byAwLDBcclxuICAgICAgdGhpcy5yZWN0U291cmNlLnggPSB0aGlzLnJlY3RTb3VyY2UueSA9IDA7XHJcbiAgICAgIC8vIHN0aWxsLCBhIHBhcnRpYWwgaW1hZ2Ugb2YgdGhlIHJlbmRlcmluZyBtYXkgYmUgcmV0cmlldmVkIGJ5IG1vdmluZyBhbmQgcmVzaXppbmcgdGhlIHJlbmRlciB2aWV3cG9ydC4gRm9yIG5vdywgaXQncyBhbHdheXMgYWRqdXN0ZWQgdG8gdGhlIGN1cnJlbnQgdmlld3BvcnRcclxuICAgICAgbGV0IHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IHRoaXMuZnJhbWVTb3VyY2VUb1JlbmRlci5nZXRSZWN0KHRoaXMucmVjdFNvdXJjZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUocmVjdFJlbmRlcik7XHJcblxyXG4gICAgICBsZXQgcmVjdE9mZnNjcmVlbkNhbnZhczogUmVjdGFuZ2xlID0gUmVuZGVyLmdldENhbnZhc1JlY3QoKTsgLy8gdGhlcmUgYXJlIGZhciB0byBtYW55IHJlY3RhbmdsZXMgaW52b2x2ZWQgaGVyZS4uLlxyXG5cclxuICAgICAgLy8gbm8gbW9yZSB0cmFuc2Zvcm1hdGlvbiBhZnRlciB0aGlzIGZvciBub3csIG9mZnNjcmVlbiBjYW52YXMgYW5kIHJlbmRlci12aWV3cG9ydCBoYXZlIHRoZSBzYW1lIHNpemVcclxuICAgICAgUmVuZGVyLnNldENhbnZhc1NpemUocmVjdFJlbmRlci53aWR0aCwgcmVjdFJlbmRlci5oZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHJlY3RSZW5kZXIud2lkdGggIT0gcmVjdE9mZnNjcmVlbkNhbnZhcy53aWR0aCB8fCByZWN0UmVuZGVyLmhlaWdodCAhPSByZWN0T2Zmc2NyZWVuQ2FudmFzLmhlaWdodClcclxuICAgICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RDbGllbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0Q2FudmFzKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUocmVjdFJlbmRlcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RPZmZzY3JlZW5DYW52YXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0IHRoZSBjYW1lcmEgcGFyYW1ldGVycyB0byBmaXQgdGhlIHJlbmRlcmluZyBpbnRvIHRoZSByZW5kZXIgdmlld3BvcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdENhbWVyYSgpOiB2b2lkIHtcclxuICAgICAgbGV0IHJlY3Q6IFJlY3RhbmdsZSA9IFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKTtcclxuICAgICAgLy8gaWYgKHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb24oKSA9PSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQylcclxuICAgICAgLy8gICB0aGlzLmNhbWVyYS5wcm9qZWN0T3J0aG9ncmFwaGljKC1yZWN0LndpZHRoIC8gMjAsIHJlY3Qud2lkdGggLyAyMCwgcmVjdC5oZWlnaHQgLyAyMCwgLXJlY3QuaGVpZ2h0IC8gMjApO1xyXG4gICAgICAvLyBlbHNlXHJcbiAgICAgIHRoaXMuY2FtZXJhLnByb2plY3RDZW50cmFsKFxyXG4gICAgICAgIHJlY3Qud2lkdGggLyByZWN0LmhlaWdodCwgdGhpcy5jYW1lcmEuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5jYW1lcmEuZ2V0RGlyZWN0aW9uKCksIHRoaXMuY2FtZXJhLmdldE5lYXIoKSwgdGhpcy5jYW1lcmEuZ2V0RmFyKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jYW1lcmEucmVzZXRXb3JsZFRvVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQb2ludHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSYXl9IGluIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhpcyBjYW1lcmEgdGhyb3VnaCB0aGUgcG9pbnQgZ2l2ZW4gaW4gY2xpZW50IHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSYXlGcm9tQ2xpZW50KF9wb2ludDogVmVjdG9yMik6IFJheSB7XHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gdGhpcy5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9pbnQpO1xyXG4gICAgICBsZXQgcmF5OiBSYXkgPSBuZXcgUmF5KG5ldyBWZWN0b3IzKC1wb3NQcm9qZWN0aW9uLngsIHBvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG5cclxuICAgICAgLy8gcmF5LmRpcmVjdGlvbi5zY2FsZShjYW1lcmEuZGlzdGFuY2UpO1xyXG4gICAgICByYXkudHJhbnNmb3JtKHRoaXMuY2FtZXJhLm10eFBpdm90KTtcclxuICAgICAgbGV0IGNhbWVyYU5vZGU6IE5vZGUgPSB0aGlzLmNhbWVyYS5ub2RlO1xyXG4gICAgICBpZiAoY2FtZXJhTm9kZSlcclxuICAgICAgICByYXkudHJhbnNmb3JtKGNhbWVyYU5vZGUubXR4V29ybGQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZSBtYXRjaGluZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9pbnQgaW4gd29ybGQgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaWVudChfcG9zaXRpb246IFZlY3RvcjMpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHByb2plY3Rpb246IFZlY3RvcjMgPSB0aGlzLmNhbWVyYS5wb2ludFdvcmxkVG9DbGlwKF9wb3NpdGlvbik7XHJcbiAgICAgIGxldCBwb3NDbGllbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpcFRvQ2xpZW50KHByb2plY3Rpb24udG9WZWN0b3IyKCkpO1xyXG4gICAgICByZXR1cm4gcG9zQ2xpZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBzb3VyY2UtcmVjdGFuZ2xlIG1hdGNoaW5nIHRoZSBnaXZlbiBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NvdXJjZShfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lQ2xpZW50VG9DYW52YXMuZ2V0UG9pbnQoX2NsaWVudCwgdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFBvaW50KHJlc3VsdCwgdGhpcy5nZXRDYW52YXNSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVEZXN0aW5hdGlvblRvU291cmNlLmdldFBvaW50KHJlc3VsdCwgdGhpcy5yZWN0U291cmNlKTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFNvdXJjZSwgUmVuZGVyIGFuZCBSZW5kZXJWaWV3cG9ydCBkZXZpYXRlLCBjb250aW51ZSB0cmFuc2Zvcm1hdGlvbiBcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIHNvdXJjZSByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50U291cmNlVG9SZW5kZXIoX3NvdXJjZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcHJvamVjdGlvblJlY3RhbmdsZTogUmVjdGFuZ2xlID0gdGhpcy5jYW1lcmEuZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UG9pbnQoX3NvdXJjZSwgcHJvamVjdGlvblJlY3RhbmdsZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHByb2plY3Rpb25SZWN0YW5nbGUudG9TdHJpbmcoKSk7XHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9Tb3VyY2UoX2NsaWVudCk7XHJcbiAgICAgIHBvaW50ID0gdGhpcy5wb2ludFNvdXJjZVRvUmVuZGVyKHBvaW50KTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFJlbmRlciBhbmQgUmVuZGVyVmlld3BvcnQgZGV2aWF0ZSwgY29udGludWUgdHJhbnNmb3JtYXRpb24gXHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYSAgXHJcbiAgICAgKiBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgY2FtZXJhLW1ldGhvZC4gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgY2VudHJhbC1wcm9qZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaWVudFRvUHJvamVjdGlvbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb3NSZW5kZXI6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudCk7XHJcbiAgICAgIGxldCByZWN0UmVuZGVyOiBSZWN0YW5nbGUgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UmVjdCh0aGlzLnJlY3RTb3VyY2UpO1xyXG4gICAgICBsZXQgcmVjdFByb2plY3Rpb246IFJlY3RhbmdsZSA9IHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb25SZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24ud2lkdGggKiBwb3NSZW5kZXIueCAvIHJlY3RSZW5kZXIud2lkdGgsXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24uaGVpZ2h0ICogcG9zUmVuZGVyLnkgLyByZWN0UmVuZGVyLmhlaWdodFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcG9zUHJvamVjdGlvbi5zdWJ0cmFjdChuZXcgVmVjdG9yMihyZWN0UHJvamVjdGlvbi53aWR0aCAvIDIsIHJlY3RQcm9qZWN0aW9uLmhlaWdodCAvIDIpKTtcclxuICAgICAgcG9zUHJvamVjdGlvbi55ICo9IC0xO1xyXG5cclxuICAgICAgcmV0dXJuIHBvc1Byb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NsaWVudChfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIC8vIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBsZXQgcmVzdWx0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMC41KTtcclxuICAgICAgLy8gcmVzdWx0LnggKj0gKF9ub3JtZWQueCArIDEpICogcmVjdENsaWVudC53aWR0aDtcclxuICAgICAgLy8gcmVzdWx0LnkgKj0gKDEgLSBfbm9ybWVkLnkpICogcmVjdENsaWVudC5oZWlnaHQ7XHJcbiAgICAgIC8vIHJlc3VsdC5hZGQocmVjdENsaWVudC5wb3NpdGlvbik7XHJcbiAgICAgIC8vVE9ETzogY2hlY2sgaWYgcmVjdERlc3RpbmF0aW9uIGNhbiBzYWZlbHkgKGFuZCBtb3JlIHBlcmZvbWFudCkgYmUgdXNlZCBpbnN0ZWFkIGdldENsaWVudFJlY3RhbmdsZVxyXG4gICAgICBsZXQgcG9pbnRDbGllbnQ6IFZlY3RvcjIgPSBSZW5kZXIucmVjdENsaXAucG9pbnRUb1JlY3QoX25vcm1lZCwgdGhpcy5yZWN0RGVzdGluYXRpb24pO1xyXG4gICAgICByZXR1cm4gcG9pbnRDbGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NhbnZhcyhfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb2ludENhbnZhczogVmVjdG9yMiA9IFJlbmRlci5yZWN0Q2xpcC5wb2ludFRvUmVjdChfbm9ybWVkLCB0aGlzLmdldENhbnZhc1JlY3RhbmdsZSgpKTtcclxuICAgICAgcmV0dXJuIHBvaW50Q2FudmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IGluIHRoZSBicm93c2VyIHBhZ2UgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IG9mIHRoZSB2aWV3cG9ydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NjcmVlbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBzY3JlZW46IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0aGlzLiNjYW52YXMub2Zmc2V0TGVmdCArIF9jbGllbnQueCwgdGhpcy4jY2FudmFzLm9mZnNldFRvcCArIF9jbGllbnQueSk7XHJcbiAgICAgIHJldHVybiBzY3JlZW47XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgZ2l6bW9zIGluIHRoZSBicmFuY2ggb2YgdGhpcyB2aWV3cG9ydCB0aGF0IGFyZSBhY3RpdmUsIGZpbHRlcmVkIGJ5IHtAbGluayBnaXptb3NGaWx0ZXJ9XHJcbiAgICAgKi8gXHJcbiAgICBwdWJsaWMgZ2V0R2l6bW9zKF9ub2RlczogTm9kZVtdID0gQXJyYXkuZnJvbSh0aGlzLiNicmFuY2guZ2V0SXRlcmF0b3IodHJ1ZSkpKTogR2l6bW9bXSB7XHJcbiAgICAgIHJldHVybiBfbm9kZXNcclxuICAgICAgICAuZmxhdE1hcChfbm9kZSA9PiBfbm9kZS5nZXRBbGxDb21wb25lbnRzKCkpXHJcbiAgICAgICAgLmZpbHRlcihfY29tcG9uZW50ID0+IF9jb21wb25lbnQuaXNBY3RpdmUgJiYgKF9jb21wb25lbnQuZHJhd0dpem1vcyB8fCBfY29tcG9uZW50LmRyYXdHaXptb3NTZWxlY3RlZCkgJiYgdGhpcy5naXptb3NGaWx0ZXJbX2NvbXBvbmVudC50eXBlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERpZmZlcmVudCB4ciBzZXNzaW9uIG1vZGVzIGF2YWlsYWJsZS4gQ291bGQgYmUgZXhwYW5kIHdpdGggbW9yZSBtb2RlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEBhdXRob3JzIFZhbGVudGluIFNjaG1pZGJlcmdlciwgSEZVLCAyMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gWFJfU0VTU0lPTl9NT0RFIHtcclxuICAgIElNTUVSU0lWRV9WUiA9IFwiaW1tZXJzaXZlLXZyXCJcclxuICAgIC8vSU1NRVJTSVZFX0FSID0gXCJpbW1lcnNpdmUtYXJcIixcclxuICAgIC8vSU5MSU5FID0gXCJpbmxpbmVcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlmZmVyZW50IHJlZmVyZW5jZSB2ci1zcGFjZXMgYXZhaWxhYmxlLCBjcmVhdG9yIGhhcyB0byBjaGVjayBpZiB0aGUgc3BhY2UgaXMgc3VwcG9ydGVkIHdpdGggaXRzIGRldmljZS5cclxuICAgKiBDb3VsZCBiZSBleHBhbmQgd2l0aCBtb3JlIGF2YWlsYWJsZSBzcGFjZSB0eXBlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFhSX1JFRkVSRU5DRV9TUEFDRSB7XHJcbiAgICBWSUVXRVIgPSBcInZpZXdlclwiLFxyXG4gICAgTE9DQUwgPSBcImxvY2FsXCJcclxuICAgIC8vIExPQ0FMX0ZMT09SID0gXCJsb2NhbC1mbG9vclwiLFxyXG4gICAgLy8gQk9VTkRFRF9GTE9PUiA9IFwiYm91bmRlZC1mbG9vclwiLFxyXG4gICAgLy8gVU5CT1VOREVEID0gXCJ1bmJvdW5kZWRcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogWFJWaWV3cG9ydCAod2ViWFIpLWV4dGVuc2lvbiBvZiBWaWV3cG9ydCwgdG8gZGlzcGxheWluZyBpdHMgYnJhbmNoIG9uIEhlYWQgTW91bnRlZCBhbmQgQVIgKG5vdCBpbXBsZW10ZWQgeWV0KSBEZXZpY2VzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBYUlZpZXdwb3J0IGV4dGVuZHMgVmlld3BvcnQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgeHJWaWV3cG9ydEluc3RhbmNlOiBYUlZpZXdwb3J0ID0gbnVsbDtcclxuICAgIHB1YmxpYyB2ckRldmljZTogQ29tcG9uZW50VlJEZXZpY2UgPSBudWxsO1xyXG4gICAgcHVibGljIHNlc3Npb246IFhSU2Vzc2lvbiA9IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlU3BhY2U6IFhSUmVmZXJlbmNlU3BhY2UgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VWUkNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcml2YXRlIHBvc2VNdHg6IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQoKTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgWFJWaWV3cG9ydC54clZpZXdwb3J0SW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG8gcmV0cmlldmUgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2Ugb2YgeHIgdmlld3BvcnQsIHJlYWRvbmx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0KCk6IFhSVmlld3BvcnQge1xyXG4gICAgICByZXR1cm4gdGhpcy54clZpZXdwb3J0SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ29ubmVjdHMgdGhlIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjYW52YXMgdG8gcmVuZGVyIHRoZSBnaXZlbiBicmFuY2ggdG8gdXNpbmcgdGhlIGdpdmVuIGNhbWVyYS1jb21wb25lbnQsIGFuZCBuYW1lcyB0aGUgdmlld3BvcnQgYXMgZ2l2ZW4uXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhWFI6IENvbXBvbmVudFZSRGV2aWNlIC8qIHwgQ29tcG9uZW50Q2FtZXJhQVIqLywgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuaW5pdGlhbGl6ZShfbmFtZSwgX2JyYW5jaCwgX2NhbWVyYVhSLCBfY2FudmFzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBWUiBTZXNzaW9uIGlzIGluaXRpYWxpemVkIGhlcmUsIGFsc28gVlIgLSBDb250cm9sbGVyIGFyZSBpbml0aWFsaXplZCwgaWYgYm9vbGVhbiBpcyB0cnVlLlxyXG4gICAgICogQ3JlYXRvciBoYXMgdG8gY2FsbCBGcmFtZVJlcXVlc3RYUiBhZnRlciB0aGlzIE1ldGhvZCB0byBydW4gdGhlIHZpZXdwb3J0IGluIHZpcnR1YWwgcmVhbGl0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVWUihfdnJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gWFJfU0VTU0lPTl9NT0RFLklNTUVSU0lWRV9WUiwgX3ZyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBYUl9SRUZFUkVOQ0VfU1BBQ0UuTE9DQUwsIF92ckNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2Vzc2lvbjogWFJTZXNzaW9uID0gYXdhaXQgbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKF92clNlc3Npb25Nb2RlKTtcclxuICAgICAgdGhpcy5yZWZlcmVuY2VTcGFjZSA9IGF3YWl0IHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKF92clJlZmVyZW5jZVNwYWNlVHlwZSk7XHJcbiAgICAgIGF3YWl0IFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCkubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG4gICAgICBsZXQgbmF0aXZlU2NhbGVGYWN0b3I6IG51bWJlciA9IFhSV2ViR0xMYXllci5nZXROYXRpdmVGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yKHNlc3Npb24pO1xyXG4gICAgICAvL1RPRE86ICBGaWVsZCBvZiB2aWV3IGvDtm5udGUgYW4gZGVyIFN0ZWxsZSBub2NoIHZlcsOkbmRlcnQgd2VyZGVuLlxyXG4gICAgICBsZXQgYmFzZUxheWVyOiBYUldlYkdMTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKHNlc3Npb24sIFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCksIHsgZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogbmF0aXZlU2NhbGVGYWN0b3IgfSk7XHJcbiAgICAgIGF3YWl0IHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoeyBiYXNlTGF5ZXI6IGJhc2VMYXllciB9KTtcclxuICAgICAgUmVuZGVyLnNldEZyYW1lYnVmZmVyVGFyZ2V0KGJhc2VMYXllci5mcmFtZWJ1ZmZlcik7XHJcbiAgICAgIFJlbmRlci5zZXRDYW52YXNTaXplKGJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBiYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlY3RhbmdsZS5HRVQoMCwgMCwgYmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCkpO1xyXG4gICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuICAgICAgdGhpcy5hZGp1c3RpbmdGcmFtZXMgPSBmYWxzZTsgLy8gd2ViIHhyIGhhbmRsZXMgdGhpcyBub3dcclxuICAgICAgdGhpcy52ckRldmljZSA9IDxDb21wb25lbnRWUkRldmljZT50aGlzLmNhbWVyYTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlU3BhY2UoKTtcclxuXHJcbiAgICAgIHRoaXMudXNlVlJDb250cm9sbGVyID0gX3ZyQ29udHJvbGxlcjtcclxuICAgICAgaWYgKF92ckNvbnRyb2xsZXIpIHtcclxuICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuY21wVHJhbnNmb3JtID0gbmV3IENvbXBvbmVudFRyYW5zZm9ybSgpO1xyXG4gICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybSA9IG5ldyBDb21wb25lbnRUcmFuc2Zvcm0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZUJyYW5jaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEFSIHNlc3Npb24gY291bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4gVXAgdGlsbCBub3cgbm90IGltcGxlbWVudGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVBUihfYXJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gbnVsbCwgX2FyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmVycm9yKFwiTk9UIElNUExFTUVOVEVEIFlFVCEgQ2hlY2sgb3V0IGluaXRpYWxpemVWUiFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSB4ciB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICogQ2FsbGVkIGZyb20gbG9vcCBtZXRob2Qge0BsaW5rIExvb3B9IGFnYWluIHdpdGggdGhlIHhyRnJhbWUgcGFyYW1ldGVyIGhhbmRvdmVyLCBhcyBzb29uIGFzIEZSQU1FX1JFUVVFU1RfWFIgaXMgY2FsbGVkIGZyb20gY3JlYXRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRyYXcoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlLCBfeHJGcmFtZTogWFJGcmFtZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcclxuICAgICAgICBzdXBlci5kcmF3KF9wcmVwYXJlQnJhbmNoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwb3NlOiBYUlZpZXdlclBvc2UgPSBfeHJGcmFtZT8uZ2V0Vmlld2VyUG9zZSh0aGlzLnJlZmVyZW5jZVNwYWNlKTtcclxuICAgICAgaWYgKCFwb3NlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwuc2V0KHBvc2UudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmFjayBiZWNhdXNlIHRoZSBYUiBSaWcgaXMgbG9va2luZyBpbiB0aGUgZGlyZWN0aW9uIG9mIG5lZ2F0aXZlIHpcclxuICAgICAgc3VwZXIucHJlcGFyZShfcHJlcGFyZUJyYW5jaCk7XHJcblxyXG4gICAgICBSZW5kZXIucmVzZXRGcmFtZWJ1ZmZlcigpO1xyXG4gICAgICBSZW5kZXIuY2xlYXIodGhpcy5jYW1lcmEuY2xyQmFja2dyb3VuZCk7XHJcblxyXG4gICAgICBsZXQgZ2xMYXllcjogWFJXZWJHTExheWVyID0gdGhpcy5zZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcclxuICAgICAgZm9yIChsZXQgdmlldyBvZiBwb3NlLnZpZXdzKSB7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0OiBnbG9iYWxUaGlzLlhSVmlld3BvcnQgPSBnbExheWVyLmdldFZpZXdwb3J0KHZpZXcpO1xyXG4gICAgICAgIFJlbmRlci5zZXRWaWV3cG9ydCh2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcclxuICAgICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QodHJ1ZSwgdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZVZSQ29udHJvbGxlcilcclxuICAgICAgICAgIHRoaXMuc2V0Q29udHJvbGxlckNvbmZpZ3MoX3hyRnJhbWUpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnJlc2V0V29ybGRUb1ZpZXcoKTsgLy8gVE9ETzogZmluZCBhIGxlc3MgZXhwZW5zaXZlIHdheSB0byBkbyB0aGlzLCBtYXliZSB1c2UgdHdvIGNhbWVyYXNcclxuICAgICAgICB0aGlzLmNhbWVyYS5tdHhQcm9qZWN0aW9uLnNldCh2aWV3LnByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLm10eENhbWVyYUludmVyc2Uuc2V0KHZpZXcudHJhbnNmb3JtLmludmVyc2UubWF0cml4KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKSBcclxuICAgICAgICAgIFJlbmRlci5kcmF3KHRoaXMuY2FtZXJhKTtcclxuICAgICAgICBpZiAodGhpcy5waHlzaWNzRGVidWdNb2RlICE9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkUpIFxyXG4gICAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXNldCBmb3Igb3RoZXIgcmVuZGVyIG9wZXJhdGlvbnMgZS5nLiBwaWNraW5nXHJcbiAgICAgIFJlbmRlci5zZXRTY2lzc29yVGVzdChmYWxzZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUoUmVuZGVyLmdldFJlbmRlclJlY3RhbmdsZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgdGhlIHJlZmVyZW5jZSBzcGFjZSB0byBzZXQgdGhlIGluaXRpYWwgcG9zaXRpb24vb3JpZW50YXRpb24gb2YgdGhlIHZyIGRldmljZSBpbiBhY2NvcmRhbmNlIHRvIHRoZSBub2RlIHRoZSB2ciBkZXZpY2UgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVJlZmVyZW5jZVNwYWNlKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMudnJEZXZpY2Uubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudFZSRGV2aWNlKT8ubXR4V29ybGQ7XHJcbiAgICAgIGlmICghbXR4V29ybGQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbXR4V29ybGQgPSBtdHhXb3JsZC5jbG9uZTtcclxuICAgICAgbXR4V29ybGQucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmVjYXVzZSB0aGUgWFIgUmlnIGlzIGxvb2tpbmcgaW4gdGhlIGRpcmVjdGlvbiBvZiBuZWdhdGl2ZSB6XHJcbiAgICAgIGxldCBpbnZNdHhUcmFuc2ZvbTogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UobXR4V29ybGQpOyAvLyBpbnZlcnNlIGJlY2F1c2Ugd2UgYXJlIG1vdmluZyB0aGUgcmVmZXJlbmNlIHNwYWNlXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShpbnZNdHhUcmFuc2ZvbS50cmFuc2xhdGlvbiwgaW52TXR4VHJhbnNmb20ucXVhdGVybmlvbikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vU2V0cyBjb250cm9sbGVyIG1hdHJpY2VzIGFuZCB0aHVtYnN0aWNrcyBtb3ZlbWVudHMuXHJcbiAgICBwcml2YXRlIHNldENvbnRyb2xsZXJDb25maWdzKF94ckZyYW1lOiBYUkZyYW1lKTogdm9pZCB7XHJcbiAgICAgIGlmIChfeHJGcmFtZSkge1xyXG4gICAgICAgIGlmIChYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbi5pbnB1dFNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24uaW5wdXRTb3VyY2VzLmZvckVhY2goX2NvbnRyb2xsZXIgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRyb2xsZXIuaGFuZGVkbmVzcykge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAoXCJyaWdodFwiKTpcclxuICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLmNtcFRyYW5zZm9ybS5tdHhMb2NhbC5zZXQoX3hyRnJhbWUuZ2V0UG9zZShfY29udHJvbGxlci50YXJnZXRSYXlTcGFjZSwgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuZ2FtZVBhZClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuZ2FtZVBhZCA9IF9jb250cm9sbGVyLmdhbWVwYWQ7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UucmlnaHRDbnRybC50aHVtYnN0aWNrWCA9IF9jb250cm9sbGVyLmdhbWVwYWQuYXhlc1syXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwudGh1bWJzdGlja1kgPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbM107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIChcImxlZnRcIik6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybS5tdHhMb2NhbC5zZXQoX3hyRnJhbWUuZ2V0UG9zZShfY29udHJvbGxlci50YXJnZXRSYXlTcGFjZSwgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52ckRldmljZS5sZWZ0Q250cmwuZ2FtZVBhZClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLmxlZnRDbnRybC5nYW1lUGFkID0gX2NvbnRyb2xsZXIuZ2FtZXBhZDtcclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwudGh1bWJzdGlja1ggPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbMl07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwudGh1bWJzdGlja1kgPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbM107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuZXJyb3IoXCJJbnB1dCBTb3VyY2VzIEVycm9yOiBcIiArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEZpbGVuYW1lVG9Db250ZW50IHtcclxuICAgIFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGZpbGUgdHJhbnNmZXIgZnJvbSBhIEZVREdFLUJyb3dzZXJhcHAgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gd2l0aG91dCBhIGxvY2FsIHNlcnZlci4gIFxyXG4gICAqIFNhdmVzIHRvIHRoZSBkb3dubG9hZC1wYXRoIGdpdmVuIGJ5IHRoZSBicm93c2VyLCBsb2FkcyBmcm9tIHRoZSBwbGF5ZXIncyBjaG9pY2UuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZpbGVJb0Jyb3dzZXJMb2NhbCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdG9yOiBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdG8gYXN5bmMgZnVuY3Rpb24gdG8gYmUgaGFuZGxlZCB1c2luZyBwcm9taXNlLCBpbnN0ZWFkIG9mIHVzaW5nIGV2ZW50IHRhcmdldFxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIGZpbGUgc2VsZWN0IGRpYWxvZyB0byBsb2FkIGZpbGVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbSBpbnRvIGJyb3dzZXIgYXBwbGljYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8TWFwRmlsZW5hbWVUb0NvbnRlbnQ+IHtcclxuICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IubXVsdGlwbGUgPSBfbXVsdGlwbGU7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC5zZWxlY3Rvci5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBGaWxlSW9Ccm93c2VyTG9jYWwuaGFuZGxlRmlsZVNlbGVjdCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNYXBGaWxlbmFtZVRvQ29udGVudD4oX3Jlc29sdmUgPT4ge1xyXG4gICAgICAgIGZ1bmN0aW9uIGhuZExvYWRlZChfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgICBGaWxlSW9Ccm93c2VyTG9jYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX0xPQURFRCwgaG5kTG9hZGVkKTtcclxuICAgICAgICAgIF9yZXNvbHZlKCg8Q3VzdG9tRXZlbnQ+X2V2ZW50KS5kZXRhaWwubWFwRmlsZW5hbWVUb0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9MT0FERUQsIGhuZExvYWRlZCk7XHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yLmNsaWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIGhhbmRsZWQgdXNpbmcgcHJvbWlzZSwgaW5zdGVhZCBvZiB1c2luZyBldmVudCB0YXJnZXRcclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBhIGZpbGUgZG93bmxvYWQgZGlhbG9nIHRvIHNhdmUgZmlsZXMgdG8gbG9jYWwgZmlsZXN5c3RlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzYXZlKF90b1NhdmU6IE1hcEZpbGVuYW1lVG9Db250ZW50LCBfdHlwZTogc3RyaW5nID0gXCJ0ZXh0L3BsYWluXCIpOiBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGVuYW1lIGluIF90b1NhdmUpIHtcclxuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nID0gX3RvU2F2ZVtmaWxlbmFtZV07XHJcbiAgICAgICAgbGV0IGJsb2I6IEJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogX3R5cGUgfSk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgLy8qLyB1c2luZyBhbmNob3IgZWxlbWVudCBmb3IgZG93bmxvYWRcclxuICAgICAgICBsZXQgZG93bmxvYWRlcjogSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgZG93bmxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCB1cmwpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgZG93bmxvYWRlci5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PihfcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgX3Jlc29sdmUoX3RvU2F2ZSk7XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gaG5kU2F2ZWQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8vICAgRmlsZUlvQnJvd3NlckxvY2FsLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9TQVZFRCwgaG5kU2F2ZWQpO1xyXG4gICAgICAgIC8vICAgX3Jlc29sdmUoKDxDdXN0b21FdmVudD5fZXZlbnQpLmRldGFpbCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBGaWxlSW9Ccm93c2VyTG9jYWwuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX1NBVkVELCBobmRTYXZlZCk7XHJcbiAgICAgICAgLy8gbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVC5GSUxFX1NBVkVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogX3RvU2F2ZSB9IH0pO1xyXG4gICAgICAgIC8vIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgdGhlIGZpbGVzIHJlZmVyZW5jZWQgaW4ge0BsaW5rIEZpbGVMaXN0fSBpbnRvIHRoZSBwcm92aWRlZCB7QGxpbmsgTWFwRmlsZW5hbWVUb0NvbnRlbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZEZpbGVzKF9maWxlTGlzdDogRmlsZUxpc3QsIF9sb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGUgb2YgX2ZpbGVMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgbmV3IFJlc3BvbnNlKGZpbGUpLnRleHQoKTtcclxuICAgICAgICBfbG9hZGVkW2ZpbGUubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaGFuZGxlRmlsZVNlbGVjdChfZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFuZGxlRmlsZVNlbGVjdFwiKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IpO1xyXG4gICAgICBsZXQgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gKDxIVE1MSW5wdXRFbGVtZW50Pl9ldmVudC50YXJnZXQpLmZpbGVzO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShmaWxlTGlzdCwgZmlsZUxpc3QubGVuZ3RoKTtcclxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBsb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50ID0ge307XHJcbiAgICAgIGF3YWl0IEZpbGVJb0Jyb3dzZXJMb2NhbC5sb2FkRmlsZXMoZmlsZUxpc3QsIGxvYWRlZCk7XHJcblxyXG4gICAgICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWRU5ULkZJTEVfTE9BREVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogbG9hZGVkIH0gfSk7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59ICIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIE11dGFibGUgYXJyYXkgb2Yge0BsaW5rIE11dGFibGV9cy4gVGhlIHtAbGluayBNdXRhdG9yfXMgb2YgdGhlIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIGFycmF5IGluIHRoZSB7QGxpbmsgTXV0YXRvcn1cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE11dGFibGVBcnJheTxUIGV4dGVuZHMgTXV0YWJsZT4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICAjdHlwZTogbmV3ICgpID0+IFQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKCkgPT4gVCwgLi4uX2FyZ3M6IFRbXSkge1xyXG4gICAgICBzdXBlciguLi5fYXJncyk7XHJcbiAgICAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogbmV3ICgpID0+IFQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYXJyYW5nZSB0aGUgZW50cmllcyBvZiB0aGUgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBpbmRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFycmFuZ2UoX3NlcXVlbmNlOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaW5kZXggb2YgX3NlcXVlbmNlKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsOiBUID0gdGhpc1tpbmRleF07XHJcbiAgICAgICAgLy8gVE9ETzogb3B0aW1pemUsIGNvcHkgb25seSBkb3VibGUgZW50cmllc1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGxldCBjb3B5OiBUID0gbmV3IG9yaWdpbmFsLmNvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgY29weS5tdXRhdGUob3JpZ2luYWwuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgICB0aGlzLnB1c2goY29weSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zcGxpY2UoMCwgbGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGlzIGFycmF5cyBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHR5cGVzIGFzIHN0cmluZy12YWx1ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpXHJcbiAgICAgICAgdHlwZXNbZW50cnldID0gdGhpc1tlbnRyeV0uY29uc3RydWN0b3IubmFtZTtcclxuXHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBlYWNoIGVsZW1lbnRzIG11dGF0b3IgYnkgaW52b2tpbmcge0BsaW5rIE11dGFibGUuZ2V0TXV0YXRvcn0gb24gdGhlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWFwKChfdmFsdWUpID0+IF92YWx1ZS5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBNdXRhYmxlLmdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2UoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11dGF0ZSB0aGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBkZWZpbmVkIGJ5IHRoZSBfbXV0YXRvciBieSBpbnZva2luZyB7QGxpbmsgTXV0YWJsZS5tdXRhdGV9IG9uIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgaW4gX211dGF0b3IpXHJcbiAgICAgICAgYXdhaXQgdGhpc1s8R2VuZXJhbD5lbnRyeV0ubXV0YXRlKF9tdXRhdG9yW2VudHJ5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIG11dGF0b3IgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBlbnRyeSBpbiB0aGlzKSB7XHJcbiAgICAgICAgbGV0IG11dGF0b3JWYWx1ZTogT2JqZWN0ID0gX211dGF0b3JbZW50cnldO1xyXG4gICAgICAgIGlmICghbXV0YXRvclZhbHVlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKHRoaXNbZW50cnldIGluc3RhbmNlb2YgTXV0YWJsZSlcclxuICAgICAgICAgIF9tdXRhdG9yW2VudHJ5XSA9IHRoaXNbZW50cnldLmdldE11dGF0b3IoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBfbXV0YXRvcltlbnRyeV0gPSB0aGlzW2VudHJ5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIE1PREUge1xyXG4gICAgRURJVE9SLCBSVU5USU1FXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBSRVNPVVJDRV9TVEFUVVMge1xyXG4gICAgUEVORElORywgUkVBRFksIEVSUk9SXHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgZXh0ZW5kcyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICB1cmw6IFJlcXVlc3RJbmZvO1xyXG4gICAgc3RhdHVzOiBSRVNPVVJDRV9TVEFUVVM7XHJcbiAgICBsb2FkKCk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD47XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZVJlc291cmNlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGlkUmVzb3VyY2U6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VzIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBTZXJpYWxpemFibGVSZXNvdXJjZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBTZXJpYWxpemF0aW9uO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBTY3JpcHROYW1lc3BhY2VzIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBPYmplY3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFNjcmlwdHMge1xyXG4gICAgW25hbWVzcGFjZTogc3RyaW5nXTogQ29tcG9uZW50U2NyaXB0W107XHJcbiAgfVxyXG5cclxuICBpbnRlcmZhY2UgR3JhcGhJbnN0YW5jZXNUb1Jlc3luYyB7XHJcbiAgICBbaWRSZXNvdXJjZTogc3RyaW5nXTogR3JhcGhJbnN0YW5jZVtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhdGljIGNsYXNzIGhhbmRsaW5nIHRoZSByZXNvdXJjZXMgdXNlZCB3aXRoIHRoZSBjdXJyZW50IEZVREdFLWluc3RhbmNlLiAgXHJcbiAgICogS2VlcHMgYSBsaXN0IG9mIHRoZSByZXNvdXJjZXMgYW5kIGdlbmVyYXRlcyBpZHMgdG8gcmV0cmlldmUgdGhlbS4gIFxyXG4gICAqIFJlc291cmNlcyBhcmUgb2JqZWN0cyByZWZlcmVuY2VkIG11bHRpcGxlIHRpbWVzIGJ1dCBzdXBwb3NlZCB0byBiZSBzdG9yZWQgb25seSBvbmNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFByb2plY3QgZXh0ZW5kcyBFdmVudFRhcmdldFN0YXRpYyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlc291cmNlczogUmVzb3VyY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb25PZlJlc291cmNlcyA9IHt9O1xyXG4gICAgcHVibGljIHN0YXRpYyBzY3JpcHROYW1lc3BhY2VzOiBTY3JpcHROYW1lc3BhY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIGJhc2VVUkw6IFVSTCA9IG5ldyBVUkwobG9jYXRpb24udG9TdHJpbmcoKSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIG1vZGU6IE1PREUgPSBNT0RFLlJVTlRJTUU7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdyYXBoSW5zdGFuY2VzVG9SZXN5bmM6IEdyYXBoSW5zdGFuY2VzVG9SZXN5bmMgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyB0aGUgcmVzb3VyY2UgYW5kIGdlbmVyYXRlcyBhbiBpZCBmb3IgaXQgYnkgZGVmYXVsdC4gIFxyXG4gICAgICogSWYgdGhlIHJlc291cmNlIGFscmVhZHkgaGFzIGFuIGlkLCB0aHVzIGhhdmluZyBiZWVuIHJlZ2lzdGVyZWQsIGl0cyBkZWxldGVkIGZyb20gdGhlIGxpc3QgYW5kIHJlZ2lzdGVyZWQgYW5ldy5cclxuICAgICAqIEl0J3MgcG9zc2libGUgdG8gcGFzcyBhbiBpZCwgYnV0IHNob3VsZCBub3QgYmUgZG9uZSBleGNlcHQgYnkgdGhlIFNlcmlhbGl6ZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIoX3Jlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSwgX2lkUmVzb3VyY2U/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9yZXNvdXJjZS5pZFJlc291cmNlICYmIF9yZXNvdXJjZS5pZFJlc291cmNlID09IF9pZFJlc291cmNlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGlmIChfcmVzb3VyY2UuaWRSZXNvdXJjZSkgLy8gZGVyZWdpc3RlciB0aGUgb2xkIGlkXHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyKF9yZXNvdXJjZSk7XHJcblxyXG4gICAgICBpZiAoX2lkUmVzb3VyY2UpIHtcclxuICAgICAgICBfcmVzb3VyY2UuaWRSZXNvdXJjZSA9IF9pZFJlc291cmNlO1xyXG4gICAgICAgIHRoaXMuZGVyZWdpc3RlcihfcmVzb3VyY2UpOyAvLyBkZXJlZ2lzdGVyIHRoZSBuZXcgaWRcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFfcmVzb3VyY2UuaWRSZXNvdXJjZSlcclxuICAgICAgICBfcmVzb3VyY2UuaWRSZXNvdXJjZSA9IFByb2plY3QuZ2VuZXJhdGVJZChfcmVzb3VyY2UpO1xyXG5cclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXNbX3Jlc291cmNlLmlkUmVzb3VyY2VdID0gX3Jlc291cmNlO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoKVxyXG4gICAgICAgIF9yZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX01VVEFURUQsIChfZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEVWRU5ULkdSQVBIX01VVEFURUQsIHsgZGV0YWlsOiBfcmVzb3VyY2UgfSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIHJlc291cmNlIGZyb20gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlcmVnaXN0ZXIoX3Jlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgKFByb2plY3QucmVzb3VyY2VzW19yZXNvdXJjZS5pZFJlc291cmNlXSk7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5zZXJpYWxpemF0aW9uW19yZXNvdXJjZS5pZFJlc291cmNlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIGFuZCB0aGVpciBzZXJpYWxpemF0aW9uLCB0aHVzIHJlbW92aW5nIGFsbCByZXNvdXJjZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIFByb2plY3QucmVzb3VyY2VzID0ge307XHJcbiAgICAgIFByb2plY3Quc2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBQcm9qZWN0LmNsZWFyU2NyaXB0TmFtZXNwYWNlcygpO1xyXG4gICAgICAvLyBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA8VCBleHRlbmRzIENvbXBvbmVudD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFRbXSB7XHJcbiAgICAvLyAgIHJldHVybiA8VFtdPih0aGlzLmNvbXBvbmVudHNbX2NsYXNzLm5hbWVdIHx8IFtdKS5zbGljZSgwKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHJlc291cmNlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb3VyY2VzQnlUeXBlPFQ+KF90eXBlOiBuZXcgKF9hcmdzOiBHZW5lcmFsKSA9PiBUKTogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCByZXNvdXJjZUlkIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlSWRdO1xyXG4gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIF90eXBlKVxyXG4gICAgICAgICAgZm91bmQucHVzaChyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVzb3VyY2VzIHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFJlc291cmNlc0J5TmFtZShfbmFtZTogc3RyaW5nKTogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogU2VyaWFsaXphYmxlUmVzb3VyY2VbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCByZXNvdXJjZUlkIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlSWRdO1xyXG4gICAgICAgIGlmIChyZXNvdXJjZS5uYW1lID09IF9uYW1lKVxyXG4gICAgICAgICAgZm91bmQucHVzaChyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGEgdXNlciByZWFkYWJsZSBhbmQgdW5pcXVlIGlkIHVzaW5nIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSwgdGhlIGRhdGUgYW5kIHJhbmRvbSBudW1iZXJzXHJcbiAgICAgKiBAcGFyYW0gX3Jlc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVJZChfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlKTogc3RyaW5nIHtcclxuICAgICAgLy8gVE9ETzogYnVpbGQgaWQgYW5kIGludGVncmF0ZSBpbmZvIGZyb20gcmVzb3VyY2UsIG5vdCBqdXN0IGRhdGVcclxuICAgICAgbGV0IGlkUmVzb3VyY2U6IHN0cmluZztcclxuICAgICAgZG9cclxuICAgICAgICBpZFJlc291cmNlID0gX3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWUgKyBcInxcIiArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArIFwifFwiICsgTWF0aC5yYW5kb20oKS50b1ByZWNpc2lvbig1KS5zdWJzdHIoMiwgNSk7XHJcbiAgICAgIHdoaWxlIChQcm9qZWN0LnJlc291cmNlc1tpZFJlc291cmNlXSk7XHJcbiAgICAgIHJldHVybiBpZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMsIGlmIGFuIG9iamVjdCBpcyBhIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZX1cclxuICAgICAqIEBwYXJhbSBfb2JqZWN0IFRoZSBvYmplY3QgdG8gZXhhbWluZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUmVzb3VyY2UoX29iamVjdDogU2VyaWFsaXphYmxlKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoUmVmbGVjdC5oYXMoX29iamVjdCwgXCJpZFJlc291cmNlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgcmVzb3VyY2Ugc3RvcmVkIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0UmVzb3VyY2UoX2lkUmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+IHtcclxuICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW19pZFJlc291cmNlXTtcclxuICAgICAgaWYgKCFyZXNvdXJjZSkge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gUHJvamVjdC5zZXJpYWxpemF0aW9uW19pZFJlc291cmNlXTtcclxuICAgICAgICBpZiAoIXNlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIsIF9pZFJlc291cmNlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvdXJjZSA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemVSZXNvdXJjZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjbG9uZVJlc291cmNlKF9yZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlPiB7XHJcbiAgICAgIGlmICghX3Jlc291cmNlKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShfcmVzb3VyY2UpO1xyXG4gICAgICBsZXQgdHlwZTogc3RyaW5nID0gPHN0cmluZz5SZWZsZWN0Lm93bktleXMoc2VyaWFsaXphdGlvbilbMF07XHJcbiAgICAgIGRlbGV0ZSAoc2VyaWFsaXphdGlvblt0eXBlXS5pZFJlc291cmNlKTtcclxuICAgICAgbGV0IGNsb25lOiB0eXBlb2YgX3Jlc291cmNlID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZVJlc291cmNlKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKGNsb25lKTtcclxuICAgICAgY2xvbmUubmFtZSArPSBcIl9jbG9uZVwiO1xyXG4gICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSByZXNvdXJjZSBmcm9tIGEge0BsaW5rIE5vZGV9LCBjb3B5aW5nIHRoZSBjb21wbGV0ZSBncmFwaCBzdGFydGluZyB3aXRoIGl0XHJcbiAgICAgKiBAcGFyYW0gX25vZGUgQSBub2RlIHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgZnJvbVxyXG4gICAgICogQHBhcmFtIF9yZXBsYWNlV2l0aEluc3RhbmNlIGlmIHRydWUgKGRlZmF1bHQpLCB0aGUgbm9kZSB1c2VkIGFzIG9yaWdpbiBpcyByZXBsYWNlZCBieSBhIHtAbGluayBHcmFwaEluc3RhbmNlfSBvZiB0aGUge0BsaW5rIEdyYXBofSBjcmVhdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVnaXN0ZXJBc0dyYXBoKF9ub2RlOiBOb2RlLCBfcmVwbGFjZVdpdGhJbnN0YW5jZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPEdyYXBoPiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gX25vZGUuc2VyaWFsaXplKCk7XHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSBuZXcgR3JhcGgoX25vZGUubmFtZSk7XHJcbiAgICAgIGF3YWl0IGdyYXBoLmRlc2VyaWFsaXplKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKGdyYXBoKTtcclxuXHJcbiAgICAgIGlmIChfcmVwbGFjZVdpdGhJbnN0YW5jZSAmJiBfbm9kZS5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgIGxldCBpbnN0YW5jZTogR3JhcGhJbnN0YW5jZSA9IGF3YWl0IFByb2plY3QuY3JlYXRlR3JhcGhJbnN0YW5jZShncmFwaCk7XHJcbiAgICAgICAgX25vZGUuZ2V0UGFyZW50KCkucmVwbGFjZUNoaWxkKF9ub2RlLCBpbnN0YW5jZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBncmFwaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gb2YgdGhlIGdpdmVuIHtAbGluayBHcmFwaH0gXHJcbiAgICAgKiBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIGdyYXBoIGZvciBzeW5jaHJvbmlzYXRpb24gb2YgbXV0YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlR3JhcGhJbnN0YW5jZShfZ3JhcGg6IEdyYXBoKTogUHJvbWlzZTxHcmFwaEluc3RhbmNlPiB7XHJcbiAgICAgIGxldCBpbnN0YW5jZTogR3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaEluc3RhbmNlKF9ncmFwaCk7IC8vIFRPRE86IGNsZWFudXAgc2luY2UgY3JlYXRpb24gbW92ZWQgaGVyZVxyXG4gICAgICBhd2FpdCBpbnN0YW5jZS5jb25uZWN0VG9HcmFwaCgpO1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciB0aGUgZ2l2ZW4ge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHRvIGJlIHJlc3luY2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJHcmFwaEluc3RhbmNlRm9yUmVzeW5jKF9pbnN0YW5jZTogR3JhcGhJbnN0YW5jZSk6IHZvaWQge1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBHcmFwaEluc3RhbmNlW10gPSBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2luc3RhbmNlLmlkU291cmNlXSB8fCBbXTtcclxuICAgICAgaW5zdGFuY2VzLnB1c2goX2luc3RhbmNlKTtcclxuICAgICAgUHJvamVjdC5ncmFwaEluc3RhbmNlc1RvUmVzeW5jW19pbnN0YW5jZS5pZFNvdXJjZV0gPSBpbnN0YW5jZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN5bmMgYWxsIHtAbGluayBHcmFwaEluc3RhbmNlfSByZWdpc3RlcmVkIHRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVzeW5jR3JhcGhJbnN0YW5jZXMoX2dyYXBoOiBHcmFwaCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBHcmFwaEluc3RhbmNlW10gPSBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2dyYXBoLmlkUmVzb3VyY2VdO1xyXG4gICAgICBpZiAoIWluc3RhbmNlcylcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGZvciAobGV0IGluc3RhbmNlIG9mIGluc3RhbmNlcylcclxuICAgICAgICBhd2FpdCBpbnN0YW5jZS5jb25uZWN0VG9HcmFwaCgpO1xyXG4gICAgICBkZWxldGUgKFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfZ3JhcGguaWRSZXNvdXJjZV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgdGhlIGdpdmVuIG5hbWVzcGFjZSB0byB0aGUgbGlzdCBvZiBzY3JpcHQtbmFtZXNwYWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlclNjcmlwdE5hbWVzcGFjZShfbmFtZXNwYWNlOiBPYmplY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IFNlcmlhbGl6ZXIucmVnaXN0ZXJOYW1lc3BhY2UoX25hbWVzcGFjZSk7XHJcbiAgICAgIGlmICghUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdKVxyXG4gICAgICAgIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lXSA9IF9uYW1lc3BhY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBzY3JpcHQtbmFtZXNwYWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhclNjcmlwdE5hbWVzcGFjZXMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgUmVmbGVjdC5zZXQod2luZG93LCBuYW1lLCB1bmRlZmluZWQpO1xyXG4gICAgICAgIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBkZWxldGUgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0cyBhbGwge0BsaW5rIENvbXBvbmVudFNjcmlwdH1zIHJlZ2lzdGVyZWQgaW4ge0BsaW5rIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc30gYW5kIHJldHVybnMgdGhlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb21wb25lbnRTY3JpcHRzKCk6IENvbXBvbmVudFNjcmlwdHMge1xyXG4gICAgICBsZXQgY29tcG9tZW50czogQ29tcG9uZW50U2NyaXB0cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lc3BhY2UgaW4gUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgY29tcG9tZW50c1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZXNwYWNlXSkge1xyXG4gICAgICAgICAgbGV0IHNjcmlwdDogQ29tcG9uZW50U2NyaXB0ID0gUmVmbGVjdC5nZXQoUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVzcGFjZV0sIG5hbWUpO1xyXG4gICAgICAgICAgLy8gVXNpbmcgT2JqZWN0LmNyZWF0ZSBkb2Vzbid0IGNhbGwgdGhlIGNvbnN0cnVjdG9yLCBidXQgaW5zdGFuY2VvZiBjYW4gYmUgdXNlZC4gTW9yZSBlbGVnYW50IHRoYW4gdGhlIGxvb3AgYWJvdmUsIHRob3VnaCBtYXliZSBub3QgYXMgcGVyZm9ybWFudC4gXHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IG86IEdlbmVyYWwgPSBPYmplY3QuY3JlYXRlKHNjcmlwdCk7XHJcbiAgICAgICAgICAgIGlmIChvLnByb3RvdHlwZSBpbnN0YW5jZW9mIENvbXBvbmVudFNjcmlwdClcclxuICAgICAgICAgICAgICBjb21wb21lbnRzW25hbWVzcGFjZV0ucHVzaChzY3JpcHQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoX2UpIHsgLyogKi8gfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcG9tZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgc2NyaXB0IGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgaW50ZWdyYXRlcyBpdCBpbnRvIGEge0BsaW5rIEhUTUxTY3JpcHRFbGVtZW50fSBpbiB0aGUge0BsaW5rIGRvY3VtZW50LmhlYWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFNjcmlwdChfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcbiAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuICAgICAgLy8gc2NyaXB0LnR5cGUgPSBcIm1vZHVsZVwiO1xyXG4gICAgICBzY3JpcHQuYXN5bmMgPSBmYWxzZTtcclxuICAgICAgLy8gc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGhhbmRsZUxvYWRlZFNjcmlwdClcclxuICAgICAgbGV0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQ7XHJcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxuICAgICAgRGVidWcubG9nKFwiTG9hZGluZzogXCIsIF91cmwpO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xyXG4gICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiBfcmVzb2x2ZSgpKTtcclxuICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsICgpID0+IHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiTG9hZGluZyBzY3JpcHRcIiwgX3VybCk7XHJcbiAgICAgICAgICBfcmVqZWN0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IF91cmwudG9TdHJpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHtAbGluayBSZXNvdXJjZXN9IGZyb20gdGhlIGdpdmVuIHVybFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZXMoX3VybDogUmVxdWVzdEluZm8pOiBQcm9taXNlPFJlc291cmNlcz4ge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChfdXJsKTtcclxuICAgICAgY29uc3QgcmVzb3VyY2VGaWxlQ29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBTZXJpYWxpemVyLnBhcnNlKHJlc291cmNlRmlsZUNvbnRlbnQpO1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Rpb246IFJlc291cmNlcyA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIFByb2plY3QuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuUkVTT1VSQ0VTX0xPQURFRCwgeyBkZXRhaWw6IHsgdXJsOiBfdXJsLCByZXNvdXJjZXM6IHJlY29uc3RydWN0aW9uIH0gfSkpO1xyXG4gICAgICByZXR1cm4gcmVjb25zdHJ1Y3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGFsbCByZXNvdXJjZXMgZnJvbSB0aGUge0BsaW5rIGRvY3VtZW50LmhlYWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFJlc291cmNlc0Zyb21IVE1MKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBoZWFkOiBIVE1MSGVhZEVsZW1lbnQgPSBkb2N1bWVudC5oZWFkO1xyXG4gICAgICBsZXQgbGlua3M6IE5vZGVMaXN0T2Y8SFRNTExpbmtFbGVtZW50PiA9IGhlYWQucXVlcnlTZWxlY3RvckFsbChcImxpbmtbdHlwZT1yZXNvdXJjZXNdXCIpO1xyXG4gICAgICBmb3IgKGxldCBsaW5rIG9mIGxpbmtzKSB7XHJcbiAgICAgICAgbGV0IHVybDogUmVxdWVzdEluZm8gPSBsaW5rLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcclxuICAgICAgICBhd2FpdCBQcm9qZWN0LmxvYWRSZXNvdXJjZXModXJsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplIGFsbCByZXNvdXJjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb25PZlJlc291cmNlcyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBpZFJlc291cmNlIGluIFByb2plY3QucmVzb3VyY2VzKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IFByb2plY3QucmVzb3VyY2VzW2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGlmIChpZFJlc291cmNlICE9IHJlc291cmNlLmlkUmVzb3VyY2UpXHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihcIlJlc291cmNlLWlkIG1pc21hdGNoXCIsIHJlc291cmNlKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uW2lkUmVzb3VyY2VdID0gU2VyaWFsaXplci5zZXJpYWxpemUocmVzb3VyY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHJlc291cmNlcyBmcm9tIGEgc2VyaWFsaXphdGlvbiwgZGVsZXRpbmcgYWxsIHJlc291cmNlcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWRcclxuICAgICAqIEBwYXJhbSBfc2VyaWFsaXphdGlvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzKTogUHJvbWlzZTxSZXNvdXJjZXM+IHtcclxuICAgICAgUHJvamVjdC5zZXJpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb247XHJcbiAgICAgIFByb2plY3QucmVzb3VyY2VzID0ge307XHJcbiAgICAgIGZvciAobGV0IGlkUmVzb3VyY2UgaW4gX3NlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IF9zZXJpYWxpemF0aW9uW2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGxldCByZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UgPSBhd2FpdCBQcm9qZWN0LmRlc2VyaWFsaXplUmVzb3VyY2Uoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgaWYgKHJlc291cmNlKVxyXG4gICAgICAgICAgUHJvamVjdC5yZXNvdXJjZXNbaWRSZXNvdXJjZV0gPSByZXNvdXJjZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUHJvamVjdC5yZXNvdXJjZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemVSZXNvdXJjZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+IHtcclxuICAgICAgcmV0dXJuIDxQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlPj5TZXJpYWxpemVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRkJYIHtcclxuICAvKipcclxuICAgKiBSZWFkZXIgdG8gcmVhZCBkYXRhIGZyb20gYW4gYXJyYXkgYnVmZmVyIG1vcmUgY29udmVuaWVudGx5LlxyXG4gICAqIEl0IHNhdmVzIGEgY3VycmVudCBvZmZzZXQgd2hpY2ggaXMgdXBkYXRlZCB3aGVuIGRhdGEgaXMgcmVhZCBkdWUgdG8gaXRzIGJ5dGVsZW5ndGguXHJcbiAgICogZGVzcGl0ZSBnZXRTZXF1ZW5jZSBpdCBpcyBtb3N0bHkgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9waWNvZGU3L2JpbmFyeS1yZWFkZXJcclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEJ1ZmZlclJlYWRlciB7XHJcbiAgICBwdWJsaWMgb2Zmc2V0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmlldzogRGF0YVZpZXc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9idWZmZXI6IEFycmF5QnVmZmVyKSB7XHJcbiAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhfYnVmZmVyKTtcclxuICAgICAgdGhpcy5vZmZzZXQgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFyKF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5nZXRVaW50OChfb2Zmc2V0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEJvb2woX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VWludDgoX29mZnNldCkgIT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VWludDgoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyAxO1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQ4KF9vZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQzMihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VWludDY0KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogYmlnaW50IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgODtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdVaW50NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEludDE2KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogbnVtYmVyIHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgMjtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRJbnQxNihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbnQ2NChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IGJpZ2ludCB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDg7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QmlnSW50NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEZsb2F0MzIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA0O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0MzIoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEZsb2F0NjQoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA4O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFN0cmluZyhfbGVuZ3RoOiBudW1iZXIsIF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4udGhpcy5nZXRTZXF1ZW5jZSh0aGlzLmdldFVpbnQ4LCBfbGVuZ3RoLCBfb2Zmc2V0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljICpnZXRTZXF1ZW5jZTxUIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihfZ2V0dGVyOiAoKSA9PiBULCBfbGVuZ3RoOiBudW1iZXIsIF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogR2VuZXJhdG9yPFQ+IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0O1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgeWllbGQgX2dldHRlci5jYWxsKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYnggZmlsZXMgY29udGFpbmluZyBpdHMgZG9jdW1lbnRzLCBkZWZpbml0aW9ucywgb2JqZWN0cyBhbmQgY29ubmVjdGlvbnMuXHJcbiAgICogSXRzIG9iamVjdHMgYXJlIGRldmlkZWQgaW4gYWxsIGFuZCB0aGUgZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBGQlgge1xyXG4gICAgZG9jdW1lbnRzOiBEb2N1bWVudFtdO1xyXG4gICAgZGVmaW5pdGlvbnM/OiBEZWZpbml0aW9ucztcclxuICAgIG9iamVjdHM6IHtcclxuICAgICAgYWxsOiBPYmplY3RbXTtcclxuICAgICAgbW9kZWxzOiBNb2RlbFtdO1xyXG4gICAgICBnZW9tZXRyaWVzOiBHZW9tZXRyeVtdO1xyXG4gICAgICBwb3NlczogT2JqZWN0W107XHJcbiAgICAgIG1hdGVyaWFsczogTWF0ZXJpYWxbXTtcclxuICAgICAgdGV4dHVyZXM6IFRleHR1cmVbXTtcclxuICAgICAgYW5pbVN0YWNrczogT2JqZWN0W107XHJcbiAgICB9O1xyXG4gICAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXTtcclxuICB9XHJcblxyXG4gIGludGVyZmFjZSBPYmplY3RCYXNlIHtcclxuICAgIHVpZDogbnVtYmVyO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZT86IHN0cmluZztcclxuICAgIHN1YnR5cGU/OiBzdHJpbmc7XHJcbiAgICBjaGlsZHJlbj86IE9iamVjdFtdO1xyXG4gICAgcGFyZW50cz86IE9iamVjdFtdO1xyXG5cclxuICAgIGxvYWRlZDogYm9vbGVhbjtcclxuICAgIGxvYWQ6ICgpID0+IE9iamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVyZmFjZSB0byByZXByZXNlbnQgZmJ4LW9iamVjdHMuXHJcbiAgICogQWxsIGZpZWxkcyBvdGhlciB0aGFuIHVpZCwgbmFtZSwgdHlwZSwgc3VidHlwZSwgY2hpbGRyZW4gYW5kIHBhcmVudHMgYXJlIGxvYWRlZCB3aXRoIHRoZSBsb2FkLW1ldGhvZC5cclxuICAgKiBFYWNoIG9iamVjdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwbGljaXQgZmJ4IG9iamVjdCB0eXBlIGRlZmluZWQgaW4gRnVkZ2VDb3JlLkZCWC4gRXhwbGljaXQgdHlwZXMgaGF2ZSBiZWVuIGRlZmluZWRcclxuICAgKiB3aXRoIHRoZSBoZWxwIG9mIGZvbGxvd2luZyByZWZlcmVuY2U6XHJcbiAgICogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE9iamVjdCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE5vZGVQcm9wZXJ0eSB8IHsgW25hbWU6IHN0cmluZ106IE5vZGVQcm9wZXJ0eSB9IHwgUHJvcGVydHk3MCB8IE9iamVjdCB8IE9iamVjdFtdIHwgKCgpID0+IE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIERvY3VtZW50IGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBTb3VyY2VPYmplY3Q/OiB1bmRlZmluZWQ7XHJcbiAgICBBY3RpdmVBbmltU3RhY2tOYW1lPzogc3RyaW5nO1xyXG4gICAgUm9vdE5vZGU/OiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE5vZGVBdHRyaWJ1dGUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFR5cGVGbGFncz86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgR2VvbWV0cnkgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEdlb21ldHJ5VmVyc2lvbj86IG51bWJlcjtcclxuICAgIFZlcnRpY2VzPzogRmxvYXQzMkFycmF5O1xyXG4gICAgUG9seWdvblZlcnRleEluZGV4PzogSW50MzJBcnJheTtcclxuICAgIExheWVyRWxlbWVudE5vcm1hbD86IExheWVyRWxlbWVudE5vcm1hbDtcclxuICAgIExheWVyRWxlbWVudFVWPzogTGF5ZXJFbGVtZW50VVY7IC8vIHwgTGF5ZXJFbGVtZW50VVZbXTsgLy8gVE9ETzogbWlnaHQgbmVlZCB0byByZWFkZCB0aGlzXHJcbiAgICBMYXllckVsZW1lbnRNYXRlcmlhbD86IExheWVyRWxlbWVudE1hdGVyaWFsO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIExjbFRyYW5zbGF0aW9uPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBBbmltQ3VydmVOb2RlO1xyXG4gICAgTGNsUm90YXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBMY2xTY2FsaW5nPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBBbmltQ3VydmVOb2RlO1xyXG4gICAgUHJlUm90YXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIFBvc3RSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU2NhbGluZ09mZnNldD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU2NhbGluZ1Bpdm90PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBSb3RhdGlvbk9mZnNldD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgUm90YXRpb25QaXZvdD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgSW5oZXJpdFR5cGU/OiBudW1iZXI7XHJcbiAgICBFdWxlck9yZGVyPzogc3RyaW5nO1xyXG4gICAgY3VycmVudFVWU2V0Pzogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbCBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIFNoYWRpbmdNb2RlbD86IHN0cmluZztcclxuXHJcbiAgICBEaWZmdXNlPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBEaWZmdXNlQ29sb3I/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IFRleHR1cmU7XHJcbiAgICBEaWZmdXNlRmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIEFtYmllbnQ/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIEFtYmllbnRDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuXHJcbiAgICBTaGluaW5lc3M/OiBudW1iZXI7XHJcbiAgICBTaGluaW5lc3NFeHBvbmVudD86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuXHJcbiAgICBTcGVjdWxhcj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgU3BlY3VsYXJDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuICAgIFNwZWN1bGFyRmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIFJlZmxlY3Rpdml0eT86IG51bWJlcjtcclxuICAgIFJlZmxlY3Rpb25GYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgT3BhY2l0eT86IG51bWJlcjtcclxuICAgIFRyYW5zcGFyZW5jeUZhY3Rvcj86IG51bWJlcjtcclxuXHJcbiAgICBFbWlzc2l2ZT86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgTm9ybWFsTWFwPzogVGV4dHVyZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRGVmb3JtZXIgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFZlcnNpb24/OiBudW1iZXI7XHJcbiAgICBTa2lubmluZ1R5cGU/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFN1YkRlZm9ybWVyIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgVHJhbnNmb3JtPzogRmxvYXQzMkFycmF5O1xyXG4gICAgVHJhbnNmb3JtTGluaz86IEZsb2F0MzJBcnJheTtcclxuICAgIEluZGV4ZXM/OiBVaW50MTZBcnJheTtcclxuICAgIFdlaWdodHM/OiBGbG9hdDMyQXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gICAgUmVsYXRpdmVGaWxlbmFtZT86IHN0cmluZztcclxuICAgIE1vZGVsVVZTY2FsaW5nPzogbnVtYmVyO1xyXG4gICAgTW9kZWxVVlRyYW5zbGF0aW9uPzogbnVtYmVyO1xyXG4gICAgVVZTZXQ/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFZpZGVvIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBGaWxlTmFtZT86IHN0cmluZztcclxuICAgIFJlbGF0aXZlRmlsZW5hbWU/OiBzdHJpbmc7XHJcbiAgICBVc2VNaXBNYXA/OiBudW1iZXI7XHJcbiAgICBDb250ZW50PzogVWludDhBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbUN1cnZlTm9kZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgZFg/OiBudW1iZXIgfCBBbmltQ3VydmU7XHJcbiAgICBkWT86IG51bWJlciB8IEFuaW1DdXJ2ZTtcclxuICAgIGRaPzogbnVtYmVyIHwgQW5pbUN1cnZlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltQ3VydmUgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEtleVZlcj86IG51bWJlcjtcclxuICAgIERlZmF1bHQ/OiBudW1iZXI7XHJcbiAgICBLZXlUaW1lPzogQmlnSW50NjRBcnJheTtcclxuICAgIEtleVZhbHVlRmxvYXQ/OiBGbG9hdDMyQXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExheWVyRWxlbWVudCB7XHJcbiAgICBOYW1lOiBzdHJpbmc7XHJcbiAgICBWZXJzaW9uOiBudW1iZXI7XHJcbiAgICBNYXBwaW5nSW5mb3JtYXRpb25UeXBlOiBzdHJpbmc7XHJcbiAgICBSZWZlcmVuY2VJbmZvcm1hdGlvblR5cGU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50Tm9ybWFsIGV4dGVuZHMgTGF5ZXJFbGVtZW50IHtcclxuICAgIE5vcm1hbHM6IEZsb2F0MzJBcnJheTtcclxuICAgIE5vcm1hbHNXOiBGbG9hdDMyQXJyYXk7XHJcbiAgICBOb3JtYWxzSW5kZXg/OiBVaW50MTZBcnJheTsgLy8gVE9ETzogZmluZCBhbiBGQlggZmlsZSB3aGljaCB1c2VzIG5vcm1hbHMgaW5kZXhcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50VVYgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgVVY/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBVVkluZGV4PzogVWludDE2QXJyYXk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExheWVyRWxlbWVudE1hdGVyaWFsIGV4dGVuZHMgTGF5ZXJFbGVtZW50IHtcclxuICAgIE1hdGVyaWFscz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIE1BUFBJTkdfSU5GT1JNQVRJT05fVFlQRSB7XHJcbiAgICBCWV9WRVJURVgsIEJZX1BPTFlHT04sIEJZX1BPTFlHT05fVkVSVEVYLCBCWV9FREdFLCBBTExfU0FNRVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gUkVGRVJFTkNFX0lORk9STUFUSU9OX1RZUEUge1xyXG4gICAgRElSRUNULCBJTkRFWF9UT19ESVJFQ1RcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbiB7XHJcbiAgICBwYXJlbnRVSUQ6IG51bWJlcjtcclxuICAgIGNoaWxkVUlEOiBudW1iZXI7XHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRGVmaW5pdGlvbnMge1xyXG4gICAgdmVyc2lvbjogbnVtYmVyO1xyXG4gICAgb2JqZWN0VHlwZXM6IE9iamVjdFR5cGVbXTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBjb3VudDogbnVtYmVyO1xyXG4gICAgcHJvcGVydHlUZW1wbGF0ZTogUHJvcGVydHlUZW1wbGF0ZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlUZW1wbGF0ZSB7XHJcbiAgICBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBQcm9wZXJ0eTcwO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFzc2V0IGxvYWRlciBmb3IgRmlsbWJveCBmaWxlcy5cclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZCWExvYWRlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb2FkZXJzOiB7IFt1cmk6IHN0cmluZ106IEZCWExvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IGZieDogRkJYLkZCWDtcclxuICAgIHB1YmxpYyByZWFkb25seSBub2RlczogRkJYLk5vZGVbXTtcclxuICAgIHB1YmxpYyByZWFkb25seSB1cmk6IHN0cmluZztcclxuXHJcbiAgICAjc2NlbmVzOiBHcmFwaFtdO1xyXG4gICAgI25vZGVzOiBOb2RlW107XHJcbiAgICAjbWVzaGVzOiBNZXNoRkJYW107XHJcbiAgICAjbWF0ZXJpYWxzOiBNYXRlcmlhbFtdO1xyXG4gICAgI3NraW5NYXRlcmlhbHM6IE1hdGVyaWFsW10gPSBbXTtcclxuICAgICN0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuICAgICNhbmltYXRpb25zOiBBbmltYXRpb25bXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2J1ZmZlcjogQXJyYXlCdWZmZXIsIF91cmk6IHN0cmluZykge1xyXG4gICAgICB0aGlzLnVyaSA9IF91cmk7XHJcbiAgICAgIHRoaXMubm9kZXMgPSBGQlgucGFyc2VOb2Rlc0Zyb21CaW5hcnkoX2J1ZmZlcik7XHJcbiAgICAgIERlYnVnLmxvZyh0aGlzLm5vZGVzKTtcclxuICAgICAgdGhpcy5mYnggPSBGQlgubG9hZEZyb21Ob2Rlcyh0aGlzLm5vZGVzKTtcclxuICAgICAgRGVidWcubG9nKHRoaXMuZmJ4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbCB8fCAodGhpcy4jZGVmYXVsdE1hdGVyaWFsID1cclxuICAgICAgICBuZXcgTWF0ZXJpYWwoXCJGQlhEZWZhdWx0TWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZCwgbmV3IENvYXRSZW1pc3NpdmUoQ29sb3IuQ1NTKFwid2hpdGVcIikpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBkZWZhdWx0U2tpbk1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgfHwgKHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPVxyXG4gICAgICAgIG5ldyBNYXRlcmlhbChcIkZCWERlZmF1bHRTa2luTWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZFNraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIExPQUQoX3VyaTogc3RyaW5nKTogUHJvbWlzZTxGQlhMb2FkZXI+IHtcclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnMpXHJcbiAgICAgICAgdGhpcy5sb2FkZXJzID0ge307XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzW191cmldKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goX3VyaSk7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5OiBBcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXJzW191cmldID0gbmV3IEZCWExvYWRlcihiaW5hcnksIF91cmkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlcnNbX3VyaV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFNjZW5lKF9pbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNzY2VuZXMpXHJcbiAgICAgICAgdGhpcy4jc2NlbmVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jc2NlbmVzW19pbmRleF0pIHtcclxuICAgICAgICBjb25zdCBkb2N1bWVudEZCWDogRkJYLkRvY3VtZW50ID0gdGhpcy5mYnguZG9jdW1lbnRzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGNvbnN0IHNjZW5lOiBHcmFwaCA9IG5ldyBHcmFwaChkb2N1bWVudEZCWC5uYW1lKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkRkJYIG9mIGRvY3VtZW50RkJYLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1vZGVsXCIpIHtcclxuICAgICAgICAgICAgc2NlbmUuYWRkQ2hpbGQoYXdhaXQgdGhpcy5nZXROb2RlKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzLmluZGV4T2YoY2hpbGRGQlgpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mYngub2JqZWN0cy5hbmltU3RhY2tzICYmIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBhbmltYXRpb246IEFuaW1hdGlvbiA9IGF3YWl0IHRoaXMuZ2V0QW5pbWF0aW9uKGRvY3VtZW50RkJYLkFjdGl2ZUFuaW1TdGFja05hbWUubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5maW5kSW5kZXgoX2FuaW1TdGFjayA9PiBfYW5pbVN0YWNrLm5hbWUgPT0gZG9jdW1lbnRGQlguQWN0aXZlQW5pbVN0YWNrTmFtZSkgOiAwKTtcclxuICAgICAgICAgIGlmIChhbmltYXRpb24pXHJcbiAgICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50QW5pbWF0b3IoYW5pbWF0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNrZWxldG9uIG9mIHRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChza2VsZXRvbik7XHJcblxyXG4gICAgICAgIFByb2plY3QucmVnaXN0ZXIoc2NlbmUpO1xyXG4gICAgICAgIHRoaXMuI3NjZW5lc1tfaW5kZXhdID0gc2NlbmU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjZW5lc1tfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXMpXHJcbiAgICAgICAgdGhpcy4jbm9kZXMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNub2Rlc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5vZGUgd2l0aCB0cmFuc2Zvcm1cclxuICAgICAgICBjb25zdCBtb2RlbEZCWDogRkJYLk1vZGVsID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHNbX2luZGV4XS5sb2FkKCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKG1vZGVsRkJYLm5hbWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUcmFuc2Zvcm0obW9kZWxGQlgsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMuI25vZGVzW19pbmRleF0gPSBub2RlO1xyXG5cclxuICAgICAgICAvLyBhdHRhY2ggY2hpbGRyZW4gYW5kIGNvbXBvbmVudHNcclxuICAgICAgICBpZiAobW9kZWxGQlguY2hpbGRyZW4pIGZvciAoY29uc3QgY2hpbGRGQlggb2YgbW9kZWxGQlguY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChjaGlsZEZCWC50eXBlID09IFwiTW9kZWxcIikge1xyXG4gICAgICAgICAgICBub2RlLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZSh0aGlzLmZieC5vYmplY3RzLm1vZGVscy5pbmRleE9mKGNoaWxkRkJYKSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZEZCWC50eXBlID09IFwiR2VvbWV0cnlcIikge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNoOiBNZXNoRkJYID0gYXdhaXQgdGhpcy5nZXRNZXNoKHRoaXMuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5pbmRleE9mKGNoaWxkRkJYKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBuZXcgQ29tcG9uZW50TWVzaChtZXNoKTtcclxuICAgICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudE1hdGVyaWFsKEZCWExvYWRlci5kZWZhdWx0TWF0ZXJpYWwpKTtcclxuICAgICAgICAgICAgaWYgKG1lc2gucmVuZGVyTWVzaC5ib25lcykge1xyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uKGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTtcclxuICAgICAgICAgICAgICAvLyBmb3IgKGNvbnN0IHN1YkRlZm9ybWVyRkJYIG9mIGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjb25zdCBib25lOiBOb2RlID0gY21wTWVzaC5za2VsZXRvbi5ib25lc1tzdWJEZWZvcm1lckZCWC5jaGlsZHJlblswXS5uYW1lXTtcclxuICAgICAgICAgICAgICAvLyAgIGJvbmUubXR4TG9jYWwuc2V0KHN1YkRlZm9ybWVyRkJYLlRyYW5zZm9ybUxpbmspO1xyXG4gICAgICAgICAgICAgIC8vICAgaWYgKGJvbmUuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgICAgICAgLy8gICAgIGJvbmUubXR4TG9jYWwubXVsdGlwbHkoYm9uZS5nZXRQYXJlbnQoKS5tdHhXb3JsZEludmVyc2UpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCkubWF0ZXJpYWwgPSBGQlhMb2FkZXIuZGVmYXVsdFNraW5NYXRlcmlhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChjbXBNZXNoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1hdGVyaWFsXCIpIHtcclxuICAgICAgICAgICAgLy8gVE9ETzogYWRkaXRpb25hbCBza2luIG1hdGVyaWFscyBnZXQgY3JlYXRlZCBoZXJlLCBjaGVjayBpZiB0aGUgb3JpZ2luYWwgbWF0ZXJpYWwgaXMgc3RpbGwgbmVlZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tYXRlcmlhbHMuaW5kZXhPZihjaGlsZEZCWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoaU1hdGVyaWFsKTtcclxuICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpLm1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubWVzaC5yZW5kZXJNZXNoLmJvbmVzID9cclxuICAgICAgICAgICAgICB0aGlzLiNza2luTWF0ZXJpYWxzW2lNYXRlcmlhbF0gfHwgKHRoaXMuI3NraW5NYXRlcmlhbHNbaU1hdGVyaWFsXSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5nZXRTaGFkZXIoKSA9PSBTaGFkZXJQaG9uZyA/XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nU2tpbiA6XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWRTa2luLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuY29hdFxyXG4gICAgICAgICAgICAgICkpIDpcclxuICAgICAgICAgICAgICBtYXRlcmlhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNtZXNoZXMpXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jbWVzaGVzW19pbmRleF0pXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzW19pbmRleF0gPSBhd2FpdCBuZXcgTWVzaEZCWCgpLmxvYWQodGhpcy51cmksIF9pbmRleCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXNoZXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWF0ZXJpYWwoX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbWF0ZXJpYWxzKVxyXG4gICAgICAgIHRoaXMuI21hdGVyaWFscyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI21hdGVyaWFsc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxGQlg6IEZCWC5NYXRlcmlhbCA9IHRoaXMuZmJ4Lm9iamVjdHMubWF0ZXJpYWxzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGlmICghKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpKVxyXG4gICAgICAgICAgbWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yPy5jaGlsZHJlblswXS5sb2FkKCk7XHJcbiAgICAgICAgLy8gRkJYIHN1cHBvcnRzIGxhbWJlcnQgYW5kIHBob25nIHNoYWRpbmcsIGVpdGhlciB3YXkgZnVkZ2UgaGFzIG5vIGxhbWJlcnQgc2hhZGVyIHNvIHdlIGFsd2F5cyB1c2UgcGhvbmcuXHJcbiAgICAgICAgLy8gSW4gRGlmZnVzZUNvbG9yIHRoZSB0ZXh0dXJlIG9mIHRoZSBtYXRlcmlhbCBjb2xvciBpcyBzdG9yZWQsIGlmIGl0J3MgZGVmaW5lZCB3ZSB1c2UgYSB0ZXh0dXJlIHNoYWRlci5cclxuICAgICAgICAvLyBUT0RPOiBtYXRlcmlhbEZCWCBhbHNvIGNvbnRhaW5zIGFkZGl0aW9uYWwgdmFsdWVzIGxpa2Ugc2hpbmluZXNzIGFuZCByZWZsZWN0aXZpdHkgKGFuZCBvdGhlcnMpIHdoaWNoIGFyZSBub3Qgc3VwcHBvcnRlZC5cclxuICAgICAgICB0aGlzLiNtYXRlcmlhbHNbX2luZGV4XSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLm5hbWUsXHJcbiAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgJiYgIShtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgaW5zdGFuY2VvZiBWZWN0b3IzKSA/XHJcbiAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWQgOlxyXG4gICAgICAgICAgICBTaGFkZXJQaG9uZyxcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciAmJiAhKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpID9cclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChcclxuICAgICAgICAgICAgICBuZXcgQ29sb3IoLi4ubWF0ZXJpYWxGQlguRGlmZnVzZS5nZXQoKSksXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXMuaW5kZXhPZihtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IpKSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlRmFjdG9yID8/IDEsXHJcbiAgICAgICAgICAgICAgbWF0ZXJpYWxGQlguU3BlY3VsYXJGYWN0b3IgPz8gYXZlcmFnZShtYXRlcmlhbEZCWC5TcGVjdWxhcj8uZ2V0KCkpID8/IDBcclxuICAgICAgICAgICAgKSA6XHJcbiAgICAgICAgICAgIG5ldyBDb2F0UmVtaXNzaXZlKFxyXG4gICAgICAgICAgICAgIG5ldyBDb2xvciguLi4obWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yIGFzIFZlY3RvcjMgPz8gbWF0ZXJpYWxGQlguRGlmZnVzZSkuZ2V0KCkpLFxyXG4gICAgICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VGYWN0b3IgPz8gMSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5TcGVjdWxhckZhY3RvciA/PyBhdmVyYWdlKG1hdGVyaWFsRkJYLlNwZWN1bGFyPy5nZXQoKSkgPz8gMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jbWF0ZXJpYWxzW19pbmRleF07XHJcblxyXG4gICAgICBmdW5jdGlvbiBhdmVyYWdlKF9hcnJheTogRmxvYXQzMkFycmF5KTogbnVtYmVyIHsgLy8gVE9ETzogc3BlY3VsYXIgZmFjdG9yIHZlY3RvciAodG9nZXRoZXIgd2l0aCBzcGVjdWxhciBjb2xvciB0ZXh0dXJlKSBpcyBub3Qgc3VwcG9ydGVkIHNvIHdlIHVzZSB0aGUgYXZlcmFnZSBvZiB0aGUgdmVjdG9yIHRvIGFwcHJveGltYXRlIGEgc2luZ3VsYXIgc3BlY3VsYXIgZmFjdG9yLlxyXG4gICAgICAgIGlmIChfYXJyYXkpXHJcbiAgICAgICAgICByZXR1cm4gX2FycmF5LnJlZHVjZSgoX2EsIF9iKSA9PiBfYSArIF9iKSAvIF9hcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXh0dXJlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxUZXh0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuI3RleHR1cmVzKVxyXG4gICAgICAgICAgdGhpcy4jdGV4dHVyZXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy4jdGV4dHVyZXNbX2luZGV4XSlcclxuICAgICAgICAgIHJldHVybiBfcmVzb2x2ZSh0aGlzLiN0ZXh0dXJlc1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9GQlg6IEZCWC5WaWRlbyA9IHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXNbX2luZGV4XS5jaGlsZHJlblswXTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIHRleHR1cmUuaW1hZ2Uub25sb2FkID0gKCkgPT4gX3Jlc29sdmUodGV4dHVyZSk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZS5vbmVycm9yID0gX3JlamVjdDtcclxuICAgICAgICB0ZXh0dXJlLmltYWdlLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZpZGVvRkJYLkNvbnRlbnRdLCB7IHR5cGU6IFwiaW1hZ2UvcG5nXCIgfSkpO1xyXG4gICAgICAgIHRoaXMuI3RleHR1cmVzW19pbmRleF0gPSB0ZXh0dXJlO1xyXG4gICAgICAgIC8vIFRPRE86IGdldCBhbmQgc2V0IG1pcG1hcCBpbmZvcm1hdGlvbiA/Pz9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvYmxlbTogbWVocmVyZSBEZWZvcm1lciB2ZXJ3ZWlzZW4gYXVmIGRhcyBzZWxiZSBTa2VsZXR0IGFiZXIgbnV0emVuIGRhYmVpIG5pY2h0IGltbWVyIGFsbGUgS25vY2hlblxyXG4gICAgLy8gPT4gUHJvYmxlbSBiZXN0ZWh0IGF1Y2ggaW0gR0xURkxvYWRlclxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWVmcyB0aGUgc2tlbGV0b24gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGltYiBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX2ZieExpbWJOb2RlOiBGQlguTW9kZWwpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9ucyA9IFtdO1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zLmZpbmQoX3NrZWxldG9uID0+IF9mYnhMaW1iTm9kZS5uYW1lIGluIF9za2VsZXRvbi5ib25lcykgfHwgYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBza2VsZXRvbjogQ29tcG9uZW50U2tlbGV0b24gPSBuZXcgQ29tcG9uZW50U2tlbGV0b24oKTsgLy8gbmV3IFNrZWxldG9uKGBTa2VsZXRvbiR7dGhpcy4jc2tlbGV0b25zLmxlbmd0aH1gKTtcclxuICAgICAgICBsZXQgcm9vdE5vZGU6IEZCWC5Nb2RlbCA9IF9mYnhMaW1iTm9kZTtcclxuICAgICAgICB3aGlsZSAocm9vdE5vZGUucGFyZW50cyAmJiByb290Tm9kZS5wYXJlbnRzLnNvbWUoX3BhcmVudCA9PiBfcGFyZW50LnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSlcclxuICAgICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC5zdWJ0eXBlID09IFwiTGltYk5vZGVcIik7XHJcbiAgICAgICAgY29uc3QgaVJvb3ROb2RlOiBudW1iZXIgPSB0aGlzLmZieC5vYmplY3RzLm1vZGVscy5maW5kSW5kZXgoX21vZGVsID0+IF9tb2RlbC5uYW1lID09IHJvb3ROb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYXdhaXQgdGhpcy5nZXROb2RlKGlSb290Tm9kZSkpIHtcclxuICAgICAgICAgIC8vIFRPRE86IG1heWJlIG1vdmUgdGhpcyBpbnRvIHRoZSBjb21wb25lbnQsIGFzIHRoaXMgaXMgcHJvYmFibHkgbmVlZGVkIGluIGdsdGYgaW1wb3J0IGFzd2VsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzW3RoaXMuI25vZGVzLmluZGV4T2Yobm9kZSldLnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhXb3JsZC5jb3B5KFxyXG4gICAgICAgICAgICAgICAgbm9kZS5jbXBUcmFuc2Zvcm0gP1xyXG4gICAgICAgICAgICAgICAgICBNYXRyaXg0eDQuUFJPRFVDVChwYXJlbnQubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpIDpcclxuICAgICAgICAgICAgICAgICAgcGFyZW50Lm10eFdvcmxkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgbm9kZS5tdHhXb3JsZEludmVyc2UuY29weShNYXRyaXg0eDQuSU5WRVJTRShub2RlLm10eFdvcmxkKSk7XHJcbiAgICAgICAgICAgIHNrZWxldG9uLmFkZEJvbmUobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMucHVzaChza2VsZXRvbik7XHJcbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xyXG4gICAgICB9KSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb24oX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnMpXHJcbiAgICAgICAgdGhpcy4jYW5pbWF0aW9ucyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnNbX2luZGV4XSkge1xyXG4gICAgICAgIGNvbnN0IGFuaW1TdGFjazogRkJYLk9iamVjdCA9IHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrc1tfaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGFuaW1Ob2Rlc0ZCWDogRkJYLkFuaW1DdXJ2ZU5vZGVbXSA9IGFuaW1TdGFjay5jaGlsZHJlblswXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgICAgbGV0IGZieEFuaW1Ob2RlR3JvdXBlZDogTWFwPEZCWC5Nb2RlbCwgRkJYLkFuaW1DdXJ2ZU5vZGVbXT4gPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmYnhBbmltTm9kZSBvZiBhbmltTm9kZXNGQlgpIHtcclxuICAgICAgICAgIGNvbnN0IGtleTogRkJYLk1vZGVsID0gZmJ4QW5pbU5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICBpZiAoa2V5ID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBpZiAoIWZieEFuaW1Ob2RlR3JvdXBlZC5oYXMoa2V5KSlcclxuICAgICAgICAgICAgZmJ4QW5pbU5vZGVHcm91cGVkLnNldChrZXksIFtdKTtcclxuICAgICAgICAgIGZieEFuaW1Ob2RlR3JvdXBlZC5nZXQoa2V5KS5wdXNoKGZieEFuaW1Ob2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvblN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2ZieE1vZGVsLCBmYnhBbmltTm9kZXNdIG9mIGZieEFuaW1Ob2RlR3JvdXBlZCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50OiBGQlguTW9kZWwgPSBmYnhNb2RlbC5wYXJlbnRzLmZpbmQoX3BhcmVudCA9PiBfcGFyZW50LnR5cGUgPT0gXCJNb2RlbFwiKTtcclxuICAgICAgICAgIGxldCBwYXRoOiBGQlguTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgcGF0aC5wdXNoKGZieE1vZGVsKTtcclxuICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChwYXJlbnQpO1xyXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCBmYnhQYXRoTW9kZWwgb2YgcGF0aC5yZXZlcnNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoY3VycmVudFN0cnVjdHVyZS5jaGlsZHJlbiBhcyBBbmltYXRpb25TdHJ1Y3R1cmUpW2ZieFBhdGhNb2RlbC5uYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gYXMgQW5pbWF0aW9uU3RydWN0dXJlKVtmYnhQYXRoTW9kZWwubmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZSA9IChjdXJyZW50U3RydWN0dXJlLmNoaWxkcmVuIGFzIEFuaW1hdGlvblN0cnVjdHVyZSlbZmJ4UGF0aE1vZGVsLm5hbWVdIGFzIEFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmYnhQYXRoTW9kZWwgPT0gZmJ4TW9kZWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtdHhMb2NhbDogQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgPSB7fTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZieEFuaW1Ob2RlIG9mIGZieEFuaW1Ob2RlcylcclxuICAgICAgICAgICAgICAgIG10eExvY2FsW3tcclxuICAgICAgICAgICAgICAgICAgVDogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgICBSOiBcInJvdGF0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFM6IFwic2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgfVtmYnhBbmltTm9kZS5uYW1lXV0gPSB0aGlzLmdldEFuaW1hdGlvblZlY3RvcjMoZmJ4QW5pbU5vZGUsIGZieFBhdGhNb2RlbCk7XHJcbiAgICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZS5jb21wb25lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50VHJhbnNmb3JtOiBbXHJcbiAgICAgICAgICAgICAgICAgIHsgbXR4TG9jYWw6IG10eExvY2FsIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNhbmltYXRpb25zW19pbmRleF0gPSBuZXcgQW5pbWF0aW9uKGFuaW1TdGFjay5uYW1lLCBhbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiNhbmltYXRpb25zW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmZXRjaGVkIGZyb20gdGhyZWUuanMsIGFkYXB0ZWQgdG8gRlVER0UgYW5kIG9wdGltaXplZFxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL2Rldi9leGFtcGxlcy9qc20vbG9hZGVycy9GQlhMb2FkZXIuanNcclxuICAgICAqIGxpbmUgMzk1MFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlVHJhbnNmb3JtKF9tb2RlbEZCWDogRkJYLk1vZGVsLCBfbm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBwYXJlbnRJbmRleDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHMuaW5kZXhPZihfbW9kZWxGQlgucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIikpO1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IE5vZGUgPSBwYXJlbnRJbmRleCA+PSAwID8gYXdhaXQgdGhpcy5nZXROb2RlKHBhcmVudEluZGV4KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eExvY2FsUm90YXRpb246IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5QcmVSb3RhdGlvbiB8fCBfbW9kZWxGQlguTGNsUm90YXRpb24gfHwgX21vZGVsRkJYLlBvc3RSb3RhdGlvbiA/XHJcbiAgICAgICAgTWF0cml4NHg0LklERU5USVRZKCkgOlxyXG4gICAgICAgIHVuZGVmaW5lZDtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5QcmVSb3RhdGlvbikge1xyXG4gICAgICAgIG10eExvY2FsUm90YXRpb24ucm90YXRlKHRoaXMuZ2V0T3JkZXJlZChfbW9kZWxGQlguUHJlUm90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsUm90YXRpb24pIHtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLnJvdGF0ZSh0aGlzLmdldE9yZGVyZWQodGhpcy5nZXRUcmFuc2Zvcm1WZWN0b3IoX21vZGVsRkJYLkxjbFJvdGF0aW9uLCBWZWN0b3IzLlpFUk8pLCBfbW9kZWxGQlgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX21vZGVsRkJYLlBvc3RSb3RhdGlvbikge1xyXG4gICAgICAgIGxldCBtdHhQb3N0Um90YXRpb25JbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04odGhpcy5nZXRPcmRlcmVkKF9tb2RlbEZCWC5Qb3N0Um90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICAgIG10eFBvc3RSb3RhdGlvbkludmVyc2UgPSBNYXRyaXg0eDQuSU5WRVJTRShtdHhQb3N0Um90YXRpb25JbnZlcnNlKTtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLm11bHRpcGx5KG10eFBvc3RSb3RhdGlvbkludmVyc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtdHhMb2NhbFNjYWxpbmc6IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5MY2xTY2FsaW5nID9cclxuICAgICAgICBNYXRyaXg0eDQuU0NBTElORyh0aGlzLmdldFRyYW5zZm9ybVZlY3RvcihfbW9kZWxGQlguTGNsU2NhbGluZywgVmVjdG9yMy5PTkUpKSA6XHJcbiAgICAgICAgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY29uc3QgbXR4UGFyZW50V29ybGRSb3RhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID8gTWF0cml4NHg0LlJPVEFUSU9OKHBhcmVudC5tdHhXb3JsZC5yb3RhdGlvbikgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBjb25zdCBtdHhQYXJlbnRXb3JsZFNjYWxlOiBNYXRyaXg0eDQgPSBwYXJlbnQgPyAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG10eFBhcmVudFdvcmxkU2NhbGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUudHJhbnNsYXRlKFZlY3RvcjMuU0NBTEUocGFyZW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCAtMSkpO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUubXVsdGlwbHkocGFyZW50Lm10eFdvcmxkKTtcclxuICAgICAgICByZXR1cm4gbXR4UGFyZW50V29ybGRTY2FsZTtcclxuICAgICAgfSkoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFdvcmxkUm90YXRpb25TY2FsZTogTWF0cml4NHg0ID0gcGFyZW50IHx8IG10eExvY2FsUm90YXRpb24gfHwgbXR4TG9jYWxTY2FsaW5nID8gTWF0cml4NHg0LklERU5USVRZKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChwYXJlbnQgfHwgbXR4TG9jYWxSb3RhdGlvbiB8fCBtdHhMb2NhbFNjYWxpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmhlcml0VHlwZTogbnVtYmVyID0gX21vZGVsRkJYLkluaGVyaXRUeXBlIHx8IDA7XHJcbiAgICAgICAgaWYgKGluaGVyaXRUeXBlID09IDApIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluaGVyaXRUeXBlID09IDEpIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsUm90YXRpb24pO1xyXG4gICAgICAgICAgaWYgKG10eExvY2FsU2NhbGluZylcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFNjYWxlKTtcclxuICAgICAgICAgICAgbGV0IG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKHBhcmVudC5tdHhMb2NhbC5zY2FsaW5nKTtcclxuICAgICAgICAgICAgbXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2UpO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeFxyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjM7XHJcbiAgICAgIHRyYW5zbGF0aW9uID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKHRoaXMuZ2V0VHJhbnNmb3JtVmVjdG9yKF9tb2RlbEZCWC5MY2xUcmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKSk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25PZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5Sb3RhdGlvbk9mZnNldCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25QaXZvdClcclxuICAgICAgICB0cmFuc2xhdGlvbi5hZGQoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG5cclxuICAgICAgY29uc3QgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuVFJBTlNMQVRJT04odHJhbnNsYXRpb24pO1xyXG4gICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcblxyXG4gICAgICB0cmFuc2xhdGlvbiA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uc3VidHJhY3QoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlNjYWxpbmdPZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nT2Zmc2V0KTtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0udHJhbnNsYXRlKHRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIGlmIChtdHhMb2NhbFNjYWxpbmcpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguU2NhbGluZ1Bpdm90KVxyXG4gICAgICAgIG10eFRyYW5zZm9ybS50cmFuc2xhdGUoVmVjdG9yMy5TQ0FMRShfbW9kZWxGQlguU2NhbGluZ1Bpdm90LCAtMSkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4V29ybGRUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID9cclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oTWF0cml4NHg0LlBST0RVQ1QoXHJcbiAgICAgICAgICBwYXJlbnQubXR4V29ybGQsXHJcbiAgICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgICkudHJhbnNsYXRpb24pIDpcclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIG10eFRyYW5zZm9ybS5jb3B5KG10eFdvcmxkVHJhbnNsYXRpb24pO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4V29ybGRSb3RhdGlvblNjYWxlKTtcclxuICAgICAgX25vZGUubXR4V29ybGQuY29weShtdHhUcmFuc2Zvcm0pO1xyXG5cclxuICAgICAgaWYgKHBhcmVudClcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkoTWF0cml4NHg0LklOVkVSU0UocGFyZW50Lm10eFdvcmxkKSwgdHJ1ZSk7XHJcbiAgICAgIF9ub2RlLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50VHJhbnNmb3JtKG10eFRyYW5zZm9ybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJhbnNmb3JtVmVjdG9yKF92ZWN0b3I6IFZlY3RvcjMgfCBGQlguQW5pbUN1cnZlTm9kZSwgX2RlZmF1bHQ6ICgpID0+IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBfdmVjdG9yID09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICBfZGVmYXVsdCgpIDpcclxuICAgICAgICAgIF92ZWN0b3IgaW5zdGFuY2VvZiBWZWN0b3IzID9cclxuICAgICAgICAgICAgX3ZlY3RvciA6XHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzKFxyXG4gICAgICAgICAgICAgIHR5cGVvZiAoX3ZlY3RvciA9IF92ZWN0b3IubG9hZCgpKS5kWCA9PSBcIm51bWJlclwiID9cclxuICAgICAgICAgICAgICAgIF92ZWN0b3IuZFggOlxyXG4gICAgICAgICAgICAgICAgKF92ZWN0b3IuZFgubG9hZCgpIGFzIEZCWC5BbmltQ3VydmUpLkRlZmF1bHQsXHJcbiAgICAgICAgICAgICAgdHlwZW9mIF92ZWN0b3IuZFkgPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICAgICAgICBfdmVjdG9yLmRZIDpcclxuICAgICAgICAgICAgICAgIChfdmVjdG9yLmRZLmxvYWQoKSBhcyBGQlguQW5pbUN1cnZlKS5EZWZhdWx0LFxyXG4gICAgICAgICAgICAgIHR5cGVvZiBfdmVjdG9yLmRaID09IFwibnVtYmVyXCIgP1xyXG4gICAgICAgICAgICAgICAgX3ZlY3Rvci5kWiA6XHJcbiAgICAgICAgICAgICAgICAoX3ZlY3Rvci5kWi5sb2FkKCkgYXMgRkJYLkFuaW1DdXJ2ZSkuRGVmYXVsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBbmltYXRpb25WZWN0b3IzKF9hbmltTm9kZTogRkJYLkFuaW1DdXJ2ZU5vZGUsIF90YXJnZXQ6IEZCWC5Nb2RlbCk6IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvclNlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCB2YWx1ZU5hbWUgaW4gX2FuaW1Ob2RlKSBpZiAodmFsdWVOYW1lID09IFwiZFhcIiB8fCB2YWx1ZU5hbWUgPT0gXCJkWVwiIHx8IHZhbHVlTmFtZSA9PSBcImRaXCIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTogRkJYLkFuaW1DdXJ2ZSB8IG51bWJlciA9IF9hbmltTm9kZVt2YWx1ZU5hbWVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmFsdWUuS2V5VGltZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlZmVyZW5jZSB0aW1lIGlzIGRlZmluZWQgYXMgYSBzaWduZWQgaW50NjQsIHVuaXQgYmVpbmcgMS80NjE4NjE1ODAwMCBzZWNvbmRzXHJcbiAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICAgICAgICAgIHNlcXVlbmNlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KFxyXG4gICAgICAgICAgICAgIE51bWJlcigodmFsdWUuS2V5VGltZVtpXSAtIHZhbHVlLktleVRpbWUucmVkdWNlKChfbWluLCBfdikgPT4gX3YgPCBfbWluID8gX3YgOiBfbWluKSkgLyBCaWdJbnQoXCI0NjE4NjE1OFwiKSksXHJcbiAgICAgICAgICAgICAgdmFsdWUuS2V5VmFsdWVGbG9hdFtpXVxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZlY3RvclNlcXVlbmNlW3ZhbHVlTmFtZVsxXS50b0xvd2VyQ2FzZSgpXSA9IHNlcXVlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKF9hbmltTm9kZS5uYW1lID09IFwiUlwiICYmIChfdGFyZ2V0LlByZVJvdGF0aW9uIHx8IF90YXJnZXQuUG9zdFJvdGF0aW9uKSkge1xyXG4gICAgICAgIGxldCBwcmVSb3RvdGF0aW9uOiBNYXRyaXg0eDQ7XHJcbiAgICAgICAgaWYgKF90YXJnZXQuUHJlUm90YXRpb24pXHJcbiAgICAgICAgICBwcmVSb3RvdGF0aW9uID0gTWF0cml4NHg0LlJPVEFUSU9OKF90YXJnZXQuUHJlUm90YXRpb24pO1xyXG4gICAgICAgIGxldCBwb3N0Um90YXRpb246IE1hdHJpeDR4NDtcclxuICAgICAgICBpZiAoX3RhcmdldC5Qb3N0Um90YXRpb24pXHJcbiAgICAgICAgICBwb3N0Um90YXRpb24gPSBNYXRyaXg0eDQuUk9UQVRJT04oX3RhcmdldC5Qb3N0Um90YXRpb24pO1xyXG5cclxuICAgICAgICBbdmVjdG9yU2VxdWVuY2UueCwgdmVjdG9yU2VxdWVuY2UueSwgdmVjdG9yU2VxdWVuY2Uuel1cclxuICAgICAgICAgIC5mbGF0TWFwKF9zZXEgPT4gX3NlcT8uZ2V0S2V5cygpKVxyXG4gICAgICAgICAgLm1hcChfa2V5ID0+IF9rZXk/LnRpbWUpXHJcbiAgICAgICAgICAuc29ydCgoX3RpbWVBLCBfdGltZUIpID0+IF90aW1lQSAtIF90aW1lQikgLy8gc29ydCB0aW1lc1xyXG4gICAgICAgICAgLmZpbHRlcigoX3RpbWUsIF9pbmRleCwgX3RpbWVzKSA9PiBfdGltZSAhPSBfdGltZXNbX2luZGV4ICsgMV0pIC8vIHJlbW92ZSBkdXBsaWNhdGVzXHJcbiAgICAgICAgICAubWFwKF90aW1lID0+IHsgLy8gZmluZCBrZXlzIGZvciBhbGwgYXhlcyBhdCB0aW1lXHJcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueCksIHk6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueSksIHo6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueikgfTtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZmluZEtleShfc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgICAgICAgICByZXR1cm4gX3NlcXVlbmNlPy5nZXRLZXlzKCkuZmluZChfa2V5ID0+IF9rZXkudGltZSA9PSBfdGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZm9yRWFjaChfZnJhbWUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmN0RXVsZXJBbmdsZXM6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgICAgICAgIHZjdEV1bGVyQW5nbGVzLnNldChcclxuICAgICAgICAgICAgICBfZnJhbWUueD8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUueT8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUuej8udmFsdWUgPz8gMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKHZjdEV1bGVyQW5nbGVzKTtcclxuICAgICAgICAgICAgaWYgKHByZVJvdG90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocHJlUm90b3RhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChwb3N0Um90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocG9zdFJvdGF0aW9uKTtcclxuICAgICAgICAgICAgdmN0RXVsZXJBbmdsZXMgPSBtdHhSb3RhdGlvbi5yb3RhdGlvbjtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS54KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS54LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueDtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS55KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS55LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueTtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS56KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS56LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMuejtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmVjdG9yU2VxdWVuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPcmRlcmVkKF9yb3RhdGlvbjogVmVjdG9yMywgX21vZGVsRkJYOiBGQlguTW9kZWwpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKCFfbW9kZWxGQlguRXVsZXJPcmRlcilcclxuICAgICAgICByZXR1cm4gX3JvdGF0aW9uO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gX3JvdGF0aW9uLmdldCgpO1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWlwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWVwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWFwiKV1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtbm9kZXMgY29udGFpbmluZyBpdHMgbmFtZSwgY2hpbGRyZW4gYW5kIHByb3BlcnRpZXMuXHJcbiAgICogQ2hpbGRyZW4gYW5kIHByb3Blcml0ZXMgYXJlIGxhenkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBOb2RlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHByaXZhdGUgbG9hZFByb3BlcnRpZXM6ICgpID0+IE5vZGVQcm9wZXJ0eVtdO1xyXG4gICAgcHJpdmF0ZSBsb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXTtcclxuICAgIFxyXG4gICAgI2NoaWxkcmVuOiBOb2RlW107XHJcbiAgICAjcHJvcGVydGllczogTm9kZVByb3BlcnR5W107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9sb2FkUHJvcGVydGllczogKCkgPT4gTm9kZVByb3BlcnR5W10sIF9sb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXSkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5sb2FkUHJvcGVydGllcyA9IF9sb2FkUHJvcGVydGllcztcclxuICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4gPSBfbG9hZENoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBOb2RlUHJvcGVydHlbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0aWVzIHx8ICh0aGlzLiNwcm9wZXJ0aWVzID0gdGhpcy5sb2FkUHJvcGVydGllcygpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IE5vZGVbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbiB8fCAodGhpcy4jY2hpbGRyZW4gPSB0aGlzLmxvYWRDaGlsZHJlbigpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCB0eXBlIFByb3BlcnR5NzAgPSBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgRnVkZ2VDb3JlLlZlY3RvcjM7XHJcblxyXG4gIGV4cG9ydCB0eXBlIE5vZGVQcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBGbG9hdDMyQXJyYXk7XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFSUkFZX0VOQ09ESU5HIHtcclxuICAgIFVOQ09NUFJFU1NFRCwgQ09NUFJFU1NFRFxyXG4gIH1cclxuICBcclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFuIGZieCBmaWxlIGZyb20gaXRzIGZieC1ub2RlIGFycmF5IHdoaWNoIG1heSBiZSByZXRyaWV2ZWQgYnkgcGFyc2VOb2Rlc0Zyb21CaW5hcnkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBsb2FkRnJvbU5vZGVzKF9ub2RlczogTm9kZVtdKTogRkJYIHtcclxuICAgIGNvbnN0IGZieDogRkJYID0ge1xyXG4gICAgICBkb2N1bWVudHM6IHVuZGVmaW5lZCxcclxuICAgICAgb2JqZWN0czoge1xyXG4gICAgICAgIGFsbDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vZGVsczogW10sXHJcbiAgICAgICAgZ2VvbWV0cmllczogW10sXHJcbiAgICAgICAgbWF0ZXJpYWxzOiBbXSxcclxuICAgICAgICBwb3NlczogW10sXHJcbiAgICAgICAgdGV4dHVyZXM6IFtdLFxyXG4gICAgICAgIGFuaW1TdGFja3M6IFtdXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbm5lY3Rpb25zOiB1bmRlZmluZWRcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIF9ub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5uYW1lID09IFwiRG9jdW1lbnRzXCIpXHJcbiAgICAgICAgZmJ4LmRvY3VtZW50cyA9IG5vZGUuY2hpbGRyZW5cclxuICAgICAgICAgIC5maWx0ZXIoX2RvY3VtZW50Tm9kZSA9PiBfZG9jdW1lbnROb2RlLm5hbWUgPT0gXCJEb2N1bWVudFwiKVxyXG4gICAgICAgICAgLm1hcChfZG9jdW1lbnROb2RlID0+IGdldERvY3VtZW50KF9kb2N1bWVudE5vZGUpKTtcclxuICAgICAgZWxzZSBpZiAobm9kZS5uYW1lID09IFwiT2JqZWN0c1wiKVxyXG4gICAgICAgIGZieC5vYmplY3RzLmFsbCA9IG5vZGUuY2hpbGRyZW4ubWFwKF9vYmplY3ROb2RlID0+IGdldE9iamVjdChfb2JqZWN0Tm9kZSwgZmJ4KSk7XHJcbiAgICAgIGVsc2UgaWYgKG5vZGUubmFtZSA9PSBcIkNvbm5lY3Rpb25zXCIpXHJcbiAgICAgICAgZmJ4LmNvbm5lY3Rpb25zID0gbm9kZS5jaGlsZHJlbi5tYXAoX2Nvbm5lY3Rpb25Ob2RlID0+IGdldENvbm5lY3Rpb24oX2Nvbm5lY3Rpb25Ob2RlKSk7XHJcbiAgICAgIGlmIChmYnguZG9jdW1lbnRzICYmIGZieC5vYmplY3RzLmFsbCAmJiBmYnguY29ubmVjdGlvbnMpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXBPYmplY3RzKGZieCk7XHJcbiAgICBhcHBseUNvbm5lY3Rpb25zKGZieC5jb25uZWN0aW9ucywgZmJ4LmRvY3VtZW50cywgZmJ4Lm9iamVjdHMuYWxsKTtcclxuXHJcbiAgICByZXR1cm4gZmJ4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoX25vZGU6IE5vZGUpOiBEb2N1bWVudCB7XHJcbiAgICBjb25zdCBkb2N1bWVudDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBfbm9kZS5wcm9wZXJ0aWVzWzJdIGFzIHN0cmluZyxcclxuICAgICAgbG9hZGVkOiBmYWxzZSxcclxuICAgICAgbG9hZDogKCkgPT4gbG9hZE9iamVjdFByb3BlcnRpZXMoX25vZGUsIGRvY3VtZW50KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBkb2N1bWVudDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldE9iamVjdChfbm9kZTogTm9kZSwgX2ZieDogRkJYKTogT2JqZWN0IHtcclxuICAgIGNvbnN0IG5hbWVBbmRUeXBlOiBzdHJpbmdbXSA9IChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykuc3BsaXQoXCI6OlwiKTtcclxuICAgIGNvbnN0IG9iamVjdDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBuYW1lQW5kVHlwZVswXSxcclxuICAgICAgdHlwZTogbmFtZUFuZFR5cGVbMV0sXHJcbiAgICAgIHN1YnR5cGU6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgc3RyaW5nLFxyXG4gICAgICBsb2FkZWQ6IGZhbHNlLFxyXG4gICAgICBsb2FkOiAoKSA9PiBsb2FkT2JqZWN0UHJvcGVydGllcyhfbm9kZSwgb2JqZWN0KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBncm91cE9iamVjdHMoX2ZieDogRkJYKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBfZmJ4Lm9iamVjdHMuYWxsKSB7XHJcbiAgICAgIGlmIChvYmplY3QudHlwZSA9PSBcIk1vZGVsXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLm1vZGVscy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiR2VvbWV0cnlcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiTWF0ZXJpYWxcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMubWF0ZXJpYWxzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJQb3NlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnBvc2VzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJUZXh0dXJlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnRleHR1cmVzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJBbmltU3RhY2tcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5wdXNoKG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKF9ub2RlOiBOb2RlKTogQ29ubmVjdGlvbiB7XHJcbiAgICBpZiAoIShfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT09cIiB8fCBfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT1BcIikpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBDb25uZWN0aW9uIHR5cGUgJHtfbm9kZS5wcm9wZXJ0aWVzWzBdfSBpcyBub3Qgc3VwcG9ydGVkYCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2hpbGRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMV0gYXMgbnVtYmVyLFxyXG4gICAgICBwYXJlbnRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgbnVtYmVyLFxyXG4gICAgICBwcm9wZXJ0eU5hbWU6IF9ub2RlLnByb3BlcnRpZXNbMF0gPT0gXCJPUFwiID8gX25vZGUucHJvcGVydGllc1szXSBhcyBzdHJpbmcgOiBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXBwbHlDb25uZWN0aW9ucyhfY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXSwgX2RvY3VtZW50czogRG9jdW1lbnRbXSwgX29iamVjdHM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgX2Nvbm5lY3Rpb25zKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IE9iamVjdCA9IF9kb2N1bWVudHMuZmluZChfZG9jdW1lbnQgPT4gX2RvY3VtZW50LmxvYWQoKS5Sb290Tm9kZSA9PSBjb25uZWN0aW9uLnBhcmVudFVJRCkgYXMgT2JqZWN0O1xyXG4gICAgICBsZXQgY2hpbGQ6IE9iamVjdDtcclxuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgX29iamVjdHMpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09IHVuZGVmaW5lZCAmJiBvYmplY3QudWlkID09IGNvbm5lY3Rpb24ucGFyZW50VUlEKVxyXG4gICAgICAgICAgcGFyZW50ID0gb2JqZWN0O1xyXG4gICAgICAgIGlmIChjaGlsZCA9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnVpZCA9PSBjb25uZWN0aW9uLmNoaWxkVUlEKVxyXG4gICAgICAgICAgY2hpbGQgPSBvYmplY3Q7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQgJiYgY2hpbGQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkKVxyXG4gICAgICAgIChjaGlsZC5wYXJlbnRzIHx8IChjaGlsZC5wYXJlbnRzID0gW10pKS5wdXNoKHBhcmVudCk7XHJcbiAgICAgIGlmIChjb25uZWN0aW9uLnByb3BlcnR5TmFtZSA9PSBudWxsKVxyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgKHBhcmVudC5jaGlsZHJlbiA9IFtdKSkucHVzaChjaGlsZCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAocGFyZW50IGFzIE9iamVjdClbZm9ybWF0UHJvcGVydHlOYW1lKGNvbm5lY3Rpb24ucHJvcGVydHlOYW1lKV0gPSBjaGlsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxvYWRPYmplY3RQcm9wZXJ0aWVzKF9ub2RlOiBOb2RlLCBfb2JqZWN0OiBPYmplY3QpOiBPYmplY3Qge1xyXG4gICAgaWYgKF9vYmplY3QubG9hZGVkKVxyXG4gICAgICByZXR1cm4gX29iamVjdDtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgX25vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLm5hbWUgPT0gXCJQcm9wZXJ0aWVzNzBcIilcclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5NzAgb2YgY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShwcm9wZXJ0eTcwLnByb3BlcnRpZXNbMF0gYXMgc3RyaW5nKTtcclxuICAgICAgICAgIGlmICghX29iamVjdFtuYW1lXSlcclxuICAgICAgICAgICAgX29iamVjdFtuYW1lXSA9IGdldFByb3BlcnR5NzBWYWx1ZShwcm9wZXJ0eTcwKTtcclxuICAgICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShjaGlsZC5uYW1lKTtcclxuICAgICAgICBpZiAoIV9vYmplY3RbbmFtZV0pXHJcbiAgICAgICAgICBfb2JqZWN0W25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIF9vYmplY3QubG9hZGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBfb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShfbm9kZTogTm9kZSk6IE5vZGVQcm9wZXJ0eSB8IE9iamVjdCB7XHJcbiAgICByZXR1cm4gX25vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxyXG4gICAgICA/IF9ub2RlLmNoaWxkcmVuLnJlZHVjZShcclxuICAgICAgICAoX3N1YlByb3BlcnRpZXMsIF9zdWJQcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gZm9ybWF0UHJvcGVydHlOYW1lKF9zdWJQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgIGlmIChfc3ViUHJvcGVydGllc1tuYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShfc3ViUHJvcGVydHkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKF9zdWJQcm9wZXJ0aWVzW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpKVxyXG4gICAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gW19zdWJQcm9wZXJ0aWVzW25hbWVdIGFzIE9iamVjdF07XHJcbiAgICAgICAgICAgIChfc3ViUHJvcGVydGllc1tuYW1lXSBhcyBPYmplY3RbXSkucHVzaChnZXRQcm9wZXJ0eVZhbHVlKF9zdWJQcm9wZXJ0eSkgYXMgT2JqZWN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfc3ViUHJvcGVydGllcztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHt9IGFzIE9iamVjdFxyXG4gICAgICApXHJcbiAgICAgIDogX25vZGUucHJvcGVydGllc1swXTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFByb3BlcnR5NzBWYWx1ZShfbm9kZTogTm9kZSk6IFByb3BlcnR5NzAge1xyXG4gICAgc3dpdGNoIChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykge1xyXG4gICAgICBjYXNlIFwiYm9vbFwiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIGJvb2xlYW47XHJcblxyXG4gICAgICBjYXNlIFwiaW50XCI6XHJcbiAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgIGNhc2UgXCJVTG9uZ0xvbmdcIjpcclxuICAgICAgY2FzZSBcImRvdWJsZVwiOlxyXG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XHJcbiAgICAgIGNhc2UgXCJGaWVsZE9mVmlld1wiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIG51bWJlcjtcclxuXHJcbiAgICAgIGNhc2UgXCJDb2xvclwiOlxyXG4gICAgICBjYXNlIFwiQ29sb3JSR0JcIjpcclxuICAgICAgY2FzZSBcIlZlY3RvcjNEXCI6XHJcbiAgICAgIGNhc2UgXCJMY2wgVHJhbnNsYXRpb25cIjpcclxuICAgICAgY2FzZSBcIkxjbCBSb3RhdGlvblwiOlxyXG4gICAgICBjYXNlIFwiTGNsIFNjYWxpbmdcIjpcclxuICAgICAgICByZXR1cm4gbmV3IEZ1ZGdlQ29yZS5WZWN0b3IzKC4uLl9ub2RlLnByb3BlcnRpZXMuc2xpY2UoNCwgNykgYXMgbnVtYmVyW10pO1xyXG5cclxuICAgICAgY2FzZSBcIktTdHJpbmdcIjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gX25vZGUucHJvcGVydGllc1s0XSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eU5hbWUoX25hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX25hbWUucmVwbGFjZSgvW15hLXpBLVpdLywgXCJcIik7XHJcbiAgfVxyXG5cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBmYngtbm9kZXMgYXJyYXkgZnJvbSBhIGJpbmFyeSBmYngtZmlsZS5cclxuICAgKiBkZXNwaXRlIHRoZSBsYXp5IG5vZGUgaW1wbGVtZW50YXRpb24gaXQgaXMgbW9zdGx5IGEgY29weSBvZiB0aGUgcmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vcGljb2RlNy9mYngtcGFyc2VyXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyOiBBcnJheUJ1ZmZlcik6IE5vZGVbXSB7XHJcbiAgICBpZiAoX2J1ZmZlci5ieXRlTGVuZ3RoIDwgYmluYXJ5U3RhcnRDaGFycy5sZW5ndGgpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgZGF0YTogQnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihfYnVmZmVyKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcnM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmdldFNlcXVlbmNlKGRhdGEuZ2V0VWludDgsIGJpbmFyeVN0YXJ0Q2hhcnMubGVuZ3RoKSk7XHJcbiAgICBjb25zdCBtYXRjaGVzRkJYQmluYXJ5Rmlyc3RDaGFyczogYm9vbGVhblxyXG4gICAgICA9IGZpcnN0Q2hhcnMuZXZlcnkoKF92YWx1ZSwgX2luZGV4KSA9PiBfdmFsdWUgPT0gYmluYXJ5U3RhcnRDaGFyc1tfaW5kZXhdKTtcclxuICAgIGlmICghbWF0Y2hlc0ZCWEJpbmFyeUZpcnN0Q2hhcnMpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQ6IGJvb2xlYW4gPSB2ZXJzaW9uID49IDc1MDA7IC8vIFdhcnVtID49IDc1MDA/XHJcbiAgICBjb25zdCBub2RlczogTm9kZVtdID0gW107XHJcblxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHJlYWROb2RlKGRhdGEsIG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQpO1xyXG4gICAgICBpZiAobm9kZSA9PSBudWxsKSBicmVhaztcclxuICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkTm9kZShfZGF0YTogQnVmZmVyUmVhZGVyLCBfYXR0cmlidXRlc0FzVWludDY0OiBib29sZWFuKTogTm9kZSB7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBpZiAoZW5kT2Zmc2V0ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHByb3BlcnRpZXNMZW5ndGg6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzQnl0ZUxlbmd0aDogbnVtYmVyID0gX2F0dHJpYnV0ZXNBc1VpbnQ2NCA/IE51bWJlcihfZGF0YS5nZXRVaW50NjQoKSkgOiBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5hbWVMZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQ4KCk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBfZGF0YS5nZXRTdHJpbmcobmFtZUxlbmd0aCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzT2Zmc2V0OiBudW1iZXIgPSBfZGF0YS5vZmZzZXQ7XHJcbiAgICBjb25zdCBjaGlsZHJlbk9mZnNldDogbnVtYmVyID0gcHJvcGVydGllc09mZnNldCArIHByb3BlcnRpZXNCeXRlTGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSBuZXcgTm9kZShcclxuICAgICAgbmFtZSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIF9kYXRhLm9mZnNldCA9IHByb3BlcnRpZXNPZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllczogTm9kZVByb3BlcnR5W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpUHJvcGVydHk6IG51bWJlciA9IDA7IGlQcm9wZXJ0eSA8IHByb3BlcnRpZXNMZW5ndGg7IGlQcm9wZXJ0eSsrKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocmVhZFByb3BlcnR5KF9kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgX2RhdGEub2Zmc2V0ID0gY2hpbGRyZW5PZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVbXSA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbmRPZmZzZXQgLSBfZGF0YS5vZmZzZXQgPiBudWxsQ291bnRBdE5vZGVFbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkOiBGQlguTm9kZSA9IHJlYWROb2RlKF9kYXRhLCBfYXR0cmlidXRlc0FzVWludDY0KTtcclxuICAgICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBfZGF0YS5vZmZzZXQgPSBlbmRPZmZzZXQ7XHJcblxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUHJvcGVydHkoX2RhdGE6IEJ1ZmZlclJlYWRlcik6IEZCWC5Ob2RlUHJvcGVydHkge1xyXG4gICAgY29uc3QgdHlwZUNvZGU6IHN0cmluZyA9IF9kYXRhLmdldENoYXIoKTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZTogRkJYLk5vZGVQcm9wZXJ0eSA9IHtcclxuICAgICAgQzogX2RhdGEuZ2V0Qm9vbCxcclxuICAgICAgWTogX2RhdGEuZ2V0SW50MTYsXHJcbiAgICAgIEk6IF9kYXRhLmdldEludDMyLFxyXG4gICAgICBMOiBfZGF0YS5nZXRJbnQ2NCxcclxuICAgICAgRjogX2RhdGEuZ2V0RmxvYXQzMixcclxuICAgICAgRDogX2RhdGEuZ2V0RmxvYXQ2NCxcclxuICAgICAgUzogKCkgPT4gX2RhdGEuZ2V0U3RyaW5nKF9kYXRhLmdldFVpbnQzMigpKS5yZXBsYWNlKFwiXFx4MDBcXHgwMVwiLCBcIjo6XCIpLFxyXG4gICAgICBzOiAoKSA9PiBfZGF0YS5nZXRTdHJpbmcoX2RhdGEuZ2V0VWludDMyKCkpLnJlcGxhY2UoXCJcXHgwMFxceDAxXCIsIFwiOjpcIiksXHJcbiAgICAgIFI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRSYXcoX2RhdGEsIF9kYXRhLmdldFVpbnQ4KSksXHJcbiAgICAgIHI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0VWludDgpKSxcclxuICAgICAgYjogKCkgPT4gbmV3IFVpbnQ4QXJyYXkocmVhZEFycmF5KF9kYXRhLCBfZGF0YS5nZXRVaW50OCkpLFxyXG4gICAgICBpOiAoKSA9PiBuZXcgSW50MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEludDMyKSksXHJcbiAgICAgIGw6ICgpID0+IG5ldyBCaWdJbnQ2NEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0SW50NjQpKSxcclxuICAgICAgZjogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0MzIpKSxcclxuICAgICAgZDogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0NjQpKVxyXG4gICAgfVt0eXBlQ29kZV0/LmNhbGwoX2RhdGEpO1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxyXG4gICAgICBGdWRnZUNvcmUuRGVidWcud2FybihgVW5rbm93biBwcm9wZXJ0eSB0eXBlICR7dHlwZUNvZGUuY2hhckNvZGVBdCgwKX1gKTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkQXJyYXk8VCBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oX2RhdGE6IEJ1ZmZlclJlYWRlciwgX2dldHRlcjogKCkgPT4gVCk6IEdlbmVyYXRvcjxUPiB7XHJcbiAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgZW5jb2Rpbmc6IEZCWC5BUlJBWV9FTkNPRElORyA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9kYXRhLm9mZnNldCArIGJ5dGVMZW5ndGg7XHJcblxyXG4gICAgY29uc3QgaXRlcmFibGU6IEdlbmVyYXRvcjxUPiA9IGVuY29kaW5nID09IEZCWC5BUlJBWV9FTkNPRElORy5DT01QUkVTU0VEID9cclxuICAgICAgKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheURhdGE6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShfZGF0YS52aWV3LmJ1ZmZlciwgX2RhdGEub2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBpbmZsYXRlZERhdGE6IFVpbnQ4QXJyYXkgPSAoUmVmbGVjdC5nZXQoZ2xvYmFsVGhpcywgXCJwYWtvXCIpID8gcGFrby5pbmZsYXRlIDogZmZsYXRlLmluZmxhdGVTeW5jKShhcnJheURhdGEpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyUmVhZGVyKGluZmxhdGVkRGF0YS5idWZmZXIpLmdldFNlcXVlbmNlKF9nZXR0ZXIsIGxlbmd0aCk7XHJcbiAgICAgIH0pKCkgOlxyXG4gICAgICBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpO1xyXG5cclxuICAgIF9kYXRhLm9mZnNldCA9IGVuZE9mZnNldDtcclxuXHJcbiAgICByZXR1cm4gaXRlcmFibGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUmF3PFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9kYXRhOiBCdWZmZXJSZWFkZXIsIF9nZXR0ZXI6ICgpID0+IFQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgLy8gcmF3IGJpbmFyeSBkYXRhIG5lZWRzIHRvIGJlIGludGVycHJldGVkIGluIGEgc3BlY2lhbCB3YXkgc2VlOlxyXG4gICAgLy8gaHR0cHM6Ly9jb2RlLmJsZW5kZXIub3JnLzIwMTMvMDgvZmJ4LWJpbmFyeS1maWxlLWZvcm1hdC1zcGVjaWZpY2F0aW9uL1xyXG4gICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIHJldHVybiBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpOztcclxuICB9XHJcblxyXG4gIGNvbnN0IGJpbmFyeVN0YXJ0Q2hhcnM6IFVpbnQ4QXJyYXlcclxuICAgID0gVWludDhBcnJheS5mcm9tKFwiS2F5ZGFyYSBGQlggQmluYXJ5XFx4MjBcXHgyMFxceDAwXFx4MWFcXHgwMFwiLnNwbGl0KFwiXCIpLCBfdiA9PiBfdi5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgY29uc3QgbnVsbENvdW50QXROb2RlRW5kOiBudW1iZXIgPSAxMztcclxuXHJcbn0iLCJuYW1lc3BhY2UgR0xURiB7XHJcbiAgZXhwb3J0IHR5cGUgR2xUZklkID0gbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFuIG9iamVjdCBwb2ludGluZyB0byBhIGJ1ZmZlciB2aWV3IGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBpbmRpY2VzIGlzIGVxdWFsIHRvIGBhY2Nlc3Nvci5zcGFyc2UuY291bnRgLiBJbmRpY2VzICoqTVVTVCoqIHN0cmljdGx5IGluY3JlYXNlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3JTcGFyc2VJbmRpY2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBidWZmZXIgdmlldyB3aXRoIHNwYXJzZSBpbmRpY2VzLiBUaGUgcmVmZXJlbmNlZCBidWZmZXIgdmlldyAqKk1VU1QgTk9UKiogaGF2ZSBpdHMgYHRhcmdldGAgb3IgYGJ5dGVTdHJpZGVgIHByb3BlcnRpZXMgZGVmaW5lZC4gVGhlIGJ1ZmZlciB2aWV3IGFuZCB0aGUgb3B0aW9uYWwgYGJ5dGVPZmZzZXRgICoqTVVTVCoqIGJlIGFsaWduZWQgdG8gdGhlIGBjb21wb25lbnRUeXBlYCBieXRlIGxlbmd0aC5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJWaWV3XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciB2aWV3IGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVPZmZzZXRcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgZGF0YSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBcImNvbXBvbmVudFR5cGVcIjogQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSB8IENPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUIHwgQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpcyBlcXVhbCB0byBgYWNjZXNzb3Iuc3BhcnNlLmNvdW50YCB0aW1lcyBudW1iZXIgb2YgY29tcG9uZW50cy4gVGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIGJhc2UgYWNjZXNzb3IuIFRoZSBlbGVtZW50cyBhcmUgdGlnaHRseSBwYWNrZWQuIERhdGEgKipNVVNUKiogYmUgYWxpZ25lZCBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGJhc2UgYWNjZXNzb3IuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZVZhbHVlcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYnVmZmVyVmlldyB3aXRoIHNwYXJzZSB2YWx1ZXMuIFRoZSByZWZlcmVuY2VkIGJ1ZmZlciB2aWV3ICoqTVVTVCBOT1QqKiBoYXZlIGl0cyBgdGFyZ2V0YCBvciBgYnl0ZVN0cmlkZWAgcHJvcGVydGllcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyVmlldyBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTcGFyc2Ugc3RvcmFnZSBvZiBhY2Nlc3NvciB2YWx1ZXMgdGhhdCBkZXZpYXRlIGZyb20gdGhlaXIgaW5pdGlhbGl6YXRpb24gdmFsdWUuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZSB7XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgc3BhcnNlIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBcImNvdW50XCI6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIGluZGljZXMgaXMgZXF1YWwgdG8gYGNvdW50YC4gSW5kaWNlcyAqKk1VU1QqKiBzdHJpY3RseSBpbmNyZWFzZS5cclxuICAgICAqL1xyXG4gICAgXCJpbmRpY2VzXCI6IEFjY2Vzc29yU3BhcnNlSW5kaWNlcztcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJ2YWx1ZXNcIjogQWNjZXNzb3JTcGFyc2VWYWx1ZXM7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHR5cGVkIHZpZXcgaW50byBhIGJ1ZmZlciB2aWV3IHRoYXQgY29udGFpbnMgcmF3IGJpbmFyeSBkYXRhLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyVmlld1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZU9mZnNldFwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YXR5cGUgb2YgdGhlIGFjY2Vzc29yJ3MgY29tcG9uZW50cy5cclxuICAgICAqL1xyXG4gICAgXCJjb21wb25lbnRUeXBlXCI6IENPTVBPTkVOVF9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBpbnRlZ2VyIGRhdGEgdmFsdWVzIGFyZSBub3JtYWxpemVkIGJlZm9yZSB1c2FnZS5cclxuICAgICAqL1xyXG4gICAgXCJub3JtYWxpemVkXCI/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBhY2Nlc3Nvci5cclxuICAgICAqL1xyXG4gICAgXCJjb3VudFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYWNjZXNzb3IncyBlbGVtZW50cyBhcmUgc2NhbGFycywgdmVjdG9ycywgb3IgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBBQ0NFU1NPUl9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXhpbXVtIHZhbHVlIG9mIGVhY2ggY29tcG9uZW50IGluIHRoaXMgYWNjZXNzb3IuXHJcbiAgICAgKi9cclxuICAgIFwibWF4XCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogTWluaW11bSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCBpbiB0aGlzIGFjY2Vzc29yLlxyXG4gICAgICovXHJcbiAgICBcIm1pblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFNwYXJzZSBzdG9yYWdlIG9mIGVsZW1lbnRzIHRoYXQgZGV2aWF0ZSBmcm9tIHRoZWlyIGluaXRpYWxpemF0aW9uIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBcInNwYXJzZVwiPzogQWNjZXNzb3JTcGFyc2U7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjYWNjZXNzb3ItZGF0YS10eXBlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTVBPTkVOVF9UWVBFIHtcclxuICAgIEJZVEUgPSA1MTIwLFxyXG4gICAgVU5TSUdORURfQllURSA9IDUxMjEsXHJcbiAgICBTSE9SVCA9IDUxMjIsXHJcbiAgICBVTlNJR05FRF9TSE9SVCA9IDUxMjMsXHJcbiAgICBVTlNJR05FRF9JTlQgPSA1MTI1LFxyXG4gICAgRkxPQVQgPSA1MTI2XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBQ0NFU1NPUl9UWVBFIHtcclxuICAgIFNDQUxBUiA9IFwiU0NBTEFSXCIsXHJcbiAgICBWRUMyID0gXCJWRUMyXCIsXHJcbiAgICBWRUMzID0gXCJWRUMzXCIsXHJcbiAgICBWRUM0ID0gXCJWRUM0XCIsXHJcbiAgICBNQVQyID0gXCJNQVQyXCIsXHJcbiAgICBNQVQzID0gXCJNQVQzXCIsXHJcbiAgICBNQVQ0ID0gXCJNQVQ0XCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gYW5pbWF0ZS4gV2hlbiB1bmRlZmluZWQsIHRoZSBhbmltYXRlZCBvYmplY3QgKipNQVkqKiBiZSBkZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJub2RlXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlJ3MgVFJTIHByb3BlcnR5IHRvIGFuaW1hdGUsIG9yIHRoZSBgXCJ3ZWlnaHRzXCJgIG9mIHRoZSBNb3JwaCBUYXJnZXRzIGl0IGluc3RhbnRpYXRlcy4gRm9yIHRoZSBgXCJ0cmFuc2xhdGlvblwiYCBwcm9wZXJ0eSwgdGhlIHZhbHVlcyB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUgc2FtcGxlciBhcmUgdGhlIHRyYW5zbGF0aW9uIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLiBGb3IgdGhlIGBcInJvdGF0aW9uXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSBhIHF1YXRlcm5pb24gaW4gdGhlIG9yZGVyICh4LCB5LCB6LCB3KSwgd2hlcmUgdyBpcyB0aGUgc2NhbGFyLiBGb3IgdGhlIGBcInNjYWxlXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInBhdGhcIjogXCJ0cmFuc2xhdGlvblwiIHwgXCJyb3RhdGlvblwiIHwgXCJzY2FsZVwiIHwgXCJ3ZWlnaHRzXCI7IC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNhbmltYXRpb25zXHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbiBhbmltYXRpb24gY2hhbm5lbCBjb21iaW5lcyBhbiBhbmltYXRpb24gc2FtcGxlciB3aXRoIGEgdGFyZ2V0IHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiBhIHNhbXBsZXIgaW4gdGhpcyBhbmltYXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRhcmdldC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldFwiOiBBbmltYXRpb25DaGFubmVsVGFyZ2V0O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvblNhbXBsZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IgY29udGFpbmluZyBrZXlmcmFtZSB0aW1lc3RhbXBzLlxyXG4gICAgICovXHJcbiAgICBcImlucHV0XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJwb2xhdGlvbiBhbGdvcml0aG0uXHJcbiAgICAgKi9cclxuICAgIFwiaW50ZXJwb2xhdGlvblwiPzogXCJMSU5FQVJcIiB8IFwiU1RFUFwiIHwgXCJDVUJJQ1NQTElORVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IsIGNvbnRhaW5pbmcga2V5ZnJhbWUgb3V0cHV0IHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJvdXRwdXRcIjogR2xUZklkO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBrZXlmcmFtZSBhbmltYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBhbmltYXRpb24gY2hhbm5lbHMuIEFuIGFuaW1hdGlvbiBjaGFubmVsIGNvbWJpbmVzIGFuIGFuaW1hdGlvbiBzYW1wbGVyIHdpdGggYSB0YXJnZXQgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIERpZmZlcmVudCBjaGFubmVscyBvZiB0aGUgc2FtZSBhbmltYXRpb24gKipNVVNUIE5PVCoqIGhhdmUgdGhlIHNhbWUgdGFyZ2V0cy5cclxuICAgICAqL1xyXG4gICAgXCJjaGFubmVsc1wiOiBBbmltYXRpb25DaGFubmVsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGFuaW1hdGlvbiBzYW1wbGVycy4gQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyc1wiOiBBbmltYXRpb25TYW1wbGVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1ldGFkYXRhIGFib3V0IHRoZSBnbFRGIGFzc2V0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHlyaWdodCBtZXNzYWdlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIGNyZWRpdCB0aGUgY29udGVudCBjcmVhdG9yLlxyXG4gICAgICovXHJcbiAgICBcImNvcHlyaWdodFwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUb29sIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZ2xURiBtb2RlbC4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxyXG4gICAgICovXHJcbiAgICBcImdlbmVyYXRvclwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2xURiB2ZXJzaW9uIGluIHRoZSBmb3JtIG9mIGA8bWFqb3I+LjxtaW5vcj5gIHRoYXQgdGhpcyBhc3NldCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInZlcnNpb25cIjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBnbFRGIHZlcnNpb24gaW4gdGhlIGZvcm0gb2YgYDxtYWpvcj4uPG1pbm9yPmAgdGhhdCB0aGlzIGFzc2V0IHRhcmdldHMuIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGdyZWF0ZXIgdGhhbiB0aGUgYXNzZXQgdmVyc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJtaW5WZXJzaW9uXCI/OiBzdHJpbmc7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIGJ1ZmZlciBwb2ludHMgdG8gYmluYXJ5IGdlb21ldHJ5LCBhbmltYXRpb24sIG9yIHNraW5zLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVSSSAob3IgSVJJKSBvZiB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgdmlldyBpbnRvIGEgYnVmZmVyIGdlbmVyYWxseSByZXByZXNlbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGJ1ZmZlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEJ1ZmZlclZpZXcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlclZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdHJpZGUsIGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVTdHJpZGVcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpbnQgcmVwcmVzZW50aW5nIHRoZSBpbnRlbmRlZCBHUFUgYnVmZmVyIHR5cGUgdG8gdXNlIHdpdGggdGhpcyBidWZmZXIgdmlldy5cclxuICAgICAqL1xyXG4gICAgXCJ0YXJnZXRcIj86IG51bWJlciB8IG51bWJlciB8IG51bWJlcjtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb3J0aG9ncmFwaGljIGNhbWVyYSBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYU9ydGhvZ3JhcGhpYyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBob3Jpem9udGFsIG1hZ25pZmljYXRpb24gb2YgdGhlIHZpZXcuIFRoaXMgdmFsdWUgKipNVVNUIE5PVCoqIGJlIGVxdWFsIHRvIHplcm8uIFRoaXMgdmFsdWUgKipTSE9VTEQgTk9UKiogYmUgbmVnYXRpdmUuXHJcbiAgICAgKi9cclxuICAgIFwieG1hZ1wiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBtYWduaWZpY2F0aW9uIG9mIHRoZSB2aWV3LiBUaGlzIHZhbHVlICoqTVVTVCBOT1QqKiBiZSBlcXVhbCB0byB6ZXJvLiBUaGlzIHZhbHVlICoqU0hPVUxEIE5PVCoqIGJlIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBcInltYWdcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIGZhciBjbGlwcGluZyBwbGFuZS4gVGhpcyB2YWx1ZSAqKk1VU1QgTk9UKiogYmUgZXF1YWwgdG8gemVyby4gYHpmYXJgICoqTVVTVCoqIGJlIGdyZWF0ZXIgdGhhbiBgem5lYXJgLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuXHJcbiAgICAgKi9cclxuICAgIFwiem5lYXJcIjogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2FtZXJhUGVyc3BlY3RpdmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgYXNwZWN0IHJhdGlvIG9mIHRoZSBmaWVsZCBvZiB2aWV3LlxyXG4gICAgICovXHJcbiAgICBcImFzcGVjdFJhdGlvXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnMuIFRoaXMgdmFsdWUgKipTSE9VTEQqKiBiZSBsZXNzIHRoYW4gz4AuXHJcbiAgICAgKi9cclxuICAgIFwieWZvdlwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBkaXN0YW5jZSB0byB0aGUgZmFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZsb2F0aW5nLXBvaW50IGRpc3RhbmNlIHRvIHRoZSBuZWFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpuZWFyXCI6IG51bWJlcjtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2FtZXJhJ3MgcHJvamVjdGlvbi4gIEEgbm9kZSAqKk1BWSoqIHJlZmVyZW5jZSBhIGNhbWVyYSB0byBhcHBseSBhIHRyYW5zZm9ybSB0byBwbGFjZSB0aGUgY2FtZXJhIGluIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYSB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIG9ydGhvZ3JhcGhpYyBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgcGVyc3BlY3RpdmVgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwib3J0aG9ncmFwaGljXCI/OiBDYW1lcmFPcnRob2dyYXBoaWM7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjcmVhdGUgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBwcm9wZXJ0eSAqKk1VU1QgTk9UKiogYmUgZGVmaW5lZCB3aGVuIGBvcnRob2dyYXBoaWNgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwicGVyc3BlY3RpdmVcIj86IENhbWVyYVBlcnNwZWN0aXZlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNhbWVyYSB1c2VzIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBhbnkgfCBhbnkgfCBzdHJpbmc7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEltYWdlIGRhdGEgdXNlZCB0byBjcmVhdGUgYSB0ZXh0dXJlLiBJbWFnZSAqKk1BWSoqIGJlIHJlZmVyZW5jZWQgYnkgYW4gVVJJIChvciBJUkkpIG9yIGEgYnVmZmVyIHZpZXcgaW5kZXguXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVUkkgKG9yIElSSSkgb2YgdGhlIGltYWdlLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW1hZ2UncyBtZWRpYSB0eXBlLiBUaGlzIGZpZWxkICoqTVVTVCoqIGJlIGRlZmluZWQgd2hlbiBgYnVmZmVyVmlld2AgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJtaW1lVHlwZVwiPzogYW55IHwgYW55IHwgc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcgdGhhdCBjb250YWlucyB0aGUgaW1hZ2UuIFRoaXMgZmllbGQgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgdXJpYCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIGEgdGV4dHVyZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmVJbmZvIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImluZGV4XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNldCBpbmRleCBvZiB0ZXh0dXJlJ3MgVEVYQ09PUkQgYXR0cmlidXRlIHVzZWQgZm9yIHRleHR1cmUgY29vcmRpbmF0ZSBtYXBwaW5nLlxyXG4gICAgICovXHJcbiAgICBcInRleENvb3JkXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5LUJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsUGJyTWV0YWxsaWNSb3VnaG5lc3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmFjdG9ycyBmb3IgdGhlIGJhc2UgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImJhc2VDb2xvckZhY3RvclwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBiYXNlIGNvbG9yIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwiYmFzZUNvbG9yVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcIm1ldGFsbGljRmFjdG9yXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSByb3VnaG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcInJvdWdobmVzc0ZhY3RvclwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWV0YWxsaWMtcm91Z2huZXNzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlXCI/OiBUZXh0dXJlSW5mbztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbyB7XHJcbiAgICBcImluZGV4XCI/OiBhbnk7XHJcbiAgICBcInRleENvb3JkXCI/OiBhbnk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2FsYXIgcGFyYW1ldGVyIGFwcGxpZWQgdG8gZWFjaCBub3JtYWwgdmVjdG9yIG9mIHRoZSBub3JtYWwgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgXCJzY2FsZVwiPzogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbE9jY2x1c2lvblRleHR1cmVJbmZvIHtcclxuICAgIFwiaW5kZXhcIj86IGFueTtcclxuICAgIFwidGV4Q29vcmRcIj86IGFueTtcclxuICAgIC8qKlxyXG4gICAgICogQSBzY2FsYXIgbXVsdGlwbGllciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIG9jY2x1c2lvbiBhcHBsaWVkLlxyXG4gICAgICovXHJcbiAgICBcInN0cmVuZ3RoXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgbWF0ZXJpYWwgYXBwZWFyYW5jZSBvZiBhIHByaW1pdGl2ZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIHtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS4gV2hlbiB1bmRlZmluZWQsIGFsbCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgYHBick1ldGFsbGljUm91Z2huZXNzYCAqKk1VU1QqKiBhcHBseS5cclxuICAgICAqL1xyXG4gICAgXCJwYnJNZXRhbGxpY1JvdWdobmVzc1wiPzogTWF0ZXJpYWxQYnJNZXRhbGxpY1JvdWdobmVzcztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibm9ybWFsVGV4dHVyZVwiPzogTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9jY2x1c2lvbiB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcIm9jY2x1c2lvblRleHR1cmVcIj86IE1hdGVyaWFsT2NjbHVzaW9uVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBlbWlzc2l2ZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3JzIGZvciB0aGUgZW1pc3NpdmUgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlRmFjdG9yXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHJlbmRlcmluZyBtb2RlIG9mIHRoZSBtYXRlcmlhbC5cclxuICAgICAqL1xyXG4gICAgXCJhbHBoYU1vZGVcIj86IFwiT1BBUVVFXCIgfCBcIk1BU0tcIiB8IFwiQkxFTkRcIjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIGN1dG9mZiB2YWx1ZSBvZiB0aGUgbWF0ZXJpYWwuXHJcbiAgICAgKi9cclxuICAgIFwiYWxwaGFDdXRvZmZcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGRvdWJsZSBzaWRlZC5cclxuICAgICAqL1xyXG4gICAgXCJkb3VibGVTaWRlZFwiPzogYm9vbGVhbjtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlb21ldHJ5IHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaFByaW1pdGl2ZSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGxhaW4gSlNPTiBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgbWVzaCBhdHRyaWJ1dGUgc2VtYW50aWMgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBhY2Nlc3NvciBjb250YWluaW5nIGF0dHJpYnV0ZSdzIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIFwiYXR0cmlidXRlc1wiOiB7XHJcbiAgICAgIFtrOiBzdHJpbmddOiBHbFRmSWQ7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIHRoYXQgY29udGFpbnMgdGhlIHZlcnRleCBpbmRpY2VzLlxyXG4gICAgICovXHJcbiAgICBcImluZGljZXNcIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBtYXRlcmlhbCB0byBhcHBseSB0byB0aGlzIHByaW1pdGl2ZSB3aGVuIHJlbmRlcmluZy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wb2xvZ3kgdHlwZSBvZiBwcmltaXRpdmVzIHRvIHJlbmRlci5cclxuICAgICAqL1xyXG4gICAgXCJtb2RlXCI/OiBNRVNIX1BSSU1JVElWRV9NT0RFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBtb3JwaCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldHNcIj86IHtcclxuICAgICAgW2s6IHN0cmluZ106IEdsVGZJZDtcclxuICAgIH1bXTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBNRVNIX1BSSU1JVElWRV9NT0RFIHtcclxuICAgIFBPSU5UUyxcclxuICAgIExJTkVTLFxyXG4gICAgTElORV9MT09QLFxyXG4gICAgTElORV9TVFJJUCxcclxuICAgIFRSSUFOR0xFUyxcclxuICAgIFRSSUFOR0xFX1NUUklQLFxyXG4gICAgVFJJQU5HTEVfRkFOXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwcmltaXRpdmVzIHRvIGJlIHJlbmRlcmVkLiAgSXRzIGdsb2JhbCB0cmFuc2Zvcm0gaXMgZGVmaW5lZCBieSBhIG5vZGUgdGhhdCByZWZlcmVuY2VzIGl0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIGVhY2ggZGVmaW5pbmcgZ2VvbWV0cnkgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIFwicHJpbWl0aXZlc1wiOiBNZXNoUHJpbWl0aXZlW107XHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIHdlaWdodHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbW9ycGggdGFyZ2V0cy4gVGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqKk1VU1QqKiBtYXRjaCB0aGUgbnVtYmVyIG9mIG1vcnBoIHRhcmdldHMuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgbm9kZSBpbiB0aGUgbm9kZSBoaWVyYXJjaHkuICBXaGVuIHRoZSBub2RlIGNvbnRhaW5zIGBza2luYCwgYWxsIGBtZXNoLnByaW1pdGl2ZXNgICoqTVVTVCoqIGNvbnRhaW4gYEpPSU5UU18wYCBhbmQgYFdFSUdIVFNfMGAgYXR0cmlidXRlcy4gIEEgbm9kZSAqKk1BWSoqIGhhdmUgZWl0aGVyIGEgYG1hdHJpeGAgb3IgYW55IGNvbWJpbmF0aW9uIG9mIGB0cmFuc2xhdGlvbmAvYHJvdGF0aW9uYC9gc2NhbGVgIChUUlMpIHByb3BlcnRpZXMuIFRSUyBwcm9wZXJ0aWVzIGFyZSBjb252ZXJ0ZWQgdG8gbWF0cmljZXMgYW5kIHBvc3RtdWx0aXBsaWVkIGluIHRoZSBgVCAqIFIgKiBTYCBvcmRlciB0byBjb21wb3NlIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXg7IGZpcnN0IHRoZSBzY2FsZSBpcyBhcHBsaWVkIHRvIHRoZSB2ZXJ0aWNlcywgdGhlbiB0aGUgcm90YXRpb24sIGFuZCB0aGVuIHRoZSB0cmFuc2xhdGlvbi4gSWYgbm9uZSBhcmUgcHJvdmlkZWQsIHRoZSB0cmFuc2Zvcm0gaXMgdGhlIGlkZW50aXR5LiBXaGVuIGEgbm9kZSBpcyB0YXJnZXRlZCBmb3IgYW5pbWF0aW9uIChyZWZlcmVuY2VkIGJ5IGFuIGFuaW1hdGlvbi5jaGFubmVsLnRhcmdldCksIGBtYXRyaXhgICoqTVVTVCBOT1QqKiBiZSBwcmVzZW50LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2FtZXJhIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBcImNhbWVyYVwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kaWNlcyBvZiB0aGlzIG5vZGUncyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgXCJjaGlsZHJlblwiPzogR2xUZklkW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2tpbiByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgXCJza2luXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEEgZmxvYXRpbmctcG9pbnQgNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzdG9yZWQgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hdHJpeFwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWVzaCBpbiB0aGlzIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibWVzaFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIHVuaXQgcXVhdGVybmlvbiByb3RhdGlvbiBpbiB0aGUgb3JkZXIgKHgsIHksIHosIHcpLCB3aGVyZSB3IGlzIHRoZSBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIFwicm90YXRpb25cIj86IG51bWJlcltdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIG5vbi11bmlmb3JtIHNjYWxlLCBnaXZlbiBhcyB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInNjYWxlXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5vZGUncyB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhlcy5cclxuICAgICAqL1xyXG4gICAgXCJ0cmFuc2xhdGlvblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3ZWlnaHRzIG9mIHRoZSBpbnN0YW50aWF0ZWQgbW9ycGggdGFyZ2V0LiBUaGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICoqTVVTVCoqIG1hdGNoIHRoZSBudW1iZXIgb2YgbW9ycGggdGFyZ2V0cyBvZiB0aGUgcmVmZXJlbmNlZCBtZXNoLiBXaGVuIGRlZmluZWQsIGBtZXNoYCAqKk1VU1QqKiBhbHNvIGJlIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IHN0cmluZztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIHBhcmVudD86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUGF0aCBmcm9tIHRoZSByb290IG5vZGUgdG8gdGhpcyBub2RlLlxyXG4gICAgICogQ3VzdG9tIHByb3BlcnR5IHNldCBieSBGVURHRSBsb2FkZXIuIE5vdCBwYXJ0IG9mIGdsVEYgc3RhbmRhcmQgMi4wLlxyXG4gICAgICovXHJcbiAgICBwYXRoPzogbnVtYmVyW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgc2FtcGxlciBwcm9wZXJ0aWVzIGZvciBmaWx0ZXJpbmcgYW5kIHdyYXBwaW5nIG1vZGVzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlciB7XHJcbiAgICAvKipcclxuICAgICAqIE1hZ25pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hZ0ZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaW5pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1pbkZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX05FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSX01JUE1BUF9ORUFSRVNUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX0xJTkVBUlwiXSB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHRbXCJMSU5FQVJfTUlQTUFQX0xJTkVBUlwiXTtcclxuICAgIC8qKlxyXG4gICAgICogUyAoVSkgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwU1wiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIC8qKlxyXG4gICAgICogVCAoVikgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwVFwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIFwibmFtZVwiPzogc3RyaW5nO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgbm9kZXMgb2YgYSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjZW5lIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgb2YgZWFjaCByb290IG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IEdsVGZJZFtdO1xyXG4gICAgXCJuYW1lXCI/OiBhbnk7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBKb2ludHMgYW5kIG1hdHJpY2VzIGRlZmluaW5nIGEgc2tpbi5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNraW4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIGNvbnRhaW5pbmcgdGhlIGZsb2F0aW5nLXBvaW50IDR4NCBpbnZlcnNlLWJpbmQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwiaW52ZXJzZUJpbmRNYXRyaWNlc1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdXNlZCBhcyBhIHNrZWxldG9uIHJvb3QuXHJcbiAgICAgKi9cclxuICAgIFwic2tlbGV0b25cIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNlcyBvZiBza2VsZXRvbiBub2RlcywgdXNlZCBhcyBqb2ludHMgaW4gdGhpcyBza2luLlxyXG4gICAgICovXHJcbiAgICBcImpvaW50c1wiOiBHbFRmSWRbXTtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSB0ZXh0dXJlIGFuZCBpdHMgc2FtcGxlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNhbXBsZXIgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhIHNhbXBsZXIgd2l0aCByZXBlYXQgd3JhcHBpbmcgYW5kIGF1dG8gZmlsdGVyaW5nICoqU0hPVUxEKiogYmUgdXNlZC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhbiBleHRlbnNpb24gb3Igb3RoZXIgbWVjaGFuaXNtICoqU0hPVUxEKiogc3VwcGx5IGFuIGFsdGVybmF0ZSB0ZXh0dXJlIHNvdXJjZSwgb3RoZXJ3aXNlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJzb3VyY2VcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgb2JqZWN0IGZvciBhIGdsVEYgYXNzZXQuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHbFRmIHtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgZ2xURiBleHRlbnNpb25zIHVzZWQgaW4gdGhpcyBhc3NldC5cclxuICAgICAqL1xyXG4gICAgXCJleHRlbnNpb25zVXNlZFwiPzogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIGdsVEYgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBsb2FkIHRoaXMgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiZXh0ZW5zaW9uc1JlcXVpcmVkXCI/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzb3JzLlxyXG4gICAgICovXHJcbiAgICBcImFjY2Vzc29yc1wiPzogQWNjZXNzb3JbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Yga2V5ZnJhbWUgYW5pbWF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgXCJhbmltYXRpb25zXCI/OiBBbmltYXRpb25bXTtcclxuICAgIC8qKlxyXG4gICAgICogTWV0YWRhdGEgYWJvdXQgdGhlIGdsVEYgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiYXNzZXRcIjogQXNzZXQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlcnMuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyc1wiPzogQnVmZmVyW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlclZpZXdzLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdzXCI/OiBCdWZmZXJWaWV3W107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNhbWVyYXMuXHJcbiAgICAgKi9cclxuICAgIFwiY2FtZXJhc1wiPzogQ2FtZXJhW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGltYWdlcy5cclxuICAgICAqL1xyXG4gICAgXCJpbWFnZXNcIj86IEltYWdlW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1hdGVyaWFscy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbHNcIj86IE1hdGVyaWFsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1lc2hlcy5cclxuICAgICAqL1xyXG4gICAgXCJtZXNoZXNcIj86IE1lc2hbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygbm9kZXMuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IE5vZGVbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygc2FtcGxlcnMuXHJcbiAgICAgKi9cclxuICAgIFwic2FtcGxlcnNcIj86IFNhbXBsZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IHNjZW5lLlxyXG4gICAgICovXHJcbiAgICBcInNjZW5lXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNjZW5lcy5cclxuICAgICAqL1xyXG4gICAgXCJzY2VuZXNcIj86IFNjZW5lW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNraW5zLlxyXG4gICAgICovXHJcbiAgICBcInNraW5zXCI/OiBTa2luW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHRleHR1cmVzLlxyXG4gICAgICovXHJcbiAgICBcInRleHR1cmVzXCI/OiBUZXh0dXJlW107XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBc3NldCBsb2FkZXIgZm9yIGdsIFRyYW5zZmVyIEZvcm1hdCBmaWxlcy5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMiB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHTFRGTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VybDogc3RyaW5nXTogR0xURkxvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcmVhZG9ubHkgI3VybDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgI2dsdGY6IEdMVEYuR2xUZjtcclxuXHJcbiAgICAjcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuXHJcbiAgICAjbm9kZXM6IE5vZGVbXSA9IFtdO1xyXG4gICAgI2NhbWVyYXM6IENvbXBvbmVudENhbWVyYVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuXHJcbiAgICAjYnVmZmVyczogQXJyYXlCdWZmZXJbXTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZywgX2J1ZmZlckNodW5rPzogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy4jZ2x0ZiA9IF9nbHRmO1xyXG4gICAgICB0aGlzLiN1cmwgPSBfdXJsO1xyXG4gICAgICBpZiAoX2J1ZmZlckNodW5rKVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnMgPSBbX2J1ZmZlckNodW5rXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgaWYgKCF0aGlzLiNkZWZhdWx0TWF0ZXJpYWwpIHtcclxuICAgICAgICB0aGlzLiNkZWZhdWx0TWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdE1hdGVyaWFsXCIsIFNoYWRlclBob25nLCBuZXcgQ29hdFJlbWlzc2l2ZShDb2xvci5DU1MoXCJ3aGl0ZVwiKSwgMSwgMC41KSk7XHJcbiAgICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHRoaXMuI2RlZmF1bHRNYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdFNraW5NYXRlcmlhbCgpOiBNYXRlcmlhbCB7XHJcbiAgICAgIGlmICghdGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCkge1xyXG4gICAgICAgIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdFNraW5NYXRlcmlhbFwiLCBTaGFkZXJQaG9uZ1NraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpLCAxLCAwLjUpKTtcclxuICAgICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIHJlc291cmNlIGZyb20gYSBnbFRGIGZpbGUuIFVzZWQgYnkgdGhlIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfUdMVEYgc3BlY2lhbGl6YXRpb25zIHRvIGxvYWQgdGhlbXNlbHZlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZTxUIGV4dGVuZHMgR3JhcGhHTFRGIHwgTWVzaEdMVEYgfCBNYXRlcmlhbEdMVEYgfCBBbmltYXRpb25HTFRGIHwgR3JhcGhJbnN0YW5jZT4oX3Jlc291cmNlOiBULCBfdXJsPzogUmVxdWVzdEluZm8pOiBQcm9taXNlPFQ+IHtcclxuICAgICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gYXdhaXQgR0xURkxvYWRlci5MT0FEKCgoPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+X3Jlc291cmNlKS51cmwgPz8gX3VybCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoIWxvYWRlcikge1xyXG4gICAgICAgIGlmICghKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKVxyXG4gICAgICAgICAgX3Jlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5FUlJPUjtcclxuICAgICAgICByZXR1cm4gX3Jlc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG9hZGVkOiBUO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5nZXQoKS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBNZXNoR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWVzaChfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlLmlQcmltaXRpdmUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWF0ZXJpYWwoX3Jlc291cmNlLm5hbWUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEFuaW1hdGlvbkdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEFuaW1hdGlvbihfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmICghbG9hZGVkKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoYCR7X3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IHwgJHtfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlID8gX3Jlc291cmNlLmlkU291cmNlIDogX3Jlc291cmNlLmlkUmVzb3VyY2V9OiBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZS5gKTtcclxuICAgICAgICBpZiAoIShfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSlcclxuICAgICAgICAgIF9yZXNvdXJjZS5zdGF0dXMgPSBSRVNPVVJDRV9TVEFUVVMuRVJST1I7XHJcblxyXG4gICAgICAgIHJldHVybiBfcmVzb3VyY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghKGxvYWRlZCBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgbG9hZGVkLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKGNhY2hlZCAmJiAhKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcblxyXG4gICAgICAvLyAgIGlmICghUHJvamVjdC5yZXNvdXJjZXNbY2FjaGVkLmlkUmVzb3VyY2VdKVxyXG4gICAgICAvLyAgICAgY2FjaGVkLmlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuaWRSZXNvdXJjZTsgLy8gY2hhbmdlIHRoZSBpZCBvZiB0aGUgY2FjaGVkIHJlc291cmNlIHRvIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgdGhhdCByZXF1ZXN0ZWQgaXRcclxuXHJcbiAgICAgIC8vICAgaWYgKGNhY2hlZC5pZFJlc291cmNlICE9IF9yZXNvdXJjZS5pZFJlc291cmNlKSB7XHJcbiAgICAgIC8vICAgICAvLyB0d28gZGlmZmVyZW50IHJlc291cmNlcyBoYXZlIHJlcXVlc3RlZCB0aGUgc2FtZSBjYWNoZWQgcmVzb3VyY2VcclxuICAgICAgLy8gICAgIERlYnVnLmVycm9yKGAke19yZXNvdXJjZS5pZFJlc291cmNlfTogRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UuICR7X3Jlc291cmNlLnR5cGV9IHdpdGggbmFtZSAnJHtfcmVzb3VyY2UubmFtZX0nIGZyb20gJyR7bG9hZGVyLm5hbWV9JyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSAnJHtjYWNoZWQuaWRSZXNvdXJjZX0nLiBQbGVhc2UgZGVsZXRlIHRoZSBkdXBsaWNhdGUgJyR7X3Jlc291cmNlLmlkUmVzb3VyY2V9JyBmcm9tIHRoZSBwcm9qZWN0LmApO1xyXG4gICAgICAvLyAgICAgcmV0dXJuIF9yZXNvdXJjZTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICByZXR1cm4gbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHTFRGTG9hZGVyfSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHVybCBvciBudWxsIGlmIHRoZSB1cmwgY2FuJ3QgYmUgcmVzb2x2ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgTE9BRChfdXJsOiBzdHJpbmcsIF9yZWdpc3RlclJlc291cmNlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxHTFRGTG9hZGVyPiB7XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzKVxyXG4gICAgICAgIEdMVEZMb2FkZXIubG9hZGVycyA9IHt9O1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnNbX3VybF0pIHtcclxuICAgICAgICBsZXQgZ2x0ZjogR0xURi5HbFRmO1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKF91cmwsIFByb2plY3QuYmFzZVVSTCkpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbjogc3RyaW5nID0gX3VybC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2x0ZlwiKVxyXG4gICAgICAgICAgICBnbHRmID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2xiXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hZ2ljOiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYWdpYyAhPT0gMHg0NjU0NkM2NylcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IEludmFsaWQgbWFnaWMgbnVtYmVyIGluIEdMQiBmaWxlLmApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvbiAhPSAyKVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVW5zdXBwb3J0ZWQgdmVyc2lvbiBpbiBHTEIgZmlsZS5gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25MZW5ndGg6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxMiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25Gb3JtYXQ6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoanNvbkZvcm1hdCAhPT0gMHg0RTRGNTM0QSlcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0LiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIEpTT04gZm9ybWF0LicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QganNvbkNodW5rOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgMjAsIGpzb25MZW5ndGgpKTtcclxuICAgICAgICAgICAgZ2x0ZiA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID49IDIwICsganNvbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUxlbmd0aDogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDIwICsganNvbkxlbmd0aCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmluYXJ5Rm9ybWF0OiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMjQgKyBqc29uTGVuZ3RoLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJpbmFyeUZvcm1hdCAhPT0gMHgwMDRFNDk0MilcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQuIFRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIGJpbmFyeSBmb3JtYXQuJyk7XHJcblxyXG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5QnVmZmVyLnNsaWNlKDI4ICsganNvbkxlbmd0aCwgMjggKyBqc29uTGVuZ3RoICsgYmluYXJ5TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogRmFpbGVkIHRvIGxvYWQgZmlsZS4gJHtlcnJvcn1gKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR0xURkxvYWRlci5jaGVja0NvbXBhdGliaWxpdHkoZ2x0ZiwgX3VybCk7XHJcbiAgICAgICAgR0xURkxvYWRlci5wcmVQcm9jZXNzKGdsdGYsIF91cmwpO1xyXG5cclxuICAgICAgICBHTFRGTG9hZGVyLmxvYWRlcnNbX3VybF0gPSBuZXcgR0xURkxvYWRlcihnbHRmLCBfdXJsLCBidWZmZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkZXJzW191cmxdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrQ29tcGF0aWJpbGl0eShfZ2x0ZjogR0xURi5HbFRmLCBfdXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9nbHRmLmFzc2V0LnZlcnNpb24gIT0gXCIyLjBcIilcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke0dMVEZMb2FkZXIubmFtZX0gfCAke191cmx9OiBUaGlzIGxvYWRlciB3YXMgZGV2ZWxvcGVkIGZvciBnbFRGIDIuMC4gSXQgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkIHdpdGggdmVyc2lvbiAke19nbHRmLmFzc2V0LnZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSB1bmRlZmluZWQgJiYgX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSBcIjIuMFwiKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgd2FzIGRldmVsb3BlZCBmb3IgZ2xURiAyLjAuIEl0IGRvZXMgbm90IHdvcmsgd2l0aCByZXF1aXJlZCBtaW4gdmVyc2lvbiAke19nbHRmLmFzc2V0Lm1pblZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuZXh0ZW5zaW9uc1VzZWQ/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgRGVidWcud2FybihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnbFRGIGV4dGVuc2lvbnMuIEl0IG1heSBub3Qgd29yayBhcyBpbnRlbmRlZCB3aXRoIGV4dGVuc2lvbnMgJHtfZ2x0Zi5leHRlbnNpb25zVXNlZC50b1N0cmluZygpfS5gKTtcclxuICAgICAgaWYgKF9nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZD8ubGVuZ3RoID4gMClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IFRoaXMgbG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xURiBleHRlbnNpb25zLiBJdCBkb2VzIG5vdCB3b3JrIHdpdGggcmVxdWlyZWQgZXh0ZW5zaW9ucyAke19nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZC50b1N0cmluZygpfS5gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBwcmVQcm9jZXNzKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAvLyBhZGQgYSBuYW1lIHRvIGVhY2ggc2NlbmVcclxuICAgICAgaWYgKF9nbHRmLnNjZW5lcykge1xyXG4gICAgICAgIF9nbHRmLnNjZW5lID0gX2dsdGYuc2NlbmUgPz8gMDtcclxuICAgICAgICBhZGROYW1lcyhcIlNjZW5lXCIsIF9nbHRmLnNjZW5lcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5ub2Rlcykge1xyXG4gICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIHRoYXQgYXJlIGFuaW1hdGVkXHJcbiAgICAgICAgX2dsdGYuYW5pbWF0aW9ucz8uZm9yRWFjaChfYW5pbWF0aW9uID0+IHtcclxuICAgICAgICAgIF9hbmltYXRpb24uY2hhbm5lbHMuZm9yRWFjaChfY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlOb2RlOiBudW1iZXIgPSBfY2hhbm5lbC50YXJnZXQubm9kZTtcclxuICAgICAgICAgICAgaWYgKGlOb2RlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICBfZ2x0Zi5ub2Rlc1tpTm9kZV0uaXNBbmltYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbWFyayBwYXJlbnQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4gX25vZGUuY2hpbGRyZW4/LmZvckVhY2goX2lDaGlsZCA9PiBfZ2x0Zi5ub2Rlc1tfaUNoaWxkXS5wYXJlbnQgPSBfaU5vZGUpKTtcclxuXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4ge1xyXG4gICAgICAgICAgLy8gYWRkIG5hbWVzIHRvIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmVcclxuICAgICAgICAgIGlmIChfbm9kZS5uYW1lID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgX25vZGUubmFtZSA9IGBOb2RlJHtfaU5vZGV9YDtcclxuXHJcbiAgICAgICAgICBpZiAoX25vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgcGF0aCB0byBlYWNoIGFuaW1hdGVkIG5vZGVcclxuICAgICAgICAgICAgbGV0IGlQYXJlbnQ6IG51bWJlciA9IF9ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgbGV0IHBhdGg6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChfaU5vZGUpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaVBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBwYXRoLnB1c2goaVBhcmVudCk7XHJcbiAgICAgICAgICAgICAgaVBhcmVudCA9IF9nbHRmLm5vZGVzW2lQYXJlbnRdLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbm9kZS5wYXRoID0gcGF0aC5yZXZlcnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX2dsdGYubWF0ZXJpYWxzKVxyXG4gICAgICAgIGFkZE5hbWVzKFwiTWF0ZXJpYWxcIiwgX2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5tZXNoZXMpXHJcbiAgICAgICAgYWRkTmFtZXMoXCJNZXNoXCIsIF9nbHRmLm1lc2hlcyk7XHJcblxyXG4gICAgICBpZiAoX2dsdGYuYW5pbWF0aW9ucylcclxuICAgICAgICBhZGROYW1lcyhcIkFuaW1hdGlvblwiLCBfZ2x0Zi5hbmltYXRpb25zKTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGFkZE5hbWVzKF90ZW1wbGF0ZTogc3RyaW5nLCBfdGFyZ2V0OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogdm9pZCB7XHJcbiAgICAgICAgX3RhcmdldC5mb3JFYWNoKChfaXRlbSwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoX2l0ZW0ubmFtZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9pdGVtLm5hbWUgPSBgJHtfdGVtcGxhdGV9JHtfaW5kZXh9YDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ2xURiBmaWxlIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdXJsLnNwbGl0KFwiXFxcXFwiKS5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbmV3IGluc3RhbmNlcyBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZFJlc291cmNlczxUIGV4dGVuZHMgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFByb21pc2U8VFtdPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZXM6IFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWxbXSA9IFtdO1xyXG4gICAgICBzd2l0Y2ggKF9jbGFzcy5uYW1lKSB7XHJcbiAgICAgICAgY2FzZSBHcmFwaC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaVNjZW5lOiBudW1iZXIgPSAwOyBpU2NlbmUgPCB0aGlzLiNnbHRmLnNjZW5lcz8ubGVuZ3RoOyBpU2NlbmUrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRHcmFwaChpU2NlbmUsIG5ldyBHcmFwaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZXNoLm5hbWU6XHJcbiAgICAgICAgICBmb3IgKGxldCBpTWVzaDogbnVtYmVyID0gMDsgaU1lc2ggPCB0aGlzLiNnbHRmLm1lc2hlcz8ubGVuZ3RoOyBpTWVzaCsrKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgdGhpcy4jZ2x0Zi5tZXNoZXNbaU1lc2hdLnByaW1pdGl2ZXMubGVuZ3RoOyBpUHJpbWl0aXZlKyspXHJcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNZXNoKGlNZXNoLCBpUHJpbWl0aXZlLCBuZXcgTWVzaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNYXRlcmlhbC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaU1hdGVyaWFsOiBudW1iZXIgPSAwOyBpTWF0ZXJpYWwgPCB0aGlzLiNnbHRmLm1hdGVyaWFscz8ubGVuZ3RoOyBpTWF0ZXJpYWwrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNYXRlcmlhbChpTWF0ZXJpYWwsIG5ldyBNYXRlcmlhbEdMVEYoXCJIaSA6KVwiKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBbmltYXRpb24ubmFtZTpcclxuICAgICAgICAgIGZvciAobGV0IGlBbmltYXRpb246IG51bWJlciA9IDA7IGlBbmltYXRpb24gPCB0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aDsgaUFuaW1hdGlvbisrKVxyXG4gICAgICAgICAgICByZXNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmdldEFuaW1hdGlvbihpQW5pbWF0aW9uLCBuZXcgQW5pbWF0aW9uR0xURigpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcclxuICAgICAgICBpZiAoIVByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlLmlkUmVzb3VyY2VdKVxyXG4gICAgICAgICAgUHJvamVjdC5yZWdpc3RlcihyZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIHJlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDxUW10+cmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHcmFwaH0gZm9yIHRoZSBnaXZlbiBzY2VuZSBuYW1lIG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIG5hbWUgaXMgZ2l2ZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaChfbmFtZT86IHN0cmluZyk6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEdyYXBofSBmb3IgdGhlIGdpdmVuIHNjZW5lIGluZGV4IG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIGluZGV4IGlzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0R3JhcGgoX2lTY2VuZT86IG51bWJlcik6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIHNjZW5lIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaDxUIGV4dGVuZHMgTm9kZT4oX2lTY2VuZTogbnVtYmVyIHwgc3RyaW5nLCBfZ3JhcGg6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldEdyYXBoKF9pU2NlbmU6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuI2dsdGYuc2NlbmUsIF9ncmFwaD86IE5vZGUpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgX2lTY2VuZSA9IHRoaXMuZ2V0SW5kZXgoX2lTY2VuZSwgdGhpcy4jZ2x0Zi5zY2VuZXMpO1xyXG5cclxuICAgICAgaWYgKF9pU2NlbmUgPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7R3JhcGhHTFRGLm5hbWV9fCR7X2lTY2VuZX1gO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE5vZGU+PHVua25vd24+dGhpcy4jcmVzb3VyY2VzW2lkXTtcclxuXHJcbiAgICAgIHRoaXMuI25vZGVzID0gW107XHJcbiAgICAgIHRoaXMuI2NhbWVyYXMgPSBbXTtcclxuICAgICAgdGhpcy4jc2tlbGV0b25zID0gW107XHJcblxyXG4gICAgICBjb25zdCBnbHRmU2NlbmU6IEdMVEYuU2NlbmUgPSB0aGlzLiNnbHRmLnNjZW5lc1tfaVNjZW5lXTtcclxuICAgICAgY29uc3QgZ3JhcGg6IE5vZGUgPSBfZ3JhcGggPz8gbmV3IEdyYXBoR0xURigpO1xyXG4gICAgICBncmFwaC5uYW1lID0gZ2x0ZlNjZW5lLm5hbWU7XHJcbiAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICBncmFwaC51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmIChfZ3JhcGgpIHtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQ29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaU5vZGUgb2YgZ2x0ZlNjZW5lLm5vZGVzKVxyXG4gICAgICAgIGdyYXBoLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoaU5vZGUpKTtcclxuXHJcbiAgICAgIC8vIGlmICh0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aCA+IDAgJiYgIWdyYXBoLmdldENvbXBvbmVudChDb21wb25lbnRBbmltYXRvcikpIHtcclxuICAgICAgLy8gICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBhd2FpdCB0aGlzLmdldEFuaW1hdGlvbigwKTtcclxuICAgICAgLy8gICBQcm9qZWN0LnJlZ2lzdGVyKGFuaW1hdGlvbik7XHJcbiAgICAgIC8vICAgZ3JhcGguYWRkQ29tcG9uZW50KG5ldyBDb21wb25lbnRBbmltYXRvcihhbmltYXRpb24pKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gVE9ETzogbG9hZCBvbmx5IHNrZWxldG9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNjZW5lPz8/XHJcbiAgICAgIC8vIGlmICh0aGlzLmdsdGYuc2tpbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVNraW46IG51bWJlciA9IDA7IGlTa2luIDwgdGhpcy5nbHRmLnNraW5zLmxlbmd0aDsgaVNraW4rKylcclxuICAgICAgLy8gICAgIHNjZW5lLmFkZENvbXBvbmVudChhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChpU2tpbikpO1xyXG4gICAgICBpZiAodGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIGZvciAoY29uc3Qgc2tlbGV0b24gb2YgdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgICAgZ3JhcGguYWRkQ29tcG9uZW50KHNrZWxldG9uKTtcclxuXHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSA8R3JhcGhHTFRGPmdyYXBoO1xyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIE5vZGV9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9uYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgY29uc3QgaU5vZGU6IG51bWJlciA9IHRoaXMuI2dsdGYubm9kZXMuZmluZEluZGV4KF9ub2RlID0+IF9ub2RlLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaU5vZGUgPT0gLTEpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWV9JyBpbiBnbFRGIG5vZGVzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROb2RlQnlJbmRleChpTm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTm9kZX0gZm9yIHRoZSBnaXZlbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE5vZGVCeUluZGV4KF9pTm9kZTogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXNbX2lOb2RlXSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZOb2RlOiBHTFRGLk5vZGUgPSB0aGlzLiNnbHRmLm5vZGVzW19pTm9kZV07XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKGdsdGZOb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICB0aGlzLiNub2Rlc1tfaU5vZGVdID0gbm9kZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNoaWxkcmVuKVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpTm9kZSBvZiBnbHRmTm9kZS5jaGlsZHJlbilcclxuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChhd2FpdCB0aGlzLmdldE5vZGVCeUluZGV4KGlOb2RlKSk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciB0cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXggfHwgZ2x0Zk5vZGUucm90YXRpb24gfHwgZ2x0Zk5vZGUuc2NhbGUgfHwgZ2x0Zk5vZGUudHJhbnNsYXRpb24gfHwgZ2x0Zk5vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudFRyYW5zZm9ybSgpKTtcclxuICAgICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXgpIHtcclxuICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zZXQoZ2x0Zk5vZGUubWF0cml4KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS50cmFuc2xhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uLnNldChnbHRmTm9kZS50cmFuc2xhdGlvblswXSwgZ2x0Zk5vZGUudHJhbnNsYXRpb25bMV0sIGdsdGZOb2RlLnRyYW5zbGF0aW9uWzJdKTtcclxuICAgICAgICAgICAgICBub2RlLm10eExvY2FsLnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS5yb3RhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgICAgICAgIHJvdGF0aW9uLnNldChnbHRmTm9kZS5yb3RhdGlvblswXSwgZ2x0Zk5vZGUucm90YXRpb25bMV0sIGdsdGZOb2RlLnJvdGF0aW9uWzJdLCBnbHRmTm9kZS5yb3RhdGlvblszXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZ2x0Zk5vZGUuc2NhbGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzY2FsZTogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgICAgICAgICBzY2FsZS5zZXQoZ2x0Zk5vZGUuc2NhbGVbMF0sIGdsdGZOb2RlLnNjYWxlWzFdLCBnbHRmTm9kZS5zY2FsZVsyXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zY2FsaW5nID0gc2NhbGU7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgY2FtZXJhXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNhbWVyYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGF3YWl0IHRoaXMuZ2V0Q2FtZXJhQnlJbmRleChnbHRmTm9kZS5jYW1lcmEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBtZXNoIGFuZCBtYXRlcmlhbFxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tZXNoICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgZ2x0Zk1lc2g6IEdMVEYuTWVzaCA9IHRoaXMuI2dsdGYubWVzaGVzPy5bZ2x0Zk5vZGUubWVzaF07XHJcbiAgICAgICAgICAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gICAgICAgICAgY29uc3Qgc3ViQ29tcG9uZW50czogW0NvbXBvbmVudE1lc2gsIENvbXBvbmVudE1hdGVyaWFsXVtdID0gW107XHJcbiAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgZ2x0Zk1lc2gucHJpbWl0aXZlcy5sZW5ndGg7IGlQcmltaXRpdmUrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gbmV3IENvbXBvbmVudE1lc2goYXdhaXQgdGhpcy5nZXRNZXNoKGdsdGZOb2RlLm1lc2gsIGlQcmltaXRpdmUpKTtcclxuICAgICAgICAgICAgY29uc3QgaXNTa2luOiBib29sZWFuID0gZ2x0Zk5vZGUuc2tpbiAhPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNTa2luKVxyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChnbHRmTm9kZS5za2luKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWw7XHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gZ2x0Zk1lc2gucHJpbWl0aXZlcz8uW2lQcmltaXRpdmVdPy5tYXRlcmlhbDtcclxuICAgICAgICAgICAgaWYgKGlNYXRlcmlhbCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChpc1NraW4gP1xyXG4gICAgICAgICAgICAgICAgR0xURkxvYWRlci5kZWZhdWx0U2tpbk1hdGVyaWFsIDpcclxuICAgICAgICAgICAgICAgIEdMVEZMb2FkZXIuZGVmYXVsdE1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBpc0ZsYXQ6IGJvb2xlYW4gPSBnbHRmTWVzaC5wcmltaXRpdmVzW2lQcmltaXRpdmVdLmF0dHJpYnV0ZXMuTk9STUFMID09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChhd2FpdCB0aGlzLmdldE1hdGVyaWFsKGlNYXRlcmlhbCwgbnVsbCwgaXNTa2luLCBpc0ZsYXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogbWF5YmUgdGhpcyBzaG91bGQgYmUgYSBmdWRnZSBtYXRlcmlhbCBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgIGNvbnN0IGdsdGZNYXRlcmlhbDogR0xURi5NYXRlcmlhbCA9IHRoaXMuI2dsdGYubWF0ZXJpYWxzW2lNYXRlcmlhbF07XHJcbiAgICAgICAgICAgICAgaWYgKGdsdGZNYXRlcmlhbCkgXHJcbiAgICAgICAgICAgICAgICBjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgPSBnbHRmTWF0ZXJpYWwuYWxwaGFNb2RlID09IFwiQkxFTkRcIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3ViQ29tcG9uZW50cy5wdXNoKFtjbXBNZXNoLCBjbXBNYXRlcmlhbF0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChzdWJDb21wb25lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KHN1YkNvbXBvbmVudHNbMF1bMF0pO1xyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChzdWJDb21wb25lbnRzWzBdWzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YkNvbXBvbmVudHMuZm9yRWFjaCgoW19jbXBNZXNoLCBfY21wTWF0ZXJpYWxdLCBfaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVQYXJ0OiBOb2RlID0gbmV3IE5vZGUoYCR7bm9kZS5uYW1lfV9QcmltaXRpdmUke19pfWApO1xyXG4gICAgICAgICAgICAgIG5vZGVQYXJ0LmFkZENvbXBvbmVudChfY21wTWVzaCk7XHJcbiAgICAgICAgICAgICAgbm9kZVBhcnQuYWRkQ29tcG9uZW50KF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChub2RlUGFydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pTm9kZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB3aXRoIHRoZSBnaXZlbiBjYW1lcmEgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldENhbWVyYShfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRDYW1lcmE+IHtcclxuICAgICAgY29uc3QgaUNhbWVyYTogbnVtYmVyID0gdGhpcy4jZ2x0Zi5jYW1lcmFzLmZpbmRJbmRleChfY2FtZXJhID0+IF9jYW1lcmEubmFtZSA9PSBfbmFtZSk7XHJcbiAgICAgIGlmIChpQ2FtZXJhID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBjYW1lcmFzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDYW1lcmFCeUluZGV4KGlDYW1lcmEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudENhbWVyYX0gZm9yIHRoZSBnaXZlbiBjYW1lcmEgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFCeUluZGV4KF9pQ2FtZXJhOiBudW1iZXIpOiBQcm9taXNlPENvbXBvbmVudENhbWVyYT4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXMpXHJcbiAgICAgICAgdGhpcy4jY2FtZXJhcyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXNbX2lDYW1lcmFdKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZkNhbWVyYTogR0xURi5DYW1lcmEgPSB0aGlzLiNnbHRmLmNhbWVyYXNbX2lDYW1lcmFdO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZSlcclxuICAgICAgICAgIGNhbWVyYS5wcm9qZWN0Q2VudHJhbChcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS5hc3BlY3RSYXRpbyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS55Zm92ICogQ2FsYy5yYWQyZGVnLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpuZWFyLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpmYXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgY2FtZXJhLnByb2plY3RPcnRob2dyYXBoaWMoXHJcbiAgICAgICAgICAgIC1nbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICAtZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZ1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbWVyYTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jY2FtZXJhc1tfaUNhbWVyYV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQW5pbWF0aW9ufSB3aXRoIHRoZSBnaXZlbiBhbmltYXRpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5pbWF0aW9ufSBmb3IgdGhlIGdpdmVuIGFuaW1hdGlvbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfaUFuaW1hdGlvbjogbnVtYmVyKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgZ2xURiBmaWxlIGludG8gdGhlIGdpdmVuIHtAbGluayBBbmltYXRpb259LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb248VCBleHRlbmRzIEFuaW1hdGlvbj4oX2lBbmltYXRpb246IG51bWJlciB8IHN0cmluZywgX2FuaW1hdGlvbjogVCk6IFByb21pc2U8VD47XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QW5pbWF0aW9uKF9pQW5pbWF0aW9uOiBudW1iZXIgfCBzdHJpbmcsIF9hbmltYXRpb24/OiBBbmltYXRpb24pOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBfaUFuaW1hdGlvbiA9IHRoaXMuZ2V0SW5kZXgoX2lBbmltYXRpb24sIHRoaXMuI2dsdGYuYW5pbWF0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoX2lBbmltYXRpb24gPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7QW5pbWF0aW9uLm5hbWV9fCR7X2lBbmltYXRpb259YDtcclxuXHJcbiAgICAgIGlmICghX2FuaW1hdGlvbiAmJiB0aGlzLiNyZXNvdXJjZXNbaWRdKVxyXG4gICAgICAgIHJldHVybiA8QW5pbWF0aW9uPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmQW5pbWF0aW9uOiBHTFRGLkFuaW1hdGlvbiA9IHRoaXMuI2dsdGYuYW5pbWF0aW9ucz8uW19pQW5pbWF0aW9uXTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkFuaW1hdGlvbilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYW5pbWF0aW9uIHdpdGggaW5kZXggJHtfaUFuaW1hdGlvbn0uYCk7XHJcblxyXG4gICAgICBjb25zdCBhbmltYXRpb25TdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGNvbnN0IGdsdGZDaGFubmVsIG9mIGdsdGZBbmltYXRpb24uY2hhbm5lbHMpIHtcclxuICAgICAgICBjb25zdCBnbHRmTm9kZTogR0xURi5Ob2RlID0gdGhpcy4jZ2x0Zi5ub2Rlc1tnbHRmQ2hhbm5lbC50YXJnZXQubm9kZV07XHJcbiAgICAgICAgaWYgKCFnbHRmTm9kZSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZTogR2VuZXJhbCA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGlOb2RlIG9mIGdsdGZOb2RlLnBhdGgpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkTmFtZTogc3RyaW5nID0gdGhpcy4jZ2x0Zi5ub2Rlc1tpTm9kZV0ubmFtZTtcclxuICAgICAgICAgIC8vIG5vZGUuY2hpbGRyZW5bY2hpbGROYW1lXVxyXG4gICAgICAgICAgbm9kZSA9IChub2RlLmNoaWxkcmVuID8/PSB7fSlbY2hpbGROYW1lXSA/Pz0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub2RlLmNvbXBvbmVudHMuQ29tcG9uZW50VHJhbnNmb3JtWzBdLm10eExvY2FsXHJcbiAgICAgICAgbGV0IG10eExvY2FsOiBBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4NCA9IDxBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4ND4oKCgobm9kZS5jb21wb25lbnRzID8/PSB7fSkuQ29tcG9uZW50VHJhbnNmb3JtID8/PSBbXSlbMF0gPz89IHt9KS5tdHhMb2NhbCA/Pz0ge30pO1xyXG4gICAgICAgIG10eExvY2FsW3RvSW50ZXJuVHJhbnNmb3JtYXRpb25bZ2x0ZkNoYW5uZWwudGFyZ2V0LnBhdGhdXSA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKGdsdGZBbmltYXRpb24uc2FtcGxlcnNbZ2x0ZkNoYW5uZWwuc2FtcGxlcl0sIGdsdGZDaGFubmVsLnRhcmdldC5wYXRoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBfYW5pbWF0aW9uID8/IG5ldyBBbmltYXRpb25HTFRGKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUgPSBhbmltYXRpb25TdHJ1Y3R1cmU7XHJcbiAgICAgIGFuaW1hdGlvbi5jbGVhckNhY2hlKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5uYW1lID0gZ2x0ZkFuaW1hdGlvbi5uYW1lO1xyXG4gICAgICBhbmltYXRpb24uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRpb25HTFRGKVxyXG4gICAgICAgIGFuaW1hdGlvbi51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmICghX2FuaW1hdGlvbikge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihhbmltYXRpb24pO1xyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSBhbmltYXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgTWVzaEdMVEZ9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoKF9uYW1lOiBzdHJpbmcsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1lc2hHTFRGfSBmb3IgdGhlIGdpdmVuIG1lc2ggaW5kZXggYW5kIHByaW1pdGl2ZSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBtZXNoIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoPFQgZXh0ZW5kcyBNZXNoPihfaU1lc2g6IG51bWJlciB8IHN0cmluZywgX2lQcmltaXRpdmU6IG51bWJlciwgX21lc2g6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIgfCBzdHJpbmcsIF9pUHJpbWl0aXZlOiBudW1iZXIgPSAwLCBfbWVzaD86IE1lc2gpOiBQcm9taXNlPE1lc2g+IHtcclxuICAgICAgX2lNZXNoID0gdGhpcy5nZXRJbmRleChfaU1lc2gsIHRoaXMuI2dsdGYubWVzaGVzKTtcclxuXHJcbiAgICAgIGlmIChfaU1lc2ggPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7TWVzaEdMVEYubmFtZX18JHtfaU1lc2h9fCR7X2lQcmltaXRpdmV9YDtcclxuXHJcbiAgICAgIGlmICghX21lc2ggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE1lc2hHTFRGPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmTWVzaDogR0xURi5NZXNoID0gdGhpcy4jZ2x0Zi5tZXNoZXNbX2lNZXNoXTtcclxuICAgICAgY29uc3QgZ2x0ZlByaW1pdGl2ZTogR0xURi5NZXNoUHJpbWl0aXZlID0gZ2x0Zk1lc2gucHJpbWl0aXZlc1tfaVByaW1pdGl2ZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5pbmRpY2VzID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gaW5kaWNlcy4gRlVER0UgZG9lcyBub3Qgc3VwcG9ydCBub24taW5kZXhlZCBtZXNoZXMuYCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlBPU0lUSU9OID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gcG9zaXRpb24gYXR0cmlidXRlLiBQcmltaXRpdmUgd2lsbCBiZSBpZ25vcmVkLmApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUubW9kZSAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5tb2RlICE9IEdMVEYuTUVTSF9QUklNSVRJVkVfTU9ERS5UUklBTkdMRVMpXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIHRvcG9sb2d5IHR5cGUgbW9kZSAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVtnbHRmUHJpbWl0aXZlLm1vZGVdfS4gRlVER0Ugb25seSBzdXBwb3J0cyAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVs0XX0uYCk7XHJcblxyXG4gICAgICBjaGVja01heFN1cHBvcnQodGhpcywgXCJURVhDT09SRFwiLCAyKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiQ09MT1JcIiwgMSk7XHJcbiAgICAgIGNoZWNrTWF4U3VwcG9ydCh0aGlzLCBcIkpPSU5UU1wiLCAxKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiV0VJR0hUU1wiLCAxKTtcclxuXHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgICAgbGV0IG5vcm1hbHM6IEZsb2F0MzJBcnJheSwgdGFuZ2VudHM6IEZsb2F0MzJBcnJheTtcclxuICAgICAgbGV0IGNvbG9yczogRmxvYXQzMkFycmF5LCB0ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgIGxldCBib25lczogVWludDhBcnJheSwgd2VpZ2h0czogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuaW5kaWNlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpbmRpY2VzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhJbmRpY2VzKGdsdGZQcmltaXRpdmUuaW5kaWNlcyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXA6IG51bWJlciA9IGluZGljZXNbaSArIDJdO1xyXG4gICAgICAgICAgaW5kaWNlc1tpICsgMl0gPSBpbmRpY2VzW2kgKyAwXTtcclxuICAgICAgICAgIGluZGljZXNbaSArIDBdID0gaW5kaWNlc1tpICsgMV07XHJcbiAgICAgICAgICBpbmRpY2VzW2kgKyAxXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBubyBpbmRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1pbmRleGVkIG1lc2hlcy5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5QT1NJVElPTiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdmVydGljZXMgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuUE9TSVRJT04pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIG5vIHBvc2l0aW9uIGF0dHJpYnV0ZS4gUHJpbWl0aXZlIHdpbGwgYmUgaWdub3JlZC5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuTk9STUFMICE9IHVuZGVmaW5lZClcclxuICAgICAgICBub3JtYWxzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRhbmdlbnRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQpO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8xICE9IHVuZGVmaW5lZClcclxuICAgICAgICB0ZXh0dXJlVVZzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRFWENPT1JEXzEpO1xyXG4gICAgICBlbHNlIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGV4dHVyZVVWcyA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8wKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuQ09MT1JfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgY29sb3JzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhDb2xvcnMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib25lcyA9IGF3YWl0IHRoaXMuZ2V0Qm9uZUluZGljZXMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkpPSU5UU18wKTtcclxuICAgICAgICB3ZWlnaHRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1lc2g6IE1lc2ggPSBfbWVzaCA/PyBuZXcgTWVzaEdMVEYoKTtcclxuICAgICAgbWVzaC5uYW1lID0gZ2x0Zk1lc2gubmFtZTtcclxuICAgICAgaWYgKG1lc2ggaW5zdGFuY2VvZiBNZXNoR0xURikge1xyXG4gICAgICAgIG1lc2guaVByaW1pdGl2ZSA9IF9pUHJpbWl0aXZlO1xyXG4gICAgICAgIG1lc2gudXJsID0gdGhpcy4jdXJsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbWVzaCkge1xyXG4gICAgICAgIF9tZXNoLmNsZWFyKCk7XHJcbiAgICAgICAgX21lc2guZmFjZXMgPSBbXTtcclxuICAgICAgICBfbWVzaC52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQ3JlYXRlIG1lc2ggdmVydGljZXMgYW5kIGZhY2VzIHNvIHRoYXQgbm9ybWFscyBhbmQgdGFuZ2VudHMgY2FuIGJlIGNhbGN1bGF0ZWQgaWYgbWlzc2luZy4gSWYgdGhleSBhcmUgbm90IG1pc3NpbmcgdGhpcyBjb3VsZCBiZSBvbWl0dGVkLlxyXG4gICAgICBmb3IgKGxldCBpVmVjdG9yMjogbnVtYmVyID0gMCwgaVZlY3RvcjM6IG51bWJlciA9IDAsIGlWZWN0b3I0OiBudW1iZXIgPSAwOyBpVmVjdG9yMyA8IHZlcnRpY2VzPy5sZW5ndGg7IGlWZWN0b3IyICs9IDIsIGlWZWN0b3IzICs9IDMsIGlWZWN0b3I0ICs9IDQpIHtcclxuICAgICAgICBtZXNoLnZlcnRpY2VzLnB1c2goXHJcbiAgICAgICAgICBuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh2ZXJ0aWNlc1tpVmVjdG9yMyArIDBdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDFdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDJdKSxcclxuICAgICAgICAgICAgdGV4dHVyZVVWcyA/XHJcbiAgICAgICAgICAgICAgbmV3IFZlY3RvcjIodGV4dHVyZVVWc1tpVmVjdG9yMiArIDBdLCB0ZXh0dXJlVVZzW2lWZWN0b3IyICsgMV0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG5vcm1hbHMgP1xyXG4gICAgICAgICAgICAgIG5ldyBWZWN0b3IzKG5vcm1hbHNbaVZlY3RvcjMgKyAwXSwgbm9ybWFsc1tpVmVjdG9yMyArIDFdLCBub3JtYWxzW2lWZWN0b3IzICsgMl0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRhbmdlbnRzID9cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yNCh0YW5nZW50c1tpVmVjdG9yNCArIDBdLCB0YW5nZW50c1tpVmVjdG9yNCArIDFdLCB0YW5nZW50c1tpVmVjdG9yNCArIDJdLCB0YW5nZW50c1tpVmVjdG9yNCArIDNdKSA6XHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb2xvcnMgP1xyXG4gICAgICAgICAgICAgIG5ldyBDb2xvcihjb2xvcnNbaVZlY3RvcjQgKyAwXSwgY29sb3JzW2lWZWN0b3I0ICsgMV0sIGNvbG9yc1tpVmVjdG9yNCArIDJdLCBjb2xvcnNbaVZlY3RvcjQgKyAzXSkgOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYm9uZXMgJiYgd2VpZ2h0cyA/XHJcbiAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAwXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgMF0gfSxcclxuICAgICAgICAgICAgICAgIHsgaW5kZXg6IGJvbmVzW2lWZWN0b3I0ICsgMV0sIHdlaWdodDogd2VpZ2h0c1tpVmVjdG9yNCArIDFdIH0sXHJcbiAgICAgICAgICAgICAgICB7IGluZGV4OiBib25lc1tpVmVjdG9yNCArIDJdLCB3ZWlnaHQ6IHdlaWdodHNbaVZlY3RvcjQgKyAyXSB9LFxyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAzXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgM10gfVxyXG4gICAgICAgICAgICAgIF0gOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGlGYWNlVmVydGV4SW5kZXg6IG51bWJlciA9IDA7IGlGYWNlVmVydGV4SW5kZXggPCBpbmRpY2VzPy5sZW5ndGg7IGlGYWNlVmVydGV4SW5kZXggKz0gMykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtZXNoLmZhY2VzLnB1c2gobmV3IEZhY2UoXHJcbiAgICAgICAgICAgIG1lc2gudmVydGljZXMsXHJcbiAgICAgICAgICAgIGluZGljZXNbaUZhY2VWZXJ0ZXhJbmRleCArIDBdLFxyXG4gICAgICAgICAgICBpbmRpY2VzW2lGYWNlVmVydGV4SW5kZXggKyAxXSxcclxuICAgICAgICAgICAgaW5kaWNlc1tpRmFjZVZlcnRleEluZGV4ICsgMl1cclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIG1lc2gucmVuZGVyTWVzaC5pbmRpY2VzID0gaW5kaWNlcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLm5vcm1hbHMgPSBub3JtYWxzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2gudGFuZ2VudHMgPSB0YW5nZW50cztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnRleHR1cmVVVnMgPSB0ZXh0dXJlVVZzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guY29sb3JzID0gY29sb3JzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guYm9uZXMgPSBib25lcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLndlaWdodHMgPSB3ZWlnaHRzO1xyXG5cclxuICAgICAgaWYgKCFfbWVzaCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgICAvLyBtZXNoLmlkUmVzb3VyY2UgPSBpZDtcclxuICAgICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gbWVzaDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1lc2g7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjaGVja01heFN1cHBvcnQoX2xvYWRlcjogR0xURkxvYWRlciwgX2NoZWNrOiBzdHJpbmcsIF9tYXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMpLmZpbHRlcigoX2tleTogc3RyaW5nKSA9PiBfa2V5LnN0YXJ0c1dpdGgoX2NoZWNrKSkubGVuZ3RoID4gX21heClcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7X2xvYWRlcn06IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBtb3JlIHRoYW4gJHtfbWF4fSBzZXRzIG9mICcke19jaGVja30nIGFzc29jaWF0ZWQgd2l0aCBpdC4gRlVHREUgb25seSBzdXBwb3J0cyB1cCB0byAke19tYXh9ICR7X2NoZWNrfSBzZXRzIHBlciBwcmltaXRpdmUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBNYXRlcmlhbEdMVEZ9IHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbChfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNYXRlcmlhbD47XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNYXRlcmlhbH0gZm9yIHRoZSBnaXZlbiBtYXRlcmlhbCBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlcik6IFByb21pc2U8TWF0ZXJpYWw+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG1hdGVyaWFsIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWF0ZXJpYWx9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbDxUIGV4dGVuZHMgTWF0ZXJpYWw+KF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogVCwgX3NraW4/OiBib29sZWFuLCBfZmxhdD86IGJvb2xlYW4pOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogTWF0ZXJpYWwsIF9za2luOiBib29sZWFuID0gZmFsc2UsIF9mbGF0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIF9pTWF0ZXJpYWwgPSB0aGlzLmdldEluZGV4KF9pTWF0ZXJpYWwsIHRoaXMuI2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfaU1hdGVyaWFsID09IC0xKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGAke01hdGVyaWFsLm5hbWV9fCR7X2lNYXRlcmlhbH1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0gJiYgIV9tYXRlcmlhbClcclxuICAgICAgICByZXR1cm4gPE1hdGVyaWFsPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBzaGFkZXIgYmFzZWQgb24gdGhlIGdsVEYgbWF0ZXJpYWwgcHJvcGVydGllc1xyXG4gICAgICBjb25zdCBnbHRmTWF0ZXJpYWw6IEdMVEYuTWF0ZXJpYWwgPSB0aGlzLiNnbHRmLm1hdGVyaWFsc1tfaU1hdGVyaWFsXTtcclxuXHJcbiAgICAgIGlmICghZ2x0Zk1hdGVyaWFsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBtYXRlcmlhbCB3aXRoIGluZGV4ICR7X2lNYXRlcmlhbH0uYCk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgZ2xURiBtYXRlcmlhbCBwcm9wZXJ0aWVzOiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjcmVmZXJlbmNlLW1hdGVyaWFsXHJcbiAgICAgIC8vIGUuZy4gb2NjbHVzaW9uIGFuZCBlbWlzc2l2ZSB0ZXh0dXJlczsgZG91YmxlU2lkZWRcclxuICAgICAgY29uc3QgZ2x0ZkJhc2VDb2xvckZhY3RvcjogbnVtYmVyW10gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LmJhc2VDb2xvckZhY3RvciA/PyBbMSwgMSwgMSwgMV07XHJcbiAgICAgIGNvbnN0IGdsdGZNZXRhbGxpY0ZhY3RvcjogbnVtYmVyID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5tZXRhbGxpY0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmUm91Z2huZXNzRmFjdG9yOiBudW1iZXIgPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LnJvdWdobmVzc0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmRW1pc3NpdmVGYWN0b3I6IG51bWJlcltdID0gZ2x0Zk1hdGVyaWFsLmVtaXNzaXZlRmFjdG9yID8/IFswLCAwLCAwXTtcclxuXHJcbiAgICAgIGNvbnN0IGdsdGZCYXNlQ29sb3JUZXh0dXJlOiBHTFRGLlRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5iYXNlQ29sb3JUZXh0dXJlO1xyXG4gICAgICBjb25zdCBnbHRmTm9ybWFsVGV4dHVyZTogR0xURi5NYXRlcmlhbE5vcm1hbFRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLm5vcm1hbFRleHR1cmU7XHJcblxyXG4gICAgICAvLyBUaGUgZGlmZnVzZSBjb250cmlidXRpb24gaW4gdGhlIFBob25nIHNoYWRpbmcgbW9kZWwuIFJlcHJlc2VudHMgaG93IG11Y2ggbGlnaHQgaXMgc2NhdHRlcmVkIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zIGR1ZSB0byB0aGUgbWF0ZXJpYWwncyBzdXJmYWNlIHByb3BlcnRpZXMuXHJcbiAgICAgIGNvbnN0IGRpZmZ1c2U6IG51bWJlciA9IDE7XHJcbiAgICAgIC8vIFRoZSBzaGluaW5lc3Mgb2YgdGhlIG1hdGVyaWFsLiBJbmZsdWVuY2VzIHRoZSBzaGFycG5lc3Mgb3IgYnJvYWRuZXNzIG9mIHRoZSBzcGVjdWxhciBoaWdobGlnaHQuIEhpZ2hlciBzcGVjdWxhciB2YWx1ZXMgcmVzdWx0IGluIGEgc2hhcnBlciBhbmQgbW9yZSBjb25jZW50cmF0ZWQgc3BlY3VsYXIgaGlnaGxpZ2h0LlxyXG4gICAgICBjb25zdCBzcGVjdWxhcjogbnVtYmVyID0gMS44ICogKDEgLSBnbHRmUm91Z2huZXNzRmFjdG9yKSArIDAuNiAqIGdsdGZNZXRhbGxpY0ZhY3RvcjtcclxuICAgICAgLy8gVGhlIHN0cmVuZ3RoL2ludGVuc2l0eSBvZiB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvblxyXG4gICAgICBjb25zdCBpbnRlbnNpdHk6IG51bWJlciA9IDAuNyAqICgxIC0gZ2x0ZlJvdWdobmVzc0ZhY3RvcikgKyBnbHRmTWV0YWxsaWNGYWN0b3I7XHJcbiAgICAgIC8vIEluZmx1ZW5jZXMgaG93IG11Y2ggdGhlIG1hdGVyaWFsJ3MgY29sb3IgYWZmZWN0cyB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvbi4gV2hlbiBtZXRhbGxpYyBpcyBoaWdoZXIsIHRoZSBzcGVjdWxhciByZWZsZWN0aW9uIHRha2VzIG9uIHRoZSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGNyZWF0aW5nIGEgbWV0YWxsaWMgYXBwZWFyYW5jZS4gUmFuZ2UgZnJvbSAwLjAgdG8gMS4wLlxyXG4gICAgICBjb25zdCBtZXRhbGxpYzogbnVtYmVyID0gZ2x0Zk1ldGFsbGljRmFjdG9yO1xyXG5cclxuICAgICAgY29uc3QgaXNMaXQ6IGJvb2xlYW4gPSBnbHRmRW1pc3NpdmVGYWN0b3JbMF0gPiAwIHx8IGdsdGZFbWlzc2l2ZUZhY3RvclsxXSA+IDAgfHwgZ2x0ZkVtaXNzaXZlRmFjdG9yWzJdID4gMDtcclxuICAgICAgY29uc3QgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKC4uLmdsdGZCYXNlQ29sb3JGYWN0b3IpO1xyXG4gICAgICBpZiAoaXNMaXQpXHJcbiAgICAgICAgY29sb3IuYWRkKG5ldyBDb2xvciguLi5nbHRmRW1pc3NpdmVGYWN0b3IsIDApKTtcclxuICAgICAgY29uc3QgY29hdDogQ29hdCA9IGdsdGZCYXNlQ29sb3JUZXh0dXJlID9cclxuICAgICAgICBpc0xpdCA/IG5ldyBDb2F0VGV4dHVyZWQoY29sb3IsIGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmQmFzZUNvbG9yVGV4dHVyZS5pbmRleCkpIDpcclxuICAgICAgICAgIGdsdGZOb3JtYWxUZXh0dXJlID9cclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHMoY29sb3IsIGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmQmFzZUNvbG9yVGV4dHVyZS5pbmRleCksIGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmTm9ybWFsVGV4dHVyZS5pbmRleCksIGRpZmZ1c2UsIHNwZWN1bGFyLCBpbnRlbnNpdHksIG1ldGFsbGljKSA6XHJcbiAgICAgICAgICAgIG5ldyBDb2F0UmVtaXNzaXZlVGV4dHVyZWQoY29sb3IsIGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmQmFzZUNvbG9yVGV4dHVyZS5pbmRleCksIGRpZmZ1c2UsIHNwZWN1bGFyLCBpbnRlbnNpdHksIG1ldGFsbGljKSA6XHJcbiAgICAgICAgaXNMaXQgPyBuZXcgQ29hdENvbG9yZWQoY29sb3IpIDogbmV3IENvYXRSZW1pc3NpdmUoY29sb3IsIGRpZmZ1c2UsIHNwZWN1bGFyLCBpbnRlbnNpdHksIG1ldGFsbGljKTtcclxuXHJcbiAgICAgIGxldCBzaGFkZXI6IHR5cGVvZiBTaGFkZXI7XHJcbiAgICAgIGlmIChfZmxhdCkgeyAvLyBUT0RPOiBtYWtlIGZsYXQgYSBmbGFnIGluIHRoZSBtYXRlcmlhbCBzbyB0aGF0IHdlIGNhbiBoYXZlIGZsYXQgbWVzaCB3aXRoIHBob25nIHNoYWRpbmcgZ3JhZGllbnRzXHJcbiAgICAgICAgc2hhZGVyID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyRmxhdFRleHR1cmVkU2tpbiA6IFNoYWRlckZsYXRUZXh0dXJlZCkgOlxyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyRmxhdFNraW4gOiBTaGFkZXJGbGF0KTtcclxuICAgICAgfSBlbHNlIGlmIChpc0xpdCkge1xyXG4gICAgICAgIHNoYWRlciA9IGdsdGZCYXNlQ29sb3JUZXh0dXJlID9cclxuICAgICAgICAgIChfc2tpbiA/IFNoYWRlckxpdFRleHR1cmVkU2tpbiA6IFNoYWRlckxpdFRleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJMaXRTa2luIDogU2hhZGVyTGl0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzaGFkZXIgPSBnbHRmQmFzZUNvbG9yVGV4dHVyZSA/XHJcbiAgICAgICAgICBnbHRmTm9ybWFsVGV4dHVyZSA/XHJcbiAgICAgICAgICAgIChfc2tpbiA/IFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbiA6IFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzKSA6XHJcbiAgICAgICAgICAgIChfc2tpbiA/IFNoYWRlclBob25nVGV4dHVyZWRTa2luIDogU2hhZGVyUGhvbmdUZXh0dXJlZCkgOlxyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdTa2luIDogU2hhZGVyUGhvbmcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtYXRlcmlhbDogTWF0ZXJpYWwgPSBfbWF0ZXJpYWwgPz8gbmV3IE1hdGVyaWFsR0xURihnbHRmTWF0ZXJpYWwubmFtZSk7XHJcbiAgICAgIG1hdGVyaWFsLm5hbWUgPSBnbHRmTWF0ZXJpYWwubmFtZTtcclxuICAgICAgbWF0ZXJpYWwuY29hdCA9IGNvYXQ7XHJcbiAgICAgIGlmIChnbHRmTWF0ZXJpYWwuYWxwaGFDdXRvZmYgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIG1hdGVyaWFsLmFscGhhQ2xpcCA9IGdsdGZNYXRlcmlhbC5hbHBoYUN1dG9mZjtcclxuICAgICAgUmVmbGVjdC5zZXQobWF0ZXJpYWwsIFwic2hhZGVyVHlwZVwiLCBzaGFkZXIpO1xyXG4gICAgICAvLyBtYXRlcmlhbC5zZXRTaGFkZXIoc2hhZGVyKTtcclxuICAgICAgaWYgKG1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWxHTFRGKVxyXG4gICAgICAgIG1hdGVyaWFsLnVybCA9IHRoaXMuI3VybDtcclxuXHJcbiAgICAgIGlmICghX21hdGVyaWFsKSB7XHJcbiAgICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKG1hdGVyaWFsKTtcclxuICAgICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gbWF0ZXJpYWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBtYXRlcmlhbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUZXh0dXJlfSBmb3IgdGhlIGdpdmVuIHRleHR1cmUgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXh0dXJlKF9pVGV4dHVyZTogbnVtYmVyKTogUHJvbWlzZTxUZXh0dXJlPiB7XHJcbiAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBgJHtUZXh0dXJlLm5hbWV9fCR7X2lUZXh0dXJlfWA7XHJcblxyXG4gICAgICBpZiAodGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPFRleHR1cmU+dGhpcy4jcmVzb3VyY2VzW2lkXTtcclxuXHJcbiAgICAgIGNvbnN0IGdsdGZUZXh0dXJlOiBHTFRGLlRleHR1cmUgPSB0aGlzLiNnbHRmLnRleHR1cmVzW19pVGV4dHVyZV07XHJcbiAgICAgIGNvbnN0IGdsdGZTYW1wbGVyOiBHTFRGLlNhbXBsZXIgPSB0aGlzLiNnbHRmLnNhbXBsZXJzPy5bZ2x0ZlRleHR1cmUuc2FtcGxlcl07XHJcbiAgICAgIGNvbnN0IGdsdGZJbWFnZTogR0xURi5JbWFnZSA9IHRoaXMuI2dsdGYuaW1hZ2VzPy5bZ2x0ZlRleHR1cmUuc291cmNlXTtcclxuXHJcbiAgICAgIGlmIChnbHRmSW1hZ2UgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogVGV4dHVyZSB3aXRoIGluZGV4ICR7X2lUZXh0dXJlfSBoYXMgbm8gaW1hZ2UuYCk7XHJcbiAgICAgICAgcmV0dXJuIFRleHR1cmVEZWZhdWx0LmNvbG9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSBuZXcgVVJMKGdsdGZJbWFnZS51cmksIG5ldyBVUkwodGhpcy4jdXJsLCBQcm9qZWN0LmJhc2VVUkwpKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgaWYgKCFnbHRmSW1hZ2UudXJpICYmIGdsdGZJbWFnZS5idWZmZXJWaWV3KSB7XHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBkdXBsaWNhdGUgY29kZSBmcm9tIGdldEJ1ZmZlckRhdGEsIG1heWJlIHJlZmFjdG9yIGdldEJ1ZmZlckRhdGEgdG8gaGFuZGxlIGJ1ZmZlclZpZXdJbmRleCBpbnB1dFxyXG4gICAgICAgIGNvbnN0IGdsdGZCdWZmZXJWaWV3OiBHTFRGLkJ1ZmZlclZpZXcgPSB0aGlzLiNnbHRmLmJ1ZmZlclZpZXdzW2dsdGZJbWFnZS5idWZmZXJWaWV3XTtcclxuXHJcbiAgICAgICAgY29uc3QgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyKGdsdGZCdWZmZXJWaWV3LmJ1ZmZlcik7XHJcbiAgICAgICAgY29uc3QgYnl0ZU9mZnNldDogbnVtYmVyID0gZ2x0ZkJ1ZmZlclZpZXcuYnl0ZU9mZnNldCB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGg6IG51bWJlciA9IGdsdGZCdWZmZXJWaWV3LmJ5dGVMZW5ndGggfHwgMDtcclxuXHJcbiAgICAgICAgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihcclxuICAgICAgICAgIFtuZXcgVWludDhBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggLyBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKV0sXHJcbiAgICAgICAgICB7IHR5cGU6IGdsdGZJbWFnZS5taW1lVHlwZSB9XHJcbiAgICAgICAgKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHRleHR1cmU6IFRleHR1cmVJbWFnZSA9IG5ldyBUZXh0dXJlSW1hZ2UoKTtcclxuICAgICAgYXdhaXQgdGV4dHVyZS5sb2FkKHVybCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlNhbXBsZXIpIHtcclxuICAgICAgICBnbHRmU2FtcGxlci5tYWdGaWx0ZXIgPSBnbHRmU2FtcGxlci5tYWdGaWx0ZXIgPz8gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUOyAvLyBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID0gZ2x0ZlNhbXBsZXIubWluRmlsdGVyID8/IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG5cclxuICAgICAgICBpZiAoZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCAmJiBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUKVxyXG4gICAgICAgICAgdGV4dHVyZS5taXBtYXAgPSBNSVBNQVAuQ1JJU1A7XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCAmJiBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUX01JUE1BUF9MSU5FQVIpXHJcbiAgICAgICAgICB0ZXh0dXJlLm1pcG1hcCA9IE1JUE1BUC5NRURJVU07XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSICYmIGdsdGZTYW1wbGVyLm1pbkZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUl9NSVBNQVBfTElORUFSKVxyXG4gICAgICAgICAgdGV4dHVyZS5taXBtYXAgPSBNSVBNQVAuQkxVUlJZO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IFRleHR1cmUgd2l0aCBpbmRleCAke19pVGV4dHVyZX0gaGFzIGEgbWFnRmlsdGVyIGFuZCBtaW5GaWx0ZXIgb2YgJyR7Z2V0V2ViR0xQYXJhbWV0ZXJOYW1lKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlcil9JyBhbmQgJyR7Z2V0V2ViR0xQYXJhbWV0ZXJOYW1lKGdsdGZTYW1wbGVyLm1pbkZpbHRlcil9JyByZXNwZWN0aXZlbHkuIEZVREdFIG9ubHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnM6IE5FQVJFU1QgYW5kIE5FQVJFU1QgfCBORUFSRVNUIGFuZCBORUFSRVNUX01JUE1BUF9MSU5FQVIgfCBMSU5FQVIgYW5kIExJTkVBUl9NSVBNQVBfTElORUFSLmApO1xyXG5cclxuICAgICAgICBnbHRmU2FtcGxlci53cmFwUyA9IGdsdGZTYW1wbGVyLndyYXBTID8/IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUOyAvLyBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIud3JhcFQgPSBnbHRmU2FtcGxlci53cmFwVCA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG5cclxuICAgICAgICBpZiAoZ2x0ZlNhbXBsZXIud3JhcFMgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQgJiYgZ2x0ZlNhbXBsZXIud3JhcFQgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQpXHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXAgPSBXUkFQLlJFUEVBVDtcclxuICAgICAgICBlbHNlIGlmIChnbHRmU2FtcGxlci53cmFwUyA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UgJiYgZ2x0ZlNhbXBsZXIud3JhcFQgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKVxyXG4gICAgICAgICAgdGV4dHVyZS53cmFwID0gV1JBUC5DTEFNUDtcclxuICAgICAgICBlbHNlIGlmIChnbHRmU2FtcGxlci53cmFwUyA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVCAmJiBnbHRmU2FtcGxlci53cmFwVCA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVClcclxuICAgICAgICAgIHRleHR1cmUud3JhcCA9IFdSQVAuTUlSUk9SO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IFRleHR1cmUgd2l0aCBpbmRleCAke19pVGV4dHVyZX0gaGFzIGEgd3JhcFMgYW5kIHdyYXBUIG9mICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci53cmFwUyl9JyBhbmQgJyR7Z2V0V2ViR0xQYXJhbWV0ZXJOYW1lKGdsdGZTYW1wbGVyLndyYXBUKX0nIHJlc3BlY3RpdmVseS4gRlVER0Ugb25seSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbWJpbmF0aW9uczogUkVQRUFUIGFuZCBSRVBFQVQgfCBDTEFNUF9UT19FREdFIGFuZCBDTEFNUF9UT19FREdFIHwgTUlSUk9SRURfUkVQRUFUIGFuZCBNSVJST1JFRF9SRVBFQVQuYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFByb2plY3QuZGVyZWdpc3Rlcih0ZXh0dXJlKTtcclxuICAgICAgdGhpcy4jcmVzb3VyY2VzW2lkXSA9IHRleHR1cmU7XHJcblxyXG4gICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIENvbXBvbmVudFNrZWxldG9ufSB3aXRoIHRoZSBnaXZlbiBza2VsZXRvbiBuYW1lLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRTa2VsZXRvbihfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRTa2VsZXRvbj4ge1xyXG4gICAgICBjb25zdCBpU2tlbGV0b246IG51bWJlciA9IHRoaXMuI2dsdGYuc2tpbnMuZmluZEluZGV4KF9za2VsZXRvbiA9PiBfc2tlbGV0b24ubmFtZSA9PSBfbmFtZSk7XHJcbiAgICAgIGlmIChpU2tlbGV0b24gPT0gLTEpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWV9JyBpbiBnbFRGIHNraW5zLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRTa2VsZXRvbkJ5SW5kZXgoaVNrZWxldG9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gZm9yIHRoZSBnaXZlbiBza2VsZXRvbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldFNrZWxldG9uQnlJbmRleChfaVNrZWxldG9uOiBudW1iZXIpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9ucyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI3NrZWxldG9uc1tfaVNrZWxldG9uXSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZTa2luOiBHTFRGLlNraW4gPSB0aGlzLiNnbHRmLnNraW5zW19pU2tlbGV0b25dO1xyXG4gICAgICAgIGNvbnN0IGJvbmVzOiBOb2RlW10gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gY29udmVydCBmbG9hdCBhcnJheSB0byBhcnJheSBvZiBtYXRyaWNlcyBhbmQgcmVnaXN0ZXIgYm9uZXNcclxuICAgICAgICBsZXQgbXR4RGF0YTogRmxvYXQzMkFycmF5O1xyXG4gICAgICAgIGlmIChnbHRmU2tpbi5pbnZlcnNlQmluZE1hdHJpY2VzICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgIG10eERhdGEgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShnbHRmU2tpbi5pbnZlcnNlQmluZE1hdHJpY2VzKTtcclxuICAgICAgICBjb25zdCBtdHhEYXRhU3BhbjogbnVtYmVyID0gMTY7IC8vIHNpemUgb2YgbWF0cml4XHJcblxyXG4gICAgICAgIGNvbnN0IG10eEJpbmRJbnZlcnNlczogTWF0cml4NHg0W10gPSBbXTtcclxuICAgICAgICAvLyBpdGVyYXRlIG92ZXIgam9pbnRzIGFuZCBnZXQgY29ycmVzcG9uZGluZyBtYXRyaXggZnJvbSBmbG9hdCBhcnJheVxyXG4gICAgICAgIGZvciAobGV0IGlCb25lOiBudW1iZXIgPSAwOyBpQm9uZSA8IGdsdGZTa2luLmpvaW50cy5sZW5ndGg7IGlCb25lKyspIHtcclxuICAgICAgICAgIGxldCBtdHhCaW5kSW52ZXJzZTogTWF0cml4NHg0O1xyXG4gICAgICAgICAgaWYgKG10eERhdGEpIHtcclxuICAgICAgICAgICAgbXR4QmluZEludmVyc2UgPSBuZXcgTWF0cml4NHg0KCk7XHJcbiAgICAgICAgICAgIG10eEJpbmRJbnZlcnNlLnNldChtdHhEYXRhLnN1YmFycmF5KGlCb25lICogbXR4RGF0YVNwYW4sIGlCb25lICogbXR4RGF0YVNwYW4gKyBtdHhEYXRhU3BhbikpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGJvbmVzLnB1c2goYXdhaXQgdGhpcy5nZXROb2RlQnlJbmRleChnbHRmU2tpbi5qb2ludHNbaUJvbmVdKSk7XHJcbiAgICAgICAgICBtdHhCaW5kSW52ZXJzZXMucHVzaChtdHhCaW5kSW52ZXJzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNza2VsZXRvbnNbX2lTa2VsZXRvbl0gPSBuZXcgQ29tcG9uZW50U2tlbGV0b24oYm9uZXMsIG10eEJpbmRJbnZlcnNlcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNza2VsZXRvbnNbX2lTa2VsZXRvbl07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHt0aGlzLiN1cmx9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEluZGV4KF9uYW1lT3JJbmRleDogc3RyaW5nIHwgbnVtYmVyLCBfYXJyYXk6IHsgbmFtZT86IHN0cmluZyB9W10pOiBudW1iZXIge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9XHJcbiAgICAgICAgdHlwZW9mIF9uYW1lT3JJbmRleCA9PSBcIm51bWJlclwiID9cclxuICAgICAgICAgIF9uYW1lT3JJbmRleCA6XHJcbiAgICAgICAgICBfYXJyYXkuZmluZEluZGV4KF9vYmplY3QgPT4gX29iamVjdC5uYW1lID09IF9uYW1lT3JJbmRleCk7XHJcbiAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgIGxldCBhcnJheU5hbWU6IHN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuI2dsdGYpLmZpbmQoKFtfa2V5LCBfdmFsdWVdKSA9PiBfdmFsdWUgPT0gX2FycmF5KT8uWzBdO1xyXG4gICAgICAgIERlYnVnLmVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWVPckluZGV4fScgaW4gZ2xURiAke2FycmF5TmFtZX0uYCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBVaW50OEFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0Qm9uZUluZGljZXMoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3IpO1xyXG4gICAgICBjb25zdCBjb21wb25lbnRUeXBlOiBHTFRGLkNPTVBPTkVOVF9UWVBFID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl0/LmNvbXBvbmVudFR5cGU7XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEUpXHJcbiAgICAgICAgcmV0dXJuIGFycmF5IGFzIFVpbnQ4QXJyYXk7XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUKSB7XHJcbiAgICAgICAgRGVidWcubG9nKGAke3RoaXN9OiBCb25lIGluZGljZXMgYXJlIHN0b3JlZCBhcyAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlRdfScuIEZVREdFIHdpbGwgY29udmVydCB0aGVtIHRvICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFXX0nLiBGVURHRSBvbmx5IHN1cHBvcnRzIHNrZWxldG9ucyB3aXRoIHVwIHRvIDI1NiBib25lcywgc28gbWFrZSBzdXJlIHlvdXIgc2tlbGV0b24gaGFzIG5vIG1vcmUgdGhhbiAyNTYgYm9uZXMuYCk7XHJcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhcnJheSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogSW52YWxpZCBjb21wb25lbnQgdHlwZSAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW2NvbXBvbmVudFR5cGVdfScgZm9yIGJvbmUgaW5kaWNlcy4gRXhwZWN0ZWQgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEVdfScgb3IgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUXX0nLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBGbG9hdDMyQXJyYXl9IGZvciB0aGUgZ2l2ZW4gYWNjZXNzb3IgaW5kZXguXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRGbG9hdDMyQXJyYXkoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcclxuICAgICAgY29uc3QgYXJyYXk6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckRhdGEoX2lBY2Nlc3Nvcik7XHJcbiAgICAgIGNvbnN0IGdsdGZBY2Nlc3NvcjogR0xURi5BY2Nlc3NvciA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuRkxPQVQpXHJcbiAgICAgICAgcmV0dXJuIGFycmF5IGFzIEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3Iubm9ybWFsaXplZCkge1xyXG4gICAgICAgIHN3aXRjaCAoZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgR0xURi5DT01QT05FTlRfVFlQRS5CWVRFOlxyXG4gICAgICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXksIF92YWx1ZSA9PiBNYXRoLm1heChfdmFsdWUgLyAxMjcsIC0xKSk7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURTpcclxuICAgICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5LCBfdmFsdWUgPT4gX3ZhbHVlIC8gMjU1KTtcclxuICAgICAgICAgIGNhc2UgR0xURi5DT01QT05FTlRfVFlQRS5TSE9SVDpcclxuICAgICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5LCBfdmFsdWUgPT4gTWF0aC5tYXgoX3ZhbHVlIC8gMzI3NjcsIC0xKSk7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlQ6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IF92YWx1ZSAvIDY1NTM1KTtcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogSW52YWxpZCBjb21wb25lbnQgdHlwZSAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW2dsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlXX0nIGZvciBub3JtYWxpemVkIGFjY2Vzc29yLmApO1xyXG4gICAgICAgICAgLy8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI19hY2Nlc3Nvcl9ub3JtYWxpemVkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBFeHBlY3RlZCBjb21wb25lbnQgdHlwZSAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuRkxPQVRdfScgYnV0IHdhcyAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW2dsdGZBY2Nlc3Nvcj8uY29tcG9uZW50VHlwZV19Jy5gKTtcclxuICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgVWludDE2QXJyYXl9IGZvciB0aGUgZ2l2ZW4gYWNjZXNzb3IgaW5kZXguIE9ubHkgdXNlZCB0byBnZXQgdGhlIHZlcnRleCBpbmRpY2VzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0VmVydGV4SW5kaWNlcyhfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPFVpbnQxNkFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3IpO1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUKVxyXG4gICAgICAgIHJldHVybiBhcnJheSBhcyBVaW50MTZBcnJheTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY291bnQgPiA2NTUzNSAmJiBnbHRmQWNjZXNzb3IudHlwZSA9PSBcIlNDQUxBUlwiKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogRmlsZSBpbmNsdWRlcyBhIG1lc2ggd2l0aCBtb3JlIHRoYW4gNjU1MzUgdmVydGljZXMuIEZVREdFIGRvZXMgbm90IHN1cHBvcnQgbWVzaGVzIHdpdGggbW9yZSB0aGFuIDY1NTM1IHZlcnRpY2VzLmApO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09IEdMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSB8fCBnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0lOVClcclxuICAgICAgICByZXR1cm4gVWludDE2QXJyYXkuZnJvbShhcnJheSk7XHJcblxyXG4gICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBFeHBlY3RlZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbXBvbmVudCB0eXBlIGJ1dCB3YXMgJyR7R0xURi5DT01QT05FTlRfVFlQRVt0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXT8uY29tcG9uZW50VHlwZV19Jy5gKTtcclxuICAgICAgcmV0dXJuIFVpbnQxNkFycmF5LmZyb20oYXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEge0BsaW5rIEZsb2F0MzJBcnJheX0gZm9yIHRoZSBnaXZlbiBhY2Nlc3NvciBpbmRleC4gVGhlIGFycmF5IGNvbnRhaW5zIHRoZSB2ZXJ0ZXggY29sb3JzIGluIFJHQkEgZm9ybWF0LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0VmVydGV4Q29sb3JzKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBGbG9hdDMyQXJyYXkgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgZ2x0ZkFjY2Vzc29yOiBHTFRGLkFjY2Vzc29yID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLnR5cGUgPT0gR0xURi5BQ0NFU1NPUl9UWVBFLlZFQzMpIHtcclxuICAgICAgICBjb25zdCByZ2JhQXJyYXk6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyYXkubGVuZ3RoICogNCAvIDMpO1xyXG4gICAgICAgIGZvciAobGV0IGlWZWMzOiBudW1iZXIgPSAwLCBpVmVjNDogbnVtYmVyID0gMDsgaVZlYzMgPCBhcnJheS5sZW5ndGg7IGlWZWMzICs9IDMsIGlWZWM0ICs9IDQpIHtcclxuICAgICAgICAgIHJnYmFBcnJheVtpVmVjNF0gPSBhcnJheVtpVmVjM107XHJcbiAgICAgICAgICByZ2JhQXJyYXlbaVZlYzQgKyAxXSA9IGFycmF5W2lWZWMzICsgMV07XHJcbiAgICAgICAgICByZ2JhQXJyYXlbaVZlYzQgKyAyXSA9IGFycmF5W2lWZWMzICsgMl07XHJcbiAgICAgICAgICByZ2JhQXJyYXlbaVZlYzQgKyAzXSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZ2JhQXJyYXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1ZmZlckRhdGEoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxUeXBlZEFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGdsdGZBY2Nlc3NvcjogR0xURi5BY2Nlc3NvciA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdO1xyXG4gICAgICBpZiAoIWdsdGZBY2Nlc3NvcilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYWNjZXNzb3Igd2l0aCBpbmRleCAke19pQWNjZXNzb3J9LmApO1xyXG5cclxuICAgICAgbGV0IGFycmF5OiBUeXBlZEFycmF5O1xyXG4gICAgICBjb25zdCBjb21wb25lbnRUeXBlOiBHTFRGLkNPTVBPTkVOVF9UWVBFID0gZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGU7XHJcbiAgICAgIGNvbnN0IGFjY2Vzc29yVHlwZTogR0xURi5BQ0NFU1NPUl9UWVBFID0gZ2x0ZkFjY2Vzc29yLnR5cGU7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmJ1ZmZlclZpZXcgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIGFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJWaWV3RGF0YSh0aGlzLiNnbHRmLmJ1ZmZlclZpZXdzW2dsdGZBY2Nlc3Nvci5idWZmZXJWaWV3XSwgZ2x0ZkFjY2Vzc29yLmJ5dGVPZmZzZXQsIGNvbXBvbmVudFR5cGUsIGFjY2Vzc29yVHlwZSk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLnNwYXJzZSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZCdWZmZXJWaWV3SW5kaWNlczogR0xURi5CdWZmZXJWaWV3ID0gdGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmQWNjZXNzb3Iuc3BhcnNlLmluZGljZXMuYnVmZmVyVmlld107XHJcbiAgICAgICAgY29uc3QgZ2x0ZkJ1ZmZlclZpZXdWYWx1ZXM6IEdMVEYuQnVmZmVyVmlldyA9IHRoaXMuI2dsdGYuYnVmZmVyVmlld3NbZ2x0ZkFjY2Vzc29yLnNwYXJzZS52YWx1ZXMuYnVmZmVyVmlld107XHJcblxyXG4gICAgICAgIGlmICghZ2x0ZkJ1ZmZlclZpZXdJbmRpY2VzIHx8ICFnbHRmQnVmZmVyVmlld1ZhbHVlcylcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBidWZmZXIgdmlld3MgZm9yIHNwYXJzZSBpbmRpY2VzIG9yIHZhbHVlcyBvZiBhY2Nlc3NvciB3aXRoIGluZGV4ICR7X2lBY2Nlc3Nvcn0uYCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFycmF5SW5kaWNlczogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyVmlld0RhdGEoZ2x0ZkJ1ZmZlclZpZXdJbmRpY2VzLCBnbHRmQWNjZXNzb3Iuc3BhcnNlLmluZGljZXMuYnl0ZU9mZnNldCwgZ2x0ZkFjY2Vzc29yLnNwYXJzZS5pbmRpY2VzLmNvbXBvbmVudFR5cGUsIEdMVEYuQUNDRVNTT1JfVFlQRS5TQ0FMQVIpO1xyXG4gICAgICAgIGNvbnN0IGFycmF5VmFsdWVzOiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJWaWV3RGF0YShnbHRmQnVmZmVyVmlld1ZhbHVlcywgZ2x0ZkFjY2Vzc29yLnNwYXJzZS52YWx1ZXMuYnl0ZU9mZnNldCwgY29tcG9uZW50VHlwZSwgYWNjZXNzb3JUeXBlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYWNjZXNzb3JUeXBlTGVuZ3RoOiBudW1iZXIgPSB0b0FjY2Vzc29yVHlwZUxlbmd0aFtnbHRmQWNjZXNzb3IudHlwZV07XHJcbiAgICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5idWZmZXJWaWV3ID09IHVuZGVmaW5lZClcclxuICAgICAgICAgIGFycmF5ID0gbmV3IHRvQXJyYXlDb25zdHJ1Y3RvcltnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZV0oZ2x0ZkFjY2Vzc29yLmNvdW50ICogYWNjZXNzb3JUeXBlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGdsdGZBY2Nlc3Nvci5zcGFyc2UuY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgYXJyYXkuc2V0KGFycmF5VmFsdWVzLnNsaWNlKGkgKiBhY2Nlc3NvclR5cGVMZW5ndGgsIChpICsgMSkgKiBhY2Nlc3NvclR5cGVMZW5ndGgpLCBhcnJheUluZGljZXNbaV0gKiBhY2Nlc3NvclR5cGVMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QnVmZmVyVmlld0RhdGEoX2J1ZmZlclZpZXc6IEdMVEYuQnVmZmVyVmlldywgX2J5dGVPZmZzZXQ6IG51bWJlciwgX2NvbXBvbmVudFR5cGU6IEdMVEYuQ09NUE9ORU5UX1RZUEUsIF9hY2Nlc3NvclR5cGU6IEdMVEYuQUNDRVNTT1JfVFlQRSk6IFByb21pc2U8VHlwZWRBcnJheT4ge1xyXG4gICAgICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgdGhpcy5nZXRCdWZmZXIoX2J1ZmZlclZpZXcuYnVmZmVyKTtcclxuICAgICAgY29uc3QgYnl0ZU9mZnNldDogbnVtYmVyID0gKF9idWZmZXJWaWV3LmJ5dGVPZmZzZXQgPz8gMCkgKyAoX2J5dGVPZmZzZXQgPz8gMCk7XHJcbiAgICAgIGNvbnN0IGJ5dGVMZW5ndGg6IG51bWJlciA9IF9idWZmZXJWaWV3LmJ5dGVMZW5ndGggPz8gMDtcclxuICAgICAgY29uc3QgYnl0ZVN0cmlkZTogbnVtYmVyID0gX2J1ZmZlclZpZXcuYnl0ZVN0cmlkZTtcclxuXHJcbiAgICAgIGNvbnN0IGFycmF5Q29uc3RydWN0b3I6IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHRvQXJyYXlDb25zdHJ1Y3RvcltfY29tcG9uZW50VHlwZV07XHJcbiAgICAgIGNvbnN0IGFycmF5OiBUeXBlZEFycmF5ID0gbmV3IGFycmF5Q29uc3RydWN0b3IoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIC8gYXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVCk7XHJcblxyXG4gICAgICBpZiAoYnl0ZVN0cmlkZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGNyZWF0aW5nIG5ldyBidWZmZXJzIG1heWJlIHJhdGhlciBwYXNzIHN0cmlkZSBpbnRvIHRoZSByZW5kZXIgbWVzaD8gYW5kIHNldCBpdCB3aGVuIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBncHU/XHJcbiAgICAgICAgY29uc3QgbkNvbXBvbmVudHNQZXJFbGVtZW50OiBudW1iZXIgPSB0b0FjY2Vzc29yVHlwZUxlbmd0aFtfYWNjZXNzb3JUeXBlXTsgLy8gYW1vdW50IG9mIGNvbXBvbmVudHMgcGVyIGVsZW1lbnQgb2YgdGhlIGFjY2Vzc29yIHR5cGUsIGUuZy4gMyBmb3IgVkVDM1xyXG4gICAgICAgIGNvbnN0IG5FbGVtZW50czogbnVtYmVyID0gYnl0ZUxlbmd0aCAvIGJ5dGVTdHJpZGU7IC8vIGFtb3VudCBvZiBlbGVtZW50cywgZS5nLiBuKlZFQzMgXHJcbiAgICAgICAgY29uc3Qgc3RyaWRlOiBudW1iZXIgPSBieXRlU3RyaWRlIC8gYXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcclxuICAgICAgICBjb25zdCBuZXdBcnJheTogVHlwZWRBcnJheSA9IG5ldyBhcnJheUNvbnN0cnVjdG9yKG5FbGVtZW50cyAqIG5Db21wb25lbnRzUGVyRWxlbWVudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaU5ld0VsZW1lbnQ6IG51bWJlciA9IDA7IGlOZXdFbGVtZW50IDwgbkVsZW1lbnRzOyBpTmV3RWxlbWVudCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBpRWxlbWVudDogbnVtYmVyID0gaU5ld0VsZW1lbnQgKiBzdHJpZGU7XHJcbiAgICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBsb29wIGlzIGZhc3RlciB0aGFuIHNldCArIHNsaWNlXHJcbiAgICAgICAgICBmb3IgKGxldCBpQ29tcG9uZW50OiBudW1iZXIgPSAwOyBpQ29tcG9uZW50IDwgbkNvbXBvbmVudHNQZXJFbGVtZW50OyBpQ29tcG9uZW50KyspXHJcbiAgICAgICAgICAgIG5ld0FycmF5W2lOZXdFbGVtZW50ICogbkNvbXBvbmVudHNQZXJFbGVtZW50ICsgaUNvbXBvbmVudF0gPSBhcnJheVtpRWxlbWVudCArIGlDb21wb25lbnRdO1xyXG4gICAgICAgICAgLy8gbmV3QXJyYXkuc2V0KGFycmF5LnNsaWNlKGlFbGVtZW50LCBpRWxlbWVudCArIG5Db21wb25lbnRzUGVyRWxlbWVudCksIGlOZXdFbGVtZW50ICogbkNvbXBvbmVudHNQZXJFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdBcnJheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QnVmZmVyKF9pQnVmZmVyOiBudW1iZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICAgIGNvbnN0IGdsdGZCdWZmZXI6IEdMVEYuQnVmZmVyID0gdGhpcy4jZ2x0Zi5idWZmZXJzW19pQnVmZmVyXTtcclxuICAgICAgaWYgKCFnbHRmQnVmZmVyKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBidWZmZXIgd2l0aCBpbmRleCAke19pQnVmZmVyfS5gKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy4jYnVmZmVycylcclxuICAgICAgICB0aGlzLiNidWZmZXJzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jYnVmZmVyc1tfaUJ1ZmZlcl0pIHtcclxuICAgICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKGdsdGZCdWZmZXIudXJpLCBuZXcgVVJMKHRoaXMuI3VybCwgUHJvamVjdC5iYXNlVVJMKSkpO1xyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnNbX2lCdWZmZXJdID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI2J1ZmZlcnNbX2lCdWZmZXJdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IoX3NhbXBsZXI6IEdMVEYuQW5pbWF0aW9uU2FtcGxlciwgX3RyYW5zZm9ybWF0aW9uVHlwZTogR0xURi5BbmltYXRpb25DaGFubmVsVGFyZ2V0W1wicGF0aFwiXSk6IFByb21pc2U8QW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzIHwgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3I0PiB7XHJcbiAgICAgIGNvbnN0IGlucHV0OiBGbG9hdDMyQXJyYXkgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShfc2FtcGxlci5pbnB1dCk7XHJcbiAgICAgIGNvbnN0IG91dHB1dDogRmxvYXQzMkFycmF5ID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoX3NhbXBsZXIub3V0cHV0KTtcclxuXHJcbiAgICAgIGNvbnN0IG1pbGxpc1BlclNlY29uZDogbnVtYmVyID0gMTAwMDtcclxuICAgICAgY29uc3QgaXNSb3RhdGlvbjogYm9vbGVhbiA9IF90cmFuc2Zvcm1hdGlvblR5cGUgPT0gXCJyb3RhdGlvblwiO1xyXG4gICAgICBjb25zdCB2ZWN0b3JMZW5ndGg6IG51bWJlciA9IGlzUm90YXRpb24gPyA0IDogMzsgLy8gcm90YXRpb24gaXMgc3RvcmVkIGFzIHF1YXRlcm5pb25cclxuICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04gPSB0aGlzLnRvSW50ZXJuSW50ZXJwb2xhdGlvbihfc2FtcGxlci5pbnRlcnBvbGF0aW9uKTtcclxuICAgICAgY29uc3QgaXNDdWJpYzogdHJ1ZSB8IHVuZGVmaW5lZCA9IGludGVycG9sYXRpb24gPT0gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ1VCSUMgPyB0cnVlIDogdW5kZWZpbmVkO1xyXG4gICAgICBjb25zdCB2ZWN0b3JzUGVySW5wdXQ6IG51bWJlciA9IGlzQ3ViaWMgPyAzIDogMTsgLy8gY3ViaWMgaW50ZXJwb2xhdGlvbiB1c2VzIDMgdmFsdWVzIHBlciBpbnB1dDogaW4tdGFuZ2VudCwgcHJvcGVydHkgdmFsdWUgYW5kIG91dC10YW5nZW50LiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjaW50ZXJwb2xhdGlvbi1jdWJpY1xyXG5cclxuICAgICAgLy8gdXNlZCBvbmx5IGZvciByb3RhdGlvbiBpbnRlcnBvbGF0aW9uXHJcbiAgICAgIGxldCBsYXN0Um90YXRpb246IFF1YXRlcm5pb247XHJcbiAgICAgIGxldCBuZXh0Um90YXRpb246IFF1YXRlcm5pb247XHJcblxyXG4gICAgICBjb25zdCBzZXF1ZW5jZXM6IHsgeDogQW5pbWF0aW9uS2V5W107IHk6IEFuaW1hdGlvbktleVtdOyB6OiBBbmltYXRpb25LZXlbXTsgdz86IEFuaW1hdGlvbktleVtdIH0gPSB7IHg6IFtdLCB5OiBbXSwgejogW10gfTtcclxuICAgICAgaWYgKGlzUm90YXRpb24pIHtcclxuICAgICAgICBzZXF1ZW5jZXMudyA9IFtdO1xyXG4gICAgICAgIGxhc3RSb3RhdGlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgICBuZXh0Um90YXRpb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGlJbnB1dDogbnVtYmVyID0gMDsgaUlucHV0IDwgaW5wdXQubGVuZ3RoOyBpSW5wdXQrKykge1xyXG4gICAgICAgIGNvbnN0IGlPdXRwdXQ6IG51bWJlciA9IGlJbnB1dCAqIHZlY3RvcnNQZXJJbnB1dCAqIHZlY3Rvckxlbmd0aCArIChpc0N1YmljID8gdmVjdG9yTGVuZ3RoIDogMCk7XHJcbiAgICAgICAgY29uc3QgaU91dHB1dFNsb3BlSW46IG51bWJlciA9IGlPdXRwdXQgLSB2ZWN0b3JMZW5ndGg7XHJcbiAgICAgICAgY29uc3QgaU91dHB1dFNsb3BlT3V0OiBudW1iZXIgPSBpT3V0cHV0ICsgdmVjdG9yTGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHRpbWU6IG51bWJlciA9IG1pbGxpc1BlclNlY29uZCAqIGlucHV0W2lJbnB1dF07XHJcblxyXG4gICAgICAgIGlmIChpc1JvdGF0aW9uKSB7XHJcbiAgICAgICAgICAvLyBUYWtlIHRoZSBzaG9ydGVzdCBwYXRoIGJldHdlZW4gdHdvIHJvdGF0aW9ucywgaS5lLiBpZiB0aGUgZG90IHByb2R1Y3QgaXMgbmVnYXRpdmUgdGhlbiB0aGUgbmV4dCBxdWF0ZXJuaW9uIG5lZWRzIHRvIGJlIG5lZ2F0ZWQuXHJcbiAgICAgICAgICAvLyBxIGFuZCAtcSByZXByZXNlbnQgdGhlIHNhbWUgcm90YXRpb24gYnV0IGludGVycG9sYXRpb24gd2lsbCB0YWtlIGVpdGhlciB0aGUgbG9uZyB3YXkgb3IgdGhlIHNob3J0IHdheSBhcm91bmQgdGhlIHNwaGVyZSBkZXBlbmRpbmcgb24gd2hpY2ggd2UgdXNlLlxyXG4gICAgICAgICAgbmV4dFJvdGF0aW9uLnNldChvdXRwdXRbaU91dHB1dCArIDBdLCBvdXRwdXRbaU91dHB1dCArIDFdLCBvdXRwdXRbaU91dHB1dCArIDJdLCBvdXRwdXRbaU91dHB1dCArIDNdKTtcclxuICAgICAgICAgIGlmIChRdWF0ZXJuaW9uLkRPVChsYXN0Um90YXRpb24sIG5leHRSb3RhdGlvbikgPCAwKVxyXG4gICAgICAgICAgICBuZXh0Um90YXRpb24ubmVnYXRlKCk7XHJcbiAgICAgICAgICBvdXRwdXRbaU91dHB1dCArIDBdID0gbmV4dFJvdGF0aW9uLng7XHJcbiAgICAgICAgICBvdXRwdXRbaU91dHB1dCArIDFdID0gbmV4dFJvdGF0aW9uLnk7XHJcbiAgICAgICAgICBvdXRwdXRbaU91dHB1dCArIDJdID0gbmV4dFJvdGF0aW9uLno7XHJcbiAgICAgICAgICBvdXRwdXRbaU91dHB1dCArIDNdID0gbmV4dFJvdGF0aW9uLnc7XHJcbiAgICAgICAgICBsYXN0Um90YXRpb24uc2V0KG5leHRSb3RhdGlvbi54LCBuZXh0Um90YXRpb24ueSwgbmV4dFJvdGF0aW9uLnosIG5leHRSb3RhdGlvbi53KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcXVlbmNlcy54LnB1c2gobmV3IEFuaW1hdGlvbktleSh0aW1lLCBvdXRwdXRbaU91dHB1dCArIDBdLCBpbnRlcnBvbGF0aW9uLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVJbiArIDBdIC8gbWlsbGlzUGVyU2Vjb25kLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVPdXQgKyAwXSAvIG1pbGxpc1BlclNlY29uZCkpO1xyXG4gICAgICAgIHNlcXVlbmNlcy55LnB1c2gobmV3IEFuaW1hdGlvbktleSh0aW1lLCBvdXRwdXRbaU91dHB1dCArIDFdLCBpbnRlcnBvbGF0aW9uLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVJbiArIDFdIC8gbWlsbGlzUGVyU2Vjb25kLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVPdXQgKyAxXSAvIG1pbGxpc1BlclNlY29uZCkpO1xyXG4gICAgICAgIHNlcXVlbmNlcy56LnB1c2gobmV3IEFuaW1hdGlvbktleSh0aW1lLCBvdXRwdXRbaU91dHB1dCArIDJdLCBpbnRlcnBvbGF0aW9uLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVJbiArIDJdIC8gbWlsbGlzUGVyU2Vjb25kLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVPdXQgKyAyXSAvIG1pbGxpc1BlclNlY29uZCkpO1xyXG4gICAgICAgIGlmIChpc1JvdGF0aW9uKVxyXG4gICAgICAgICAgc2VxdWVuY2VzLncucHVzaChuZXcgQW5pbWF0aW9uS2V5KHRpbWUsIG91dHB1dFtpT3V0cHV0ICsgM10sIGludGVycG9sYXRpb24sIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZUluICsgM10gLyBtaWxsaXNQZXJTZWNvbmQsIGlzQ3ViaWMgJiYgb3V0cHV0W2lPdXRwdXRTbG9wZU91dCArIDNdIC8gbWlsbGlzUGVyU2Vjb25kKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc1JvdGF0aW9uKSB7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobGFzdFJvdGF0aW9uKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShuZXh0Um90YXRpb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNlcXVlbmNlcykubWFwKChbX2tleSwgX3ZhbHVlXSkgPT4gW19rZXksIG5ldyBBbmltYXRpb25TZXF1ZW5jZShfdmFsdWUpXSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9JbnRlcm5JbnRlcnBvbGF0aW9uKF9pbnRlcnBvbGF0aW9uOiBHTFRGLkFuaW1hdGlvblNhbXBsZXJbXCJpbnRlcnBvbGF0aW9uXCJdKTogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04ge1xyXG4gICAgICBzd2l0Y2ggKF9pbnRlcnBvbGF0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcIkxJTkVBUlwiOlxyXG4gICAgICAgICAgcmV0dXJuIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUjtcclxuICAgICAgICBjYXNlIFwiU1RFUFwiOlxyXG4gICAgICAgICAgcmV0dXJuIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNPTlNUQU5UO1xyXG4gICAgICAgIGNhc2UgXCJDVUJJQ1NQTElORVwiOlxyXG4gICAgICAgICAgcmV0dXJuIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNVQklDO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoX2ludGVycG9sYXRpb24gIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBVbmtub3duIGludGVycG9sYXRpb24gdHlwZSAke19pbnRlcnBvbGF0aW9ufS5gKTtcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5MSU5FQVI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFdlYkdMUGFyYW1ldGVyTmFtZShfdmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dCkuZmluZChfa2V5ID0+IFJlZmxlY3QuZ2V0KFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIF9rZXkpID09IF92YWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0eXBlIFR5cGVkQXJyYXkgPSBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBVaW50MzJBcnJheSB8IEludDhBcnJheSB8IEludDE2QXJyYXkgfCBGbG9hdDMyQXJyYXk7XHJcbiAgdHlwZSBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBVaW50OEFycmF5Q29uc3RydWN0b3IgfCBVaW50MTZBcnJheUNvbnN0cnVjdG9yIHwgVWludDMyQXJyYXlDb25zdHJ1Y3RvciB8IEludDhBcnJheUNvbnN0cnVjdG9yIHwgSW50MTZBcnJheUNvbnN0cnVjdG9yIHwgRmxvYXQzMkFycmF5Q29uc3RydWN0b3I7XHJcblxyXG4gIGNvbnN0IHRvSW50ZXJuVHJhbnNmb3JtYXRpb246IFJlY29yZDxHTFRGLkFuaW1hdGlvbkNoYW5uZWxUYXJnZXRbXCJwYXRoXCJdLCBzdHJpbmc+ID0ge1xyXG4gICAgXCJ0cmFuc2xhdGlvblwiOiBcInRyYW5zbGF0aW9uXCIsXHJcbiAgICBcInJvdGF0aW9uXCI6IFwicm90YXRpb25cIixcclxuICAgIFwic2NhbGVcIjogXCJzY2FsaW5nXCIsXHJcbiAgICBcIndlaWdodHNcIjogXCJ3ZWlnaHRzXCJcclxuICB9O1xyXG5cclxuICAvLyBudW1iZXIgb2YgY29tcG9uZW50cyBkZWZpbmVkIGJ5ICd0eXBlJ1xyXG4gIGNvbnN0IHRvQWNjZXNzb3JUeXBlTGVuZ3RoOiBSZWNvcmQ8R0xURi5BQ0NFU1NPUl9UWVBFLCBudW1iZXI+ID0ge1xyXG4gICAgXCJTQ0FMQVJcIjogMSxcclxuICAgIFwiVkVDMlwiOiAyLFxyXG4gICAgXCJWRUMzXCI6IDMsXHJcbiAgICBcIlZFQzRcIjogNCxcclxuICAgIFwiTUFUMlwiOiA0LFxyXG4gICAgXCJNQVQzXCI6IDksXHJcbiAgICBcIk1BVDRcIjogMTZcclxuICB9O1xyXG5cclxuICBjb25zdCB0b0FycmF5Q29uc3RydWN0b3I6IFJlY29yZDxHTFRGLkNPTVBPTkVOVF9UWVBFLCBUeXBlZEFycmF5Q29uc3RydWN0b3I+ID0ge1xyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5CWVRFXTogSW50OEFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfU0hPUlRdOiBVaW50MTZBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlNIT1JUXTogSW50MTZBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuRkxPQVRdOiBGbG9hdDMyQXJyYXlcclxuICB9O1xyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGxldCBzaGFkZXJTb3VyY2VzOiB7W3NvdXJjZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJBbWJpZW50T2NjbHVzaW9uLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFtYmllbnQgb2NjbHVzaW9uIGZvciBhIGdpdmVuIGZyYWdtZW50XHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICogYWRhcHRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL3RzaGVyaWYvd2ViZ2wyZXhhbXBsZXMvYmxvYi9kYTExNTNhMTVlYmMwOWJiMTM0OThlNWY3MzJlZjIwMzY1MDc3NDBjL3NzYW8uaHRtbFxyXG4gKiBzZWUgaGVyZSBmb3IgYW4gaW4gZGVwdGggZXhwbGFuYXRpb246IFxyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbmNvbnN0IGZsb2F0IHNpbjQ1ID0gMC43MDcxMDc7IC8vIDQ1IGRlZ3JlZXMgaW4gcmFkaWFuc1xyXG5jb25zdCB2ZWMyIGtlcm5lbFs0XSA9IHZlYzJbNF0odmVjMigwLjAsIDEuMCksIHZlYzIoMS4wLCAwLjApLCB2ZWMyKDAuMCwgLTEuMCksIHZlYzIoLTEuMCwgMC4wKSk7XHJcblxyXG51bmlmb3JtIGZsb2F0IHVfZk5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRmFyO1xyXG51bmlmb3JtIGZsb2F0IHVfZlNhbXBsZVJhZGl1cztcclxudW5pZm9ybSBmbG9hdCB1X2ZCaWFzO1xyXG51bmlmb3JtIGZsb2F0IHVfZkF0dGVudWF0aW9uQ29uc3RhbnQ7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25MaW5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWM7XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFJlc29sdXRpb247XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb25JbnZlcnNlO1xyXG5cclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhQb3NpdGlvbjtcclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9pc2U7XHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGg7XHJcblxyXG5pbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbmxheW91dChzdGQxNDApIHVuaWZvcm0gRm9nIHtcclxuICBib29sIHVfYkZvZ0FjdGl2ZTtcclxuICBmbG9hdCB1X2ZGb2dOZWFyO1xyXG4gIGZsb2F0IHVfZkZvZ0ZhcjtcclxuICBmbG9hdCBwYWRpbmc7XHJcbiAgdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG59O1xyXG5cclxuLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gZnJvbSB0aGUgZGVwdGggdGV4dHVyZSwgYnV0IG1vYmlsZSBkZXZpY2VzIHNlZW1zIHRvIGxhY2sgaW4gcHJlY2lzaW9uIHRvIGRvIHRoaXNcclxuLy8gdmVjMyBnZXRQb3NpdGlvbih2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgZmxvYXQgZkRlcHRoID0gdGV4dHVyZSh1X3RleERlcHRoLCBfdmN0VGV4dHVyZSkucjtcclxuLy8gICB2ZWM0IGNsaXBTcGFjZVBvc2l0aW9uID0gdmVjNChfdmN0VGV4dHVyZSAqIDIuMCAtIDEuMCwgZkRlcHRoICogMi4wIC0gMS4wLCAxLjApO1xyXG4vLyAgIHZlYzQgd29ybGRTcGFjZVBvc2l0aW9uID0gdV9tdHhWaWV3UHJvamVjdGlvbkludmVyc2UgKiBjbGlwU3BhY2VQb3NpdGlvbjtcclxuLy8gICByZXR1cm4gd29ybGRTcGFjZVBvc2l0aW9uLnh5eiAvIHdvcmxkU3BhY2VQb3NpdGlvbi53O1xyXG4vLyB9XHJcblxyXG5mbG9hdCBnZXRPY2NsdXNpb24odmVjMyBfdmN0UG9zaXRpb24sIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzMgdmN0T2NjbHVkZXIgPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIF92Y3RUZXh0dXJlKS54eXo7XHJcblxyXG4gIGlmICh2Y3RPY2NsdWRlci54ID09IDAuMCAmJiB2Y3RPY2NsdWRlci55ID09IDAuMCAmJiB2Y3RPY2NsdWRlci56ID09IDAuMCkgLy8gbm8gb2NjbHVkZXIgYXQgdGhpcyBwb3NpdGlvblxyXG4gICAgcmV0dXJuIDAuMDtcclxuXHJcbiAgdmVjMyB2Y3REaXN0YW5jZSA9IHZjdE9jY2x1ZGVyIC0gX3ZjdFBvc2l0aW9uO1xyXG4gIGZsb2F0IGZJbnRlbnNpdHkgPSBtYXgoZG90KF92Y3ROb3JtYWwsIG5vcm1hbGl6ZSh2Y3REaXN0YW5jZSkpIC0gdV9mQmlhcywgMC4wKTtcclxuXHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKHZjdERpc3RhbmNlKTtcclxuICBmbG9hdCBmQXR0ZW51YXRpb24gPSAxLjAgLyAodV9mQXR0ZW51YXRpb25Db25zdGFudCArIHVfZkF0dGVudWF0aW9uTGluZWFyICogZkRpc3RhbmNlICsgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWMgKiBmRGlzdGFuY2UgKiBmRGlzdGFuY2UpO1xyXG5cclxuICByZXR1cm4gZkludGVuc2l0eSAqIGZBdHRlbnVhdGlvbjtcclxufVxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZlYzMgdmN0UG9zaXRpb24gPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIHZfdmN0VGV4dHVyZSkueHl6O1xyXG4gIHZlYzMgdmN0Tm9ybWFsID0gdGV4dHVyZSh1X3RleE5vcm1hbCwgdl92Y3RUZXh0dXJlKS54eXo7XHJcbiAgdmVjMiB2Y3RSYW5kb20gPSBub3JtYWxpemUodGV4dHVyZSh1X3RleE5vaXNlLCB2X3ZjdFRleHR1cmUpLnh5ICogMi4wIC0gMS4wKTtcclxuICBmbG9hdCBmRGVwdGggPSAobGVuZ3RoKHZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpIC0gdV9mTmVhcikgLyAodV9mRmFyIC0gdV9mTmVhcik7IC8vIGxpbmVhciBldWNsaWRlYW4gZGVwdGggaW4gcmFuZ2UgWzAsMV0sIHdoZW4gY2hhbmdpbmcgdG8gdmlldyBzcGFjZSwgZG9uJ3Qgc3VidHJhY3QgY2FtZXJhIHBvc2l0aW9uXHJcbiAgZmxvYXQgZktlcm5lbFJhZGl1cyA9IHVfZlNhbXBsZVJhZGl1cyAqICgxLjAgLSBmRGVwdGgpO1xyXG5cclxuICBmbG9hdCBmT2NjbHVzaW9uID0gMC4wO1xyXG4gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7XHJcbiAgICB2ZWMyIHZjdEsxID0gcmVmbGVjdChrZXJuZWxbaV0sIHZjdFJhbmRvbSk7XHJcbiAgICB2ZWMyIHZjdEsyID0gdmVjMih2Y3RLMS54ICogc2luNDUgLSB2Y3RLMS55ICogc2luNDUsIHZjdEsxLnggKiBzaW40NSArIHZjdEsxLnkgKiBzaW40NSk7XHJcblxyXG4gICAgdmN0SzEgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG4gICAgdmN0SzIgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG5cclxuICAgIHZjdEsxICo9IGZLZXJuZWxSYWRpdXM7XHJcbiAgICB2Y3RLMiAqPSBmS2VybmVsUmFkaXVzO1xyXG5cclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsxKTtcclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsyICogMC43NSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMSAqIDAuNSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMiAqIDAuMjUpO1xyXG4gIH1cclxuXHJcbiAgZk9jY2x1c2lvbiA9IGNsYW1wKGZPY2NsdXNpb24gLyAxNi4wLCAwLjAsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2dBY3RpdmUgJiYgZk9jY2x1c2lvbiA+IDAuMCkgLy8gY29ycmVjdCBvY2NsdXNpb24gYnkgZm9nIGZhY3RvclxyXG4gICAgZk9jY2x1c2lvbiA9IG1peChmT2NjbHVzaW9uLCAwLjAsIGdldEZvZyh2Y3RQb3NpdGlvbikpO1xyXG4gIFxyXG4gIHZjdEZyYWcucmdiID0gdmVjMyhmT2NjbHVzaW9uKTtcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJCbG9vbS5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuICogRXh0cmFjdHMgY29sb3JzLCBkb3duc2FtcGxlcyBhbmQgdXBzYW1wbGVzIGEgdGV4dHVyZVxyXG4gKiBBZGFwdGlvbiBvZiB0aGUgXCJkdWFsIGZpbHRlcmluZyBrYXdhc2VcIiBtZXRob2QgZGVzY3JpYmVkIGluIFNJR0dSQVBIIDIwMTUgYnkgTWFyaXVzIEJqw7hyZ2VcclxuICogaHR0cHM6Ly9jb21tdW5pdHkuYXJtLmNvbS9jZnMtZmlsZS9fX2tleS9jb21tdW5pdHlzZXJ2ZXItYmxvZ3MtY29tcG9uZW50cy13ZWJsb2dmaWxlcy8wMC0wMC0wMC0yMC02Ni9zaWdncmFwaDIwMTVfMkQwMF9tbWdfMkQwMF9tYXJpdXNfMkQwMF9ub3Rlcy5wZGZcclxuICogQGF1dGhvcnMgUm9sYW5kIEhlZXIsIEhGVSwgMjAyMyB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAqL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gaW50IHVfaU1vZGU7IC8vIDA6IGV4dHJhY3QsIDE6IGRvd25zYW1wbGUsIDI6IHVwc2FtcGxlLCAzOiBhcHBseVxyXG51bmlmb3JtIGZsb2F0IHVfZlRocmVzaG9sZDtcclxudW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcbnVuaWZvcm0gZmxvYXQgdV9mSGlnaGxpZ2h0RGVzYXR1cmF0aW9uO1xyXG51bmlmb3JtIHZlYzIgdV92Y3RUZXhlbDtcclxuXHJcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4U291cmNlO1xyXG5cclxuaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbm91dCB2ZWM0IHZjdEZyYWc7XHJcblxyXG4vLyBvbGQgZ2F1c3NpYW4gYmx1clxyXG4vLyBmbGF0IGluIHZlYzJbOV0gdl92Y3RPZmZzZXRzO1xyXG4vLyBjb25zdCBmbG9hdCBnYXVzc2lhbktlcm5lbFs5XSA9IGZsb2F0W10oMC4wNDUsIDAuMTIyLCAwLjA0NSwgMC4xMjIsIDAuMzMyLCAwLjEyMiwgMC4wNDUsIDAuMTIyLCAwLjA0NSk7XHJcbi8vIHZlYzQgZG93bnNhbXBsZSh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgdmVjNCB2Y3RDb2xvciA9IHZlYzQoMC4wKTtcclxuLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgXHJcbi8vICAgICB2Y3RDb2xvciArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCB2X3ZjdFRleHR1cmUgKyB2X3ZjdE9mZnNldHNbaV0pICogZ2F1c3NpYW5LZXJuZWxbaV07XHJcbi8vICAgcmV0dXJuIHZjdENvbG9yO1xyXG4vLyB9XHJcbi8vIHZlYzQgdXBzYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4vLyAgIHZlYzQgdmN0Q29sb3IgPSB2ZWM0KDAuMCk7XHJcbi8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIFxyXG4vLyAgICAgdmN0Q29sb3IgKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2X3ZjdE9mZnNldHNbaV0pICogZ2F1c3NpYW5LZXJuZWxbaV07XHJcbi8vICAgcmV0dXJuIHZjdENvbG9yO1xyXG4vLyB9XHJcblxyXG4vLyB2ZWMzIGV4dHJhY3QodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4vLyAgIHZlYzMgdmN0Q29sb3IgPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSkucmdiO1xyXG4vLyAgIGlmKGFueShncmVhdGVyVGhhbih2Y3RDb2xvciwgdmVjMyh1X2ZUaHJlc2hvbGQpKSkpXHJcbi8vICAgICByZXR1cm4gdmN0Q29sb3I7XHJcbi8vICAgZGlzY2FyZDtcclxuLy8gfVxyXG5cclxuLy8gdmVjMyBleHRyYWN0KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWMzIHZjdENvbG9yID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuLy8gICBmbG9hdCBsdW1pbmFuY2UgPSBkb3QodmN0Q29sb3IsIHZlYzMoMC4yOTksIDAuNTg3LCAwLjExNCkpO1xyXG4vLyAgIGlmKGx1bWluYW5jZSA+IHVfZlRocmVzaG9sZClcclxuLy8gICAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gICBkaXNjYXJkO1xyXG4vLyB9XHJcblxyXG4vLyBvbGQgZXh0cmFjdGlvbiB3aXRoIGF2ZXJhZ2UgYnJpZ2h0bmVzc1xyXG52ZWMzIGV4dHJhY3QodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzMgdmN0Q29sb3IgPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSkucmdiO1xyXG4gIGZsb2F0IGZUaHJlc2hvbGQgPSB1X2ZUaHJlc2hvbGQ7XHJcbiAgaWYoZlRocmVzaG9sZCA+PSAxLjApXHJcbiAgICBmVGhyZXNob2xkID0gMC45OTk5OTk7XHJcblxyXG4gIHZjdENvbG9yID0gdmN0Q29sb3IgLSBmVGhyZXNob2xkO1xyXG4gIHZjdENvbG9yID0gdmN0Q29sb3IgLyAoMS4wIC0gZlRocmVzaG9sZCk7IC8vIG5lZ2F0aXZlIHZhbHVlcyBtaWdodCByZWNlaXZlIHZhbHVlcyBhYm92ZSAxLjAuLi5cclxuICBcclxuICBmbG9hdCBhdmVyYWdlQnJpZ2h0bmVzcyA9ICgoKHZjdENvbG9yLnIgKyB2Y3RDb2xvci5nICsgdmN0Q29sb3IuYikgLyAzLjApICogMC4yKSArIDAuODsgLy90aGUgZWZmZWN0IGlzIHJlZHVjZWQgYnkgZmlyc3Qgc2V0dGluZyBpdCB0byBhIDAuMC0wLjIgcmFuZ2UgYW5kIHRoZW4gYWRkaW5nIDAuOFxyXG4gIHZjdENvbG9yID0gY2xhbXAodmN0Q29sb3IsIDAuMCwgMS4wKSAqIGNsYW1wKGF2ZXJhZ2VCcmlnaHRuZXNzLCAwLjAsIDEuMCk7XHJcbiAgcmV0dXJuIHZjdENvbG9yO1xyXG59XHJcblxyXG52ZWM0IGRvd25zYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzQgc3VtID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpICogNC4wO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSAtIHVfdmN0VGV4ZWwueHkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHVfdmN0VGV4ZWwueHkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIodV92Y3RUZXhlbC54LCAtdV92Y3RUZXhlbC55KSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlIC0gdmVjMih1X3ZjdFRleGVsLngsIC11X3ZjdFRleGVsLnkpKTtcclxuXHJcbiAgcmV0dXJuIHN1bSAvIDguMDtcclxufVxyXG5cclxudmVjNCB1cHNhbXBsZSh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbiAgdmVjNCBzdW0gPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoLXVfdmN0VGV4ZWwueCAqIDIuMCwgMC4wKSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigtdV92Y3RUZXhlbC54LCB1X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKDAuMCwgdV92Y3RUZXhlbC55ICogMi4wKSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMih1X3ZjdFRleGVsLngsIHVfdmN0VGV4ZWwueSkpICogMi4wO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIodV92Y3RUZXhlbC54ICogMi4wLCAwLjApKTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpICogMi4wO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoMC4wLCAtdV92Y3RUZXhlbC55ICogMi4wKSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigtdV92Y3RUZXhlbC54LCAtdV92Y3RUZXhlbC55KSkgKiAyLjA7XHJcbiAgcmV0dXJuIHN1bSAvIDEyLjA7XHJcbn1cclxuXHJcbnZlYzMgYXBwbHkodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzMgdmN0Qmxvb20gPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSkucmdiO1xyXG4gIGlmICh2Y3RCbG9vbS5yID49IDEuMCB8fCB2Y3RCbG9vbS5nID49IDEuMCB8fCB2Y3RCbG9vbS5iID49IDEuMCkgLy8gbWF5YmUgdXNlIHRocmVzaG9sZCBpbnN0ZWFkIG9mIDEuMD9cclxuICAgIHZjdEJsb29tID0gbWl4KHZjdEJsb29tLCB2ZWMzKDEuMCksIHVfZkhpZ2hsaWdodERlc2F0dXJhdGlvbik7XHJcbiAgdmN0Qmxvb20gPSBjbGFtcCh2Y3RCbG9vbSAqIHVfZkludGVuc2l0eSwgMC4wLCAxLjApO1xyXG4gIHJldHVybiB2Y3RCbG9vbTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHN3aXRjaCh1X2lNb2RlKSB7XHJcbiAgICBjYXNlIDA6XHJcbiAgICAgIHZjdEZyYWcucmdiID0gZXh0cmFjdCh2X3ZjdFRleHR1cmUpO1xyXG4gICAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgMTpcclxuICAgICAgdmN0RnJhZyA9IGRvd25zYW1wbGUodl92Y3RUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgY2FzZSAyOlxyXG4gICAgICB2Y3RGcmFnID0gdXBzYW1wbGUodl92Y3RUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgY2FzZSAzOlxyXG4gICAgICB2Y3RGcmFnLnJnYiA9IGFwcGx5KHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHZjdEZyYWcuYSA9IDEuMDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgdmN0RnJhZyA9IHRleHR1cmUodV90ZXhTb3VyY2UsIHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybjtcclxuICB9XHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJHaXptby5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiAuLi5cclxuKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIHZlYzQgdV92Y3RDb2xvcjtcclxuXHJcbm91dCB2ZWM0IHZjdEZyYWc7XHJcblxyXG4vLyB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleERlcHRoU3RlbmNpbDtcclxuI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG4gIGluIHZlYzIgdl92Y3RUZXh0dXJlO1xyXG4jZW5kaWZcclxuXHJcbi8vIC8vIDR4NCBCYXllciBtYXRyaXggZm9yIGRpdGhlcmluZ1xyXG4vLyBjb25zdCBmbG9hdCBtdHhEaXRoZXJbMTZdID0gZmxvYXRbXShcclxuLy8gICAxLjAgLyAxNy4wLCAgOS4wIC8gMTcuMCwgIDMuMCAvIDE3LjAsIDExLjAgLyAxNy4wLFxyXG4vLyAgIDEzLjAgLyAxNy4wLCAgNS4wIC8gMTcuMCwgMTUuMCAvIDE3LjAsICA3LjAgLyAxNy4wLFxyXG4vLyAgIDQuMCAvIDE3LjAsIDEyLjAgLyAxNy4wLCAgMi4wIC8gMTcuMCwgMTAuMCAvIDE3LjAsXHJcbi8vICAgMTYuMCAvIDE3LjAsICA4LjAgLyAxNy4wLCAxNC4wIC8gMTcuMCwgIDYuMCAvIDE3LjBcclxuLy8gKTtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICB2Y3RGcmFnID0gdV92Y3RDb2xvcjtcclxuXHJcbiAgI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuXHJcbiAgICAgIHZjdEZyYWcgKj0gdGV4dHVyZSh1X3RleENvbG9yLCB2X3ZjdFRleHR1cmUpO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgLy8gaW50IHggPSBpbnQoZ2xfRnJhZ0Nvb3JkLngpICUgNDtcclxuICAvLyBpbnQgeSA9IGludChnbF9GcmFnQ29vcmQueSkgJSA0O1xyXG4gIC8vIGludCBpbmRleCA9IHkgKiA0ICsgeDtcclxuICAvLyAvLyBEaXNjYXJkIHRoZSBmcmFnbWVudCBpZiBpdHMgYWxwaGEgaXMgbGVzcyB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBkaXRoZXJpbmcgbWF0cml4XHJcbiAgLy8gaWYgKHZjdEZyYWcuYSA8IG10eERpdGhlcltpbmRleF0pIFxyXG4gIC8vICAgZGlzY2FyZDtcclxuXHJcbiAgLy8gLy8gRGlzY2FyZCB0aGUgZnJhZ21lbnQgaWYgaXRzIGFscGhhIGlzIDBcclxuICAvLyBpZiAodmN0RnJhZy5hID09IDAuMClcclxuICAvLyAgIGRpc2NhcmQ7XHJcblxyXG4gIC8vIC8vIENyZWF0ZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuIGZvciBhbHBoYSB2YWx1ZXMgbGVzcyB0aGFuIDAuNVxyXG4gIC8vIGVsc2UgaWYgKHZjdEZyYWcuYSA8IDAuNSAmJiAoKHggKyB5KSAlIDIgPT0gMCkpXHJcbiAgLy8gICBkaXNjYXJkO1xyXG5cclxuICAvLyB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gIGlmICh2Y3RGcmFnLmEgPCAwLjAxKVxyXG4gICAgZGlzY2FyZDtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIC4uLlxyXG4qIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbi8vIHVuaWZvcm0gbWF0NCB1X210eFZpZXdQcm9qZWN0aW9uO1xyXG4vLyB1bmlmb3JtIG1hdDQgdV9tdHhNb2RlbDtcclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvVmlldzsgLy8gbW9kZWwtdmlldy1wcm9qZWN0aW9uIG1hdHJpeFxyXG5cclxuaW4gdmVjMyBhX3ZjdFBvc2l0aW9uO1xyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuXHJcbiAgaW4gdmVjMiBhX3ZjdFRleHR1cmU7XHJcbiAgb3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuI2VuZGlmXHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgZ2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFfdmN0UG9zaXRpb24sIDEuMCk7XHJcblxyXG4gICNpZiBkZWZpbmVkKFRFWFRVUkUpXHJcblxyXG4gICAgdl92Y3RUZXh0dXJlID0gYV92Y3RUZXh0dXJlO1xyXG5cclxuICAjZW5kaWZcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBob25nLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFBob25nIHNoYWRpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMiB8IFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxuXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcbnVuaWZvcm0gZmxvYXQgdV9mTWV0YWxsaWM7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbnVuaWZvcm0gYm9vbCB1X2JGb2c7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG51bmlmb3JtIGZsb2F0IHVfZkZvZ05lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRm9nRmFyO1xyXG5cclxuaW4gdmVjNCB2X3ZjdENvbG9yO1xyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcblxyXG5sYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB2Y3RGcmFnO1xyXG5sYXlvdXQobG9jYXRpb24gPSAxKSBvdXQgdmVjNCB2Y3RGcmFnUG9zaXRpb247XHJcbmxheW91dChsb2NhdGlvbiA9IDIpIG91dCB2ZWM0IHZjdEZyYWdOb3JtYWw7XHJcblxyXG4jaWZkZWYgUEhPTkdcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIEZMQVRcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG5zdHJ1Y3QgTGlnaHQge1xyXG4gIHZlYzQgdmN0Q29sb3I7XHJcbiAgbWF0NCBtdHhTaGFwZTtcclxuICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxufTtcclxuXHJcbmNvbnN0IHVpbnQgTUFYX0xJR0hUU19ESVJFQ1RJT05BTCA9IDE1dTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1NQT1QgPSAxMDB1O1xyXG5cclxubGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBMaWdodHMge1xyXG4gIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgdWludCB1X25MaWdodHNQb2ludDtcclxuICB1aW50IHVfbkxpZ2h0c1Nwb3Q7XHJcbiAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gIExpZ2h0IHVfYW1iaWVudDtcclxuICBMaWdodCB1X2RpcmVjdGlvbmFsW01BWF9MSUdIVFNfRElSRUNUSU9OQUxdO1xyXG4gIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgTGlnaHQgdV9zcG90W01BWF9MSUdIVFNfU1BPVF07XHJcbn07XHJcblxyXG4vLyBURVhUVVJFOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIFRFWFRVUkVcclxuXHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gTk9STUFMTUFQOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICBpbiB2ZWMzIHZfdmN0VGFuZ2VudDtcclxuICBpbiB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBSZXR1cm5zIGEgdmVjdG9yIGZvciB2aXN1YWxpemluZyBvbiBtb2RlbC4gR3JlYXQgZm9yIGRlYnVnZ2luZ1xyXG52ZWM0IHNob3dWZWN0b3JBc0NvbG9yKHZlYzMgX3ZlY3RvciwgYm9vbCBfY2xhbXApIHtcclxuICBpZihfY2xhbXApIHtcclxuICAgIF92ZWN0b3IgKj0gMC41O1xyXG4gICAgX3ZlY3RvciArPSAwLjU7XHJcbiAgfVxyXG4gIHJldHVybiB2ZWM0KF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnosIDEpO1xyXG59XHJcblxyXG52b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgdmVjMyB2Y3REaXJlY3Rpb24gPSBub3JtYWxpemUoX3ZjdERpcmVjdGlvbik7XHJcbiAgZmxvYXQgZklsbHVtaW5hdGlvbiA9IC1kb3QoX3ZjdE5vcm1hbCwgdmN0RGlyZWN0aW9uKTtcclxuICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICBfdmN0RGlmZnVzZSArPSB1X2ZEaWZmdXNlICogZklsbHVtaW5hdGlvbiAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICBpZih1X2ZTcGVjdWxhciA8PSAwLjApXHJcbiAgICAgIHJldHVybjtcclxuICAgICAgXHJcbiAgICAvL0JMSU5OLVBob25nIFNoYWRpbmdcclxuICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSgtdmN0RGlyZWN0aW9uIC0gX3ZjdFZpZXcpO1xyXG4gICAgZmxvYXQgZmFjdG9yID0gbWF4KGRvdCgtdmN0RGlyZWN0aW9uLCBfdmN0Tm9ybWFsKSwgMC4wKTsgLy9GYWN0b3IgZm9yIHNtb290aGluZyBvdXQgdHJhbnNpdGlvbiBmcm9tIHN1cmZhY2UgZmFjaW5nIHRoZSBsaWdodHNvdXJjZSB0byBzdXJmYWNlIGZhY2luZyBhd2F5IGZyb20gdGhlIGxpZ2h0c291cmNlXHJcbiAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgIF92Y3RTcGVjdWxhciArPSBwb3cobWF4KGRvdChfdmN0Tm9ybWFsLCBoYWxmd2F5RGlyKSwgMC4wKSwgZXhwMih1X2ZTcGVjdWxhciAqIDUuMCkpICogdV9mU3BlY3VsYXIgKiB1X2ZJbnRlbnNpdHkgKiBmYWN0b3IgKiBfdmN0Q29sb3I7XHJcbiAgfVxyXG59XHJcblxyXG5mbG9hdCBnZXRGb2codmVjMyBfdmN0UG9zaXRpb24pIHtcclxuICBmbG9hdCBmRGlzdGFuY2UgPSBsZW5ndGgoX3ZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpOyAvLyBtYXliZSB1c2Ugei1kZXB0aCBpbnN0ZWFkIG9mIGV1Y2xpZGVhbiBkZXB0aFxyXG4gIGZsb2F0IGZGb2cgPSBjbGFtcCgoZkRpc3RhbmNlIC0gdV9mRm9nTmVhcikgLyAodV9mRm9nRmFyIC0gdV9mRm9nTmVhciksIDAuMCwgMS4wKTtcclxuICBmRm9nID0gLXBvdyhmRm9nLCAyLjApICsgKDIuMCAqIGZGb2cpOyAvLyBsZXRzIGZvZyBhcHBlYXIgcXVpY2tlciBhbmQgZmFsbCBvZmYgc2xvd2VyIHJlc3VsdHMgaW4gYSBtb3JlIGdyYWR1YWwgZmFsbG9mZlxyXG4gIHJldHVybiBmRm9nO1xyXG59XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgI2lmIGRlZmluZWQoUEhPTkcpICYmICFkZWZpbmVkKEZMQVQpXHJcblxyXG4gICAgI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICAgICAgbWF0MyBtdHhUQk4gPSBtYXQzKG5vcm1hbGl6ZSh2X3ZjdFRhbmdlbnQpLCBub3JtYWxpemUodl92Y3RCaXRhbmdlbnQpLCBub3JtYWxpemUodl92Y3ROb3JtYWwpKTtcclxuICAgICAgdmVjMyB2Y3ROb3JtYWwgPSB0ZXh0dXJlKHVfdGV4Tm9ybWFsLCB2X3ZjdFRleHR1cmUpLnh5eiAqIDIuMCAtIDEuMDtcclxuICAgICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICAgI2Vsc2VcclxuXHJcbiAgICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKHZfdmN0Tm9ybWFsKTtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmZGVmIEZMQVRcclxuXHJcbiAgICB2ZWMzIHZjdEZkeCA9IGRGZHgodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdEZkeSA9IGRGZHkodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RGZHgsIHZjdEZkeSkpO1xyXG4gICAgdmVjMyB2Y3RWaWV3ID0gbm9ybWFsaXplKHZfdmN0UG9zaXRpb25GbGF0IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbiA9IHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgdmVjMyB2Y3RTcGVjdWxhciA9IHZlYzMoMCwgMCwgMCk7XHJcblxyXG4gIC8vIGNhbGN1bGF0ZSBkaXJlY3Rpb25hbCBsaWdodCBlZmZlY3RcclxuICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxjdWxhdGUgcG9pbnQgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzUG9pbnQ7IGkrKykge1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbkxpZ2h0ID0gdmVjMyh1X3BvaW50W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICBjb250aW51ZTtcclxuXHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfcG9pbnRbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzU3BvdDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZjdFBvc2l0aW9uIC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uSW52ZXJ0ZWQgPSBtYXQzKHVfc3BvdFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uO1xyXG4gICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgZkludGVuc2l0eSAqPSAxLjAgLSBwb3codmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgdmN0RnJhZy5yZ2IgPSB2Y3REaWZmdXNlICsgdmN0U3BlY3VsYXIgKiB1X2ZNZXRhbGxpYztcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNpZmRlZiBURVhUVVJFXHJcblxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gIHZjdEZyYWcgKj0gdV92Y3RDb2xvciAqIHZfdmN0Q29sb3I7XHJcbiAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICB2Y3RGcmFnUG9zaXRpb24gPSB2ZWM0KHZfdmN0UG9zaXRpb24sIDEuMCk7IC8vIGRvbid0IHVzZSBmbGF0IGhlcmUsIGJlY2F1c2Ugd2Ugd2FudCB0byBpbnRlcnBvbGF0ZSB0aGUgcG9zaXRpb25cclxuICB2Y3RGcmFnTm9ybWFsID0gdmVjNCh2Y3ROb3JtYWwsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2cpIFxyXG4gICAgdmN0RnJhZy5yZ2IgPSBtaXgodmN0RnJhZy5yZ2IsIHVfdmN0Rm9nQ29sb3IucmdiLCBnZXRGb2codmN0UG9zaXRpb24pICogdV92Y3RGb2dDb2xvci5hKTtcclxuXHJcbiAgdmN0RnJhZy5yZ2IgKj0gdmN0RnJhZy5hO1xyXG5cclxuICBpZih2Y3RGcmFnLmEgPCAwLjAxKVxyXG4gICAgZGlzY2FyZDtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2suZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBpbnQgdV9pZDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0U2l6ZTtcclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbm91dCBpdmVjNCB2Y3RGcmFnO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG4gICAgaW50IHBpeGVsID0gaW50KHRydW5jKGdsX0ZyYWdDb29yZC54KSArIHVfdmN0U2l6ZS54ICogdHJ1bmMoZ2xfRnJhZ0Nvb3JkLnkpKTtcclxuXHJcbiAgICBpZiAocGl4ZWwgIT0gdV9pZClcclxuICAgICAgZGlzY2FyZDtcclxuXHJcbiAgICB1aW50IGljb2xvciA9IHVpbnQodV92Y3RDb2xvci5yICogMjU1LjApIDw8IDI0IHwgdWludCh1X3ZjdENvbG9yLmcgKiAyNTUuMCkgPDwgMTYgfCB1aW50KHVfdmN0Q29sb3IuYiAqIDI1NS4wKSA8PCA4IHwgdWludCh1X3ZjdENvbG9yLmEgKiAyNTUuMCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgIHZjdEZyYWcgPSBpdmVjNChmbG9hdEJpdHNUb0ludChnbF9GcmFnQ29vcmQueiksIGljb2xvciwgMCwgMCk7XHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFJlbmRlcnMgZm9yIFJheWNhc3RpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4qL1xyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247ICAgICAgIFxyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3O1xyXG5cclxudm9pZCBtYWluKCkgeyAgIFxyXG4gICAgZ2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFfdmN0UG9zaXRpb24sIDEuMCk7XHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrVGV4dHVyZWQuZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBpbnQgdV9pZDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0U2l6ZTtcclxuaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG5cclxub3V0IGl2ZWM0IHZjdEZyYWc7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgaW50IHBpeGVsID0gaW50KHRydW5jKGdsX0ZyYWdDb29yZC54KSArIHVfdmN0U2l6ZS54ICogdHJ1bmMoZ2xfRnJhZ0Nvb3JkLnkpKTtcclxuXHJcbiAgaWYgKHBpeGVsICE9IHVfaWQpXHJcbiAgICBkaXNjYXJkO1xyXG4gIFxyXG4gIHZlYzQgdmN0Q29sb3IgPSB1X3ZjdENvbG9yICogdGV4dHVyZSh1X3RleENvbG9yLCB2X3ZjdFRleHR1cmUpO1xyXG4gIHVpbnQgaWNvbG9yID0gdWludCh2Y3RDb2xvci5yICogMjU1LjApIDw8IDI0IHwgdWludCh2Y3RDb2xvci5nICogMjU1LjApIDw8IDE2IHwgdWludCh2Y3RDb2xvci5iICogMjU1LjApIDw8IDggfCB1aW50KHZjdENvbG9yLmEgKiAyNTUuMCk7XHJcbiAgXHJcbiAgdmN0RnJhZyA9IGl2ZWM0KGZsb2F0Qml0c1RvSW50KGdsX0ZyYWdDb29yZC56KSwgaWNvbG9yLCBmbG9hdEJpdHNUb0ludCh2X3ZjdFRleHR1cmUueCksIGZsb2F0Qml0c1RvSW50KHZfdmN0VGV4dHVyZS55KSk7XHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrVGV4dHVyZWQudmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbmluIHZlYzMgYV92Y3RQb3NpdGlvbjsgICAgICAgXHJcbmluIHZlYzIgYV92Y3RUZXh0dXJlO1xyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3O1xyXG51bmlmb3JtIG1hdDMgdV9tdHhQaXZvdDtcclxuXHJcbm91dCB2ZWMyIHZfdmN0VGV4dHVyZTtcclxuXHJcbnZvaWQgbWFpbigpIHsgICBcclxuICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICB2X3ZjdFRleHR1cmUgPSAodV9tdHhQaXZvdCAqIHZlYzMoYV92Y3RUZXh0dXJlLCAxLjApKS54eTtcclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclNjcmVlbi52ZXJ0XCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBmdWxsc2NyZWVuIHRyaWFuZ2xlIHdoaWNoIGNvdGFpbnMgdGhlIHNjcmVlbiBxdWFkIGFuZCBzZXRzIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFjY29yZGluZ2x5LlxyXG4gKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICpcclxuICogIDIgIDMgLlxyXG4gKiAgICAgICAuICAuXHJcbiAqICAgICAgIC4gICAgIC4gIFxyXG4gKiAgICAgICAuICAgICAgICAuXHJcbiAqICAxICAxIC4uLi4uLi4uLi4gIC5cclxuICogICAgICAgLiBzY3JlZW4gLiAgICAgLlxyXG4gKiAgICAgICAuICBxdWFkICAuICAgICAgICAuXHJcbiAqICAwIC0xIC4uLi4uLi4uLi4gIC4gIC4gIC4gIC5cclxuICogICAgcCAtMSAgICAgICAgMSAgICAgICAgICAgM1xyXG4gKiAgdCAgICAwICAgICAgICAxICAgICAgICAgICAyXHJcbiAqICBcclxuICogIHAgPT0gcG9zdGlvblxyXG4gKiAgdCA9PSB0ZXh0dXJlIGNvb3JkaW5hdGVcclxuICovXHJcblxyXG4vLyB1bmlmb3JtIHZlYzIgdV92Y3RSZXNvbHV0aW9uO1xyXG5cclxub3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuLy8gI2lmZGVmIFNBTVBMRVxyXG5cclxuLy8gICBmbGF0IG91dCB2ZWMyWzldIHZfdmN0T2Zmc2V0cztcclxuXHJcbi8vICNlbmRpZlxyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIGZsb2F0IHggPSBmbG9hdCgoZ2xfVmVydGV4SUQgJSAyKSAqIDQpOyAvLyAwLCA0LCAwXHJcbiAgZmxvYXQgeSA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAvIDIpICogNCk7IC8vIDAsIDAsIDRcclxuICBnbF9Qb3NpdGlvbiA9IHZlYzQoeCAtIDEuMCwgeSAtIDEuMCwgMC4wLCAxLjApOyAvLyAoLTEsIC0xKSwgKDMsIC0xKSwgKC0xLCAzKVxyXG4gIHZfdmN0VGV4dHVyZSA9IHZlYzIoeCAvIDIuMCwgeSAvIDIuMCk7ICAvLyAoMCwgMCksICgyLCAwKSwgKDAsIDIpIC0+IGludGVycG9sYXRpb24gd2lsbCB5aWVsZCAoMCwgMCksICgxLCAwKSwgKDAsIDEpIGFzIHRoZSBwb3NpdGlvbnMgYXJlIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuXHJcblxyXG4gIC8vICNpZmRlZiBTQU1QTEVcclxuXHJcbiAgLy8gICB2ZWMyIG9mZnNldCA9IHZlYzIoMS4wIC8gdV92Y3RSZXNvbHV0aW9uLngsIDEuMCAvIHVfdmN0UmVzb2x1dGlvbi55KTtcclxuICAvLyAgIHZfdmN0T2Zmc2V0cyA9IHZlYzJbXShcclxuICAvLyAgICAgdmVjMigtb2Zmc2V0LngsIG9mZnNldC55KSwgIHZlYzIoMC4wLCBvZmZzZXQueSksICB2ZWMyKG9mZnNldC54LCBvZmZzZXQueSksXHJcbiAgLy8gICAgIHZlYzIoLW9mZnNldC54LCAwLjApLCAgICAgICB2ZWMyKDAuMCwgMC4wKSwgICAgICAgdmVjMihvZmZzZXQueCwgMC4wKSxcclxuICAvLyAgICAgdmVjMigtb2Zmc2V0LngsIC1vZmZzZXQueSksIHZlYzIoMC4wLCAtb2Zmc2V0LnkpLCAgdmVjMihvZmZzZXQueCwgLW9mZnNldC55KVxyXG4gIC8vICAgKTtcclxuXHJcbiAgLy8gI2VuZGlmXHJcbn1gO1xyXG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJVbml2ZXJzYWwuZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogVW5pdmVyc2FsIFNoYWRlciBhcyBiYXNlIGZvciBtYW55IG90aGVycy4gQ29udHJvbGxlZCBieSBjb21waWxlciBkaXJlY3RpdmVzXHJcbiogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG4vLyBNSU5JTUFMXHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG51bmlmb3JtIHZlYzMgdV92Y3RDYW1lcmE7IC8vIG5lZWRlZCBmb3IgZm9nXHJcbnVuaWZvcm0gZmxvYXQgdV9mQWxwaGFDbGlwO1xyXG5cclxubGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBGb2cge1xyXG4gIGJvb2wgdV9iRm9nQWN0aXZlO1xyXG4gIGZsb2F0IHVfZkZvZ05lYXI7XHJcbiAgZmxvYXQgdV9mRm9nRmFyO1xyXG4gIGZsb2F0IGZvZ1BhZGRpbmc7IC8vIGFkZCBwYWRkaW5nIHRvIGFsaWduIHRvIDE2IGJ5dGVzXHJcbiAgdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG59O1xyXG5cclxuaW4gdmVjMyB2X3ZjdFBvc2l0aW9uO1xyXG5pbiB2ZWM0IHZfdmN0Q29sb3I7XHJcblxyXG5sYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB2Y3RGcmFnO1xyXG5sYXlvdXQobG9jYXRpb24gPSAxKSBvdXQgdmVjNCB2Y3RGcmFnUG9zaXRpb247IC8vIFRPRE86IG1ha2UgdGhlc2Ugb3B0aW9uYWw/XHJcbmxheW91dChsb2NhdGlvbiA9IDIpIG91dCB2ZWM0IHZjdEZyYWdOb3JtYWw7XHJcblxyXG4jaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gIGluIHZlYzMgdl92Y3ROb3JtYWw7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpXHJcblxyXG4gIGZsYXQgaW4gdmVjMyB2X3ZjdFBvc2l0aW9uRmxhdDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoR09VUkFVRClcclxuXHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZNZXRhbGxpYztcclxuICBpbiB2ZWMzIHZfdmN0RGlmZnVzZTtcclxuICBpbiB2ZWMzIHZfdmN0U3BlY3VsYXI7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFRPT04pXHJcblxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4VG9vbjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoUEhPTkcpIHx8IGRlZmluZWQoRkxBVClcclxuXHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZEaWZmdXNlO1xyXG4gIHVuaWZvcm0gZmxvYXQgdV9mU3BlY3VsYXI7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZNZXRhbGxpYztcclxuXHJcbiAgc3RydWN0IExpZ2h0IHtcclxuICAgIHZlYzQgdmN0Q29sb3I7XHJcbiAgICBtYXQ0IG10eFNoYXBlO1xyXG4gICAgbWF0NCBtdHhTaGFwZUludmVyc2U7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX0RJUkVDVElPTkFMID0gMTV1O1xyXG4gIGNvbnN0IHVpbnQgTUFYX0xJR0hUU19QT0lOVCA9IDEwMHU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1NQT1QgPSAxMDB1O1xyXG5cclxuICBsYXlvdXQoc3RkMTQwKSB1bmlmb3JtIExpZ2h0cyB7XHJcbiAgICB1aW50IHVfbkxpZ2h0c0RpcmVjdGlvbmFsO1xyXG4gICAgdWludCB1X25MaWdodHNQb2ludDtcclxuICAgIHVpbnQgdV9uTGlnaHRzU3BvdDtcclxuICAgIHVpbnQgbGlndGhzUGFkZGluZzsgLy8gQWRkIHBhZGRpbmcgdG8gYWxpZ24gdG8gMTYgYnl0ZXNcclxuICAgIExpZ2h0IHVfYW1iaWVudDtcclxuICAgIExpZ2h0IHVfZGlyZWN0aW9uYWxbTUFYX0xJR0hUU19ESVJFQ1RJT05BTF07XHJcbiAgICBMaWdodCB1X3BvaW50W01BWF9MSUdIVFNfUE9JTlRdO1xyXG4gICAgTGlnaHQgdV9zcG90W01BWF9MSUdIVFNfU1BPVF07XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogX3ZjdExpZ2h0OiBkaXJlY3Rpb24gZnJvbSBwb3NpdGlvbiB0byBsaWdodFxyXG4gICAqIF92Y3RWaWV3OiBkaXJlY3Rpb24gZnJvbSBwb3NpdGlvbiB0byBjYW1lcmFcclxuICAgKiBfdmN0Tm9ybWFsOiBzdXJmYWNlIG5vcm1hbCBhdCBwb3NpdGlvblxyXG4gICAqIF92Y3RDb2xvcjogY29sb3Igb2YgdGhlIGxpZ2h0XHJcbiAgICovXHJcbiAgdm9pZCBpbGx1bWluYXRlRGlyZWN0ZWQodmVjMyBfdmN0TGlnaHREaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXdEaXJlY3Rpb24sIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdExpZ2h0RGlyZWN0aW9uID0gbm9ybWFsaXplKF92Y3RMaWdodERpcmVjdGlvbik7XHJcblxyXG4gICAgZmxvYXQgZkRpZmZ1c2UgPSBkb3QoX3ZjdE5vcm1hbCwgdmN0TGlnaHREaXJlY3Rpb24pO1xyXG5cclxuICAgIGlmKGZEaWZmdXNlID4gMC4wKSB7XHJcblxyXG4gICAgICAjaWYgZGVmaW5lZChUT09OKVxyXG4gICAgICBcclxuICAgICAgICBmRGlmZnVzZSA9IHRleHR1cmUodV90ZXhUb29uLCB2ZWMyKGZEaWZmdXNlLCAwKSkucjtcclxuXHJcbiAgICAgICNlbmRpZlxyXG5cclxuICAgICAgX3ZjdERpZmZ1c2UgKz0gdV9mRGlmZnVzZSAqIGZEaWZmdXNlICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wIHx8IHVfZkludGVuc2l0eSA8PSAwLjApXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBcclxuICAgICAgLy9CTElOTi1QaG9uZyBTaGFkaW5nXHJcbiAgICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSh2Y3RMaWdodERpcmVjdGlvbiArIF92Y3RWaWV3RGlyZWN0aW9uKTtcclxuICAgICAgZmxvYXQgZmFjdG9yID0gZkRpZmZ1c2U7ICAgICAgICAgICAgICAgICAgLy8gRmFjdG9yIGZvciBzbW9vdGhpbmcgb3V0IHRyYW5zaXRpb24gZnJvbSBzdXJmYWNlIGZhY2luZyB0aGUgbGlnaHRzb3VyY2UgdG8gc3VyZmFjZSBmYWNpbmcgYXdheSBmcm9tIHRoZSBsaWdodHNvdXJjZVxyXG4gICAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAvLyBUaGUgZmFjdG9yIGlzIGFsdGVyZWQgaW4gb3JkZXIgdG8gY2xlYXJseSBzZWUgdGhlIHNwZWN1bGFyIGhpZ2hsaWdodCBldmVuIGF0IHN0ZWVwIGFuZ2xlcywgd2hpbGUgc3RpbGwgcHJldmVudGluZyBhcnRpZmFjdHNcclxuXHJcbiAgICAgIGZsb2F0IGZTcGVjdWxhciA9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiBmYWN0b3I7IC8vIFRPRE86IHJlbW92ZSBtYWdpYyBudW1iZXJzP1xyXG5cclxuICAgICAgI2lmIGRlZmluZWQoVE9PTilcclxuICAgICAgICBcclxuICAgICAgICBmU3BlY3VsYXIgPSB0ZXh0dXJlKHVfdGV4VG9vbiwgdmVjMihmU3BlY3VsYXIsIDAuMCkpLmcgKiBmRGlmZnVzZTtcclxuXHJcbiAgICAgICNlbmRpZlxyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IGZTcGVjdWxhciAqIHVfZkludGVuc2l0eSAqIF92Y3RDb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFRFWFRVUkUpIHx8IGRlZmluZWQoTUFUQ0FQKVxyXG5cclxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG4gIGluIHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9ybWFsO1xyXG4gIGluIHZlYzMgdl92Y3RUYW5nZW50O1xyXG4gIGluIHZlYzMgdl92Y3RCaXRhbmdlbnQ7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG5cclxuICB1bmlmb3JtIGludCB1X2lCbGVuZE1vZGU7XHJcblxyXG4jZW5kaWZcclxuXHJcbmZsb2F0IGdldEZvZyh2ZWMzIF92Y3RQb3NpdGlvbikge1xyXG4gIGZsb2F0IGZEaXN0YW5jZSA9IGxlbmd0aChfdmN0UG9zaXRpb24gLSB1X3ZjdENhbWVyYSk7IC8vIG1heWJlIHVzZSB6LWRlcHRoIGluc3RlYWQgb2YgZXVjbGlkZWFuIGRlcHRoXHJcbiAgZmxvYXQgZkZvZyA9IGNsYW1wKChmRGlzdGFuY2UgLSB1X2ZGb2dOZWFyKSAvICh1X2ZGb2dGYXIgLSB1X2ZGb2dOZWFyKSwgMC4wLCAxLjApO1xyXG4gIGZGb2cgPSAtcG93KGZGb2csIDIuMCkgKyAoMi4wICogZkZvZyk7IC8vIGxldHMgZm9nIGFwcGVhciBxdWlja2VyIGFuZCBmYWxsIG9mZiBzbG93ZXIgcmVzdWx0cyBpbiBhIG1vcmUgZ3JhZHVhbCBmYWxsb2ZmXHJcbiAgcmV0dXJuIGZGb2cgKiB1X3ZjdEZvZ0NvbG9yLmE7XHJcbn1cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcbiAgI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgICB2ZWMzIHZjdEZkeCA9IGRGZHgodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdEZkeSA9IGRGZHkodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RGZHgsIHZjdEZkeSkpO1xyXG4gICAgdmVjMyB2Y3RWaWV3RGlyZWN0aW9uID0gbm9ybWFsaXplKHVfdmN0Q2FtZXJhIC0gdl92Y3RQb3NpdGlvbkZsYXQpO1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbiA9IHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIChkZWZpbmVkKFBIT05HKSB8fCBkZWZpbmVkKEdPVVJBVUQpKSAmJiAhZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBub3JtYWxpemUodl92Y3ROb3JtYWwpO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmVjMyB2Y3RWaWV3RGlyZWN0aW9uID0gbm9ybWFsaXplKHVfdmN0Q2FtZXJhIC0gdl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uID0gdl92Y3RQb3NpdGlvbjtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgICBtYXQzIG10eFRCTiA9IG1hdDMobm9ybWFsaXplKHZfdmN0VGFuZ2VudCksIG5vcm1hbGl6ZSh2X3ZjdEJpdGFuZ2VudCksIG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCkpO1xyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSB0ZXh0dXJlKHVfdGV4Tm9ybWFsLCB2X3ZjdFRleHR1cmUpLnh5eiAqIDIuMCAtIDEuMDtcclxuICAgIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZShtdHhUQk4gKiB2Y3ROb3JtYWwpO1xyXG5cclxuICAjZW5kaWZcclxuICBcclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICAgIHZlYzMgdmN0RGlmZnVzZSA9IHVfZkRpZmZ1c2UgKiB1X2FtYmllbnQudmN0Q29sb3IucmdiO1xyXG4gICAgdmVjMyB2Y3RTcGVjdWxhciA9IHZlYzMoMCwgMCwgMCk7XHJcblxyXG4gICAgLy8gZGlyZWN0aW9uYWwgbGlnaHRzXHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSsrKSB7XHJcbiAgICAgIHZlYzMgdmN0TGlnaHREaXJlY3Rpb24gPSB2ZWMzKHVfZGlyZWN0aW9uYWxbaV0ubXR4U2hhcGUgKiB2ZWM0KDAuMCwgMC4wLCAtMS4wLCAxLjApKTtcclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdExpZ2h0RGlyZWN0aW9uLCB2Y3RWaWV3RGlyZWN0aW9uLCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcG9pbnQgbGlnaHRzXHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNQb2ludDsgaSsrKSB7XHJcbiAgICAgIHZlYzMgdmN0TGlnaHRQb3NpdGlvbiA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0TGlnaHREaXJlY3Rpb24gPSB2Y3RMaWdodFBvc2l0aW9uIC0gdmN0UG9zaXRpb247XHJcbiAgICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBsZW5ndGgobWF0Myh1X3BvaW50W2ldLm10eFNoYXBlSW52ZXJzZSkgKiB2Y3RMaWdodERpcmVjdGlvbik7XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0TGlnaHREaXJlY3Rpb24sIHZjdFZpZXdEaXJlY3Rpb24sIHZjdE5vcm1hbCwgdV9wb2ludFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BvdCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c1Nwb3Q7IGkrKykge1xyXG4gICAgICB2ZWMzIHZjdExpZ2h0UG9zaXRpb24gPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0TGlnaHREaXJlY3Rpb24gPSB2Y3RMaWdodFBvc2l0aW9uIC0gdmN0UG9zaXRpb247XHJcbiAgICAgIHZlYzMgdmN0TGlnaHREaXJlY3Rpb25JbnZlcnRlZCA9IG1hdDModV9zcG90W2ldLm10eFNoYXBlSW52ZXJzZSkgKiAtdmN0TGlnaHREaXJlY3Rpb247XHJcbiAgICAgIGlmKHZjdExpZ2h0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbWluKDEuMCwgMi4wICogbGVuZ3RoKHZjdExpZ2h0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0TGlnaHREaXJlY3Rpb25JbnZlcnRlZC56KTsgICAgLy8gQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgICBmSW50ZW5zaXR5ICo9IDEuMCAtIHBvdyh2Y3RMaWdodERpcmVjdGlvbkludmVydGVkLnosIDIuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgaGFyc2ggbGlnaHRpbmcgYXJ0aWZhY3RzIGF0IGJvdW5kYXJ5IG9mIHRoZSBnaXZlbiBzcG90bGlnaHRcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3RMaWdodERpcmVjdGlvbiwgdmN0Vmlld0RpcmVjdGlvbiwgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gICAgfVxyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjNCB2Y3RDb2xvciA9IHVfdmN0Q29sb3IgKiB2X3ZjdENvbG9yO1xyXG5cclxuICAjaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICAgIHZlYzMgdmN0RGlmZnVzZSA9IHZfdmN0RGlmZnVzZTtcclxuICAgIHZlYzMgdmN0U3BlY3VsYXIgPSB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICAgIHZjdEZyYWcucmdiID0gdmN0RGlmZnVzZSArIHZjdFNwZWN1bGFyICogdV9mTWV0YWxsaWM7XHJcbiAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNlbHNlXHJcblxyXG4gICAgLy8gTUlOSU1BTDogc2V0IHRoZSBiYXNlIGNvbG9yXHJcbiAgICB2Y3RGcmFnID0gdmN0Q29sb3I7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKSB8fCBkZWZpbmVkKE1BVENBUClcclxuICAgIFxyXG4gICAgLy8gVEVYVFVSRTogbXVsdGlwbHkgd2l0aCB0ZXhlbCBjb2xvclxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7IC8vIGhhcyBwcmVtdWx0aXBsaWVkIGFscGhhIGJ5IHdlYmdsIGZvciBjb3JyZWN0IGZpbHRlcmluZ1xyXG4gICAgaWYgKHZjdENvbG9yVGV4dHVyZS5hID4gMC4wKSAvLyB1bnByZW11bHRpcGx5IGFscGhhXHJcbiAgICAgIHZjdENvbG9yVGV4dHVyZS5yZ2IgLz0gdmN0Q29sb3JUZXh0dXJlLmE7IFxyXG4gICAgdmN0RnJhZyAqPSB2Y3RDb2xvclRleHR1cmU7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmN0RnJhZyAqPSB2Y3RDb2xvcjtcclxuICAgIHZjdEZyYWcucmdiICs9IHZjdFNwZWN1bGFyICogKDEuMCAtIHVfZk1ldGFsbGljKTtcclxuXHJcbiAgICB2Y3RGcmFnUG9zaXRpb24gPSB2ZWM0KHZfdmN0UG9zaXRpb24sIDEuMCk7XHJcbiAgICB2Y3RGcmFnTm9ybWFsID0gdmVjNCh2Y3ROb3JtYWwsIDEuMCk7XHJcbiAgXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiAhZGVmaW5lZChQSE9ORykgJiYgIWRlZmluZWQoRkxBVCkgJiYgIWRlZmluZWQoR09VUkFVRCkgLy8gTUlOSU1BTFxyXG5cclxuICAgIHZjdEZyYWdQb3NpdGlvbiA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTsgLy8gKDAsIDAsIDApIHdpbGwgdHJlYXQgb2NjbHVkZXJzIGFzIG5vbiBleGlzdGluZyBpbiBzc2FvXHJcbiAgICB2Y3RGcmFnTm9ybWFsID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApOyAvLyAoMCwgMCwgMCkgbm9ybWFsIHdpbGwgeWllbGQgbm90IG9jY2x1c2lvbiBpbiBzc2FvXHJcbiAgXHJcbiAgI2VuZGlmXHJcblxyXG4gIC8vIGRpc2NhcmQgcGl4ZWwgYWxsdG9nZXRoZXIgd2hlbiB0cmFuc3BhcmVudDogZG9uJ3Qgc2hvdyBpbiBaLUJ1ZmZlclxyXG4gIGlmKHZjdEZyYWcuYSA8IHVfZkFscGhhQ2xpcClcclxuICAgIGRpc2NhcmQ7XHJcblxyXG4gIGlmICh1X2JGb2dBY3RpdmUpIHtcclxuICAgIGZsb2F0IGZGb2cgPSBnZXRGb2codl92Y3RQb3NpdGlvbik7XHJcbiAgICB2Y3RGcmFnLnJnYiA9IG1peCh2Y3RGcmFnLnJnYiwgdV92Y3RGb2dDb2xvci5yZ2IsIGZGb2cpO1xyXG5cclxuICAgICNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG5cclxuICAgICAgaWYgKHVfaUJsZW5kTW9kZSA9PSAyIHx8IHVfaUJsZW5kTW9kZSA9PSAzIHx8IHVfaUJsZW5kTW9kZSA9PSA0KSAgLy8gZm9yIGJsZW5kIGFkZGl0aXZlLCBzdWJ0cmFjdGl2ZSwgbW9kdWxhdGVcclxuICAgICAgICB2Y3RGcmFnLmEgPSBtaXgodmN0RnJhZy5hLCAwLjAsIGZGb2cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFkZSBvdXQgcGFydGljbGUgd2hlbiBpbiBmb2cgdG8gbWFrZSBpdCBkaXNhcHBlYXIgY29tcGxldGVseVxyXG5cclxuICAgICNlbmRpZlxyXG4gIH1cclxufWA7XHJcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC52ZXJ0XCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyAyMDIxLCBMdWlzIEtlY2ssIEhGVSwgMjAyMSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvV29ybGQ7IC8vIG5lZWRlZCBmb3IgRk9HXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgYV92Y3RDb2xvcjsgLy8gVE9ETzogdGhpbmsgYWJvdXQgbWFraW5nIHZlcnRleCBjb2xvciBvcHRpb25hbFxyXG5cclxub3V0IHZlYzMgdl92Y3RQb3NpdGlvbjtcclxub3V0IHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChQQVJUSUNMRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhOb3JtYWxNZXNoVG9Xb3JsZDtcclxuXHJcbiAgaW4gdmVjMyBhX3ZjdE5vcm1hbDtcclxuICBvdXQgdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBvdXQgdmVjMyB2X3ZjdFBvc2l0aW9uRmxhdDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoR09VUkFVRClcclxuXHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZEaWZmdXNlO1xyXG4gIHVuaWZvcm0gZmxvYXQgdV9mU3BlY3VsYXI7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcblxyXG4gIG91dCB2ZWMzIHZfdmN0RGlmZnVzZTtcclxuICBvdXQgdmVjMyB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICAgIGZsb2F0IGZJbGx1bWluYXRpb24gPSAtZG90KF92Y3ROb3JtYWwsIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICAgIF92Y3REaWZmdXNlICs9IHVfZkRpZmZ1c2UgKiBmSWxsdW1pbmF0aW9uICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vQkxJTk5cclxuICAgICAgdmVjMyBoYWxmd2F5RGlyID0gbm9ybWFsaXplKC12Y3REaXJlY3Rpb24gLSBfdmN0Vmlldyk7XHJcbiAgICAgIGZsb2F0IGZhY3RvciA9IG1heChkb3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCksIDAuMCk7IC8vRmFjdG9yIGZvciBzbW9vdGhpbmcgb3V0IHRyYW5zaXRpb24gZnJvbSBzdXJmYWNlIGZhY2luZyB0aGUgbGlnaHRzb3VyY2UgdG8gc3VyZmFjZSBmYWNpbmcgYXdheSBmcm9tIHRoZSBsaWdodHNvdXJjZVxyXG4gICAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiB1X2ZTcGVjdWxhciAqIHVfZkludGVuc2l0eSAqIGZhY3RvciAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICAgIC8vUEhPTkcgKG9sZClcclxuICAgICAgLy8gdmVjMyB2Y3RSZWZsZWN0aW9uID0gbm9ybWFsaXplKHJlZmxlY3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCkpO1xyXG4gICAgICAvLyBmbG9hdCBmSGl0Q2FtZXJhID0gZG90KHZjdFJlZmxlY3Rpb24sIF92Y3RWaWV3KTtcclxuICAgICAgLy8gX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZkhpdENhbWVyYSwgMC4wKSwgdV9mU3BlY3VsYXIgKiAxMC4wKSAqIHVfZlNwZWN1bGFyICogX3ZjdENvbG9yOyAvLyAxMC4wID0gbWFnaWMgbnVtYmVyLCBsb29rcyBnb29kLi4uIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gIHVuaWZvcm0gbWF0MyB1X210eFBpdm90O1xyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgaW4gdmVjNCBhX3ZjdFRhbmdlbnQ7XHJcbiAgb3V0IHZlYzMgdl92Y3RUYW5nZW50O1xyXG4gIG91dCB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBNQVRDQVA6IG9mZmVyIGJ1ZmZlcnMgZm9yIFVWcyBhbmQgcGl2b3QgbWF0cml4XHJcbiNpZiBkZWZpbmVkKE1BVENBUCkgLy8gTWF0Q2FwLXNoYWRlciBnZW5lcmF0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyBmcm9tIHN1cmZhY2Ugbm9ybWFsc1xyXG4gIFxyXG4gIHVuaWZvcm0gbWF0NCB1X210eFdvcmxkVG9DYW1lcmE7XHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gIGluIHZlYzMgYV92Y3ROb3JtYWw7XHJcbiAgb3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAvLyBCb25lcyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvZGV2L3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzXHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4V29ybGRUb1ZpZXc7XHJcbiAgaW4gdXZlYzQgYV92Y3RCb25lcztcclxuICBpbiB2ZWM0IGFfdmN0V2VpZ2h0cztcclxuXHJcbiAgY29uc3QgdWludCBNQVhfQk9ORVMgPSAyNTZ1OyAvLyBDQVVUSU9OOiB0aGlzIG51bWJlciBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIFJlbmRlckluamVjdG9yU2tlbGV0b25JbnN0YW5jZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBidWZmZXJzIGFyZSBjcmVhdGVkXHJcbiAgbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBTa2luIHtcclxuICAgIG1hdDQgdV9tdHhCb25lc1tNQVhfQk9ORVNdO1xyXG4gIH07XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhXb3JsZFRvVmlldztcclxuICB1bmlmb3JtIGZsb2F0IHVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb247XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVNpemU7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVRpbWU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnM7XHJcbiAgdW5pZm9ybSBib29sIHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYTtcclxuICB1bmlmb3JtIGJvb2wgdV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdDtcclxuXHJcbiAgbWF0NCBsb29rQXQodmVjMyBfdmN0VHJhbnNsYXRpb24sIHZlYzMgX3ZjdFRhcmdldCkge1xyXG4gICAgdmVjMyB2Y3RVcCA9IHZlYzMoMC4wLCAxLjAsIDAuMCk7XHJcbiAgICB2ZWMzIHpBeGlzID0gbm9ybWFsaXplKF92Y3RUYXJnZXQgLSBfdmN0VHJhbnNsYXRpb24pO1xyXG4gICAgdmVjMyB4QXhpcyA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RVcCwgekF4aXMpKTtcclxuICAgIHZlYzMgeUF4aXMgPSB1X2JQYXJ0aWNsZVN5c3RlbVJlc3RyaWN0ID8gdmN0VXAgOiBub3JtYWxpemUoY3Jvc3MoekF4aXMsIHhBeGlzKSk7XHJcbiAgICB6QXhpcyA9IHVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3QgPyBub3JtYWxpemUoY3Jvc3MoeEF4aXMsIHZjdFVwKSkgOiB6QXhpcztcclxuXHJcbiAgICByZXR1cm4gbWF0NCh4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLjAsIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAuMCwgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMC4wLCBfdmN0VHJhbnNsYXRpb24ueCwgX3ZjdFRyYW5zbGF0aW9uLnksIF92Y3RUcmFuc2xhdGlvbi56LCAxLjApO1xyXG4gIH1cclxuXHJcbiAgZmxvYXQgZmV0Y2hSYW5kb21OdW1iZXIoaW50IF9pT2Zmc2V0LCBpbnQgX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplLCBpbnQgX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNMZW5ndGgpIHtcclxuICAgIF9pT2Zmc2V0ID0gZ2xfSW5zdGFuY2VJRCArIF9pT2Zmc2V0ICUgX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNMZW5ndGg7XHJcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCh1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVycywgaXZlYzIoX2lPZmZzZXQgJSBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIF9pT2Zmc2V0IC8gX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplKSwgMCkucjtcclxuICB9XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcbiAgdmVjNCB2Y3RQb3NpdGlvbiA9IHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICBtYXQ0IG10eE1lc2hUb1dvcmxkID0gdV9tdHhNZXNoVG9Xb3JsZDtcclxuICBtYXQ0IG10eE1lc2hUb1ZpZXcgPSB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgLy8gb25seSB0aGVzZSB3b3JrIHdpdGggcGFydGljbGUgYW5kIHNraW5uaW5nXHJcblxyXG4gICAgbWF0NCBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRSlcclxuICBcclxuICAgIGZsb2F0IGZQYXJ0aWNsZUlkID0gZmxvYXQoZ2xfSW5zdGFuY2VJRCk7XHJcbiAgICBpbnQgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgPSB0ZXh0dXJlU2l6ZSh1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVycywgMCkueDsgLy8gdGhlIGRpbWVuc2lvbiBvZiB0aGUgcXVhZHJhdGljIHRleHR1cmVcclxuICAgIGludCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzTGVuZ3RoID0gaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgKiBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZTsgLy8gdGhlIHRvdGFsIG51bWJlciBvZiB0ZXhlbHMgaW4gdGhlIHRleHR1cmVcclxuICAgIC8qJHZhcmlhYmxlcyovXHJcbiAgICAvKiRtdHhMb2NhbCovXHJcbiAgICAvKiRtdHhXb3JsZCovXHJcbiAgICBtdHhNZXNoVG9Xb3JsZCA9IC8qJG10eFdvcmxkKi8gbXR4TWVzaFRvV29ybGQgLyokbXR4TG9jYWwqLztcclxuICAgIGlmKHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYSkgbXR4TWVzaFRvV29ybGQgPSBsb29rQXQodmVjMyhtdHhNZXNoVG9Xb3JsZFszXVswXSwgbXR4TWVzaFRvV29ybGRbM11bMV0sIG10eE1lc2hUb1dvcmxkWzNdWzJdKSwgdV92Y3RDYW1lcmEpICpcclxuICAgICAgbWF0NChsZW5ndGgodmVjMyhtdHhNZXNoVG9Xb3JsZFswXVswXSwgbXR4TWVzaFRvV29ybGRbMV1bMF0sIG10eE1lc2hUb1dvcmxkWzJdWzBdKSksIDAuMCwgMC4wLCAwLjAsIDAuMCwgbGVuZ3RoKHZlYzMobXR4TWVzaFRvV29ybGRbMF1bMV0sIG10eE1lc2hUb1dvcmxkWzFdWzFdLCBtdHhNZXNoVG9Xb3JsZFsyXVsxXSkpLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGxlbmd0aCh2ZWMzKG10eE1lc2hUb1dvcmxkWzBdWzJdLCBtdHhNZXNoVG9Xb3JsZFsxXVsyXSwgbXR4TWVzaFRvV29ybGRbMl1bMl0pKSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjApO1xyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAgIG10eE1lc2hUb1dvcmxkID0gYV92Y3RXZWlnaHRzLnggKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMueF0gK1xyXG4gICAgICBhX3ZjdFdlaWdodHMueSAqIHVfbXR4Qm9uZXNbYV92Y3RCb25lcy55XSArXHJcbiAgICAgIGFfdmN0V2VpZ2h0cy56ICogdV9tdHhCb25lc1thX3ZjdEJvbmVzLnpdICtcclxuICAgICAgYV92Y3RXZWlnaHRzLncgKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMud107XHJcblxyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICBnbF9Qb3NpdGlvbiA9IG10eE1lc2hUb1ZpZXcgKiB2Y3RQb3NpdGlvbjsgXHJcbiAgdmN0UG9zaXRpb24gPSBtdHhNZXNoVG9Xb3JsZCAqIHZjdFBvc2l0aW9uO1xyXG5cclxuICB2X3ZjdENvbG9yID0gYV92Y3RDb2xvcjtcclxuICB2X3ZjdFBvc2l0aW9uID0gdmN0UG9zaXRpb24ueHl6O1xyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRV9DT0xPUilcclxuXHJcbiAgICB2X3ZjdENvbG9yICo9IC8qJGNvbG9yKi87XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZfdmN0UG9zaXRpb25GbGF0ID0gdl92Y3RQb3NpdGlvbjtcclxuICAgIFxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdl92Y3ROb3JtYWwgPSBtYXQzKG10eE5vcm1hbE1lc2hUb1dvcmxkKSAqIGFfdmN0Tm9ybWFsOyAvLyB1bm5vcm1hbGl6ZWQgYXMgaXQgbXVzdCBiZSBub3JtYWxpemVkIGluIHRoZSBmcmFnbWVudCBzaGFkZXIgYW55d2F5XHJcblxyXG4gICNlbmRpZiBcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGFuZ2VudCA9IG1hdDMobXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3RUYW5nZW50Lnh5ejtcclxuICAgIHZfdmN0Qml0YW5nZW50ID0gY3Jvc3Modl92Y3ROb3JtYWwsIHZfdmN0VGFuZ2VudCkgKiBhX3ZjdFRhbmdlbnQudztcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEdPVVJBVUQpXHJcbiAgXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodmN0UG9zaXRpb24ueHl6IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBub3JtYWxpemUodl92Y3ROb3JtYWwpO1xyXG4gICAgdl92Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2X3ZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgZGlyZWN0aW9uYWwgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSArKykge1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9kaXJlY3Rpb25hbFtpXS52Y3RDb2xvci5yZ2IsIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHBvaW50IGxpZ2h0IGVmZmVjdFxyXG4gICAgZm9yKHVpbnQgaSA9IDB1O2kgPCB1X25MaWdodHNQb2ludDtpICsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3BvaW50W2ldLnZjdENvbG9yLnJnYiAqIGZJbnRlbnNpdHksIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7aSA8IHVfbkxpZ2h0c1Nwb3Q7aSArKykge1xyXG4gICAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb25JbnZlcnRlZCA9IG1hdDModV9zcG90W2ldLm10eFNoYXBlSW52ZXJzZSkgKiB2Y3REaXJlY3Rpb247XHJcbiAgICAgIGlmKHZjdERpcmVjdGlvbkludmVydGVkLnogPD0gMC4wKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgICBmSW50ZW5zaXR5ICo9IDEuMCAtIHBvdyh2Y3REaXJlY3Rpb25JbnZlcnRlZC56LCAyLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1ByZXZlbnRzIGhhcnNoIGxpZ2h0aW5nIGFydGlmYWN0cyBhdCBib3VuZGFyeSBvZiB0aGUgZ2l2ZW4gc3BvdGxpZ2h0XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdl92Y3REaWZmdXNlLCB2X3ZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICAgLy8gVEVYVFVSRTogdHJhbnNmb3JtIFVWc1xyXG4gICNpZiBkZWZpbmVkKFRFWFRVUkUpIHx8IGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGV4dHVyZSA9IHZlYzIodV9tdHhQaXZvdCAqIHZlYzMoYV92Y3RUZXh0dXJlLCAxLjApKS54eTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKE1BVENBUClcclxuXHJcbiAgICB2ZWM0IHZjdFZlcnRleEluQ2FtZXJhID0gbm9ybWFsaXplKHVfbXR4V29ybGRUb0NhbWVyYSAqIHZjdFBvc2l0aW9uKTtcclxuICAgIHZjdFZlcnRleEluQ2FtZXJhLnh5ICo9IC0gMS4wO1xyXG4gICAgbWF0NCBtdHhfUm90WCA9IG1hdDQoMSwgMCwgMCwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgdmN0VmVydGV4SW5DYW1lcmEueSwgMCwgMCwgLSB2Y3RWZXJ0ZXhJbkNhbWVyYS55LCB2Y3RWZXJ0ZXhJbkNhbWVyYS56LCAwLCAwLCAwLCAwLCAxKTtcclxuICAgIG1hdDQgbXR4X1JvdFkgPSBtYXQ0KHZjdFZlcnRleEluQ2FtZXJhLnosIDAsIC0gdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgMCwgMSwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgMCwgMCwgMCwgMCwgMSk7XHJcblxyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBtYXQzKHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3ROb3JtYWw7XHJcblxyXG4gICAgLy8gYWRkcyBjb3JyZWN0aW9uIGZvciB0aGluZ3MgYmVpbmcgZmFyIGFuZCB0byB0aGUgc2lkZSwgYnV0IGRpc3RvcnRpb24gZm9yIHRoaW5ncyBiZWluZyBjbG9zZVxyXG4gICAgdmN0Tm9ybWFsID0gbWF0MyhtdHhfUm90WCAqIG10eF9Sb3RZKSAqIHZjdE5vcm1hbDtcclxuXHJcbiAgICB2ZWMzIHZjdFJlZmxlY3Rpb24gPSBub3JtYWxpemUobWF0Myh1X210eFdvcmxkVG9DYW1lcmEpICogbm9ybWFsaXplKHZjdE5vcm1hbCkpO1xyXG4gICAgdmN0UmVmbGVjdGlvbi55ID0gLSB2Y3RSZWZsZWN0aW9uLnk7XHJcblxyXG4gICAgdl92Y3RUZXh0dXJlID0gMC41ICogdmN0UmVmbGVjdGlvbi54eSArIDAuNTtcclxuXHJcbiAgI2VuZGlmXHJcbn1gO1xyXG5cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29hdC9Db2F0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIGFjY2VzcyBkYXRhIGZyb20gYSBXZWJHbCBzaGFkZXJwcm9ncmFtLiBcclxuICAgKiBUaGlzIHNob3VsZCBhbHdheXMgbWlycm9yIHRoZSAoc3RhdGljKSBpbnRlcmZhY2Ugb2Yge0BsaW5rIFNoYWRlcn0uIEl0IGV4cG9zZXMgdGhlIHN0YXRpYyBtZW1iZXJzIG9mIFNoYWRlciBpbiBhbiBpbnN0YW5jZS1iYXNlZCB3YXkuIGUuZy46XHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZTtcclxuICAgKiBgYGBcclxuICAgKiBjYW4gdGFrZSB2YWx1ZXMgb2YgdHlwZSBcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogdHlwZW9mIFNoYWRlciB8IFNoYWRlckludGVmYWNlXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBTaGFkZXJJbnRlcmZhY2Uge1xyXG4gICAgZGVmaW5lOiBzdHJpbmdbXTtcclxuICAgIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIGF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9O1xyXG4gICAgdW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH07XHJcbiAgICAvKiogUmV0dXJucyB0aGUgdmVydGV4IHNoYWRlciBzb3VyY2UgY29kZSBmb3IgdGhlIHJlbmRlciBlbmdpbmUgKi9cclxuICAgIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmc7XHJcbiAgICAvKiogUmV0dXJucyB0aGUgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSBkZWNvcmF0b3IuIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBkZWxldGVQcm9ncmFtKHRoaXM6IFNoYWRlckludGVyZmFjZSk6IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IGRlY29yYXRvci4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS4gKi9cclxuICAgIHVzZVByb2dyYW0odGhpczogU2hhZGVySW50ZXJmYWNlKTogdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgSW5qZWN0ZWQgYnkgZGVjb3JhdG9yLiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgY3JlYXRlUHJvZ3JhbSh0aGlzOiBTaGFkZXJJbnRlcmZhY2UpOiB2b2lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhdGljIHN1cGVyY2xhc3MgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBXZWJHbCBzaGFkZXJwcm9ncmFtcy4gXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIC8vIFRPRE86IGRlZmluZSBhdHRyaWJ1dGUvdW5pZm9ybXMgYXMgbGF5b3V0IGFuZCB1c2UgdGhvc2UgY29uc2lzdGVudGx5IGluIHNoYWRlcnNcclxuICBAUmVuZGVySW5qZWN0b3JTaGFkZXIuZGVjb3JhdGVcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyIHtcclxuICAgIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIFNoYWRlciA9IFNoYWRlcjtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIFNoYWRlcltdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyB2ZXJ0ZXhTaGFkZXJTb3VyY2U6IHN0cmluZztcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgICBwdWJsaWMgc3RhdGljIHVuaWZvcm1zOiB7IFtuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB9O1xyXG5cclxuICAgIC8qKiBUaGUgdHlwZSBvZiBjb2F0IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGlzIHNoYWRlciB0byBjcmVhdGUgYSBtYXRlcmlhbCAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRDb2xvcmVkOyB9XHJcbiAgICAvKiogUmV0dXJucyB0aGUgdmVydGV4IHNoYWRlciBzb3VyY2UgY29kZSBmb3IgdGhlIHJlbmRlciBlbmdpbmUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC52ZXJ0XCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgICAvKiogUmV0dXJucyB0aGUgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJVbml2ZXJzYWwuZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJ9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGVQcm9ncmFtKHRoaXM6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJ9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyB1c2VQcm9ncmFtKHRoaXM6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJ9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqLyAvLyBUT0RPOiBtYXliZSBkb24ndCBmbGFnIHRoaXMgYXMgaW50ZXJuYWwsIHNvIHNoYWRlcnMgY2FuIGJlIHByZWNvbXBpbGVkIGluIGZ1dHVyZSBGVURHRSBhcHBzLiBPciBjcmVhdGUgYW4gQVBJIHRvIHByZWNvbXBpbGUgc2hhZGVycywgbG9hZCB0ZXh0dXJlcyBldGMuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJjbGFzczogdHlwZW9mIFNoYWRlcik6IG51bWJlciB7IHJldHVybiBTaGFkZXIuc3ViY2xhc3Nlcy5wdXNoKF9zdWJjbGFzcykgLSAxOyB9XHJcblxyXG4gICAgLy8gcmVwbGFjZSB0aGUgbWFuZGF0b3J5IGhlYWRlciBvZiB0aGUgc2hhZGVyIHdpdGggaXRzZWxmIHBsdXMgdGhlIGRlZmluaXRpb25zIGdpdmVuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluc2VydERlZmluZXMoX3NoYWRlcjogc3RyaW5nLCBfZGVmaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICBpZiAoIV9kZWZpbmVzKVxyXG4gICAgICAgIHJldHVybiBfc2hhZGVyO1xyXG5cclxuICAgICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiI3ZlcnNpb24gMzAwIGVzXFxuXCI7XHJcbiAgICAgIGZvciAobGV0IGRlZmluZSBvZiBfZGVmaW5lcylcclxuICAgICAgICBjb2RlICs9IGAjZGVmaW5lICR7ZGVmaW5lfVxcbmA7XHJcblxyXG4gICAgICByZXR1cm4gX3NoYWRlci5yZXBsYWNlKFwiI3ZlcnNpb24gMzAwIGVzXCIsIGNvZGUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJBbWJpZW50T2NjbHVzaW9uIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclNjcmVlbi52ZXJ0XCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJBbWJpZW50T2NjbHVzaW9uLmZyYWdcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyQmxvb20gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckJsb29tLmZyYWdcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdCk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZTsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJGbGF0U2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJGTEFUXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckZsYXRUZXh0dXJlZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdFRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiRkxBVFwiLFxyXG4gICAgICBcIlRFWFRVUkVcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckZsYXRUZXh0dXJlZFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckZsYXRUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJGTEFUXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdpem1vIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLmZyYWdcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR2l6bW9UZXh0dXJlZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXCJURVhUVVJFXCJdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLmZyYWdcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZCk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZTsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHb3VyYXVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJHT1VSQVVEXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdvdXJhdWRUZXh0dXJlZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZFRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiR09VUkFVRFwiLFxyXG4gICAgICBcIlRFWFRVUkVcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdvdXJhdWRUZXh0dXJlZFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckdvdXJhdWRUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJHT1VSQVVEXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyTGl0KTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJMaXRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXRTa2luKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXRUZXh0dXJlZCk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlRFWFRVUkVcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyTGl0VGV4dHVyZWRTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlck1hdENhcCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyTWF0Q2FwKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiTUFUQ0FQXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZyBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmcpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclBob25nU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdUZXh0dXJlZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZCk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiTk9STUFMTUFQXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHM7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHNTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFsc1NraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJOT1JNQUxNQVBcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHM7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclBob25nVGV4dHVyZWRTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGljayBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGljay52ZXJ0XCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLmZyYWdcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGlja1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC52ZXJ0XCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrVGV4dHVyZWQuZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uOyB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyVG9vblNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclRvb25Ta2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VG9vbjsgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclRvb25UZXh0dXJlZCBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyVG9vblRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VG9vblRleHR1cmVkOyB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyVG9vblRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyVG9vblRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCIsXHJcbiAgICAgIFwiVE9PTlwiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZURlZmF1bHQgZXh0ZW5kcyBUZXh0dXJlQmFzZTY0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY29sb3I6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlRGVmYXVsdFwiLCBUZXh0dXJlRGVmYXVsdC5nZXRDb2xvcigpLCBNSVBNQVAuTUVESVVNKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiVGV4dHVyZU5vcm1hbERlZmF1bHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0Tm9ybWFsKCksIE1JUE1BUC5NRURJVU0pO1xyXG4gICAgcHVibGljIHN0YXRpYyB0b29uOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiVGV4dHVyZVRvb25EZWZhdWx0XCIsIFRleHR1cmVEZWZhdWx0LmdldFRvb24oKSwgTUlQTUFQLlNNT09USCwgV1JBUC5DTEFNUCk7XHJcblxyXG4gICAgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGVzZSBsYXp5XHJcbiAgICBwdWJsaWMgc3RhdGljIGljb25MaWdodDogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0TGlnaHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkxpZ2h0KCksIE1JUE1BUC5CTFVSUlksIFdSQVAuQ0xBTVAsIDI1NiwgMjU2KTtcclxuICAgIHB1YmxpYyBzdGF0aWMgaWNvbkNhbWVyYTogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0Q2FtZXJhXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25DYW1lcmEoKSwgTUlQTUFQLkJMVVJSWSwgV1JBUC5DTEFNUCwgMjU2LCAyNTYpO1xyXG4gICAgcHVibGljIHN0YXRpYyBpY29uQXVkaW86IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJJY29uRGVmYXVsdEF1ZGlvXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25BdWRpbygpLCBNSVBNQVAuQkxVUlJZLCBXUkFQLkNMQU1QLCAyNTYsIDI1Nik7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGljb25QYXJ0aWNsZXM6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJJY29uRGVmYXVsdFBhcnRpY2xlXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25QYXJ0aWNsZXMoKSwgTUlQTUFQLkJMVVJSWSwgMjU2LCAyNTYpO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldENvbG9yKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBWkFBQUFHUUNBWUFBQUNBdnpiTUFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQURXTFNVUkJWSGhlN2QwSG5GVGx2Zi94SDl1WFpZR2w5eXJTUkpwRVVleFlzSkliYThSZTQ5OFdOY1pFYis0MWVwT0lzV3MwTml5eG0yZzBkdXdhZXdPN29xSkNBR25TdDdILzgzMDRCNGRsZHBrNVozYjN6TzduemV1ODVwd3pNOHZNczdQUGIzNVBPNjFxUEJaanJWcTE4dmZpS2ViRlIvbEZSUGxGUS9sRkUvZnl5L0Z2QVFCSUN3RUVBQkFLQVFRQUVBcDlJQkhSaGhvTjVSY041UmROU3lnLy9ZekN3a0pyM2JxMU8xNjllclhiTW9FQUVoRi93TkZRZnRGUWZ0RTA5L0xMemMyMUxsMjYyRTkrOGhNYlAzNjhWVmRYMit1dnYyN1RwMDkzUVNUcSt5ZUFSTVFmY0RTVVh6U1VYelROdGZ4eWNuS3NwS1RFQmcwYVpFY2VlYVFkZXVpaHRtTEZDdnZzczg5czNyeDU5dmpqajl2RER6OGNPUk9KSEVDcXFxcHM5dXpadG16Wk1sdTVjcVZMbGRxMWEyZDkrL1oxKzFIeEFZeUc4b3VHOG91Rzhvc21UUG5sNStkYjkrN2RiZmZkZDdkVFR6M1YxY1h2dnZ1dXZmenl5eTREa1ZXclZ0bU5OOTVvUzVZc2NjZGhoUTRnNWVYbDl1eXp6OXFNR1ROc3pabzEvdGtmS1FJcSt1Mjk5OTVXV2xycW4wMGZIOEJvS0w5b0tMOW9LTDlvMGlrL1BiWk5temEyeFJaYjJISEhIV2VUSjArMmhRc1gycE5QUG1tTEZ5LzJIN1hPZi83ekg3djExbHRkUFI1RnFBQ3lZTUVDdStlZWUxS0tYbXZYcnJYOTl0dlBSbzhlN1lKS3V2Z0FSa1A1UlJPVW56NjcraUtVbDVkbmxaV1Z0bno1OGxpOGRqNS8wVFNuOGxPVDFiNzc3bXNYWEhDQmRlN2MyVjU3N1RWNzg4MDNrNzdIYjcvOTF1NjQ0dzZycUtqd3o0U1RkZ0JSdHFIVUo0aG9DaENmZlBLSmZmWFZWNjQ5clgzNzlqWmd3QUMzQlpRdVRabzB5YmJiYmp1WFhxV0REMkEwbEY4MFFmbDE3TmpSampubUdPdlVxWk45ODgwMzlzQUREN2d2VWszOSt2bjhSZE9jeXE5cjE2NDJkZXBVMjNycnJlM1JSeDkxWDNKRWRiU2FzSXFMaTIzWXNHSHVYS1lDU05vcGdYcnZnK0NoL28vNzdydlB2Vmk5K0ovLy9PZDI5TkZIMjlDaFE5MExER2o0bU5JbEJabTQvOExRc3N5Y09kTTF4Yjc2NnF0Sm0ySkYyVWZQbmozdDE3Lyt0VTJZTU1GMjNYVlhPL2JZWTExUVFmTTFmLzU4dSttbW0xemZnZnA0NDA3MXNWNnpQc3RCOEZBOXJDLzhUejMxbE9zWHliUzBNcEFmZnZqQnJyNzY2dlVkTVVFZmlGS20vZmZmMzhyS3l0YW4rTXBHVlBqQlkvWEhxZXpqckxQT2NwM3NxZUliVERTVVgvMys4SWMvdU0rcjZFdlFUMy82VXpmc01TZzMzU3FBcUYzNW1XZWVzV3V2dmRhZGw0Y2Vlc2plZSs4OS82aHA4UG1McHI3eTA2aWxLNis4MGxYTTByOS9meHM1Y3FUN2dseFFVT0RPTmJSMHlpLzRvblBFRVVlNFk0MjBldWVkZDl4Z3BxT09Pc3AyM0hGSE53cExtaVFEK2VDRER6Ym94WC83N2JkZHhuSGdnUWRhbno1OXJHM2J0aTdiVUlEbzFxMmI2MEFQRkJVVjJYUFBQUmVMdEI5SVJuOVFMNzMwVXNvZGk3VTdKdEc4cUVONmwxMTI4WS9NdnY3NmEvdm5QLzlwZi83em4rM0JCeCswTDcvOE1sWjFtWnFxNXM2ZDZ6N0grcUtqWml2UisxRGdDeVlTWmxKYUFlU0xMNzd3OTh3Ky8veHo5OElVN2ZUTkxWbWtIREZpeEFZZDUzcTgzbFRVbm4rZ0lTakQxbEQwVkN1RjRNc1VtaS8xSjZoeldwK0pZRlBHcXFaUFZkU1hYbnFweTB3MTJpa085SmxVZHJGMDZkTDFuMk5OSm15b2pDbmxBS0lYODkxMzMvbEg1aUtkMm9QVnJwWVlKQktwT1V1akFRTHFnSHpycmJmcWJHc0dnRGhSM1RadTNMaU42cmlnY3RZWGpsZGVlY1Y5NDcvKyt1dnRqVGZlY0swelRTbDRiWTBoNVFDaWIyZEJXNkJvQ0srRzVxcG52ejdLVGdKcTJ2cjAwMC9KUUFCa0RUWC8xRmNwQi9lcEExdjlEbXJpdXZ2dXUrM2pqejl1OWxscXlnR2s5cHdQUlZrTjFkM1VzRndONncyb2owUkRJSU5PU3dDSU85Vmg2VXlHVmtCUkUvKzk5OTVyRjE5OGNTejdTeklsNVFCU095MVQ3NzBLVnUxcjlVa01NTnBYbEtidEdFQTI2ZDI3ZDUxTjlja29XS2hmV0YrV1AvendROWRmY3RWVlY3bEJHbXJOYVM1U0hzYXI0WW9hZ1JDNC9QTEwzV0pjMjI2N3JldnJxSXRXZm56aWlTZjhJN01ycnJqQ0RTM1RrTGhVMU82Y1YyZVFSbnpGeFdPUFBlYnZ4ZE5lZSszbDc4VlRVNVdmdnN6MDZ0WExUYndLTW1MTmFkS293ajMzM0hQOU9tNHFQMVVjbTIrK3VkMTIyMjF1R0h0QTQrczE4a1dkckUyRnoxODBxWmFmUnB4cUNHelVMQ0tvejNyMDZPRzZBRFE4dkw0MUE5TVp4bHNYRFV2WGNIWDFRUWZEempNMWpEZmxBS0lwOFltRnJYYStGMTU0d1VhTkdsVnZaRmF3ZU9TUlIveWpkWUZISFUzNmcweEY3UUpVbjhvdmZ2RUwvd2dJcDBPSERpNVk2RnRoRUVEVTVEQjgrSEFiUEhqd0JwbXpQb1A2STV3eVpZb2JkUk80NVpaYjNFQ1NWRC9MUUcyYTN2Q3JYLzJxempxMDJRU1Eyb0hnc3NzdWN6TWVOYW1tdmpkWk8vQmNjc2tsYm8wV1JkNVUxUDdaYWpaTG5GL1MxUFJ0TmM0U3M3ODRhcXJ5VTMvY2JydnQ1cjdRQkFGRTY3dHAzUC9Zc1dQWEQzdFUrZW1QV3hPMHpqMzNYSmRCQnpSUmRyUE5OblAzTlJVK2Y5R2tXbjZMRmkxeVEyTXpTYXZrYW9TWHZyVFVwZGtFRU0wNFYyZFFRRE0wbFlFb0VOVDNKaFZrTkkxZTFQZWhBS0kzb1c5NXFjaEVBVGFrRkl1dnlWQis5VXVjaWY3M3YvL2RyWlJ3MEVFSHJSOWRxUEpUUDUrYUcxUVpYblBOTmU2OHFBbHJ6cHc1L2xIVDRQTVhUYXJscCtaNjFWdGh5MXVmSWRWL1dxMWp6Smd4dHVXV1c3b3ZNWnVTaWZKcnlBQ1NjcTlRN1lrb210V29QN3hORldqaWtOMWdPWlBFNWdHZ0tTWDIzNmt2UTBQVkV6L1QrZ1BXOEhObEplbDBvcUo1MFVXWTFOK1ZqcUR5VngrSGdvYVdXRC90dE5OY3MyY3F3U01icFB3WFVYc1ltMmFWYThHdVRSVnE0aUprV3ZwQlAyZFRJN2VBeHBMWWdha0FvaEV5aWFNRTlZMVJGK1pSODFWY1podWpjZWxMaFFKSU90bUFIanR3NEVDM3pKUDZPRFNZb0NtYk9odEt5Z0VrY1Q2SDZQajc3Ny9mWUhKaE1vbnJCV2t1aVVhKzFEZHFDMmhNaVN2cXFqOURRU0x4TTYzbXJELzk2VTh1KzBoc3drWExvVGtkbTJwcENZS0xWdVpRc0ZEUU9PeXd3OXp5NmMzNUMzUEtBVVJ0d29tTGNhbWd0TFJKZlFGRVRWeGE4aVNnOW1JTndhVUpDM0doanN5QVB0TWFxcGs0NSttUGYveWphNFpWQjN2VTYwY2pPMmtxUXJMc0kyalNWTDJvenZDVFRqckpUampoQkxlL3FSVTZHb3RlZHpxWlU3cFNEaUFxck1TNUc1cUZycW42OWExcnBkbVhRUWVsYURWTGRSNXA2Qm9RQjFxbUlwRkd4R2craUJiTDB3U3dwNTkrZW4zd1VJZGpwa2ZpSU43MEpYbjI3Tm5yTTVDZ1FsWXJpaGFMMVdLeVo1OTl0cnRnWHVLeVRVMUJyMHRkQzVyMHFDL3F3YWFtczJSemxkU3ZyZnYwZUhXd2g1RnlBSkVoUTRiNGUrdUdRZW9DVVhVdEhLWUMxeUpqQWYwUzFMNDhmdno0MkVSblFKL2piYmJaeGo5YTkwVkovWGIvK01jLzNGVUhQL3JvSS9kWjFxSjV0OTkrZTFaY1dBaVpvZjVkamI1S3BDL1J1dGI0T2VlYzQyNTEzSkRmOE5PaFRFaVh0TDN6emp2ZG5LWmd1K0dHRzJ5SEhYYlk0SFVHQ1lFV2dOVGp6ei8vZkxmd2JicnZKYTBBb2prZmlmMFhta1NvSWJxMVUzdjl3V21KWXcwVkMyanVoeDZ2U1ZjMFlTRk9KazZjNkVaYUpjdW1WWWtvRzlId1hWM0xSa01pQXl6SjA3eHAzVDcxODJyU3FUNGp2L3psTCszd3d3OTNyU2h4ck1QVXNxTTZWdjNUR3E2clMyZG8vcDRtYm1zVkVWMTZQS0Jnb1N0cnFwVkkxM2xTUDgzSko1K2M5cW9LYVYyUlVQU0NGSldEU0tVbUtuVSticlhWVmk0Q3FxTmNMejV4NlhjZGF3eTlKaDhxNVV2blJjWWx1dGNsemVKcmRKUmZhblQxT2EyZ3FtOXNDZ3o2b3FTTVdYOTB3ZVZCZFU3emw5Uk1vTTkzVTg4QkVUNS8wZFJYZnJwUDlaa0NTRk5KcC94VXJ5b3Iwa1RyNE1xRDZkSThQV1hicVVvN2dJald2bGRrVHVYTmFRU0RMdjI1eHg1N3VGbS9hbTlMcDFDb0FLT2gvRktuSUtMaG1sbzlZZGFzV2E2NVNrdjJKTDVHcGY0cVU1MUxkMTVBUStEekYwMXpLejk5dVRuNDRJUGRhRmYxMmFYei9qUmlWczFkNlFnVlFOVHZvV3dpU08rU1VXZWovaEMxQ0prV1hOVGpOV3M5M1NGdGZBQ2pvZnpTcHlaWlpkWUtFSm9IRW1kOC9xSnBidVdueHlzVFVYTlc3VGxObTZLeVNMYzhRZ1VRMGJleko1OTgwaTBvcHpSUHpWZDY4Zm9XcDBpbUZGL1hSVC9ra0VQY29uVWF0UlZtL2djZndHZ292MmdvdjJnb3YyamlYbjZoQTRqb201cUNoWWJ6NmtxRFN2ODFMMFNUc3pSOFRCMDY2blRVU0pkZ3pIUzYrQUJHUS9sRlEvbEZRL2xGMDZ3RFNFRHB2dHJiRkR6MDQ5Uk1wVkVLV2lZaWFnSHdBWXlHOG91RzhvdUc4b3NtN3VXWGtRRFNrUGdBUmtQNVJVUDVSVVA1UlJQMzhndlhyZ1FBYVBFSUlBQ0FVQWdnQUlCUTFNQVc3MGJBZGE4UklZMGRPemJ1djk5WWUrdnR0LzA5aE5FcTVuME1jUmYzMGlNREFRQ0VRZ0FCQUlSQ0FBRUFoRUlBQVFDRVFnQUJBSVJDQUFFQWhKS1JBS0tyRE9wS1hWdHZ2YlYvQmdEUTNHVWtnT2h5b0FNSERneDlZWFlBUVBhaENRc0FFRXBHQWtqY1Y3UUVBR1FlR1FnQUlCUUNDQUFnRkFJSUFDQ1VqQWFRdUY4OUN3Q1FPV1FnQUlCUUNDQUFnRkF5RWtBWXhnc0FMUThaQ0FBZ0ZBSUlBQ0NVakFZUVJtRUJRTXRCQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkN5V2dBWVJndkFMUWNaQ0FBZ0ZBSUlBQ0FVQWdnQUlCUU1oSkFHTVlMQUMwUEdRZ0FJQlFDQ0FBZ2xJd0dFSWJ4QWtETFFRWUNBQWlGQUFJQUNJVUFBZ0FJSlNNQmhHRzhBTkR5a0lFQUFFTEpVZllRZFpzMmJacjdZVWNkZFZUUys2TnNBTkJTYVdScm5MZU1aQ0Q2UVFDQWxvVW1MQUJBS0FRUUFFQW9HUTBnOUZrQVFNdEJCZ0lBQ0lVQUFnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ3lXZ0FZUmd2QUxRY1pDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdNWUxBQzBQR1FnQUlCUUNDQUFnbEl3R0VJYnhBa0RMUVFZQ0FBaUZBQUlBQ0lVQUFnQUlKU01CaEdHOEFORHlrSUVBQUVJaGdBQUFRc2xvQUdFWUx3QzBIR1FnQUlCUUNDQUFnRkF5RWtBWWhRVUFMUThaQ0FBZ0ZBSUlBQ0FVQWdnQUlKU01CaENHOFFKQXkwRUdBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkNJWUFBQUVMSmFBQmhHQzhBdEJ6cS9ZNWM2dzhiTnN3T091Z2crL0RERCszKysrLzN6MmFHRjVSMjluY1J3b2tubnZpY3Y0c1FidmpyRGY0ZXdxaHB4WmZLU0dKZWZEUmhBUUJDeVVnQUNacXVHTTRMQUMwSEdRZ0FJQlFDQ0FBZ0ZBSUlBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQ1VqQVFRaHZFQ1FNdERCZ0lBQ0lVQUFnQUloUUFDQUFpRkFBSUFDSVVBQWdBSWhRQUNBQWdsSXdHRVlid0EwUEtRZ1FBQVFpR0FBQUJDSVlBQUFFSWhnQUFBUWlHQUFBQkNJWUFBQUVMSlNBQmhHQzhBdER4a0lBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdJVUZBQzBQR1FnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNDVWpBUVFodkVDUU10REJnSUFDSVVBQWdBSWhRQUNBQWdsUi8wWFViZkhIMy9jL2JBOTk5d3o2ZjFSTmdCb3FkU3ZIT2VOREFRQUVBb0JCQUFRQ2dFRUFCQUtBUVFBRUFvQkJBQVFDZ0VFQUJCS1JnS0lobk1KdzI0Qm9PVWdBd0VBaEVJQUFRQ0VRZ0FCQUlSQ0FBRUFoRUlBQVFDRWtwRUF3aWdzQUdoNXlFQUFBS0VRUUFBQW9SQkFBQUNoRUVBQUFLRVFRQUFBb1JCQUFBQ2haQ1NBTUl3WEFGb2VNaEFBUUNnRUVBQkFLQVFRQUVBb0JCQUFRQ2dFRUFCQUtBUVFBRUFvR1FrZ0RPTUZnSmFIREFRQUVFcEdBa2h1YnE2N3JhNnVkcmNBZ09ZdjVRQ3lZc1VLdStPT08rekdHMiswZSs2NXg1WXZYKzdmVTc4MzNuakRwazJiWmpmZmZMTjkvUEhIL2xrQVFMWkxPWUFveTVnOWU3Yk5uVHZYUHYzMFU3dnd3Z3Z0ODg4L3Q3VnIxL3FQMkpneWttZWZmZGErK2VZYisrNjc3K3lxcTY3eTd3RUFaTHVVQTBoeGNiSDE3OS9mUHpKYnZYcTEzWC8vL1M0ekNRU2Q2WUV2dnZqQ3lzdkwzYjZDeWNNUFArejJBUURaTDYwK2tGR2pSdmw3WnAwNmRiTG5ubnV1M3Fhc21UTm4rbnRtWDM3NXBTMWJ0c3cvQWdCa3U3UUN5T0RCZzlkM21JdjJQL3ZzTTZ1cXF2TFAvRWpubElFRVB2cm9JeHMzYnB4L0JBRElkbWtGa0x5OFBCc3laSWgvdEM2Z1BQUE1NN1pxMVNyL3pJL1VQeEkwWDFWVVZMaGdNbW5TSkhjTUFNaCthUVVRR1RObWpMOW4xcUZEQjN2dHRkZldCNURFUHBBUFAvelEzelBYNlY1UVVHQVRKMDcwendBQXNsM2FBYVJmdjM1V1dGam9INW5ibnpWcmx1c2tWNUNReXNwSzE3UVZVRERaZnZ2dHJVZVBIdjRaQUVDMlN6dUE1T1RrMkpaYmJ1a2ZtV3ZTZXZIRkYxMmZoNXE0Uk1GRFFVUTBTa3ZEZVBmZWUyOHJMUzExNXdBQTJTL3RBQ0pqeDQ3MTk4emF0bTFyTTJiTWNQTkIyclJwNDg0bE5sK3A4N3lzck15MjIyNDdOeFFZQU5BOHFOTWlyUlVRMjdkdmI2ZWNjb29MSEVIZng1dHZ2bW05ZXZXeW5YYmF5WGJmZlhlNzdycnIxby9NdXVHR0cyeisvUG1obHptcHFhbTV3TjlGQ0Y3NS80Ky9peEJPUFBFRWZ3OWgxTlJzT0RjTTZZcjNBclZwWnlCcWtwbytmYm9OSHo3Y1AyTTJkT2hRTjB1OVQ1OCticjVIRUR5Ky8vNTdOM09kTmJJQW9QbEpPNEFvT0doWmtzUWxUTlIwdFdUSkVtdlhycDBiY1JYUVJNTGFzOU1CQU0xRHFENFF6U2gvNnFtbjNHejBRUGZ1M2UyRER6NndyNy8rMmgzcjJpRHFHd0VBTkUraEFvaWFzVFR5YXRDZ1FmNFpzODAzMzl5dHZCczBYNmxKYStuU3BWeGtDZ0NhcVZBQlJNMVhDeFlzc0lVTEY2NXZvbXJkdXJYbDUrZTdmVkUya3Jqc0NRQ2dlUWtWUUNSb3h1clpzNmQvWnQyS3ZhSXNSRU41eVQ0QW9Qa0tIVUEwaEZmTldJbXowZ09hU0tqbDN1dTdWZ2dBSUx1RkRpREtMdFRQY2RGRkY3bkZFb05nb2Y0UjlZVm94bm95ZFowSEFHU1h0Q2NTMXFaK2poRWpScmlBb2lHOGE5YXM4ZTlKVG85UFoxNkk5M09aU0JnQkV3bWpZU0poTkV3a2pLcVpUU1NzVGNGQW82MDBBMzJmZmZieHo5YU5TWVVBMER5a0ZFRFV6NkhPY2kxWDByVnIxL1dMSmdZVUZFcEtTdHhFd29DYXFyVGN1NTZqVlhnMVNnc0EwSHlrRkVCMFlhZzVjK2E0R2VoYTF5cVk2MUVmOVlrc1hyellQVWZMbVNTNzZCUUFJSHZSb3cwQUNDVWpBWVQ1SGdEUThwQ0JBQUJDSVlBQUFFSWhnQUFBUXNsb0FPSGFId0RRY3BDQkFBQkNJWUFBQUVMSlNBQmhHQzhBdER4a0lBQ0FVQWdnQUlCUUNDQUFnRkF5R2tBWXhnc0FMUWNaQ0FBZ0ZBSUlBQ0NVakFRUWh2RUNRTXREQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xvd0dFWWJ3QTBIS1FnUUFBUWlHQUFBQkN5VWdBWVJndkFMUThaQ0FBZ0ZBSUlBQ0FVRExhaE1Vb0xBQm9PY2hBQUFDaDVDaDdpTHE5ODg0NzdvZU5IajA2NmYxUk5nQm9xZFNxRStlTkRBUUFFRXBHQW9naWtaQXhBRURMUVFZQ0FBaUZBQUlBQ0lVQUFnQUloUUFDQUFpRkFBSUFDSVVBQWdBSUpTTUJoR0c4QU5EeWtJRUFBRUloZ0FBQVFpR0FBQUJDSVlBQUFFSWhnQUFBUWlHQUFBQkN5VWdBWVJndkFMUThaQ0FBZ0ZBSUlBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQVVESVNRQmlGQlFBdER4a0lBQ0FVQWdnQUlCUUNDQUFnbEl6MmdRQUFXZzR5RUFCQUtBUVFBRUFvR1EwZ0RPTUZnSmFEREFRQUVBb0JCQUFRQ2dFRUFCQktSZ0lJdzNnQm9PVWhBd0VBaEVJQUFRQ0VrdEVBd2pCZUFHZzV5RUFBQUtFUVFBQUFvV1FrZ0RBS0N3QmFIdFg4a1RzdU9uYnNhS2VlZXFvdFdyVElycjc2YXY5c1p0VFUxTHpnN3lLRXQ5OStlMGQvRnlHTUhUdlczMXVuOXBlbDJ2MStUWDEvYmJVZlgxdERQeC9ORzAxWUFJQlFDQ0FBV2h4bFRtNWJ1M2I5UHRLWGtRQkM0UU9JTTlWUlZaV1Z0bURlZDNiam44Nnh2WVlVZUZ1KzdUWFV2L1cyc3cvYnlUNTY5MVdycUNpM3RWNWd3YWFSZ1FEMVVCOUE0aFo4V3cyMnByNGZkVk1RV0xKb2diM3k5RU4yMGo0amJkOHRpdTNJSGZ2WlA2WmQ1dDI3Y2RsOStOYkxkdFloMjl2K0kwcnNvSzI3MkQ5dnY4WVd6WjlyMWRWVi9pTlFHd0VFUUxPaG9QSDE1eC9hdlgrOTJBV0JuMi9id3k0NjVRRDc1b3VQL0Vla1p1V3lwWGI5LzUxaFUzYm9ZejhiMjlGdW52b2JtL1h4ZTE0d3FmWWZBY2xvRTVhK0lRRkFZMUkveGdkZTluRG5OUmZaejhhVTJTKzhiT1BXeTg1elFTQVR5bGV2dEFkdXZzUk9tYnlWKy9sL3UvcjM5c0diTC9uM3RteGtJQUN5UnRCMHQzWnR0YzE4ODBXYmR1bDV0dCtJRXZ2VllUdDVGZnYvMmhxdnNtOUk1V3RXZVlIcTkvYXJLVHZidnQ3L2UrYzFGOXBuTTk5eW1VOUxiRkpVeWhENVhaZVZsZG5wcDU5dWl4Y3Z0cXV1dXNvL214bmVMNFY1SUJFd0R5U2F1TThEMlpUYXo2OXRVeit2b1orZkt2MmM2cW9xbS8zRlJ6Yjl3ZHZ0eVFlbTJlcVZ5L3g3bTE1WnAyNjI2K1REYmU5RFQ3RE8zWHRiVGs1dTJyK3JiRVFHQWlDV2dxQXg1K3ZQN2RvTFRyVmpkeDlpcDB3ZWF3L2RkbVdzZ29jc1dUalBIcmpwRWp0NjEwRjIrcysyc1R1dnZjZ1dmei9QMWxaWFp5eUl4aEVCQkVDc3FLUDZoeVVMN2I0YnB0cnBCNHkzNC9ZWWFvL2VmYjB0bUR2YmYwUzhxYlA5enFzdnNDTjI2bWZuSHJXN1BmK3ZlMnpsOGgrYVpTQWhnQUNJaFZVcmx0a0xqOTFuWngyNmcwM1p2cmZyQ0ovMThidit2UTBuSjZlVjVlWGx1dmI4VEZMMk5QT05GMnpxMlllN3pPU0NYMHkyVDk5L3c4clhyUFlma2YxVVpwSERJbjBnOFVVZlNEUmJiYldWdjdkTzdXK1I2ZlpaTlBUOXRkVitmRzFOL1h6TnNWZ3c1eHU3NjlxTDdNMFhIbk9aUjBNb0xDaXdmbjE3MkU0VHhsbEpTWkU3cDVkZVhGeHNuVHVWV1Y1dXJwVlhWTmlzcjc2MUJ4NmFidk1YTEhLUHlUU1ZsL3BJZHZ1dm8yM1BnNDZ4amwxNmJMSU00MHl2dlA3ZmNBcmF0Mjl2WjV4eGhpMVpzc1N1dlBKSy8yeG1lQjlBQWtnRUJKQm9DQ0FOOC96S2luSTM5UGE2QzArM09iTS9kMzBGRGFWM3o2NzIyN09QZDRGaVU2OVgxSVEyNDhQUDdmSnI3N0NWS3hzdVc4Z3ZLTFMrZzRiYktmOTdyVzAyYkxUbDV1WDU5MlFQbXJBQU5DcjFaUnl6MjJENzdkRjcyTGRmZnRLZ3dTTS9QOC9PK2VVeDFxVnpoNVNDaCtSNjJjaW9FWVB0N0ZPUDlNODBEQVhSTHo1OHg4NDRjRnM3WXVmKzl2RjdyL24zWkE4Q0NJQkdOZlBaaDJ6TjkzUDhvNGJWeXZ0WFZWVzF5VXlxTmdXYkZTdFgrVWNOcmNiV0xKcG5qMTc1Ry84NGV4QkFnSHFvNGtuY1ZMRWtibkc3di9aVysvRzF0MlRQU2R5U1BTZHhTL2FjeEMyWlpRdm5XWTgyaGRhM3BNQ0tjMVBMQ3NLcXFLeTBzMzU3cWQxMjF5UDIzc3hQYmVrUHl6ZTVVS0plOThMRlMrM08reDcxenpRY3ZmOStKZm5XeXlzUFZjWjFsVmxjNmJjWCtSWFRCeEpmOUlGRXd3V2xvajAvbVFjdU9jdGV1dit2L3BIWm1xcHFXN2lteWxaVnAvK3p3aWd1S3JSUld3NjJ6cDA2V052U0Vpc295SGZuU2xvWHU4NXpCWnIzUC9qTWYzVERLTWxyWlowSzg2d3dMOWMvWTlacnlHZzc2OVlYTENjbmU3N1hrNEVBYUZSVmxSWCszanBGWGlXcWIrQjl2Vy9pcFY3RjJ0QldyeW0zVjkrWVlROC85cno5N2Q1SDdaWTdIckpyYjd6WHBsNTVxOTEyOXlNTkdqemE1dWRZdnpZRjFyT2tjSVBnSVRWYTlUZEVRRzVLQkJBQWphcTZzdExmMjVBcTFPNWV4ZHJmcTJBN0ZHeFl1V1l6aGNST2hiazJvTFRBdXJVdXNJTGM1Tld1Um4rRnllaWFVa1lEeUtiU1hTRGI2RE9kdU9rUFBIRnI2dnV6VWUwTXBMWjhyNEx0V0pSbkEwc0xyWXQzbTYwVUFyc1ZlKytqYmFHVkZlWlozaWFhcHJKeDJSTXlFQUNOcXJxcS9nQWlDcGE1T2Eyc3ZWZnhidVpWd0QxYjUxdCtsbncvTGZaZWQrL1dlVGJBZTkxdEMvSXN4dy8rbTFLelZzT1pDU0FBVUtkV3JkS3JkbFFCbCtUbldqOHZJMUgvUVp1OEhOY3NGQ2Q2UjJYNU9kYS90TUI2ZTYrek9EOHZwYUN4Z1N4c3dNbElBTW5XVkJwQTQ4dk56L2YzMHFNS1dmMEgzYjFzUkJWMXA0SmNhNFErOTNvVmVEVm85K0k4Ny9VVVd1ZldCWllmWVFSVnVvRTFEckx2RlFPTktMRy9RWnNxc2NTdHFlL2YxRmI3K2JXM1pNOUozSkk5SjNGTDlwekVMWm5jdkhBQkpLQ2ZxLzZFc3FJOGw1WDA5Z0pLNjF6di8vUHZiMmlxTk50NldaQTYrL3UyS2JUU2dqelgzQlpWSys5bjFGVm1jVVVBQWRDb29nYVFnQ3BiTlc4VjUrZGF6NUlDZi9SV1RvUDFsUlI1Rlh4WEwyZ3ArK21xUGhrdkc4cGtoYjh1QXlHQUFFQ2RrZ1dRYmoyNjJlbm5uVzdIbjM2Y2pkbDZ0QlVVRlBqM3BNWmxKVzcwVnI2WEZSUllMNitDYjVNWFBTdFJFMWw3THlpcDc2VzN0N1V0eVBXeWpjd0dqb0FMSU5rVlB6SWJRTEl0L1FMUStKTDFnUnh3K00rOElOTFZCbXcrd05zL3dNNmZlcDV0dit2Mi9yMnBjMW1KVjhHMzlyS1M3cTBMM055TExrVzVWcFRta2ltYThLY2dwTURSMlF0SzZudlJ6MjdJT3E2VkFoTVpDTkI4QkpWR3NHMnFENkN4Nzg5R3lUS1E3ajI3KzN2cnlqemZDektUZnJxbi9mellRLzJ6NmRQUFViYlF2akRmZXZ0TlhKclFwNDd2Wk5wNVFhTmJVWjV0NWsvNFV4QlNNTkxQaWFwenQ4NjI1K1E5WFlDc1N5YituOFpHQUFIUXFKSUZrRVVMTjc2QWt5clVMVVp2WVdQSGI3Z2VXUmd1S0hsWlJBY3ZtK2hYV21RRHZTRFJvempmdW5tYk91RVZOTHA2UWFOdFlWN0cxNkthZk1oa08rTzhNMnpIM1hhd1kwODl4cjJuWkZybDVHWmRFTWxJU1dYck55RUFqUzlaQVBsazVpZiszb1pVb1U3Y2ExZi9LSE9VbWJRcHlIVjlHdXFFYjRnRkRQUHk4dXlZVTQ2Mm4wd1k1LzM4ZFlGQi84OUJSeDdvN3F2TlhWQ3FKUVlRQUVoVnNnRHl6T1BQdXJXZ2ttbFgxczdhbExieGo3SkRVWEdSbmZrL3Y3UkJRd2R0bEZXb2VhNW4zNTcrVWFKMXpaVFpoQUFDMUtOMm40UCt3Qk8zdU4xZmU2djkrTnBic3Vja2JzbWVrN2dsZTA3aWxreE9rZ0JTdnFiYzNuemxyYVRQMGYvVHRuMWIveWc3SEhiOFlWYldvY3cvMnBEZTQvSWZsdnRIMlkwQUFxQlJGUlMxOXZjMjlNOTcvMm16WjgzZUtJam9lRldqWFIwd09tVkxBd2ZWM1ZtK2N2bEtXN3h3c1grVTNUTGFCNkp2Q2dCUW42S1NVbjl2WTMrOS9BYWIvdWgwVzdsaTVmcDZaZmFYMzlqU3hVdmRmallZc3NWZ042czhHVjBOOFpFSC91VWZaVDh5RUFDTnFxaWsvdWFvWng5L3ppNzY5Zi9aZjUvK08vdmRMLy9IL25yWmoxY3ZqRDB2Ym96NnlTai9ZR1BQUGZHOHpYaDdobitVL1FnZ1FEMFMyL3UxNlZ0eDR0YlU5MmVqMGxhcnJYMUJsYmRYLzdYSjFhbGVXWkg4NGxOeGxadVR1OEdjbG9CK1Y3Ty9uTzJ5cTQydHRUS3ZQSWEzTC9lUHN3Y0JCRUNqcWx3NjE2c3NLMjE0dXdvcnpNbSthMkRVcDNwdHRjMzVkcTUvdEM1d3FObnFxVWVldHVzdnJaMUoxVmhwWHJXTjlBTEhNSzg4Y2x0bFh6a1FRQUEwcXZKbDZ5WU50aStzc1RFZEsyeEFTWVhsdW15a0dRUVM3eTFvTU1DeUg1YTV3TEZ3L2tLYmR1MnQ5dnlUei9zUGtCb3I4Z0xuMExibE5xS3N3dHFrdCt4WHJCQkFBRFNxdFFtWHRGVmZjL2VTdGJaVnAzTHIwN3JTV2pXRFFMSm93U0s3NUhlWDJNWC9QZFV1dStoeSsrS1RML3g3YWl5LzFWb2JWRnBob3p0VVdJY2lOVkg2ZC9teXJWa3lKMmhMamJMTm1UUEgvYkFlUFhva3ZUL0tCalNsNERPWStGbFVYMFJ3MjlUM0I3U2Y3RmpQUzN4dTdlTkFRejAvbWJYVkcxL1NOcy83S3R1N1RiVnQxYkhjdWhWVmVZRms0LzhqbTFSVlZkdXlwY3U4QXROUmpaZGgxZGlBTmhVMjFudC9YWXJYV3JLSjd6VmV4dUkvWWIyZ0hPTzZaU1FEMFE4Q21pTjl0bFZoeHZVMkc2MnRxcnRqdkNEWGJHRGJLdThiK2hwcmw2ZU85dXdPSkRuZTYrL3RaVlpqTzY2eGJsN2d5SzJueGwxYldlNEhrZXhCRXhaUWoxUXE4YWE4RFRZZEo1Nkx5M0V5TlFsTldIVXB6ak1iWGxacG84dldXRWx1OW5XMGV5VmdYUXZYQlk3ZUpkV1c3d1ZHcjFqcVZiUFdlNTkxbEZsY0VVQ0FlZ1NWWVZ4dnM5SGE2dFNHNW5wdjBWcm5tNDNzVUdGanZJeEVIYzk1K1huV3FVc242OUNwZy8rb09OSHZvOGJhNTFmWk9DOXdLSk5TUnFYM2tZcWFtdXpLUGlTakFTUmJQOUJBWGVxcnZPTnlHK3pIOFRpWitwcXdrdEdQVVVhaUVWdG4vdW80Ty9OM3Y3U3ovL2NzTy9hMFk5TytjbUhEcWJFMmVkVzJkYWMxYmtodUtobEhiV3ErOGtyUFA4b09aQ0JBUFlKS01hNjMyV2h0MWFhYnNKSnBYZGJCeW5yMmNlOWQyMmFEQjlxdkx6ckhpbG9YK1k5b0NtdmRYSTZ4WG9ZMHNrT2xHd3pndmJSd2FtakNBcHFWVkNyeHByd05OaDBubm92TGNUS3BObUhWVnJscXBadGJrYWgxU1dzNzRvVEQvYVBHRkV3Q3JMQXRPMVJZMGNhWDkwaGJ0bldnQ3dFRXFFZFFHY2IxTmh1bDI0UVZxS29vdHprejN2S1BmdFM1WTZrTmJSZDB0amUwR211YlgyVmJ0bC9qQWtlYmdzejlEbHdBeWJMZktRRUVxRWNxbFhoVDN3YjdjVHhPcGlaa0JpSXpIcm5YbHMzL2Nha1FaU1R2UFhTWGRTaXNjWjN0dzd4QTBycUJBb21HRlk5b1gyNWJ0SyswMGdicGVzbStMd1FwQlpBMWE5Yll5cFVyL2FQd0ZpMWFWT2RWeDRBNENpckZ1TjVtbzV5ODhMV3Z2cVgvZTlyVk52L3pqNnhpeldwNysvNWJiZW0zWDduN3ZDS3hNaStRak5vZ2tFUXRJelZWcmNzNE5LeTRyWmR4NlA5cENMb21lb1A5OEFhU1VnQjU5dGxuN1lvcnJyQlhYbmxsb3piSVZLeGF0Y29lZXVnaHUrYWFhK3lUVDVKZit4aUlvMVFxOGFhOERUWWRKNTZMeTNFeU9mblJPcjJyeXRmWW0zZmRhRTlkL0Z1Yi84bE0vK3lQdlA5K2ZTQlJ4dEJtL1lURVZJUEp1c2UyZFlGRDYxVXA0OUI3VzNkdlE4bkp6WGRsbDAxU0NpQURCdzYwcXFvcW16NTl1Z3NrTDcvOHNxMVlzY0svZDkyM05LbjlnVkhHOGNRVFQ3am52UC8rKys1eC9mdjM5KzhGNGkrb0RPTjZtNDF5Q3hwbjFKUlhSQzVqMk5JTEFDUEx5cTE5ZnJXL1JFcGQ1ZWFWcTdkcEhzY283L0ZiTkZMZ0NMVEtWVTk4ZGdXUVZ0NkhjSk9mUW1VZGwxeHlpV3ZLa3VERDI2bFRKK3ZidDY4VkZSVzU3S1N3c05ER2p4OXZpeGN2dHErKytzcVdMMTl1T1RrNTd2bTYzV3l6emV6UVF3OTFQeU1OTC9pM0NPSHR0OS9lMGQ5RkNHUEhqdDJvMG83YnJXaGY0bnFjNk0yclRyQ3ZucnJaUDJvOGVpbHJxczNtcmM2MTc5ZmtXV1dOWHFNMkxYSllZNTJMcXF4YmNiVVZOVkZMVXJ2K0kyMjNLOTcwTWhIdkJmaUNjb3lybERJUVZmNWJicm1sNWZwdkxQaFFMRnk0ME41OTkxMTc5ZFZYM2JFQ3pJc3Z2bWd6Wjg1MHdVT0NKaS8xZll3Y09kTHRBOWxDZjhENnZNZjFOaHRGYmNJS3l5c3lOeUd4ZjJtMWplbFlic1BhbFZ2WG9rcDNxK04rYmFyZC9YcGNVOGoxeXFWVnNsVVdZeXpsVnp0cTFLaWtIZUFLRUVHUTBJZGErOGsrMk1wT0JnOGU3QjhCMmFHK3lqc090OEdtNDhSemNUbE9wckJ0UjMrdjZXakNuL3BKTm10YjVXNGpUUURNRk8vL1Y5bGxrNVFEU1BmdTNhMWp4L1IvOGZvUUtYTkp6R0NBYkJGVWhuRzl6VVlkTmgvbjd5RlI2ODU5L0wzc2tWYStOSHIwYVBmQlRZY2VUL01Wc2xVcWxYaFQzd2I3Y1R4T3B0dVkzYTNYOWdmNlI5bWhiYmVlMW52MDF0WjNxKzBzdHdIVzMyby9ZTFNOTysxRy95aDdwQlZBbEVYb3c1RU9QYjVkdTNiV3MyZFAvd3lRUFlKS01hNjMyU2duTjgvR24zTzNiWEg0UlY0QnAxVUZOYnFpMG5ZMjd1ZkgyNFRqejdTUit4MWlJL1krd0hiNmY3LzE3ODJNbnR2OXpIYjk4OHVXMzdyVVA1TTkwdnJ0bFphV3VtRzQrdkNtU2gzd1lUSVhJQTVTcWNTYjhqYllkSng0TGk3SGRkRmpoaDM4Rzl2cEQ4OVlibkZtSzg3ODRoSnJsWUhtY21VZE81M3lHK3M2YUppcnh3S0ZyVXN5RnZpR1Q3bkF0djMxM1kwMnREblQwaTRGQllPZzB6d1YraEFwY3dHeVVWQVp4dlUyMjNVWnNZUHRmZE5uMW1YVVJQOU1OTnNjL2d2YjQ1eUxiTkp2cDlyNG8wNnhqZ00yOSs5Smo1cXBmbkxZQ1paWFVPaWYrVkg1cXBWZXhaYitoT3BFdVVVbHR2UEZMOWp3UTg1Zk53TTlTNlVkUUlZT0hacldHdnk5ZXZXeXNySXkvd2pJTHFsVTRrMTlHK3pIOFRnVlJlMjYySTYvZjl6R25QSlgvMHc0SGZvTXNFNSt3RkRHMExIdlFOdG15a2xlRnZGYkt5aEpMOHZwUFhxOEZkYnhuTXJ5MWY1ZU9GMUdUclI5Yi8zR09nK2Y0Si9KWG1rSGtMeThQQnMrZkxqN0JlbURzaW5LV0lCc0ZWU0tjYjF0TGpUL1liTTlqN1A5N3BocmVjVnQvYlBwNlRseTQ5RmRLcWMySFR2YjFsTk9UUG1idmg0M2VPYzkzWE9US1M1dDUrK2xiOXdadDlpT0Z6NXVCVzNhKzJleVc2aUdQTTBKVVROV1hRVWNVSkFaTm15WWZ3UmtuMVFxOGFhOERUWWRKNTZMeTNHNmlzcTYydVM3RjlqUWc4L3pqdExyTjYxdmRGVGJyajFzMkc3NytVZjFLKzNhUFduVDFZL1M3ODh0N1RYRTlyMWpqdldmZUtRTGxzMUZxSGZTcDA4Zk43S3FQdm9RRFJreXhDMXpBbVNyb0RLTTYyMXpsSk9YYjF0TXVjQW0zZmlwRlhWSWZmVG0zSm52K25zYlUzbDE3TDlaU3BWM2FlZnU3dkhKVkphdnNWZHV2dHcvMnJSV3VmbXVvM3lQYTk2M292WmQvYlBOUjZnQW9zTFZ2STY2Q2xuMDRXYnVCN0pkZlpWM1hHNkQvVGdlaDZYbnR1azJ3UGErWlpZTm1IU2lmN1orUzc3NzJ0YldjN21JVkpkTFg3Rm92bnNQaWJTTS9QZGZmVzVQWC9MZnRtTGhBdjlzL1VwN0Q3VkpmLzNFaG5uWlZFNWVYcVR5aUt2UXVaU0NRKzFDVHFUTVE0c25BdGtzcUJUamV0dWM2VDNtZXRuSTJKT3Z0WWxYdkdHdHU5Vy9rbmZscWhYMjluM1Q2aXlYdk1KQ3kwbWhIK1NIT2QvWWR6UGVzdXFxU3ZlemxzejUxcDY1OHZmMit1MS84UUtVbG9hdm43S09RZnVmN21VZDczbEJzSjk3SDgxVlNxdngxdVhHRzIrMHVYTi92RHBZUUV1V2pCczN6dmJZWXcvL1RDU3N4aHNCcS9GR0UvZlZlQU02bHVCY1hJNHpxV1p0dGIxMzh6bjIrYit1TWE5Mjk4OXVyUHV3VVRaOHo4bHVFbUNpbFlzWDJndlhYV3hycXpZZEJFVExxK2NYRmxtRkY1aFMxVzdBS052NjdEdXNuWmQ5QkdVUlJTWitSa09LMUpzelpzd1lmMjlEV3JxRXVSOW9EdlFIck1vd3JyY3RpWnFnUmgzM1o1dDQ2V3ZXdHQ4Vy90bU4vZWVqOTJ6NkZiKzNMMTUrMXFvcjExMCtWMDFicy83OVhNckJRMnE4SUpWcThOQUt3eU9PL3BQdGZ1VmIxcjdQTVBmN2FRa2laU0RsNWVVMmRlclVqU1lXZHVqUXdVNDk5VlQvS0RJeWtBaklRS0xoZWlDWk9jNDBOU1Y5OXRBVk51TzI4N3lEdW9OQ2JrR2h0ZTNleThxWC8yQ3J2QXlrSVhRY3RwMXRmZVp0MW1ZVFRXeGhCT1VZVjVFeUVDM1Jyb21GaVc5UyszVmxKa0MyMGVkWmxXQmNiMXNxcmFjMStML09za2szZkd4bG00MzF6MjZzdXFMY2xzeWUxU0RCUTlkMjMrYWN1MnlYaTU5dmtPQ1JEU0lGRUttOXdLTDJSNHdZNFI4QjJTMVpwUjJuMjJEVGNlSzV1QnczSlAwL3BkMEcySzZYL3R1Mk9mY2UxM25kV0hwdGY1RHQrN2U1MW1lSGc3M1hFYmthelZxUjM3bEdXaVhPOVJnd1lJQzFiUnR1SmlrUU4wRmxHTmRick10RytrdzQwUGEvYTRIMTJla3c3MHpETmZ2a0ZaZmF4Q3Zmc3ZGZTVsSFloaVdhSWdjUXpUYlh6SFI5b0xVeDl3UE5TU3FWZUZQZkJ2dHhQRzVNQlNWdGJadXpiN2M5L2pMVDhrczcrR2N6UTgxVlkwNjV6aWJmL2IxMUdNanE0b0dNNUY3Qm5CQUZFODArQjVxTG9GS002eTAyMXE3UFVOdi96bmsyK0lCZnU0by9FcStjMnc4Y2EvdmZ2ZEFHN25HOG15V1BIMlVrZ0hUcjFzMjZkdTNxK2o3U1dha1hpTHRVS3ZHbXZBMDJIU2VlaTh0eFU5R0V3WkZIL2NIMjh3Skp4MkVUWENCSWx5NHh1OHNsTDl0dVY3eSs3aG9qSVg1R2N4ZHBHRzhpRGVuVlNyME5jTjF6aHZGR3dERGVhTGJhYXF2MUZXTmNiMFg3RXJmanVKajMzalAyOWpVbjJjcDVYL3BuNnBiWHVxMWJ2MnJ6ZlUveDNrL1RkcEFINVJsWEdTc2REZWx0Z09BQk5DbFZoUG9qanZOdHNCL0g0N2pvTm1wWG0zVDlSMTVnK0wzbEZyWHh6OWJpdmQ1K0U0KzIvZjgyendidmQ1cDMyTFRCSXh0UVFrQTlna294cnJkSW5mb3ZoaDl5bnJ2bXlLRDl6L0RQcnJQWjNpZmI1SHNXMlUvT3VNbE5Qa1JxTXRhRTFZQm93b3FBSnF4b1dBc3IybkdjVmE1ZWJuTmUvYWYxbW5DQTVjWDBtdVJCZWNZVkdRaFFELzBCcXpLTTZ5M0N5eTh1dFg2N1RJbHQ4TWdHQ20reC9oVEcvWTlFZjhoeFJ2bEZRL2xGUS9sRkUvZnlJd01CQUlSQ0FBR0FGa0RaeklvVks5eFduNHFLQ2x1NmRLbFZwYkQwUFUxWUVaRUNSMFA1UlVQNVJkT2N5dS94eHgrM045NTR3enAzN213bm4zeXlmM2Fkano3NnlKNTg4a2xidG15Wk85WWxOL2JaWngvcjMvL0hWWVJYclZwbC8vclh2K3lUVHo1eC82K21aV2lacWttVEp0VTVSWU1NQkFDeTNILys4eDk3ODgwM3JheXN6R1VRaVdiUG5tMFBQUENBOWUzYjEwNDg4VVE3L1BERDNhVHZ1KysrMjM3NDRRZi9VV2IzM1hlZmUreUJCeDVvSjUxMGtrMllNRUdqT0czNjlPbitJellXT1lBb01uWHMyTkg2OU9uak5yMEJBRURqVUxidzZLT1AyckJodzZ4WHIxNysyUis5K09LTDFxNWRPNXM4ZWJKYmRrb3Jwdi8wcHorMXlzcEtlK2VkZDl4anZ2NzZheGM4ZHQ5OWQzZU5KeTFOdGROT085bWdRWVBzcmJmZXFyTTVLM1FBVWVwWFVsSmlXMnl4aFoxenpqbDJ6ejMzMkoxMzNtbW5uSEtLUzQvaW5ob0NRSFB3L3Z2djI0SUZDMXpsWDV1dUZxdmdNSERnUUxmWWJVQ0JSSmZkK082Nzc5enhsMSt1VytKRkFTUFI1cHR2N29LSGZuNHlvUUtJMHA4ZVBYcTRpSGJERFRlNHRFalI3SU1QUG5BWnlISEhIZWNpSGdDZzRXZ05RalV4N2JERERrbXZ3NlFPY3dVUnRSTFZwcnA2NWNxVmJsOTlJOFhGeGRhNmRXdDNIQWhhbE9ycWVFOHJnQ2lDNlVYcWtyWG5uMysrWFhIRkZhN0RSbTFwenozM25NMmZQOSs5RUwycDZ1cHEvMWtBZ0lhZ2VsZnJFSTRmUDk0L3M2RWdRT2d4dGVtY09zNUZqNnZyTWJKNjlXcDNXMXZLQVVUQlEyblBsQ2xUYk5xMGFYYnd3UWZidSsrKzY1cXRGRGdTNlVVcGlBQUFHc2IzMzMvdk9zNzMzSFBQVFM1a3F5d2ttY1RuMWZlbFAvSW9MR1VlUng1NXBGMTQ0WVV1bU54MjIyMzI3My8vMi8ybjZzUlpzMmFOLzhoMW5UcnBERDhEQUtSSHczTFYyZDJtVFJzM0NrdWJNZ1hWeWRwWG5SdzBTU1hXendHZFV6KzJxUG1xcnNkSThMamFVZzRndWxDVXJuLys0WWNmMnIzMzNydCsrTmVpUll0Y0U1Yk9Bd0FheDd4NTgxeWdVRDkwc0gzeHhSZXV2MEw3cjczMm1nc2dHdEMwY09GQy8xbnI2QXUrenJWdjM5NGRLd2lwSHp1WUp4SlEvUzUxOVdtbkhFQVVpVFJKWmNhTUdlNVlUVlJQUC8yMC9lVXZmN0hseTVmYnR0dHU2ODREQUJxZTVtcWNkdHBwRzJ5REJ3KzIwdEpTdDY5NUhQbjUrZGF6WjA4WFdCS0g0czZhTmN0MU5XaVVsV2lPaUh6NjZhZnVWaFJrVk45MzZ0VEpqYXhOSnVVQW9zaWtvYnFhMGZqdHQ5KzZ3UEhLSzYrNFRwYmpqei9lWlNjQWdNYWhyRUdqcEJJM3RSU3BpMEg3R2kwcjIyKy92ZXNrRDFxS1huLzlkWHZ3d1FkZG43YW1ZWWdDaVk0MW91dlZWMTkxajlQRXdybHo1OXJFaVJQZFk1TFJaSTJVT3l1VUNnV3BUdEJKcnVGaEYxMTBrWFh2M3QxMXFvdkdGcXVQUkkrTEt1NTlLYzFwS1lTbVFQbEZRL2xGMDl6S1R3RkFsZjRSUnh6aG4xbEhVeXhlZXVrbDF5UlZWRlRrQW9ZQ1ErS3dYVFY5UGZYVVV5NWJVZDNkcFVzWEYzeUdEQm5pUDJKamFRV1FaUFNmcUdOZDBZc0FFaitVWHpTVVh6U1VYelJ4TDcrVW03QUFBRWhFQUFHQVprN05VcGRmZnJucmVsQldjOHN0dDJSazVDd0JCQUNhT1ExeVVqLzE4ODgvN3haUVZFZTdGbCtNaWdBQ0FDM0FYbnZ0WmUrOTk1NWIvbVMvL2ZiTFNQOFBBUVFBV2dBTjhkV21tZXJCRU4rb0NDQUEwQUpvaU82SUVTTnM1TWlSN3VxRm1VQUFBWUJtVHRjRTBleHpMZnUrODg0N3U2a1d1blJ0VkFRUUFHam10Qmp1VVVjZDVacXd0SHJJMFVjZjdTN0ZFUlVCQkFDYUFmVnRMRm15WlAwMVBoSnBMU3ZOT3RjeVZOcTBYbGF5aTB5Smxvbi82cXV2YlBIaXhmNlp1cWtiUHRKVVIyYWlNNU0xQ3Nvdkdzb3ZtdVpVZmxvbFhjMVNXZ2RMaXlrbTBxVTNOUG9xV0ZCUm1jZysrK3pqK2tRQ0NoajMzMysvVytVM29FdmhIbmpnZ1Vrdk5pVmtJQUNRNVRSUlVDdnA2Z3Q5N2FDakJYQzFjdm8yMjJ4ajU1NTdycDE2NnFudWt1UVBQZlRRK21YZWRjRXBMWlpiVVZIaExsSCttOS84eGwyeVhOZEtmK0tKSjl4amtrazdnR2dDU3JEcEtsVzZyU3VLYitwK0FFQTBhcnBTSlQ5dTNEZ1hRR3BUOXFIK2psMTIyY1ZsRW1yTzJuZmZmVjNRQ0ZxTlB2LzhjOWQwdGZ2dXU3dldKR1VvR3EybHlZWmEwbDJCSlptVUE0Z0NnZGFGSHpWcTFBYWJsZ05PMXBhbUsxZ05IejdjdlFpbFFYbytBQ0N6ZE9Fb1hZbFFvNnRxVTVQVm5EbHpYQjJjK0VWZVFVUVhrOUlGcVdUMjdObnUvbjc5K3JuandJQUJBMXlnVVhCSkp1VmFYYjM0eHg1N3JFdUZIbnZzc2ZYYlhYZmRaVHZ1dUtPTGdnRk5VaGs2ZEtqZGZ2dnQ5c2dqajdpclkya3FQVUVFQURKSDEybDY0WVVYM05Mc1dxYTlOaTNSTHNHVkJ4UHBuSzRUSW5xY090bHI5M1VFVnlJTUhsZGJXaG1Jc29yMzMzL2Zyci8rZXJkZGQ5MTE3c0pTMTF4enpmb3JGWXBTb0QzMjJNTzFzZDEwMDAzMjRvc3YycFFwVTF6UFB3QWdNL1NGWHMxV2FnMUtKcWo0azNXQzYycUZ5bHhFajFPelZXM0I4NExIMVpaeUFGR0VVc2J4OGNjZisyZlNvelFvdUFnVkFDQ2FiNzc1eHEyb08yblNwQTJhcHhJRnJUNkpsN01OcUxOZFFVVDB1TG9lSThIamFrczVnS2dUUlIwdUR6endnQzFZc01CbXpwenBqbFBkTklSTTExVUhBRVNucFVtNmR1MXFQL3p3Z3h0cHBVMzdxcXUxdjNUcDB2VlhIRXhXOXlxclVLdVNGQmNYSjMxTU1LZEVWNkpOUm1FcnJZSGFTblBVMXBadU5xRU1KTXk4RU1hUlIwUDVSVVA1UlVQNVJWTmYrVjEyMldXMmZQbHkvMmhqdSs2NnF4dTYrOGMvL3RIMVNSOXd3QUgrUGV2cTQ2bFRwN3JMMVdxNHJpNkYrOG9ycjdqNUk1cEhFdEJsY0o5OTlsazc4OHd6azNaQnBCMUFHaHNmd0dnb3YyZ292MmdvdjJqU0xiKy8vLzN2YmlMMzZhZWY3cDh4TjZsYmt3TjFMdWhvVjUvMWd3OCthSWNjY29nTkhqell6VHpYb0NjRm5Ra1RKcmpIYUdDVStyaVZuUngzM0hIdVhHME1pd0tBWmt6elA5U3NOVzNhTkpkbGFDWGVoeDkrMkEzdDNYenp6ZDFqTkh5M2YvLytycXRCOTcvODhzdDI4ODAzdXlZeERZaXFDeGxJUkh3RGpJYnlpNGJ5aTZhNWxkK3JyNzdxNW16b2dsR0oxT0d1Q1lXTEZpMXlXWWdDeDdiYmJ1c21ld2ZVeGFBbUs2M2FxMzJON3RwdXUrM2NsUXpyUWdDSmlEL2dhQ2kvYUNpL2FDaS9hR2pDQWdDRVFnQUJBSVJnOXY4QjRoTU9wSStYbHRzQUFBQUFTVVZPUks1Q1lJST1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXROb3JtYWwoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FJQUFBQ1FkMVBlQUFBRkRtbFVXSFJZVFV3NlkyOXRMbUZrYjJKbExuaHRjQUFBQUFBQVBEOTRjR0ZqYTJWMElHSmxaMmx1UFNMdnU3OGlJR2xrUFNKWE5VMHdUWEJEWldocFNIcHlaVk42VGxSamVtdGpPV1FpUHo0S1BIZzZlRzF3YldWMFlTQjRiV3h1Y3pwNFBTSmhaRzlpWlRwdWN6cHRaWFJoTHlJZ2VEcDRiWEIwYXowaVdFMVFJRU52Y21VZ05TNDFMakFpUGdvZ1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNEtJQ0E4Y21SbU9rUmxjMk55YVhCMGFXOXVJSEprWmpwaFltOTFkRDBpSWdvZ0lDQWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWdvZ0lDQWdlRzFzYm5NNmNHaHZkRzl6YUc5d1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM0JvYjNSdmMyaHZjQzh4TGpBdklnb2dJQ0FnZUcxc2JuTTZaWGhwWmowaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOWxlR2xtTHpFdU1DOGlDaUFnSUNCNGJXeHVjenAwYVdabVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM1JwWm1Zdk1TNHdMeUlLSUNBZ0lIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2Ylcwdklnb2dJQ0FnZUcxc2JuTTZjM1JGZG5ROUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlVWMlpXNTBJeUlLSUNBZ2VHMXdPa055WldGMFpVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNamc2TURZck1ESXdNQ0lLSUNBZ2VHMXdPazF2WkdsbWVVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNekE2TWpFck1ESTZNREFpQ2lBZ0lIaHRjRHBOWlhSaFpHRjBZVVJoZEdVOUlqSXdNak10TURVdE1EWlVNakk2TXpBNk1qRXJNREk2TURBaUNpQWdJSEJvYjNSdmMyaHZjRHBFWVhSbFEzSmxZWFJsWkQwaU1qQXlNeTB3TlMwd05sUXlNam95T0Rvd05pc3dNakF3SWdvZ0lDQndhRzkwYjNOb2IzQTZRMjlzYjNKTmIyUmxQU0l6SWdvZ0lDQndhRzkwYjNOb2IzQTZTVU5EVUhKdlptbHNaVDBpYzFKSFFpQkpSVU0yTVRrMk5pMHlMakVpQ2lBZ0lHVjRhV1k2VUdsNFpXeFlSR2x0Wlc1emFXOXVQU0l4SWdvZ0lDQmxlR2xtT2xCcGVHVnNXVVJwYldWdWMybHZiajBpTVNJS0lDQWdaWGhwWmpwRGIyeHZjbE53WVdObFBTSXhJZ29nSUNCMGFXWm1Pa2x0WVdkbFYybGtkR2c5SWpFaUNpQWdJSFJwWm1ZNlNXMWhaMlZNWlc1bmRHZzlJakVpQ2lBZ0lIUnBabVk2VW1WemIyeDFkR2x2YmxWdWFYUTlJaklpQ2lBZ0lIUnBabVk2V0ZKbGMyOXNkWFJwYjI0OUlqY3lMekVpQ2lBZ0lIUnBabVk2V1ZKbGMyOXNkWFJwYjI0OUlqY3lMekVpUGdvZ0lDQThlRzF3VFUwNlNHbHpkRzl5ZVQ0S0lDQWdJRHh5WkdZNlUyVnhQZ29nSUNBZ0lEeHlaR1k2YkdrS0lDQWdJQ0FnYzNSRmRuUTZZV04wYVc5dVBTSndjbTlrZFdObFpDSUtJQ0FnSUNBZ2MzUkZkblE2YzI5bWRIZGhjbVZCWjJWdWREMGlRV1ptYVc1cGRIa2dVR2h2ZEc4Z01pQXlMakF1TkNJS0lDQWdJQ0FnYzNSRmRuUTZkMmhsYmowaU1qQXlNeTB3TlMwd05sUXlNam96TURveU1Tc3dNam93TUNJdlBnb2dJQ0FnUEM5eVpHWTZVMlZ4UGdvZ0lDQThMM2h0Y0UxTk9raHBjM1J2Y25rK0NpQWdQQzl5WkdZNlJHVnpZM0pwY0hScGIyNCtDaUE4TDNKa1pqcFNSRVkrQ2p3dmVEcDRiWEJ0WlhSaFBnbzhQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCswSWdWeEFBQUFZQnBRME5RYzFKSFFpQkpSVU0yTVRrMk5pMHlMakVBQUNpUmRaSFBLMFJSRk1jL00zN21SNk5ZS0JZdkRhdWhRWW1OeGNpdndtS01NdGpNdlBtbDVvM1hlMi9TWkt0c0ZTVTJmaTM0QzlncWE2V0lsR3haRXh2MG5PZXBrY3k1blhzKzkzdnZPZDE3TG5naldWVXp5NE9nNVN3alBCcFNacU56U3RVakZWVFNSQXUrbUdycWs5TWpFVXJhMncwZUoxNTFPclZLbi92WGFoTkpVd1ZQdGZDZ3FodVc4Smp3eExLbE83d3AzS1JtWWduaFkrR0FJUmNVdm5iMHVNdFBEcWRkL25EWWlJU0h3TnNncktSL2Nmd1hxeGxERTVhWDQ5ZXllZlhuUHM1TDZwSzVtV21KYmVLdG1JUVpKWVRDT01NTTBVYzNBekwzMFVrUFhiS2lSSDd3TzMrS0pjbFZaZFlwWUxCSW1nd1dBVkh6VWowcE1TVjZVa2FXZ3RQL3YzMDFVNzA5YnZXNkVGUTgyUFpMTzFSdHdPZTZiYi92Mi9ibkFaVGR3MW11bUwrMEIvMnZvcThYTmY4dStGYmg1THlveGJmZ2RBMmE3L1NZRWZ1V3lzUzlxUlE4SDBGOUZCb3ZvV2JlN2RuUFBvZTNFRm1ScjdxQTdSM29rUE8raFM4MjRXZlFneEdDY2dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQXhKUkVGVUNKbGphR2o0RHdBRGd3SUFWYmpXUHdBQUFBQkpSVTVFcmtKZ2dnPT1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUb29uKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUDhBQUFBQkNBWUFBQUFSa0hpakFBQUJoR2xEUTFCSlEwTWdjSEp2Wm1sc1pRQUFLSkY5a1QxSXcwQWN4Vi9UU290VUJPMGc0cENoT3RsRlJSeExGWXRnb2JRVlduVXd1ZlFMbWpRa0tTNk9nbXZCd1kvRnFvT0xzNjRPcm9JZytBSGk3T0NrNkNJbC9pOHB0SWp4NExnZjcrNDk3dDRCUXF2R1ZETVFCMVROTWpMSmhKZ3ZySXJCVndRUlFCZ2hERW5NMUZQWnhSdzh4OWM5Zkh5OWkvRXM3M04vamdHbGFETEFKeExIbVc1WXhCdkVzNXVXem5tZk9NSXFra0o4VGp4cDBBV0pIN2t1dS96R3VleXd3RE1qUmk0elR4d2hGc3M5TFBjd3F4Z3E4UXh4VkZFMXloZnlMaXVjdHppcnRRYnIzSk8vTUZ6VVZySmNwem1HSkphUVFob2laRFJRUlEwV1lyUnFwSmpJMEg3Q3d6L3ErTlBra3NsVkJTUEhBdXBRSVRsKzhELzQzYTFabXA1eWs4SUpvTy9GdGovR2dlQXUwRzdhOXZleGJiZFBBUDh6Y0tWMS9mVVdNUGRKZXJPclJZK0F3VzNnNHJxcnlYdkE1UTR3OHFSTGh1UklmcHBDcVFTOG45RTNGWURoVzZCL3plMnRzNC9UQnlCSFhTM2ZBQWVId0VTWnN0YzkzaDNxN2UzZk01MytmZ0E0T1hLUHQvN0svZ0FBQUFaaVMwZEVBUDhBQUFBQU15ZDg4d0FBQUFsd1NGbHpBQUF1SXdBQUxpTUJlS1UvZGdBQUFBZDBTVTFGQitnSEJBd2RKMWo5V0JzQUFBQVpkRVZZZEVOdmJXMWxiblFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJYZ1E0WEFBQUFWVWxFUVZRb3oyTmtZR0Q0enpBS2hoNWdaV0JnNEdCZ1lPQkVvMkZzS0orWGs0RkJpcE9CUVpvRFFrdHhNakNJc0RFd1NIRkFNUmVFNXNWbURoY1dPMWdZR0JnWUdNbElOdmowTUk3d1pFaXMvNmtiaGdDMDRRai93Ny9IWmdBQUFBQkpSVTVFcmtKZ2dnPT1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJY29uTGlnaHQoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIHZpZXdCb3g9JzAgMCAxNiAxNicgdmVyc2lvbj0nMS4xJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGlkPSdMaWdodCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlJTNFIC5zJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2Utd2lkdGg6LjFweDslN0QgJTNDL3N0eWxlJTNFJTNDcmVjdCBjbGFzcz0ncycgeD0nMC4xNzAzOTI5MycgeT0nMTAuMDAyNDQ4JyB3aWR0aD0nMy45MDAwNTY4JyBoZWlnaHQ9JzAuOTAwMDk5MzQnIGlkPSdOTkUnIHRyYW5zZm9ybT0ncm90YXRlKC02Ny41KScgLyUzRSUzQ3JlY3QgeD0nOC44Mjk1MDc4JyB5PScxMC4wMDI0NDcnIHdpZHRoPSczLjkwMDA1NjgnIGhlaWdodD0nMC45MDAwOTkzNCcgaWQ9J0VORScgdHJhbnNmb3JtPSdyb3RhdGUoLTIyLjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nMTQuOTUyNDY5JyB5PSczLjg3OTU3MTcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J0VTRScgdHJhbnNmb3JtPSdyb3RhdGUoMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScxNC45NTI0NycgeT0nLTQuNzc5NTQyOScgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nU1NFJyB0cmFuc2Zvcm09J3JvdGF0ZSg2Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9Jy0xMi43Mjk1NjUnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nU1NXJyB0cmFuc2Zvcm09J3JvdGF0ZSgtNjcuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PSctNC4wNzA0NDk4JyB5PScxMC4wMDI0NDcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J1dTVycgdHJhbnNmb3JtPSdyb3RhdGUoLTIyLjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nMi4wNTI0Njg1JyB5PSczLjg3OTU3MTcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J1dOVycgdHJhbnNmb3JtPSdyb3RhdGUoMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScyLjA1MjQ2ODUnIHk9Jy00Ljc3OTU0MjknIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J05OVycgdHJhbnNmb3JtPSdyb3RhdGUoNjcuNSknIGNsYXNzPSdzJyAvJTNFJTNDZWxsaXBzZSBpZD0nQ0VOVEVSJyBjeD0nOC4wMDAwODInIGN5PSc4LjAwMDI1NzUnIHJ4PSczLjQ1MDA4MjMnIHJ5PSczLjQ1MDI1NzMnIGNsYXNzPSdzJyAvJTNFJTNDL3N2ZyUzRVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25DYW1lcmEoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIGlkPSdDYW1lcmEnIHZpZXdCb3g9JzAgMCAxNiAxNicgdmVyc2lvbj0nMS4xJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NzdHlsZSBpZD0nc3R5bGUxJyUzRS5zJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2Utd2lkdGg6LjFweDslN0QgJTNDL3N0eWxlJTNFJTNDcGF0aCBjbGFzcz0ncycgZD0nTSAxMy44NTczMjIsOC44NzU1Mjk3IEggMTIuNDEzNDI0IEwgMTIuNDEzLDYuNzg3IGggLTEuNDI1MzExIGMgMC4yMjcwMjYsLTAuNDQ5NDY5MyAwLjM2MzI0MywtMC45NDUzOTE5IDAuMzYzMjQzLC0xLjQ4ODUwMDggMCwtMS43OTc4Nzc1IC0xLjQwNzU3MjcsLTMuMjQ5Mjg5MyAtMy4xNTExNDY2LC0zLjI0OTI4OTMgLTEuNzQzNTc0NiwwIC0zLjE1MTE0NzksMS40NTE0MTE4IC0zLjE1MTE0NzksMy4yNDkyODkzIHYgMC4wMjgwOTMgQyA0LjU3NjQxOTQsNS4wMzYzMTE4IDQuMDMxNTUyNCw0Ljg1ODM5NjggMy40NTAzNjA2LDQuODU4Mzk2OCAxLjcwNjc4NjMsNC44Njc3NTY3IDAuMjk5MjEyOTgsNi4zMTkxNzIzIDAuMjk5MjEyOTgsOC4xMDc2ODYgYyAwLDEuNzg4NTEzNSAxLjY2NTM4NTgyLDMuMzExNzg5IDMuNDI0NTg1MTIsMy4yNDkyODkgTCAzLjczMiwxMy45NzYgaCA4LjY4MSB2IC0yLjExMzM2OCBoIDEuNDQ0MzIyIHonIGlkPSdwYXRoMScgLyUzRSUzQ3JlY3QgY2xhc3M9J3MnIHg9JzEyLjgwMzkxJyB5PSc4LjM5Nzk2ODMnIHdpZHRoPScyLjg5Njg3NjYnIGhlaWdodD0nMy44ODYwMzc2JyByeD0nMCcgcnk9JzAnIGlkPSdyZWN0MScgLyUzRSUzQy9zdmclM0UlMEFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJY29uQXVkaW8oKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIGlkPSdBdWRpbycgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlJTNFLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdNIDkuMTU2MzU4OCwxLjA4MDQwMDYgMy42NzI5MzQxLDQuNjQyMDE3IEggMC41NDM2NDk3MSB2IDYuNzg0MDMxIEggMy43NTkwNjEyIGwgNS4zOTcyOTc2LDMuNDkzNzc2IHonIGlkPSdwYXRoMScgLyUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J20gMTMuMzQ3NTE4LDEzLjY3NjY0NSAtMC43NjUxNTcsLTAuNTYzNTY2IGMgNC4yMjc0ODUsLTUuNTYwNTI0MSAwLjIxMDQxOCwtOS44ODEyMDIgMC4wMzgyNSwtMTAuMDU5NjY0OCBsIDAuNjk4MjA0LC0wLjY0ODEwMTkgYyAwLjA0NzgyLDAuMDQ2OTY0IDQuNzUzNTMsNS4wNjI3MDc2IDAuMDM4MjUsMTEuMjcxMzMyNyB6JyBpZD0ncGF0aDInIC8lM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdtIDExLjMyMTg2OCwxMS43OTgwOSAtMC44MjI1NDEsLTAuNDc5MDMyIGMgMi4xNDI0MzQsLTMuNTc4NjQ3NCAwLjExNDc3MywtNi4zNTg5MSAwLjAyODY5LC02LjQ3MTYyMzIgbCAwLjc2NTE1NiwtMC41NjM1NjY2IGMgMC4xMDUyMDgsMC4xNDA4OTE1IDIuNTA1ODgzLDMuMzgxNDAwMSAwLjAyODY5LDcuNTA0ODI5OCB6JyBpZD0ncGF0aDMnIC8lM0UlM0Mvc3ZnJTNFJTBBXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZ2V0SWNvblBhcnRpY2xlcygpOiBzdHJpbmcge1xyXG4gICAgLy8gICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyUzRiUzRSUzQ3N2ZyBpZD0nUGFydGlrZWxfVjInIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDE2LjI4IDE2LjUyJyUzRSUzQ2RlZnMlM0UlM0NzdHlsZSUzRS5jbHMtMSU3QmZpbGw6JTIzZmZmO3N0cm9rZTolMjMwMDA7c3Ryb2tlLW1pdGVybGltaXQ6MTUuMTI7c3Ryb2tlLXdpZHRoOi4yNXB4OyU3RCUzQy9zdHlsZSUzRSUzQy9kZWZzJTNFJTNDY2lyY2xlIGNsYXNzPSdjbHMtMScgY3g9JzQuNzInIGN5PSc1LjQ3JyByPScyLjUyJy8lM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nMTEuMjYnIGN5PSc4LjI4JyByPScxLjc1Jy8lM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nNS45NScgY3k9JzEyLjA1JyByPScxLjI5Jy8lM0UlM0Mvc3ZnJTNFXCI7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwiLy8gLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0V2ZW50L0V2ZW50LnRzXCIvPlxyXG4vLyAvPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGltZS9UaW1lLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBtb2RlIGEgbG9vcCBydW5zIGluXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gTE9PUF9NT0RFIHtcclxuICAgIC8qKiBMb29wIGN5Y2xlcyBjb250cm9sbGVkIGJ5IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKi9cclxuICAgIEZSQU1FX1JFUVVFU1QgPSBcImZyYW1lUmVxdWVzdFwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIGNvbnRyb2xsZWQgYnkgeHJTZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZSAqL1xyXG4gICAgRlJBTUVfUkVRVUVTVF9YUiA9IFwiZnJhbWVSZXF1ZXN0WFJcIixcclxuICAgIC8qKiBMb29wIGN5Y2xlcyB3aXRoIHRoZSBnaXZlbiBmcmFtZXJhdGUgaW4ge0BsaW5rIFRpbWUuZ2FtZX0gKi9cclxuICAgIFRJTUVfR0FNRSA9IFwidGltZUdhbWVcIixcclxuICAgIC8qKiBMb29wIGN5Y2xlcyB3aXRoIHRoZSBnaXZlbiBmcmFtZXJhdGUgaW4gcmVhbHRpbWUsIGluZGVwZW5kZW50IG9mIHtAbGluayBUaW1lLmdhbWV9ICovXHJcbiAgICBUSU1FX1JFQUwgPSBcInRpbWVSZWFsXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvcmUgbG9vcCBvZiBhIEZVREdFIGFwcGxpY2F0aW9uLiBJbml0aWFsaXplcyBhdXRvbWF0aWNhbGx5IGFuZCBtdXN0IGJlIHN0YXJ0ZWQgZXhwbGljaXRseS5cclxuICAgKiBJdCB0aGVuIGZpcmVzIHtAbGluayBFVkVOVC5MT09QX0ZSQU1FfSB0byBhbGwgYWRkZWQgbGlzdGVuZXJzIGF0IGVhY2ggZnJhbWVcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExvb3AgZXh0ZW5kcyBFdmVudFRhcmdldFN0YXRpYyB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVTdGFydEdhbWU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVTdGFydFJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZUdhbWU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZVJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZVN0YXJ0R2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lU3RhcnRSZWFsOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lTGFzdEZyYW1lR2FtZUF2ZzogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUxhc3RGcmFtZVJlYWxBdmc6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGkkZyYW1lczogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIHJ1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgc3RhdGljIG1vZGU6IExPT1BfTU9ERSA9IExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaWRJbnRlcnZhbGw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZFJlcXVlc3Q6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmcHNEZXNpcmVkOiBudW1iZXIgPSAzMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGZyYW1lc1RvQXZlcmFnZTogbnVtYmVyID0gMzA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBzeW5jV2l0aEFuaW1hdGlvbkZyYW1lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFRoZSBnYW1ldGltZSB0aGUgbG9vcCB3YXMgc3RhcnRlZCwgb3ZlcndyaXR0ZW4gYXQgZWFjaCBzdGFydCAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZVN0YXJ0R2FtZSgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVTdGFydEdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgdGhlIGxvb3Agd2FzIHN0YXJ0ZWQsIG92ZXJ3cml0dGVuIGF0IGVhY2ggc3RhcnQgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVTdGFydFJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lU3RhcnRSZWFsOyB9XHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgbG9vcCBjeWNsZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZUZyYW1lR2FtZSgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVGcmFtZUdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBsb29wIGN5Y2xlICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVSZWFsKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lUmVhbDsgfVxyXG4gICAgLyoqIFRoZSBnYW1ldGltZSB0aGUgbGFzdCBsb29wIGN5Y2xlIHN0YXJ0ZWQqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZUZyYW1lU3RhcnRHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lU3RhcnRHYW1lOyB9XHJcbiAgICAvKiogVGhlIHJlYWx0aW1lIHRoZSBsYXN0IGxvb3AgY3ljbGUgc3RhcnRlZCovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVTdGFydFJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWw7IH1cclxuICAgIC8qKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgaW4gZ2FtZXRpbWUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZwc0dhbWVBdmVyYWdlKCk6IG51bWJlciB7IHJldHVybiAxMDAwIC8gTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnOyB9XHJcbiAgICAvKiogVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kIGluIHJlYWx0aW1lICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBmcHNSZWFsQXZlcmFnZSgpOiBudW1iZXIgeyByZXR1cm4gMTAwMCAvIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZzsgfVxyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZnJhbWVzIHRyaWdnZXJlZCBzbyBmYXIgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZyYW1lcygpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GkkZyYW1lczsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoZSBsb29wIHdpdGggdGhlIGdpdmVuIG1vZGUgYW5kIGZwcy4gIFxyXG4gICAgICogVGhlIGRlZmF1bHQgZm9yIF9tb2RlIGlzIEZSQU1FX1JFUVVFU1QsIHNlZSB7QGxpbmsgTE9PUF9NT0RFfSwgaG9va2luZyB0aGUgbG9vcCB0byB0aGUgYnJvd3NlcidzIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqIElzIG9ubHkgYXBwbGljYWJsZSBpbiBUSU1FLW1vZGVzLlxyXG4gICAgICogX3N5bmNXaXRoQW5pbWF0aW9uRnJhbWUgaXMgZXhwZXJpbWVudGFsIGFuZCBvbmx5IGFwcGxpY2FibGUgaW4gVElNRS1tb2RlcywgZGVmZXJyaW5nIHRoZSBsb29wLWN5Y2xlIHVudGlsIHRoZSBuZXh0IHBvc3NpYmxlIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdGFydChfbW9kZTogTE9PUF9NT0RFID0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QsIF9mcHM6IG51bWJlciA9IDYwLCBfc3luY1dpdGhBbmltYXRpb25GcmFtZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIExvb3Auc3RvcCgpO1xyXG5cclxuICAgICAgTG9vcC7GklRpbWVTdGFydEdhbWUgPSBUaW1lLmdhbWUuZ2V0KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lU3RhcnRSZWFsID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWUgPSBMb29wLsaSVGltZVN0YXJ0R2FtZTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0UmVhbCA9IExvb3AuxpJUaW1lU3RhcnRSZWFsO1xyXG4gICAgICBMb29wLmZwc0Rlc2lyZWQgPSAoX21vZGUgPT0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QpID8gNjAgOiBfZnBzO1xyXG4gICAgICBMb29wLmZyYW1lc1RvQXZlcmFnZSA9IExvb3AuZnBzRGVzaXJlZDtcclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnID0gTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnID0gMTAwMCAvIExvb3AuZnBzRGVzaXJlZDtcclxuICAgICAgTG9vcC5tb2RlID0gX21vZGU7XHJcbiAgICAgIExvb3Auc3luY1dpdGhBbmltYXRpb25GcmFtZSA9IF9zeW5jV2l0aEFuaW1hdGlvbkZyYW1lO1xyXG5cclxuICAgICAgbGV0IGxvZzogc3RyaW5nID0gYExvb3Agc3RhcnRpbmcgaW4gbW9kZSAke0xvb3AubW9kZX1gO1xyXG4gICAgICBpZiAoTG9vcC5tb2RlICE9IExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUKVxyXG4gICAgICAgIGxvZyArPSBgIHdpdGggYXR0ZW1wdGVkICR7X2Zwc30gZnBzYDtcclxuICAgICAgRGVidWcuZnVkZ2UobG9nKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoX21vZGUpIHtcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUOlxyXG4gICAgICAgICAgTG9vcC5sb29wRnJhbWUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1RfWFI6XHJcbiAgICAgICAgICBMb29wLmxvb3BGcmFtZVhSKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX1JFQUw6XHJcbiAgICAgICAgICBMb29wLmlkSW50ZXJ2YWxsID0gd2luZG93LnNldEludGVydmFsKExvb3AubG9vcFRpbWUsIDEwMDAgLyBMb29wLmZwc0Rlc2lyZWQpO1xyXG4gICAgICAgICAgTG9vcC5sb29wVGltZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuVElNRV9HQU1FOlxyXG4gICAgICAgICAgTG9vcC5pZEludGVydmFsbCA9IFRpbWUuZ2FtZS5zZXRUaW1lcigxMDAwIC8gTG9vcC5mcHNEZXNpcmVkLCAwLCBMb29wLmxvb3BUaW1lKTtcclxuICAgICAgICAgIExvb3AubG9vcFRpbWUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgTG9vcC5ydW5uaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBsb29wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc3RvcCgpOiB2b2lkIHtcclxuICAgICAgaWYgKCFMb29wLnJ1bm5pbmcpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgc3dpdGNoIChMb29wLm1vZGUpIHtcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUOlxyXG4gICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1RfWFI6XHJcbiAgICAgICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbi5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbiA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX1JFQUw6XHJcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChMb29wLmlkSW50ZXJ2YWxsKTtcclxuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX0dBTUU6XHJcbiAgICAgICAgICBUaW1lLmdhbWUuZGVsZXRlVGltZXIoTG9vcC5pZEludGVydmFsbCk7XHJcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoTG9vcC5pZFJlcXVlc3QpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBMb29wLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJMb29wIHN0b3BwZWQhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGludWUgcnVubmluZyB0aGUgbG9vcFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRpbnVlKCk6IHZvaWQge1xyXG4gICAgICBpZiAoTG9vcC5ydW5uaW5nKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIExvb3Auc3RhcnQoTG9vcC5tb2RlLCBMb29wLmZwc0Rlc2lyZWQsIExvb3Auc3luY1dpdGhBbmltYXRpb25GcmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcCgpOiB2b2lkIHtcclxuICAgICAgbGV0IHRpbWU6IG51bWJlcjtcclxuICAgICAgdGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lUmVhbCA9IHRpbWUgLSBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsID0gdGltZTtcclxuXHJcbiAgICAgIHRpbWUgPSBUaW1lLmdhbWUuZ2V0KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVHYW1lID0gdGltZSAtIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWU7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWUgPSB0aW1lO1xyXG5cclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnID0gKChMb29wLmZyYW1lc1RvQXZlcmFnZSAtIDEpICogTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnICsgTG9vcC7GklRpbWVGcmFtZUdhbWUpIC8gTG9vcC5mcmFtZXNUb0F2ZXJhZ2U7XHJcbiAgICAgIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZyA9ICgoTG9vcC5mcmFtZXNUb0F2ZXJhZ2UgLSAxKSAqIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZyArIExvb3AuxpJUaW1lRnJhbWVSZWFsKSAvIExvb3AuZnJhbWVzVG9BdmVyYWdlO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgTG9vcEV2ZW50IHdoaWNoIGNvbnZleXMgaW5mb3JtYXRpb24gc3VjaCBhcyB0aW1lRWxhcHNlZCBldGMuLi5cclxuICAgICAgTG9vcC7GkkZyYW1lcysrO1xyXG4gICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0gbmV3IEV2ZW50KEVWRU5ULkxPT1BfRlJBTUUpO1xyXG4gICAgICBMb29wLnRhcmdldFN0YXRpYy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wRnJhbWUoKTogdm9pZCB7XHJcbiAgICAgIExvb3AubG9vcCgpO1xyXG4gICAgICBMb29wLmlkUmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoTG9vcC5sb29wRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcEZyYW1lWFIoX3RpbWU6IG51bWJlciA9IG51bGwsIF94ckZyYW1lOiBYUkZyYW1lID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBMb29wLmxvb3AoKTtcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LmRyYXcodHJ1ZSwgX3hyRnJhbWUpO1xyXG4gICAgICBMb29wLmlkUmVxdWVzdCA9IFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3BGcmFtZVhSKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGxvb3BUaW1lKCk6IHZvaWQge1xyXG4gICAgICBpZiAoTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lKVxyXG4gICAgICAgIExvb3AuaWRSZXF1ZXN0ID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3ApO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgTG9vcC5sb29wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGltZVVuaXRzIHtcclxuICAgIGhvdXJzPzogbnVtYmVyO1xyXG4gICAgbWludXRlcz86IG51bWJlcjtcclxuICAgIHNlY29uZHM/OiBudW1iZXI7XHJcbiAgICB0ZW50aHM/OiBudW1iZXI7XHJcbiAgICBodW5kcmVkcz86IG51bWJlcjtcclxuICAgIHRob3VzYW5kcz86IG51bWJlcjtcclxuICAgIGZyYWN0aW9uPzogbnVtYmVyO1xyXG4gICAgYXNIb3Vycz86IG51bWJlcjtcclxuICAgIGFzTWludXRlcz86IG51bWJlcjtcclxuICAgIGFzU2Vjb25kcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGltZXJzIGV4dGVuZHMgT2JqZWN0IHtcclxuICAgIFtpZDogbnVtYmVyXTogVGltZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBnZW5lcmF0ZSBhIHRpbWVzdGFtcCB0aGF0IGNvcnJlbGF0ZXMgd2l0aCB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbSBidXQgYWxsb3dzIGZvciByZXNldHRpbmcgYW5kIHNjYWxpbmcuICBcclxuICAgKiBTdXBwb3J0cyB7QGxpbmsgVGltZXJ9cyBzaW1pbGFyIHRvIHdpbmRvdy5zZXRJbnRlcnZhbCBidXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzY2FsZWQgdGltZS5cclxuICAgKiBBbGwgdGltZSB2YWx1ZXMgYXJlIGdpdmVuIGluIG1pbGxpc2Vjb25kc1xyXG4gICAqIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRpbWUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgLyoqIFN0YW5kYXJkIGdhbWUgdGltZSBzdGFydGluZyBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIGFwcGxpY2F0aW9uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGdhbWU6IFRpbWUgPSBuZXcgVGltZSgpO1xyXG4gICAgcHJpdmF0ZSBzdGFydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBzY2FsZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbGFzdENhbGxUb0VsYXBzZWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgdGltZXJzOiBUaW1lcnMgPSB7fTtcclxuICAgIHByaXZhdGUgaWRUaW1lckFkZGVkTGFzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IDEuMDtcclxuICAgICAgdGhpcy5vZmZzZXQgPSAwLjA7XHJcbiAgICAgIHRoaXMubGFzdENhbGxUb0VsYXBzZWQgPSAwLjA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHJlcHJlc2VudGlvbnMgb2YgdGhlIHRpbWUgZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzIGluIHZhcmlvdXMgZm9ybWF0cyBkZWZpbmVkIGluIHtAbGluayBUaW1lVW5pdHN9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VW5pdHMoX21pbGxpc2Vjb25kczogbnVtYmVyKTogVGltZVVuaXRzIHtcclxuICAgICAgbGV0IHVuaXRzOiBUaW1lVW5pdHMgPSB7fTtcclxuXHJcbiAgICAgIHVuaXRzLmFzU2Vjb25kcyA9IF9taWxsaXNlY29uZHMgLyAxMDAwO1xyXG4gICAgICB1bml0cy5hc01pbnV0ZXMgPSB1bml0cy5hc1NlY29uZHMgLyA2MDtcclxuICAgICAgdW5pdHMuYXNIb3VycyA9IHVuaXRzLmFzTWludXRlcyAvIDYwO1xyXG5cclxuICAgICAgdW5pdHMuaG91cnMgPSBNYXRoLmZsb29yKHVuaXRzLmFzSG91cnMpO1xyXG4gICAgICB1bml0cy5taW51dGVzID0gTWF0aC5mbG9vcih1bml0cy5hc01pbnV0ZXMpICUgNjA7XHJcbiAgICAgIHVuaXRzLnNlY29uZHMgPSBNYXRoLmZsb29yKHVuaXRzLmFzU2Vjb25kcykgJSA2MDtcclxuXHJcbiAgICAgIHVuaXRzLmZyYWN0aW9uID0gX21pbGxpc2Vjb25kcyAlIDEwMDA7XHJcbiAgICAgIHVuaXRzLnRob3VzYW5kcyA9IF9taWxsaXNlY29uZHMgJSAxMDtcclxuICAgICAgdW5pdHMuaHVuZHJlZHMgPSBfbWlsbGlzZWNvbmRzICUgMTAwIC0gdW5pdHMudGhvdXNhbmRzO1xyXG4gICAgICB1bml0cy50ZW50aHMgPSB1bml0cy5mcmFjdGlvbiAtIHVuaXRzLmh1bmRyZWRzIC0gdW5pdHMudGhvdXNhbmRzO1xyXG5cclxuICAgICAgcmV0dXJuIHVuaXRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRpbWUgYW5kIHNjYWxpbmdcclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjYWxlZCB0aW1lc3RhbXAgb2YgdGhpcyBpbnN0YW5jZSBpbiBtaWxsaXNlY29uZHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKyB0aGlzLnNjYWxlICogKHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5zdGFydCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZW1haW5pbmcgdGltZSB0byB0aGUgZ2l2ZW4gcG9pbnQgb2YgdGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVtYWluZGVyKF90bzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF90byAtIHRoaXMuZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAoUmUtKSBTZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhpcyBpbnN0YW5jZVxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHRpbWUgKGRlZmF1bHQgMC4wKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF90aW1lOiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgdGhpcy5nZXRFbGFwc2VkU2luY2VQcmV2aW91c0NhbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNjYWxpbmcgb2YgdGhpcyB0aW1lLCBhbGxvd2luZyBmb3Igc2xvd21vdGlvbiAoPDEpIG9yIGZhc3Rmb3J3YXJkICg+MSkgXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIFRoZSBkZXNpcmVkIHNjYWxpbmcgKGRlZmF1bHQgMS4wKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2NhbGUoX3NjYWxlOiBudW1iZXIgPSAxLjApOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQodGhpcy5nZXQoKSk7XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIC8vVE9ETzogY2F0Y2ggc2NhbGU9MFxyXG4gICAgICB0aGlzLnJlc2NhbGVBbGxUaW1lcnMoKTtcclxuICAgICAgdGhpcy5nZXRFbGFwc2VkU2luY2VQcmV2aW91c0NhbGwoKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5USU1FX1NDQUxFRCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjYWxpbmcgb2YgdGhpcyB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTY2FsZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgb2Zmc2V0IG9mIHRoaXMgdGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T2Zmc2V0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgc2NhbGVkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoaXMgbWV0aG9kXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlc2V0IGF0IGV2ZXJ5IGNhbGwgdG8gc2V0KC4uLikgYW5kIHNldFNjYWxlKC4uLilcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgY3VycmVudDogbnVtYmVyID0gdGhpcy5nZXQoKTtcclxuICAgICAgbGV0IGVsYXBzZWQ6IG51bWJlciA9IGN1cnJlbnQgLSB0aGlzLmxhc3RDYWxsVG9FbGFwc2VkO1xyXG4gICAgICB0aGlzLmxhc3RDYWxsVG9FbGFwc2VkID0gY3VycmVudDtcclxuICAgICAgcmV0dXJuIGVsYXBzZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRpbWVyc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZTx2b2lkPiB0byBiZSByZXNvbHZlZCBhZnRlciB0aGUgdGltZSBnaXZlbi4gVG8gYmUgdXNlZCB3aXRoIGFzeW5jL2F3YWl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxheShfbGFwc2U6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoX3Jlc29sdmUgPT4gdGhpcy5zZXRUaW1lcihfbGFwc2UsIDEsICgpID0+IF9yZXNvbHZlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBleGFtaW5lIGlmIHdlYi13b3JrZXJzIHdvdWxkIGVuaGFuY2UgcGVyZm9ybWFuY2UgaGVyZSFcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgYW5kIGRlbGV0ZXMgYWxsIHtAbGluayBUaW1lcn1zIGF0dGFjaGVkLiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIFRpbWUtb2JqZWN0IGxlYXZlcyBzY29wZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGxUaW1lcnMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgdGhpcy5kZWxldGVUaW1lcihOdW1iZXIoaWQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlcyB7QGxpbmsgVGltZXJ9IGZvdW5kIHVzaW5nIHRoZSBpbnRlcm5hbCBpZCBvZiB0aGUgY29ubmVjdGVkIGludGVydmFsLW9iamVjdFxyXG4gICAgICogQHBhcmFtIF9pZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVRpbWVyQnlJdHNJbnRlcm5hbElkKF9pZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgbGV0IHRpbWVyOiBUaW1lciA9IHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICBpZiAodGltZXIuaWQgPT0gX2lkKSB7XHJcbiAgICAgICAgICB0aW1lci5jbGVhcigpO1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIGFuIGVhcmx5IG91dCBpcyBPSyBoZXJlLi4uIHNob3VsZCBiZSFcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbGxzIGEgdGltZXIgYXQgdGhpcyB0aW1lIG9iamVjdFxyXG4gICAgICogQHBhcmFtIF9sYXBzZSBUaGUgb2JqZWN0LXRpbWUgdG8gZWxhcHNlIGJldHdlZW4gdGhlIGNhbGxzIHRvIF9jYWxsYmFja1xyXG4gICAgICogQHBhcmFtIF9jb3VudCBUaGUgbnVtYmVyIG9mIGNhbGxzIGRlc2lyZWQsIDAgPSBJbmZpbml0ZVxyXG4gICAgICogQHBhcmFtIF9oYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBjYWxsIGVhY2ggdGhlIGdpdmVuIGxhcHNlIGhhcyBlbGFwc2VkXHJcbiAgICAgKiBAcGFyYW0gX2FyZ3VtZW50cyBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VGltZXIoX2xhcHNlOiBudW1iZXIsIF9jb3VudDogbnVtYmVyLCBfaGFuZGxlcjogVGltZXJIYW5kbGVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSk6IG51bWJlciB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cclxuICAgICAgbmV3IFRpbWVyKHRoaXMsIF9sYXBzZSwgX2NvdW50LCBfaGFuZGxlciwgLi4uX2FyZ3VtZW50cyk7XHJcbiAgICAgIC8vdGhpcy5hZGRUaW1lcih0aW1lcik7XHJcbiAgICAgIHJldHVybiB0aGlzLmlkVGltZXJBZGRlZExhc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgVGltZX0gYW5kIHtAbGluayBUaW1lcn0gYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBvdGhlcndpc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRpbWVyKF90aW1lcjogVGltZXIpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLnRpbWVyc1srK3RoaXMuaWRUaW1lckFkZGVkTGFzdF0gPSBfdGltZXI7XHJcbiAgICAgIHJldHVybiB0aGlzLmlkVGltZXJBZGRlZExhc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSB0aW1lciB3aXRoIHRoZSBpZCBnaXZlbiBieSB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVUaW1lcihfaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbX2lkXTtcclxuICAgICAgaWYgKCF0aW1lcilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1tfaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdGltZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBub3QgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUaW1lcihfaWQ6IG51bWJlcik6IFRpbWVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGltZXJzW19pZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCBvZiB0aW1lcnMgY3VycmVudGx5IGluc3RhbGxlZCBvbiB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUaW1lcnMoKTogVGltZXJzIHtcclxuICAgICAgbGV0IHJlc3VsdDogVGltZXJzID0ge307XHJcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlc3VsdCwgdGhpcy50aW1lcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSB7QGxpbmsgVGltZXJzfSBpbnN0YWxsZWQgdG8gdGhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFzVGltZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gKE9iamVjdC5rZXlzKHRoaXMudGltZXJzKS5sZW5ndGggPiAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY3JlYXRlcyB7QGxpbmsgVGltZXJ9cyB3aGVuIHNjYWxpbmcgY2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc2NhbGVBbGxUaW1lcnMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgbGV0IHRpbWVyOiBUaW1lciA9IHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICB0aW1lci5jbGVhcigpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1tpZF07XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYWxlKVxyXG4gICAgICAgICAgLy8gVGltZSBoYXMgc3RvcHBlZCwgbm8gbmVlZCB0byByZXBsYWNlIGNsZWFyZWQgdGltZXJzXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLyogdGhpcy50aW1lcnNbaWRdID0gICovXHJcbiAgICAgICAgdGltZXIgPSB0aW1lci5pbnN0YWxsQ29weSgpOyAvLyB0aGUgdGltZXIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGlzIHRpbWUgaW5zdGFuY2VcclxuICAgICAgICBkZWxldGUgdGhpcy50aW1lcnNbdGhpcy5pZFRpbWVyQWRkZWRMYXN0XTsgLy8gcmVtb3ZlIHRoZSBjb3B5IGFnYWluIC4uLlxyXG4gICAgICAgIHRoaXMudGltZXJzW2lkXSA9IHRpbWVyOyAvLyAuLi4gYW5kIHBsYWNlIGl0IGF0IHRoZSBpZCBvZiB0aGUgb3JpZ2luYWxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIHNpZ25hdHVyZSBvZiBoYW5kbGVyIGZ1bmN0aW9ucyBmb3Ige0BsaW5rIEV2ZW50VGltZXJ9cywgdmVyeSBzaW1pbGFyIHRvIHVzdWFsIGV2ZW50IGhhbmRsZXJcclxuICAgKi9cclxuICBleHBvcnQgdHlwZSBUaW1lckhhbmRsZXIgPSAoX2V2ZW50OiBFdmVudFRpbWVyKSA9PiB2b2lkO1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBUaW1lcn0taW5zdGFuY2UgaW50ZXJuYWxseSB1c2VzIHdpbmRvdy5zZXRJbnRlcnZhbCB0byBjYWxsIGEgZ2l2ZW4gaGFuZGxlciB3aXRoIGEgZ2l2ZW4gZnJlcXVlbmN5IGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzLFxyXG4gICAqIHBhc3NpbmcgYW4ge0BsaW5rIEV2ZW50VGltZXJ9LWluc3RhbmNlIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgZ2l2ZW4gYXJndW1lbnRzLiBcclxuICAgKiBUaGUgZnJlcXVlbmN5IHNjYWxlcyB3aXRoIHRoZSB7QGxpbmsgVGltZX0taW5zdGFuY2UgdGhlIHtAbGluayBUaW1lcn0taW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICogXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUaW1lciB7XHJcbiAgICBwdWJsaWMgYWN0aXZlOiBib29sZWFuO1xyXG4gICAgcHVibGljIGNvdW50OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhhbmRsZXI6IFRpbWVySGFuZGxlcjtcclxuICAgIHByaXZhdGUgdGltZTogVGltZTtcclxuICAgIHByaXZhdGUgZWxhcHNlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGV2ZW50OiBFdmVudFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lb3V0UmVhbDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpZFdpbmRvdzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBUaW1lcn0gaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgVGhlIHtAbGluayBUaW1lfSBpbnN0YW5jZSwgdGhlIHRpbWVyIGF0dGFjaGVzIHRvXHJcbiAgICAgKiBAcGFyYW0gX2VsYXBzZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZWxhcHNlLCB0byB0aGUgbmV4dCBjYWxsIG9mIF9oYW5kbGVyLCBtZWFzdXJlZCBpbiBfdGltZVxyXG4gICAgICogQHBhcmFtIF9jb3VudCBUaGUgZGVzaXJlZCBudW1iZXIgb2YgY2FsbHMgdG8gX2hhbmRsZXIsIFRpbWVyIGRlaW5zdGFsbHMgYXV0b21hdGljYWxseSBhZnRlciBsYXN0IGNhbGwuIFBhc3NpbmcgMCBpbnZva2VzIGluZmluaXRlIGNhbGxzXHJcbiAgICAgKiBAcGFyYW0gX2hhbmRsZXIgVGhlIHtAbGluayBUaW1lckhhbmRsZXJ9IGluc3RhbmNlIHRvIGNhbGxcclxuICAgICAqIEBwYXJhbSBfYXJndW1lbnRzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gX2hhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogVE9ETzogZm9yIHByb3BlciBoYW5kbGluZyBhbmQgZGVsZXRpb24sIHVzZSBUaW1lLnNldFRpbWVyIGluc3RlYWQgb2YgaW5zdGFudGlhdGluZyB0aW1lcnMgeW91cnNlbGYuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogVGltZSwgX2VsYXBzZTogbnVtYmVyLCBfY291bnQ6IG51bWJlciwgX2hhbmRsZXI6IFRpbWVySGFuZGxlciwgLi4uX2FyZ3VtZW50czogT2JqZWN0W10pIHtcclxuICAgICAgdGhpcy50aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuZWxhcHNlID0gX2VsYXBzZTtcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBFdmVudFRpbWVyKHRoaXMsIC4uLl9hcmd1bWVudHMpO1xyXG4gICAgICB0aGlzLmhhbmRsZXIgPSBfaGFuZGxlcjtcclxuICAgICAgdGhpcy5jb3VudCA9IF9jb3VudDtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogbnVtYmVyID0gTWF0aC5hYnMoX3RpbWUuZ2V0U2NhbGUoKSk7XHJcblxyXG4gICAgICBpZiAoIXNjYWxlKSB7XHJcbiAgICAgICAgLy8gVGltZSBpcyBzdG9wcGVkLCB0aW1lciB3b24ndCBiZSBhY3RpdmVcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50aW1lb3V0UmVhbCA9IHRoaXMuZWxhcHNlIC8gc2NhbGU7XHJcblxyXG4gICAgICBsZXQgY2FsbGJhY2s6IEZ1bmN0aW9uID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQuY291bnQgPSB0aGlzLmNvdW50O1xyXG4gICAgICAgIHRoaXMuZXZlbnQubGFzdENhbGwgPSAodGhpcy5jb3VudCA9PSAxKTtcclxuICAgICAgICBfaGFuZGxlcih0aGlzLmV2ZW50KTtcclxuICAgICAgICB0aGlzLmV2ZW50LmZpcnN0Q2FsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb3VudCA+IDApXHJcbiAgICAgICAgICBpZiAoLS10aGlzLmNvdW50ID09IDApXHJcbiAgICAgICAgICAgIF90aW1lLmRlbGV0ZVRpbWVyQnlJdHNJbnRlcm5hbElkKHRoaXMuaWRXaW5kb3cpO1xyXG5cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuaWRXaW5kb3cgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIHRoaXMudGltZW91dFJlYWwsIC4uLl9hcmd1bWVudHMpO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIF90aW1lLmFkZFRpbWVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgd2luZG93LWlkIG9mIHRoZSB0aW1lciwgd2hpY2ggd2FzIHJldHVybmVkIGJ5IHNldEludGVydmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRXaW5kb3c7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lLWludGVydmFsbCBmb3IgY2FsbHMgdG8gdGhlIGhhbmRsZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBsYXBzZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5lbGFwc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2hlcyBhIGNvcHkgb2YgdGhpcyBhdCBpdHMgY3VycmVudCBzdGF0ZSB0byB0aGUgc2FtZSB7QGxpbmsgVGltZX0taW5zdGFuY2UuIFVzZWQgaW50ZXJuYWxseSB3aGVuIHJlc2NhbGluZyB7QGxpbmsgVGltZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluc3RhbGxDb3B5KCk6IFRpbWVyIHtcclxuICAgICAgcmV0dXJuIG5ldyBUaW1lcih0aGlzLnRpbWUsIHRoaXMuZWxhcHNlLCB0aGlzLmNvdW50LCB0aGlzLmhhbmRsZXIsIHRoaXMuZXZlbnQuYXJndW1lbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgdGltZXIsIHJlbW92aW5nIGl0IGZyb20gdGhlIGludGVydmFsLXRpbWVycyBoYW5kbGVkIGJ5IHdpbmRvd1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIC8vIGlmICh0aGlzLnR5cGUgPT0gVElNRVJfVFlQRS5USU1FT1VUKSB7XHJcbiAgICAgIC8vICAgICBpZiAodGhpcy5hY3RpdmUpXHJcbiAgICAgIC8vICAgICAgICAgLy8gc2F2ZSByZW1haW5pbmcgdGltZSB0byB0aW1lb3V0IGFzIG5ldyB0aW1lb3V0IGZvciByZXN0YXJ0XHJcbiAgICAgIC8vICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGhpcy50aW1lb3V0ICogKDEgLSAocGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnN0YXJ0VGltZVJlYWwpIC8gdGhpcy50aW1lb3V0UmVhbCk7XHJcbiAgICAgIC8vICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWQpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2VcclxuICAgICAgLy8gVE9ETzogcmV1c2luZyB0aW1lciBzdGFydHMgaW50ZXJ2YWwgYW5ldy4gU2hvdWxkIGJlIHJlbWFpbmluZyBpbnRlcnZhbCBhcyB0aW1lb3V0LCB0aGVuIHN0YXJ0aW5nIGludGVydmFsIGFuZXcgXHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaWRXaW5kb3cpO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/Source/Core/Serialization/GLTF/GLTFLoader.ts b/Source/Core/Serialization/GLTF/GLTFLoader.ts index 0588ba1..62d6798 100644 --- a/Source/Core/Serialization/GLTF/GLTFLoader.ts +++ b/Source/Core/Serialization/GLTF/GLTFLoader.ts @@ -752,8 +752,10 @@ namespace FudgeCore { // Influences how much the material's color affects the specular reflection. When metallic is higher, the specular reflection takes on the color of the material, creating a metallic appearance. Range from 0.0 to 1.0. const metallic: number = gltfMetallicFactor; - const isLit: boolean = gltfEmissiveFactor[0] == 1 && gltfEmissiveFactor[1] == 1 || gltfEmissiveFactor[2] == 1; + const isLit: boolean = gltfEmissiveFactor[0] > 0 || gltfEmissiveFactor[1] > 0 || gltfEmissiveFactor[2] > 0; const color: Color = new Color(...gltfBaseColorFactor); + if (isLit) + color.add(new Color(...gltfEmissiveFactor, 0)); const coat: Coat = gltfBaseColorTexture ? isLit ? new CoatTextured(color, await this.getTexture(gltfBaseColorTexture.index)) : gltfNormalTexture ?