ZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQtcDYKCmRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCmRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LApkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgoKZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KCmRubApkbmwgSW5pdGlhbGl6ZSBjb25maWd1cmUgYml0cy4KZG5sCmRubCBHTElCQ1BQX1RPUFJFTF9DT05GSUdVUkUKQUNfREVGVU4oR0xJQkNQUF9UT1BSRUxfQ09ORklHVVJFLCBbCiAgZG5sIERlZmF1bHQgdG8gLS1lbmFibGUtbXVsdGlsaWIgKHRoaXMgaXMgYWxzbyBwYXNzZWQgYnkgZGVmYXVsdAogIGRubCBmcm9tIHRoZSB1YmVyY29tbW9uLXRvcC1sZXZlbCBjb25maWd1cmUpCiAgQUNfQVJHX0VOQUJMRShtdWx0aWxpYiwKICBbICAtLWVuYWJsZS1tdWx0aWxpYiAgICAgICBidWlsZCBoZWxsYSBsaWJyYXJ5IHZlcnNpb25zIChkZWZhdWx0KV0sCiAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KICAgIHllcykgbXVsdGlsaWI9eWVzIDs7CiAgICBubykgIG11bHRpbGliPW5vIDs7CiAgICAqKSAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBtdWx0aWxpYiBvcHRpb24pIDs7CiAgIGVzYWNdLCBbbXVsdGlsaWI9eWVzXSlkbmwKCiAgIyBXaGVuIGJ1aWxkaW5nIHdpdGggc3JjZGlyID09IG9iamRpciwgbGlua3MgdG8gdGhlIHNvdXJjZSBmaWxlcyB3aWxsCiAgIyBiZSBjcmVhdGVkIGluIGRpcmVjdG9yaWVzIHdpdGhpbiB0aGUgdGFyZ2V0X3N1YmRpci4gIFdlIGhhdmUgdG8KICAjIGFkanVzdCB0b3BsZXZlbF9zcmNkaXIgYWNjb3JkaW5nbHksIHNvIHRoYXQgY29uZmlndXJlIGZpbmRzCiAgIyBpbnN0YWxsLXNoIGFuZCBvdGhlciBhdXhpbGlhcnkgZmlsZXMgdGhhdCBsaXZlIGluIHRoZSB0b3AtbGV2ZWwKICAjIHNvdXJjZSBkaXJlY3RvcnkuCiAgaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgogICAgaWYgdGVzdCAteiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgogICAgICB0b3ByZWw9Ii4uIgogICAgZWxzZQogICAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgogICAgICAgIHRvcHJlbD0iJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uIgogICAgICBlbHNlCiAgICAgICAgdG9wcmVsPSIke3dpdGhfbXVsdGlzcmN0b3B9Li4iCiAgICAgIGZpCiAgICBmaQogIGVsc2UKICAgIHRvcHJlbD0iLi4iCiAgZmkKICBBQ19DT05GSUdfQVVYX0RJUigke3NyY2Rpcn0vJHRvcHJlbCkKICB0b3BsZXZlbF9zcmNkaXI9XCR7dG9wX3NyY2Rpcn0vJHRvcHJlbAogIEFDX1NVQlNUKHRvcGxldmVsX3NyY2RpcikKXSkKCmRubApkbmwgSW5pdGlhbGl6ZSBjb25maWd1cmUgYml0cy4KZG5sCmRubCBHTElCQ1BQX0NPTkZJR1VSRQpBQ19ERUZVTihHTElCQ1BQX0NPTkZJR1VSRSwgWwoKI3Bvc3NpYmx5IHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29tcGlsZXIgc291cmNlcyBoZXJlPwoKICAjIEV4cG9ydCBidWlsZCBhbmQgc291cmNlIGRpcmVjdG9yaWVzLgogICMgVGhlc2UgbmVlZCB0byBiZSBhYnNvbHV0ZSBwYXRocywgeWV0IGF0IHRoZSBzYW1lIHRpbWUgbmVlZCB0bwogICMgY2Fub25pY2FsaXplIG9ubHkgcmVsYXRpdmUgcGF0aHMsIGJlY2F1c2UgdGhlbiBhbWQgd2lsbCBub3QgdW5tb3VudAogICMgZHJpdmVzLiBUaHVzIHRoZSB1c2Ugb2YgUFdEQ01EOiBzZXQgaXQgdG8gJ3Bhd2QnIG9yICdhbXEgLXcnIGlmIHVzaW5nIGFtZC4KICBnbGliY3BwX2J1aWxkZGlyPWAke1BXRENNRC1wd2R9YAogIGNhc2UgJHNyY2RpciBpbgogIFtcXC8kXSogfCA/OltcXC9dKikgZ2xpYmNwcF9zcmNkaXI9JHtzcmNkaXJ9IDs7CiAgKikgZ2xpYmNwcF9zcmNkaXI9YGNkICIkc3JjZGlyIiAmJiAke1BXRENNRC1wd2R9IHx8IGVjaG8gIiRzcmNkaXIiYCA7OwogIGVzYWMKICBBQ19TVUJTVChnbGliY3BwX2J1aWxkZGlyKQogIEFDX1NVQlNUKGdsaWJjcHBfc3JjZGlyKQoKICBkbmwgVGhpcyBpcyBoZXJlIGp1c3QgdG8gc2F0aXNmeSBhdXRvbWFrZS4KICBpZmVsc2Uobm90LGVxdWFsLFtBQ19DT05GSUdfQVVYX0RJUiguLildKQoKICBBQ19QUk9HX0FXSwogICMgV2lsbCBzZXQgTE5fUyB0byBlaXRoZXIgJ2xuIC1zJyBvciAnbG4nLiAgV2l0aCBhdXRvY29uZiAyLjV4LCBjYW4gYWxzbwogICMgYmUgJ2NwIC1wJyBpZiBsaW5raW5nIGlzbid0IGF2YWlsYWJsZS4gIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvCiAgIyBmb3JjZSBhIHBhcnRpY3VsYXIgbWV0aG9kLgogICNhY19jdl9wcm9nX0xOX1M9J2NwIC1wJwogIEFDX1BST0dfTE5fUwoKICAjIFdlIHVzZSB0aGVzZSBvcHRpb25zIHRvIGRlY2lkZSB3aGljaCBmdW5jdGlvbnMgdG8gaW5jbHVkZS4KICBBQ19BUkdfV0lUSCh0YXJnZXQtc3ViZGlyLAogIFsgIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUgogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5XSkKICBBQ19BUkdfV0lUSChjcm9zcy1ob3N0LAogIFsgIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgIGNvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcl0pCgogIGdsaWJjcHBfYmFzZWRpcj0kc3JjZGlyLyR0b3ByZWwvJDEvbGlic3RkYysrLXYzCiAgQUNfU1VCU1QoZ2xpYmNwcF9iYXNlZGlyKQoKICAjIE5ldmVyIHZlcnNpb25zIG9mIGF1dG9jb25mIGFkZCBhbiB1bmRlcnNjb3JlIHRvIHRoZXNlIGZ1bmN0aW9ucy4KICAjIFByZXZlbnQgZnV0dXJlIHByb2JsZW1zIC4uLgogIGlmZGVmKFtBQ19QUk9HX0NDX0ddLFtdLFtkZWZpbmUoW0FDX1BST0dfQ0NfR10sZGVmbihbX0FDX1BST0dfQ0NfR10pKV0pCiAgaWZkZWYoW0FDX1BST0dfQ0NfR05VXSxbXSxbZGVmaW5lKFtBQ19QUk9HX0NDX0dOVV0sZGVmbihbX0FDX1BST0dfQ0NfR05VXSkpXSkKICBpZmRlZihbQUNfUFJPR19DWFhfR10sW10sW2RlZmluZShbQUNfUFJPR19DWFhfR10sZGVmbihbX0FDX1BST0dfQ1hYX0ddKSldKQogIGlmZGVmKFtBQ19QUk9HX0NYWF9HTlVdLFtdLFtkZWZpbmUoW0FDX1BST0dfQ1hYX0dOVV0sZGVmbihbX0FDX1BST0dfQ1hYX0dOVV0pKV0pCgogICMgQUNfUFJPR19DQwogICMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKICAjIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIG5vdCBjYWxsIEFDX1BST0dfQ0NfV09SS1MuICBXZQogICMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKICAjIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgaXMgYWRkcmVzc2VkIGluIGxhdGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLgoKICBBQ19ERUZVTihMSUJfQUNfUFJPR19DQywKICBbQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NQUF0pZG5sCiAgZG5sIEZvb2wgYW55Ym9keSB1c2luZyBBQ19QUk9HX0NDLgogIEFDX1BST1ZJREUoW0FDX1BST0dfQ0NdKQogIEFDX0NIRUNLX1BST0coQ0MsIGdjYywgZ2NjKQogIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICAgIEFDX0NIRUNLX1BST0coQ0MsIGNjLCBjYywgLCAsIC91c3IvdWNiL2NjKQogICAgdGVzdCAteiAiJENDIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIXSkKICBmaQoKICBBQ19QUk9HX0NDX0dOVQoKICBpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgogICAgR0NDPXllcwogIGRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKICBkbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAogIGRubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KICAgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgogICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgICBDRkxBR1M9CiAgICBBQ19QUk9HX0NDX0cKICAgIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgogICAgICBDRkxBR1M9Ii1nIC1PMiIKICAgIGVsc2UKICAgICAgQ0ZMQUdTPSItTzIiCiAgICBmaQogIGVsc2UKICAgIEdDQz0KICAgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCiAgZmkKICBdKQoKICBMSUJfQUNfUFJPR19DQwoKICAjIExpa2V3aXNlIGZvciBBQ19QUk9HX0NYWC4gIFdlIGNhbid0IGp1c3QgY2FsbCBpdCBkaXJlY3RseSBiZWNhdXNlIGcrKwogICMgd2lsbCB0cnkgdG8gbGluayBpbiBsaWJzdGRjKysuCiAgQUNfREVGVU4oTElCX0FDX1BST0dfQ1hYLAogIFtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ1hYQ1BQXSlkbmwKICBkbmwgRm9vbCBhbnlib2R5IHVzaW5nIEFDX1BST0dfQ1hYLgogIEFDX1BST1ZJREUoW0FDX1BST0dfQ1hYXSkKICAjIFVzZSBnbGliY3BwX0NYWCBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBDWFggdG8gYmUgY2FjaGVkIHdpdGggdGhlCiAgIyBmbGFncyB0aGF0IGNvbWUgaW4gQ1hYIHdoaWxlIGNvbmZpZ3VyaW5nIGxpYnN0ZGMrKy4gIFRoZXkncmUgZGlmZmVyZW50CiAgIyBmcm9tIHRob3NlIHVzZWQgZm9yIGFsbCBvdGhlciB0YXJnZXQgbGlicmFyaWVzLiAgSWYgQ1hYIGlzIHNldCBpbgogICMgdGhlIGVudmlyb25tZW50LCByZXNwZWN0IHRoYXQgaGVyZS4KICBnbGliY3BwX0NYWD0kQ1hYCiAgQUNfQ0hFQ0tfUFJPR1MoZ2xpYmNwcF9DWFgsICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKyssIGdjYykKICBBQ19TVUJTVChnbGliY3BwX0NYWCkKICBDWFg9JGdsaWJjcHBfQ1hYCiAgdGVzdCAteiAiJGdsaWJjcHBfQ1hYIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgYysrIGZvdW5kIGluIFwkUEFUSF0pCgogIEFDX1BST0dfQ1hYX0dOVQoKICBpZiB0ZXN0ICRhY19jdl9wcm9nX2d4eCA9IHllczsgdGhlbgogICAgR1hYPXllcwogICAgZG5sIENoZWNrIHdoZXRoZXIgLWcgd29ya3MsIGV2ZW4gaWYgQ1hYRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCiAgICBkbmwgcGxheXMgYXJvdW5kIHdpdGggQ1hYRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCiAgICBkbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCiAgICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCiAgICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgICBDWFhGTEFHUz0KICAgIEFDX1BST0dfQ1hYX0cKICAgIGlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgogICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KICAgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKICAgIGVsc2UKICAgICAgQ1hYRkxBR1M9Ii1PMiIKICAgIGZpCiAgZWxzZQogICAgR1hYPQogICAgdGVzdCAiJHtDWFhGTEFHUytzZXR9IiA9IHNldCB8fCBDWFhGTEFHUz0iLWciCiAgZmkKICBdKQoKICBMSUJfQUNfUFJPR19DWFgKCiAgIyBGb3IgZGlyZWN0b3J5IHZlcnNpb25pbmcgKGUuZy4sIGhlYWRlcnMpIGFuZCBvdGhlciB2YXJpYWJsZXMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR0NDIHZlcnNpb24gbnVtYmVyXSkKICBnY2NfdmVyc2lvbj1gJGdsaWJjcHBfQ1hYIC1kdW1wdmVyc2lvbmAKICBBQ19NU0dfUkVTVUxUKCRnY2NfdmVyc2lvbikKCiAgIyBGb3Igc29tZSByZWFzb24sIGdldHRleHQgbmVlZHMgdGhpcy4KICBBQ19JU0NfUE9TSVgKCiAgQUNfQ0hFQ0tfVE9PTChBUywgYXMpCiAgQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCiAgQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgcmFubGliLW5vdC1mb3VuZC1pbi1wYXRoLWVycm9yKQogIEFDX1BST0dfSU5TVEFMTAoKICBBTV9NQUlOVEFJTkVSX01PREUKCiAgIyBXZSBuZWVkIEFDX0VYRUVYVCB0byBrZWVwIGF1dG9tYWtlIGhhcHB5IGluIGN5Z251cyBtb2RlLiAgSG93ZXZlciwKICAjIGF0IGxlYXN0IGN1cnJlbnRseSwgd2UgbmV2ZXIgYWN0dWFsbHkgYnVpbGQgYSBwcm9ncmFtLCBzbyB3ZSBuZXZlcgogICMgbmVlZCB0byB1c2UgJChFWEVFWFQpLiAgTW9yZW92ZXIsIHRoZSB0ZXN0IGZvciBFWEVFWFQgbm9ybWFsbHkKICAjIGZhaWxzLCBiZWNhdXNlIHdlIGFyZSBwcm9iYWJseSBjb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXIKICAjIHdoaWNoIGNhbid0IGNyZWF0ZSBleGVjdXRhYmxlcy4gIFNvIHdlIGluY2x1ZGUgQUNfRVhFRVhUIHRvIGtlZXAKICAjIGF1dG9tYWtlIGhhcHB5LCBidXQgd2UgZG9uJ3QgZXhlY3V0ZSBpdCwgc2luY2Ugd2UgZG9uJ3QgY2FyZSBhYm91dAogICMgdGhlIHJlc3VsdC4KICBpZiBmYWxzZTsgdGhlbgogICAgIyBhdXRvY29uZiAyLjUwIHJ1bnMgQUNfRVhFRVhUIGJ5IGRlZmF1bHQsIGFuZCB0aGUgbWFjcm8gZXhwYW5kcwogICAgIyB0byBub3RoaW5nLCBzbyBub3RoaW5nIHdvdWxkIHJlbWFpbiBiZXR3ZWVuIGB0aGVuJyBhbmQgYGZpJyBpZiBpdAogICAgIyB3ZXJlIG5vdCBmb3IgdGhlIGA6JyBiZWxvdy4KICAgIDoKICAgIEFDX0VYRUVYVAogIGZpCgogIGNhc2UgWyRde2dsaWJjcHBfYmFzZWRpcn0gaW4KICAgIC8qIHwgW0EtWmEtel06W1xcL10qKSBsaWJnY2pfZmxhZ2Jhc2VkaXI9WyRde2dsaWJjcHBfYmFzZWRpcn0gOzsKICAgICopIGdsaWJjcHBfZmxhZ2Jhc2VkaXI9J1skXSh0b3BfYnVpbGRkaXIpLydbJF17Z2xpYmNwcF9iYXNlZGlyfSA7OwogIGVzYWMKCiAgIyBGaW5kIHBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBpbmZvLiAgSW4KICAjIGFkZGl0aW9uIHRvIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncywgaXQgYWxzbyBzZXRzIHVwIHN5bWxpbmtzLgogIEdMSUJDUFBfQ0hFQ0tfVEFSR0VUCl0pCgoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgZysrIGNhbiBjb21waWxlIHRoaXMgbGlicmFyeSwgYW5kIGlmIHNvLCBpZiBhbnkgdmVyc2lvbi0KZG5sIHNwZWNpZmljIHByZWNhdXRpb25zIG5lZWQgdG8gYmUgdGFrZW4uIApkbmwgCmRubCBHTElCQ1BQX0NIRUNLX0NPTVBJTEVSX1ZFUlNJT04KQUNfREVGVU4oR0xJQkNQUF9DSEVDS19DT01QSUxFUl9WRVJTSU9OLCBbCmlmIHRlc3QgISAtZiBzdGFtcC1zYW5pdHktY29tcGlsZXI7IHRoZW4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnKysgdGhhdCB3aWxsIHN1Y2Nlc3NmdWxseSBjb21waWxlIGxpYnN0ZGMrKy12M10pCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKICBBQ19UUllfQ09NUElMRSgsIFsKICAjaWYgX19HTlVDX18gPCAzCiAgICBub3Rfb2sKICAjZW5kaWYKICBdLCBncHBfc2F0aXNmYWN0b3J5PXllcywgQUNfTVNHX0VSUk9SKFtwbGVhc2UgdXBncmFkZSB0byBHQ0MgMy4wIG9yIGFib3ZlXSkpCiAgQUNfTEFOR19SRVNUT1JFCiAgQUNfTVNHX1JFU1VMVCgkZ3BwX3NhdGlzZmFjdG9yeSkKICB0b3VjaCBzdGFtcC1zYW5pdHktY29tcGlsZXIKZmkKXSkKCgpkbmwKZG5sIFRlc3RzIGZvciBuZXdlciBjb21waWxlciBmZWF0dXJlcywgb3IgZmVhdHVyZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBuZXdlcgpkbmwgY29tcGlsZXIgdmVyc2lvbnMgYnV0IG5vdCBvbGRlciBjb21waWxlciB2ZXJzaW9ucyBzdGlsbCBpbiB1c2UsIHNob3VsZApkbmwgYmUgcGxhY2VkIGhlcmUuCmRubApkbmwgRGVmaW5lIFdFUlJPUj0nLVdlcnJvcicgaWYgcmVxdWVzdGVkIGFuZCBwb3NzaWJsZTsgZysrJ3MgdGhhdCBsYWNrIHRoZQpkbmwgbmV3IGlubGluaW5nIGNvZGUgb3IgdGhlIG5ldyBzeXN0ZW1faGVhZGVyIHByYWdtYSB3aWxsIGRpZSBvbiAtV2Vycm9yLgpkbmwgTGVhdmUgaXQgb3V0IGJ5IGRlZmF1bHQgYW5kIHVzZSBtYWludC1tb2RlIHRvIHVzZSBpdC4KZG5sCmRubCBEZWZpbmUgU0VDVElPTl9GTEFHUz0nLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMnIGlmCmRubCBjb21waWxlciBzdXBwb3J0cyBpdCBhbmQgdGhlIHVzZXIgaGFzIG5vdCByZXF1ZXN0ZWQgZGVidWcgbW9kZS4KZG5sCmRubCBHTElCQ1BQX0NIRUNLX0NPTVBJTEVSX0ZFQVRVUkVTCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfQ09NUElMRVJfRkVBVFVSRVMsIFsKICAjIEFsbCB0aGVzZSB0ZXN0cyBhcmUgZm9yIEMrKzsgc2F2ZSB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSBjb21waWxlciBmbGFncy4KICAjIFRoZSBDWFhGTEFHUyB0aGluZyBpcyBzdXNwaWNpb3VzLCBidXQgYmFzZWQgb24gc2ltaWxhciBiaXRzIHByZXZpb3VzbHkKICAjIGZvdW5kIGluIEdMSUJDUFBfQ09ORklHVVJFLgogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKCiAgIyBDaGVjayBmb3IgbWFpbnRhaW5lci1tb2RlIGJpdHMuCiAgaWYgdGVzdCB4IiRVU0VfTUFJTlRBSU5FUl9NT0RFIiA9IHhubzsgdGhlbgogICAgV0VSUk9SPScnCiAgZWxzZQogICAgV0VSUk9SPSctV2Vycm9yJwogIGZpCgogICMgQ2hlY2sgZm9yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZysrIHRoYXQgc3VwcG9ydHMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnNdKQogIENYWEZMQUdTPSctV2Vycm9yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zJwogIEFDX1RSWV9DT01QSUxFKCwgW2ludCBmb287CiAgXSwgW2FjX2Zkc2VjdGlvbnM9eWVzXSwgW2FjX2Zkc2VjdGlvbnM9bm9dKQogIGlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgogICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIGVsc2UKICAgICMgdGhpcyBpcyB0aGUgc3VzcGljaW91cyBwYXJ0CiAgICBDWFhGTEFHUz0nJwogIGZpCiAgaWYgdGVzdCB4IiRhY19mZHNlY3Rpb25zIiA9IHgieWVzIiAmJgogICAgIHRlc3QgeCIkZW5hYmxlX2RlYnVnIiA9IHgibm8iOyB0aGVuCiAgICBTRUNUSU9OX0ZMQUdTPSctZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucycKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2Zkc2VjdGlvbnMpCgogIEFDX0xBTkdfUkVTVE9SRQogIEFDX1NVQlNUKFdFUlJPUikKICBBQ19TVUJTVChTRUNUSU9OX0ZMQUdTKQpdKQoKCmRubApkbmwgSWYgR05VIGxkIGlzIGluIHVzZSwgY2hlY2sgdG8gc2VlIGlmIHRyaWNreSBsaW5rZXIgb3B0cyBjYW4gYmUgdXNlZC4gIElmCmRubCB0aGUgbmF0aXZlIGxpbmtlciBpcyBpbiB1c2UsIGFsbCB2YXJpYWJsZXMgd2lsbCBiZSBkZWZpbmVkIHRvIHNvbWV0aGluZwpkbmwgc2FmZSAobGlrZSBhbiBlbXB0eSBzdHJpbmcpLgpkbmwKZG5sIERlZmluZSBTRUNUSU9OX0xERkxBR1M9Jy1XbCwtLWdjLXNlY3Rpb25zJyBpZiBwb3NzaWJsZS4KZG5sIERlZmluZSBPUFRfTERGTEFHUz0nLVdsLC1PMScgaWYgcG9zc2libGUuCmRubCBEZWZpbmUgTEQsIHdpdGhfZ251X2xkLCBhbmQgKHBvc3NpYmx5KSBnbGliY3BwX2dudV9sZF92ZXJzaW9uIGFzCmRubCBzaWRlLWVmZmVjdHMgb2YgdGVzdGluZy4KZG5sCmRubCBHTElCQ1BQX0NIRUNLX0xJTktFUl9GRUFUVVJFUwpBQ19ERUZVTihHTElCQ1BQX0NIRUNLX0xJTktFUl9GRUFUVVJFUywgWwogICMgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50IGluIGV2ZW4gdHJ5aW5nIHRoZXNlCiAgIyB0ZXN0cy4gIENoZWNrIGZvciB0aGF0IGZpcnN0LiAgV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIGdsZAogICMgYnkgbm93IChpbiBsaWJ0b29sKSwgYnV0IHJlcXVpcmUgaXQgbm93IGp1c3QgdG8gYmUgc2FmZS4uLgogIHRlc3QgLXogIiRTRUNUSU9OX0xERkxBR1MiICYmIFNFQ1RJT05fTERGTEFHUz0nJwogIHRlc3QgLXogIiRPUFRfTERGTEFHUyIgJiYgT1BUX0xERkxBR1M9JycKICBBQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSkKCiAgIyBUaGUgbmFtZSBzZXQgYnkgbGlidG9vbCBkZXBlbmRzIG9uIHRoZSB2ZXJzaW9uIG9mIGxpYnRvb2wuICBTaGFtZSBvbiB1cwogICMgZm9yIGRlcGVuZGluZyBvbiBhbiBpbXBsIGRldGFpbCwgYnV0IGMnZXN0IGxhIHZpZS4gIE9sZGVyIHZlcnNpb25zIHVzZWQKICAjIGFjX2N2X3Byb2dfZ251X2xkLCBidXQgbm93IGl0J3MgbHRfY3ZfcHJvZ19nbnVfbGQsIGFuZCBpcyBjb3BpZWQgYmFjayBvbgogICMgdG9wIG9mIHdpdGhfZ251X2xkICh3aGljaCBpcyBhbHNvIHNldCBieSAtLXdpdGgtZ251LWxkLCBzbyB0aGF0IGFjdHVhbGx5CiAgIyBtYWtlcyBzZW5zZSkuICBXZSdsbCB0ZXN0IHdpdGhfZ251X2xkIGV2ZXJ5d2hlcmUgZWxzZSwgc28gaWYgdGhhdCBpc24ndAogICMgc2V0IChoZW5jZSB3ZSdyZSB1c2luZyBhbiBvbGRlciBsaWJ0b29sKSwgdGhlbiBzZXQgaXQuCiAgaWYgdGVzdCB4JHt3aXRoX2dudV9sZCtzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIGlmIHRlc3QgeCR7YWNfY3ZfcHJvZ19nbnVfbGQrc2V0fSAhPSB4c2V0OyB0aGVuCiAgICAgICMgV2UgZ290IHRocm91Z2ggImFjX3JlcXVpcmUoYWNfcHJvZ19sZCkiIGFuZCBzdGlsbCBub3Qgc2V0PyAgSHVoPwogICAgICB3aXRoX2dudV9sZD1ubwogICAgZWxzZQogICAgICB3aXRoX2dudV9sZD0kYWNfY3ZfcHJvZ19nbnVfbGQKICAgIGZpCiAgZmkKCiAgIyBTdGFydCBieSBnZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlci4gIEkgdGhpbmsgdGhlIGxpYnRvb2wgdGVzdCBhbHJlYWR5CiAgIyBkb2VzIHNvbWUgb2YgdGhpcywgYnV0IHRocm93cyBhd2F5IHRoZSByZXN1bHQuCiAgY2hhbmdlcXVvdGUoLCkKICBsZHZlcj1gJExEIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IGhlYWQgLTEgfCBcCiAgICAgICAgIHNlZCAtZSAncy9HTlUgbGQgdmVyc2lvbiBcKFswLTkuXVswLTkuXSpcKS4qL1wxLydgCiAgY2hhbmdlcXVvdGUoWyxdKQogIGdsaWJjcHBfZ251X2xkX3ZlcnNpb249YGVjaG8gJGxkdmVyIHwgXAogICAgICAgICAkQVdLIC1GLiAneyBpZiAoTkY8MykgWyRdMz0wOyBwcmludCAoWyRdMSoxMDArWyRdMikqMTAwK1skXTMgfSdgCgogICMgU2V0IC0tZ2Mtc2VjdGlvbnMuCiAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9ICJub3Ricm9rZW4iOyB0aGVuCiAgICAjIEdOVSBsZCBpdCBpcyEgIEpveSBhbmQgYnVubnkgcmFiYml0cyEKCiAgICAjIEFsbCB0aGVzZSB0ZXN0cyBhcmUgZm9yIEMrKzsgc2F2ZSB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSBjb21waWxlciBmbGFncy4KICAgICMgTmVlZCB0byBkbyB0aGlzIHNvIHRoYXQgZysrIHdvbid0IHRyeSB0byBsaW5rIGluIGxpYnN0ZGMrKwogICAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCiAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKICAgIENGTEFHUz0nLXggYysrICAtV2wsLS1nYy1zZWN0aW9ucycKCiAgICAjIENoZWNrIGZvciAtV2wsLS1nYy1zZWN0aW9ucwogICAgIyBYWFggVGhpcyB0ZXN0IGlzIGJyb2tlbiBhdCB0aGUgbW9tZW50LCBhcyBzeW1ib2xzIHJlcXVpcmVkIGZvcgogICAgIyBsaW5raW5nIGFyZSBub3cgaW4gbGlic3VwYysrIChub3QgYnVpbHQgeWV0Li4uLi4pLiBJbiBhZGRpdGlvbiwgCiAgICAjIHRoaXMgdGVzdCBoYXMgY29yZWQgb24gc29sYXJpcyBpbiB0aGUgcGFzdC4gSW4gYWRkaXRpb24sCiAgICAjIC0tZ2Mtc2VjdGlvbnMgZG9lc24ndCByZWFsbHkgd29yayBhdCB0aGUgbW9tZW50IChrZWVwcyBvbiBkaXNjYXJkaW5nCiAgICAjIHVzZWQgc2VjdGlvbnMsIGZpcnN0IC5laF9mcmFtZSBhbmQgbm93IHNvbWUgb2YgdGhlIGdsaWJjIHNlY3Rpb25zIGZvcgogICAgIyBpY29udikuIEJ6enp6dC4gVGhhbmtzIGZvciBwbGF5aW5nLCBtYXliZSBuZXh0IHRpbWUuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB0aGF0IHN1cHBvcnRzIC1XbCwtLWdjLXNlY3Rpb25zXSkKICAgIEFDX1RSWV9SVU4oWwogICAgIGludCBtYWluKHZvaWQpIAogICAgIHsKICAgICAgIHRyeSB7IHRocm93IDE7IH0KICAgICAgIGNhdGNoICguLi4pIHsgfTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgIF0sIFthY19zZWN0aW9uTERmbGFncz15ZXNdLFthY19zZWN0aW9uTERmbGFncz1ub10sIFthY19zZWN0aW9uTERmbGFncz15ZXNdKQogICAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgogICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKICAgIGVsc2UKICAgICAgIyB0aGlzIGlzIHRoZSBzdXNwaWNpb3VzIHBhcnQKICAgICAgQ0ZMQUdTPScnCiAgICBmaQogICAgaWYgdGVzdCAiJGFjX3NlY3Rpb25MRGZsYWdzIiA9ICJ5ZXMiOyB0aGVuCiAgICAgIFNFQ1RJT05fTERGTEFHUz0iLVdsLC0tZ2Mtc2VjdGlvbnMgJFNFQ1RJT05fTERGTEFHUyIKICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19zZWN0aW9uTERmbGFncykKICBmaQoKICAjIFNldCBsaW5rZXIgb3B0aW1pemF0aW9uIGZsYWdzLgogIGlmIHRlc3QgeCIkd2l0aF9nbnVfbGQiID0geCJ5ZXMiICYmIHRlc3QgeCIkZW5hYmxlX2RlYnVnIiA9IHgibm8iOyB0aGVuCiAgICBPUFRfTERGTEFHUz0iLVdsLC1PMSAkT1BUX0xERkxBR1MiCiAgZmkKCiAgQUNfU1VCU1QoU0VDVElPTl9MREZMQUdTKQogIEFDX1NVQlNUKE9QVF9MREZMQUdTKQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIHRoZSAobWF0aCBmdW5jdGlvbikgYXJndW1lbnQgcGFzc2VkIGlzCmRubCBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIEFTU1VNRVMgYXJndW1lbnQgaXMgYSBtYXRoIGZ1bmN0aW9uIHdpdGggT05FIHBhcmFtZXRlcgpkbmwKZG5sIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMXzEKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfMSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yICQxIGRlY2xhcmF0aW9uXSkKICBpZiB0ZXN0IHgke2dsaWJjcHBfY3ZfZnVuY18kMV91c2Urc2V0fSAhPSB4c2V0OyB0aGVuCiAgICBBQ19DQUNIRV9WQUwoZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZSwgWwogICAgICBBQ19MQU5HX1NBVkUKICAgICAgQUNfTEFOR19DUExVU1BMVVMKICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+CgkJICAgICAgI2lmZGVmIEhBVkVfSUVFRUZQX0gKCQkgICAgICAjaW5jbHVkZSA8aWVlZWZwLmg+CgkJICAgICAgI2VuZGlmCgkJICAgICBdLCAKICAgICAgICAgICAgICAgICAgICAgWyAkMSgwKTtdLCAKICAgICAgICAgICAgICAgICAgICAgW2dsaWJjcHBfY3ZfZnVuY18kMV91c2U9eWVzXSwgW2dsaWJjcHBfY3ZfZnVuY18kMV91c2U9bm9dKQogICAgICBBQ19MQU5HX1JFU1RPUkUKICAgIF0pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3BwX2N2X2Z1bmNfJDFfdXNlKQpdKQoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgdGhlIChtYXRoIGZ1bmN0aW9uKSBhcmd1bWVudCBwYXNzZWQgaXMKZG5sIDEpIGRlY2xhcmVkIHdoZW4gdXNpbmcgdGhlIGMrKyBjb21waWxlcgpkbmwgMikgaGFzICJDIiBsaW5rYWdlCmRubCAzKSBpZiBub3QsIHNlZSBpZiAxKSBhbmQgMikgZm9yIGFyZ3VtZW50IHByZXBlbmRlZCB3aXRoICdfJwpkbmwKZG5sIERlZmluZSBIQVZFX0NBUkdGIGV0YyBpZiAiY2FyZ2YiIGlzIGRlY2xhcmVkIGFuZCBsaW5rcwpkbmwKZG5sIGFyZ3VtZW50IDEgaXMgbmFtZSBvZiBmdW5jdGlvbiB0byBjaGVjawpkbmwKZG5sIEFTU1VNRVMgYXJndW1lbnQgaXMgYSBtYXRoIGZ1bmN0aW9uIHdpdGggT05FIHBhcmFtZXRlcgpkbmwKZG5sIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMSwgWwogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMXzEoJDEpCiAgaWYgdGVzdCB4JGdsaWJjcHBfY3ZfZnVuY18kMV91c2UgPSB4InllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0ZVTkNTKCQxKSAgICAKICBlbHNlCiAgICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF8xKF8kMSkKICAgIGlmIHRlc3QgeCRnbGliY3BwX2N2X2Z1bmNfXyQxX3VzZSA9IHgieWVzIjsgdGhlbgogICAgICBBQ19DSEVDS19GVU5DUyhfJDEpICAgIAogICAgZmkKICBmaQpdKQoKCmRubApkbmwgTGlrZSBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xLCBidXQgZG9lcyBhIGJ1bmNoIG9mCmRubCBvZiBmdW5jdGlvbnMgYXQgb25jZS4gIEl0J3MgYW4gYWxsLW9yLW5vdGhpbmcgY2hlY2sgLS0gZWl0aGVyIApkbmwgSEFWRV9YWVogaXMgZGVmaW5lZCBmb3IgZWFjaCBvZiB0aGUgZnVuY3Rpb25zLCBvciBmb3Igbm9uZSBvZiB0aGVtLgpkbmwgRG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgc2lnbmlmaWNhbnQgY29uZmlndXJlIHRpbWUuCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMU19BTkRfTElOS0FHRVNfMSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yICQxIGZ1bmN0aW9uc10pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjcHBfY3ZfZnVuY18kMl91c2UsIFsKICAgIEFDX0xBTkdfU0FWRQogICAgQUNfTEFOR19DUExVU1BMVVMKICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sCiAgICAgICAgICAgICAgICAgICBbIGBmb3IgeCBpbiAkMzsgZG8gZWNobyAiJHggKDApOyI7IGRvbmVgIF0sCiAgICAgICAgICAgICAgICAgICBbZ2xpYmNwcF9jdl9mdW5jXyQyX3VzZT15ZXNdLAogICAgICAgICAgICAgICAgICAgW2dsaWJjcHBfY3ZfZnVuY18kMl91c2U9bm9dKQogICAgQUNfTEFOR19SRVNUT1JFXSkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3BwX2N2X2Z1bmNfJDJfdXNlKQogIGlmIHRlc3QgeCRnbGliY3BwX2N2X2Z1bmNfJDJfdXNlID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19DSEVDS19GVU5DUygkMykKICBmaQpdKQoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgdGhlIChtYXRoIGZ1bmN0aW9uKSBhcmd1bWVudCBwYXNzZWQgaXMKZG5sIGRlY2xhcmVkIHdoZW4gdXNpbmcgdGhlIGMrKyBjb21waWxlcgpkbmwgQVNTVU1FUyBhcmd1bWVudCBpcyBhIG1hdGggZnVuY3Rpb24gd2l0aCBUV08gcGFyYW1ldGVycwpkbmwKZG5sIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMXzIKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfMiwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yICQxIGRlY2xhcmF0aW9uXSkKICBpZiB0ZXN0IHgke2dsaWJjcHBfY3ZfZnVuY18kMV91c2Urc2V0fSAhPSB4c2V0OyB0aGVuCiAgICBBQ19DQUNIRV9WQUwoZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZSwgWwogICAgICBBQ19MQU5HX1NBVkUKICAgICAgQUNfTEFOR19DUExVU1BMVVMKICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSwgCiAgICAgICAgICAgICAgICAgICAgIFsgJDEoMCwgMCk7XSwgCiAgICAgICAgICAgICAgICAgICAgIFtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlPXllc10sIFtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlPW5vXSkKICAgICAgQUNfTEFOR19SRVNUT1JFCiAgICBdKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZSkKXSkKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIHRoZSAobWF0aCBmdW5jdGlvbikgYXJndW1lbnQgcGFzc2VkIGlzCmRubCAxKSBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIDIpIGhhcyAiQyIgbGlua2FnZQpkbmwKZG5sIERlZmluZSBIQVZFX0NBUkdGIGV0YyBpZiAiY2FyZ2YiIGlzIGRlY2xhcmVkIGFuZCBsaW5rcwpkbmwKZG5sIGFyZ3VtZW50IDEgaXMgbmFtZSBvZiBmdW5jdGlvbiB0byBjaGVjawpkbmwKZG5sIEFTU1VNRVMgYXJndW1lbnQgaXMgYSBtYXRoIGZ1bmN0aW9uIHdpdGggVFdPIHBhcmFtZXRlcnMKZG5sCmRubCBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8yCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIsIFsKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF8yKCQxKQogIGlmIHRlc3QgeCRnbGliY3BwX2N2X2Z1bmNfJDFfdXNlID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19DSEVDS19GVU5DUygkMSkgICAgCiAgZWxzZQogICAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfMihfJDEpCiAgICBpZiB0ZXN0IHgkZ2xpYmNwcF9jdl9mdW5jX18kMV91c2UgPSB4InllcyI7IHRoZW4KICAgICAgQUNfQ0hFQ0tfRlVOQ1MoXyQxKSAgICAKICAgIGZpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiB0aGUgKG1hdGggZnVuY3Rpb24pIGFyZ3VtZW50IHBhc3NlZCBpcwpkbmwgZGVjbGFyZWQgd2hlbiB1c2luZyB0aGUgYysrIGNvbXBpbGVyCmRubCBBU1NVTUVTIGFyZ3VtZW50IGlzIGEgbWF0aCBmdW5jdGlvbiB3aXRoIFRIUkVFIHBhcmFtZXRlcnMKZG5sCmRubCBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF8zCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMXzMsIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBkZWNsYXJhdGlvbl0pCiAgaWYgdGVzdCB4JHtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlK3NldH0gIT0geHNldDsgdGhlbgogICAgQUNfQ0FDSEVfVkFMKGdsaWJjcHBfY3ZfZnVuY18kMV91c2UsIFsKICAgICAgQUNfTEFOR19TQVZFCiAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCiAgICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sIAogICAgICAgICAgICAgICAgICAgICBbICQxKDAsIDAsIDApO10sIAogICAgICAgICAgICAgICAgICAgICBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT15ZXNdLCBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT1ub10pCiAgICAgIEFDX0xBTkdfUkVTVE9SRQogICAgXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjcHBfY3ZfZnVuY18kMV91c2UpCl0pCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiB0aGUgKG1hdGggZnVuY3Rpb24pIGFyZ3VtZW50IHBhc3NlZCBpcwpkbmwgMSkgZGVjbGFyZWQgd2hlbiB1c2luZyB0aGUgYysrIGNvbXBpbGVyCmRubCAyKSBoYXMgIkMiIGxpbmthZ2UKZG5sCmRubCBEZWZpbmUgSEFWRV9DQVJHRiBldGMgaWYgImNhcmdmIiBpcyBkZWNsYXJlZCBhbmQgbGlua3MKZG5sCmRubCBhcmd1bWVudCAxIGlzIG5hbWUgb2YgZnVuY3Rpb24gdG8gY2hlY2sKZG5sCmRubCBBU1NVTUVTIGFyZ3VtZW50IGlzIGEgbWF0aCBmdW5jdGlvbiB3aXRoIFRIUkVFIHBhcmFtZXRlcnMKZG5sCmRubCBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8zCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzMsIFsKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF8zKCQxKQogIGlmIHRlc3QgeCRnbGliY3BwX2N2X2Z1bmNfJDFfdXNlID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19DSEVDS19GVU5DUygkMSkgICAgCiAgZWxzZQogICAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfMyhfJDEpCiAgICBpZiB0ZXN0IHgkZ2xpYmNwcF9jdl9mdW5jX18kMV91c2UgPSB4InllcyI7IHRoZW4KICAgICAgQUNfQ0hFQ0tfRlVOQ1MoXyQxKSAgICAKICAgIGZpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiB0aGUgKHN0ZGxpYiBmdW5jdGlvbikgYXJndW1lbnQgcGFzc2VkIGlzCmRubCAxKSBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIDIpIGhhcyAiQyIgbGlua2FnZQpkbmwKZG5sIGFyZ3VtZW50IDEgaXMgbmFtZSBvZiBmdW5jdGlvbiB0byBjaGVjawpkbmwKZG5sIEFTU1VNRVMgYXJndW1lbnQgaXMgYSBtYXRoIGZ1bmN0aW9uIHdpdGggVFdPIHBhcmFtZXRlcnMKZG5sCmRubCBHTElCQ1BQX0NIRUNLX1NURExJQl9ERUNMX0FORF9MSU5LQUdFXzIKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19TVERMSUJfREVDTF9BTkRfTElOS0FHRV8yLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgZGVjbGFyYXRpb25dKQogIGlmIHRlc3QgeCR7Z2xpYmNwcF9jdl9mdW5jXyQxX3VzZStzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIEFDX0NBQ0hFX1ZBTChnbGliY3BwX2N2X2Z1bmNfJDFfdXNlLCBbCiAgICAgIEFDX0xBTkdfU0FWRQogICAgICBBQ19MQU5HX0NQTFVTUExVUwogICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sIAogICAgICAgICAgICAgICAgICAgICBbICQxKDAsIDApO10sIAogICAgICAgICAgICAgICAgICAgICBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT15ZXNdLCBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT1ub10pCiAgICAgIEFDX0xBTkdfUkVTVE9SRQogICAgXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjcHBfY3ZfZnVuY18kMV91c2UpCiAgaWYgdGVzdCB4JGdsaWJjcHBfY3ZfZnVuY18kMV91c2UgPSB4InllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0ZVTkNTKCQxKSAgICAKICBmaQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIHRoZSAoc3RkbGliIGZ1bmN0aW9uKSBhcmd1bWVudCBwYXNzZWQgaXMKZG5sIDEpIGRlY2xhcmVkIHdoZW4gdXNpbmcgdGhlIGMrKyBjb21waWxlcgpkbmwgMikgaGFzICJDIiBsaW5rYWdlCmRubApkbmwgYXJndW1lbnQgMSBpcyBuYW1lIG9mIGZ1bmN0aW9uIHRvIGNoZWNrCmRubApkbmwgQVNTVU1FUyBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIHdpdGggVEhSRUUgcGFyYW1ldGVycwpkbmwKZG5sIEdMSUJDUFBfQ0hFQ0tfU1RETElCX0RFQ0xfQU5EX0xJTktBR0VfMwpBQ19ERUZVTihHTElCQ1BQX0NIRUNLX1NURExJQl9ERUNMX0FORF9MSU5LQUdFXzMsIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBkZWNsYXJhdGlvbl0pCiAgaWYgdGVzdCB4JHtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlK3NldH0gIT0geHNldDsgdGhlbgogICAgQUNfQ0FDSEVfVkFMKGdsaWJjcHBfY3ZfZnVuY18kMV91c2UsIFsKICAgICAgQUNfTEFOR19TQVZFCiAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCiAgICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkbGliLmg+XSwgCiAgICAgICAgICAgICAgICAgICAgIFsgJDEoMCwgMCwgMCk7XSwgCiAgICAgICAgICAgICAgICAgICAgIFtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlPXllc10sIFtnbGliY3BwX2N2X2Z1bmNfJDFfdXNlPW5vXSkKICAgICAgQUNfTEFOR19SRVNUT1JFCiAgICBdKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZSkKICBpZiB0ZXN0IHgkZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZSA9IHgieWVzIjsgdGhlbgogICAgQUNfQ0hFQ0tfRlVOQ1MoJDEpICAgIAogIGZpCl0pCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiB0aGUgKHVuaXN0ZCBmdW5jdGlvbikgYXJndW1lbnQgcGFzc2VkIGlzCmRubCAxKSBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIDIpIGhhcyAiQyIgbGlua2FnZQpkbmwKZG5sIGFyZ3VtZW50IDEgaXMgbmFtZSBvZiBmdW5jdGlvbiB0byBjaGVjawpkbmwKZG5sIEFTU1VNRVMgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiB3aXRoIE9ORSBwYXJhbWV0ZXIKZG5sCmRubCBHTElCQ1BQX0NIRUNLX1VOSVNURF9ERUNMX0FORF9MSU5LQUdFXzEKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19VTklTVERfREVDTF9BTkRfTElOS0FHRV8xLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgZGVjbGFyYXRpb25dKQogIGlmIHRlc3QgeCR7Z2xpYmNwcF9jdl9mdW5jXyQxX3VzZStzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIEFDX0NBQ0hFX1ZBTChnbGliY3BwX2N2X2Z1bmNfJDFfdXNlLCBbCiAgICAgIEFDX0xBTkdfU0FWRQogICAgICBBQ19MQU5HX0NQTFVTUExVUwogICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHVuaXN0ZC5oPl0sIAogICAgICAgICAgICAgICAgICAgICBbICQxKDApO10sIAogICAgICAgICAgICAgICAgICAgICBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT15ZXNdLCBbZ2xpYmNwcF9jdl9mdW5jXyQxX3VzZT1ub10pCiAgICAgIEFDX0xBTkdfUkVTVE9SRQogICAgXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjcHBfY3ZfZnVuY18kMV91c2UpCiAgaWYgdGVzdCB4JGdsaWJjcHBfY3ZfZnVuY18kMV91c2UgPSB4InllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0ZVTkNTKCQxKSAgICAKICBmaQpdKQoKZG5sCmRubCBCZWNhdXNlIHRoZSBidWlsdGlucyBhcmUgcGlja3kgcGlja3kgcGlja3kgYWJvdXQgdGhlIGFyZ3VtZW50cyB0aGV5IHRha2UsIApkbmwgZG8gYW4gZXhwbGljdCBsaW5rYWdlIHRlc3RzIGhlcmUuCmRubCBDaGVjayB0byBzZWUgaWYgdGhlIChtYXRoIGZ1bmN0aW9uKSBhcmd1bWVudCBwYXNzZWQgaXMKZG5sIDEpIGRlY2xhcmVkIHdoZW4gdXNpbmcgdGhlIGMrKyBjb21waWxlcgpkbmwgMikgaGFzICJDIiBsaW5rYWdlCmRubApkbmwgRGVmaW5lIEhBVkVfQ0FSR0YgZXRjIGlmICJjYXJnZiIgaXMgZGVjbGFyZWQgYW5kIGxpbmtzCmRubApkbmwgYXJndW1lbnQgMSBpcyBuYW1lIG9mIGZ1bmN0aW9uIHRvIGNoZWNrCmRubApkbmwgQVNTVU1FUyBhcmd1bWVudCBpcyBhIG1hdGggZnVuY3Rpb24gd2l0aCBPTkUgcGFyYW1ldGVyCmRubApkbmwgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9MSU5LQUdFXzEKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgZGVjbGFyYXRpb25dKQogIGlmIHRlc3QgeCR7Z2xpYmNwcF9jdl9mdW5jXyQxX3VzZStzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIEFDX0NBQ0hFX1ZBTChnbGliY3BwX2N2X2Z1bmNfJDFfdXNlLCBbCiAgICAgIEFDX0xBTkdfU0FWRQogICAgICBBQ19MQU5HX0NQTFVTUExVUwogICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLCAKICAgICAgICAgICAgICAgICAgICAgWyAkMSgwKTtdLCAKICAgICAgICAgICAgICAgICAgICAgW2dsaWJjcHBfY3ZfZnVuY18kMV91c2U9eWVzXSwgW2dsaWJjcHBfY3ZfZnVuY18kMV91c2U9bm9dKQogICAgICBBQ19MQU5HX1JFU1RPUkUKICAgIF0pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3BwX2N2X2Z1bmNfJDFfdXNlKQogIGlmIHRlc3QgeCRnbGliY3BwX2N2X2Z1bmNfJDFfdXNlID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBsaW5rYWdlXSkKICAgIGlmIHRlc3QgeCR7Z2xpYmNwcF9jdl9mdW5jXyQxX2xpbmsrc2V0fSAhPSB4c2V0OyB0aGVuCiAgICAgIEFDX0NBQ0hFX1ZBTChnbGliY3BwX2N2X2Z1bmNfJDFfbGluaywgWwogICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bWF0aC5oPl0sIAogICAgICAgICAgICAgICAgICAgIFsgJDEoMCk7XSwgCiAgICAgICAgICAgICAgICAgICAgW2dsaWJjcHBfY3ZfZnVuY18kMV9saW5rPXllc10sIFtnbGliY3BwX2N2X2Z1bmNfJDFfbGluaz1ub10pCiAgICAgIF0pCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVCgkZ2xpYmNwcF9jdl9mdW5jXyQxX2xpbmspCiAgICBpZiB0ZXN0IHgkZ2xpYmNwcF9jdl9mdW5jXyQxX2xpbmsgPSB4InllcyI7IHRoZW4KICAgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICQxIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAogICAgICBBQ19ERUZJTkVfVU5RVU9URUQoJHthY190cl9mdW5jfSkKICAgIGZpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSB3aGF0IGJ1aWx0aW4gbWF0aCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZApkbmwKZG5sIGNoZWNrIGZvciBfX2J1aWx0aW5fYWJzCmRubCBjaGVjayBmb3IgX19idWlsdGluX2ZhYnNmCmRubCBjaGVjayBmb3IgX19idWlsdGluX2ZhYnMKZG5sIGNoZWNrIGZvciBfX2J1aWx0aW5fZmFibApkbmwgY2hlY2sgZm9yIF9fYnVpbHRpbl9sYWJzCmRubCBjaGVjayBmb3IgX19idWlsdGluX3NxcnRmCmRubCBjaGVjayBmb3IgX19idWlsdGluX3NxcnRsCmRubCBjaGVjayBmb3IgX19idWlsdGluX3NxcnQKZG5sIGNoZWNrIGZvciBfX2J1aWx0aW5fc2luZgpkbmwgY2hlY2sgZm9yIF9fYnVpbHRpbl9zaW4KZG5sIGNoZWNrIGZvciBfX2J1aWx0aW5fc2lubApkbmwgY2hlY2sgZm9yIF9fYnVpbHRpbl9jb3NmCmRubCBjaGVjayBmb3IgX19idWlsdGluX2NvcwpkbmwgY2hlY2sgZm9yIF9fYnVpbHRpbl9jb3NsCmRubApkbmwgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfU1VQUE9SVApBQ19ERUZVTihHTElCQ1BQX0NIRUNLX0JVSUxUSU5fTUFUSF9TVVBQT1JULCBbCiAgZG5sIFRlc3QgZm9yIGJ1aWx0aW4gbWF0aCBmdW5jdGlvbnMuCiAgZG5sIFRoZXNlIGFyZSBtYWRlIGluIGdjYy9jLWNvbW1vbi5jIAogIEdMSUJDUFBfQ0hFQ0tfQlVJTFRJTl9NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShfX2J1aWx0aW5fYWJzKQogIEdMSUJDUFBfQ0hFQ0tfQlVJTFRJTl9NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShfX2J1aWx0aW5fZmFic2YpCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9mYWJzKQogIEdMSUJDUFBfQ0hFQ0tfQlVJTFRJTl9NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShfX2J1aWx0aW5fZmFic2wpCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9sYWJzKQoKICBHTElCQ1BQX0NIRUNLX0JVSUxUSU5fTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoX19idWlsdGluX3NxcnRmKQogIEdMSUJDUFBfQ0hFQ0tfQlVJTFRJTl9NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShfX2J1aWx0aW5fc3FydCkKICBHTElCQ1BQX0NIRUNLX0JVSUxUSU5fTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoX19idWlsdGluX3NxcnRsKQoKICBHTElCQ1BQX0NIRUNLX0JVSUxUSU5fTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoX19idWlsdGluX3NpbmYpCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9zaW4pCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9zaW5sKQoKICBHTElCQ1BQX0NIRUNLX0JVSUxUSU5fTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoX19idWlsdGluX2Nvc2YpCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9jb3MpCiAgR0xJQkNQUF9DSEVDS19CVUlMVElOX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKF9fYnVpbHRpbl9jb3NsKQoKICBkbmwgVGhlcmUgaXMsIHdpdGhvdXQgYSBkb3VidCwgYSBtb3JlIGVsZWdhbnQgd2F5IHRvIGhhdmUgdGhlc2UKICBkbmwgbmFtZXMgZXhwb3J0ZWQgc28gdGhhdCB0aGV5IHdvbid0IGJlIHN0cmlwcGVkIG91dCBvZiBhY2NvbmZpZy5oIGJ5CiAgZG5sIGF1dG9oZWFkZXIuIEkgbGVhdmUgdGhpcyBhcyBhbiBleGVyY2lzZSB0byBzb21lYm9keSBsZXNzIGZydXN0cmF0ZWQKICBkbmwgdGhhbiBJLi4uLiBwbGVhc2UgZW1haWwgdGhlIGxpYnN0ZGMrKyBsaXN0IGlmIHlvdSBjYW4gZmlndXJlIG91dCBhCiAgZG5sIG1vcmUgZWxlZ2FudCBhcHByb2FjaCAoc2VlIGF1dG9jb25mL2FjZ2VuLm00IGFuZCBzcGVjaWZpY2FsbHkKICBkbmwgQUNfQ0hFQ0tfRlVOQyBmb3IgdGhpbmdzIHRvIHN0ZWFsLikKICBkdW1teXZhcj1ubwogIGlmIHRlc3QgeCRkdW1teXZhciA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfX19CVUlMVElOX0FCUykKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9MQUJTKQogICAgQUNfREVGSU5FKEhBVkVfX19CVUlMVElOX0NPUykKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9DT1NGKQogICAgQUNfREVGSU5FKEhBVkVfX19CVUlMVElOX0NPU0wpCiAgICBBQ19ERUZJTkUoSEFWRV9fX0JVSUxUSU5fRkFCUykKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9GQUJTRikKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9GQUJTTCkKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9TSU4pCiAgICBBQ19ERUZJTkUoSEFWRV9fX0JVSUxUSU5fU0lORikKICAgIEFDX0RFRklORShIQVZFX19fQlVJTFRJTl9TSU5MKQogICAgQUNfREVGSU5FKEhBVkVfX19CVUlMVElOX1NRUlQpCiAgICBBQ19ERUZJTkUoSEFWRV9fX0JVSUxUSU5fU1FSVEYpCiAgICBBQ19ERUZJTkUoSEFWRV9fX0JVSUxUSU5fU1FSVEwpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSB3aGF0IHRoZSB1bmRlcmx5aW5nIGMgbGlicmFyeSBpcyBsaWtlCmRubCBUaGVzZSBjaGVja3MgbmVlZCB0byBkbyB0d28gdGhpbmdzOiAKZG5sIDEpIG1ha2Ugc3VyZSB0aGUgbmFtZSBpcyBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIDIpIG1ha2Ugc3VyZSB0aGUgbmFtZSBoYXMgIkMiIGxpbmthZ2UKZG5sIFRoaXMgbWlnaHQgc2VlbSBsaWtlIG92ZXJraWxsIGJ1dCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGl0J3Mgbm90Li4uCmRubApkbmwgRGVmaW5lIEhBVkVfU1RSVE9MRCBpZiAic3RydG9sZCIgaXMgZGVjbGFyZWQgYW5kIGxpbmtzCmRubCBEZWZpbmUgSEFWRV9TVFJUT0YgaWYgInN0cnRvZiIgaXMgZGVjbGFyZWQgYW5kIGxpbmtzCmRubCBEZWZpbmUgSEFWRV9EUkFORDQ4IGlmICJkcmFuZDQ4IiBpcyBkZWNsYXJlZCBhbmQgbGlua3MKZG5sCmRubCBHTElCQ1BQX0NIRUNLX1NURExJQl9TVVBQT1JUCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfU1RETElCX1NVUFBPUlQsIFsKICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSctZm5vLWJ1aWx0aW5zIC1EX0dOVV9TT1VSQ0UnCgogIEdMSUJDUFBfQ0hFQ0tfU1RETElCX0RFQ0xfQU5EX0xJTktBR0VfMihzdHJ0b2xkKQogIEdMSUJDUFBfQ0hFQ0tfU1RETElCX0RFQ0xfQU5EX0xJTktBR0VfMihzdHJ0b2YpCiAgQUNfQ0hFQ0tfRlVOQ1MoZHJhbmQ0OCkKCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgpdKQoKZG5sCmRubCBDaGVjayB0byBzZWUgd2hhdCB0aGUgdW5kZXJseWluZyBjIGxpYnJhcnkgaXMgbGlrZQpkbmwgVGhlc2UgY2hlY2tzIG5lZWQgdG8gZG8gdHdvIHRoaW5nczogCmRubCAxKSBtYWtlIHN1cmUgdGhlIG5hbWUgaXMgZGVjbGFyZWQgd2hlbiB1c2luZyB0aGUgYysrIGNvbXBpbGVyCmRubCAyKSBtYWtlIHN1cmUgdGhlIG5hbWUgaGFzICJDIiBsaW5rYWdlCmRubCBUaGlzIG1pZ2h0IHNlZW0gbGlrZSBvdmVya2lsbCBidXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBpdCdzIG5vdC4uLgpkbmwKZG5sIERlZmluZSBIQVZFX0lTQVRUWSBpZiAiaXNhdHR5IiBpcyBkZWNsYXJlZCBhbmQgbGlua3MKZG5sCmRubCBHTElCQ1BQX0NIRUNLX1VOSVNURF9TVVBQT1JUCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfVU5JU1REX1NVUFBPUlQsIFsKICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSctZm5vLWJ1aWx0aW5zIC1EX0dOVV9TT1VSQ0UnCgogIEdMSUJDUFBfQ0hFQ0tfVU5JU1REX0RFQ0xfQU5EX0xJTktBR0VfMShpc2F0dHkpCiAgCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgpdKQoKZG5sCmRubCBDaGVjayB0byBzZWUgd2hhdCB0aGUgdW5kZXJseWluZyBjIGxpYnJhcnkgb3IgbWF0aCBsaWJyYXJ5IGlzIGxpa2UuCmRubCBUaGVzZSBjaGVja3MgbmVlZCB0byBkbyB0d28gdGhpbmdzOiAKZG5sIDEpIG1ha2Ugc3VyZSB0aGUgbmFtZSBpcyBkZWNsYXJlZCB3aGVuIHVzaW5nIHRoZSBjKysgY29tcGlsZXIKZG5sIDIpIG1ha2Ugc3VyZSB0aGUgbmFtZSBoYXMgIkMiIGxpbmthZ2UKZG5sIFRoaXMgbWlnaHQgc2VlbSBsaWtlIG92ZXJraWxsIGJ1dCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGl0J3Mgbm90Li4uCmRubApkbmwgRGVmaW5lIEhBVkVfQ0FSR0YgZXRjIGlmICJjYXJnZiIgaXMgZm91bmQuCmRubApkbmwgR0xJQkNQUF9DSEVDS19NQVRIX1NVUFBPUlQKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19NQVRIX1NVUFBPUlQsIFsKICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSctZm5vLWJ1aWx0aW5zIC1EX0dOVV9TT1VSQ0UnCgogIGRubCBDaGVjayBsaWJtCiAgQUNfQ0hFQ0tfTElCKG0sIHNpbiwgbGlibT0iLWxtIikKICBhY19zYXZlX0xJQlM9IiRMSUJTIgogIExJQlM9IiRMSUJTICRsaWJtIgoKICBkbmwgQ2hlY2sgdG8gc2VlIGlmIGNlcnRhaW4gQyBtYXRoIGZ1bmN0aW9ucyBleGlzdC4KICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGlzaW5mKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoaXNuYW4pCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShmaW5pdGUpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihjb3B5c2lnbikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8zKHNpbmNvcykKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGZwY2xhc3MpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShxZnBjbGFzcykKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8yKGh5cG90KQoKICBkbmwgQ2hlY2sgdG8gc2VlIGlmIGJhc2ljIEMgbWF0aCBmdW5jdGlvbnMgaGF2ZSBmbG9hdCB2ZXJzaW9ucy4KICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTFNfQU5EX0xJTktBR0VTXzEoZmxvYXQgdHJpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfdHJpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNvc2YgYXNpbmYgYXRhbmYgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3NmIHNpbmYgdGFuZiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc2hmIHNpbmhmIHRhbmhmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMU19BTkRfTElOS0FHRVNfMShmbG9hdCByb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfcm91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlaWxmIGZsb29yZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGV4cGYpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShpc25hbmYpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShpc2luZmYpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihhdGFuMmYpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShmYWJzZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8yKGZtb2RmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIoZnJleHBmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIoaHlwb3RmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIobGRleHBmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEobG9nZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGxvZzEwZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8yKG1vZGZmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIocG93ZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKHNxcnRmKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzMoc2luY29zZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGZpbml0ZWYpCgogIGRubCBDaGVjayB0byBzZWUgaWYgYmFzaWMgQyBtYXRoIGZ1bmN0aW9ucyBoYXZlIGxvbmcgZG91YmxlIHZlcnNpb25zLgogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMU19BTkRfTElOS0FHRVNfMShsb25nIGRvdWJsZSB0cmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2RvdWJsZV90cmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY29zbCBhc2lubCBhdGFubCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc2wgc2lubCB0YW5sIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zaGwgc2luaGwgdGFuaGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xTX0FORF9MSU5LQUdFU18xKGxvbmcgZG91YmxlIHJvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2RvdWJsZV9yb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VpbGwgZmxvb3JsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoaXNuYW5sKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoaXNpbmZsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIoY29weXNpZ25sKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIoYXRhbjJsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoZXhwbCkKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTF9BTkRfTElOS0FHRV8xKGZhYnNsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIoZm1vZGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihmcmV4cGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihoeXBvdGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihsZGV4cGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMShsb2dsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEobG9nMTBsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzIobW9kZmwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMihwb3dsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoc3FydGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xfQU5EX0xJTktBR0VfMyhzaW5jb3NsKQogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMX0FORF9MSU5LQUdFXzEoZmluaXRlbCkKCiAgZG5sIFNvbWUgcnVudGltZXMgaGF2ZSB0aGVzZSBmdW5jdGlvbnMgd2l0aCBhIHByZWNlZGluZyB1bmRlcnNjb3JlLiBQbGVhc2UKICBkbmwga2VlcCB0aGlzIHN5bmMnZCB3aXRoIHRoZSBvbmUgYWJvdmUuIEFuZCBpZiB5b3UgYWRkIGFueSBuZXcgc3ltYm9sLAogIGRubCBwbGVhc2UgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZSBAQk9UVE9NQCBzZWN0aW9uIG9mIGFjY29uZmlnLmguCiAgZG5sIENoZWNrIHRvIHNlZSBpZiBjZXJ0YWluIEMgbWF0aCBmdW5jdGlvbnMgZXhpc3QuCgogIGRubCBDaGVjayB0byBzZWUgaWYgYmFzaWMgQyBtYXRoIGZ1bmN0aW9ucyBoYXZlIGZsb2F0IHZlcnNpb25zLgogIEdMSUJDUFBfQ0hFQ0tfTUFUSF9ERUNMU19BTkRfTElOS0FHRVNfMShfZmxvYXQgdHJpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zsb2F0X3RyaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY29zZiBfYXNpbmYgX2F0YW5mIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nvc2YgX3NpbmYgX3RhbmYgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29zaGYgX3NpbmhmIF90YW5oZikKICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTFNfQU5EX0xJTktBR0VTXzEoX2Zsb2F0IHJvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmxvYXRfcm91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jZWlsZiBfZmxvb3JmKQoKICBkbmwgQ2hlY2sgdG8gc2VlIGlmIGJhc2ljIEMgbWF0aCBmdW5jdGlvbnMgaGF2ZSBsb25nIGRvdWJsZSB2ZXJzaW9ucy4KICBHTElCQ1BQX0NIRUNLX01BVEhfREVDTFNfQU5EX0xJTktBR0VTXzEoX2xvbmcgZG91YmxlIHRyaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb25nX2RvdWJsZV90cmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWNvc2wgX2FzaW5sIF9hdGFubCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb3NsIF9zaW5sIF90YW5sIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nvc2hsIF9zaW5obCBfdGFuaGwpCiAgR0xJQkNQUF9DSEVDS19NQVRIX0RFQ0xTX0FORF9MSU5LQUdFU18xKF9sb25nIGRvdWJsZSByb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvbmdfZG91YmxlX3JvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VpbGwgX2Zsb29ybCkKCiAgTElCUz0iJGFjX3NhdmVfTElCUyIKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCl0pCgoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgbmF0aXZlIHN1cHBvcnQgZm9yIGNvbXBsZXggCmRubApkbmwgRG9uJ3QgY29tcGlsZSBiaXRzIGluIG1hdGgvKiBpZiBuYXRpdmUgc3VwcG9ydCBleGl0cy4KZG5sCmRubCBEZWZpbmUgVVNFX0NPTVBMRVhfTE9OR19ET1VCTEUgZXRjIGlmICJjb3B5c2lnbmwiIGlzIGZvdW5kLgpkbmwKZG5sIEdMSUJDUFBfQ0hFQ0tfQ09NUExFWF9NQVRIX1NVUFBPUlQKQUNfREVGVU4oR0xJQkNQUF9DSEVDS19DT01QTEVYX01BVEhfU1VQUE9SVCwgWwogIGRubCBDaGVjayBmb3IgY29tcGxleCB2ZXJzaW9ucyBvZiBtYXRoIGZ1bmN0aW9ucyBvZiBwbGF0Zm9ybS4KICBBQ19DSEVDS19MSUIobSwgbWFpbikKICBBQ19SRVBMQUNFX01BVEhGVU5DUyhuYW4gY29weXNpZ25mKQoKICBkbmwgRm9yIF9fc2lnbmJpdCB0byBzaWduYml0IGNvbnZlcnNpb25zLgogIEFDX0NIRUNLX0ZVTkNTKFtfX3NpZ25iaXRdLCAsIFtMSUJNQVRIT0JKUz0iJExJQk1BVEhPQkpTIHNpZ25iaXQubG8iXSkKICBBQ19DSEVDS19GVU5DUyhbX19zaWduYml0Zl0sICwgW0xJQk1BVEhPQkpTPSIkTElCTUFUSE9CSlMgc2lnbmJpdGYubG8iXSkKCiAgZG5sIENvbXBpbGUgdGhlIGxvbmcgZG91YmxlIGNvbXBsZXggZnVuY3Rpb25zIG9ubHkgaWYgdGhlIGZ1bmN0aW9uIAogIGRubCBwcm92aWRlcyB0aGUgbm9uLWNvbXBsZXggbG9uZyBkb3VibGUgZnVuY3Rpb25zIHRoYXQgYXJlIG5lZWRlZC4KICBkbmwgQ3VycmVudGx5IHRoaXMgaW5jbHVkZXMgY29weXNpZ25sLCB3aGljaCBzaG91bGQgYmUKICBkbmwgY2FjaGVkIGZyb20gdGhlIEdMSUJDUFBfQ0hFQ0tfTUFUSF9TVVBQT1JUIG1hY3JvLCBhYm92ZS4KICBpZiB0ZXN0IHgkYWNfY3ZfZnVuY19jb3B5c2lnbmwgPSB4InllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0ZVTkNTKFtfX3NpZ25iaXRsXSwgLCBbTElCTUFUSE9CSlM9IiRMSUJNQVRIT0JKUyBzaWduYml0bC5sbyJdKQogIGZpCgogIEFDX1NVQlNUKExJQk1BVEhPQkpTKQpdKQoKCmRubCBDaGVjayB0byBzZWUgd2hhdCBhcmNoaXRlY3R1cmUgYW5kIG9wZXJhdGluZyBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZwpkbmwgZm9yLiAgQWxzbywgaWYgYXJjaGl0ZWN0dXJlLSBvciBPUy1zcGVjaWZpYyBmbGFncyBhcmUgcmVxdWlyZWQgZm9yCmRubCBjb21waWxhdGlvbiwgcGljayB0aGVtIHVwIGhlcmUuCmRubCAKZG5sIEdMSUJDUFBfQ0hFQ0tfVEFSR0VUCkFDX0RFRlVOKEdMSUJDUFBfQ0hFQ0tfVEFSR0VULCBbCiAgICAuIFskXXtnbGliY3BwX2Jhc2VkaXJ9L2NvbmZpZ3VyZS50YXJnZXQKICAgIEFDX01TR19SRVNVTFQoQ1BVIGNvbmZpZyBkaXJlY3RvcnkgaXMgJGNwdV9pbmNsdWRlX2RpcikKICAgIEFDX01TR19SRVNVTFQoT1MgY29uZmlnIGRpcmVjdG9yeSBpcyAkb3NfaW5jbHVkZV9kaXIpCl0pCgoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgdGhpcyB0YXJnZXQgY2FuIGVuYWJsZSB0aGUgd2NoYXJfdCBwYXJ0cyBvZiBsaWJzdGRjKysuCmRubCBJZiAtLWRpc2FibGUtYy1tYmNoYXIgd2FzIGdpdmVuLCBubyB3Y2hhcl90IHN0dWZmIGlzIGVuYWJsZWQuICAoVGhpcwpkbmwgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBjaGVja2VkLikKZG5sCmRubCBEZWZpbmUgX0dMSUJDUFBfVVNFX1dDSEFSX1QgaWYgYWxsIHRoZSBiaXRzIGFyZSBmb3VuZCAKZG5sIERlZmluZSBIQVZFX01CU1RBVEVfVCBpZiBtYnN0YXRlX3QgaXMgbm90IGluIHdjaGFyLmgKZG5sCmRubCBHTElCQ1BQX0NIRUNLX1dDSEFSX1RfU1VQUE9SVApBQ19ERUZVTihHTElCQ1BQX0NIRUNLX1dDSEFSX1RfU1VQUE9SVCwgWwoKICBkbmwgVGVzdCB3Y2hhci5oIGZvciBtYnN0YXRlX3QsIHdoaWNoIGlzIG5lZWRlZCBmb3IgY2hhcl90cmFpdHMgYW5kCiAgZG5sIG90aGVycyBldmVuIGlmIHdjaGFyX3Qgc3VwcG9ydCBpcyBub3Qgb24uCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbWJzdGF0ZV90XSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICBbbWJzdGF0ZV90IHRlc3RzdGF0ZTtdLCAKICBoYXZlX21ic3RhdGVfdD15ZXMsIGhhdmVfbWJzdGF0ZV90PW5vKQogIEFDX01TR19SRVNVTFQoJGhhdmVfbWJzdGF0ZV90KQogIGlmIHRlc3QgeCIkaGF2ZV9tYnN0YXRlX3QiID0geHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfTUJTVEFURV9UKQogIGZpCgogIGRubCBTYW5pdHkgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBJU08gQzk5IGhlYWRlcnMgZm9yIGV4dGVuZGVkIGVuY29kaW5nLgogIEFDX0NIRUNLX0hFQURFUlMod2NoYXIuaCwgYWNfaGFzX3djaGFyX2g9eWVzLCBhY19oYXNfd2NoYXJfaD1ubykKICBBQ19DSEVDS19IRUFERVJTKHdjdHlwZS5oLCBhY19oYXNfd2N0eXBlX2g9eWVzLCBhY19oYXNfd2N0eXBlX2g9bm8pCiAgCiAgZG5sIE9ubHkgY29udGludWUgY2hlY2tpbmcgaWYgdGhlIElTTyBDOTkgaGVhZGVycyBleGlzdCBhbmQgc3VwcG9ydCBpcyBvbi4KICBpZiB0ZXN0IHgiJGFjX2hhc193Y2hhcl9oIiA9IHh5ZXMgJiYKICAgICB0ZXN0IHgiJGFjX2hhc193Y3R5cGVfaCIgPSB4eWVzICYmCiAgICAgdGVzdCB4IiRlbmFibGVfY19tYmNoYXIiICE9IHhubzsgdGhlbgogICAgICAKICAgIGRubCBUZXN0IHdjaGFyLmggZm9yIFdDSEFSX01JTiwgV0NIQVJfTUFYLCB3aGljaCBpcyBuZWVkZWQgYmVmb3JlCiAgICBkbmwgbnVtZXJpY19saW1pdHMgY2FuIGluc3RhbnRpYXRlIHR5cGVfdHJhaXRzPHdjaGFyX3Q+CiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBXQ0hBUl9NSU4gYW5kIFdDSEFSX01BWF0pCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICAgIFtpbnQgaSA9IFdDSEFSX01JTjsgaW50IGogPSBXQ0hBUl9NQVg7XSwgCiAgICBoYXNfd2NoYXJfbWlubWF4PXllcywgaGFzX3djaGFyX21pbm1heD1ubykKICAgIEFDX01TR19SRVNVTFQoJGhhc193Y2hhcl9taW5tYXgpCiAgICAKICAgIGRubCBUZXN0IHdjaGFyLmggZm9yIFdFT0YsIHdoaWNoIGlzIHdoYXQgd2UgdXNlIHRvIGRldGVybWluZSB3aGV0aGVyCiAgICBkbmwgdG8gc3BlY2lhbGl6ZSBmb3IgY2hhcl90cmFpdHM8d2NoYXJfdD4gb3Igbm90LgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgV0VPRl0pCiAgICBBQ19UUllfQ09NUElMRShbCiAgICAgICNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAjaW5jbHVkZSA8c3RkZGVmLmg+XSwKICAgIFt3aW50X3QgaSA9IFdFT0Y7XSwKICAgIGhhc193ZW9mPXllcywgaGFzX3dlb2Y9bm8pCiAgICBBQ19NU0dfUkVTVUxUKCRoYXNfd2VvZikKICAKICAgIGRubCBUZXN0cyBmb3Igd2lkZSBjaGFyYWN0ZXIgZnVuY3Rpb25zIHVzZWQgaW4gY2hhcl90cmFpdHM8d2NoYXJfdD4uCiAgICBhY193ZnVuY3M9eWVzCiAgICBBQ19DSEVDS19GVU5DUyh3Y3NsZW4gd21lbWNociB3bWVtY21wIHdtZW1jcHkgd21lbW1vdmUgd21lbXNldCwsIFwKICAgIGFjX3dmdW5jcz1ubykKICAKICAgIGRubCBDaGVja3MgZm9yIG5hbWVzIGluamVjdGVkIGludG8gc3RkOjogYnkgdGhlIGNfc3RkIGhlYWRlcnMuCiAgICBBQ19DSEVDS19GVU5DUyhidG93YyB3Y3RvYiBmZ2V0d2MgZmdldHdjIGZnZXR3cyBmcHV0d2MgZnB1dHdzIGZ3aWRlIFwKICAgIGZ3cHJpbnRmIGZ3c2NhbmYgc3dwcmludGYgc3dzY2FuZiB2ZndwcmludGYgdmZ3c2NhbmYgdnN3cHJpbnRmIHZzd3NjYW5mIFwKICAgIHZ3cHJpbnRmIHZ3c2NhbmYgd3ByaW50ZiB3c2NhbmYgZ2V0d2MgZ2V0d2NoYXIgbWJzaW5pdCBtYnJsZW4gbWJydG93YyBcCiAgICBtYnNydG93Y3Mgd2NzcnRvbWJzIHB1dHdjIHB1dHdjaGFyIHVuZ2V0d2Mgd2NydG9tYiB3Y3N0b2Qgd2NzdG9mIHdjc3RvbCBcCiAgICB3Y3N0b3VsIHdjc2NweSB3Y3NuY3B5IHdjc2NhdCB3Y3NuY2F0IHdjc2NtcCB3Y3Njb2xsIHdjc25jbXAgd2NzeGZybSBcCiAgICB3Y3Njc3BuIHdjc3NwbiB3Y3N0b2sgd2NzZnRpbWUgd2NzY2hyIHdjc3Bicmsgd2NzcmNociB3Y3NzdHIsLCBcCiAgICBhY193ZnVuY3M9bm8pCgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSB3Y2hhcl90IHN1cHBvcnRdKQogICAgaWYgdGVzdCB4IiRoYXNfd2VvZiIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGhhc193Y2hhcl9taW5tYXgiID0geHllcyAmJgogICAgICAgdGVzdCB4IiRhY193ZnVuY3MiID0geHllczsgdGhlbgogICAgICBhY19pc29DOTlfd2NoYXJfdD15ZXMKICAgIGVsc2UKICAgICAgYWNfaXNvQzk5X3djaGFyX3Q9bm8KICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19pc29DOTlfd2NoYXJfdCkKICAKICAgIGRubCBVc2UgaWNvbnYgZm9yIHdjaGFyX3QgdG8gY2hhciBjb252ZXJzaW9ucy4gQXMgc3VjaCwgY2hlY2sgZm9yIAogICAgZG5sIFgvT3BlbiBQb3J0YWJpbGl0eSBHdWlkZSwgdmVyc2lvbiAyIGZlYXR1cmVzIChYUEcyKS4KICAgIEFDX0NIRUNLX0hFQURFUihpY29udi5oLCBhY19oYXNfaWNvbnZfaD15ZXMsIGFjX2hhc19pY29udl9oPW5vKQogICAgQUNfQ0hFQ0tfSEVBREVSKGxhbmdpbmZvLmgsIGFjX2hhc19sYW5naW5mb19oPXllcywgYWNfaGFzX2xhbmdpbmZvX2g9bm8pCgogICAgZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbGliaWNvbnYuYSBwcm92aWRpbmcgWFBHMiB3Y2hhcl90IHN1cHBvcnQuCiAgICBBQ19DSEVDS19MSUIoaWNvbnYsIGljb252LCBsaWJpY29udj0iLWxpY29udiIpCiAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgogICAgTElCUz0iJExJQlMgJGxpYmljb252IgoKICAgIEFDX0NIRUNLX0ZVTkNTKGljb252X29wZW4gaWNvbnZfY2xvc2UgaWNvbnYgbmxfbGFuZ2luZm8sIFwKICAgIGFjX1hQRzJmdW5jcz15ZXMsIGFjX1hQRzJmdW5jcz1ubykKICAKICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgWFBHMiB3Y2hhcl90IHN1cHBvcnRdKQogICAgaWYgdGVzdCB4IiRhY19oYXNfaWNvbnZfaCIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGFjX2hhc19sYW5naW5mb19oIiA9IHh5ZXMgJiYKICAgICAgIHRlc3QgeCIkYWNfWFBHMmZ1bmNzIiA9IHh5ZXM7IHRoZW4KICAgICAgYWNfWFBHMl93Y2hhcl90PXllcwogICAgZWxzZQogICAgICBhY19YUEcyX3djaGFyX3Q9bm8KICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19YUEcyX3djaGFyX3QpCiAgCiAgICBkbmwgQXQgdGhlIG1vbWVudCwgb25seSBlbmFibGUgd2NoYXJfdCBzcGVjaWFsaXphdGlvbnMgaWYgYWxsIHRoZQogICAgZG5sIGFib3ZlIHN1cHBvcnQgaXMgcHJlc2VudC4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGVuYWJsZWQgd2NoYXJfdCBzcGVjaWFsaXphdGlvbnNdKQogICAgaWYgdGVzdCB4IiRhY19pc29DOTlfd2NoYXJfdCIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGFjX1hQRzJfd2NoYXJfdCIgPSB4eWVzOyB0aGVuCiAgICAgIEFDX0RFRklORShfR0xJQkNQUF9VU0VfV0NIQVJfVCkKICAgICAgQUNfTVNHX1JFU1VMVCgieWVzIikKICAgIGVsc2UKICAgICAgQUNfTVNHX1JFU1VMVCgibm8iKQogICAgZmkKICBlbHNlCiAgICBkbmwgV2lkZSBjaGFyYWN0ZXJzIGRpc2FibGVkIGJ5IHRoZSB1c2VyLiAKICAgIEFDX01TR19XQVJOKFt3Y2hhcl90IHN1cHBvcnQgZGlzYWJsZWQuXSkKICBmaQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHNwZWNpYWwgZGVidWdnaW5nIG1vZGU7IG5vdCBmb3IgcHJvZHVjdGlvbiB1c2UuCmRubApkbmwgR0xJQkNQUF9FTkFCTEVfREVCVUcKZG5sIC0tZW5hYmxlLWRlYnVnIHNldHMgJy1nZ2RiMyAtTzAnLgpkbmwgLS1kaXNhYmxlLWRlYnVnIHNldHMgJy1nJyBhbmQgd2hhdGV2ZXIgb3B0aW1pemF0aW9uIG9wdGlvbnMgdGhlCmRubCAgICAgY29tcGlsZXIgY2FuIGhhbmRsZS4KZG5sICArICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgYXV0b21hdGljYWxseSBkZWZhdWx0cyB0aGlzIHRvIG9uLgpkbmwgICsgIFBlcmhhcHMgLUQvLVUgb2YgTkRFQlVHLCBERUJVRywgREVCVUdfQVNTRVJULCAuLi4/CmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9ERUJVR1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21taXR0ZWQsIGl0CmRubCAgICAgICBkZWZhdWx0cyB0byBgbm8nLgpBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9ERUJVRywgW2RubApkZWZpbmUoW0dMSUJDUFBfRU5BQkxFX0RFQlVHX0RFRkFVTFRdLCBpZmVsc2UoJDEsIHllcywgeWVzLCBubykpZG5sCkFDX0FSR19FTkFCTEUoZGVidWcsCmNoYW5nZXF1b3RlKDw8LCA+PilkbmwKPDwgIC0tZW5hYmxlLWRlYnVnICAgICAgICAgIGV4dHJhIGRlYnVnZ2luZywgdHVybiBvZmYgb3B0aW1pemF0aW9uIFtkZWZhdWx0PT4+R0xJQkNQUF9FTkFCTEVfREVCVUdfREVGQVVMVF0sCmNoYW5nZXF1b3RlKFssIF0pZG5sCltjYXNlICIke2VuYWJsZXZhbH0iIGluCiB5ZXMpIGVuYWJsZV9kZWJ1Zz15ZXMgOzsKIG5vKSAgZW5hYmxlX2RlYnVnPW5vIDs7CiAqKSAgIEFDX01TR19FUlJPUihbVW5rbm93biBhcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSBleHRyYSBkZWJ1Z2dpbmddKSA7OwogZXNhY10sCmVuYWJsZV9kZWJ1Zz1HTElCQ1BQX0VOQUJMRV9ERUJVR19ERUZBVUxUKWRubAoKZG5sIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKY2FzZSAiJHtlbmFibGVfZGVidWd9IiBpbgogICAgeWVzKSAKICAgICAgICBERUJVR19GTEFHUz0nLU8wIC1nZ2RiMycgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICA7OyAKICAgIG5vKSAgIAogICAgICAgIERFQlVHX0ZMQUdTPSctZycKICAgICAgICA7Owplc2FjCkFDX1NVQlNUKERFQlVHX0ZMQUdTKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yICJ1bnVzdWFsIiBmbGFncyB0byBwYXNzIHRvIHRoZSBjb21waWxlciB3aGlsZSBidWlsZGluZy4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9DWFhfRkxBR1MKZG5sIC0tZW5hYmxlLWN4eC1mbGFncz0nLWZvbyAtYmFyIC1iYXonIGlzIGEgZ2VuZXJhbCBtZXRob2QgZm9yIHBhc3NpbmcKZG5sICAgICBleHBlcmltZW50YWwgZmxhZ3Mgc3VjaCBhcyAtZmhvbm9yLXN0ZCwgLWZzcXVhbmdsZSwgLURmbG9hdD1jaGFyLCBldGMuCmRubCAgICAgU29tZWhvdyB0aGlzIHNhbWUgc2V0IG9mIGZsYWdzIG11c3QgYmUgcGFzc2VkIHdoZW4gW3JlXWJ1aWxkaW5nCmRubCAgICAgbGliZ2NjLgpkbmwgLS1kaXNhYmxlLWN4eC1mbGFncyBwYXNzZXMgbm90aGluZy4KZG5sICArICBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXEyL21zZzAwMTMxLmh0bWwKZG5sICAgICAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXEyL21zZzAwMjg0Lmh0bWwKZG5sICAgICAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXExL21zZzAwMDM1Lmh0bWwKZG5sICArICBVc2FnZTogIEdMSUJDUFBfRU5BQkxFX0NYWF9GTEFHUyhkZWZhdWx0IGZsYWdzKQpkbmwgICAgICAgSWYgImRlZmF1bHQgZmxhZ3MiIGlzIGFuIGVtcHR5IHN0cmluZyAob3IgIm5vbmUiKSwgdGhlIGVmZmVjdCBpcwpkbmwgICAgICAgdGhlIHNhbWUgYXMgLS1kaXNhYmxlIG9yIC0tZW5hYmxlPW5vLgpBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9DWFhfRkxBR1MsIFtkbmwKZGVmaW5lKFtHTElCQ1BQX0VOQUJMRV9DWFhfRkxBR1NfREVGQVVMVF0sIGlmZWxzZSgkMSwsLCAkMSkpZG5sCkFDX0FSR19FTkFCTEUoY3h4LWZsYWdzLApjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCjw8ICAtLWVuYWJsZS1jeHgtZmxhZ3M9RkxBR1MgICAgICBwYXNzIGNvbXBpbGVyIEZMQUdTIHdoZW4gYnVpbGRpbmcgbGlicmFyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdD0+PkdMSUJDUFBfRU5BQkxFX0NYWF9GTEFHU19ERUZBVUxUXSwKY2hhbmdlcXVvdGUoWywgXSlkbmwKW2Nhc2UgIngkZW5hYmxldmFsIiBpbgogeHllcykgICAKICAgICAgICBBQ19NU0dfRVJST1IoWy0tZW5hYmxlLWN4eC1mbGFncyBuZWVkcyBjb21waWxlciBmbGFncyBhcyBhcmd1bWVudHNdKSA7OwogeG5vfHgpICAKICAgICAgICBlbmFibGVfY3h4X2ZsYWdzPScnIDs7CiAqKSAgICAgIAogICAgICAgIGVuYWJsZV9jeHhfZmxhZ3M9IiRlbmFibGV2YWwiIDs7CiBlc2FjXSwKZW5hYmxlX2N4eF9mbGFncz0nR0xJQkNQUF9FTkFCTEVfQ1hYX0ZMQUdTX0RFRkFVTFQnKQoKZG5sIFRoaW5rbyBvbiBteSBwYXJ0IGR1cmluZyBkZXNpZ24uICBUaGlzIGtsdWRnZSBpcyB0aGUgd29ya2Fyb3VuZC4KaWYgdGVzdCAiJGVuYWJsZV9jeHhfZmxhZ3MiID0gIm5vbmUiOyB0aGVuIAogIGVuYWJsZV9jeHhfZmxhZ3M9Jyc7IApmaQoKZG5sIFJ1biB0aHJvdWdoIGZsYWdzIChlaXRoZXIgZGVmYXVsdCBvciBjb21tYW5kLWxpbmUpIGFuZCBzZXQgYW55dGhpbmcKZG5sIGV4dHJhIChlLmcuLCAjZGVmaW5lcykgdGhhdCBtdXN0IGFjY29tcGFueSBwYXJ0aWN1bGFyIGcrKyBvcHRpb25zLgppZiB0ZXN0IC1uICIkZW5hYmxlX2N4eF9mbGFncyI7IHRoZW4KICAgIGZvciBmIGluICRlbmFibGVfY3h4X2ZsYWdzOyBkbwogICAgICAgIGNhc2UgIiRmIiBpbgogICAgICAgICAgICAtZmhvbm9yLXN0ZCkgIDs7CiAgICAgICAgICAgIC0qKSAgOzsKICAgICAgICAgICAgKikgICAjIGFuZCB3ZSdyZSB0cnlpbmcgdG8gcGFzcyAvd2hhdC8gZXhhY3RseT8KICAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoW2NvbXBpbGVyIGZsYWdzIHN0YXJ0IHdpdGggYSAtXSkgOzsKICAgICAgICBlc2FjCiAgICBkb25lCmZpCkVYVFJBX0NYWF9GTEFHUz0iJGVuYWJsZV9jeHhfZmxhZ3MiCkFDX1NVQlNUKEVYVFJBX0NYWF9GTEFHUykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGljaCBsb2NhbGUgbGlicmFyeSB0byB1c2U6ICBnbnUgb3IgZ2VuZXJpYy4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9DTE9DQUxFCmRubCAtLWVuYWJsZS1jbG9jYWxlPWdudSBzZXRzIGNvbmZpZy9sb2NhbGUvY19sb2NhbGVfZ251LmNjIGFuZCBmcmllbmRzCmRubCAtLWVuYWJsZS1jbG9jYWxlPWdlbmVyaWMgc2V0cyBjb25maWcvbG9jYWxlL2NfbG9jYWxlX2dlbmVyaWMuY2MgYW5kIGZyaWVuZHMKZG5sIApkbmwgZGVmYXVsdCBpcyBnZW5lcmljCmRubApBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9DTE9DQUxFLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgY2xvY2FsZSB0byB1c2VdKQogIEFDX0FSR19FTkFCTEUoY2xvY2FsZSwKICBbICAtLWVuYWJsZS1jbG9jYWxlICAgICAgICBlbmFibGUgbW9kZWwgZm9yIHRhcmdldCBsb2NhbGUgcGFja2FnZS4gCiAgLS1lbmFibGUtY2xvY2FsZT1NT0RFTCAgdXNlIE1PREVMIHRhcmdldC1zcGVpZmljIGxvY2FsZSBwYWNrYWdlLiBbZGVmYXVsdD1nZW5lcmljXQogIF0sIAogIGlmIHRlc3QgeCRlbmFibGVfY2xvY2FsZSA9IHhubzsgdGhlbgogICAgIGVuYWJsZV9jbG9jYWxlPW5vCiAgZmksCiAgICAgZW5hYmxlX2Nsb2NhbGU9bm8pCgogIGVuYWJsZV9jbG9jYWxlX2ZsYWc9JGVuYWJsZV9jbG9jYWxlCgogIGRubCBQcm9iZSBmb3IgbG9jYWxlIHN1cHBvcnQgaWYgbm8gc3BlY2lmaWMgbW9kZWwgaXMgc3BlY2lmaWVkLgogIGRubCBEZWZhdWx0IHRvICJnZW5lcmljIgogIGlmIHRlc3QgeCRlbmFibGVfY2xvY2FsZV9mbGFnID0geG5vOyB0aGVuCiAgICBjYXNlIHgke3RhcmdldF9vc30gaW4KICAgICAgeGxpbnV4KiB8IHhnbnUqKQoJQUNfRUdSRVBfQ1BQKFtfR0xJQkNQUF9va10sIFsKICAgICAgICAjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KICAgICAgICAjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpIAogICAgICAgICAgX0dMSUJDUFBfb2sKICAgICAgICAjZW5kaWYKICAgICAgICBdLCBlbmFibGVfY2xvY2FsZV9mbGFnPWdudSwgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljKQoKCSMgVGVzdCBmb3IgYnVncyBlYXJseSBpbiBnbGliYy0yLjIueCBzZXJpZXMKICAJaWYgdGVzdCB4JGVuYWJsZV9jbG9jYWxlX2ZsYWcgPSB4Z251OyB0aGVuCiAgICAJICBBQ19UUllfUlVOKFsKCSAgI2RlZmluZSBfR05VX1NPVVJDRSAxCgkgICNpbmNsdWRlIDxsb2NhbGUuaD4KCSAgI2luY2x1ZGUgPHN0cmluZy5oPgoJICAjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKCSAgZXh0ZXJuIF9fdHlwZW9mKG5ld2xvY2FsZSkgX19uZXdsb2NhbGU7CgkgIGV4dGVybiBfX3R5cGVvZihkdXBsb2NhbGUpIF9fZHVwbG9jYWxlOwoJICBleHRlcm4gX190eXBlb2Yoc3RyY29sbF9sKSBfX3N0cmNvbGxfbDsKCSAgI2VuZGlmCgkgIGludCBtYWluKCkKCSAgewogIAkgICAgY29uc3QgY2hhciBfX29uZVtdID0gIsR1Z2xlaW4gQXVnbWVuIjsKICAJICAgIGNvbnN0IGNoYXIgX190d29bXSA9ICLEdWdsZWluIjsKICAJICAgIGludCBpOwogIAkgICAgaW50IGo7CiAgCSAgICBfX2xvY2FsZV90CWxvYzsKICAgCSAgICBfX2xvY2FsZV90CWxvY19kdXA7CiAgCSAgICBsb2MgPSBfX25ld2xvY2FsZSgxIDw8IExDX0FMTCwgImRlX0RFIiwgMCk7CiAgCSAgICBsb2NfZHVwID0gX19kdXBsb2NhbGUobG9jKTsKICAJICAgIGkgPSBfX3N0cmNvbGxfbChfX29uZSwgX190d28sIGxvYyk7CiAgCSAgICBqID0gX19zdHJjb2xsX2woX19vbmUsIF9fdHdvLCBsb2NfZHVwKTsKICAJICAgIHJldHVybiAwOwoJICB9CgkgIF0sIAoJICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nbnVdLFtlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWNdLAoJICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljXSkKICAJZmkKCgkjIC4uLiBhdCBzb21lIHBvaW50IHB1dCBfX3N0cnhmcm1fbCB0ZXN0cyBpbiBhcyB3ZWxsLgogICAgICAgIDs7CiAgICAgICopCgllbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWMKCTs7CiAgICBlc2FjCiAgZmkKCiAgZG5sIERlYWwgd2l0aCBnZXR0ZXh0IGlzc3Vlcy4KICBBQ19BUkdfRU5BQkxFKG5scywKICBbICAtLWVuYWJsZS1ubHMgICAgICAgICAgICB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQgKGRlZmF1bHQpXSwKICAsIGVuYWJsZV9ubHM9eWVzKQogIFVTRV9OTFM9bm8KCiAgZG5sIFNldCBjb25maWd1cmUgYml0cyBmb3Igc3BlY2lmaWVkIGxvY2FsZSBwYWNrYWdlCiAgY2FzZSB4JHtlbmFibGVfY2xvY2FsZV9mbGFnfSBpbgogICAgeGdlbmVyaWMpCiAgICAgIEFDX01TR19SRVNVTFQoZ2VuZXJpYykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5jYwogICAgICBDQ09ERUNWVF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2N0eXBlX21lbWJlcnMuY2MKICAgICAgQ01FU1NBR0VTX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tb25ldGFyeV9tZW1iZXJzLmNjCiAgICAgIENOVU1FUklDX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5jYwogICAgICBDTE9DQUxFX0lOVEVSTkFMX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICB4Z251KQogICAgICBBQ19NU0dfUkVTVUxUKGdudSkKCiAgICAgICMgRGVjbGFyZSBpbnRlbnRpb24gdG8gdXNlIGdldHRleHQsIGFuZCBhZGQgc3VwcG9ydCBmb3Igc3BlY2lmaWMKICAgICAgIyBsYW5ndWFnZXMuCiAgICAgICMgRm9yIHNvbWUgcmVhc29uLCBBTExfTElOR1VBUyBoYXMgdG8gYmUgYmVmb3JlIEFNLUdOVS1HRVRURVhUCiAgICAgIEFMTF9MSU5HVUFTPSJkZSBmciIKCiAgICAgICMgRG9uJ3QgY2FsbCBBTS1HTlUtR0VUVEVYVCBoZXJlLiBJbnN0ZWFkLCBhc3N1bWUgZ2xpYmMuCiAgICAgIEFDX0NIRUNLX1BST0coY2hlY2tfbXNnZm10LCBtc2dmbXQsIHllcywgbm8pCiAgICAgIGlmIHRlc3QgeCIkY2hlY2tfbXNnZm10IiA9IHgieWVzIiAmJiB0ZXN0IHgiJGVuYWJsZV9ubHMiID0geCJ5ZXMiOyB0aGVuCglVU0VfTkxTPXllcwogICAgICBmaQogICAgICAjIEV4cG9ydCB0aGUgYnVpbGQgb2JqZWN0cy4KICAgICAgZm9yIGxpbmcgaW4gJEFMTF9MSU5HVUFTOyBkbyBcCiAgICAgICAgZ2xpYmNwcF9NT0ZJTEVTPSIkZ2xpYmNwcF9NT0ZJTEVTICRsaW5nLm1vIjsgXAogICAgICAgIGdsaWJjcHBfUE9GSUxFUz0iJGdsaWJjcHBfUE9GSUxFUyAkbGluZy5wbyI7IFwKICAgICAgZG9uZQogICAgICBBQ19TVUJTVChnbGliY3BwX01PRklMRVMpCiAgICAgIEFDX1NVQlNUKGdsaWJjcHBfUE9GSUxFUykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dudS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaAogICAgICBDQ09ERUNWVF9DQz1jb25maWcvbG9jYWxlL2dudS9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2dudS9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvZ251L21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dudS9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dudS90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dudS90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ251L2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICB4aWVlZV8xMDAzLjEtMjAwMSkKICAgICAgQUNfTVNHX1JFU1VMVChnZW5lcmljKQoKICAgICAgQ0xPQ0FMRV9IPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9pZWVlXzEwMDMuMS0yMDAxL2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0g9Y29uZmlnL2xvY2FsZS9pZWVlXzEwMDMuMS0yMDAxL2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5oCiAgICAgIENNRVNTQUdFU19DQz1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL251bWVyaWNfbWVtYmVycy5jYwogICAgICBDVElNRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvYysrbG9jYWxlX2ludGVybmFsLmgKICAgICAgOzsKICAgICopCiAgICAgIGVjaG8gIiRlbmFibGVfY2xvY2FsZSBpcyBhbiB1bmtub3duIGxvY2FsZSBwYWNrYWdlIiAxPiYyCiAgICAgIGV4aXQgMQogICAgICA7OwogIGVzYWMKCiAgIyBUaGlzIGlzIHdoZXJlIHRoZSB0ZXN0c3VpdGUgbG9va3MgZm9yIGxvY2FsZSBjYXRhbG9ncywgdXNpbmcgdGhlCiAgIyAtRExPQ0FMRURJUiBkZWZpbmUgZHVyaW5nIHRlc3RzdWl0ZSBjb21waWxhdGlvbi4KICBnbGliY3BwX2xvY2FsZWRpcj0ke2dsaWJjcHBfYnVpbGRkaXJ9L3BvL3NoYXJlL2xvY2FsZQogIEFDX1NVQlNUKGdsaWJjcHBfbG9jYWxlZGlyKQoKICAjIEZvciB0aGUgdGltZSBiZWluZywgdHJhbnNmb3JtIGN0eXBlX25vbmlubGluZS5oIHRvIGN0eXBlX21lbWJlcnNfY2hhci5jYwojICBDQ1RZUEVfQ0hBUl9DQz1jb25maWcvJHtvc19pbmNsdWRlX2Rpcn0vY3R5cGVfbm9uaW5saW5lLmgKCiAgQUNfU1VCU1QoVVNFX05MUykKICBBQ19TVUJTVChDTE9DQUxFX0gpCiAgQUNfU1VCU1QoQ0NPREVDVlRfSCkKICBBQ19TVUJTVChDTUVTU0FHRVNfSCkKICBBQ19TVUJTVChDVElNRV9IKQogIEFDX0xJTktfRklMRVMoJENMT0NBTEVfQ0MsIHNyYy9jKytsb2NhbGUuY2MpCiAgQUNfTElOS19GSUxFUygkQ0NPREVDVlRfQ0MsIHNyYy9jb2RlY3Z0X21lbWJlcnMuY2MpCiAgQUNfTElOS19GSUxFUygkQ0NPTExBVEVfQ0MsIHNyYy9jb2xsYXRlX21lbWJlcnMuY2MpCiMgIEFDX0xJTktfRklMRVMoJENDVFlQRV9DSEFSX0NDLCBzcmMvY3R5cGVfbWVtYmVyc19jaGFyLmNjKQogIEFDX0xJTktfRklMRVMoJENDVFlQRV9DQywgc3JjL2N0eXBlX21lbWJlcnMuY2MpCiAgQUNfTElOS19GSUxFUygkQ01FU1NBR0VTX0NDLCBzcmMvbWVzc2FnZXNfbWVtYmVycy5jYykKICBBQ19MSU5LX0ZJTEVTKCRDTU9ORVlfQ0MsIHNyYy9tb25ldGFyeV9tZW1iZXJzLmNjKQogIEFDX0xJTktfRklMRVMoJENOVU1FUklDX0NDLCBzcmMvbnVtZXJpY19tZW1iZXJzLmNjKQogIEFDX0xJTktfRklMRVMoJENUSU1FX0NDLCBzcmMvdGltZV9tZW1iZXJzLmNjKQogIEFDX0xJTktfRklMRVMoJENMT0NBTEVfSU5URVJOQUxfSCwgc3JjL2MrK2xvY2FsZV9pbnRlcm5hbC5oKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdoaWNoIEkvTyBsaWJyYXJ5IHRvIHVzZTogIGxpYmlvLCBvciBzb21ldGhpbmcgc3BlY2lmaWMuCmRubApkbmwgR0xJQkNQUF9FTkFCTEVfQ1NURElPCmRubCAtLWVuYWJsZS1jc3RkaW89bGliaW8gc2V0cyBjb25maWcvaW8vY19pb19saWJpby5oIGFuZCBmcmllbmRzCmRubCAKZG5sIGRlZmF1bHQgaXMgc3RkaW8KZG5sCkFDX0RFRlVOKEdMSUJDUFBfRU5BQkxFX0NTVERJTywgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGNzdGRpbyB0byB1c2VdKQogIEFDX0FSR19FTkFCTEUoY3N0ZGlvLAogIFsgIC0tZW5hYmxlLWNzdGRpbyAgICAgICAgIGVuYWJsZSBzdGRpbyBmb3IgdGFyZ2V0IGlvIHBhY2thZ2UuIAogIC0tZW5hYmxlLWNzdGRpbz1MSUIgICAgIHVzZSBMSUIgdGFyZ2V0LXNwZWlmaWMgaW8gcGFja2FnZS4gW2RlZmF1bHQ9c3RkaW9dCiAgXSwgCiAgaWYgdGVzdCB4JGVuYWJsZV9jc3RkaW8gPSB4bm87IHRoZW4KICAgICBlbmFibGVfY3N0ZGlvPXN0ZGlvCiAgZmksCiAgICAgZW5hYmxlX2NzdGRpbz1zdGRpbykKCiAgZW5hYmxlX2NzdGRpb19mbGFnPSRlbmFibGVfY3N0ZGlvCgogIGRubCBDaGVjayBpZiBhIHZhbGlkIEkvTyBwYWNrYWdlCiAgY2FzZSB4JHtlbmFibGVfY3N0ZGlvX2ZsYWd9IGluCiAgICB4bGliaW8pCiAgICAgIENTVERJT19IPWNvbmZpZy9pby9jX2lvX2xpYmlvLmgKICAgICAgQkFTSUNfRklMRV9IPWNvbmZpZy9pby9iYXNpY19maWxlX2xpYmlvLmgKICAgICAgQkFTSUNfRklMRV9DQz1jb25maWcvaW8vYmFzaWNfZmlsZV9saWJpby5jYwogICAgICBBQ19NU0dfUkVTVUxUKGxpYmlvKQoKICAgICAgIyBzZWUgaWYgd2UgYXJlIG9uIGEgc3lzdGVtIHdpdGggbGliaW8gbmF0aXZlIChpZSwgbGludXgpCiAgICAgIEFDX0NIRUNLX0hFQURFUihsaWJpby5oLCAgaGFzX2xpYmlvPXllcywgaGFzX2xpYmlvPW5vKQoKICAgICAgIyBOZWVkIHRvIGNoZWNrIGFuZCBzZWUgd2hhdCB2ZXJzaW9uIG9mIGdsaWJjIGlzIGJlaW5nIHVzZWQuIElmCiAgICAgICMgaXQncyBub3QgZ2xpYmMtMi4yIG9yIGhpZ2hlciwgdGhlbiB3ZSdsbCBuZWVkIHRvIGdvIGFoZWFkIGFuZCAKICAgICAgIyBjb21waWxlIG1vc3Qgb2YgbGliaW8gZm9yIGxpbnV4IHN5c3RlbXMuCiAgICAgIGlmIHRlc3QgeCRoYXNfbGliaW8gPSB4InllcyI7IHRoZW4KICAgICAgICBjYXNlICIkdGFyZ2V0IiBpbgogICAgICAgICAgKi0qLWxpbnV4KikKICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnbGliYyB2ZXJzaW9uID49IDIuMl0pCiAgICAgICAgICAgICAgQUNfRUdSRVBfQ1BQKFtva10sIFsKICAgICAgICAgICAgI2luY2x1ZGUgPGZlYXR1cmVzLmg+CiAgICAgICAgICAgICAgI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSAKICAgICAgICAgICAgICAgICAgICBvawogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgIF0sIGdsaWJjX3NhdGlzZmFjdG9yeT15ZXMsIGdsaWJjX3NhdGlzZmFjdG9yeT1ubykKICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRnbGliY19zYXRpc2ZhY3RvcnkpCiAgICAgICAgICAgIDs7CiAgICAgICAgZXNhYwoKICAgICAgICAjIFhYWCBhdCB0aGUgbW9tZW50LCBhZG1pdCBkZWZlYXQgYW5kIGZvcmNlIHRoZSByZWNvbXBpbGF0aW9uCiAgICAgICAgIyBYWFggb2YgZ2xpYmMgZXZlbiBvbiBnbGliYy0yLjIgc3lzdGVtcywgYmVjYXVzZSBsaWJpbyBpcyBub3Qgc3luY2hlZC4KICAgICAgICBnbGliY19zYXRpc2ZhY3Rvcnk9bm8gICAgICAgIAoKICAgICAgICBpZiB0ZXN0IHgkZ2xpYmNfc2F0aXNmYWN0b3J5ID0geCJ5ZXMiOyB0aGVuCiAgICAgICAgICAgbmVlZF9saWJpbz1ubwogICAgICAgICAgIG5lZWRfd2xpYmlvPW5vICAgICAgICAKICAgICAgICBlbHNlCiAgICAgICAgICAgbmVlZF9saWJpbz15ZXMKICAgICAgICAgICAjIGJrb3ogWFhYIG5lZWQgdG8gYWRkIGNoZWNrcyB0byBlbmFibGUgdGhpcwogICAgICAgICAgICMgcG1lIFhYWCBoZXJlJ3MgYSBmaXJzdCBwYXNzIGF0IHN1Y2ggYSBjaGVjawogICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfY19tYmNoYXIgIT0geG5vOyB0aGVuCiAgICAgICAgICAgICAgbmVlZF93bGliaW89eWVzCiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIG5lZWRfd2xpYmlvPW5vCiAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgZWxzZQogICAgICAgICAjIFVzaW5nIGxpYmlvLCBidXQgPGxpYmlvLmg+IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHRhcmdldCBzeXN0ZW0uIC4gLgogICAgICAgICBuZWVkX2xpYmlvPXllcwogICAgICAgICAjIGJrb3ogWFhYIG5lZWQgdG8gYWRkIGNoZWNrcyB0byBlbmFibGUgdGhpcwogICAgICAgICAjIHBtZSBYWFggaGVyZSdzIGEgZmlyc3QgcGFzcyBhdCBzdWNoIGEgY2hlY2sKICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9jX21iY2hhciAhPSB4bm87IHRoZW4KICAgICAgICAgICAgIG5lZWRfd2xpYmlvPXllcwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBuZWVkX3dsaWJpbz1ubwogICAgICAgICBmaQogICAgICBmaQogICAgICA7OwogICAgeHN0ZGlvIHwgeCB8IHhubyB8IHhub25lIHwgeHllcykKICAgICAgIyBkZWZhdWx0CiAgICAgIENTVERJT19IPWNvbmZpZy9pby9jX2lvX3N0ZGlvLmgKICAgICAgQkFTSUNfRklMRV9IPWNvbmZpZy9pby9iYXNpY19maWxlX3N0ZGlvLmgKICAgICAgQkFTSUNfRklMRV9DQz1jb25maWcvaW8vYmFzaWNfZmlsZV9zdGRpby5jYwogICAgICBBQ19NU0dfUkVTVUxUKHN0ZGlvKQoKICAgICAgIyBXZSdyZSBub3QgdXNpbmcgc3RkaW8uCiAgICAgIG5lZWRfbGliaW89bm8KICAgICAgbmVlZF93bGliaW89bm8KICAgICAgOzsKICAgICopCiAgICAgIGVjaG8gIiRlbmFibGVfY3N0ZGlvIGlzIGFuIHVua25vd24gaW8gcGFja2FnZSIgMT4mMgogICAgICBleGl0IDEKICAgICAgOzsKICBlc2FjCiAgQUNfU1VCU1QoQ1NURElPX0gpCiAgQUNfU1VCU1QoQkFTSUNfRklMRV9IKQogIEFDX0xJTktfRklMRVMoJEJBU0lDX0ZJTEVfQ0MsIHNyYy9iYXNpY19maWxlLmNjKQoKICAjIDIwMDAtMDgtMDQgYmtveiBoYWNrCiAgQ0NPREVDVlRfQz1jb25maWcvaW8vY19pb19saWJpb19jb2RlY3Z0LmMKICBBQ19TVUJTVChDQ09ERUNWVF9DKQogICMgMjAwMC0wOC0wNCBia296IGhhY2sKCiAgQU1fQ09ORElUSU9OQUwoR0xJQkNQUF9CVUlMRF9MSUJJTywKICAgICAgICAgICAgICAgICB0ZXN0ICIkbmVlZF9saWJpbyIgPSB5ZXMgfHwgdGVzdCAiJG5lZWRfd2xpYmlvIiA9IHllcykKICBBTV9DT05ESVRJT05BTChHTElCQ1BQX05FRURfTElCSU8sIHRlc3QgIiRuZWVkX2xpYmlvIiA9IHllcykKICBBTV9DT05ESVRJT05BTChHTElCQ1BQX05FRURfV0xJQklPLCB0ZXN0ICIkbmVlZF93bGliaW8iID0geWVzKQogIGlmIHRlc3QgIiRuZWVkX2xpYmlvIiA9IHllcyB8fCB0ZXN0ICIkbmVlZF93bGliaW8iID0geWVzOyB0aGVuCiAgICBsaWJpb19sYT0uLi9saWJpby9saWJpby5sYQogIGVsc2UKICAgIGxpYmlvX2xhPQogIGZpCiAgQUNfU1VCU1QobGliaW9fbGEpCl0pCgoKZG5sCmRubCBTZXR1cCB0byB1c2UgdGhlIGdjYyBndGhyLmggdGhyZWFkLXNwZWNpZmljIG1lbW9yeSBhbmQgbXV0ZXggbW9kZWwuCmRubCBXZSBtdXN0IHN0YWdlIHRoZSByZXF1aXJlZCBoZWFkZXJzIHNvIHRoYXQgdGhleSB3aWxsIGJlIGluc3RhbGxlZApkbmwgd2l0aCB0aGUgbGlicmFyeSAodW5saWtlIGxpYmdjYywgdGhlIFNUTCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZApkbmwgc29sZWx5IHdpdGhpbiBoZWFkZXJzKS4gIFNpbmNlIHdlIG11c3Qgbm90IGluamVjdCByYW5kb20gdXNlci1zcGFjZQpkbmwgbWFjcm8gbmFtZXMgaW50byB1c2VyLXByb3ZpZGVkIEMrKyBjb2RlLCB3ZSBmaXJzdCBzdGFnZSBpbnRvIDxmaWxlPi1pbgpkbmwgYW5kIHByb2Nlc3MgdG8gPGZpbGU+IHdpdGggYW4gb3V0cHV0IGNvbW1hbmQuICBUaGUgcmVhc29uIGZvciBhIHR3by0KZG5sIHN0YWdlIHByb2Nlc3MgaGVyZSBpcyB0byBjb3JyZWN0bHkgaGFuZGxlICRzcmNkaXIhPSRvYmpkaXIgd2l0aG91dApkbmwgaGF2aW5nIHRvIHdyaXRlIGNvbXBsZXggY29kZSAodGhlIHNlZCBjb21tYW5kcyB0byBjbGVhbiB0aGUgbWFjcm8KZG5sIG5hbWVzcGFjZSBhcmUgY29tcGxleCBhbmQgZnJhZ2lsZSBlbm91Z2ggYXMgaXQgaXMpLiAgV2UgbXVzdCBhbHNvCmRubCBhZGQgYSByZWxhdGl2ZSBwYXRoIHNvIHRoYXQgLUktIGlzIHN1cHBvcnRlZCBwcm9wZXJseS4KZG5sCkFDX0RFRlVOKEdMSUJDUFBfRU5BQkxFX1RIUkVBRFMsIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aHJlYWQgbW9kZWwgdXNlZCBieSBHQ0NdKQogIHRhcmdldF90aHJlYWRfZmlsZT1gJENDIC12IDI+JjEgfCBzZWQgLW4gJ3MvXlRocmVhZCBtb2RlbDogLy9wJ2AKICBBQ19NU0dfUkVTVUxUKFskdGFyZ2V0X3RocmVhZF9maWxlXSkKCiAgaWYgdGVzdCAkdGFyZ2V0X3RocmVhZF9maWxlICE9IHNpbmdsZTsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfR1RIUl9ERUZBVUxUKQogICAgQUNfREVGSU5FKF9HTElCQ1BQX1NVUFBPUlRTX1dFQUssIF9fR1hYX1dFQUtfXykKICBmaQoKICBnbGliY3BwX3RocmVhZF9oPWd0aHItJHRhcmdldF90aHJlYWRfZmlsZS5oCiAgQUNfU1VCU1QoZ2xpYmNwcF90aHJlYWRfaCkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIElmIGFuIGV4cGxpY2l0IGVuYWJsZS9kaXNhYmxlCmRubCBzamxqIGV4Y2VwdGlvbnMgaXMgZ2l2ZW4sIHdlIGRvbid0IGhhdmUgdG8gZGV0ZWN0LiAgT3RoZXJ3aXNlIHRoZQpkbmwgdGFyZ2V0IG1heSBvciBtYXkgbm90IHN1cHBvcnQgY2FsbCBmcmFtZSBleGNlcHRpb25zLgpkbmwKZG5sIEdMSUJDUFBfRU5BQkxFX1NKTEpfRVhDRVBUSU9OUwpkbmwgLS1lbmFibGUtc2psai1leGNlcHRpb25zIGZvcmNlcyB0aGUgdXNlIG9mIGJ1aWx0aW4gc2V0am1wLgpkbmwgLS1kaXNhYmxlLXNqbGotZXhjZXB0aW9ucyBmb3JjZXMgdGhlIHVzZSBvZiBjYWxsIGZyYW1lIHVud2luZGluZy4KZG5sCmRubCBEZWZpbmUgX0dMSUJDUFBfU0pMSl9FWENFUFRJT05TIGlmIHRoZSBjb21waWxlciBpcyBjb25maWd1cmVkIGZvciBpdC4KZG5sCkFDX0RFRlVOKEdMSUJDUFBfRU5BQkxFX1NKTEpfRVhDRVBUSU9OUywgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGV4Y2VwdGlvbiBtb2RlbCB0byB1c2VdKQogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgQUNfQVJHX0VOQUJMRShzamxqLWV4Y2VwdGlvbnMsCiAgWyAgLS1lbmFibGUtc2psai1leGNlcHRpb25zICBmb3JjZSB1c2Ugb2YgYnVpbHRpbl9zZXRqbXAgZm9yIGV4Y2VwdGlvbnNdLAogIFs6XSwKICBbZG5sIEJvdGhlcmF0aW9uLiAgTm93IHdlJ3ZlIGdvdCB0byBkZXRlY3QgdGhlIGV4Y2VwdGlvbiBtb2RlbC4KICAgZG5sIExpbmsgdGVzdHMgYWdhaW5zdCBsaWJnY2MuYSBhcmUgcHJvYmxlbWF0aWMgc2luY2UgLS0gYXQgbGVhc3QKICAgZG5sIGFzIG9mIHRoaXMgd3JpdGluZyAtLSB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBwcm9wZXIgLUwgYml0cyBmb3IKICAgZG5sIHNpbmdsZS10cmVlIG5ld2xpYiBhbmQgbGliZ2xvc3MuCiAgIGRubAogICBkbmwgVGhpcyBpcyB3aGF0IEFDX1RSWV9DT01QSUxFIHdvdWxkIGRvIGlmIGl0IGRpZG4ndCBkZWxldGUgdGhlCiAgIGRubCBjb25mdGVzdCBmaWxlcyBiZWZvcmUgd2UgZ290IGEgY2hhbmdlIHRvIGdyZXAgdGhlbSBmaXJzdC4KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKc3RydWN0IFMgeyB+UygpOyB9Owp2b2lkIGJhcigpOwp2b2lkIGZvbygpCnsKICBTIHM7CiAgYmFyKCk7Cn0KRU9GCiAgIG9sZF9DWFhGTEFHUz0iJENYWEZMQUdTIiAgCiAgIENYWEZMQUdTPSItUyAtZmV4Y2VwdGlvbnMiCiAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgaWYgZ3JlcCBfVW53aW5kX1NqTGpfUmVzdW1lIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgZW5hYmxlX3NqbGpfZXhjZXB0aW9ucz15ZXMKICAgICBlbGlmIGdyZXAgX1Vud2luZF9SZXN1bWUgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICBlbmFibGVfc2psal9leGNlcHRpb25zPW5vCiAgICAgZmkKICAgZmkKICAgQ1hYRkxBR1M9IiRvbGRfQ1hYRkxBR1MiCiAgIHJtIC1mIGNvbmZ0ZXN0Kl0pCiAgIGlmIHRlc3QgeCRlbmFibGVfc2psal9leGNlcHRpb25zID0geHllczsgdGhlbgogICAgIEFDX0RFRklORShfR0xJQkNQUF9TSkxKX0VYQ0VQVElPTlMsIDEsCiAgICAgICAgW0RlZmluZSBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmlndXJlZCBmb3Igc2V0am1wL2xvbmdqbXAgZXhjZXB0aW9ucy5dKQogICAgIGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lPXNqbGoKICAgZWxpZiB0ZXN0IHgkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyA9IHhubzsgdGhlbgogICAgIGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lPSJjYWxsIGZyYW1lIgogICBlbHNlCiAgICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gZGV0ZWN0IGV4Y2VwdGlvbiBtb2RlbF0pCiAgIGZpCiAgIEFDX0xBTkdfUkVTVE9SRQogICBBQ19NU0dfUkVTVUxUKCRhY19leGNlcHRpb25fbW9kZWxfbmFtZSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBsaWJ1bndpbmQgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuIElmIGVuYWJsZWQgdGhlbgpkbmwgd2UgYXNzdW1lIHRoYXQgdGhlIF9VbndpbmRfKiBmdW5jdGlvbnMgdGhhdCBtYWtlIHVwIHRoZSBVbndpbmQgQUJJCmRubCAoX1Vud2luZF9SYWlzZUV4Y2VwdGlvbiwgX1Vud2luZF9SZXN1bWUsIGV0Yy4pIGFyZSBkZWZpbmVkIGJ5CmRubCBsaWJ1bndpbmQgaW5zdGVhZCBvZiBsaWJnY2MgYW5kIHRoYXQgbGlic3RkYysrIGhhcyBhIGRlcGVuZGVuY3kKZG5sIG9uIGxpYnVud2luZCBhcyB3ZWxsIGFzIGxpYmdjYy4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9MSUJVTldJTkRfRVhDRVBUSU9OUwpkbmwgLS1lbmFibGUtbGlidW53aW5kLWV4Y2VwdGlvbnMgZm9yY2VzIHRoZSB1c2Ugb2YgbGlidW53aW5kLgpkbmwgLS1kaXNhYmxlLWxpYnVud2luZC1leGNlcHRpb25zIGFzc3VtZXMgdGhlcmUgaXMgbm8gbGlidW53aW5kLgpkbmwKZG5sIERlZmluZSBfR0xJQkNQUF9MSUJVTldJTkRfRVhDRVBUSU9OUyBpZiByZXF1ZXN0ZWQuCmRubApBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9MSUJVTldJTkRfRVhDRVBUSU9OUywgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIHVzZSBvZiBsaWJ1bndpbmRdKQogIEFDX0FSR19FTkFCTEUobGlidW53aW5kLWV4Y2VwdGlvbnMsCiAgWyAgLS1lbmFibGUtbGlidW53aW5kLWV4Y2VwdGlvbnMgIGZvcmNlIHVzZSBvZiBsaWJ1bndpbmQgZm9yIGV4Y2VwdGlvbnNdLAogIHVzZV9saWJ1bndpbmRfZXhjZXB0aW9ucz0kZW5hYmxldmFsLAogIHVzZV9saWJ1bndpbmRfZXhjZXB0aW9ucz1ubykKICBBQ19NU0dfUkVTVUxUKCR1c2VfbGlidW53aW5kX2V4Y2VwdGlvbnMpCiAgZG5sIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKICBpZiB0ZXN0IHgiJHVzZV9saWJ1bndpbmRfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCiAgICBMSUJVTldJTkRfRkxBRz0iLWx1bndpbmQiCiAgZWxzZQogICAgTElCVU5XSU5EX0ZMQUc9IiIKICBmaQogIEFDX1NVQlNUKExJQlVOV0lORF9GTEFHKQpdKQoKZG5sCmRubCBDaGVjayBmb3IgSVNPL0lFQyA5ODk5OjE5OTkgIkM5OSIgc3VwcG9ydC4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9DOTkKZG5sIC0tZW5hYmxlLWM5OSBkZWZpbmVzIF9HTElCQ1BQX1VTRV9DOTkKZG5sIC0tZGlzYWJsZS1jOTkgbGVhdmVzIF9HTElCQ1BQX1VTRV9DOTkgdW5kZWZpbmVkCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9DOTlbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0CmRubCAgICAgICBkZWZhdWx0cyB0byBgbm8nLgpkbmwgICsgIElmICdDOTknIHN0dWZmIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yZXMgREVGQVVMVCBhbmQgc2V0cyBgbm8nLgpkbmwKZG5sIEdMSUJDUFBfRU5BQkxFX0M5OQpBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9DOTksIFtkbmwKICBkZWZpbmUoW0dMSUJDUFBfRU5BQkxFX0M5OV9ERUZBVUxUXSwgaWZlbHNlKCQxLCB5ZXMsIHllcywgbm8pKWRubAoKICBBQ19BUkdfRU5BQkxFKGM5OSwKICBjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCiAgPDwtLWVuYWJsZS1jOTkgICAgICAgICAgICB0dXJucyBvbiAnSVNPL0lFQyA5ODk5OjE5OTkgc3VwcG9ydCcgW2RlZmF1bHQ9Pj5HTElCQ1BQX0VOQUJMRV9DOTlfREVGQVVMVF0sCiAgY2hhbmdlcXVvdGUoWywgXSlkbmwKICBbY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgeWVzKSBlbmFibGVfYzk5PXllcyA7OwogICBubykgIGVuYWJsZV9jOTk9bm8gOzsKICAgKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgQzk5XSkgOzsKICAgZXNhY10sCiAgZW5hYmxlX2M5OT1HTElCQ1BQX0VOQUJMRV9DOTlfREVGQVVMVClkbmwKIAogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPG1hdGguaD4gZnVuY3Rpb25zIHVzZWQgaWYgQzk5IGlzIGVuYWJsZWQuCiAgYWNfYzk5X21hdGg9eWVzOwogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8bWF0aC5oPl0pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbZnBjbGFzc2lmeSgwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sW2lzZmluaXRlKDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbaXNpbmYoMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtpc25hbigwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sW2lzbm9ybWFsKDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbc2lnbmJpdCgwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sW2lzZ3JlYXRlcigwLjAsMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLAogICAgICAgICAgICAgICAgIFtpc2dyZWF0ZXJlcXVhbCgwLjAsMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtpc2xlc3MoMC4wLDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbaXNsZXNzZXF1YWwoMC4wLDAuMCk7XSwsW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLAoJICAgICAgICAgW2lzbGVzc2dyZWF0ZXIoMC4wLDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSwKCSAgICAgICAgIFtpc3Vub3JkZXJlZCgwLjAsMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfbWF0aCkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBpbiA8c3RkaW8uaD4gb2YgdnNjYW5mLCBldC4gYWwuCiAgYWNfYzk5X3N0ZGlvPXllczsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPHN0ZGlvLmg+XSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+XSwKCQkgW3NucHJpbnRmKCIxMiIsIDAsICIlaSIpO10sLCBbYWNfYzk5X3N0ZGlvPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+CgkJICAjaW5jbHVkZSA8c3RkYXJnLmg+CgkJICB2b2lkIGZvbyhjaGFyKiBmbXQsIC4uLikKCQkgIHt2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CgkgICAgICAgICAgdmZzY2FuZihzdGRlcnIsICIlaSIsIGFyZ3MpO31dLAoJICAgICAgICAgIFtdLCwgW2FjX2M5OV9zdGRpbz1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRpby5oPgoJCSAgI2luY2x1ZGUgPHN0ZGFyZy5oPgoJCSAgdm9pZCBmb28oY2hhciogZm10LCAuLi4pCgkJICB7dmFfbGlzdCBhcmdzOyB2YV9zdGFydChhcmdzLCBmbXQpOwoJICAgICAgICAgIHZzY2FuZigiJWkiLCBhcmdzKTt9XSwKCSAgICAgICAgICBbXSwsIFthY19jOTlfc3RkaW89bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkaW8uaD4KCQkgICNpbmNsdWRlIDxzdGRhcmcuaD4KCQkgIHZvaWQgZm9vKGNoYXIqIGZtdCwgLi4uKQoJCSAge3ZhX2xpc3QgYXJnczsgdmFfc3RhcnQoYXJncywgZm10KTsKCSAgICAgICAgICB2c25wcmludGYoZm10LCAwLCAiJWkiLCBhcmdzKTt9XSwKCSAgICAgICAgICBbXSwsIFthY19jOTlfc3RkaW89bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkaW8uaD4KCQkgICNpbmNsdWRlIDxzdGRhcmcuaD4KCQkgIHZvaWQgZm9vKGNoYXIqIGZtdCwgLi4uKQoJCSAge3ZhX2xpc3QgYXJnczsgdmFfc3RhcnQoYXJncywgZm10KTsKCSAgICAgICAgICB2c3NjYW5mKGZtdCwgIiVpIiwgYXJncyk7fV0sCgkgICAgICAgICAgW10sLCBbYWNfYzk5X3N0ZGlvPW5vXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfc3RkaW8pCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHN0ZGxpYi5oPiBvZiBsbGRpdl90LCBldC4gYWwuCiAgYWNfYzk5X3N0ZGxpYj15ZXM7CiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGxkaXZfdCBkZWNsYXJhdGlvbl0pCiAgQUNfQ0FDSEVfVkFMKGFjX2M5OV9sbGRpdl90LCBbCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLCAKICAgICAgICAgICAgICAgICAgIFsgbGxkaXZfdCBteWRpdnQ7XSwgCiAgICAgICAgICAgICAgICAgICBbYWNfYzk5X2xsZGl2X3Q9eWVzXSwgW2FjX2M5OV9sbGRpdl90PW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9sbGRpdl90KQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPHN0ZGxpYi5oPl0pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLAoJICAgICAgICAgW2NoYXIqIHRtcDsgc3RydG9mKCJnbnUiLCAmdG1wKTtdLCwgW2FjX2M5OV9zdGRsaWI9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkbGliLmg+XSwKCSAgICAgICAgIFtjaGFyKiB0bXA7IHN0cnRvbGQoImdudSIsICZ0bXApO10sLCBbYWNfYzk5X3N0ZGxpYj1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLCBbbGxhYnMoMTApO10sLCBbYWNfYzk5X3N0ZGxpYj1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLCBbbGxkaXYoMTAsMSk7XSwsIFthY19jOTlfc3RkbGliPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sIFthdG9sbCgiMTAiKTtdLCwgW2FjX2M5OV9zdGRsaWI9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkbGliLmg+XSwgW19FeGl0KDApO10sLCBbYWNfYzk5X3N0ZGxpYj1ub10pCiAgaWYgdGVzdCB4IiRhY19jOTlfbGxkaXZfdCIgPSB4Im5vIjsgdGhlbgogICAgYWNfYzk5X3N0ZGxpYj1ubzsgCiAgZmk7IAogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRsaWIpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPHdjaGFyLmg+IGZ1bmN0aW9ucyB1c2VkIGlmIEM5OSBpcyBlbmFibGVkLgogICMgWFhYIHRoZSB3Y2hhci5oIGNoZWNrcyBzaG91bGQgYmUgcm9sbGVkIGludG8gdGhlIGdlbmVyYWwgQzk5IGJpdHMuCiAgYWNfYzk5X3djaGFyPXllczsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIElTTyBDOTkgc3VwcG9ydCBpbiA8d2NoYXIuaD5dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD5dLCAKCSAgICAgICAgIFt3Y3N0b2xkKEwiMTAuMCIsIE5VTEwpO10sLCBbYWNfYzk5X3djaGFyPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwgCgkgICAgICAgICBbd2NzdG9sbChMIjEwIiwgTlVMTCwgMTApO10sLCBbYWNfYzk5X3djaGFyPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwgCgkgICAgICAgICBbd2NzdG91bGwoTCIxMCIsIE5VTEwsIDEwKTtdLCwgW2FjX2M5OV93Y2hhcj1ub10pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X3djaGFyKQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIElTTyBDOTkgc3VwcG9ydF0pCiAgaWYgdGVzdCB4IiRhY19jOTlfbWF0aCIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3N0ZGlvIiA9IHgibm8iIHx8CiAgICAgdGVzdCB4IiRhY19jOTlfc3RkbGliIiA9IHgibm8iIHx8CiAgICAgdGVzdCB4IiRhY19jOTlfd2NoYXIiID0geCJubyI7IHRoZW4KICAgIGVuYWJsZV9jOTk9bm87IAogIGZpOyAKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfYzk5KQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKICBpZiB0ZXN0IHgiJGVuYWJsZV9jOTkiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDUFBfVVNFX0M5OSkKICBmaQoKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIHRoZSAnbG9uZyBsb25nJyB0eXBlIGV4dGVuc2lvbi4KZG5sIFRoZSByZXN1bHQgZGV0ZXJtaW5lcyBvbmx5IHdoZXRoZXIgJ2xvbmcgbG9uZycgSS9PIGlzIGVuYWJsZWQ7IHRoaW5ncwpkbmwgbGlrZSBudW1lcmljX2xpbWl0czw+IHNwZWNpYWxpemF0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZS4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9MT05HX0xPTkcKZG5sIC0tZW5hYmxlLWxvbmctbG9uZyBkZWZpbmVzIF9HTElCQ1BQX1VTRV9MT05HX0xPTkcKZG5sIC0tZGlzYWJsZS1sb25nLWxvbmcgbGVhdmVzIF9HTElCQ1BQX1VTRV9MT05HX0xPTkcgdW5kZWZpbmVkCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9MT05HX0xPTkdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0CmRubCAgICAgICBkZWZhdWx0cyB0byBgbm8nLgpkbmwgICsgIElmICdsb25nIGxvbmcnIHN0dWZmIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yZXMgREVGQVVMVCBhbmQgc2V0cyBgbm8nLgpkbmwKZG5sIEdMSUJDUFBfRU5BQkxFX0xPTkdfTE9ORwpBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9MT05HX0xPTkcsIFtkbmwKICBkZWZpbmUoW0dMSUJDUFBfRU5BQkxFX0xPTkdfTE9OR19ERUZBVUxUXSwgaWZlbHNlKCQxLCB5ZXMsIHllcywgbm8pKWRubAoKICBBQ19BUkdfRU5BQkxFKGxvbmctbG9uZywKICBjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCiAgPDwtLWVuYWJsZS1sb25nLWxvbmcgICAgICB0dXJucyBvbiAnbG9uZyBsb25nJyBbZGVmYXVsdD0+PkdMSUJDUFBfRU5BQkxFX0xPTkdfTE9OR19ERUZBVUxUXSwKICBjaGFuZ2VxdW90ZShbLCBdKWRubAogIFtjYXNlICIkZW5hYmxldmFsIiBpbgogICB5ZXMpIGVuYWJsZV9sb25nX2xvbmc9eWVzIDs7CiAgIG5vKSAgZW5hYmxlX2xvbmdfbG9uZz1ubyA7OwogICAqKSAgIEFDX01TR19FUlJPUihbVW5rbm93biBhcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSBsb25nIGxvbmddKSA7OwogICBlc2FjXSwKICBlbmFibGVfbG9uZ19sb25nPUdMSUJDUFBfRU5BQkxFX0xPTkdfTE9OR19ERUZBVUxUKWRubAoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIGxvbmcgbG9uZyBJL08gc3VwcG9ydF0pCiAgIyBpb3N0cmVhbXMgcmVxdWlyZSBzdHJ0b2xsLCBzdHJ0b3VsbCB0byBjb21waWxlCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLAogICAgICAgICAgICAgICAgIFtjaGFyKiB0bXA7IHN0cnRvbGwoImdudSIsICZ0bXAsIDEwKTtdLCxbZW5hYmxlX2xvbmdfbG9uZz1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLAogICAgICAgICAgICAgICAgIFtjaGFyKiB0bXA7IHN0cnRvdWxsKCJnbnUiLCAmdG1wLCAxMCk7XSwsW2VuYWJsZV9sb25nX2xvbmc9bm9dKQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKICBpZiB0ZXN0IHgiJGVuYWJsZV9sb25nX2xvbmciID0geHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1BQX1VTRV9MT05HX0xPTkcpCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbG9uZ19sb25nKQoKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGF0IGtpbmQgb2YgQyBoZWFkZXJzIHRvIHVzZS4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9DSEVBREVSUwpkbmwgLS1lbmFibGUtY2hlYWRlcnM9IFtkb2VzIHN0dWZmXS4KZG5sIC0tZGlzYWJsZS1jaGVhZGVycyBbZG9lcyBub3QgZG8gYW55dGhpbmcsIHJlYWxseV0uCmRubCAgKyAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgbmVlZCB0byBiZSAnY19zaGFkb3cnIGJ5IGRlZmF1bHQuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9DSEVBREVSU1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgYycgb3IgYGNfc3RkJyBvciAnY19zaGFkb3cnLiAgCmRubCAgICAgICBJZiBvbW1pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGNfc3RkJy4KQUNfREVGVU4oR0xJQkNQUF9FTkFCTEVfQ0hFQURFUlMsIFtkbmwKZGVmaW5lKFtHTElCQ1BQX0VOQUJMRV9DSEVBREVSU19ERUZBVUxUXSwgaWZlbHNlKCQxLCBjX3N0ZCwgY19zdGQsIGNfc3RkKSlkbmwKQUNfTVNHX0NIRUNLSU5HKFtmb3IgYyBoZWFkZXIgc3RyYXRlZ3kgdG8gdXNlXSkKQUNfQVJHX0VOQUJMRShjaGVhZGVycywKY2hhbmdlcXVvdGUoPDwsID4+KWRubAo8PCAgLS1lbmFibGUtY2hlYWRlcnMgICAgICAgY29uc3RydWN0ICJDIiBoZWFkZXIgZmlsZXMgZm9yIGcrKyBbZGVmYXVsdD0+PkdMSUJDUFBfRU5BQkxFX0NIRUFERVJTX0RFRkFVTFRdLApjaGFuZ2VxdW90ZShbLCBdKQogIFtjYXNlICIkZW5hYmxldmFsIiBpbgogICBjKSAKICAgICAgICBlbmFibGVfY2hlYWRlcnM9YyAKICAgICAgICA7OwogICBjX3N0ZCkgIAogICAgICAgIGVuYWJsZV9jaGVhZGVycz1jX3N0ZCAKICAgICAgICA7OwogICBjX3NoYWRvdykgIAogICAgICAgIGVuYWJsZV9jaGVhZGVycz1jX3NoYWRvdyAKICAgICAgICA7OwogICAqKSAgIEFDX01TR19FUlJPUihbVW5rbm93biBhcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSAiQyIgaGVhZGVyc10pIAogICAgICAgIDs7CiAgZXNhY10sCiAgZW5hYmxlX2NoZWFkZXJzPUdMSUJDUFBfRU5BQkxFX0NIRUFERVJTX0RFRkFVTFQpCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2NoZWFkZXJzKQoKICBkbmwgT3B0aW9uIHBhcnNlZCwgbm93IHNldCB0aGluZ3MgYXBwcm9wcmlhdGVseQogIGNhc2UgIiRlbmFibGVfY2hlYWRlcnMiIGluCiAgICBjX3NoYWRvdykgCiAgICAgICAgQ19JTkNMVURFX0RJUj0nJHtnbGliY3BwX3NyY2Rpcn0vaW5jbHVkZS9jX3NoYWRvdycKICAgICAgICA7OwogICAgY19zdGQpICAgCiAgICAgICAgQ19JTkNMVURFX0RJUj0nJHtnbGliY3BwX3NyY2Rpcn0vaW5jbHVkZS9jX3N0ZCcKICAgICAgICA7OwogICAgYykgICAKICAgICAgICBDX0lOQ0xVREVfRElSPScke2dsaWJjcHBfc3JjZGlyfS9pbmNsdWRlL2MnCiAgICAgICAgOzsKICBlc2FjCgogIEFDX1NVQlNUKENfSU5DTFVERV9ESVIpCiAgQU1fQ09ORElUSU9OQUwoR0xJQkNQUF9DX0hFQURFUlNfQywgdGVzdCAiJGVuYWJsZV9jaGVhZGVycyIgPSBjKQogIEFNX0NPTkRJVElPTkFMKEdMSUJDUFBfQ19IRUFERVJTX0NfU1RELCB0ZXN0ICIkZW5hYmxlX2NoZWFkZXJzIiA9IGNfc3RkKQogIEFNX0NPTkRJVElPTkFMKEdMSUJDUFBfQ19IRUFERVJTX0NPTVBBVElCSUxJVFksIHRlc3QgIiRjX2NvbXBhdGliaWxpdHkiID0geWVzKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdpZGUgY2hhcmFjdGVyIHN1cHBvcnQuICBIYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBvcHRpb24KZG5sIGluIGdjYydzIGNvbmZpZ3VyZSwgYnV0IGluIGEgZm9ybSB0aGF0IGF1dG9jb25mIGNhbiBtZXNzIHdpdGguCmRubApkbmwgR0xJQkNQUF9FTkFCTEVfQ19NQkNIQVIKZG5sIC0tZW5hYmxlLWMtbWJjaGFyIHJlcXVlc3RzIGFsbCB0aGUgd2NoYXJfdCBzdHVmZi4KZG5sIC0tZGlzYWJsZS1jLW1iY2hhciBkb2Vzbid0LgpkbmwgICsgIFVzYWdlOiAgR0xJQkNQUF9FTkFCTEVfQ19NQkNIQVJbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9tbWl0dGVkLCBpdApkbmwgICAgICAgZGVmYXVsdHMgdG8gYG5vJy4KQUNfREVGVU4oR0xJQkNQUF9FTkFCTEVfQ19NQkNIQVIsIFtkbmwKZGVmaW5lKFtHTElCQ1BQX0VOQUJMRV9DX01CQ0hBUl9ERUZBVUxUXSwgaWZlbHNlKCQxLCB5ZXMsIHllcywgbm8pKWRubApBQ19BUkdfRU5BQkxFKGMtbWJjaGFyLApjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCjw8ICAtLWVuYWJsZS1jLW1iY2hhciAgICAgICBlbmFibGUgbXVsdGlieXRlICh3aWRlKSBjaGFyYWN0ZXJzIFtkZWZhdWx0PT4+R0xJQkNQUF9FTkFCTEVfQ19NQkNIQVJfREVGQVVMVF0sCmNoYW5nZXF1b3RlKFssIF0pZG5sCltjYXNlICIkZW5hYmxldmFsIiBpbgogeWVzKSBlbmFibGVfY19tYmNoYXI9eWVzIDs7CiBubykgIGVuYWJsZV9jX21iY2hhcj1ubyA7OwogKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgYy1tYmNoYXJdKSA7OwogZXNhY10sCmVuYWJsZV9jX21iY2hhcj1HTElCQ1BQX0VOQUJMRV9DX01CQ0hBUl9ERUZBVUxUKWRubApkbmwgT3B0aW9uIHBhcnNlZCwgbm93IG90aGVyIHNjcmlwdHMgY2FuIHRlc3QgZW5hYmxlX2NfbWJjaGFyIGZvciB5ZXMvbm8uCl0pCgoKZG5sCmRubCBTZXQgdXAgKl9JTkNMVURFUyBhbmQgKl9JTkNMVURFX0RJUiB2YXJpYWJsZXMgZm9yIGFsbCBzdW5kcnkgTWFrZWZpbGUuYW0ncy4KZG5sCmRubCBUT1BMRVZFTF9JTkNMVURFUwpkbmwgTElCTUFUSF9JTkNMVURFUwpkbmwgTElCU1VQQ1hYX0lOQ0xVREVTCmRubCBMSUJJT19JTkNMVURFUwpkbmwgQ1NIQURPV19JTkNMVURFUwpkbmwKZG5sIEdMSUJDUFBfRVhQT1JUX0lOQ0xVREVTCkFDX0RFRlVOKEdMSUJDUFBfRVhQT1JUX0lOQ0xVREVTLCBbCiAgIyBSb290IGxldmVsIG9mIHRoZSBidWlsZCBkaXJlY3RvcnkgaW5jbHVkZSBzb3VyY2VzLgogIEdMSUJDUFBfSU5DTFVERVM9Ii1JJHtnbGliY3BwX2J1aWxkZGlyfS9pbmNsdWRlLyR7dGFyZ2V0X2FsaWFzfSAtSSR7Z2xpYmNwcF9idWlsZGRpcn0vaW5jbHVkZSIKCiAgIyBQYXNzZWQgZG93biBmb3IgY2FuYWRpYW4gY3Jvc3Nlcy4KICBpZiB0ZXN0IHgiJENBTkFESUFOIiA9IHh5ZXM7IHRoZW4KICAgIFRPUExFVkVMX0lOQ0xVREVTPSctSSQoaW5jbHVkZWRpciknCiAgZmkKCiAgTElCTUFUSF9JTkNMVURFUz0nLUkkKHRvcF9zcmNkaXIpL2xpYm1hdGgnCgogIExJQlNVUENYWF9JTkNMVURFUz0nLUkkKHRvcF9zcmNkaXIpL2xpYnN1cGMrKycKCiAgaWYgdGVzdCB4IiRuZWVkX2xpYmlvIiA9IHh5ZXM7IHRoZW4KICAgIExJQklPX0lOQ0xVREVTPSctSSQodG9wX2J1aWxkZGlyKS9saWJpbyAtSSQodG9wX3NyY2RpcikvbGliaW8nCiAgICBBQ19TVUJTVChMSUJJT19JTkNMVURFUykKICBmaQoKICAjIE5vdywgZXhwb3J0IHRoaXMgdG8gYWxsIHRoZSBsaXR0bGUgTWFrZWZpbGVzLi4uLgogIEFDX1NVQlNUKEdMSUJDUFBfSU5DTFVERVMpCiAgQUNfU1VCU1QoVE9QTEVWRUxfSU5DTFVERVMpCiAgQUNfU1VCU1QoTElCTUFUSF9JTkNMVURFUykKICBBQ19TVUJTVChMSUJTVVBDWFhfSU5DTFVERVMpCl0pCgoKZG5sCmRubCBTZXQgdXAgKl9GTEFHUyBhbmQgKkZMQUdTIHZhcmlhYmxlcyBmb3IgYWxsIHN1bmRyeSBNYWtlZmlsZS5hbSdzLgpkbmwKQUNfREVGVU4oR0xJQkNQUF9FWFBPUlRfRkxBR1MsIFsKICAjIE9wdGltaXphdGlvbiBmbGFncyB0aGF0IGFyZSBwcm9iYWJseSBhIGdvb2QgaWRlYSBmb3IgdGhyaWxsLXNlZWtlcnMuIEp1c3QKICAjIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cgYW5kIG1ha2UsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZWFkeSB0byBnby4uLiAKICAjIE9QVElNSVpFX0NYWEZMQUdTID0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mdnRhYmxlLWdjIAogIE9QVElNSVpFX0NYWEZMQUdTPQogIEFDX1NVQlNUKE9QVElNSVpFX0NYWEZMQUdTKQoKICBXQVJOX0ZMQUdTPSctV2FsbCAtV25vLWZvcm1hdCAtVyAtV3dyaXRlLXN0cmluZ3MgLVdpbmxpbmUnCiAgQUNfU1VCU1QoV0FSTl9GTEFHUykKXSkKCmRubApkbmwgIEdMSUJDUFBfRVhQT1JUX0lOU1RBTExfSU5GTwpkbmwgIGNhbGN1bGF0ZXMgZ3h4X2luc3RhbGxfZGlyCmRubCAgZXhwb3J0cyBnbGliY3BwX3Rvb2xleGVjZGlyCmRubCAgZXhwb3J0cyBnbGliY3BwX3Rvb2xleGVjbGliZGlyCmRubCAgZXhwb3J0cyBnbGliY3BwX3ByZWZpeGRpcgpkbmwKZG5sIEFzc3VtZXMgY3Jvc3NfY29tcGlsaW5nIGJpdHMgYWxyZWFkeSBkb25lLCBhbmQgd2l0aF9jcm9zc19ob3N0IGluCmRubCBwYXJ0aWN1bGFyCmRubApkbmwgR0xJQkNQUF9FWFBPUlRfSU5TVEFMTF9JTkZPCkFDX0RFRlVOKEdMSUJDUFBfRVhQT1JUX0lOU1RBTExfSU5GTywgWwojIEFzc3VtZXMgZ2xpYmNwcF9idWlsZGRpciwgZ2xpYmNwcF9zcmNkaXIgYXJlIGFscmVheSBzZXQgdXAgYW5kCiMgZXhwb3J0ZWQgY29ycmVjdGx5IGluIEdMSUJDUFBfQ09ORklHVVJFLgpnbGliY3BwX3Rvb2xleGVjZGlyPW5vCmdsaWJjcHBfdG9vbGV4ZWNsaWJkaXI9bm8KZ2xpYmNwcF9wcmVmaXhkaXI9JHtwcmVmaXh9CgojIFByb2Nlc3MgdGhlIG9wdGlvbiAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyPTxwYXRoIHRvIGluY2x1ZGUtZmlsZXMgZGlyZWN0b3J5PgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyXSkKQUNfQVJHX1dJVEgoZ3h4LWluY2x1ZGUtZGlyLApbICAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyICB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgaW5jbHVkZSBmaWxlc10sCltjYXNlICIke3dpdGh2YWx9IiBpbgogIHllcykKICAgIEFDX01TR19FUlJPUihNaXNzaW5nIGRpcmVjdG9yeSBmb3IgLS13aXRoLWd4eC1pbmNsdWRlLWRpcikKICAgIGd4eF9pbmNsdWRlX2Rpcj1ubwogICAgOzsKICBubykKICAgIGd4eF9pbmNsdWRlX2Rpcj1ubwogICAgOzsKICAqKQogICAgZ3h4X2luY2x1ZGVfZGlyPSR7d2l0aHZhbH0KICAgIDs7CmVzYWNdLCBbZ3h4X2luY2x1ZGVfZGlyPW5vXSkKQUNfTVNHX1JFU1VMVCgkZ3h4X2luY2x1ZGVfZGlyKQoKIyBQcm9jZXNzIHRoZSBvcHRpb24gIi0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlic10pCkFDX0FSR19FTkFCTEUodmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnMsClsgIC0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzICAgIFNwZWNpZnkgdGhhdCBydW50aW1lIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIGEgY29tcGlsZXItc3BlY2lmaWMgZGlyZWN0b3J5IF0sCltjYXNlICIkZW5hYmxldmFsIiBpbgogeWVzKSB2ZXJzaW9uX3NwZWNpZmljX2xpYnM9eWVzIDs7CiBubykgIHZlcnNpb25fc3BlY2lmaWNfbGlicz1ubyA7OwogKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgdmVyc2lvbi1zcGVjaWZpYyBsaWJzXSk7OwogZXNhY10sCnZlcnNpb25fc3BlY2lmaWNfbGlicz1ubylkbmwKIyBPcHRpb24gc2V0LCBub3cgd2UgY2FuIHRlc3QgaXQuCkFDX01TR19SRVNVTFQoJHZlcnNpb25fc3BlY2lmaWNfbGlicykKCiMgRGVmYXVsdCBjYXNlIGZvciBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgaW5jbHVkZSBmaWxlcy4KaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0gbm8gJiYgdGVzdCAkZ3h4X2luY2x1ZGVfZGlyID0gbm87IHRoZW4KICBneHhfaW5jbHVkZV9kaXI9JyQocHJlZml4KScvaW5jbHVkZS9jKysvJHtnY2NfdmVyc2lvbn0KZmkKCiMgVmVyc2lvbi1zcGVjaWZpYyBydW50aW1lIGxpYnMgcHJvY2Vzc2luZy4KaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0geWVzOyB0aGVuCiAgIyBOZWVkIHRoZSBnY2MgY29tcGlsZXIgdmVyc2lvbiB0byBrbm93IHdoZXJlIHRvIGluc3RhbGwgbGlicmFyaWVzCiAgIyBhbmQgaGVhZGVyIGZpbGVzIGlmIC0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIG9wdGlvbgogICMgaXMgc2VsZWN0ZWQuCiAgaWYgdGVzdCB4IiRneHhfaW5jbHVkZV9kaXIiID0geCJubyI7IHRoZW4KICAgIGd4eF9pbmNsdWRlX2Rpcj0nJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpLycke2djY192ZXJzaW9ufS9pbmNsdWRlL2MrKwogIGZpCiAgZ2xpYmNwcF90b29sZXhlY2Rpcj0nJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpJwogIGdsaWJjcHBfdG9vbGV4ZWNsaWJkaXI9JyQodG9vbGV4ZWNkaXIpLycke2djY192ZXJzaW9ufSckKE1VTFRJU1VCRElSKScKZmkKCiMgQ2FsY3VsYXRlIGdsaWJjcHBfdG9vbGV4ZWNkaXIsIGdsaWJjcHBfdG9vbGV4ZWNsaWJkaXIKIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gdG9vbGRpciwgbm90IGxpYmRpci4KaWYgdGVzdCB4IiRnbGliY3BwX3Rvb2xleGVjZGlyIiA9IHgibm8iOyB0aGVuIAogIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCiAgICAgdGVzdCB4IiR3aXRoX2Nyb3NzX2hvc3QiICE9IHgibm8iOyB0aGVuCiAgICBnbGliY3BwX3Rvb2xleGVjZGlyPSckKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcyknCiAgICBnbGliY3BwX3Rvb2xleGVjbGliZGlyPSckKHRvb2xleGVjZGlyKS9saWInCiAgZWxzZQogICAgZ2xpYmNwcF90b29sZXhlY2Rpcj0nJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpJwogICAgZ2xpYmNwcF90b29sZXhlY2xpYmRpcj0nJChsaWJkaXIpJwogIGZpCiAgZ2xpYmNwcF90b29sZXhlY2xpYmRpcj0kZ2xpYmNwcF90b29sZXhlY2xpYmRpci9gJENDIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnlgCmZpCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbnN0YWxsIGxvY2F0aW9uXSkKQUNfTVNHX1JFU1VMVCgkZ3h4X2luY2x1ZGVfZGlyKQoKQUNfU1VCU1QoZ2xpYmNwcF9wcmVmaXhkaXIpCkFDX1NVQlNUKGd4eF9pbmNsdWRlX2RpcikKQUNfU1VCU1QoZ2xpYmNwcF90b29sZXhlY2RpcikKQUNfU1VCU1QoZ2xpYmNwcF90b29sZXhlY2xpYmRpcikKXSkKCgojIENoZWNrIGZvciBmdW5jdGlvbnMgaW4gbWF0aCBsaWJyYXJ5LgojIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk4LgojCiMgVGhpcyBmaWxlIGNhbiBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCiMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCiMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgoKIyBzZXJpYWwgMQoKZG5sIEFDX1JFUExBQ0VfTUFUSEZVTkNTKEZVTkNUSU9OLi4uKQpBQ19ERUZVTihBQ19SRVBMQUNFX01BVEhGVU5DUywKW0FDX0NIRUNLX0ZVTkNTKFskMV0sICwgW0xJQk1BVEhPQkpTPSIkTElCTUFUSE9CSlMgJHthY19mdW5jfS5sbyJdKV0pCgoKZG5sIFRoaXMgbWFjcm8gc2VhcmNoZXMgZm9yIGEgR05VIHZlcnNpb24gb2YgbWFrZS4gIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZQpkbmwgbWFrZWZpbGUgdmFyaWFibGUgYGlmR05VbWFrZScgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcsIG90aGVyd2lzZSBpdCBpcwpkbmwgc2V0IHRvICIjIi4gVGhpcyBpcyB1c2VmdWwgZm9yICBpbmNsdWRpbmcgYSBzcGVjaWFsIGZlYXR1cmVzIGluIGEgTWFrZWZpbGUsCmRubCB3aGljaCBjYW5ub3QgYmUgaGFuZGxlZCBieSBvdGhlciB2ZXJzaW9ucyBvZiBtYWtlLiAgVGhlIHZhcmlhYmxlCmRubCBfY3ZfZ251X21ha2VfY29tbWFuZCBpcyBzZXQgdG8gdGhlIGNvbW1hbmQgdG8gaW52b2tlIEdOVSBtYWtlIGlmIGl0IGV4aXN0cywKZG5sIHRoZSBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlLgpkbmwKZG5sIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpdHMgdXNlOgpkbmwKZG5sIE1ha2VmaWxlLmluIG1pZ2h0IGNvbnRhaW46CmRubApkbmwgICAgICMgQSBmYWlsc2FmZSB3YXkgb2YgcHV0dGluZyBhIGRlcGVuZGVuY3kgcnVsZSBpbnRvIGEgbWFrZWZpbGUKZG5sICAgICAkKERFUEVORCk6CmRubCAgICAgICAgICAgICAkKENDKSAtTU0gJChzcmNkaXIpLyouYyA+ICQoREVQRU5EKQpkbmwKZG5sICAgICBAaWZHTlVtYWtlQCBpZmVxICgkKERFUEVORCksJCh3aWxkY2FyZCAkKERFUEVORCkpKQpkbmwgICAgIEBpZkdOVW1ha2VAIGluY2x1ZGUgJChERVBFTkQpCmRubCAgICAgQGlmR05VbWFrZUAgZW5kaWYKZG5sCmRubCBUaGVuIGNvbmZpZ3VyZS5pbiB3b3VsZCBub3JtYWxseSBjb250YWluOgpkbmwKZG5sICAgICBDSEVDS19HTlVfTUFLRSgpCmRubCAgICAgQUNfT1VUUFVUKE1ha2VmaWxlKQpkbmwKZG5sIFRoZW4gcGVyaGFwcyB0byBjYXVzZSBnbnUgbWFrZSB0byBvdmVycmlkZSBhbnkgb3RoZXIgbWFrZSwgd2UgY291bGQgZG8KZG5sIHNvbWV0aGluZyBsaWtlIHRoaXMgKG5vdGUgdGhhdCBHTlUgbWFrZSBhbHdheXMgbG9va3MgZm9yIEdOVW1ha2VmaWxlIGZpcnN0KToKZG5sCmRubCAgICAgaWYgICEgdGVzdCB4JF9jdl9nbnVfbWFrZV9jb21tYW5kID0geCA7IHRoZW4KZG5sICAgICAgICAgICAgIG12IE1ha2VmaWxlIEdOVW1ha2VmaWxlCmRubCAgICAgICAgICAgICBlY2hvIC5ERUZBVUxUOiA+IE1ha2VmaWxlIDsKZG5sICAgICAgICAgICAgIGVjaG8gXCAgJF9jdl9nbnVfbWFrZV9jb21tYW5kIFwkQCA+PiBNYWtlZmlsZTsKZG5sICAgICBmaQpkbmwKZG5sIFRoZW4sIGlmIGFueSAod2VsbCBhbG1vc3QgYW55KSBvdGhlciBtYWtlIGlzIGNhbGxlZCwgYW5kIEdOVSBtYWtlIGFsc28KZG5sIGV4aXN0cywgdGhlbiB0aGUgb3RoZXIgbWFrZSB3cmFwcyB0aGUgR05VIG1ha2UuCmRubApkbmwgQGF1dGhvciBKb2huIERhcnJpbmd0b24gPGouZGFycmluZ3RvbkBlbHZpcy5tdXJkb2NoLmVkdS5hdT4KZG5sIEB2ZXJzaW9uIDEuMSAjIyMjIHJlcGxhY2VkIElkIHN0cmluZyBub3cgdGhhdCBJZCBpcyBmb3IgbGliLXYzOyBwbWUKZG5sCmRubCAjIyMjIENoYW5nZXMgZm9yIGxpYnN0ZGMrKy12MzogIHJlZm9ybWF0dGluZyBhbmQgbGluZXdyYXBwaW5nOyBwcmVwZW5kaW5nCmRubCAjIyMjIEdMSUJDUFBfIHRvIHRoZSBtYWNybyBuYW1lOyBhZGRpbmcgdGhlIDotbWFrZSBmYWxsYmFjayBpbiB0aGUKZG5sICMjIyMgY29uZGl0aW9uYWwncyBzdWJzaGVsbCAoIiAtLXZlcnNpb24iIGlzIG5vdCBhIGNvbW1hbmQpLCB1c2luZyBhCmRubCAjIyMjIGRpZmZlcmVudCBvcHRpb24gdG8gZ3JlcCgxKS4KZG5sICMjIyMgLXBtZQpkbmwgIyMjIyBGaXhlZCBCb3VybmUgc2hlbGwgcG9ydGFiaWxpdHkgYnVnICh1c2UgJHtNQUtFLW1ha2V9LCBub3QKZG5sICMjIyMgJHtNQUtFOi1tYWtlfSkuCmRubCAjIyMjIC1tc29rb2xvdgpBQ19ERUZVTigKICBHTElCQ1BQX0NIRUNLX0dOVV9NQUtFLCBbQUNfQ0FDSEVfQ0hFQ0soIGZvciBHTlUgbWFrZSxfY3ZfZ251X21ha2VfY29tbWFuZCwKICAgICAgICAgIF9jdl9nbnVfbWFrZV9jb21tYW5kPScnIDsKZG5sIFNlYXJjaCBhbGwgdGhlIGNvbW1vbiBuYW1lcyBmb3IgR05VIG1ha2UKICAgICAgICAgIGZvciBhIGluICIke01BS0UtbWFrZX0iIG1ha2UgZ21ha2UgZ251bWFrZSA7IGRvCiAgICAgICAgICAgICAgICAgIGlmICggJGEgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCB8IGdyZXAgLWMgR05VID4gL2Rldi9udWxsICkKICAgICAgICAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jdl9nbnVfbWFrZV9jb21tYW5kPSRhIDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgIGRvbmUgOwogICkgOwpkbmwgSWYgdGhlcmUgd2FzIGEgR05VIHZlcnNpb24sIHRoZW4gc2V0IEBpZkdOVW1ha2VAIHRvIHRoZSBlbXB0eQpkbmwgc3RyaW5nLCAnIycgb3RoZXJ3aXNlCiAgaWYgdGVzdCAgIngkX2N2X2dudV9tYWtlX2NvbW1hbmQiICE9ICJ4IiAgOyB0aGVuCiAgICAgICAgICBpZkdOVW1ha2U9JycgOwogIGVsc2UKICAgICAgICAgIGlmR05VbWFrZT0nIycgOwogIGZpCiAgQUNfU1VCU1QoaWZHTlVtYWtlKQpdKQoKCmRubCBDaGVjayBmb3IgaGVhZGVycyBmb3IsIGFuZCBhcmd1bWVudHMgdG8sIHRoZSBzZXRybGltaXQoKSBmdW5jdGlvbi4KZG5sIFVzZWQgb25seSBpbiB0ZXN0c3VpdGVfaG9va3MuaC4KQUNfREVGVU4oR0xJQkNQUF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeSwgWwogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KICAgICAgICAgICAgICAgICBdLCBbIGludCBmID0gUkxJTUlUXyQxIDsgXSwKICAgICAgICAgICAgICAgICBbZ2xpYmNwcF9tcmVzdWx0PTFdLCBbZ2xpYmNwcF9tcmVzdWx0PTBdKQogIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX01FTUxJTUlUXyQxLCAkZ2xpYmNwcF9tcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICBbT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC5dKQpdKQpBQ19ERUZVTihHTElCQ1BQX0NIRUNLX1NFVFJMSU1JVCwgWwogIHNldHJsaW1pdF9oYXZlX2hlYWRlcnM9eWVzCiAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcmVzb3VyY2UuaCB1bmlzdGQuaCwKICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgc2V0cmxpbWl0X2hhdmVfaGVhZGVycz1ubykKICAjIElmIGRvbid0IGhhdmUgdGhlIGhlYWRlcnMsIHRoZW4gd2UgY2FuJ3QgcnVuIHRoZSB0ZXN0cyBub3csIGFuZCB3ZQogICMgd29uJ3QgYmUgc2VlaW5nIGFueSBvZiB0aGVzZSBkdXJpbmcgdGVzdHN1aXRlIGNvbXBpbGF0aW9uLgogIGlmIHRlc3QgJHNldHJsaW1pdF9oYXZlX2hlYWRlcnMgPSB5ZXM7IHRoZW4KICAgICMgQ2FuJ3QgZG8gdGhlc2UgaW4gYSBsb29wLCBlbHNlIHRoZSByZXN1bHRpbmcgc3ludGF4IGlzIHdyb25nLgogICAgR0xJQkNQUF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeShEQVRBKQogICAgR0xJQkNQUF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeShSU1MpCiAgICBHTElCQ1BQX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KFZNRU0pCiAgICBHTElCQ1BQX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KEFTKQoKICAgICMgQ2hlY2sgZm9yIHJsaW1pdCwgc2V0cmxpbWl0LgogICAgQUNfQ0FDSEVfVkFMKGFjX3NldHJsaW1pdCwgWwogICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgoJCSAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KCQkgICAgIF0sIAogICAgICAgICAgICAgICAgICAgICBbIHN0cnVjdCBybGltaXQgcjsgc2V0cmxpbWl0KDAsICZyKTtdLCAKICAgICAgICAgICAgICAgICAgICAgW2FjX3NldHJsaW1pdD15ZXNdLCBbYWNfc2V0cmxpbWl0PW5vXSkKICAgIF0pCiAgZmkKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGVzdHN1aXRlIG1lbW9yeSBsaW1pdCBzdXBwb3J0XSkKICBpZiB0ZXN0ICRzZXRybGltaXRfaGF2ZV9oZWFkZXJzID0geWVzICYmIHRlc3QgJGFjX3NldHJsaW1pdCA9IHllczsgdGhlbgogICAgYWNfbWVtX2xpbWl0cz15ZXMKICAgIEFDX0RFRklORShfR0xJQkNQUF9NRU1fTElNSVRTKQogIGVsc2UKICAgIGFjX21lbV9saW1pdHM9bm8KICBmaQogIEFDX01TR19SRVNVTFQoJGFjX21lbV9saW1pdHMpCl0pCgoKZG5sCmRubCBEb2VzIGFueSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBvZiB0aGUgdGVzdHN1aXRlIGRpcmVjdG9yeS4gIEdlbmVyYXRlcwpkbmwgdGhlIHRlc3RzdWl0ZV9ob29rcy5oIGhlYWRlci4KZG5sCmRubCBHTElCQ1BQX0NPTkZJR1VSRV9URVNUU1VJVEUgIFtubyBhcmdzXQpBQ19ERUZVTihHTElCQ1BQX0NPTkZJR1VSRV9URVNUU1VJVEUsIFsKICBHTElCQ1BQX0NIRUNLX1NFVFJMSU1JVAoKICAjIExvb2sgZm9yIHNldGVudiwgc28gdGhhdCBleHRlbmRlZCBsb2NhbGUgdGVzdHMgY2FuIGJlIHBlcmZvcm1lZC4KICBHTElCQ1BQX0NIRUNLX1NURExJQl9ERUNMX0FORF9MSU5LQUdFXzMoc2V0ZW52KQoKICAjIEV4cG9ydCBmaWxlIG5hbWVzIGZvciBBQkkgY2hlY2tpbmcuCiAgYmFzZWxpbmVfZmlsZT0iJHtnbGliY3BwX3NyY2Rpcn0vY29uZmlnL2FiaS8ke2FiaV9iYXNlbGluZV90cmlwbGV0fS9iYXNlbGluZV9zeW1ib2xzLnR4dCIKICBBQ19TVUJTVChiYXNlbGluZV9maWxlKQoKICAjIERvbid0IGRvIEFCSSBjaGVja2luZyB1bmxlc3MgbmF0aXZlLgogIEFNX0NPTkRJVElPTkFMKEdMSUJDUFBfQlVJTERfQUJJX0NIRUNLLAogICAgICAgICAgICAgICAgIHRlc3QgeCIkYnVpbGQiID0geCIkaG9zdCIgJiYgdGVzdCAteiAiJHdpdGhfY3Jvc3NfaG9zdCIpCl0pCgoKc2luY2x1ZGUoLi4vbGlidG9vbC5tNCkKZG5sIFRoZSBsaW5lcyBiZWxvdyBhcnJhbmdlIGZvciBhY2xvY2FsIG5vdCB0byBicmluZyBhbiBpbnN0YWxsZWQKZG5sIGxpYnRvb2wubTQgaW50byBhY2xvY2FsLm00LCB3aGlsZSBzdGlsbCBhcnJhbmdpbmcgZm9yIGF1dG9tYWtlIHRvCmRubCBhZGQgYSBkZWZpbml0aW9uIG9mIExJQlRPT0wgdG8gTWFrZWZpbGUuaW4uCmlmZWxzZSgsLCxbQUNfU1VCU1QoTElCVE9PTCkKQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0pCkFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0pCkFDX0RFRlVOKFtBQ19QUk9HX0xEXSkKXSkKCgojIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCiMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCiMKIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCiMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCiMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgoKIyBzZXJpYWwgMQoKQUNfREVGVU4oQUNfTENfTUVTU0FHRVMsIFsKICBBQ19DSEVDS19IRUFERVIobG9jYWxlLmgsIFsKICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhY19jdl92YWxfTENfTUVTU0FHRVMsCiAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAogICAgICAgYWNfY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYWNfY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCiAgICBpZiB0ZXN0ICRhY19jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMpCiAgICBmaQogIF0pCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hldGhlciB0aGUgQm9vc3QtZGVyaXZlZCBjaGVja3Mgc2hvdWxkIGJlIHR1cm5lZCBvbi4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9DT05DRVBUX0NIRUNLUwpkbmwgLS1lbmFibGUtY29uY2VwdC1jaGVja3MgdHVybnMgdGhlbSBvbi4KZG5sIC0tZGlzYWJsZS1jb25jZXB0LWNoZWNrcyBsZWF2ZXMgdGhlbSBvZmYuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9DT05DRVBUX0NIRUNLU1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21taXR0ZWQsIGl0CmRubCAgICAgICBkZWZhdWx0cyB0byBgbm8nLgpBQ19ERUZVTihHTElCQ1BQX0VOQUJMRV9DT05DRVBUX0NIRUNLUywgW2RubApkZWZpbmUoW0dMSUJDUFBfRU5BQkxFX0NPTkNFUFRfQ0hFQ0tTX0RFRkFVTFRdLCBpZmVsc2UoJDEsIHllcywgeWVzLCBubykpZG5sCkFDX0FSR19FTkFCTEUoY29uY2VwdC1jaGVja3MsCmNoYW5nZXF1b3RlKDw8LCA+PilkbmwKPDwgIC0tZW5hYmxlLWNvbmNlcHQtY2hlY2tzIHVzZSBCb29zdC1kZXJpdmVkIHRlbXBsYXRlIGNoZWNrcyBbZGVmYXVsdD0+PkdMSUJDUFBfRU5BQkxFX0NPTkNFUFRfQ0hFQ0tTX0RFRkFVTFRdLApjaGFuZ2VxdW90ZShbLCBdKWRubApbY2FzZSAiJGVuYWJsZXZhbCIgaW4KIHllcykgZW5hYmxlX2NvbmNlcHRfY2hlY2tzPXllcyA7Owogbm8pICBlbmFibGVfY29uY2VwdF9jaGVja3M9bm8gOzsKICopICAgQUNfTVNHX0VSUk9SKFtVbmtub3duIGFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlIGNvbmNlcHQgY2hlY2tzXSkgOzsKIGVzYWNdLAplbmFibGVfY29uY2VwdF9jaGVja3M9R0xJQkNQUF9FTkFCTEVfQ09OQ0VQVF9DSEVDS1NfREVGQVVMVClkbmwKZG5sIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKaWYgdGVzdCB4IiRlbmFibGVfY29uY2VwdF9jaGVja3MiID0geHllczsgdGhlbgogIEFDX0RFRklORShfR0xJQkNQUF9DT05DRVBUX0NIRUNLUykKZmkKXSkKCgpkbmwKZG5sIEFkZCB2ZXJzaW9uIHRhZ3MgdG8gc3ltYm9scyBpbiBzaGFyZWQgbGlicmFyeSAob3Igbm90KSwgYWRkaXRpb25hbGx5CmRubCBtYXJraW5nIG90aGVyIHN5bWJvbHMgYXMgcHJpdmF0ZS9sb2NhbCAob3Igbm90KS4KZG5sCmRubCBHTElCQ1BQX0VOQUJMRV9TWU1WRVJTCmRubCAtLWVuYWJsZS1zeW12ZXJzPXN0eWxlIGFkZHMgYSB2ZXJzaW9uIHNjcmlwdCB0byB0aGUgbGlua2VyIGNhbGwgd2hlbgpkbmwgICAgICAgY3JlYXRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIGNob2ljZSBvZiB2ZXJzaW9uIHNjcmlwdCBpcwpkbmwgICAgICAgY29udHJvbGxlZCBieSAnc3R5bGUnLgpkbmwgLS1kaXNhYmxlLXN5bXZlcnMgZG9lcyBub3QuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1BQX0VOQUJMRV9TWU1WRVJTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbW1pdHRlZCwgaXQKZG5sICAgICAgIGRlZmF1bHRzIHRvIGBubycuICBQYXNzaW5nIGB5ZXMnIHRyaWVzIHRvIGNob29zZSBhIGRlZmF1bHQgc3R5bGUKZG5sICAgICAgIGJhc2VkIG9uIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuICBQYXNzaW5nICdubycgZGlzYWJsZXMgdmVyc2lvbmluZy4KQUNfREVGVU4oR0xJQkNQUF9FTkFCTEVfU1lNVkVSUywgW2RubApkZWZpbmUoW0dMSUJDUFBfRU5BQkxFX1NZTVZFUlNfREVGQVVMVF0sIGlmZWxzZSgkMSwgeWVzLCB5ZXMsIG5vKSlkbmwKQUNfQVJHX0VOQUJMRShzeW12ZXJzLApjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCjw8ICAtLWVuYWJsZS1zeW12ZXJzPXN0eWxlICBlbmFibGVzIHN5bWJvbCB2ZXJzaW9uaW5nIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBbZGVmYXVsdD0+PkdMSUJDUFBfRU5BQkxFX1NZTVZFUlNfREVGQVVMVF0sCmNoYW5nZXF1b3RlKFssIF0pZG5sCltjYXNlICIkZW5hYmxldmFsIiBpbgogeWVzKSBlbmFibGVfc3ltdmVycz15ZXMgOzsKIG5vKSAgZW5hYmxlX3N5bXZlcnM9bm8gOzsKICMgb3RoZXIgbmFtZXMgaGVyZSwganVzdCBhcyBzYW5pdHkgY2hlY2tzCiAjZ251fHN1bnxldGNldGVyYSkgZW5hYmxlX3N5bXZlcnM9JGVuYWJsZXZhbCA7OwogZ251KSBlbmFibGVfc3ltdmVycz0kZW5hYmxldmFsIDs7CiAqKSAgIEFDX01TR19FUlJPUihbVW5rbm93biBhcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSBzeW12ZXJzXSkgOzsKIGVzYWNdLAplbmFibGVfc3ltdmVycz1HTElCQ1BQX0VOQUJMRV9TWU1WRVJTX0RFRkFVTFQpZG5sCgojIElmIHdlIG5ldmVyIHdlbnQgdGhyb3VnaCB0aGUgR0xJQkNQUF9DSEVDS19MSU5LRVJfRkVBVFVSRVMgbWFjcm8sIHRoZW4gd2UKIyBkb24ndCBrbm93IGVub3VnaCBhYm91dCAkTEQgdG8gZG8gdHJpY2tzLi4uIAppZiB0ZXN0IHgkZW5hYmxlX3NoYXJlZCA9IHhubyB8fCAKCXRlc3QgIngkTEQiID0geCB8fCAKCXRlc3QgeCRnbGliY3BwX2dudV9sZF92ZXJzaW9uID0geDsgdGhlbgogIGVuYWJsZV9zeW12ZXJzPW5vCmZpCgojIENoZWNrIHRvIHNlZSBpZiBsaWJnY2NfcyBleGlzdHMsIGluZGljYXRpbmcgdGhhdCBzaGFyZWQgbGliZ2NjIGlzIHBvc3NpYmxlLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaGFyZWQgbGliZ2NjXSkKYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCkNGTEFHUz0nIC1sZ2NjX3MnCkFDX1RSWV9MSU5LKCAsIFtyZXR1cm4gMF0sIGdsaWJjcHBfc2hhcmVkX2xpYmdjYz15ZXMsIGdsaWJjcHBfc2hhcmVkX2xpYmdjYz1ubykKQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCkFDX01TR19SRVNVTFQoJGdsaWJjcHBfc2hhcmVkX2xpYmdjYykKCiMgRm9yIEdOVSBsZCwgd2UgbmVlZCBhdCBsZWFzdCB0aGlzIHZlcnNpb24uICBJdCdzIDIuMTIgaW4gdGhlIHNhbWUgZm9ybWF0CiMgYXMgdGhlIHRlc3RlZC1mb3IgdmVyc2lvbi4gIFNlZSBHTElCQ1BQX0NIRUNLX0xJTktFUl9GRUFUVVJFUyBmb3IgbW9yZS4KZ2xpYmNwcF9taW5fZ251X2xkX3ZlcnNpb249MjEyMDAKCiMgQ2hlY2sgdG8gc2VlIGlmIHVuc3BlY2lmaWVkICJ5ZXMiIHZhbHVlIGNhbiB3aW4sIGdpdmVuIHJlc3VsdHMKIyBhYm92ZS4gIAppZiB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IHllcyA7IHRoZW4KICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IHllcyAmJgogICAgdGVzdCAkZ2xpYmNwcF9zaGFyZWRfbGliZ2NjID0geWVzIDsKICB0aGVuCiAgICBpZiB0ZXN0ICRnbGliY3BwX2dudV9sZF92ZXJzaW9uIC1nZSAkZ2xpYmNwcF9taW5fZ251X2xkX3ZlcnNpb24gOyB0aGVuCiAgICAgICAgZW5hYmxlX3N5bXZlcnM9Z251CiAgICBlbHNlCiAgICAgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgogICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKICAgICAgQ0ZMQUdTPSctc2hhcmVkIC1XbCwtLXZlcnNpb24tc2NyaXB0LGNvbmZ0ZXN0Lm1hcCcKICAgICAgZW5hYmxlX3N5bXZlcnM9bm8KICAgICAgY2hhbmdlcXVvdGUoLCkKICAgICAgZWNobyAnRk9PIHsgZ2xvYmFsOiBmW2Etel1vOyBsb2NhbDogKjsgfTsnID4gY29uZnRlc3QubWFwCiAgICAgIGNoYW5nZXF1b3RlKFssXSkKICAgICAgQUNfVFJZX0xJTksoW2ludCBmb287XSwsIGVuYWJsZV9zeW12ZXJzPWdudSkKICAgICAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgoJQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgICAgIGVsc2UKCSMgdGhpcyBpcyB0aGUgc3VzcGljaW91cyBwYXJ0CglDRkxBR1M9JycKICAgICAgZmkKICAgICAgcm0gLWYgY29uZnRlc3QubWFwCiAgICBmaQogIGVsc2UKICAgICMganVzdCBmYWlsIGZvciBub3cKICAgIGVuYWJsZV9zeW12ZXJzPW5vCiAgZmkKZmkKCmRubCBFdmVyeXRoaW5nIHBhcnNlZDsgZmlndXJlIG91dCB3aGF0IGZpbGUgdG8gdXNlLgpjYXNlICRlbmFibGVfc3ltdmVycyBpbgogIG5vKQogICAgICBMSU5LRVJfTUFQPWNvbmZpZy9saW5rZXItbWFwLmR1bW15CiAgICAgIDs7CiAgZ251KQogICAgICBMSU5LRVJfTUFQPWNvbmZpZy9saW5rZXItbWFwLmdudQogICAgICBBQ19ERUZJTkUoX0dMSUJDUFBfU1lNVkVSKQkKICAgICAgOzsKZXNhYwoKQUNfTElOS19GSUxFUygkTElOS0VSX01BUCwgc3JjL2xpbmtlci5tYXApCkFNX0NPTkRJVElPTkFMKEdMSUJDUFBfQlVJTERfVkVSU0lPTkVEX1NITElCLCB0ZXN0ICRlbmFibGVfc3ltdmVycyAhPSBubykKQUNfTVNHX0NIRUNLSU5HKFt2ZXJzaW9uaW5nIG9uIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHNdKQpBQ19NU0dfUkVTVUxUKCRlbmFibGVfc3ltdmVycykKXSkKCgojIGlzYy1wb3NpeC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjExLjIpCmRubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCmRubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQpkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCgojIFRoaXMgZmlsZSBpcyBub3QgbmVlZGVkIHdpdGggYXV0b2NvbmYtMi41MyBhbmQgbmV3ZXIuICBSZW1vdmUgaXQgaW4gMjAwNS4KCiMgVGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvbmUgaW4gYXV0b2NvbmYuCiMgQ3VycmVudGx5IHRoaXMgbWFjcm8gc2hvdWxkIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYXV0b2NvbmYgbWFjcm8KIyBiZWNhdXNlIGdldHRleHQncyBnZXR0ZXh0Lm00IChkaXN0cmlidXRlZCBpbiB0aGUgYXV0b21ha2UgcGFja2FnZSkKIyBzdGlsbCB1c2VzIGl0LiAgT3RoZXJ3aXNlLCB0aGUgdXNlIGluIGdldHRleHQubTQgbWFrZXMgYXV0b2hlYWRlcgojIGdpdmUgdGhlc2UgZGlhZ25vc3RpY3M6CiMgICBjb25maWd1cmUuaW46NTU2OiBBQ19UUllfQ09NUElMRSB3YXMgY2FsbGVkIGJlZm9yZSBBQ19JU0NfUE9TSVgKIyAgIGNvbmZpZ3VyZS5pbjo1NTY6IEFDX1RSWV9SVU4gd2FzIGNhbGxlZCBiZWZvcmUgQUNfSVNDX1BPU0lYCgp1bmRlZmluZShbQUNfSVNDX1BPU0lYXSkKCkFDX0RFRlVOKFtBQ19JU0NfUE9TSVhdLAogIFsKICAgIGRubCBUaGlzIHRlc3QgcmVwbGFjZXMgdGhlIG9ic29sZXNjZW50IEFDX0lTQ19QT1NJWCBrbHVkZ2UuCiAgICBBQ19DSEVDS19MSUIoY3Bvc2l4LCBzdHJlcnJvciwgW0xJQlM9IiRMSUJTIC1sY3Bvc2l4Il0pCiAgXQopCgojIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KIyBGcm9tIEppbSBNZXllcmluZwoKIyBzZXJpYWwgMQoKQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCltBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAogICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAogICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCiAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCiAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCiAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCiAgQUNfU1VCU1QoTUFJTlQpZG5sCl0KKQoKIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KCkFDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCltBQ19TVUJTVCgkMV9UUlVFKQpBQ19TVUJTVCgkMV9GQUxTRSkKaWYgJDI7IHRoZW4KICAkMV9UUlVFPQogICQxX0ZBTFNFPScjJwplbHNlCiAgJDFfVFJVRT0nIycKICAkMV9GQUxTRT0KZmldKQoKIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCiMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgojIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgoKIyBzZXJpYWwgMQoKZG5sIFVzYWdlOgpkbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQoKQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLApbQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCkFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pClBBQ0tBR0U9WyQxXQpBQ19TVUJTVChQQUNLQUdFKQpWRVJTSU9OPVskMl0KQUNfU1VCU1QoVkVSU0lPTikKZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgogIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKZmkKaWZlbHNlKFskM10sLApBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCkFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQpBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQpBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCmRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgptaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYApBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0sICRtaXNzaW5nX2RpcikKQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQpBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSwgJG1pc3NpbmdfZGlyKQpBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQpBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCkFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCgojIENvcHlyaWdodCAyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQoKIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEF1dG9tYWtlIFguWSB0cmFjZXMgdGhpcyBtYWNybyB0byBlbnN1cmUgYWNsb2NhbC5tNCBoYXMgYmVlbgojIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgpBQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sW2FtX19hcGlfdmVyc2lvbj0iMS40Il0pCgojIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIGl0IGNhbiBiZSB0cmFjZWQuCiMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBQ19JTklUX0FVVE9NQUtFLgpBQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCgkgW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuNC1wNl0pXSkKCiMKIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KIwoKQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCltBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCiMgSnVzdCBpbiBjYXNlCnNsZWVwIDEKZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwojIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwojIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwojIGRpcmVjdG9yeSkuCmlmICgKICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAogICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgogICAgICAjIC1MIGRpZG4ndCB3b3JrLgogICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAogICBmaQogICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgoKICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgogICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCiAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgogICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCiAgIGZpCgogICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQogICApCnRoZW4KICAgIyBPay4KICAgOgplbHNlCiAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCkNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKZmkKcm0gLWYgY29uZnRlc3QqCkFDX01TR19SRVNVTFQoeWVzKV0pCgpkbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCltBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCiMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCiMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCiMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCmlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICAgJDE9JDIKICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKZWxzZQogICAkMT0iJDMvbWlzc2luZyAkMiIKICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQpmaQpBQ19TVUJTVCgkMSldKQoKIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgoKQUNfREVGVU4oW0FNX0NPTkZJR19IRUFERVJdLApbQUNfUFJFUkVRKFsyLjEyXSkKQUNfQ09ORklHX0hFQURFUihbJDFdKQpkbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgpkbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLApkbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCkFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAo8PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAo8PGFtX2luZHg9MQpmb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCiAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgogICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+CiAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAogICAgOzsKICBlc2FjCiAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCmRvbmU8PD4+ZG5sPj4pCmNoYW5nZXF1b3RlKFssXSkpXSkKCg==