LyogCkFTUC5ORVQgV0VCIEZPUk1TIFBBR0UgTUVUSE9EUyBFWFRFTlNJT04gRk9SIEpUQUJMRQpodHRwOi8vd3d3Lmp0YWJsZS5vcmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNvcHlyaWdodCAoQykgMjAxMSBieSBIYWxpbCDdYnJhaGltIEthbGthbiAoaHR0cDovL3d3dy5oYWxpbGlicmFoaW1rYWxrYW4uY29tKQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KKGZ1bmN0aW9uKGQpe2QuZXh0ZW5kKCEwLGQuaGlrLmp0YWJsZS5wcm90b3R5cGUse19wZXJmb3JtQWpheENhbGw6ZnVuY3Rpb24oYixjLGEsZSxmKXt0aGlzLl9hamF4KHt1cmw6YixkYXRhOmMsYXN5bmM6YSxzdWNjZXNzOmUsZXJyb3I6Zn0pfSxfYWpheDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGE9ZC5leHRlbmQoe30sdGhpcy5vcHRpb25zLmFqYXhTZXR0aW5ncyxiKTtudWxsPT1hLmRhdGF8fHZvaWQgMD09YS5kYXRhP2EuZGF0YT17fToic3RyaW5nIj09dHlwZW9mIGEuZGF0YSYmKGEuZGF0YT1jLl9jb252ZXJ0UXVlcnlTdHJpbmdUb09iamVjdChhLmRhdGEpKTt2YXIgZT1hLnVybC5pbmRleE9mKCI/Iik7LTE8ZSYmZC5leHRlbmQoYS5kYXRhLGMuX2NvbnZlcnRRdWVyeVN0cmluZ1RvT2JqZWN0KGEudXJsLnN1YnN0cmluZyhlKzEpKSk7YS5kYXRhPUpTT04uc3RyaW5naWZ5KGEuZGF0YSk7YS5jb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCI7CmEuc3VjY2Vzcz1mdW5jdGlvbihhKXthPWMuX25vcm1hbGl6ZUpTT05SZXR1cm5EYXRhKGEpO2Iuc3VjY2VzcyYmYi5zdWNjZXNzKGEpfTthLmVycm9yPWZ1bmN0aW9uKCl7Yi5lcnJvciYmYi5lcnJvcigpfTthLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Yi5jb21wbGV0ZSYmYi5jb21wbGV0ZSgpfTtkLmFqYXgoYSl9LF9zdWJtaXRGb3JtVXNpbmdBamF4OmZ1bmN0aW9uKGIsYyxhLGUpe3ZhciBmPXRoaXM7Yz17cmVjb3JkOmYuX2NvbnZlcnRRdWVyeVN0cmluZ1RvT2JqZWN0KGMpfTt2YXIgZz1iLmluZGV4T2YoIj8iKTstMTxnJiZkLmV4dGVuZChjLGYuX2NvbnZlcnRRdWVyeVN0cmluZ1RvT2JqZWN0KGIuc3Vic3RyaW5nKGcrMSkpKTtjPUpTT04uc3RyaW5naWZ5KGMpO2QuYWpheCh7dXJsOmIsdHlwZToiUE9TVCIsZGF0YVR5cGU6Impzb24iLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IixkYXRhOmMsc3VjY2VzczpmdW5jdGlvbihiKXtiPWYuX25vcm1hbGl6ZUpTT05SZXR1cm5EYXRhKGIpOwphKGIpfSxlcnJvcjpmdW5jdGlvbigpe2UoKX19KX0sX2NvbnZlcnRRdWVyeVN0cmluZ1RvT2JqZWN0OmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz17fSxhLGU9L1wrL2csZD0vKFteJj1dKyk9PyhbXiZdKikvZzthPWQuZXhlYyhiKTspY1tkZWNvZGVVUklDb21wb25lbnQoYVsxXS5yZXBsYWNlKGUsIiAiKSldPWRlY29kZVVSSUNvbXBvbmVudChhWzJdLnJlcGxhY2UoZSwiICIpKTtyZXR1cm4gY30sX25vcm1hbGl6ZUpTT05SZXR1cm5EYXRhOmZ1bmN0aW9uKGIpe3JldHVybiBiLmhhc093blByb3BlcnR5KCJkIik/Yi5kOmJ9fSl9KShqUXVlcnkpOw==