This may be the last update to the game. This fixes a glitch with the winning ending never working.
data:text/html;charset=UTF-8;base64,PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAqIHsKICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KICAgIAogICAgaHRtbCwgYm9keSB7IG1hcmdpbjogMDsKICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMDsKICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIH0KICAgIAogICAgPC9zdHlsZT4KCiAgICAKCjwhLS0gICAgPGxpbmsgcmVsPSJtYW5pZmVzdCIgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo0MjA5Ni9tYW5pZmVzdC5qc29uIj4tLT4KICAgIAogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8nOyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgICAgIAogICAgPG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgICAgICAKICAgIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNQUFBQURBQ0FZQUFBQlMzR3dIQUFBQUFYTlNSMElBcnM0YzZRQUFBRVJsV0VsbVRVMEFLZ0FBQUFnQUFZZHBBQVFBQUFBQkFBQUFHZ0FBQUFBQUE2QUJBQU1BQUFBQkFBRUFBS0FDQUFRQUFBQUJBQUFBd0tBREFBUUFBQUFCQUFBQXdBQUFBQUJOT3puS0FBQUFIR2xFVDFRQUFBQUNBQUFBQUFBQUFHQUFBQUFvQUFBQVlBQUFBR0FBQUJaUmpVM0NSd0FBRmgxSlJFRlVlQUhzM1FXUUhFVWJCbURjM2QzZDNTRzRPNFZMZ2pzRUNScEljSGNwM0QxWWNJZGd3ZDBoQkhkMzcvK2Vwb2IvV0dadmJlNTJiM2VtYXV0dWJYYTYrM3MvZmIrZVlZWVpacGlRUC9JNWFHRVp5QmUvaFJjL1YzNzU0dWNLb01WbElCZUFGaGVBVnJjQ09RQnlBTFMwRExUMDRGdGQrK1hqejdWZnJnQmFYQVp5QVdoeEFXaDFLNUFESUFkQVM4dEFTdysrMWJWZlB2NWMrK1VLb01WbElCZUFGaGVBVnJjQ09RQnlBTFMwRExUMDRGdGQrK1hqejdWZnJnQmFYQVp5QVdoeEFXaDFLNUFESUFkQVM4dEFTdysrS2JYZnNNTU9HOW8vY29CM0tPTWR2dG1VQXRMc0FqSGlpQ09HTWNZWUk0d3p6amhoN0xISERxT01Na29ZZnZqaDg3Vk03MzdNQWRBc2dLRDFSeDExMUREVFRET0ZWVmRkTld5MTFWWmhzODAyQ3dzc3NFQ1liTExKd3Vpamp4NkdHMjY0SEFqL0JrSU9nR1lBQUExUHlIZmZmZmR3L2ZYWGh5ZWZmREs4OU5KTDRZVVhYZ2dQUC94d3VPS0tLOEwrKys4ZjVwbG5uaHdFT1FDYUMvUzArcmpqamh1MjIyNjc4T0NERDRadnYvMDIvUFhYWHlFNS9QLzExMStIcDU1Nkt1eTc3NzVodHRsbXk2M0EvMEhRWE1MUUROcThrakZ3ZTBZZWVlUXc2Nnl6aHR0dnZ6MTg5ZFZYVWZnTEFlQTVZTngyMjIyaFY2OWVPUUJ5QURRSDhFY1lZWVF3L3Zqamg1VldXaW04OTk1NzRjOC8vMHdVLzMvKy92YmJiK0dOTjk0SXh4MTNYTzRHNVFCb0RnREk4RXczM1hSaCsrMjNENTk5OXRsL2hMNzlDNnpBRjE5OEVTNi8vUEtZSWNvRDRpZ0R6U0VJbGJnTnpmVFpKT3NqK0NYY3BRNnh3RFhYWEJNbW5uamkzQXI4YlFWeUFIUm5RSXcyMm1neDdkbTdkKyt5QVRCZ3dJQXd5U1NUNUFESUFkRDl3UThBTTg4OGM5aGpqejNLQnNDMTExNGJKcDEwMGh3QU9RQnlBSFJuNjVmUnRYZC9JY2hvSXJwbGFqQzNBRFhMYjgwbjZKYUMweXlneVFGUXMveldmSUljQVAvUEtYZjVYRlFLZ0crKytTYmtNY0MvWlA1ZlQ3cDhBWnRGRTlkckhEa0FhcGJmbWsvUThxQVphYVNSWWxweHhSVlhqRFNEWFhmZE5XeTc3YlpoOWRWWER6UE9PR09rSTNjV1FDb0ZnRHBBVjFnQTlBeGp4MHJkWW9zdHdqYmJiQk42OXV3WlZsNTU1VWpiYUNCNmRnNkFhb1VURDJlODhjWUw4ODAzWDlocHA1MWloUlh6OHNVWFh3eFBQUEZFWkdYMjdkczNMTGZjY21IS0thZU1uSjFxZjZ2WTl4VENacGhoaHJEenpqdUh6ei8vdkZRZExKTGlGTUltbkhEQ1RrbURxaTZqWnZUbzBTTVl1NW9EZ3Q1amp6MFdIbnJvb1hEVlZWZUYvdjM3aDZXV1dpcjJLaFFiVnhlK25nT2cyc2ttZklzdXVtZzQ0SUFESXROU0pmYjc3NzhQUC8vOGMvanh4eDhqTWUyMTExNExGMXh3UWVUbEUxVFdvdHJmUy9zZVRRdGNlUCtmZnZwcGh3QkFoUUNTU3k2NUpEYk1BSERhT1d0NWpVTEFTenIzM0hQRG0yKytHYjc4OHNzNEp6Lzg4RVA4Ni9lVE9hRTRzcDZQS3E0OUIwQVZreFlGQndjSHZmaSsrKzRMdi83NmE2cncvZjc3NzFFSTdyNzc3dENuVDU4dy9mVFR4M2JGYW4rejhIczBydTZ2eFJaYkxBd2RPalQ4OGNjZnFkZmhSZGZ5MWx0dmhSTk9PS0ZUdEQ5ZTBqcnJyQk8xUGw1UzJyVUFvZXY0NUpOUHdwNTc3aG1tbm5ycVRPZWpjSDdLZUo0RG9JeEpTdFdVTk5oWlo1MFZYbi85OWFKQ2w3engwVWNmaFZ0dnZUVnN1dW1tWWFxcHBrbzlYN1hYb1FXU2RSazRjR0MwT3NsdkZ2NWxuZTY4ODg2dzlkWmJaL3I3cnBzbFdtS0pKY0laWjV4UkVvaXU2NWRmZm9sV1FyZGFuZU9CSEFEVkN0N2lpeThlQThwU3JvY0ZSMFgrOE1NUG96dEVTK3JWcmZaM0M3L0hDa3d3d1FTeEcwd25HUGNMTFpxMjlhQ0p1U0JjajZPT09pcTJTQmFlbzlybjNDaWFIeDNqc01NT2l4MW9oTnZ2ZG5TWUQvMEw0aU9VN21wL1A0UHY1UUNvZGhLWFhucnAyR0FpdDE3T3dVM0N4eGNUckxiYWFsRndzdkxEV1FGWmwzNzkrb1hCZ3dkSGFyU01qeWFZanovK09MWkZublRTU2NFMWp6WFdXSmtJbkd2bmZzMHh4eHpob0lNT2ltMllnRmJPd1ExeW5XdXNzVVlPZ0dvRnNON2ZTeXdBZjdiY0F3aUd0dm5xbDE1NmFWaGxsVlZpbzNwV0lHQUpacDk5OXJEaGhodUd2ZmZlT3h4ODhNRXg0NElvdC83NjYwZk5uNVhsOFZ2YU1LVitEei84OFBEODg4OUh5MVB1UExBQTk5NTdid3lZY3d0UXgwcHFMU0NhYzg0NUE2MnE4YnlVeVc4dkdGd1NNWUhHbElVWFhqaHE1S3hBWUR4OGFoa3FBaW9seVVVaHNMV010ZkM3WEM2cHpEUFBQRE84K3VxcjBjVnJQOFppL3lkdW1VeVpURkVlQTNSVDRTY1FPUFcySHJudXV1dGk2clBZb3FlOVRoQzRDNmVlZW1xWWUrNjVZeENaSlFnS0JUYkw1MUtYUGRyeS9Gb3IzMzMzM2JUaGRmZ2E5NGRicG9tL0FXalplUXhRclhEUXFwclJGYUVFbjVVY0FDQlE1YWR2dWVXV0VVeDF6b2FVYlNIc083VGZmdnVGUng1NUpLWTBLeGszNnlkcElIdG1kNG9HR0hNT2dHb0I0SHVvQ0hMN2hGajFsMm12NUFBQ2VYbXVnSFBWY2kxZDlWMnh5OFVYWHh5R0RCbFNrZXNuL3VFdW5YNzY2WUg3MkNEanpRRlFpK0J3Vy9qWTAwNDdiZVM3S1BuTHQxY1NFOWkwYW9VVlZzZ3NPMVBMZU1yNXJxcXo3Vlc0TWVVZTMzMzNYWGo1NVpmRDhjY2ZIeVFQekZtRHVIdzVBTXBaOUk0K1l5RVZnbFExN2I0R0JGS2pIVzFSMGw1d3JyNzY2cGdOcVNVOW1RRFJmcUQ4YW9DVW0rZWlTWTk2ampLQkF5UjFXVXRRdlBubW00Yzc3cmdqVm5QYmo2UFkvL1lxWWgwVnllVDliZEhZMFh4MjhYczVBTEthY01IaGdnc3VHRjJhNTU1N0xnYTU1VmlDODg4L1AyWlVDR2E1MStLM3hoeHp6RERSUkJPRkthYVlJbTZOTXRkY2M4WHpyTG5tbXBFYnRNTU9POFQ0QkJPVDBFcUY0dWtzdE5CQ0VSQ0FBakRPVllrMlhtKzk5V0xnLy83Nzd4ZVQrWDllVjVTekl4MjNaNk9OTm9xN1VaUTd4aTc2WEE2QUxDZGFRV3IrK2VjUFJ4eHhSTXlORjZ1S0pzRHdQakxkTExQTTBpRmJsSUI2eUpuVG9BSlJPWGc1ZnRrWUlNSzB2T21tbTJKKy9kRkhIdzNQUFBOTWVQYlpaMk9BN3ZtZ1FZT2k1a2FIRm9RcW1nR0Yzd1krNXk0SENJc3Nza2c0OGNRVFkvcTNtSlV6UHRrZXlRSDFpR1dYWFRhQ05jdTV6dWhjT1FBeW1zaC90RGRCc3VEbm5ITk9UQk1LL2hLQlQxUmpJaUI0UkFwWFhKT09NaUxPeVVYaXpzaS9TeUdlZlBMSmdXQ3JLU2dzRmY1RzhsdnQvL3BNUW8wUWtGNTIyV1dSeW8zSE04MDAwNVRsbStNeXlYeWhNdER3YVljeDI2bE9nTC9ra2t2R2VrVFc4NXpSK1hJQVpEU1Ivd0RBK1dRNExQeUZGMTRZR1poaUFubC9XYUtmZnZvcFVoVGswSEhqYVdDV285aDFpQy9zL0l6R29PcUtYLy9PTys5RTRwdnowYlRsQ0g4aXFENUxjd09OYTNJZHQ5eHlTNndlYzZPQTBmVVhBNlRYdVhvc0Z3dURiZ0VJeWRnRXZGaW4zSjU1NTUwM3VtcTF4QnpGNWlXajEzTUFaRFNSL3hGZ0dwczdaTnRDMlk4cnI3d3l1aURjRkFHaHJqR3VER0ZMY3oyOHhqV2huWTg4OHNqSTUzbjc3YmNEQWF0VTZCUGhUL3ZyWEFKVkZnRmpsVXZGWDVmZUZSK2t6WS80QTNCN3RuVjVIWHZzc1pFVWlOcGdiQVJmM0lFalZHeHNhZWVzMDJzNUFEcHo0cmt1Z2szQ1FKQUZvVEloTkdPeDdRa0pQb3ZnZStqVEdsaG9WSzVMWng2c0F1dkV1aEJtekZGV1RNeVJCbEJqRTRUakg3Rk8yaCtYWDM3NURzZldtWE5kNWJsekFGUTVjYW1hc2RaekVTcVpHVUxGUXVEdmw3UG5aOWJBU0VoN3A1MTJXbGhtbVdXaUpVb0RRYTNqYllEdjV3Qm9nRVdJWU9Jbkk1bjFhT1BaOUd2TDBDZ2NKZHorckFXODFQbkVDVnlqRHo3NElKTDJYQk1tYVFQNzh0VXFwQndBalFJQU1ZT0tzSDRCdmJOcDJhTlNncHZsK3drSTlQVUt2TGx1cnJISkxFRnJBVUJRTi9ua2swZnVEVTZMWUUvQUpwOHVYeTNZOURqMDBFTmpWWGUzM1hhTDcvc2NWMEJnMkJsbGZKa2VGQUZweWFGdC9RTDg4VW95TzFrS2Z2dHp1UWF4aDB6UC9mZmZIMk1DZ1hrVGdhQjVBU0JkWjVjQ2RBQW1YTkZISTdhc0JTMnJJQ1RySWVDVFQzLzY2YWZqbGlhMk5WSEpWYjYzelluM2ZRNW5CMzBaVU9UQk45aGdnMWhWbFJjbndMVllFdjNGM0I2WkdJRm9Jd2cvSUxpT0JBUXlSVWNmZlhUY0JrYS9RUzNqYmFEdk5oOEFhSGtaRkptV3RkWmFLOURpeHh4elRPekNzamVOdXlmU3N2eGIzVngyTUxDNGN2V0liQjQwSHFveTgrOTluMVBZMGRJSUhQZmNjMC9VMXNBZ0ZhZzRoWHVqQ2FXam5IN2F3dlA3TmFyZmZQUE44VGVMVlZmYmErYXUvRDhCbzVqZ2dRY2VpSnQvNFQzVkN2cTB1YWpEYTgwQkFDWlpCb1Y1dGpoMlpUdnd3QU9qME51U2hIWW45SVM3MW5TaTd3T0xkQ0ZPdk51U3FzcmFITXYySk1CSFE1WWJNTHAxcWU4RGwrSlVJeCs0L0t4Z0ExTWJLclZNM1I4QVhCMkNiNThlR2wrRDlvMDMzaGo1NnVWU0JLb1ZPdHFSWm1RdFZFVnhjcmhIZ0NCSERwU2x0SnJnRW8rSHBVbTBiYlhYMHhYZjR5S0trY1FzeFFwbHBjYmNRTzkzYndCWUFDNUVVbkhscXlkVTVIb0lFK3Z3eWl1dlJJMXU1d2NCZHltWFNHY1VGMDNhVSthbjBRK0F2K3V1dTJLRkcyMmlnWVM1bW12cHZnQ2crV2w5WkRJMEEzNTh3cjZzaC9BVFhMOExCQWtOV05DTlpBWUV4VElueG1HTFJYUUpld2ZWNnFKMUJZRHNNWVJSS25qUEFkREZqZTBFU1FDR2tDV2pJekNUTjYrWDBCY1RPQ0RnTG1CRVNybXlWTVZBZ0ZzanpacTBHaFk3WjZPOHpzcktrSzI5OXRwbHh6b05DcFR1WlFFSXZ1NG1kT0NMTHJvb0JvNEMyMFk5RWtxQmxPc3V1K3dTNndqRjRnSXBXODBzOWd3QzZFYTJCSzVORWtBSG5OcElzVEUxcU5DM3QxcmRCd0Q4ZlF6RXZmYmFLMVltOWFUV3UxcGFDbmlKU3lSN29wcnFmcjdKTmlpRndzRTZpQm1rVlFYeHRHeWpIc1lsUlF5c09zU3dQZ3ZIMDAyZWR3OEEwREEwdjV5K1BENGVPeTNVYUc1UE1ZRjFyU3pWNDQ4L0hqTW9lUGNBWGVnU3FUTGI2Tll1RTl3bk1VMmpIZ3AyMmgzMUtDRHdsU3Z3MHNQR2lXWHFBVHdkUFZqOWNsUEs1VjVEdTg4MVBnQUlDZmVBVUdnNFR3aGkzVVg0RXdGVzRNTGxCMkFCcnlaMUFYQzd4WWlBSUJ3QUlzamtackJ5MHJrZU1qQUpUYUxlNDNjdHlRNTNwYkpCMXRCWWpjMWF5bndKb0cwSEk0Tlg3S0ZHb21jQ3dBQ2hVR0cwbjdzcS8yOXNBQmd3QWhhK2p0UWJ6Vi92aFU4RXVwcS9oSmZtcE4zN3RWRWZqQzF0NGRRMUJQa28wWFpkMWtDalZxQUNqUzRoNDFYdmxLbDFZTlZza2FMNFdFeExXME0xRWJVUlhXVEc0VHZXVTVHeW93YzZ1RzQxV1Q3MUZTMmhHY2NialEwQXFKY2Q0V3ZhaGFBN3VUMXBBQ0UweG9Eajc4WWFHc3hsZ0FvMUcyMEpIQmJjWjJTUk50NTQ0eWdFWEE1Y0p0UUpUZWVhWlJUaTZrR2hBR2JqMFBCanJkTEFyREt1VVVabFh1Wkl3VTk4ZzI3Q0l2cGI3T0Z6eHVZN1FNTUw0QXBuV0lCclhBQVFBcE5IQTlLWWVrNjdzL1pQQUdFTXRMZWMvejc3N0JPRlBHMUJFMThaRHovWi9rVEd4YTVxT3JBd1ZGbVJDOXY2amdYWWVuc0pFdGVrcStiSm1oQnEzVzc4K1VJQUdJT3VNcHdwR3AvbHFoU294dUloa2FBN3pwYnFPRmVGdjFYbDg4WUVnSW16OEZvSUVkaTZ1K3VUQ0gveTE0THk2YkZRM1RDajFLNFFoWXRMMjZvckFBTXFoVHN4Mm9xRk84RlNFc3l1c0phQ2RLeFo2ZHMwb1FTS1pBY0pxZDFhRHozUlFNOEtGTVpQaFhOVTV2UEdBd0IzUUZaQUlIamVlZWZWcFNXdzFvVXE5L3VFMURiaE5Ib3RlL2Z6aTIyUWhhS3Q4RWJiSmdGMEVqU1hlMDJWZkk0bGMyOEF1MlRiTGJ0UTZGVEJFZjNLdVkxVU9iOXJMT0lCbFhOeFV1SHZWZkc4OFFCQXU4bVEwR3A4WlNhOW1ROGFtMVpML09qQ2VLQ1NSZlZkZ2tnam4zMzIyYkZRbVBVdUV1M1hBZ0J3bjFBK3JGbmh0ZHFGam9zMnRJMkptOVVoRmtCNlRBTmM0ZStYOGJ6eEFHQVBIQU84NFlZYnVzeVh6V3B4cWprUGQ0Z2ZyY0JIWTZiRkEyVXM1RC9DQndUY0EzRURpalkzU3lEcGQ3SSt1SEd5VXE0OTdlWi9BS0JpenhwbGRkaVhWUEdObkZReUwwVSsyMWdBb1AzbGhBVk5ncDdPV0xTc0ZpS3I4eGlqYklmNzZnS0MxSjhlQSs0ZmxxaEFXY09NYlVja0JkSUthR21MeXkzeWVheFVuS21raHBMVmRUc1BDK0FPT2ZZK1NoTklXNzhZQXl1UnhWbzZCeGRJWml3dDZFNmJoeEt2TlJZQWFFRGJiOXN4dWRKc1FaWUwyOVhuc3JER3k5MFRXSEpiS0FCQm44S1pRRk1OZ0RzQkVCcCt1RXlsaElBMVVFVFNIY2RQbDFOSFljanFjSzMySU4xa2swMWlJRjhvYkZpd1hGbDNweTluTTkxUzF3VkliczR4ZFZ2ZG9TbURZSzJGK2s1TmFoWWFvOVNFTnRyN3hweUFRWUFNRU53TW1sWm1CekNraE4yV2lWYnYxYXRYekFLcEZ4UnpuWUJBQlphTEFnUjRSczZUeGZ3Q0FIb0g2MVNNRGdHb3lJc2EvcldoVnBLbVRlYkNkMUN3alZsYVZlMmtFR3hWUG04Y0M4RDlvZjB0cnNKSGZ2eDNCZ2dFSU5EaTh2NWFNdDFzejY0V3FBVXlTY1UwSTRBQWltSlMrOVJ5dFVEd1BiUVVkSFMrZmpGQ25OZHRUS0J1SVI1Z3piaE50TG40d2Q5aUQwMUNza3ppR01MZm8yMXpBMVNLWW1Pc0FnU05Bd0JSUGZObXNEUkxmblE4QXl5RXdwY0E4LzYyTFV2VUFRZ2lFS1RSRWxnQ0xwTmQ1N2hSWWc2V3BWb0FjTmtVdHV3SFdvb1NMV1VwZDYrdXd3cjE3dDA3VXFuNzl1MGJLOFNxeEdrUDh1Q3o3bThnOWFuMmthSHdzeUtOQXdBRFZPSlgycytQOG1lQUFIT1RXQVJic2l1c29WVVhBd0ZMU3hqMTlRSlB0UVV6NE5ISTcxYXBic2Rhaml3Qm9iZ0FTQVhJQW1lQmVyR0hUQmJYS20wczVmeGVHWjlwSEFCSWJkbHp2cEo3VDVVdkpzMzl5UVFFQWsyQnNqb0E0VW9USEVKbzF3b3VrNHlUREZRMUNRZlZlUlFNVFRHVkZ2RmNGMDB1VStWdnNZZlBwWTJoRE1FdUM1QnQ1MmtjQUVpbDRaZGJrUHlvZkFZU0VLQW9EeHc0TUtaTzBSUFNCQ2h4aC9yMDZSTUpkZUtLU2x3aG4xV2t4TTFaZDkxMWkvci9qU1JmUmE2bE1RQmdRVkJscGYxeS83OXk0Uy84aGlCWndVZ05RR3hWTEVPRVMyUUhhSmFERzFYdUlTdGpyZmpvcGZ6L0lvSlhyb2J1N00vVkh3Q0VIL1VYaDBYMnB4cHpYTzdDdGRMbkJNaTQ5eDF0ejhMMUVET3dHQUxhY3F4QW92M1JvTGxhR2ZQek8xdmdDODlmZndCWUJGMC9OcFhLM1ovc0lFcFFCYXFubkhKS3pMNndCR251a0ZoQkdoVmhyUnpsNDd4cUVjNkxzTmpnR3I3VTlkVVhBTFMvcklTR0NmbC9CWnI4eUdZR0NLb0g5d1l4RG0wNnpSV3lCdTQ0cWNGR1lGdnE0S0t5R0txL0dSYWtTZ2xxWjcxZlB3QndlMlFpM00vV3RpRkQyeGlEbGZpaHBSWXFmLy92R1dBRmJPaUxsb3hubGFheDdiWWhENjlTVytwUXAyRXg3RzdCZXFlZHJ4dTkxclVBNEM4eXhiZ3NPcjJRdnJUMTRiMVVtb2tvdFZENSszL1BBQ3NnSGxDQlZRVk80OUZUUnF5d3oxaUhZcTZRWGJMZFAwRXplNldwendZRlJkY0FnS1l3WVZoOE8rNjRZK1NGSUhtaDZTcW55eXFZZEl1Vkg5blBnR0lYN1k1blpVZUdRbUcwUHJaMzEzdWROTklrVjVHNFV2cC9Cd3dZRUpWWEoxUmsvM05OaGRmWVNjODdId0FxZjFyKzdIS0E1cXloUVFxTjRPZEgxODJBQklPc2tNeE5takNweHZacmE4d1pQSGp3UDdGQUl2eXNBb1dsdndDZlNOeVdkbzV1K0ZybkFrRFdRVGxiMDdTdUlYejN6bXJPNkRwUjZwNi9SSVByQ1ZEOFNrdGRLcHE1TFN1M05Ga2pBQkJEc0I2MlprR3JSbTRUT0hkRFlVKzc1czRGZ0JTYlNxSEprenBqaXZPalBqUEF4ZVREb3lYckh5NE1ZTkVqQk1uU20wa3prb3pQa0NGRElyMENpUTZ0dWtrRVB4bEg1d0hBaE9MM3lQRHdLL241K1ZIZkdiQ1IxYUJCZzJMTGFhRXdBd1JYRmJmSGVuRjdoclpsNXRSbkJMM2NuaWJTL0owTEFCT2x1Y1hrbWN5YzNsQmZ3VTkrM1Rwb0xFR2RUc3NHQVlVbUd6Y0c1QzRkY3NnaE1WVmRyUFBNT2dNT2wwcXM1K0gvYmdTVTdDMkF3YU82OXUvZlAxWVhjK0ZQeEsvK2YxbGhaRGx1VUZvYVU4eW1nOHROUnp4d2hRb3RSZUlDRVhhQnMxcU9UUXg2dHUxcXJlbWxSMXZUU3RxK3A4bjNHdW52L3dBQUFQLy9sbm1wTWdBQUR6NUpSRUZVN1owTHNGVmpGTWRMa1hjbHI1SktSU1d2eUN0MHlaVWVpbEFVcG1FUTAwT2VTVFJOU3FLR1c0MFVSU09KU2tVUFE5T1RHQ3FQa3BSU29XaTg2VW1XKzFzeng5eU9jKzdaZTU5OTd0bVB0V2YyM0h2UCtlN2UzK1AvWDk5YTYxdmYrc3FWSzFkTy9MNHJWS2dnWGJwMGtZVUxGOHF1WGJ2RXJ1RDB3TjY5ZStYWFgzK1ZlZlBtU2RXcVZWT08vUUVISENDSEhIS0lWS3BVU2ZiYmI3K1VaWTQ4OGtnNSsreXo1ZTY3NzVibm5udE81czZkSysrLy83Nk8rZVRKaytYaGh4K1c1czJiUytYS2xkTSt3Mi9jZVh5ZXZ3UUEvTldxVlpNcFU2YklEei84SUhUNFAvLzhFeHdFeEx3bWpNWE9uVHRsK2ZMbGNzd3h4MGo1OHVWVEFydzBNQjEwMEVGU1VGQWdnd1lOa2pWcjFxaVEyN05uai96MTExOTY4L3VXTFZ0a3dvUUpjdkhGRnd0azJYLy8vVjIvcDdRNitQaWR2d1NBOFRSNjVjcVZzbnYzYmdOL3dBZ0hBUURxbDE5K0tmWHExZk1FekVhTkdrbS9mdjNrdmZmZTAyZWxhdUxmZi84dGYvNzVwNUtnYmR1MlVxTkdqYURPQlA0UkFHbFN1M1p0NmQrL3Yzejc3YmRDSjlnVnZCNWdYRFpzMkNEbm5udXVISHp3d2E0bGM2dFdyUlRZNjlldno5aTRiNzc1UnNhTkd5YzMzSENEMUs5ZjMvVzdmSlQwNmQ3dEh3RXFWcXdvVFpzMlZjbnd4eDkvcVBxVHNZZXNRSm4zQUFUWXRHbVR0Ry9mWHFwVXFlSmFEYnJwcHB2a3JiZmVrdSsvL3o1ajNYblgxMTkvTGRPblQ1ZDc3cmxIVGp6eHhIUkF6TmZuL2hFQWFYTDU1WmZMMXExYkJUM1FkUCtNK01oTEFVQ0paTDd1dXV2VVhuTnJCM1R0MmxYZWZ2dHR0ZkdjTkdESGpoMnlkdTFhbVRadG10eDQ0NDF5M0hISEJVa2Q4b2NBZENMR0wxTWQ0RGZqMXdrMDhsT21KQUdPT09JSTF6TUF4SG5qalRma3UrKytjOXdBN0lHdnZ2cEt4bzRkSzFkY2NZVjZoM0NZbElHS2sra2QvaENBeHRTcVZVdDY5Kzd0dUZPc1lINTZvS1FLaE5QQ0xRaGJ0R2loUU1hUWRqUEw0eFJoSm5qKytlZmxnZ3N1a01NUFA5ejF1OTNXMVVGNWZ3aUEvdCtnUVFNWk9IQmdma2JWM3VxNEJ5QUFSakFnOUdJRTQram8yYk9ucWtHb04yNHUzbzE3bkxXRDAwOC8zWk1YeWdHbzNSRExId0xnNXozampETms1TWlSYnZyRHl1YWhCd0RodW5YckJIY21pMTVlQU1VaTJJQUJBMVNpOHp5bk13SGxVSTkvK2VVWHVmWFdXK1hvbzQ5MnJZSjVxVzhwLytNUEFlaklaczJheWNTSkUvTXdwUFpLTnowQVlMLzQ0b3VzZlBPSEhucW9TdkFubjN4U1ZxMWFwWGFmbXpvUUlZQTljTlpaWjBtZWJRSC9DTUNVK3NvcnI3anBCeXRieGoyQTlQMzk5OTlsMGFKRjZyUW9SVEtXT2pQZzlJQUU1NTEzbnR4MzMzM3kwVWNmQ2E1dkp4ZXpBSTRTWEttRmhZV0MrdXkxSGo3OG4zOEVPT2VjYzJUOCtQRk8rc0RLNUtrSE1FUTNidHdveno3N2JOWkdLQ1E0OE1BRGRZR3JWNjllc25qeFl2bnR0OThjdFF3Q0xGaXdRRmhVaXdRQmFNU3BwNTRxdzRZTmM5UUJWaWcvUGJCOSszWlp0bXlaZE92V3paTUJuRXJpWXYvaDJ5Y3didW5TcFJvQ2tja21nSWhUcDA3VmdMbElxRUEwb203ZHV2TFFRdy9sWjJUdHJSbDdBRkFpb1ZFOXNOZjhERkJEQUo1d3dnblN0MjlmK2Zqamp6WGdMaFVKK0N5aGhnMFpNa1FOOFhRUnA2bklsb1BQL0ZHQmFBUUJUOTI3ZDg4NEVGWWdQejBBOExadDJ5WXZ2L3l5Vks5ZTNYZmpFMEtkZi83NU1uVG9VSTBTUmMxSnZxZ0RydFBQUHZ0TVY2S0pGSFc3RXUwekNmd2hBSTBncm9SVlFsaWVpdjNKbldGL2wyMFA0SGtoREpwSVRtYnNYQUNQVU9rbVRacm9POTU1NXgyTk9pVTBCdUlSSW8zSGFNNmNPV280MTZsVEp3Z2hFZjRRQUZaaUVCRUx4RFRyeGpkY3RqQ0k1OXNRU0QvLy9MTzgrdXFyMHFGRGg1eDVYU0FWSzd5bm5YYWEzSEhISFdwc3o1Z3hRMEZQUUZ4UlVaSGNmdnZ0MHJCaFE0RXNQa3R6TDgvemp3QklsVVEwS0s0MnBqdTdndEVEU0g4V3Y3RFIwTlZ6RFR6VUlTUThydkhXclZ0THUzYnQ5Q2NoMkh5ZVo4TzNaUHY5SXdEc3IxMjhUUDdJSTQvSTVzMmJiUllJQnZaVkhVWDllUFBOTjRYTktYbDJPNVlFWHhCKzk0OEFTQlgya3FJRGZ2amhoMnJzbUMyUVh4YlEvN2crNTgrZnIvSDRaU0g5Y3oyNytQeDhmd2xBNVpqKzJBOUt1S3lwUWZrbndPclZxK1h4eHg4WEZpcno3SElNZ3NSUHJvUC9CS0NUcjdubUdwVTZsaFVpZndSZzd5K1JsM2g5QUwrWDBHZWZwVzB5K0lMd3QvOEV3QmFvV2JPbVBQamdnN29vd2hSc1Y5bjJBRE12ZWorU0g4T1RqUzhCTWp5REFQeEVIZnduQUZLRFdZRHdhQWJnMDA4LzFRQ3Nzb1ZBUE4rR3prK1lBWnRWbm5ubUdSMEQzSkptK0tiRmVkb3ZFZ3p4L0JNL0wrc0NETVNLRlNzMFd0Q000dHdSazc1bDZ5R0xUZXpMdU9TU1N6UmkwL1QrVWpGZTZwZWV3Wi9RSFZHRldCMGVNMmFNNWdwaWdHeVJ6RjhTQUh4VUhsUk40dnhIalJxbFVaWkhIWFZVVGxaN0UyTWJrWis1SlFEU2g0V1BUcDA2cVZUNjVKTlAvbHNwOWhjRzhYeGFTZkIvL3ZubnVzbWtUWnMyYXZEbUl0UWhJcUF2S2RoelN3QTZqSUZBSFlJSUxJL1BtalZMWTlJVCswbE5MWEpQWHZxTVlMTWZmL3hSVjNoSlUzTHZ2ZmRxaUFFNVBRMzhqbkh0dUdCSjFyaituUUZoMnlSeDQraW1HTWNzbHYzMDAwOXFHK0F1VGFoR1JvaDlDWkhvRDlRY0RGelVTUGJVa21ia3RkZGVrd2NlZUVERG0xRTNpY2N5OEx2Q3RLdkNyb0dmUEdXaUVyR1ZqczB6ckJYZ0ttVVhHWm1GU2FlSUhnc1pHR2drSEhjaTZhclRueERKU1ZuS3VTbnI1Sm1VY2ZQTTBzb20yazlma05BV2FZL1FZTnZwWTQ4OXByTXBlVmpKOFluVVQrNXIrOXNSdGgwVnlrbm5zbUo4N0xISDZxNGdNZ1E4K3VpamFpeS85TkpMS3RsSXZrUkk3WUxpclhNa1lvVWtjYmhwSzN0MlVXdG16cHdwcEJ0SFNEenh4Qk82azZ0bHk1Wnkwa2tucVcvZjNKdFo0emZyQi9oR0RnaEJ6dnJqano5ZWR3cXhnTU5nazhQeSt1dXZGM0pTUnYwbWRXRG56cDNsNnF1djFnM2pwQjhoM3hMcFErZ2ZrK3ErNDlYM0IyWTFTT2l2M0toS3JGd2k0Yml4SHdDQWs5dHBXY3E1S2V2azNaUng4OHpTeXRKdStvQytNTDArWnpqTjJZT3pJb0pKT2h1WE1zS0FkWFFaZGJRSmhHS1hlQUQ3T3BDVkNtSkhXWjJDQ2VCc3h5WGVCRUMzUmc5bm9ZN05QT2x1WExmSjMvRS82UHpvNkFHVWJGWW5aNFNOTHdFQUxpQm1jWTZUUzlpb1RjTFlWUGZKSjUvOHY4LzVIOXk0RU1NSUVGb2NoYmJpV1lNT3FYN21tV2ZxcVNXazlpUEg1ZjMzMzUveVpyVTErVHYrNThvcnIxUmlHQUZDaTZQUVZqd3JBdUJpSkQ4OUc4Vko0MEtZQVNFSGJtNVdjVm1ZdSt1dXU3S3FpNUVucnhqTTY4dnpBaHhVSDg3STdWcDgxbFUyT1l3SVVlQXc4RHZ2dkRNdjdURGkrSUpkWHg0U0tnQVFOME51VEU0cHllWml2eTBoQ2xkZGRWV28ybS9FMlFmeisvd1IrWUhFNjBPNHhjMDMzNndiZEx3U0FQV0hOSVBrUXNWb05sQ0ZGa2VocmJnbjBDSDlHemR1TEU4OTlaUkdtbm9sQUdma0VyVEhBUkdFSUJzQlFvdWowRmJjRStqSVJrekFHVkdtWGk4TTVybHo1MHFQSGowMCs0V0JQOVFZQ25YbFhaRUE5WWN6RERqWGlvT2l2VnlKdmJlREJnM1NWT0JlVGxrMHdnUUtjNEdxakN0QXV3VVM2azlCUVlGTW1USkZOOTU0SVFDYmRkRDltVVZxRitkQnRWdzdvY2RQNkJ2Z21EVEUxTE9nUllvV0pMbVhpNFBnU0RHT0MvV2lpeTdTdkR2a1AwcStTUStPY2N6ZUJ0dXRGV2lNQmJweWpzR2RhVFpBVXJPeDVNVVhYOVN0bDE3QXovK3daWk1ESGpDaU9TZVhkT1BKTjZrSSsvVHBvNGRKazR2ZjBwTUVHbU9CcnB3dkJBRDhwQVprZDFraWE3VlhBckJQZC8zNjlacDhpb3gzcEhsSnZ2bWNXZWJkZDkrVmNlUEd5U21ubkdLN3Vad0Zwdmt5M3BtRVlkTDMwU2NBaGlvSE1pT3B5VmhkRmhjaEZaQUZjcUFxV2JhR3dPSXNzQlh6VFJxZ2duQXNEMkVMVGc5enpwWWtMSlJCdGhkZWVFR2pURzFMWTJCeEZ0aUsrVUlBSkM5QmIrVEtKSmVPVitQWExTRUlrNWc0Y2FJZUdjVU1aQVFJTE00Q1d6RmZDSUFYNXJiYmJ0TVVJNmdraVNSVGJnSHR0RHdFWTQxaDlPalJtdFhoc01NT00vQUhWLzhIWTlFbUFMby9oaWlHYXk2bFA4UWlLUmJ2WWJZcExDelVZMk5OOGdjZVg0R3ZvT2VaQVBCZGR0bGxHck5QWnJWY1NYK0lSWjVUVWhVT0h6NWNUMk5obDVpQlB4VFlDa1VsUFpHQVRTOGMwVW1tTmZSL2ptNU5kNk1lQVdTM0pNSFlKVmRueVFNcERQeWh3bFNvS3V1S0NHeDg0ZHppcDU5K1doZXZGaFNuV01RVGxPckdZME9ZZzFzQzRGVmFzMmFOcWxtWFhucXBtTUViT2p5RnJzS3VTTUNtZGZMbGQrdldUZE9ISisvclRmeTlaTWtTUFVuZGpaMEFZVGlRWXRLa1NYcitBVE5PMUcycUNMWXYyZ1FBbEp5UlZhMWFOYzJ2U1R4UTRtWmJKRGZuRm1Bb2I5cTBTVE03Ty9INElQbFo1Qm84ZUxDZXhsS2xTaFVEZnpnZEt0RW1RQ2FKQlVGSTFUNTE2bFRadG0xYlJrOFJLaEtTSDd0aTZOQ2h1c3JMUWx1bTk5ajNnY1ZaWUN0V0pxQkNaMGM5V3Jac1djWVFhY0NQd1l1NlJBcVZDeSs4VVBEekc3aERqYUZRVno0cjhHRWtvdzZodzNPbUxuNzgwaTdVbmc4KytFRERLdXJYcjY4R3I0RS85UGdKZlFNOGtRQWZQVm5oT0VGOTNicDFHY0hQT2dLU243ejkyQlRtNDQ4TWJpTFRFRmRFQU1DMWF0V1MvdjM3QzNFNzZkWUFVSHRZNUpvOWU3WmNlKzIxdXJyTHpHR1NQeks0aVV4RFhJRVM0NWN3aWFWTGw2cnVuOHIvejJjc29IRW1WOGVPSGFWNjllcVdDRGVjbnA3U3NCRS9BaURCeVE3QkFkNGNQSWZ1WDVJQS9NNEtMK0RuRkVhT1oySzJJQk8wU2Y3STRTVnlEY29JVW9DTTlHZGJZMEwxU1JDQXY5bjJ1SEhqUnBrMmJacTBiZHRXTTBEYklsZGtjUkxaaHFVbEFyRTZwRE9jTjIvZVBrNGZ3SStuQjZQNDlkZGYxOHdQbkwxcmtqL1NHSWwwNC81SEF0UWZGcTdJNkp5Y0c0aGt0NEFmdFllRXQ0UlJXTnFUeU9NajhnM2Nod1RzRUNObHlhaFJvL2FSL3VqOFc3ZHVsUWtUSnVnQjNvUk9tTDRmQzJ6RW9wSC9nUm5wZjhzdHQraEIxQWtHWUFSdjJMQkJSb3dZb1Ztak1aQk44c2NHRjdGcHFDNWVjY0k2NGRGSWU2N0VMaTZDMnBvM2J5NlZLMWMyVjJmMFhKMy9DY0FVczNwOENKQklqVGh6NWt3RlBrRnRhOWV1RmZKODRoV3lGZDc0WUtFRUVlTFRhTHcvN2R1MzExVmQvUCtFTXc4Wk1rU0k2N0c4UGZIQlFRbndNelBFcCtHQW5Bak9vcUlpbVQ1OXVrWjBvdktZdmg4ZkRLVEFlM3dhVC93UDRjODFhdFNRMnNXWm5URjJMYWd0UHVPZkF2enhtZ0VTSGNCYVFPSk9mR1kvWTB1RTJEYThOTStBZlJjZjFkZ0lZTkkvMWhpSWRlTk4wc2RIMHFjYmF5T0F6UUN4eGtDc0c1OU9LdGpuOFprWmpBQTJBOFFhQTdGdXZFbjYrRWo2ZEdOdEJMQVpJTllZaUhYajAwa0YrencrTTRNUndHYUFXR01nMW8wM1NSOGZTWjl1ckkwQU5nUEVHZ094Ym53NnFXQ2Z4MmRtTUFMWURCQnJETVM2OFNicDR5UHAwNDIxRWNCbWdGaGpJTmFOVHljVjdQT1l6QXovQWcxRmxmbUZ6SG8vQUFBQUFFbEZUa1N1UW1DQyI+CiAgICAgICAgCiAgICAgICAgCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgIWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIGkobyxhKXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlCmlmKCFhJiZsKXJldHVybiBsKG8sITApCmlmKHMpcmV0dXJuIHMobywhMCkKdmFyIGg9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpCnRocm93IGguY29kZT0iTU9EVUxFX05PVF9GT1VORCIsaH12YXIgdT1uW29dPXtleHBvcnRzOnt9fQp0W29dWzBdLmNhbGwodS5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV0KcmV0dXJuIGkobj9uOmUpfSx1LHUuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfWZvcih2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxvPTA7bzxyLmxlbmd0aDtvKyspaShyW29dKQpyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj17aXNEb21QcmVzZW50OiEwLG5hdmlnYXRvcjpuYXZpZ2F0b3Isd2luZG93OndpbmRvdyxkb2N1bWVudDpkb2N1bWVudCxhamF4OmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdAppZih0Lm9wZW4oIkdFVCIsZSwhMSksdC5vdmVycmlkZU1pbWVUeXBlJiZ0Lm92ZXJyaWRlTWltZVR5cGUoInRleHQvcGxhaW4iKSx0LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwiRnJpLCAwMSBKYW4gMTk2MCAwMDowMDowMCBHTVQiKSx0LnNlbmQobnVsbCksMjAwIT09dC5zdGF0dXMmJjAhPT10LnN0YXR1cyl0aHJvdyJYTUxIdHRwUmVxdWVzdCBmYWlsZWQsIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMKcmV0dXJuIHQucmVzcG9uc2VUZXh0fX0Kd2luZG93LlByb2Nlc3Npbmc9ZSgiLi9zcmMvIikocil9LHsiLi9zcmMvIjoyOH1dLDI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e25hbWU6InByb2Nlc3NpbmctanMiLHZlcnNpb246IjEuNi42IixhdXRob3I6IlByb2Nlc3NpbmcuanMiLHJlcG9zaXRvcnk6e3R5cGU6ImdpdCIsdXJsOiJnaXRAZ2l0aHViLmNvbS9wcm9jZXNzaW5nLWpzL3Byb2Nlc3NpbmctanMuZ2l0In0sbWFpbjoicHJvY2Vzc2luZy5taW4uanMiLGJ1Z3M6Imh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nLWpzL3Byb2Nlc3NpbmctanMvaXNzdWVzIixkZXZEZXBlbmRlbmNpZXM6e2FyZ3Y6In4wLjAuMiIsYnJvd3NlcmlmeToiXjExLjAuMSIsZXhwcmVzczoifjMuMy4zIixncnVudDoifjAuNC4xIiwiZ3J1bnQtY2xpIjoifjAuMS44IiwiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiJ+MC40LjMiLCJodHRwLXNlcnZlciI6Il4wLjkuMCIsbWluaWZpZXI6Il4wLjcuMSIsIm5vZGUtbWluaWZ5IjoifjAuNy4zIixudW5qdWNrczoifjAuMS45IixvcGVuOiIwLjAuMyJ9LHNjcmlwdHM6e3Rlc3Q6Im5vZGUgdGVzdCIsInRlc3Q6bWFudWFsIjoiaHR0cC1zZXJ2ZXIgLW8gdGVzdC9tYW51YWwiLHN0YXJ0OiJicm93c2VyaWZ5IGJ1aWxkLmpzIC1vIHByb2Nlc3NpbmcuanMgJiYgbWluaWZ5IC0tb3V0cHV0IHByb2Nlc3NpbmcubWluLmpzIHByb2Nlc3NpbmcuanMifSxsaWNlbnNlOiJNSVQiLGRlcGVuZGVuY2llczp7bWluaWZpZXI6Il4wLjcuMSJ9fX0se31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgQXJyYXkpKXtpZihlLml0ZXJhdG9yIGluc3RhbmNlb2YgRnVuY3Rpb24pcmV0dXJuIGUuaXRlcmF0b3IoKQp0aHJvdyJVbmFibGUgdG8gaXRlcmF0ZTogIitlfXZhciB0PS0xCnRoaXMuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybisrdDxlLmxlbmd0aH0sdGhpcy5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e1g6MCxZOjEsWjoyLFI6MyxHOjQsQjo1LEE6NixVOjcsVjo4LE5YOjksTlk6MTAsTlo6MTEsRURHRToxMixTUjoxMyxTRzoxNCxTQjoxNSxTQToxNixTVzoxNyxUWDoxOCxUWToxOSxUWjoyMCxWWDoyMSxWWToyMixWWjoyMyxWVzoyNCxBUjoyNSxBRzoyNixBQjoyNyxEUjozLERHOjQsREI6NSxEQTo2LFNQUjoyOCxTUEc6MjksU1BCOjMwLFNISU5FOjMxLEVSOjMyLEVHOjMzLEVCOjM0LEJFRU5fTElUOjM1LFZFUlRFWF9GSUVMRF9DT1VOVDozNixQMkQ6MSxKQVZBMkQ6MSxXRUJHTDoyLFAzRDoyLE9QRU5HTDoyLFBERjowLERYRjowLE9USEVSOjAsV0lORE9XUzoxLE1BWE9TWDoyLExJTlVYOjMsRVBTSUxPTjoxZS00LE1BWF9GTE9BVDozLjQwMjgyMzVlMzgsTUlOX0ZMT0FUOi0zLjQwMjgyMzVlMzgsTUFYX0lOVDoyMTQ3NDgzNjQ3LE1JTl9JTlQ6LTIxNDc0ODM2NDgsUEk6TWF0aC5QSSxUV09fUEk6MipNYXRoLlBJLFRBVToyKk1hdGguUEksSEFMRl9QSTpNYXRoLlBJLzIsVEhJUkRfUEk6TWF0aC5QSS8zLFFVQVJURVJfUEk6TWF0aC5QSS80LERFR19UT19SQUQ6TWF0aC5QSS8xODAsUkFEX1RPX0RFRzoxODAvTWF0aC5QSSxXSElURVNQQUNFOiIgXHRcblxyXGbCoCIsUkdCOjEsQVJHQjoyLEhTQjozLEFMUEhBOjQsQ01ZSzo1LFRJRkY6MCxUQVJHQToxLEpQRUc6MixHSUY6MyxCTFVSOjExLEdSQVk6MTIsSU5WRVJUOjEzLE9QQVFVRToxNCxQT1NURVJJWkU6MTUsVEhSRVNIT0xEOjE2LEVST0RFOjE3LERJTEFURToxOCxSRVBMQUNFOjAsQkxFTkQ6MSxBREQ6MixTVUJUUkFDVDo0LExJR0hURVNUOjgsREFSS0VTVDoxNixESUZGRVJFTkNFOjMyLEVYQ0xVU0lPTjo2NCxNVUxUSVBMWToxMjgsU0NSRUVOOjI1NixPVkVSTEFZOjUxMixIQVJEX0xJR0hUOjEwMjQsU09GVF9MSUdIVDoyMDQ4LERPREdFOjQwOTYsQlVSTjo4MTkyLEFMUEhBX01BU0s6NDI3ODE5MDA4MCxSRURfTUFTSzoxNjcxMTY4MCxHUkVFTl9NQVNLOjY1MjgwLEJMVUVfTUFTSzoyNTUsQ1VTVE9NOjAsT1JUSE9HUkFQSElDOjIsUEVSU1BFQ1RJVkU6MyxQT0lOVDoyLFBPSU5UUzoyLExJTkU6NCxMSU5FUzo0LFRSSUFOR0xFOjgsVFJJQU5HTEVTOjksVFJJQU5HTEVfU1RSSVA6MTAsVFJJQU5HTEVfRkFOOjExLFFVQUQ6MTYsUVVBRFM6MTYsUVVBRF9TVFJJUDoxNyxQT0xZR09OOjIwLFBBVEg6MjEsUkVDVDozMCxFTExJUFNFOjMxLEFSQzozMixTUEhFUkU6NDAsQk9YOjQxLENIT1JEOjIsUElFOjMsR1JPVVA6MCxQUklNSVRJVkU6MSxHRU9NRVRSWTozLFZFUlRFWDowLEJFWklFUl9WRVJURVg6MSxDVVJWRV9WRVJURVg6MixCUkVBSzozLENMT1NFU0hBUEU6NCxPUEVOOjEsQ0xPU0U6MixDT1JORVI6MCxDT1JORVJTOjEsUkFESVVTOjIsQ0VOVEVSX1JBRElVUzoyLENFTlRFUjozLERJQU1FVEVSOjMsQ0VOVEVSX0RJQU1FVEVSOjMsQkFTRUxJTkU6MCxUT1A6MTAxLEJPVFRPTToxMDIsTk9STUFMOjEsTk9STUFMSVpFRDoxLElNQUdFOjIsTU9ERUw6NCxTSEFQRTo1LFNRVUFSRToiYnV0dCIsUk9VTkQ6InJvdW5kIixQUk9KRUNUOiJzcXVhcmUiLE1JVEVSOiJtaXRlciIsQkVWRUw6ImJldmVsIixBTUJJRU5UOjAsRElSRUNUSU9OQUw6MSxTUE9UOjMsQkFDS1NQQUNFOjgsVEFCOjksRU5URVI6MTAsUkVUVVJOOjEzLEVTQzoyNyxERUxFVEU6MTI3LENPREVEOjY1NTM1LFNISUZUOjE2LENPTlRST0w6MTcsQUxUOjE4LENBUFNMSzoyMCxQR1VQOjMzLFBHRE46MzQsRU5EOjM1LEhPTUU6MzYsTEVGVDozNyxVUDozOCxSSUdIVDozOSxET1dOOjQwLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLE5VTUxLOjE0NCxNRVRBOjE1NyxJTlNFUlQ6MTU1LEFSUk9XOiJkZWZhdWx0IixDUk9TUzoiY3Jvc3NoYWlyIixIQU5EOiJwb2ludGVyIixNT1ZFOiJtb3ZlIixURVhUOiJ0ZXh0IixXQUlUOiJ3YWl0IixOT0NVUlNPUjoidXJsKCdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFQLy8vd0FBQUNINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQ1JBRUFPdz09JyksIGF1dG8iLERJU0FCTEVfT1BFTkdMXzJYX1NNT09USDoxLEVOQUJMRV9PUEVOR0xfMlhfU01PT1RIOi0xLEVOQUJMRV9PUEVOR0xfNFhfU01PT1RIOjIsRU5BQkxFX05BVElWRV9GT05UUzozLERJU0FCTEVfREVQVEhfVEVTVDo0LEVOQUJMRV9ERVBUSF9URVNUOi00LEVOQUJMRV9ERVBUSF9TT1JUOjUsRElTQUJMRV9ERVBUSF9TT1JUOi01LERJU0FCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVDo2LEVOQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUOi02LEVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUzo3LERJU0FCTEVfQUNDVVJBVEVfVEVYVFVSRVM6LTcsSElOVF9DT1VOVDoxMCxTSU5DT1NfTEVOR1RIOjcyMCxQUkVDSVNJT05COjE1LFBSRUNJU0lPTkY6MzI3NjgsUFJFQ19NQVhWQUw6MzI3NjcsUFJFQ19BTFBIQV9TSElGVDo5LFBSRUNfUkVEX1NISUZUOjEsTk9STUFMX01PREVfQVVUTzowLE5PUk1BTF9NT0RFX1NIQVBFOjEsTk9STUFMX01PREVfVkVSVEVYOjIsTUFYX0xJR0hUUzo4fX0se31dLDU6W2Z1bmN0aW9uKGUsbixyKXtuLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIG49e0J1ZmZlck1heDoyMDB9LHI9ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGk9ITEKcmV0dXJuIHIudGV4dENvbnRlbnQ9WyIucGpzY29uc29sZS5oaWRkZW4geyIsIiAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7IiwifSJdLmpvaW4oIlxuIiksbi53cmFwcGVyPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksci50ZXh0Q29udGVudCs9WyIiLCIucGpzY29uc29sZSB7IiwiICBvcGFjaXR5OiAuNzU7IiwiICBkaXNwbGF5OiBibG9jazsiLCIgIHBvc2l0aW9uOiBmaXhlZDsiLCIgIGJvdHRvbTogMHB4OyIsIiAgbGVmdDogMHB4OyIsIiAgcmlnaHQ6IDBweDsiLCIgIGhlaWdodDogNTBweDsiLCIgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7IiwifSJdLmpvaW4oIlxuIiksbi53cmFwcGVyLmNsYXNzTGlzdC5hZGQoInBqc2NvbnNvbGUiKSxuLmRyYWdnZXI9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLnRleHRDb250ZW50Kz1bIiIsIi5wanNjb25zb2xlIC5kcmFnZ2VyIHsiLCIgIGRpc3BsYXk6IGJsb2NrOyIsIiAgYm9yZGVyOiAzcHggYmxhY2sgcmFpc2VkOyIsIiAgY3Vyc29yOiBuLXJlc2l6ZTsiLCIgIHBvc2l0aW9uOiBhYnNvbHV0ZTsiLCIgIHRvcDogMHB4OyIsIiAgbGVmdDogMHB4OyIsIiAgcmlnaHQ6IDBweDsiLCIgIGhlaWdodDogNXB4OyIsIiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsiLCJ9Il0uam9pbigiXG4iKSxuLmRyYWdnZXIuY2xhc3NMaXN0LmFkZCgiZHJhZ2dlciIpLG4uY2xvc2VyPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksci50ZXh0Q29udGVudCs9WyIiLCIucGpzY29uc29sZSAuY2xvc2VyIHsiLCIgIG9wYWNpdHk6IC41OyIsIiAgZGlzcGxheTogYmxvY2s7IiwiICBib3JkZXI6IDNweCBibGFjayByYWlzZWQ7IiwiICBwb3NpdGlvbjogYWJzb2x1dGU7IiwiICB0b3A6IDEwcHg7IiwiICByaWdodDogMzBweDsiLCIgIGhlaWdodDogMjBweDsiLCIgIHdpZHRoOiAyMHB4OyIsIiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsiLCIgIGNvbG9yOiAjMDAwOyIsIiAgbGluZS1oZWlnaHQ6IDIwcHg7IiwiICB0ZXh0LWFsaWduOiBjZW50ZXI7IiwiICBjdXJzb3I6IHBvaW50ZXIiLCJ9Il0uam9pbigiXG4iKSxuLmNsb3Nlci5jbGFzc0xpc3QuYWRkKCJjbG9zZXIiKSxuLmNsb3Nlci5pbm5lckhUTUw9IiYjMTAwMDY7IixuLmphdmFjb25zb2xlPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksci50ZXh0Q29udGVudCs9WyIiLCIucGpzY29uc29sZSAuY29uc29sZSB7IiwiICBvdmVyZmxvdy14OiBhdXRvOyIsIiAgZGlzcGxheTogYmxvY2s7IiwiICBwb3NpdGlvbjogYWJzb2x1dGU7IiwiICBsZWZ0OiAxMHB4OyIsIiAgcmlnaHQ6IDBweDsiLCIgIGJvdHRvbTogNXB4OyIsIiAgdG9wOiAxMHB4OyIsIiAgb3ZlcmZsb3cteTogc2Nyb2xsOyIsIiAgaGVpZ2h0OiA0MHB4OyIsIn0iXS5qb2luKCJcbiIpLG4uamF2YWNvbnNvbGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsImNvbnNvbGUiKSxuLndyYXBwZXIuYXBwZW5kQ2hpbGQobi5kcmFnZ2VyKSxuLndyYXBwZXIuYXBwZW5kQ2hpbGQobi5qYXZhY29uc29sZSksbi53cmFwcGVyLmFwcGVuZENoaWxkKG4uY2xvc2VyKSxuLmRyYWdnZXIub25tb3VzZWRvd249ZnVuY3Rpb24odCl7bi5kaXZoZWlnaHQ9bi53cmFwcGVyLnN0eWxlLmhlaWdodCxlLnNlbGVjdGlvbj9lLnNlbGVjdGlvbi5lbXB0eSgpOndpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKQp2YXIgcj10LnNjcmVlblkKd2luZG93Lm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGUpe24ud3JhcHBlci5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChuLmRpdmhlaWdodCkrKHItZS5zY3JlZW5ZKSsicHgiLG4uamF2YWNvbnNvbGUuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobi5kaXZoZWlnaHQpKyhyLWUuc2NyZWVuWSktMTArInB4In0sd2luZG93Lm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnNlbGVjdGlvbj9lLnNlbGVjdGlvbi5lbXB0eSgpOndpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKSxuLndyYXBwZXIuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobi5kaXZoZWlnaHQpKyhyLXQuc2NyZWVuWSkrInB4IixuLmphdmFjb25zb2xlLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KG4uZGl2aGVpZ2h0KSsoci10LnNjcmVlblkpLTEwKyJweCIsd2luZG93Lm9ubW91c2Vtb3ZlPW51bGwsd2luZG93Lm9ubW91c2V1cD1udWxsfX0sbi5CdWZmZXJBcnJheT1bXSxuLnByaW50PW4ubG9nPWZ1bmN0aW9uKCl7aXx8KGUuYm9keS5hcHBlbmRDaGlsZChyKSxlLmJvZHkuYXBwZW5kQ2hpbGQobi53cmFwcGVyKSxpPSEwKQp2YXIgcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpCnQ9cy5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSsodCsxPT09cy5sZW5ndGg/IiI6IiAiKX0pLmpvaW4oIiIpLG4uQnVmZmVyQXJyYXlbbi5CdWZmZXJBcnJheS5sZW5ndGgtMV0/bi5CdWZmZXJBcnJheVtuLkJ1ZmZlckFycmF5Lmxlbmd0aC0xXSs9dCsiIjpuLkJ1ZmZlckFycmF5LnB1c2godCksbi5qYXZhY29uc29sZS5pbm5lckhUTUw9bi5CdWZmZXJBcnJheS5qb2luKCIiKSxuLnNob3djb25zb2xlKCl9LG4ucHJpbnRsbj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKZS5wdXNoKCI8YnI+Iiksbi5wcmludC5hcHBseShuLGUpLG4uQnVmZmVyQXJyYXkubGVuZ3RoPm4uQnVmZmVyTWF4P24uQnVmZmVyQXJyYXkuc3BsaWNlKDAsMSk6bi5qYXZhY29uc29sZS5zY3JvbGxUb3A9bi5qYXZhY29uc29sZS5zY3JvbGxIZWlnaHR9LG4uc2hvd2NvbnNvbGU9ZnVuY3Rpb24oKXtuLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIil9LG4uaGlkZWNvbnNvbGU9ZnVuY3Rpb24oKXtuLndyYXBwZXIuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9LG4uY2xvc2VyLm9uY2xpY2s9ZnVuY3Rpb24oKXtuLmhpZGVjb25zb2xlKCl9LG4uaGlkZWNvbnNvbGUoKSxufX0se31dLDY6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBuKGUsdCxuKXtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGVbdF0pcmV0dXJuIHZvaWQoZVt0XT1uKQp2YXIgcj1lW3RdCmlmKCIkb3ZlcmxvYWRzImluIHIpcmV0dXJuIHZvaWQoci4kZGVmYXVsdE92ZXJsb2FkPW4pCmlmKCIkb3ZlcmxvYWRzImluIG58fHIubGVuZ3RoIT09bi5sZW5ndGgpe3ZhciBpLHMKIiRvdmVybG9hZHMiaW4gbj8oaT1uLiRvdmVybG9hZHMuc2xpY2UoMCksaVtyLmxlbmd0aF09cixzPW4uJGRlZmF1bHRPdmVybG9hZCk6KGk9W10saVtuLmxlbmd0aF09bixpW3IubGVuZ3RoXT1yLHM9cikKdmFyIG89ZnVuY3Rpb24oKXt2YXIgZT1vLiRvdmVybG9hZHNbYXJndW1lbnRzLmxlbmd0aF18fCgiJG1ldGhvZEFyZ3NJbmRleCJpbiBvJiZhcmd1bWVudHMubGVuZ3RoPm8uJG1ldGhvZEFyZ3NJbmRleD9vLiRvdmVybG9hZHNbby4kbWV0aG9kQXJnc0luZGV4XTpudWxsKXx8by4kZGVmYXVsdE92ZXJsb2FkCnJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0Kby4kb3ZlcmxvYWRzPWksIiRtZXRob2RBcmdzSW5kZXgiaW4gbiYmKG8uJG1ldGhvZEFyZ3NJbmRleD1uLiRtZXRob2RBcmdzSW5kZXgpLG8uJGRlZmF1bHRPdmVybG9hZD1zLG8ubmFtZT10LGVbdF09b319ZnVuY3Rpb24gcihlLHQpe2Z1bmN0aW9uIHIobil7cy5kZWZpbmVQcm9wZXJ0eShlLG4se2dldDpmdW5jdGlvbigpe3JldHVybiB0W25dfSxzZXQ6ZnVuY3Rpb24oZSl7dFtuXT1lfSxlbnVtZXJhYmxlOiEwfSl9dmFyIGk9W10KZm9yKHZhciBvIGluIHQpImZ1bmN0aW9uIj09dHlwZW9mIHRbb10/bihlLG8sdFtvXSk6IiQiPT09by5jaGFyQXQoMCl8fG8gaW4gZXx8aS5wdXNoKG8pCmZvcig7aS5sZW5ndGg+MDspcihpLnNoaWZ0KCkpCmUuJHN1cGVyPXR9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJlsiYnl0ZSIsImludCIsImNoYXIiLCJjb2xvciIsImZsb2F0IiwibG9uZyIsImRvdWJsZSJdLmluZGV4T2YoZSkhPT0tMX10LnByb3RvdHlwZT1lLlBDb25zdGFudHMKdmFyIHM9bmV3IHQKcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7c1t0XT1lW3RdfSkscy5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbihlLHQsbil7ImRlZmluZVByb3BlcnR5ImluIE9iamVjdD9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LG4pOihuLmhhc093blByb3BlcnR5KCJnZXQiKSYmZS5fX2RlZmluZUdldHRlcl9fKHQsbi5nZXQpLG4uaGFzT3duUHJvcGVydHkoInNldCIpJiZlLl9fZGVmaW5lU2V0dGVyX18odCxuLnNldCkpfSxzLmV4dGVuZENsYXNzQ2hhaW49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtlXSxuPWUuJHVwY2FzdDtuO249bi4kdXBjYXN0KXIobixlKSx0LnB1c2gobiksZT1uCmZvcig7dC5sZW5ndGg+MDspdC5wb3AoKS4kc2VsZj1lfSxzLmV4dGVuZFN0YXRpY01lbWJlcnM9ZnVuY3Rpb24oZSx0KXtyKGUsdCl9LHMuZXh0ZW5kSW50ZXJmYWNlTWVtYmVycz1mdW5jdGlvbihlLHQpe3IoZSx0KX0scy5hZGRNZXRob2Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZVt0XQppZihpfHxyKXt2YXIgcz1uLmxlbmd0aAppZigiJG92ZXJsb2FkcyJpbiBpKWkuJG92ZXJsb2Fkc1tzXT1uCmVsc2V7dmFyIG89ZnVuY3Rpb24oKXt2YXIgZT1vLiRvdmVybG9hZHNbYXJndW1lbnRzLmxlbmd0aF18fCgiJG1ldGhvZEFyZ3NJbmRleCJpbiBvJiZhcmd1bWVudHMubGVuZ3RoPm8uJG1ldGhvZEFyZ3NJbmRleD9vLiRvdmVybG9hZHNbby4kbWV0aG9kQXJnc0luZGV4XTpudWxsKXx8by4kZGVmYXVsdE92ZXJsb2FkCnJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT1bXQppJiYoYVtpLmxlbmd0aF09aSksYVtzXT1uLG8uJG92ZXJsb2Fkcz1hLG8uJGRlZmF1bHRPdmVybG9hZD1pfHxuLHImJihvLiRtZXRob2RBcmdzSW5kZXg9cyksby5uYW1lPXQsZVt0XT1vfX1lbHNlIGVbdF09bn0scy5jcmVhdGVKYXZhQXJyYXk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9bnVsbAppZigic3RyaW5nIj09dHlwZW9mIGUmJigiYm9vbGVhbiI9PT1lP3I9ITE6aShlKSYmKHI9MCkpLCJudW1iZXIiPT10eXBlb2YgdFswXSl7dmFyIG89MHx0WzBdCmlmKHQubGVuZ3RoPD0xKXtuPVtdLG4ubGVuZ3RoPW8KZm9yKHZhciBhPTA7YTxvOysrYSluW2FdPXJ9ZWxzZXtuPVtdCmZvcih2YXIgbD10LnNsaWNlKDEpLGg9MDtoPG87KytoKW4ucHVzaChzLmNyZWF0ZUphdmFBcnJheShlLGwpKX19cmV0dXJuIG59LHMuZGVmaW5lUHJvcGVydHkocywic2NyZWVuV2lkdGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmlubmVyV2lkdGh9fSkscy5kZWZpbmVQcm9wZXJ0eShzLCJzY3JlZW5IZWlnaHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmlubmVySGVpZ2h0fX0pLHN9fSx7fV0sNzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dC53aW5kb3csaT10LmRvY3VtZW50LHM9ci5YTUxIdHRwUmVxdWVzdCxvPXQubm9vcCxhPXQuaXNET01QcmVzZW50LGg9dC52ZXJzaW9uCmUudmVyc2lvbj1oP2g6IkBERVYtVkVSU0lPTkAiLGUubGliPXt9LGUucmVnaXN0ZXJMaWJyYXJ5PWZ1bmN0aW9uKHQsbil7ZS5saWJbdF09bixuLmhhc093blByb3BlcnR5KCJpbml0IikmJm4uaW5pdChkZWZhdWx0U2NvcGUpfSxlLlNrZXRjaD1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaEZ1bmN0aW9uPWUsdGhpcy5vcHRpb25zPXtwYXVzZU9uQmx1cjohMSxnbG9iYWxLZXlFdmVudHM6ITF9LHRoaXMub25Mb2FkPW8sdGhpcy5vblNldHVwPW8sdGhpcy5vblBhdXNlPW8sdGhpcy5vbkxvb3A9byx0aGlzLm9uRnJhbWVTdGFydD1vLHRoaXMub25GcmFtZUVuZD1vLHRoaXMub25FeGl0PW8sdGhpcy5wYXJhbXM9e30sdGhpcy5pbWFnZUNhY2hlPXtwZW5kaW5nOjAsaW1hZ2VzOnt9LG9wZXJhQ2FjaGU6e30sYWRkOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuaW1hZ2VzW2VdJiYoYXx8KHRoaXMuaW1hZ2VzW2VdPW51bGwpLHR8fCh0PW5ldyBJbWFnZSx0Lm9ubG9hZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtlLnBlbmRpbmctLX19KHRoaXMpLHRoaXMucGVuZGluZysrLHQuc3JjPWUpLHRoaXMuaW1hZ2VzW2VdPXQsci5vcGVyYSkpe3ZhciBuPWkuY3JlYXRlRWxlbWVudCgiZGl2IikKbi5hcHBlbmRDaGlsZCh0KSxuLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbi5zdHlsZS5vcGFjaXR5PTAsbi5zdHlsZS53aWR0aD0iMXB4IixuLnN0eWxlLmhlaWdodD0iMXB4Iix0aGlzLm9wZXJhQ2FjaGVbZV18fChpLmJvZHkuYXBwZW5kQ2hpbGQobiksdGhpcy5vcGVyYUNhY2hlW2VdPW4pfX19LHRoaXMuc291cmNlQ29kZT12b2lkIDAsdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYXR0YWNoRnVuY3Rpb24pdGhpcy5hdHRhY2hGdW5jdGlvbihlKQplbHNle2lmKCF0aGlzLnNvdXJjZUNvZGUpdGhyb3ciVW5hYmxlIHRvIGF0dGFjaCBza2V0Y2ggdG8gdGhlIHByb2Nlc3NpbmcgaW5zdGFuY2UiCnZhciB0PW5ldyBGdW5jdGlvbigicmV0dXJuICgiK3RoaXMuc291cmNlQ29kZSsiKTsiKSgpCnQoZSksdGhpcy5hdHRhY2hGdW5jdGlvbj10fX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlLHQ9IigoZnVuY3Rpb24oU2tldGNoKSB7XG4iCnQrPSJ2YXIgc2tldGNoID0gbmV3IFNrZXRjaChcbiIrdGhpcy5zb3VyY2VDb2RlKyIpO1xuIgpmb3IoZSBpbiB0aGlzLm9wdGlvbnMpaWYodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KGUpKXt2YXIgbj10aGlzLm9wdGlvbnNbZV0KdCs9InNrZXRjaC5vcHRpb25zLiIrZSsiID0gIisoInN0cmluZyI9PXR5cGVvZiBuPyciJytuKyciJzoiIituKSsiO1xuIn1mb3IoZSBpbiB0aGlzLmltYWdlQ2FjaGUpdGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KGUpJiYodCs9J3NrZXRjaC5pbWFnZUNhY2hlLmFkZCgiJytlKyciKTtcbicpCnJldHVybiB0Kz0icmV0dXJuIHNrZXRjaDtcbn0pKFByb2Nlc3NpbmcuU2tldGNoKSkifX0KdmFyIHU9ZS5sb2FkU2tldGNoRnJvbVNvdXJjZXM9ZnVuY3Rpb24odCxuLG8pe2Z1bmN0aW9uIGEoZSx0KXt2YXIgbj1uZXcgcwpuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKDQ9PT1uLnJlYWR5U3RhdGUpe3ZhciBlCjIwMCE9PW4uc3RhdHVzJiYwIT09bi5zdGF0dXM/ZT0iSW52YWxpZCBYSFIgc3RhdHVzICIrbi5zdGF0dXM6IiI9PT1uLnJlc3BvbnNlVGV4dCYmKGU9IndpdGhDcmVkZW50aWFscyJpbiBuZXcgcyYmKG5ldyBzKS53aXRoQ3JlZGVudGlhbHM9PT0hMSYmImZpbGU6Ij09PXIubG9jYXRpb24ucHJvdG9jb2w/IlhNTEh0dHBSZXF1ZXN0IGZhaWx1cmUsIHBvc3NpYmx5IGR1ZSB0byBhIHNhbWUtb3JpZ2luIHBvbGljeSB2aW9sYXRpb24uIFlvdSBjYW4gdHJ5IGxvYWRpbmcgdGhpcyBwYWdlIGluIGFub3RoZXIgYnJvd3Nlciwgb3IgbG9hZCBpdCBmcm9tIGh0dHA6Ly9sb2NhbGhvc3QgdXNpbmcgYSBsb2NhbCB3ZWJzZXJ2ZXIuIFNlZSB0aGUgUHJvY2Vzc2luZy5qcyBSRUFETUUgZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHByb2JsZW0gYW5kIHNvbHV0aW9ucy4iOiJGaWxlIGlzIGVtcHR5LiIpLHQobi5yZXNwb25zZVRleHQsZSl9fSxuLm9wZW4oIkdFVCIsZSwhMCksbi5vdmVycmlkZU1pbWVUeXBlJiZuLm92ZXJyaWRlTWltZVR5cGUoImFwcGxpY2F0aW9uL2pzb24iKSxuLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwiRnJpLCAwMSBKYW4gMTk2MCAwMDowMDowMCBHTVQiKSxuLnNlbmQobnVsbCl9ZnVuY3Rpb24gbChuLHIpe2Z1bmN0aW9uIHMoaSxzKXtpZihoW25dPWksKytmLHMmJnUucHVzaChyKyIgPT0+ICIrcyksZj09PWMpe2lmKDAhPT11Lmxlbmd0aCl0aHJvdyJQcm9jZXNzaW5nLmpzOiBVbmFibGUgdG8gbG9hZCBwanMgc2tldGNoIGZpbGVzOiAiK3Uuam9pbigiXG4iKQp2YXIgYT1uZXcgZSh0LGguam9pbigiXG4iKSkKbyYmbyhhKX19aWYoIiMiPT09ci5jaGFyQXQoMCkpe3ZhciBsPWkuZ2V0RWxlbWVudEJ5SWQoci5zdWJzdHJpbmcoMSkpCnJldHVybiB2b2lkKGw/cyhsLnRleHR8fGwudGV4dENvbnRlbnQpOnMoIiIsIlVuYWJsZSB0byBsb2FkIHBqcyBza2V0Y2g6IGVsZW1lbnQgd2l0aCBpZCAnIityLnN1YnN0cmluZygxKSsiJyB3YXMgbm90IGZvdW5kIikpfWEocixzKX1mb3IodmFyIGg9W10sdT1bXSxjPW4ubGVuZ3RoLGY9MCxwPTA7cDxjOysrcClsKHAsbltwXSl9LGM9ZnVuY3Rpb24oKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGMsITEpCmZvcih2YXIgdDtlLmluc3RhbmNlcy5sZW5ndGg+MDspZm9yKHQ9ZS5pbnN0YW5jZXMubGVuZ3RoLTE7dD49MDt0LS0pZS5pbnN0YW5jZXNbdF0mJmUuaW5zdGFuY2VzW3RdLmV4aXQoKQp2YXIgcixzPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNhbnZhcyIpCmZvcih0PTAsbD1zLmxlbmd0aDt0PGw7dCsrKXt2YXIgbz1zW3RdLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9jZXNzaW5nLXNvdXJjZXMiKQppZihudWxsPT09byYmKG89c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjIiksbnVsbD09PW8mJihvPXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhc3JjIikpKSxvKXtyPW8uc3BsaXQoL1xzKy9nKQpmb3IodmFyIGE9MDthPHIubGVuZ3RoOylyW2FdP2ErKzpyLnNwbGljZShhLDEpCnUoc1t0XSxyKX19dmFyIGgsZixwLG0sZz1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxkPVtdCmZvcihoPWcubGVuZ3RoLTE7aD49MDtoLS0pZC5wdXNoKGdbaF0pCmZvcihoPTAsZj1kLmxlbmd0aDtoPGY7aCsrKXt2YXIgdj1kW2hdCmlmKHYuZ2V0QXR0cmlidXRlKXt2YXIgeT12LmdldEF0dHJpYnV0ZSgidHlwZSIpCmlmKHkmJigidGV4dC9wcm9jZXNzaW5nIj09PXkudG9Mb3dlckNhc2UoKXx8ImFwcGxpY2F0aW9uL3Byb2Nlc3NpbmciPT09eS50b0xvd2VyQ2FzZSgpKSl7dmFyIHg9di5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvY2Vzc2luZy10YXJnZXQiKQppZihzPW4seClzPWkuZ2V0RWxlbWVudEJ5SWQoeCkKZWxzZXtmb3IodmFyIEE9di5uZXh0U2libGluZztBJiYxIT09QS5ub2RlVHlwZTspQT1BLm5leHRTaWJsaW5nCkEmJiJjYW52YXMiPT09QS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYocz1BKX1pZihzKXtpZih2LmdldEF0dHJpYnV0ZSgic3JjIikpe3I9di5nZXRBdHRyaWJ1dGUoInNyYyIpLnNwbGl0KC9ccysvKSx1KHMscikKY29udGludWV9cD12LnRleHRDb250ZW50fHx2LnRleHQsbT1uZXcgZShzLHApfX19fX0KcmV0dXJuIGkuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYywhMSksZS5yZWxvYWQ9YyxlLmRpc2FibGVJbml0PWZ1bmN0aW9uKCl7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixjLCExKX0sZX19LHt9XSw4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PT1lfHxudWxsPT09dD9udWxsPT09ZSYmbnVsbD09PXQ6InN0cmluZyI9PXR5cGVvZiBlP2U9PT10OiJvYmplY3QiIT10eXBlb2YgZT9lPT09dDplLmVxdWFscyBpbnN0YW5jZW9mIEZ1bmN0aW9uP2UuZXF1YWxzKHQpOmU9PT10fX0se31dLDk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2Zvcih2YXIgbj0wLHI9MDtyPGUubGVuZ3RoOysrciluPTMxKm4rZS5jaGFyQ29kZUF0KHIpJjQyOTQ5NjcyOTUKcmV0dXJuIG59cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBlPzQyOTQ5NjcyOTUmZTplLmhhc2hDb2RlIGluc3RhbmNlb2YgRnVuY3Rpb24/ZS5oYXNoQ29kZSgpOihlLiRpZD09PXQmJihlLiRpZD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpLTMyNzY4PDwxNnxNYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpKSxlLiRpZCl9fSx7fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXt2YXIgdD0tMQp0aGlzLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdCsxPGUubGVuZ3RofSx0aGlzLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZVsrK3RdfSx0aGlzLnJlbW92ZT1mdW5jdGlvbigpe2Uuc3BsaWNlKHQtLSwxKX19ZnVuY3Rpb24gbihlKXt2YXIgaT1bXQplJiZlLnRvQXJyYXkmJihpPWUudG9BcnJheSgpKSx0aGlzLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXX0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbmRleE9mKGUpPi0xfSx0aGlzLmluZGV4T2Y9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1pLmxlbmd0aDt0PG47Kyt0KWlmKHIoZSxpW3RdKSlyZXR1cm4gdApyZXR1cm4tMX0sdGhpcy5sYXN0SW5kZXhPZj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9aS5sZW5ndGgtMTt0Pj0wOy0tdClpZihyKGUsaVt0XSkpcmV0dXJuIHQKcmV0dXJuLTF9LHRoaXMuYWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpaS5wdXNoKGFyZ3VtZW50c1swXSkKZWxzZXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyJQbGVhc2UgdXNlIHRoZSBwcm9wZXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIgp2YXIgZT1hcmd1bWVudHNbMF0KaWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IHR5cGVvZiBlKyIgaXMgbm90IGEgbnVtYmVyIgppZighKGU+PTAmJmU8PWkubGVuZ3RoKSl0aHJvdyBlKyIgaXMgbm90IGEgdmFsaWQgaW5kZXgiCmkuc3BsaWNlKGUsMCxhcmd1bWVudHNbMV0pfX0sdGhpcy5hZGRBbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbgppZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKGU8MHx8ZT5pLmxlbmd0aCl0aHJvdyJJbmRleCBvdXQgb2YgYm91bmRzIGZvciBhZGRBbGw6ICIrZSsiIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAiK2kubGVuZ3RoCmZvcihuPW5ldyBPYmplY3RJdGVyYXRvcih0KTtuLmhhc05leHQoKTspaS5zcGxpY2UoZSsrLDAsbi5uZXh0KCkpfWVsc2UgZm9yKG49bmV3IE9iamVjdEl0ZXJhdG9yKGUpO24uaGFzTmV4dCgpOylpLnB1c2gobi5uZXh0KCkpfSx0aGlzLnNldD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IlBsZWFzZSB1c2UgdGhlIHByb3BlciBudW1iZXIgb2YgcGFyYW1ldGVycy4iCnZhciBlPWFyZ3VtZW50c1swXQppZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgdHlwZW9mIGUrIiBpcyBub3QgYSBudW1iZXIiCmlmKCEoZT49MCYmZTxpLmxlbmd0aCkpdGhyb3cgZSsiIGlzIG5vdCBhIHZhbGlkIGluZGV4LiIKaS5zcGxpY2UoZSwxLGFyZ3VtZW50c1sxXSl9LHRoaXMuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBpLmxlbmd0aH0sdGhpcy5jbGVhcj1mdW5jdGlvbigpe2kubGVuZ3RoPTB9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9pLnNwbGljZShlLDEpWzBdOihlPXRoaXMuaW5kZXhPZihlKSxlPi0xJiYoaS5zcGxpY2UoZSwxKSwhMCkpfSx0aGlzLnJlbW92ZUFsbD1mdW5jdGlvbihlKXt2YXIgdCxyLGkscz1uZXcgbgpmb3Iocy5hZGRBbGwodGhpcyksdGhpcy5jbGVhcigpLHQ9MCxyPTA7dDxzLnNpemUoKTt0KyspaT1zLmdldCh0KSxlLmNvbnRhaW5zKGkpfHx0aGlzLmFkZChyKyssaSkKcmV0dXJuIHRoaXMuc2l6ZSgpPHMuc2l6ZSgpfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4haS5sZW5ndGh9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9LHRoaXMudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBpLnNsaWNlKDApfSx0aGlzLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KGkpfX12YXIgcj0oZS52aXJ0SGFzaENvZGUsZS52aXJ0RXF1YWxzKQpyZXR1cm4gbn19LHt9XSwxMTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKHIpe3JldHVybiJzdHJpbmciPT10eXBlb2YgciYmMT09PXIubGVuZ3RoP3RoaXMuY29kZT1yLmNoYXJDb2RlQXQoMCk6Im51bWJlciI9PXR5cGVvZiByP3RoaXMuY29kZT1yOnIgaW5zdGFuY2VvZiBuP3RoaXMuY29kZT1yOnRoaXMuY29kZT1OYU4sZVt0aGlzLmNvZGVdPT09dD9lW3RoaXMuY29kZV09dGhpczplW3RoaXMuY29kZV19CnJldHVybiBuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY29kZSl9LG4ucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2RlfSxufSh7fSl9LHt9XSwxMjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7ZnVuY3Rpb24gZShlKXt2YXIgdD1uKGUpJXUubGVuZ3RoCnJldHVybiB0PDA/dS5sZW5ndGgrdDp0fWZ1bmN0aW9uIGkoKXtpZighKGM8PWgqdS5sZW5ndGgpKXtmb3IodmFyIHQ9W10sbj0wO248dS5sZW5ndGg7KytuKXZvaWQgMCE9PXVbbl0mJih0PXQuY29uY2F0KHVbbl0pKQp2YXIgcj0yKnUubGVuZ3RoCnU9W10sdS5sZW5ndGg9cgpmb3IodmFyIGk9MDtpPHQubGVuZ3RoOysraSl7dmFyIHM9ZSh0W2ldLmtleSksbz11W3NdCnZvaWQgMD09PW8mJih1W3NdPW89W10pLG8ucHVzaCh0W2ldKX19fWZ1bmN0aW9uIHMoZSx0KXtmdW5jdGlvbiBuKCl7Zm9yKDshbzspaWYoKytzLGk+PXUubGVuZ3RoKW89ITAKZWxzZXtpZighKHZvaWQgMD09PXVbaV18fHM+PXVbaV0ubGVuZ3RoKSlyZXR1cm4Kcz0tMSwrK2l9fXZhciByLGk9MCxzPS0xLG89ITEKdGhpcy5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIW99LHRoaXMubmV4dD1mdW5jdGlvbigpe3JldHVybiByPWUodVtpXVtzXSksbigpLHJ9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKCl7dm9pZCAwIT09ciYmKHQociksLS1zLG4oKSl9LG4oKX1mdW5jdGlvbiBvKGUsdCxuKXt0aGlzLmNsZWFyPWZ1bmN0aW9uKCl7Zi5jbGVhcigpfSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfSx0aGlzLmNvbnRhaW5zQWxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KWlmKCF0aGlzLmNvbnRhaW5zKHQubmV4dCgpKSlyZXR1cm4hMQpyZXR1cm4hMH0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGYuaXNFbXB0eSgpfSx0aGlzLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzKGUsbil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5jb250YWlucyhlKSYmKG4oZSksITApfSx0aGlzLnJlbW92ZUFsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5pdGVyYXRvcigpLHI9ITE7dC5oYXNOZXh0KCk7KXt2YXIgaT10Lm5leHQoKQp0aGlzLmNvbnRhaW5zKGkpJiYobihpKSxyPSEwKX1yZXR1cm4hMH0sdGhpcy5yZXRhaW5BbGw9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKSxyPVtdO3QuaGFzTmV4dCgpOyl7dmFyIGk9dC5uZXh0KCkKZS5jb250YWlucyhpKXx8ci5wdXNoKGkpfWZvcih2YXIgcz0wO3M8ci5sZW5ndGg7KytzKW4ocltzXSkKcmV0dXJuIHIubGVuZ3RoPjB9LHRoaXMuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBmLnNpemUoKX0sdGhpcy50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9dGhpcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyllLnB1c2godC5uZXh0KCkpCnJldHVybiBlfX1mdW5jdGlvbiBhKGUpe3RoaXMuX2lzSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1mJiZ2b2lkIDA9PT1lLnJlbW92ZWR9LHRoaXMuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiByKGUua2V5LHQuZ2V0S2V5KCkpfSx0aGlzLmdldEtleT1mdW5jdGlvbigpe3JldHVybiBlLmtleX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBlLnZhbHVlfSx0aGlzLmhhc2hDb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuKGUua2V5KX0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbih0KXt2YXIgbj1lLnZhbHVlCnJldHVybiBlLnZhbHVlPXQsbn19aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdClyZXR1cm4gYXJndW1lbnRzWzBdLmNsb25lKCkKdmFyIGw9YXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXToxNixoPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06Ljc1LHU9W10KdS5sZW5ndGg9bAp2YXIgYz0wLGY9dGhpcwp0aGlzLmNsZWFyPWZ1bmN0aW9uKCl7Yz0wLHU9W10sdS5sZW5ndGg9bH0sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPW5ldyB0CnJldHVybiBlLnB1dEFsbCh0aGlzKSxlfSx0aGlzLmNvbnRhaW5zS2V5PWZ1bmN0aW9uKHQpe3ZhciBuPWUodCksaT11W25dCmlmKHZvaWQgMD09PWkpcmV0dXJuITEKZm9yKHZhciBzPTA7czxpLmxlbmd0aDsrK3MpaWYocihpW3NdLmtleSx0KSlyZXR1cm4hMApyZXR1cm4hMX0sdGhpcy5jb250YWluc1ZhbHVlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dS5sZW5ndGg7Kyt0KXt2YXIgbj11W3RdCmlmKHZvaWQgMCE9PW4pZm9yKHZhciBpPTA7aTxuLmxlbmd0aDsrK2kpaWYocihuW2ldLnZhbHVlLGUpKXJldHVybiEwfXJldHVybiExfSx0aGlzLmVudHJ5U2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYShlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhJiZlLl9pc0luKGYpfSxmdW5jdGlvbihlKXtyZXR1cm4gZi5yZW1vdmUoZS5nZXRLZXkoKSl9KX0sdGhpcy5nZXQ9ZnVuY3Rpb24odCl7dmFyIG49ZSh0KSxpPXVbbl0KaWYodm9pZCAwPT09aSlyZXR1cm4gbnVsbApmb3IodmFyIHM9MDtzPGkubGVuZ3RoOysrcylpZihyKGlbc10ua2V5LHQpKXJldHVybiBpW3NdLnZhbHVlCnJldHVybiBudWxsfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWN9LHRoaXMua2V5U2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKGZ1bmN0aW9uKGUpe3JldHVybiBlLmtleX0sZnVuY3Rpb24oZSl7cmV0dXJuIGYuY29udGFpbnNLZXkoZSl9LGZ1bmN0aW9uKGUpe3JldHVybiBmLnJlbW92ZShlKX0pfSx0aGlzLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBuZXcgbyhmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZX0sZnVuY3Rpb24oZSl7cmV0dXJuIGYuY29udGFpbnNWYWx1ZShlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGYucmVtb3ZlQnlWYWx1ZShlKX0pfSx0aGlzLnB1dD1mdW5jdGlvbih0LG4pe3ZhciBzPWUodCksbz11W3NdCmlmKHZvaWQgMD09PW8pcmV0dXJuKytjLHVbc109W3trZXk6dCx2YWx1ZTpufV0saSgpLG51bGwKZm9yKHZhciBhPTA7YTxvLmxlbmd0aDsrK2EpaWYocihvW2FdLmtleSx0KSl7dmFyIGw9b1thXS52YWx1ZQpyZXR1cm4gb1thXS52YWx1ZT1uLGx9cmV0dXJuKytjLG8ucHVzaCh7a2V5OnQsdmFsdWU6bn0pLGkoKSxudWxsfSx0aGlzLnB1dEFsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgbj10Lm5leHQoKQp0aGlzLnB1dChuLmdldEtleSgpLG4uZ2V0VmFsdWUoKSl9fSx0aGlzLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgbj1lKHQpLGk9dVtuXQppZih2b2lkIDA9PT1pKXJldHVybiBudWxsCmZvcih2YXIgcz0wO3M8aS5sZW5ndGg7KytzKWlmKHIoaVtzXS5rZXksdCkpey0tYwp2YXIgbz1pW3NdLnZhbHVlCnJldHVybiBpW3NdLnJlbW92ZWQ9ITAsaS5sZW5ndGg+MT9pLnNwbGljZShzLDEpOnVbbl09dm9pZCAwLG99cmV0dXJuIG51bGx9LHRoaXMucmVtb3ZlQnlWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaQpmb3IodCBpbiB1KWlmKHUuaGFzT3duUHJvcGVydHkodCkpZm9yKG49MCxyPXVbdF0ubGVuZ3RoO248cjtuKyspaWYoaT11W3RdW25dLGkudmFsdWU9PT1lKXJldHVybiB1W3RdLnNwbGljZShuLDEpLCEwCnJldHVybiExfSx0aGlzLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gY319dmFyIG49ZS52aXJ0SGFzaENvZGUscj1lLnZpcnRFcXVhbHMKcmV0dXJuIHR9fSx7fV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3ZhciB0PTI1MCxuPWUuc2l6ZS90LHI9aS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKQpyLndpZHRoPTIqdCxyLmhlaWdodD0yKnQsci5zdHlsZS5vcGFjaXR5PTAKdmFyIG89ZS5nZXRDU1NEZWZpbml0aW9uKHQrInB4Iiwibm9ybWFsIiksYT1yLmdldENvbnRleHQoIjJkIikKYS5mb250PW8KdmFyIGw9ImRiZmxraHlqcXBnIgpyLndpZHRoPWEubWVhc3VyZVRleHQobCkud2lkdGgsYS5mb250PW8KdmFyIGg9aS5jcmVhdGVFbGVtZW50KCJkaXYiKQpoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS5vcGFjaXR5PTAsaC5zdHlsZS5mb250RmFtaWx5PSciJytlLm5hbWUrJyInLGguc3R5bGUuZm9udFNpemU9dCsicHgiLGguaW5uZXJIVE1MPWwrIjxici8+IitsLGkuYm9keS5hcHBlbmRDaGlsZChoKQp2YXIgdT1yLndpZHRoLGM9ci5oZWlnaHQsZj1jLzIKYS5maWxsU3R5bGU9IndoaXRlIixhLmZpbGxSZWN0KDAsMCx1LGMpLGEuZmlsbFN0eWxlPSJibGFjayIsYS5maWxsVGV4dChsLDAsZikKZm9yKHZhciBwPWEuZ2V0SW1hZ2VEYXRhKDAsMCx1LGMpLmRhdGEsbT0wLGc9NCp1LGQ9cC5sZW5ndGg7KyttPGQmJjI1NT09PXBbbV07KXMoKQp2YXIgdj1NYXRoLnJvdW5kKG0vZykKZm9yKG09ZC0xOy0tbT4wJiYyNTU9PT1wW21dOylzKCkKdmFyIHk9TWF0aC5yb3VuZChtL2cpCmlmKGUuYXNjZW50PW4qKGYtdiksZS5kZXNjZW50PW4qKHktZiksaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKXt2YXIgeD1pLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKQp4PW4qeC5yZXBsYWNlKCJweCIsIiIpLHg+PTIqZS5zaXplJiYoZS5sZWFkaW5nPU1hdGgucm91bmQoeC8yKSl9aWYoaS5ib2R5LnJlbW92ZUNoaWxkKGgpLGUuY2FjaGluZylyZXR1cm4gYX1mdW5jdGlvbiByKGUscil7ZT09PXQmJihlPSIiKSx0aGlzLm5hbWU9ZSxyPT09dCYmKHI9MCksdGhpcy5zaXplPXIsdGhpcy5nbHlwaD0hMSx0aGlzLmFzY2VudD0wLHRoaXMuZGVzY2VudD0wLHRoaXMubGVhZGluZz0xLjIqcgp2YXIgaT1lLmluZGV4T2YoIiBJdGFsaWMgQm9sZCIpCmkhPT0tMSYmKGU9ZS5zdWJzdHJpbmcoMCxpKSksdGhpcy5zdHlsZT0ibm9ybWFsIgp2YXIgcz1lLmluZGV4T2YoIiBJdGFsaWMiKQpzIT09LTEmJihlPWUuc3Vic3RyaW5nKDAscyksdGhpcy5zdHlsZT0iaXRhbGljIiksdGhpcy53ZWlnaHQ9Im5vcm1hbCIKdmFyIG89ZS5pbmRleE9mKCIgQm9sZCIpCmlmKG8hPT0tMSYmKGU9ZS5zdWJzdHJpbmcoMCxvKSx0aGlzLndlaWdodD0iYm9sZCIpLHRoaXMuZmFtaWx5PSJzYW5zLXNlcmlmIixlIT09dClzd2l0Y2goZSl7Y2FzZSJzYW5zLXNlcmlmIjpjYXNlInNlcmlmIjpjYXNlIm1vbm9zcGFjZSI6Y2FzZSJmYW50YXN5IjpjYXNlImN1cnNpdmUiOnRoaXMuZmFtaWx5PWUKYnJlYWsKZGVmYXVsdDp0aGlzLmZhbWlseT0nIicrZSsnIiwgc2Fucy1zZXJpZid9dGhpcy5jb250ZXh0MmQ9bih0aGlzKSx0aGlzLmNzcz10aGlzLmdldENTU0RlZmluaXRpb24oKSx0aGlzLmNvbnRleHQyZCYmKHRoaXMuY29udGV4dDJkLmZvbnQ9dGhpcy5jc3MpfXZhciBpPShlLkJyb3dzZXIud2luZG93LGUuQnJvd3Nlci5kb2N1bWVudCkscz1lLm5vb3AKcmV0dXJuIHIucHJvdG90eXBlLmNhY2hpbmc9ITAsci5wcm90b3R5cGUuZ2V0Q1NTRGVmaW5pdGlvbj1mdW5jdGlvbihlLG4pe2U9PT10JiYoZT10aGlzLnNpemUrInB4Iiksbj09PXQmJihuPXRoaXMubGVhZGluZysicHgiKQp2YXIgcj1bdGhpcy5zdHlsZSwibm9ybWFsIix0aGlzLndlaWdodCxlKyIvIituLHRoaXMuZmFtaWx5XQpyZXR1cm4gci5qb2luKCIgIil9LHIucHJvdG90eXBlLm1lYXN1cmVUZXh0V2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29udGV4dDJkLm1lYXN1cmVUZXh0KGUpLndpZHRofSxyLnByb3RvdHlwZS5tZWFzdXJlVGV4dFdpZHRoRmFsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxuPXQuZ2V0Q29udGV4dCgiMmQiKQpyZXR1cm4gbi5mb250PXRoaXMuY3NzLG4ubWVhc3VyZVRleHQoZSkud2lkdGh9LHIuUEZvbnRDYWNoZT17bGVuZ3RoOjB9LHIuZ2V0PWZ1bmN0aW9uKGUsdCl7dD0oMTAqdCsuNXwwKS8xMAp2YXIgbj1yLlBGb250Q2FjaGUsaT1lKyIvIit0CmlmKCFuW2ldKXtpZihuW2ldPW5ldyByKGUsdCksbi5sZW5ndGgrKyw1MD09PW4ubGVuZ3RoKXtyLnByb3RvdHlwZS5tZWFzdXJlVGV4dFdpZHRoPXIucHJvdG90eXBlLm1lYXN1cmVUZXh0V2lkdGhGYWxsYmFjayxyLnByb3RvdHlwZS5jYWNoaW5nPSExCnZhciBzCmZvcihzIGluIG4pImxlbmd0aCIhPT1zJiYobltzXS5jb250ZXh0MmQ9bnVsbCkKcmV0dXJuIG5ldyByKGUsdCl9aWYoNDAwPT09bi5sZW5ndGgpcmV0dXJuIHIuUEZvbnRDYWNoZT17fSxyLmdldD1yLmdldEZhbGxiYWNrLG5ldyByKGUsdCl9cmV0dXJuIG5baV19LHIuZ2V0RmFsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHIoZSx0KX0sci5saXN0PWZ1bmN0aW9uKCl7cmV0dXJuWyJzYW5zLXNlcmlmIiwic2VyaWYiLCJtb25vc3BhY2UiLCJmYW50YXN5IiwiY3Vyc2l2ZSJdfSxyLnByZWxvYWRpbmc9e3RlbXBsYXRlOnt9LGluaXRpYWxpemVkOiExLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPSIjRTNLQUkyd0FnVDFNdk1nN0VvM1ZtTnRZWDdBQmkzQ3huYkhsbTdBYncza2FHVmhaN0FDczNPR2hvWldFN0E1M0NSb2JYUjQ3QVkzQUdiRzlqWVE3RzAzQm0xaGVIN0FCQzNDQnVZVzFsN0FlM0FnY0c5emQ3QUkzQUUjQjNBUTJrZ1RZMThQUFBVQUN3QWczQUxTUm9vMyN5bGQweGczMlFBQjc3I0U3Nzc3NzNCI0UzQyNJI1E3Nzc3M0UjUTc3Nzc3Nzc3NzJDTUFJdzdBQjc3NzMyQiNNI1Ezd0FCI2czQiNFI0UyQkIvLzgyQkIvLy8vdyNCNyNnQUVnM0U3N3gyQjMyQiNFI1EjTVRjQkFRMzJnQWUjTSNRUUojRTMyTSNRUUojSSNnMzJRNzcjIix0PWZ1bmN0aW9uKGUpe3JldHVybiJBQUFBQUFBQSIuc3Vic3RyKH5+ZT83LWU6Nil9CnJldHVybiBlLnJlcGxhY2UoL1sjMjM3XS9nLHQpfSx0PWkuY3JlYXRlRWxlbWVudCgic3R5bGUiKQp0LnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvY3NzIiksdC5pbm5lckhUTUw9J0Bmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogIlBqc0VtcHR5Rm9udCI7XG4gIHNyYzogdXJsKFwnZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtdHRmO2Jhc2U2NCwnK2UoKSsiJylcbiAgICAgICBmb3JtYXQoJ3RydWV0eXBlJyk7XG59IixpLmhlYWQuYXBwZW5kQ2hpbGQodCkKdmFyIG49aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5zdHlsZS5jc3NUZXh0PSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMDA7IGxlZnQ6IDA7IG9wYWNpdHk6IDA7IGZvbnQtZmFtaWx5OiAiUGpzRW1wdHlGb250IiwgZmFudGFzeTsnLG4uaW5uZXJIVE1MPSJBQUFBQUFBQSIsaS5ib2R5LmFwcGVuZENoaWxkKG4pLHRoaXMudGVtcGxhdGU9bix0aGlzLmluaXRpYWxpemVkPSEwfSxnZXRFbGVtZW50V2lkdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlLCIiKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpfSx0aW1lQXR0ZW1wdGVkOjAscGVuZGluZzpmdW5jdGlvbihlKXt0aGlzLmluaXRpYWxpemVkfHx0aGlzLmluaXRpYWxpemUoKQpmb3IodmFyIHQsbixyPXRoaXMuZ2V0RWxlbWVudFdpZHRoKHRoaXMudGVtcGxhdGUpLHM9MDtzPHRoaXMuZm9udExpc3QubGVuZ3RoO3MrKyl7aWYodD10aGlzLmZvbnRMaXN0W3NdLG49dGhpcy5nZXRFbGVtZW50V2lkdGgodCksdGhpcy50aW1lQXR0ZW1wdGVkPDRlMyYmbj09PXIpcmV0dXJuIHRoaXMudGltZUF0dGVtcHRlZCs9ZSwhMAppLmJvZHkucmVtb3ZlQ2hpbGQodCksdGhpcy5mb250TGlzdC5zcGxpY2Uocy0tLDEpLHRoaXMudGltZUF0dGVtcHRlZD0wfXJldHVybiAwIT09dGhpcy5mb250TGlzdC5sZW5ndGh9LGZvbnRMaXN0OltdLGFkZGVkTGlzdDp7fSxhZGQ6ZnVuY3Rpb24oZSl7dGhpcy5pbml0aWFsaXplZHx8dGhpcy5pbml0aWFsaXplKCkKdmFyIHQ9Im9iamVjdCI9PXR5cGVvZiBlP2UuZm9udEZhY2U6ZSxuPSJvYmplY3QiPT10eXBlb2YgZT9lLnVybDplCmlmKCF0aGlzLmFkZGVkTGlzdFt0XSl7dmFyIHI9aS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpCnIuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxyLmlubmVySFRNTD0iQGZvbnQtZmFjZXtcbiAgZm9udC1mYW1pbHk6ICciK3QrIic7XG4gIHNyYzogIHVybCgnIituKyInKTtcbn1cbiIsaS5oZWFkLmFwcGVuZENoaWxkKHIpLHRoaXMuYWRkZWRMaXN0W3RdPSEwCnZhciBzPWkuY3JlYXRlRWxlbWVudCgic3BhbiIpCnMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IG9wYWNpdHk6IDA7IixzLnN0eWxlLmZvbnRGYW1pbHk9JyInK3QrJyIsICJQanNFbXB0eUZvbnQiLCBmYW50YXN5JyxzLmlubmVySFRNTD0iQUFBQUFBQUEiLGkuYm9keS5hcHBlbmRDaGlsZChzKSx0aGlzLmZvbnRMaXN0LnB1c2gocyl9fX0scn19LHt9XSwxNDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWUucCxyPWZ1bmN0aW9uKCl7MD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5yZXNldCgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/dGhpcy5zZXQoYXJndW1lbnRzWzBdLmFycmF5KCkpOjY9PT1hcmd1bWVudHMubGVuZ3RoJiZ0aGlzLnNldChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSl9CnJldHVybiByLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKCl7aWYoNj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50cwp0aGlzLnNldChbZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV1dKX1lbHNlIDE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/dGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uYXJyYXkoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKHRoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLnNsaWNlKCkpfSxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgcgpyZXR1cm4gZS5zZXQodGhpcy5lbGVtZW50cyksZX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnNldChbMSwwLDAsMCwxLDBdKX0sYXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5zbGljZSgpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLmVsZW1lbnRzWzJdPWUqdGhpcy5lbGVtZW50c1swXSt0KnRoaXMuZWxlbWVudHNbMV0rdGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzVdPWUqdGhpcy5lbGVtZW50c1szXSt0KnRoaXMuZWxlbWVudHNbNF0rdGhpcy5lbGVtZW50c1s1XX0saW52VHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2xhdGUoLWUsLXQpfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt9LG11bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyCnJldHVybiBlIGluc3RhbmNlb2YgUFZlY3Rvcj8obj1lLngscj1lLnksdHx8KHQ9bmV3IFBWZWN0b3IpKTplIGluc3RhbmNlb2YgQXJyYXkmJihuPWVbMF0scj1lWzFdLHR8fCh0PVtdKSksdCBpbnN0YW5jZW9mIEFycmF5Pyh0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSx0WzFdPXRoaXMuZWxlbWVudHNbM10qbit0aGlzLmVsZW1lbnRzWzRdKnIrdGhpcy5lbGVtZW50c1s1XSk6dCBpbnN0YW5jZW9mIFBWZWN0b3ImJih0Lng9dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdLHQueT10aGlzLmVsZW1lbnRzWzNdKm4rdGhpcy5lbGVtZW50c1s0XSpyK3RoaXMuZWxlbWVudHNbNV0sdC56PTApLHR9LG11bHRYOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqdGhpcy5lbGVtZW50c1swXSt0KnRoaXMuZWxlbWVudHNbMV0rdGhpcy5lbGVtZW50c1syXX0sbXVsdFk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0aGlzLmVsZW1lbnRzWzNdK3QqdGhpcy5lbGVtZW50c1s0XSt0aGlzLmVsZW1lbnRzWzVdfSxza2V3WDpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLGUsMCwwKX0sc2tld1k6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSwwLGUsMCl9LHNoZWFyWDpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLE1hdGgudGFuKGUpLDAsMCl9LHNoZWFyWTpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLDAsTWF0aC50YW4oZSksMCl9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s0XS10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbM119LGludmVydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGV0ZXJtaW5hbnQoKQppZihNYXRoLmFicyhlKT5QQ29uc3RhbnRzLk1JTl9JTlQpe3ZhciB0PXRoaXMuZWxlbWVudHNbMF0sbj10aGlzLmVsZW1lbnRzWzFdLHI9dGhpcy5lbGVtZW50c1syXSxpPXRoaXMuZWxlbWVudHNbM10scz10aGlzLmVsZW1lbnRzWzRdLG89dGhpcy5lbGVtZW50c1s1XQpyZXR1cm4gdGhpcy5lbGVtZW50c1swXT1zL2UsdGhpcy5lbGVtZW50c1szXT0taS9lLHRoaXMuZWxlbWVudHNbMV09LW4vZSx0aGlzLmVsZW1lbnRzWzRdPXQvZSx0aGlzLmVsZW1lbnRzWzJdPShuKm8tcypyKS9lLHRoaXMuZWxlbWVudHNbNV09KGkqci10Km8pL2UsITB9cmV0dXJuITF9LHNjYWxlOmZ1bmN0aW9uKGUsbil7ZSYmbj09PXQmJihuPWUpLGUmJm4mJih0aGlzLmVsZW1lbnRzWzBdKj1lLHRoaXMuZWxlbWVudHNbMV0qPW4sdGhpcy5lbGVtZW50c1szXSo9ZSx0aGlzLmVsZW1lbnRzWzRdKj1uKX0saW52U2NhbGU6ZnVuY3Rpb24oZSx0KXtlJiYhdCYmKHQ9ZSksdGhpcy5zY2FsZSgxL2UsMS90KX0sYXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLHRoaXMuZWxlbWVudHNbMl0sMCwwLHRoaXMuZWxlbWVudHNbNV1dLG49MCxpPTA7aTwyO2krKylmb3IodmFyIHM9MDtzPDM7cysrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzWzMqaSswXSplW3MrMF0rdGhpcy5lbGVtZW50c1szKmkrMV0qZVtzKzNdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxwcmVBcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKTo2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKdmFyIHQ9WzAsMCxlWzJdLDAsMCxlWzVdXQp0WzJdPWVbMl0rdGhpcy5lbGVtZW50c1syXSplWzBdK3RoaXMuZWxlbWVudHNbNV0qZVsxXSx0WzVdPWVbNV0rdGhpcy5lbGVtZW50c1syXSplWzNdK3RoaXMuZWxlbWVudHNbNV0qZVs0XSx0WzBdPXRoaXMuZWxlbWVudHNbMF0qZVswXSt0aGlzLmVsZW1lbnRzWzNdKmVbMV0sdFszXT10aGlzLmVsZW1lbnRzWzBdKmVbM10rdGhpcy5lbGVtZW50c1szXSplWzRdLHRbMV09dGhpcy5lbGVtZW50c1sxXSplWzBdK3RoaXMuZWxlbWVudHNbNF0qZVsxXSx0WzRdPXRoaXMuZWxlbWVudHNbMV0qZVszXSt0aGlzLmVsZW1lbnRzWzRdKmVbNF0sdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHJvdGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLHI9dGhpcy5lbGVtZW50c1swXSxpPXRoaXMuZWxlbWVudHNbMV0KdGhpcy5lbGVtZW50c1swXT10KnIrbippLHRoaXMuZWxlbWVudHNbMV09LW4qcit0Kmkscj10aGlzLmVsZW1lbnRzWzNdLGk9dGhpcy5lbGVtZW50c1s0XSx0aGlzLmVsZW1lbnRzWzNdPXQqcituKmksdGhpcy5lbGVtZW50c1s0XT0tbipyK3QqaX0scm90YXRlWjpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZShlKX0saW52Um90YXRlWjpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZVooZS1NYXRoLlBJKX0scHJpbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wcmludE1hdHJpeEhlbHBlcih0aGlzLmVsZW1lbnRzKSx0PSIiK24ubmZzKHRoaXMuZWxlbWVudHNbMF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzJdLGUsNCkrIlxuIituLm5mcyh0aGlzLmVsZW1lbnRzWzNdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbNF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s1XSxlLDQpKyJcblxuIgpuLnByaW50bG4odCl9fSxyfX0se31dLDE1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wLHI9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCl9CnJldHVybiByLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKCl7MTY9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZWxlbWVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP3RoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLmFycmF5KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJih0aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5zbGljZSgpKX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IHIKcmV0dXJuIGUuc2V0KHRoaXMuZWxlbWVudHMpLGV9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGUsbixyKXtyPT09dCYmKHI9MCksdGhpcy5lbGVtZW50c1szXSs9ZSp0aGlzLmVsZW1lbnRzWzBdK24qdGhpcy5lbGVtZW50c1sxXStyKnRoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1s3XSs9ZSp0aGlzLmVsZW1lbnRzWzRdK24qdGhpcy5lbGVtZW50c1s1XStyKnRoaXMuZWxlbWVudHNbNl0sdGhpcy5lbGVtZW50c1sxMV0rPWUqdGhpcy5lbGVtZW50c1s4XStuKnRoaXMuZWxlbWVudHNbOV0rcip0aGlzLmVsZW1lbnRzWzEwXSx0aGlzLmVsZW1lbnRzWzE1XSs9ZSp0aGlzLmVsZW1lbnRzWzEyXStuKnRoaXMuZWxlbWVudHNbMTNdK3IqdGhpcy5lbGVtZW50c1sxNF19LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudHNbNF0KdGhpcy5lbGVtZW50c1s0XT10aGlzLmVsZW1lbnRzWzFdLHRoaXMuZWxlbWVudHNbMV09ZSxlPXRoaXMuZWxlbWVudHNbOF0sdGhpcy5lbGVtZW50c1s4XT10aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbMl09ZSxlPXRoaXMuZWxlbWVudHNbNl0sdGhpcy5lbGVtZW50c1s2XT10aGlzLmVsZW1lbnRzWzldLHRoaXMuZWxlbWVudHNbOV09ZSxlPXRoaXMuZWxlbWVudHNbM10sdGhpcy5lbGVtZW50c1szXT10aGlzLmVsZW1lbnRzWzEyXSx0aGlzLmVsZW1lbnRzWzEyXT1lLGU9dGhpcy5lbGVtZW50c1s3XSx0aGlzLmVsZW1lbnRzWzddPXRoaXMuZWxlbWVudHNbMTNdLHRoaXMuZWxlbWVudHNbMTNdPWUsZT10aGlzLmVsZW1lbnRzWzExXSx0aGlzLmVsZW1lbnRzWzExXT10aGlzLmVsZW1lbnRzWzE0XSx0aGlzLmVsZW1lbnRzWzE0XT1lfSxtdWx0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMKcmV0dXJuIGUgaW5zdGFuY2VvZiBQVmVjdG9yPyhuPWUueCxyPWUueSxpPWUueixzPTEsdHx8KHQ9bmV3IFBWZWN0b3IpKTplIGluc3RhbmNlb2YgQXJyYXkmJihuPWVbMF0scj1lWzFdLGk9ZVsyXSxzPWVbM118fDEsKCF0fHwzIT09dC5sZW5ndGgmJjQhPT10Lmxlbmd0aCkmJih0PVswLDAsMF0pKSx0IGluc3RhbmNlb2YgQXJyYXkmJigzPT09dC5sZW5ndGg/KHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSx0WzFdPXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10sdFsyXT10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0pOjQ9PT10Lmxlbmd0aCYmKHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSpzLHRbMV09dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSpzLHRbMl09dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKnMsdFszXT10aGlzLmVsZW1lbnRzWzEyXSpuK3RoaXMuZWxlbWVudHNbMTNdKnIrdGhpcy5lbGVtZW50c1sxNF0qaSt0aGlzLmVsZW1lbnRzWzE1XSpzKSksdCBpbnN0YW5jZW9mIFBWZWN0b3ImJih0Lng9dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSx0Lnk9dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSx0Lno9dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKSx0fSxwcmVBcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKToxNj09PWFyZ3VtZW50cy5sZW5ndGg/ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYoZT1hcmd1bWVudHNbMF0pCmZvcih2YXIgdD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sbj0wLGk9MDtpPDQ7aSsrKWZvcih2YXIgcz0wO3M8NDtzKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbcyswXSplWzQqaSswXSt0aGlzLmVsZW1lbnRzW3MrNF0qZVs0KmkrMV0rdGhpcy5lbGVtZW50c1tzKzhdKmVbNCppKzJdK3RoaXMuZWxlbWVudHNbcysxMl0qZVs0KmkrM10KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LGFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjE2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSxuPTAsaT0wO2k8NDtpKyspZm9yKHZhciBzPTA7czw0O3MrKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1s0KmkrMF0qZVtzKzBdK3RoaXMuZWxlbWVudHNbNCppKzFdKmVbcys0XSt0aGlzLmVsZW1lbnRzWzQqaSsyXSplW3MrOF0rdGhpcy5lbGVtZW50c1s0KmkrM10qZVtzKzEyXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scm90YXRlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKG4pe3ZhciBpPU1hdGguY29zKGUpLHM9TWF0aC5zaW4oZSksbz0xLWkKdGhpcy5hcHBseShvKnQqdCtpLG8qdCpuLXMqcixvKnQqcitzKm4sMCxvKnQqbitzKnIsbypuKm4raSxvKm4qci1zKnQsMCxvKnQqci1zKm4sbypuKnIrcyp0LG8qcipyK2ksMCwwLDAsMCwxKX1lbHNlIHRoaXMucm90YXRlWihlKX0saW52QXBwbHk6ZnVuY3Rpb24oKXtpbnZlcnNlQ29weT09PXQmJihpbnZlcnNlQ29weT1uZXcgcikKdmFyIGU9YXJndW1lbnRzCnJldHVybiBpbnZlcnNlQ29weS5zZXQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0sZVs5XSxlWzEwXSxlWzExXSxlWzEyXSxlWzEzXSxlWzE0XSxlWzE1XSksISFpbnZlcnNlQ29weS5pbnZlcnQoKSYmKHRoaXMucHJlQXBwbHkoaW52ZXJzZUNvcHkpLCEwKX0scm90YXRlWDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpCnRoaXMuYXBwbHkoWzEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxXSl9LHJvdGF0ZVk6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKQp0aGlzLmFwcGx5KFt0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMV0pfSxyb3RhdGVaOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkKdGhpcy5hcHBseShbdCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDFdKX0sc2NhbGU6ZnVuY3Rpb24oZSxuLHIpe2UmJm49PT10JiZyPT09dD9uPXI9ZTplJiZuJiZyPT09dCYmKHI9MSksZSYmbiYmciYmKHRoaXMuZWxlbWVudHNbMF0qPWUsdGhpcy5lbGVtZW50c1sxXSo9bix0aGlzLmVsZW1lbnRzWzJdKj1yLHRoaXMuZWxlbWVudHNbNF0qPWUsdGhpcy5lbGVtZW50c1s1XSo9bix0aGlzLmVsZW1lbnRzWzZdKj1yLHRoaXMuZWxlbWVudHNbOF0qPWUsdGhpcy5lbGVtZW50c1s5XSo9bix0aGlzLmVsZW1lbnRzWzEwXSo9cix0aGlzLmVsZW1lbnRzWzEyXSo9ZSx0aGlzLmVsZW1lbnRzWzEzXSo9bix0aGlzLmVsZW1lbnRzWzE0XSo9cil9LHNrZXdYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSx0LDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNrZXdZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSwwLDAsMCx0LDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNoZWFyWDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsdCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxzaGVhclk6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLDAsMCwwLHQsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sbXVsdFg6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4/cj90aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbMl0qbit0aGlzLmVsZW1lbnRzWzNdKnI6dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzJdKm4rdGhpcy5lbGVtZW50c1szXTp0aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbM119LG11bHRZOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuP3I/dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzZdKm4rdGhpcy5lbGVtZW50c1s3XSpyOnRoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s2XSpuK3RoaXMuZWxlbWVudHNbN106dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzddfSxtdWx0WjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcj90aGlzLmVsZW1lbnRzWzhdKmUrdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV0qcjp0aGlzLmVsZW1lbnRzWzhdKmUrdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV19LG11bHRXOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByP3RoaXMuZWxlbWVudHNbMTJdKmUrdGhpcy5lbGVtZW50c1sxM10qdCt0aGlzLmVsZW1lbnRzWzE0XSpuK3RoaXMuZWxlbWVudHNbMTVdKnI6dGhpcy5lbGVtZW50c1sxMl0qZSt0aGlzLmVsZW1lbnRzWzEzXSp0K3RoaXMuZWxlbWVudHNbMTRdKm4rdGhpcy5lbGVtZW50c1sxNV19LGludmVydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s1XS10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbNF0sdD10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNl0tdGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzRdLG49dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s0XSxyPXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s2XS10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbNV0saT10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzVdLHM9dGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s2XSxvPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxM10tdGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzEyXSxhPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxNF0tdGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxMl0sbD10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTJdLGg9dGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzE0XS10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzEzXSx1PXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxM10sYz10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzE0XSxmPWUqYy10KnUrbipoK3IqbC1pKmErcypvCmlmKE1hdGguYWJzKGYpPD0xZS05KXJldHVybiExCnZhciBwPVtdCnBbMF09K3RoaXMuZWxlbWVudHNbNV0qYy10aGlzLmVsZW1lbnRzWzZdKnUrdGhpcy5lbGVtZW50c1s3XSpoLHBbNF09LXRoaXMuZWxlbWVudHNbNF0qYyt0aGlzLmVsZW1lbnRzWzZdKmwtdGhpcy5lbGVtZW50c1s3XSphLHBbOF09K3RoaXMuZWxlbWVudHNbNF0qdS10aGlzLmVsZW1lbnRzWzVdKmwrdGhpcy5lbGVtZW50c1s3XSpvLHBbMTJdPS10aGlzLmVsZW1lbnRzWzRdKmgrdGhpcy5lbGVtZW50c1s1XSphLXRoaXMuZWxlbWVudHNbNl0qbyxwWzFdPS10aGlzLmVsZW1lbnRzWzFdKmMrdGhpcy5lbGVtZW50c1syXSp1LXRoaXMuZWxlbWVudHNbM10qaCxwWzVdPSt0aGlzLmVsZW1lbnRzWzBdKmMtdGhpcy5lbGVtZW50c1syXSpsK3RoaXMuZWxlbWVudHNbM10qYSxwWzldPS10aGlzLmVsZW1lbnRzWzBdKnUrdGhpcy5lbGVtZW50c1sxXSpsLXRoaXMuZWxlbWVudHNbM10qbyxwWzEzXT0rdGhpcy5lbGVtZW50c1swXSpoLXRoaXMuZWxlbWVudHNbMV0qYSt0aGlzLmVsZW1lbnRzWzJdKm8scFsyXT0rdGhpcy5lbGVtZW50c1sxM10qcy10aGlzLmVsZW1lbnRzWzE0XSppK3RoaXMuZWxlbWVudHNbMTVdKnIscFs2XT0tdGhpcy5lbGVtZW50c1sxMl0qcyt0aGlzLmVsZW1lbnRzWzE0XSpuLXRoaXMuZWxlbWVudHNbMTVdKnQscFsxMF09K3RoaXMuZWxlbWVudHNbMTJdKmktdGhpcy5lbGVtZW50c1sxM10qbit0aGlzLmVsZW1lbnRzWzE1XSplLHBbMTRdPS10aGlzLmVsZW1lbnRzWzEyXSpyK3RoaXMuZWxlbWVudHNbMTNdKnQtdGhpcy5lbGVtZW50c1sxNF0qZSxwWzNdPS10aGlzLmVsZW1lbnRzWzldKnMrdGhpcy5lbGVtZW50c1sxMF0qaS10aGlzLmVsZW1lbnRzWzExXSpyLHBbN109K3RoaXMuZWxlbWVudHNbOF0qcy10aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdKnQscFsxMV09LXRoaXMuZWxlbWVudHNbOF0qaSt0aGlzLmVsZW1lbnRzWzldKm4tdGhpcy5lbGVtZW50c1sxMV0qZSxwWzE1XT0rdGhpcy5lbGVtZW50c1s4XSpyLXRoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSplCnZhciBtPTEvZgpyZXR1cm4gcFswXSo9bSxwWzFdKj1tLHBbMl0qPW0scFszXSo9bSxwWzRdKj1tLHBbNV0qPW0scFs2XSo9bSxwWzddKj1tLHBbOF0qPW0scFs5XSo9bSxwWzEwXSo9bSxwWzExXSo9bSxwWzEyXSo9bSxwWzEzXSo9bSxwWzE0XSo9bSxwWzE1XSo9bSx0aGlzLmVsZW1lbnRzPXAuc2xpY2UoKSwhMH0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtmb3IodmFyIGU9IiIsdD0wO3Q8MTU7dCsrKWUrPXRoaXMuZWxlbWVudHNbdF0rIiwgIgpyZXR1cm4gZSs9dGhpcy5lbGVtZW50c1sxNV19LHByaW50OmZ1bmN0aW9uKCl7dmFyIGU9cHJpbnRNYXRyaXhIZWxwZXIodGhpcy5lbGVtZW50cyksdD0iIituLm5mcyh0aGlzLmVsZW1lbnRzWzBdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMV0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1syXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzNdLGUsNCkrIlxuIituLm5mcyh0aGlzLmVsZW1lbnRzWzRdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbNV0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s2XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzddLGUsNCkrIlxuIituLm5mcyh0aGlzLmVsZW1lbnRzWzhdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbOV0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxMF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxMV0sZSw0KSsiXG4iK24ubmZzKHRoaXMuZWxlbWVudHNbMTJdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMTNdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMTRdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMTVdLGUsNCkrIlxuXG4iCm4ucHJpbnRsbih0KX0saW52VHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnByZUFwcGx5KDEsMCwwLC1lLDAsMSwwLC10LDAsMCwxLC1uLDAsMCwwLDEpfSxpbnZSb3RhdGVYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFsxLDAsMCwwLDAsdCwtbiwwLDAsbix0LDAsMCwwLDAsMV0pfSxpbnZSb3RhdGVZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFt0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMV0pfSxpbnZSb3RhdGVaOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKC1lKSxuPU1hdGguc2luKC1lKQp0aGlzLnByZUFwcGx5KFt0LC1uLDAsMCxuLHQsMCwwLDAsMCwxLDAsMCwwLDAsMV0pfSxpbnZTY2FsZTpmdW5jdGlvbihlLHQsbil7dGhpcy5wcmVBcHBseShbMS9lLDAsMCwwLDAsMS90LDAsMCwwLDAsMS9uLDAsMCwwLDAsMV0pfX0scn19LHt9XSwxNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLlBDb25zdGFudHMsbj1lLlBNYXRyaXgyRCxyPWUuUE1hdHJpeDNELGk9ZnVuY3Rpb24oZSl7dGhpcy5mYW1pbHk9ZXx8dC5HUk9VUCx0aGlzLnZpc2libGU9ITAsdGhpcy5zdHlsZT0hMCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMubmFtZVRhYmxlPVtdLHRoaXMucGFyYW1zPVtdLHRoaXMubmFtZT0iIix0aGlzLmltYWdlPW51bGwsdGhpcy5tYXRyaXg9bnVsbCx0aGlzLmtpbmQ9bnVsbCx0aGlzLmNsb3NlPW51bGwsdGhpcy53aWR0aD1udWxsLHRoaXMuaGVpZ2h0PW51bGwsdGhpcy5wYXJlbnQ9bnVsbH0KcmV0dXJuIGkucHJvdG90eXBlPXtpc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aXNpYmxlfSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGUpe3RoaXMudmlzaWJsZT1lfSxkaXNhYmxlU3R5bGU6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlPSExCmZvcih2YXIgZT0wLHQ9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTx0O2UrKyl0aGlzLmNoaWxkcmVuW2VdLmRpc2FibGVTdHlsZSgpfSxlbmFibGVTdHlsZTpmdW5jdGlvbigpe3RoaXMuc3R5bGU9ITAKZm9yKHZhciBlPTAsdD10aGlzLmNoaWxkcmVuLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuY2hpbGRyZW5bZV0uZW5hYmxlU3R5bGUoKX0sZ2V0RmFtaWx5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmFtaWx5fSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRofSxnZXRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWlnaHR9LHNldE5hbWU6ZnVuY3Rpb24oZSl7dGhpcy5uYW1lPWV9LGdldE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSxkcmF3OmZ1bmN0aW9uKGUpe2lmKCFlKXRocm93InJlbmRlciBjb250ZXh0IG1pc3NpbmcgZm9yIGRyYXcoKSBpbiBQU2hhcGUiCnRoaXMudmlzaWJsZSYmKHRoaXMucHJlKGUpLHRoaXMuZHJhd0ltcGwoZSksdGhpcy5wb3N0KGUpKX0sZHJhd0ltcGw6ZnVuY3Rpb24oZSl7dGhpcy5mYW1pbHk9PT10LkdST1VQP3RoaXMuZHJhd0dyb3VwKGUpOnRoaXMuZmFtaWx5PT09dC5QUklNSVRJVkU/dGhpcy5kcmF3UHJpbWl0aXZlKGUpOnRoaXMuZmFtaWx5PT09dC5HRU9NRVRSWT90aGlzLmRyYXdHZW9tZXRyeShlKTp0aGlzLmZhbWlseT09PXQuUEFUSCYmdGhpcy5kcmF3UGF0aChlKX0sZHJhd1BhdGg6ZnVuY3Rpb24oZSl7dmFyIG4scgppZigwIT09dGhpcy52ZXJ0aWNlcy5sZW5ndGgpe2lmKGUuYmVnaW5TaGFwZSgpLDA9PT10aGlzLnZlcnRleENvZGVzLmxlbmd0aClpZigyPT09dGhpcy52ZXJ0aWNlc1swXS5sZW5ndGgpZm9yKG49MCxyPXRoaXMudmVydGljZXMubGVuZ3RoO248cjtuKyspZS52ZXJ0ZXgodGhpcy52ZXJ0aWNlc1tuXVswXSx0aGlzLnZlcnRpY2VzW25dWzFdKQplbHNlIGZvcihuPTAscj10aGlzLnZlcnRpY2VzLmxlbmd0aDtuPHI7bisrKWUudmVydGV4KHRoaXMudmVydGljZXNbbl1bMF0sdGhpcy52ZXJ0aWNlc1tuXVsxXSx0aGlzLnZlcnRpY2VzW25dWzJdKQplbHNle3ZhciBpPTAKaWYoMj09PXRoaXMudmVydGljZXNbMF0ubGVuZ3RoKWZvcihuPTAscj10aGlzLnZlcnRleENvZGVzLmxlbmd0aDtuPHI7bisrKXRoaXMudmVydGV4Q29kZXNbbl09PT10LlZFUlRFWD8oZS52ZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpXVswXSx0aGlzLnZlcnRpY2VzW2ldWzFdLHRoaXMudmVydGljZXNbaV0ubW92ZVRvKSxlLmJyZWFrU2hhcGU9ITEsaSsrKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5CRVpJRVJfVkVSVEVYPyhlLmJlemllclZlcnRleCh0aGlzLnZlcnRpY2VzW2krMF1bMF0sdGhpcy52ZXJ0aWNlc1tpKzBdWzFdLHRoaXMudmVydGljZXNbaSsxXVswXSx0aGlzLnZlcnRpY2VzW2krMV1bMV0sdGhpcy52ZXJ0aWNlc1tpKzJdWzBdLHRoaXMudmVydGljZXNbaSsyXVsxXSksaSs9Myk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQ1VSVkVfVkVSVEVYPyhlLmN1cnZlVmVydGV4KHRoaXMudmVydGljZXNbaV1bMF0sdGhpcy52ZXJ0aWNlc1tpXVsxXSksaSsrKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5CUkVBSyYmKGUuYnJlYWtTaGFwZT0hMCkKZWxzZSBmb3Iobj0wLHI9dGhpcy52ZXJ0ZXhDb2Rlcy5sZW5ndGg7bjxyO24rKyl0aGlzLnZlcnRleENvZGVzW25dPT09dC5WRVJURVg/KGUudmVydGV4KHRoaXMudmVydGljZXNbaV1bMF0sdGhpcy52ZXJ0aWNlc1tpXVsxXSx0aGlzLnZlcnRpY2VzW2ldWzJdKSx0aGlzLnZlcnRpY2VzW2ldLm1vdmVUbz09PSEwP3ZlcnRBcnJheVt2ZXJ0QXJyYXkubGVuZ3RoLTFdLm1vdmVUbz0hMDp0aGlzLnZlcnRpY2VzW2ldLm1vdmVUbz09PSExJiYodmVydEFycmF5W3ZlcnRBcnJheS5sZW5ndGgtMV0ubW92ZVRvPSExKSxlLmJyZWFrU2hhcGU9ITEpOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkJFWklFUl9WRVJURVg/KGUuYmV6aWVyVmVydGV4KHRoaXMudmVydGljZXNbaSswXVswXSx0aGlzLnZlcnRpY2VzW2krMF1bMV0sdGhpcy52ZXJ0aWNlc1tpKzBdWzJdLHRoaXMudmVydGljZXNbaSsxXVswXSx0aGlzLnZlcnRpY2VzW2krMV1bMV0sdGhpcy52ZXJ0aWNlc1tpKzFdWzJdLHRoaXMudmVydGljZXNbaSsyXVswXSx0aGlzLnZlcnRpY2VzW2krMl1bMV0sdGhpcy52ZXJ0aWNlc1tpKzJdWzJdKSxpKz0zKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5DVVJWRV9WRVJURVg/KGUuY3VydmVWZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpXVswXSx0aGlzLnZlcnRpY2VzW2ldWzFdLHRoaXMudmVydGljZXNbaV1bMl0pLGkrKyk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQlJFQUsmJihlLmJyZWFrU2hhcGU9ITApfWUuZW5kU2hhcGUodGhpcy5jbG9zZT90LkNMT1NFOnQuT1BFTil9fSxkcmF3R2VvbWV0cnk6ZnVuY3Rpb24oZSl7dmFyIHQsbgppZihlLmJlZ2luU2hhcGUodGhpcy5raW5kKSx0aGlzLnN0eWxlKWZvcih0PTAsbj10aGlzLnZlcnRpY2VzLmxlbmd0aDt0PG47dCsrKWUudmVydGV4KHRoaXMudmVydGljZXNbdF0pCmVsc2UgZm9yKHQ9MCxuPXRoaXMudmVydGljZXMubGVuZ3RoO3Q8bjt0Kyspe3ZhciByPXRoaXMudmVydGljZXNbdF0KMD09PXJbMl0/ZS52ZXJ0ZXgoclswXSxyWzFdKTplLnZlcnRleChyWzBdLHJbMV0sclsyXSl9ZS5lbmRTaGFwZSgpfSxkcmF3R3JvdXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKXRoaXMuY2hpbGRyZW5bdF0uZHJhdyhlKX0sZHJhd1ByaW1pdGl2ZTpmdW5jdGlvbihlKXtpZih0aGlzLmtpbmQ9PT10LlBPSU5UKWUucG9pbnQodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0pCmVsc2UgaWYodGhpcy5raW5kPT09dC5MSU5FKTQ9PT10aGlzLnBhcmFtcy5sZW5ndGg/ZS5saW5lKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdKTplLmxpbmUodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10sdGhpcy5wYXJhbXNbNF0sdGhpcy5wYXJhbXNbNV0pCmVsc2UgaWYodGhpcy5raW5kPT09dC5UUklBTkdMRSllLnRyaWFuZ2xlKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdLHRoaXMucGFyYW1zWzRdLHRoaXMucGFyYW1zWzVdKQplbHNlIGlmKHRoaXMua2luZD09PXQuUVVBRCllLnF1YWQodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10sdGhpcy5wYXJhbXNbNF0sdGhpcy5wYXJhbXNbNV0sdGhpcy5wYXJhbXNbNl0sdGhpcy5wYXJhbXNbN10pCmVsc2UgaWYodGhpcy5raW5kPT09dC5SRUNUKWlmKG51bGwhPT10aGlzLmltYWdlKXt2YXIgbj1pbWFnZU1vZGVDb252ZXJ0CmUuaW1hZ2VNb2RlKHQuQ09STkVSKSxlLmltYWdlKHRoaXMuaW1hZ2UsdGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10pLGltYWdlTW9kZUNvbnZlcnQ9bn1lbHNle3ZhciByPWUuY3VyUmVjdE1vZGUKZS5yZWN0TW9kZSh0LkNPUk5FUiksZS5yZWN0KHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdKSxlLmN1clJlY3RNb2RlPXJ9ZWxzZSBpZih0aGlzLmtpbmQ9PT10LkVMTElQU0Upe3ZhciBpPWUuY3VyRWxsaXBzZU1vZGUKZS5lbGxpcHNlTW9kZSh0LkNPUk5FUiksZS5lbGxpcHNlKHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdLHRoaXMucGFyYW1zWzNdKSxlLmN1ckVsbGlwc2VNb2RlPWl9ZWxzZSBpZih0aGlzLmtpbmQ9PT10LkFSQyl7dmFyIHM9Y3VyRWxsaXBzZU1vZGUKZS5lbGxpcHNlTW9kZSh0LkNPUk5FUiksZS5hcmModGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10sdGhpcy5wYXJhbXNbNF0sdGhpcy5wYXJhbXNbNV0pLGN1ckVsbGlwc2VNb2RlPXN9ZWxzZSB0aGlzLmtpbmQ9PT10LkJPWD8xPT09dGhpcy5wYXJhbXMubGVuZ3RoP2UuYm94KHRoaXMucGFyYW1zWzBdKTplLmJveCh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSk6dGhpcy5raW5kPT09dC5TUEhFUkUmJmUuc3BoZXJlKHRoaXMucGFyYW1zWzBdKX0scHJlOmZ1bmN0aW9uKGUpe3RoaXMubWF0cml4JiYoZS5wdXNoTWF0cml4KCksZS50cmFuc2Zvcm0odGhpcy5tYXRyaXgpKSx0aGlzLnN0eWxlJiYoZS5wdXNoU3R5bGUoKSx0aGlzLnN0eWxlcyhlKSl9LHBvc3Q6ZnVuY3Rpb24oZSl7dGhpcy5tYXRyaXgmJmUucG9wTWF0cml4KCksdGhpcy5zdHlsZSYmZS5wb3BTdHlsZSgpfSxzdHlsZXM6ZnVuY3Rpb24oZSl7dGhpcy5zdHJva2U/KGUuc3Ryb2tlKHRoaXMuc3Ryb2tlQ29sb3IpLGUuc3Ryb2tlV2VpZ2h0KHRoaXMuc3Ryb2tlV2VpZ2h0KSxlLnN0cm9rZUNhcCh0aGlzLnN0cm9rZUNhcCksZS5zdHJva2VKb2luKHRoaXMuc3Ryb2tlSm9pbikpOmUubm9TdHJva2UoKSx0aGlzLmZpbGw/ZS5maWxsKHRoaXMuZmlsbENvbG9yKTplLm5vRmlsbCgpfSxnZXRDaGlsZDpmdW5jdGlvbihlKXt2YXIgdCxuCmlmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gdGhpcy5jaGlsZHJlbltlXQp2YXIgcgppZigiIj09PWV8fHRoaXMubmFtZT09PWUpcmV0dXJuIHRoaXMKaWYodGhpcy5uYW1lVGFibGUubGVuZ3RoPjApe2Zvcih0PTAsbj10aGlzLm5hbWVUYWJsZS5sZW5ndGg7dDxufHxyO3QrKylpZih0aGlzLm5hbWVUYWJsZVt0XS5nZXROYW1lPT09ZSl7cj10aGlzLm5hbWVUYWJsZVt0XQpicmVha31pZihyKXJldHVybiByfWZvcih0PTAsbj10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKWlmKHI9dGhpcy5jaGlsZHJlblt0XS5nZXRDaGlsZChlKSlyZXR1cm4gcgpyZXR1cm4gbnVsbH0sZ2V0Q2hpbGRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aH0sYWRkQ2hpbGQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXRoaXMsbnVsbCE9PWUuZ2V0TmFtZSgpJiZ0aGlzLmFkZE5hbWUoZS5nZXROYW1lKCksZSl9LGFkZE5hbWU6ZnVuY3Rpb24oZSx0KXtudWxsIT09dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuYWRkTmFtZShlLHQpOnRoaXMubmFtZVRhYmxlLnB1c2goW2UsdF0pfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXsyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC50cmFuc2xhdGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkpOih0aGlzLmNoZWNrTWF0cml4KDMpLHRoaXMubWF0cml4LnRyYW5zbGF0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLDApKX0sY2hlY2tNYXRyaXg6ZnVuY3Rpb24oZSl7bnVsbD09PXRoaXMubWF0cml4PzI9PT1lP3RoaXMubWF0cml4PW5ldyBuOnRoaXMubWF0cml4PW5ldyByOjM9PT1lJiZ0aGlzLm1hdHJpeCBpbnN0YW5jZW9mIG4mJih0aGlzLm1hdHJpeD1uZXcgcil9LHJvdGF0ZVg6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGUoZSwxLDAsMCl9LHJvdGF0ZVk6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGUoZSwwLDEsMCl9LHJvdGF0ZVo6ZnVuY3Rpb24oZSl7dGhpcy5yb3RhdGUoZSwwLDAsMSl9LHJvdGF0ZTpmdW5jdGlvbigpezE9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnJvdGF0ZShhcmd1bWVudHNbMF0pKToodGhpcy5jaGVja01hdHJpeCgzKSx0aGlzLm1hdHJpeC5yb3RhdGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKSl9LHNjYWxlOmZ1bmN0aW9uKCl7Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXguc2NhbGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkpOjM9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnNjYWxlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSk6KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXguc2NhbGUoYXJndW1lbnRzWzBdKSl9LHJlc2V0TWF0cml4OmZ1bmN0aW9uKCl7dGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5yZXNldCgpfSxhcHBseU1hdHJpeDpmdW5jdGlvbihlKXsxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmFwcGx5TWF0cml4KGUuZWxlbWVudHNbMF0sZS5lbGVtZW50c1sxXSwwLGUuZWxlbWVudHNbMl0sZS5lbGVtZW50c1szXSxlLmVsZW1lbnRzWzRdLDAsZS5lbGVtZW50c1s1XSwwLDAsMSwwLDAsMCwwLDEpOjY9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LmFwcGx5KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLDAsYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0sMCwwLDAsMSwwLDAsMCwwLDEpKToxNj09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLmNoZWNrTWF0cml4KDMpLHRoaXMubWF0cml4LmFwcGx5KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdLGFyZ3VtZW50c1s2XSxhcmd1bWVudHNbN10sYXJndW1lbnRzWzhdLGFyZ3VtZW50c1s5XSxhcmd1bWVudHNbMTBdLGFyZ3VtZW50c1sxMV0sYXJndW1lbnRzWzEyXSxhcmd1bWVudHNbMTNdLGFyZ3VtZW50c1sxNF0sYXJndW1lbnRzWzE1XSkpfX0saX19LHt9XSwxNzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLkNvbW1vbkZ1bmN0aW9ucyxuPWUuUENvbnN0YW50cyxyPWUuUFNoYXBlLGk9ZS5YTUxFbGVtZW50LHM9ZS5jb2xvcnMsbz1mdW5jdGlvbigpe2lmKHIuY2FsbCh0aGlzKSwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYodGhpcy5lbGVtZW50PWFyZ3VtZW50c1swXSx0aGlzLnZlcnRleENvZGVzPVtdLHRoaXMudmVydGljZXM9W10sdGhpcy5vcGFjaXR5PTEsdGhpcy5zdHJva2U9ITEsdGhpcy5zdHJva2VDb2xvcj1uLkFMUEhBX01BU0ssdGhpcy5zdHJva2VXZWlnaHQ9MSx0aGlzLnN0cm9rZUNhcD1uLlNRVUFSRSx0aGlzLnN0cm9rZUpvaW49bi5NSVRFUix0aGlzLnN0cm9rZUdyYWRpZW50PW51bGwsdGhpcy5zdHJva2VHcmFkaWVudFBhaW50PW51bGwsdGhpcy5zdHJva2VOYW1lPW51bGwsdGhpcy5zdHJva2VPcGFjaXR5PTEsdGhpcy5maWxsPSEwLHRoaXMuZmlsbENvbG9yPW4uQUxQSEFfTUFTSyx0aGlzLmZpbGxHcmFkaWVudD1udWxsLHRoaXMuZmlsbEdyYWRpZW50UGFpbnQ9bnVsbCx0aGlzLmZpbGxOYW1lPW51bGwsdGhpcy5maWxsT3BhY2l0eT0xLCJzdmciIT09dGhpcy5lbGVtZW50LmdldE5hbWUoKSl0aHJvdyJyb290IGlzIG5vdCA8c3ZnPiwgaXQncyA8Iit0aGlzLmVsZW1lbnQuZ2V0TmFtZSgpKyI+In1lbHNlIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYoInN0cmluZyI9PXR5cGVvZiBhcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdLmluZGV4T2YoIi5zdmciKT4tMSYmKHRoaXMuZWxlbWVudD1uZXcgaSgoITApLGFyZ3VtZW50c1sxXSksdGhpcy52ZXJ0ZXhDb2Rlcz1bXSx0aGlzLnZlcnRpY2VzPVtdLHRoaXMub3BhY2l0eT0xLHRoaXMuc3Ryb2tlPSExLHRoaXMuc3Ryb2tlQ29sb3I9bi5BTFBIQV9NQVNLLHRoaXMuc3Ryb2tlV2VpZ2h0PTEsdGhpcy5zdHJva2VDYXA9bi5TUVVBUkUsdGhpcy5zdHJva2VKb2luPW4uTUlURVIsdGhpcy5zdHJva2VHcmFkaWVudD0iIix0aGlzLnN0cm9rZUdyYWRpZW50UGFpbnQ9IiIsdGhpcy5zdHJva2VOYW1lPSIiLHRoaXMuc3Ryb2tlT3BhY2l0eT0xLHRoaXMuZmlsbD0hMCx0aGlzLmZpbGxDb2xvcj1uLkFMUEhBX01BU0ssdGhpcy5maWxsR3JhZGllbnQ9bnVsbCx0aGlzLmZpbGxHcmFkaWVudFBhaW50PW51bGwsdGhpcy5maWxsT3BhY2l0eT0xKTphcmd1bWVudHNbMF0mJih0aGlzLmVsZW1lbnQ9YXJndW1lbnRzWzFdLHRoaXMudmVydGV4Q29kZXM9YXJndW1lbnRzWzBdLnZlcnRleENvZGVzLnNsaWNlKCksdGhpcy52ZXJ0aWNlcz1hcmd1bWVudHNbMF0udmVydGljZXMuc2xpY2UoKSx0aGlzLnN0cm9rZT1hcmd1bWVudHNbMF0uc3Ryb2tlLHRoaXMuc3Ryb2tlQ29sb3I9YXJndW1lbnRzWzBdLnN0cm9rZUNvbG9yLHRoaXMuc3Ryb2tlV2VpZ2h0PWFyZ3VtZW50c1swXS5zdHJva2VXZWlnaHQsdGhpcy5zdHJva2VDYXA9YXJndW1lbnRzWzBdLnN0cm9rZUNhcCx0aGlzLnN0cm9rZUpvaW49YXJndW1lbnRzWzBdLnN0cm9rZUpvaW4sdGhpcy5zdHJva2VHcmFkaWVudD1hcmd1bWVudHNbMF0uc3Ryb2tlR3JhZGllbnQsdGhpcy5zdHJva2VHcmFkaWVudFBhaW50PWFyZ3VtZW50c1swXS5zdHJva2VHcmFkaWVudFBhaW50LHRoaXMuc3Ryb2tlTmFtZT1hcmd1bWVudHNbMF0uc3Ryb2tlTmFtZSx0aGlzLmZpbGw9YXJndW1lbnRzWzBdLmZpbGwsdGhpcy5maWxsQ29sb3I9YXJndW1lbnRzWzBdLmZpbGxDb2xvcix0aGlzLmZpbGxHcmFkaWVudD1hcmd1bWVudHNbMF0uZmlsbEdyYWRpZW50LHRoaXMuZmlsbEdyYWRpZW50UGFpbnQ9YXJndW1lbnRzWzBdLmZpbGxHcmFkaWVudFBhaW50LHRoaXMuZmlsbE5hbWU9YXJndW1lbnRzWzBdLmZpbGxOYW1lLHRoaXMuc3Ryb2tlT3BhY2l0eT1hcmd1bWVudHNbMF0uc3Ryb2tlT3BhY2l0eSx0aGlzLmZpbGxPcGFjaXR5PWFyZ3VtZW50c1swXS5maWxsT3BhY2l0eSx0aGlzLm9wYWNpdHk9YXJndW1lbnRzWzBdLm9wYWNpdHkpKQp0aGlzLm5hbWU9dGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgiaWQiKQp2YXIgZT10aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJkaXNwbGF5IiwiaW5saW5lIikKdGhpcy52aXNpYmxlPSJub25lIiE9PWUKdmFyIHQ9dGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIikKdCYmKHRoaXMubWF0cml4PXRoaXMucGFyc2VNYXRyaXgodCkpCnZhciBzPXRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoInZpZXdCb3giKQppZihudWxsIT09cyl7dmFyIG89cy5zcGxpdCgiICIpCnRoaXMud2lkdGg9b1syXSx0aGlzLmhlaWdodD1vWzNdfXZhciBhPXRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoIndpZHRoIiksbD10aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJoZWlnaHQiKQppZihudWxsIT09YSl0aGlzLndpZHRoPXRoaXMucGFyc2VVbml0U2l6ZShhKSx0aGlzLmhlaWdodD10aGlzLnBhcnNlVW5pdFNpemUobCkKZWxzZSBpZigwPT09dGhpcy53aWR0aHx8MD09PXRoaXMuaGVpZ2h0KXRocm93IHRoaXMud2lkdGg9MSx0aGlzLmhlaWdodD0xLCJUaGUgd2lkdGggYW5kL29yIGhlaWdodCBpcyBub3QgcmVhZGFibGUgaW4gdGhlIDxzdmc+IHRhZyBvZiB0aGlzIGZpbGUuIgp0aGlzLnBhcnNlQ29sb3JzKHRoaXMuZWxlbWVudCksdGhpcy5wYXJzZUNoaWxkcmVuKHRoaXMuZWxlbWVudCl9CnJldHVybiBvLnByb3RvdHlwZT1uZXcgcixvLnByb3RvdHlwZS5wYXJzZU1hdHJpeD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9W10KcmV0dXJuIGUucmVwbGFjZSgvXCgoLio/KVwpLyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLG4pe3Q9bi5yZXBsYWNlKC8sKy9nLCIgIikuc3BsaXQoL1xzKy8pfX0oKSksdH1yZXR1cm4gZnVuY3Rpb24obil7dGhpcy5jaGVja01hdHJpeCgyKQp2YXIgcj1bXQppZihuLnJlcGxhY2UoL1xzKihcdyspXCgoLio/KVwpL2csZnVuY3Rpb24oZSl7ci5wdXNoKHQudHJpbShlKSl9KSwwPT09ci5sZW5ndGgpcmV0dXJuIG51bGwKZm9yKHZhciBpPTAscz1yLmxlbmd0aDtpPHM7aSsrKXt2YXIgbz1lKHJbaV0pCmlmKHJbaV0uaW5kZXhPZigibWF0cml4IikhPT0tMSl0aGlzLm1hdHJpeC5zZXQob1swXSxvWzJdLG9bNF0sb1sxXSxvWzNdLG9bNV0pCmVsc2UgaWYocltpXS5pbmRleE9mKCJ0cmFuc2xhdGUiKSE9PS0xKXt2YXIgYT1vWzBdLGw9Mj09PW8ubGVuZ3RoP29bMV06MAp0aGlzLm1hdHJpeC50cmFuc2xhdGUoYSxsKX1lbHNlIGlmKHJbaV0uaW5kZXhPZigic2NhbGUiKSE9PS0xKXt2YXIgaD1vWzBdLHU9Mj09PW8ubGVuZ3RoP29bMV06b1swXQp0aGlzLm1hdHJpeC5zY2FsZShoLHUpfWVsc2UgaWYocltpXS5pbmRleE9mKCJyb3RhdGUiKSE9PS0xKXt2YXIgYz1vWzBdCjE9PT1vLmxlbmd0aD90aGlzLm1hdHJpeC5yb3RhdGUodC5yYWRpYW5zKGMpKTozPT09by5sZW5ndGgmJih0aGlzLm1hdHJpeC50cmFuc2xhdGUob1sxXSxvWzJdKSx0aGlzLm1hdHJpeC5yb3RhdGUodC5yYWRpYW5zKG9bMF0pKSx0aGlzLm1hdHJpeC50cmFuc2xhdGUoLW9bMV0sLW9bMl0pKX1lbHNlIHJbaV0uaW5kZXhPZigic2tld1giKSE9PS0xP3RoaXMubWF0cml4LnNrZXdYKHBhcnNlRmxvYXQob1swXSkpOnJbaV0uaW5kZXhPZigic2tld1kiKSE9PS0xP3RoaXMubWF0cml4LnNrZXdZKG9bMF0pOnJbaV0uaW5kZXhPZigic2hlYXJYIikhPT0tMT90aGlzLm1hdHJpeC5zaGVhclgob1swXSk6cltpXS5pbmRleE9mKCJzaGVhclkiKSE9PS0xJiZ0aGlzLm1hdHJpeC5zaGVhclkob1swXSl9cmV0dXJuIHRoaXMubWF0cml4fX0oKSxvLnByb3RvdHlwZS5wYXJzZUNoaWxkcmVuPWZ1bmN0aW9uKGUpe3ZhciB0LG4saT1lLmdldENoaWxkcmVuKCkscz1uZXcgcgpmb3IodD0wLG49aS5sZW5ndGg7dDxuO3QrKyl7dmFyIG89dGhpcy5wYXJzZUNoaWxkKGlbdF0pCm8mJnMuYWRkQ2hpbGQobyl9Zm9yKHQ9MCxuPXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspdGhpcy5jaGlsZHJlbi5wdXNoKHMuY2hpbGRyZW5bdF0pfSxvLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sby5wcm90b3R5cGUucGFyc2VDaGlsZD1mdW5jdGlvbihlKXt2YXIgdCxuPWUuZ2V0TmFtZSgpCnJldHVybiJnIj09PW4/dD1uZXcgbyh0aGlzLGUpOiJkZWZzIj09PW4/dD1uZXcgbyh0aGlzLGUpOiJsaW5lIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlTGluZSgpKToiY2lyY2xlIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlRWxsaXBzZSghMCkpOiJlbGxpcHNlIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlRWxsaXBzZSghMSkpOiJyZWN0Ij09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlUmVjdCgpKToicG9seWdvbiI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZVBvbHkoITApKToicG9seWxpbmUiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VQb2x5KCExKSk6InBhdGgiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VQYXRoKCkpOiJyYWRpYWxHcmFkaWVudCI9PT1uP3VuaW1wbGVtZW50ZWQoIlBTaGFwZVNWRy5wcm90b3R5cGUucGFyc2VDaGlsZCwgbmFtZSA9IHJhZGlhbEdyYWRpZW50Iik6ImxpbmVhckdyYWRpZW50Ij09PW4/dW5pbXBsZW1lbnRlZCgiUFNoYXBlU1ZHLnByb3RvdHlwZS5wYXJzZUNoaWxkLCBuYW1lID0gbGluZWFyR3JhZGllbnQiKToidGV4dCI9PT1uP3VuaW1wbGVtZW50ZWQoIlBTaGFwZVNWRy5wcm90b3R5cGUucGFyc2VDaGlsZCwgbmFtZSA9IHRleHQiKToiZmlsdGVyIj09PW4/dW5pbXBsZW1lbnRlZCgiUFNoYXBlU1ZHLnByb3RvdHlwZS5wYXJzZUNoaWxkLCBuYW1lID0gZmlsdGVyIik6Im1hc2siPT09biYmdW5pbXBsZW1lbnRlZCgiUFNoYXBlU1ZHLnByb3RvdHlwZS5wYXJzZUNoaWxkLCBuYW1lID0gbWFzayIpLHR9LG8ucHJvdG90eXBlLnBhcnNlUGF0aD1mdW5jdGlvbigpe3RoaXMuZmFtaWx5PW4uUEFUSCx0aGlzLmtpbmQ9MAp2YXIgZT10LnRyaW0odGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgiZCIpLnJlcGxhY2UoL1tccyxdKy9nLCIgIikpCmlmKG51bGwhPT1lKXtlPWUuc3BsaXQoIiIpCmZvcih2YXIgcixpLHMsbyxhPTAsbD0wLGg9MCx1PTAsYz0wLGY9MCxwPTAsbT0wLGc9MCxkPTAsdj0wLHk9MCx4PTAsQT0wLGI9MCx3PTAsRT0iIixTPVtdLFA9ITE7YjxlLmxlbmd0aDspaWYodz1lW2JdLmNoYXJDb2RlQXQoMCksdz49NjUmJnc8PTkwfHx3Pj05NyYmdzw9MTIyKXtpZihzPWIsYisrLGI8ZS5sZW5ndGgpZm9yKFM9W10sdz1lW2JdLmNoYXJDb2RlQXQoMCk7ISh3Pj02NSYmdzw9OTB8fHc+PTk3JiZ3PD0xMDB8fHc+PTEwMiYmdzw9MTIyKSYmUD09PSExOykzMj09PXc/KCIiIT09RSYmKFMucHVzaChwYXJzZUZsb2F0KEUpKSxFPSIiKSxiKyspOjQ1PT09dz8xMDE9PT1lW2ItMV0uY2hhckNvZGVBdCgwKT8oRSs9ZVtiXS50b1N0cmluZygpLGIrKyk6KCIiIT09RSYmUy5wdXNoKHBhcnNlRmxvYXQoRSkpLEU9ZVtiXS50b1N0cmluZygpLGIrKyk6KEUrPWVbYl0udG9TdHJpbmcoKSxiKyspLGI9PT1lLmxlbmd0aD9QPSEwOnc9ZVtiXS5jaGFyQ29kZUF0KDApCmlmKCIiIT09RSYmKFMucHVzaChwYXJzZUZsb2F0KEUpKSxFPSIiKSxpPWVbc10sdz1pLmNoYXJDb2RlQXQoMCksNzc9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTAmJihhPVNbMF0sbD1TWzFdLHRoaXMucGFyc2VQYXRoTW92ZXRvKGEsbCksUy5sZW5ndGg+MikpZm9yKHM9MixvPVMubGVuZ3RoO3M8bztzKz0yKWE9U1tzXSxsPVNbcysxXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpfWVsc2UgaWYoMTA5PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wJiYoYSs9U1swXSxsKz1TWzFdLHRoaXMucGFyc2VQYXRoTW92ZXRvKGEsbCksUy5sZW5ndGg+MikpZm9yKHM9MixvPVMubGVuZ3RoO3M8bztzKz0yKWErPVNbc10sbCs9U1tzKzFdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCl9ZWxzZSBpZig3Nj09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTIpYT1TW3NdLGw9U1tzKzFdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCl9ZWxzZSBpZigxMDg9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz0yKWErPVNbc10sbCs9U1tzKzFdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCl9ZWxzZSBpZig3Mj09PXcpZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKyspYT1TW3NdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCkKZWxzZSBpZigxMDQ9PT13KWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cysrKWErPVNbc10sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKQplbHNlIGlmKDg2PT09dylmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrKylsPVNbc10sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKQplbHNlIGlmKDExOD09PXcpZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKyspbCs9U1tzXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpCmVsc2UgaWYoNjc9PT13KXtpZihTLmxlbmd0aD49NiYmUy5sZW5ndGglNj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz02KWM9U1tzXSxwPVNbcysxXSxmPVNbcysyXSxtPVNbcyszXSxnPVNbcys0XSxkPVNbcys1XSx0aGlzLnBhcnNlUGF0aEN1cnZldG8oYyxwLGYsbSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZig5OT09PXcpe2lmKFMubGVuZ3RoPj02JiZTLmxlbmd0aCU2PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTYpYz1hK1Nbc10scD1sK1NbcysxXSxmPWErU1tzKzJdLG09bCtTW3MrM10sZz1hK1Nbcys0XSxkPWwrU1tzKzVdLHRoaXMucGFyc2VQYXRoQ3VydmV0byhjLHAsZixtLGcsZCksYT1nLGw9ZH1lbHNlIGlmKDgzPT09dyl7aWYoUy5sZW5ndGg+PTQmJlMubGVuZ3RoJTQ9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NCkiYyI9PT1yLnRvTG93ZXJDYXNlKCl8fCJzIj09PXIudG9Mb3dlckNhc2UoKT8odj10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzBdLHk9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVsxXSx4PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0sQT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdLGM9eCsoeC12KSxwPUErKEEteSkpOihjPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0scD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdKSxmPVNbc10sbT1TW3MrMV0sZz1TW3MrMl0sZD1TW3MrM10sdGhpcy5wYXJzZVBhdGhDdXJ2ZXRvKGMscCxmLG0sZyxkKSxhPWcsbD1kfWVsc2UgaWYoMTE1PT09dyl7aWYoUy5sZW5ndGg+PTQmJlMubGVuZ3RoJTQ9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NCkiYyI9PT1yLnRvTG93ZXJDYXNlKCl8fCJzIj09PXIudG9Mb3dlckNhc2UoKT8odj10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzBdLHk9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVsxXSx4PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0sQT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdLGM9eCsoeC12KSxwPUErKEEteSkpOihjPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0scD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdKSxmPWErU1tzXSxtPWwrU1tzKzFdLGc9YStTW3MrMl0sZD1sK1NbcyszXSx0aGlzLnBhcnNlUGF0aEN1cnZldG8oYyxwLGYsbSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZig4MT09PXcpe2lmKFMubGVuZ3RoPj00JiZTLmxlbmd0aCU0PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTQpaD1TW3NdLHU9U1tzKzFdLGc9U1tzKzJdLGQ9U1tzKzNdLHRoaXMucGFyc2VQYXRoUXVhZHRvKGEsbCxoLHUsZyxkKSxhPWcsbD1kfWVsc2UgaWYoMTEzPT09dyl7aWYoUy5sZW5ndGg+PTQmJlMubGVuZ3RoJTQ9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NCloPWErU1tzXSx1PWwrU1tzKzFdLGc9YStTW3MrMl0sZD1sK1NbcyszXSx0aGlzLnBhcnNlUGF0aFF1YWR0byhhLGwsaCx1LGcsZCksYT1nLGw9ZH1lbHNlIGlmKDg0PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9MikicSI9PT1yLnRvTG93ZXJDYXNlKCl8fCJ0Ij09PXIudG9Mb3dlckNhc2UoKT8odj10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzBdLHk9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVsxXSx4PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMF0sQT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzFdLGg9eCsoeC12KSx1PUErKEEteSkpOihoPWEsdT1sKSxnPVNbc10sZD1TW3MrMV0sdGhpcy5wYXJzZVBhdGhRdWFkdG8oYSxsLGgsdSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZigxMTY9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz0yKSJxIj09PXIudG9Mb3dlckNhc2UoKXx8InQiPT09ci50b0xvd2VyQ2FzZSgpPyh2PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMF0seT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzFdLHg9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxBPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0saD14Kyh4LXYpLHU9QSsoQS15KSk6KGg9YSx1PWwpLGc9YStTW3NdLGQ9bCtTW3MrMV0sdGhpcy5wYXJzZVBhdGhRdWFkdG8oYSxsLGgsdSxnLGQpLGE9ZyxsPWR9ZWxzZSA5MCE9PXcmJjEyMiE9PXd8fCh0aGlzLmNsb3NlPSEwKQpyPWkudG9TdHJpbmcoKX1lbHNlIGIrK319LG8ucHJvdG90eXBlLnBhcnNlUGF0aFF1YWR0bz1mdW5jdGlvbihlLHQscixpLHMsbyl7aWYoISh0aGlzLnZlcnRpY2VzLmxlbmd0aD4wKSl0aHJvdyJQYXRoIG11c3Qgc3RhcnQgd2l0aCBNL20iCnRoaXMucGFyc2VQYXRoQ29kZShuLkJFWklFUl9WRVJURVgpLHRoaXMucGFyc2VQYXRoVmVydGV4KGUrMiooci1lKS8zLHQrMiooaS10KS8zKSx0aGlzLnBhcnNlUGF0aFZlcnRleChzKzIqKHItcykvMyxvKzIqKGktbykvMyksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgocyxvKX0sby5wcm90b3R5cGUucGFyc2VQYXRoQ3VydmV0bz1mdW5jdGlvbihlLHQscixpLHMsbyl7aWYoISh0aGlzLnZlcnRpY2VzLmxlbmd0aD4wKSl0aHJvdyJQYXRoIG11c3Qgc3RhcnQgd2l0aCBNL20iCnRoaXMucGFyc2VQYXRoQ29kZShuLkJFWklFUl9WRVJURVgpLHRoaXMucGFyc2VQYXRoVmVydGV4KGUsdCksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgocixpKSx0aGlzLnBhcnNlUGF0aFZlcnRleChzLG8pfSxvLnByb3RvdHlwZS5wYXJzZVBhdGhMaW5ldG89ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMudmVydGljZXMubGVuZ3RoPjApKXRocm93IlBhdGggbXVzdCBzdGFydCB3aXRoIE0vbSIKdGhpcy5wYXJzZVBhdGhDb2RlKG4uVkVSVEVYKSx0aGlzLnBhcnNlUGF0aFZlcnRleChlLHQpLHRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV0ubW92ZVRvPSExfSxvLnByb3RvdHlwZS5wYXJzZVBhdGhNb3ZldG89ZnVuY3Rpb24oZSx0KXt0aGlzLnZlcnRpY2VzLmxlbmd0aD4wJiZ0aGlzLnBhcnNlUGF0aENvZGUobi5CUkVBSyksdGhpcy5wYXJzZVBhdGhDb2RlKG4uVkVSVEVYKSx0aGlzLnBhcnNlUGF0aFZlcnRleChlLHQpLHRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV0ubW92ZVRvPSEwfSxvLnByb3RvdHlwZS5wYXJzZVBhdGhWZXJ0ZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXQpuWzBdPWUsblsxXT10LHRoaXMudmVydGljZXMucHVzaChuKX0sby5wcm90b3R5cGUucGFyc2VQYXRoQ29kZT1mdW5jdGlvbihlKXt0aGlzLnZlcnRleENvZGVzLnB1c2goZSl9LG8ucHJvdG90eXBlLnBhcnNlUG9seT1mdW5jdGlvbihlKXt0aGlzLmZhbWlseT1uLlBBVEgsdGhpcy5jbG9zZT1lCnZhciByPXQudHJpbSh0aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJwb2ludHMiKS5yZXBsYWNlKC9bLFxzXSsvZywiICIpKQppZihudWxsIT09cil7dmFyIGk9ci5zcGxpdCgiICIpCmlmKGkubGVuZ3RoJTIhPT0wKXRocm93IkVycm9yIHBhcnNpbmcgcG9seWdvbiBwb2ludHM6IG9kZCBudW1iZXIgb2YgY29vcmRpbmF0ZXMgcHJvdmlkZWQiCmZvcih2YXIgcz0wLG89aS5sZW5ndGg7czxvO3MrKyl7dmFyIGE9W10KYVswXT1pW3NdLGFbMV09aVsrK3NdLHRoaXMudmVydGljZXMucHVzaChhKX19fSxvLnByb3RvdHlwZS5wYXJzZVJlY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmtpbmQ9bi5SRUNULHRoaXMuZmFtaWx5PW4uUFJJTUlUSVZFLHRoaXMucGFyYW1zPVtdLHRoaXMucGFyYW1zWzBdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieCIpLHRoaXMucGFyYW1zWzFdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieSIpLHRoaXMucGFyYW1zWzJdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgid2lkdGgiKSx0aGlzLnBhcmFtc1szXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoImhlaWdodCIpLHRoaXMucGFyYW1zWzJdPDB8fHRoaXMucGFyYW1zWzNdPDApdGhyb3cic3ZnIGVycm9yOiBuZWdhdGl2ZSB3aWR0aCBvciBoZWlnaHQgZm91bmQgd2hpbGUgcGFyc2luZyA8cmVjdD4ifSxvLnByb3RvdHlwZS5wYXJzZUVsbGlwc2U9ZnVuY3Rpb24oZSl7dGhpcy5raW5kPW4uRUxMSVBTRSx0aGlzLmZhbWlseT1uLlBSSU1JVElWRSx0aGlzLnBhcmFtcz1bXSx0aGlzLnBhcmFtc1swXT0wfHRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgiY3giKSx0aGlzLnBhcmFtc1sxXT0wfHRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgiY3kiKQp2YXIgdCxyCmlmKGUpe2lmKHQ9cj10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInIiKSx0PDApdGhyb3cic3ZnIGVycm9yOiBuZWdhdGl2ZSByYWRpdXMgZm91bmQgd2hpbGUgcGFyc2luZyA8Y2lyY2xlPiJ9ZWxzZSBpZih0PXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgicngiKSxyPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgicnkiKSx0PDB8fHI8MCl0aHJvdyJzdmcgZXJyb3I6IG5lZ2F0aXZlIHgtYXhpcyByYWRpdXMgb3IgeS1heGlzIHJhZGl1cyBmb3VuZCB3aGlsZSBwYXJzaW5nIDxlbGxpcHNlPiIKdGhpcy5wYXJhbXNbMF0tPXQsdGhpcy5wYXJhbXNbMV0tPXIsdGhpcy5wYXJhbXNbMl09Mip0LHRoaXMucGFyYW1zWzNdPTIqcn0sby5wcm90b3R5cGUucGFyc2VMaW5lPWZ1bmN0aW9uKCl7dGhpcy5raW5kPW4uTElORSx0aGlzLmZhbWlseT1uLlBSSU1JVElWRSx0aGlzLnBhcmFtcz1bXSx0aGlzLnBhcmFtc1swXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoIngxIiksdGhpcy5wYXJhbXNbMV09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ5MSIpLHRoaXMucGFyYW1zWzJdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieDIiKSx0aGlzLnBhcmFtc1szXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInkyIil9LG8ucHJvdG90eXBlLnBhcnNlQ29sb3JzPWZ1bmN0aW9uKGUpe2lmKGUuaGFzQXR0cmlidXRlKCJvcGFjaXR5IikmJnRoaXMuc2V0T3BhY2l0eShlLmdldEF0dHJpYnV0ZSgib3BhY2l0eSIpKSxlLmhhc0F0dHJpYnV0ZSgic3Ryb2tlIikmJnRoaXMuc2V0U3Ryb2tlKGUuZ2V0QXR0cmlidXRlKCJzdHJva2UiKSksZS5oYXNBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIpJiZ0aGlzLnNldFN0cm9rZVdlaWdodChlLmdldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIikpLGUuaGFzQXR0cmlidXRlKCJzdHJva2UtbGluZWpvaW4iKSYmdGhpcy5zZXRTdHJva2VKb2luKGUuZ2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWpvaW4iKSksZS5oYXNBdHRyaWJ1dGUoInN0cm9rZS1saW5lY2FwIikmJnRoaXMuc2V0U3Ryb2tlQ2FwKGUuZ2V0U3RyaW5nQXR0cmlidXRlKCJzdHJva2UtbGluZWNhcCIpKSxlLmhhc0F0dHJpYnV0ZSgiZmlsbCIpJiZ0aGlzLnNldEZpbGwoZS5nZXRTdHJpbmdBdHRyaWJ1dGUoImZpbGwiKSksZS5oYXNBdHRyaWJ1dGUoInN0eWxlIikpZm9yKHZhciBuPWUuZ2V0U3RyaW5nQXR0cmlidXRlKCJzdHlsZSIpLHI9bi50b1N0cmluZygpLnNwbGl0KCI7IiksaT0wLHM9ci5sZW5ndGg7aTxzO2krKyl7dmFyIG89dC50cmltKHJbaV0uc3BsaXQoIjoiKSkKImZpbGwiPT09b1swXT90aGlzLnNldEZpbGwob1sxXSk6ImZpbGwtb3BhY2l0eSI9PT1vWzBdP3RoaXMuc2V0RmlsbE9wYWNpdHkob1sxXSk6InN0cm9rZSI9PT1vWzBdP3RoaXMuc2V0U3Ryb2tlKG9bMV0pOiJzdHJva2Utd2lkdGgiPT09b1swXT90aGlzLnNldFN0cm9rZVdlaWdodChvWzFdKToic3Ryb2tlLWxpbmVjYXAiPT09b1swXT90aGlzLnNldFN0cm9rZUNhcChvWzFdKToic3Ryb2tlLWxpbmVqb2luIj09PW9bMF0/dGhpcy5zZXRTdHJva2VKb2luKG9bMV0pOiJzdHJva2Utb3BhY2l0eSI9PT1vWzBdP3RoaXMuc2V0U3Ryb2tlT3BhY2l0eShvWzFdKToib3BhY2l0eSI9PT1vWzBdJiZ0aGlzLnNldE9wYWNpdHkob1sxXSl9fSxvLnByb3RvdHlwZS5zZXRGaWxsT3BhY2l0eT1mdW5jdGlvbihlKXt0aGlzLmZpbGxPcGFjaXR5PXBhcnNlRmxvYXQoZSksdGhpcy5maWxsQ29sb3I9MjU1KnRoaXMuZmlsbE9wYWNpdHk8PDI0fDE2Nzc3MjE1JnRoaXMuZmlsbENvbG9yfSxvLnByb3RvdHlwZS5zZXRGaWxsPWZ1bmN0aW9uKGUpe3ZhciB0PTQyNzgxOTAwODAmdGhpcy5maWxsQ29sb3IKIm5vbmUiPT09ZT90aGlzLmZpbGw9ITE6MD09PWUuaW5kZXhPZigiIyIpPyh0aGlzLmZpbGw9ITAsND09PWUubGVuZ3RoJiYoZT1lLnJlcGxhY2UoLyMoLikoLikoLikvLCIjJDEkMSQyJDIkMyQzIikpLHRoaXMuZmlsbENvbG9yPXR8MTY3NzcyMTUmcGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTYpKTowPT09ZS5pbmRleE9mKCJyZ2IiKT8odGhpcy5maWxsPSEwLHRoaXMuZmlsbENvbG9yPXR8dGhpcy5wYXJzZVJHQihlKSk6MD09PWUuaW5kZXhPZigidXJsKCMiKT90aGlzLmZpbGxOYW1lPWUuc3Vic3RyaW5nKDUsZS5sZW5ndGgtMSk6c1tlXSYmKHRoaXMuZmlsbD0hMCx0aGlzLmZpbGxDb2xvcj10fDE2Nzc3MjE1JnBhcnNlSW50KHNbZV0uc3Vic3RyaW5nKDEpLDE2KSl9LG8ucHJvdG90eXBlLnNldE9wYWNpdHk9ZnVuY3Rpb24oZSl7dGhpcy5zdHJva2VDb2xvcj0yNTUqcGFyc2VGbG9hdChlKTw8MjR8MTY3NzcyMTUmdGhpcy5zdHJva2VDb2xvcix0aGlzLmZpbGxDb2xvcj0yNTUqcGFyc2VGbG9hdChlKTw8MjR8MTY3NzcyMTUmdGhpcy5maWxsQ29sb3J9LG8ucHJvdG90eXBlLnNldFN0cm9rZT1mdW5jdGlvbihlKXt2YXIgdD00Mjc4MTkwMDgwJnRoaXMuc3Ryb2tlQ29sb3IKIm5vbmUiPT09ZT90aGlzLnN0cm9rZT0hMToiIyI9PT1lLmNoYXJBdCgwKT8odGhpcy5zdHJva2U9ITAsND09PWUubGVuZ3RoJiYoZT1lLnJlcGxhY2UoLyMoLikoLikoLikvLCIjJDEkMSQyJDIkMyQzIikpLHRoaXMuc3Ryb2tlQ29sb3I9dHwxNjc3NzIxNSZwYXJzZUludChlLnN1YnN0cmluZygxKSwxNikpOjA9PT1lLmluZGV4T2YoInJnYiIpPyh0aGlzLnN0cm9rZT0hMCx0aGlzLnN0cm9rZUNvbG9yPXR8dGhpcy5wYXJzZVJHQihlKSk6MD09PWUuaW5kZXhPZigidXJsKCMiKT90aGlzLnN0cm9rZU5hbWU9ZS5zdWJzdHJpbmcoNSxlLmxlbmd0aC0xKTpzW2VdJiYodGhpcy5zdHJva2U9ITAsdGhpcy5zdHJva2VDb2xvcj10fDE2Nzc3MjE1JnBhcnNlSW50KHNbZV0uc3Vic3RyaW5nKDEpLDE2KSl9LG8ucHJvdG90eXBlLnNldFN0cm9rZVdlaWdodD1mdW5jdGlvbihlKXt0aGlzLnN0cm9rZVdlaWdodD10aGlzLnBhcnNlVW5pdFNpemUoZSl9LG8ucHJvdG90eXBlLnNldFN0cm9rZUpvaW49ZnVuY3Rpb24oZSl7Im1pdGVyIj09PWU/dGhpcy5zdHJva2VKb2luPW4uTUlURVI6InJvdW5kIj09PWU/dGhpcy5zdHJva2VKb2luPW4uUk9VTkQ6ImJldmVsIj09PWUmJih0aGlzLnN0cm9rZUpvaW49bi5CRVZFTCl9LG8ucHJvdG90eXBlLnNldFN0cm9rZUNhcD1mdW5jdGlvbihlKXsiYnV0dCI9PT1lP3RoaXMuc3Ryb2tlQ2FwPW4uU1FVQVJFOiJyb3VuZCI9PT1lP3RoaXMuc3Ryb2tlQ2FwPW4uUk9VTkQ6InNxdWFyZSI9PT1lJiYodGhpcy5zdHJva2VDYXA9bi5QUk9KRUNUKX0sby5wcm90b3R5cGUuc2V0U3Ryb2tlT3BhY2l0eT1mdW5jdGlvbihlKXt0aGlzLnN0cm9rZU9wYWNpdHk9cGFyc2VGbG9hdChlKSx0aGlzLnN0cm9rZUNvbG9yPTI1NSp0aGlzLnN0cm9rZU9wYWNpdHk8PDI0fDE2Nzc3MjE1JnRoaXMuc3Ryb2tlQ29sb3J9LG8ucHJvdG90eXBlLnBhcnNlUkdCPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3Vic3RyaW5nKGUuaW5kZXhPZigiKCIpKzEsZS5pbmRleE9mKCIpIikpLG49dC5zcGxpdCgiLCAiKQpyZXR1cm4gblswXTw8MTZ8blsxXTw8OHxuWzJdfSxvLnByb3RvdHlwZS5wYXJzZVVuaXRTaXplPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLTIKcmV0dXJuIHQ8MD9lOmUuaW5kZXhPZigicHQiKT09PXQ/MS4yNSpwYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOmUuaW5kZXhPZigicGMiKT09PXQ/MTUqcGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTplLmluZGV4T2YoIm1tIik9PT10PzMuNTQzMzA3KnBhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6ZS5pbmRleE9mKCJjbSIpPT09dD8zNS40MzMwNypwYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOmUuaW5kZXhPZigiaW4iKT09PXQ/OTAqcGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTplLmluZGV4T2YoInB4Iik9PT10P3BhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6cGFyc2VGbG9hdChlKX0sb319LHt9XSwxODpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4pe3RoaXMueD1lfHwwLHRoaXMueT10fHwwLHRoaXMuej1ufHwwfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIHI9dC5nZXQoKQpyZXR1cm4gcltlXShuKSxyfX12YXIgaT1lLlBDb25zdGFudHMKbi5mcm9tQW5nbGU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gciE9PXQmJm51bGwhPT1yfHwocj1uZXcgbiksci54PU1hdGguY29zKGUpLHIueT1NYXRoLnNpbihlKSxyfSxuLnJhbmRvbTJEPWZ1bmN0aW9uKGUpe3JldHVybiBuLmZyb21BbmdsZShNYXRoLnJhbmRvbSgpKmkuVFdPX1BJLGUpfSxuLnJhbmRvbTNEPWZ1bmN0aW9uKGUpe3ZhciByPU1hdGgucmFuZG9tKCkqaS5UV09fUEkscz0yKk1hdGgucmFuZG9tKCktMSxvPU1hdGguc3FydCgxLXMqcyksYT1vKk1hdGguY29zKHIpLGw9bypNYXRoLnNpbihyKQpyZXR1cm4gZT09PXR8fG51bGw9PT1lP2U9bmV3IG4oYSxsLHMpOmUuc2V0KGEsbCxzKSxlfSxuLmRpc3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5kaXN0KHQpfSxuLmRvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmRvdCh0KX0sbi5jcm9zcz1mdW5jdGlvbihlLHQpe3JldHVybiBlLmNyb3NzKHQpfSxuLnN1Yj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbihlLngtdC54LGUueS10LnksZS56LXQueil9LG4uYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguYWNvcyhlLmRvdCh0KS9NYXRoLnNxcnQoZS5tYWdTcSgpKnQubWFnU3EoKSkpfSxuLmxlcnA9ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPW5ldyBuKGUueCxlLnksZS56KQpyZXR1cm4gaS5sZXJwKHQsciksaX0sbi5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQsbil7MT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5zZXQoZS54fHxlWzBdfHwwLGUueXx8ZVsxXXx8MCxlLnp8fGVbMl18fDApOih0aGlzLng9ZSx0aGlzLnk9dCx0aGlzLno9bil9LGdldDpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLngsdGhpcy55LHRoaXMueil9LG1hZzpmdW5jdGlvbigpe3ZhciBlPXRoaXMueCx0PXRoaXMueSxuPXRoaXMuegpyZXR1cm4gTWF0aC5zcXJ0KGUqZSt0KnQrbipuKX0sbWFnU3E6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLngsdD10aGlzLnksbj10aGlzLnoKcmV0dXJuIGUqZSt0KnQrbipufSxzZXRNYWc6ZnVuY3Rpb24oZSxuKXtpZihuIT09dCl7dmFyIHI9ZQpyZXR1cm4gci5ub3JtYWxpemUoKSxyLm11bHQobikscn1uPWUsdGhpcy5ub3JtYWxpemUoKSx0aGlzLm11bHQobil9LGFkZDpmdW5jdGlvbihlLHQsbil7MT09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMueCs9ZS54LHRoaXMueSs9ZS55LHRoaXMueis9ZS56KToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54Kz1lLHRoaXMueSs9dCk6KHRoaXMueCs9ZSx0aGlzLnkrPXQsdGhpcy56Kz1uKX0sc3ViOmZ1bmN0aW9uKGUsdCxuKXsxPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54LT1lLngsdGhpcy55LT1lLnksdGhpcy56LT1lLnopOjI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLngtPWUsdGhpcy55LT10KToodGhpcy54LT1lLHRoaXMueS09dCx0aGlzLnotPW4pfSxtdWx0OmZ1bmN0aW9uKGUpeyJudW1iZXIiPT10eXBlb2YgZT8odGhpcy54Kj1lLHRoaXMueSo9ZSx0aGlzLnoqPWUpOih0aGlzLngqPWUueCx0aGlzLnkqPWUueSx0aGlzLnoqPWUueil9LGRpdjpmdW5jdGlvbihlKXsibnVtYmVyIj09dHlwZW9mIGU/KHRoaXMueC89ZSx0aGlzLnkvPWUsdGhpcy56Lz1lKToodGhpcy54Lz1lLngsdGhpcy55Lz1lLnksdGhpcy56Lz1lLnopfSxyb3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy54LG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKQp0aGlzLng9bip0aGlzLngtcip0aGlzLnksdGhpcy55PXIqdCtuKnRoaXMueX0sZGlzdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLngtZS54LG49dGhpcy55LWUueSxyPXRoaXMuei1lLnoKcmV0dXJuIE1hdGguc3FydCh0KnQrbipuK3Iqcil9LGRvdDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMueCplLngrdGhpcy55KmUueSt0aGlzLnoqZS56OnRoaXMueCplK3RoaXMueSp0K3RoaXMueipufSxjcm9zczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLngscj10aGlzLnksaT10aGlzLnoKcmV0dXJuIG5ldyBuKHIqZS56LWUueSppLGkqZS54LWUueip0LHQqZS55LWUueCpyKX0sbGVycDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxzLG89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlKyh0LWUpKm59CjI9PT1hcmd1bWVudHMubGVuZ3RoPyhyPXQsaT1lLngscz1lLnksbj1lLnopOihpPWUscz10KSx0aGlzLng9byh0aGlzLngsaSxyKSx0aGlzLnk9byh0aGlzLnkscyxyKSx0aGlzLno9byh0aGlzLnosbixyKX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYWcoKQplPjAmJnRoaXMuZGl2KGUpfSxsaW1pdDpmdW5jdGlvbihlKXt0aGlzLm1hZygpPmUmJih0aGlzLm5vcm1hbGl6ZSgpLHRoaXMubXVsdChlKSl9LGhlYWRpbmc6ZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5hdGFuMigtdGhpcy55LHRoaXMueCl9LGhlYWRpbmcyRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRpbmcoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iWyIrdGhpcy54KyIsICIrdGhpcy55KyIsICIrdGhpcy56KyJdIn0sYXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy54LHRoaXMueSx0aGlzLnpdfX0KZm9yKHZhciBzIGluIG4ucHJvdG90eXBlKW4ucHJvdG90eXBlLmhhc093blByb3BlcnR5KHMpJiYhbi5oYXNPd25Qcm9wZXJ0eShzKSYmKG5bc109cihzKSkKcmV0dXJuIG59fSx7fV0sMTk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMuZnVsbE5hbWU9ZXx8IiIsdGhpcy5uYW1lPXR8fCIiLHRoaXMubmFtZXNwYWNlPW58fCIiLHRoaXMudmFsdWU9cix0aGlzLnR5cGU9aX0KcmV0dXJuIGUucHJvdG90eXBlPXtnZXROYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sZ2V0RnVsbE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mdWxsTmFtZX0sZ2V0TmFtZXNwYWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZXNwYWNlfSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX0sc2V0VmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy52YWx1ZT1lfX0sZX19LHt9XSwyMDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuQnJvd3NlcixyPW4uYWpheCxpPW4ud2luZG93LHM9KGkuWE1MSHR0cFJlcXVlc3QsaS5ET01QYXJzZXIpLG89ZS5YTUxBdHRyaWJ1dGUsYT1mdW5jdGlvbihlLG4scixpKXt0aGlzLmF0dHJpYnV0ZXM9W10sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLmZ1bGxOYW1lPW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy5uYW1lc3BhY2U9IiIsdGhpcy5jb250ZW50PW51bGwsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmxpbmVOcj0iIix0aGlzLnN5c3RlbUlEPSIiLHRoaXMudHlwZT0iRUxFTUVOVCIsZSYmKCJzdHJpbmciPT10eXBlb2YgZT9uPT09dCYmZS5pbmRleE9mKCI8Iik+LTE/dGhpcy5wYXJzZShlKToodGhpcy5mdWxsTmFtZT1lLHRoaXMubmFtZXNwYWNlPW4sdGhpcy5zeXN0ZW1JZD1yLHRoaXMubGluZU5yPWkpOnRoaXMucGFyc2UobiwhMCkpfQpyZXR1cm4gYS5wcm90b3R5cGU9e3BhcnNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4KdHJ5e3QmJihlPXIoZSkpLG49KG5ldyBzKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKQp2YXIgaT1uLmRvY3VtZW50RWxlbWVudAppZighaSl0aHJvdyJFcnJvciBsb2FkaW5nIGRvY3VtZW50IgpyZXR1cm4gdGhpcy5wYXJzZUNoaWxkcmVuUmVjdXJzaXZlKG51bGwsaSksdGhpc31jYXRjaChlKXt0aHJvdyBlfX0scGFyc2VDaGlsZHJlblJlY3Vyc2l2ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLGwsaAppZihlPyhuPW5ldyBhKHQubm9kZU5hbWUpLG4ucGFyZW50PWUpOih0aGlzLmZ1bGxOYW1lPXQubG9jYWxOYW1lLHRoaXMubmFtZT10Lm5vZGVOYW1lLG49dGhpcyksMz09PXQubm9kZVR5cGUmJiIiIT09dC50ZXh0Q29udGVudClyZXR1cm4gdGhpcy5jcmVhdGVQQ0RhdGFFbGVtZW50KHQudGV4dENvbnRlbnQpCmlmKDQ9PT10Lm5vZGVUeXBlKXJldHVybiB0aGlzLmNyZWF0ZUNEYXRhRWxlbWVudCh0LnRleHRDb250ZW50KQppZih0LmF0dHJpYnV0ZXMpZm9yKHM9MCxsPXQuYXR0cmlidXRlcy5sZW5ndGg7czxsO3MrKylpPXQuYXR0cmlidXRlc1tzXSxyPW5ldyBvKGkuZ2V0bmFtZSxpLm5vZGVOYW1lLGkubmFtZXNwYWNlVVJJLGkubm9kZVZhbHVlLGkubm9kZVR5cGUpLG4uYXR0cmlidXRlcy5wdXNoKHIpCmlmKHQuY2hpbGROb2Rlcylmb3Iocz0wLGw9dC5jaGlsZE5vZGVzLmxlbmd0aDtzPGw7cysrKXt2YXIgdT10LmNoaWxkTm9kZXNbc10KaD1uLnBhcnNlQ2hpbGRyZW5SZWN1cnNpdmUobix1KSxudWxsIT09aCYmbi5jaGlsZHJlbi5wdXNoKGgpfXJldHVybiBufSxjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiByPT09dD9uZXcgYShlLG4pOm5ldyBhKGUsbixyLGkpfSxjcmVhdGVQQ0RhdGFFbGVtZW50OmZ1bmN0aW9uKGUsdCl7aWYoIiI9PT1lLnJlcGxhY2UoL15ccyskL2csIiIpKXJldHVybiBudWxsCnZhciBuPW5ldyBhCnJldHVybiBuLnR5cGU9IlRFWFQiLG4uY29udGVudD1lLG59LGNyZWF0ZUNEYXRhRWxlbWVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNyZWF0ZVBDRGF0YUVsZW1lbnQoZSkKaWYobnVsbD09PXQpcmV0dXJuIG51bGwKdC50eXBlPSJDREFUQSIKdmFyIG4scj17IjwiOiImbHQ7IiwiPiI6IiZndDsiLCInIjoiJmFwb3M7IiwnIic6IiZxdW90OyJ9CmZvcihuIGluIHIpT2JqZWN0Lmhhc093blByb3BlcnR5KHIsbil8fChlPWUucmVwbGFjZShuZXcgUmVnRXhwKG4sImciKSxyW25dKSkKcmV0dXJuIHQuY2RhdGE9ZSx0fSxoYXNBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bnVsbCE9PXRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/bnVsbCE9PXRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnZvaWQgMH0sZXF1YWxzOmZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIGEpKXJldHVybiExCnZhciB0LG4KaWYodGhpcy5mdWxsTmFtZSE9PWUuZnVsbE5hbWUpcmV0dXJuITEKaWYodGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCE9PWUuZ2V0QXR0cmlidXRlQ291bnQoKSlyZXR1cm4hMQppZih0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoIT09ZS5hdHRyaWJ1dGVzLmxlbmd0aClyZXR1cm4hMQp2YXIgcixpLHMKZm9yKHQ9MCxuPXRoaXMuYXR0cmlidXRlcy5sZW5ndGg7dDxuO3QrKyl7aWYocj10aGlzLmF0dHJpYnV0ZXNbdF0uZ2V0TmFtZSgpLGk9dGhpcy5hdHRyaWJ1dGVzW3RdLmdldE5hbWVzcGFjZSgpLHM9ZS5maW5kQXR0cmlidXRlKHIsaSksbnVsbD09PXMpcmV0dXJuITEKaWYodGhpcy5hdHRyaWJ1dGVzW3RdLmdldFZhbHVlKCkhPT1zLmdldFZhbHVlKCkpcmV0dXJuITEKaWYodGhpcy5hdHRyaWJ1dGVzW3RdLmdldFR5cGUoKSE9PXMuZ2V0VHlwZSgpKXJldHVybiExfWlmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIT09ZS5nZXRDaGlsZENvdW50KCkpcmV0dXJuITEKaWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7dmFyIG8sbApmb3IodD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKylpZihvPXRoaXMuZ2V0Q2hpbGQodCksbD1lLmdldENoaWxkKHQpLCFvLmVxdWFscyhsKSlyZXR1cm4hMQpyZXR1cm4hMH1yZXR1cm4gdGhpcy5jb250ZW50PT09ZS5jb250ZW50fSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7aWYoIlRFWFQiPT09dGhpcy50eXBlfHwiQ0RBVEEiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLmNvbnRlbnQKdmFyIGU9dGhpcy5jaGlsZHJlbgpyZXR1cm4gMSE9PWUubGVuZ3RofHwiVEVYVCIhPT1lWzBdLnR5cGUmJiJDREFUQSIhPT1lWzBdLnR5cGU/bnVsbDplWzBdLmNvbnRlbnR9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbigpe3ZhciBlCnJldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aD8oZT10aGlzLmZpbmRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdKSxlP2UuZ2V0VmFsdWUoKTphcmd1bWVudHNbMV0pOjE9PT1hcmd1bWVudHMubGVuZ3RoPyhlPXRoaXMuZmluZEF0dHJpYnV0ZShhcmd1bWVudHNbMF0pLGU/ZS5nZXRWYWx1ZSgpOm51bGwpOjM9PT1hcmd1bWVudHMubGVuZ3RoPyhlPXRoaXMuZmluZEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSxlP2UuZ2V0VmFsdWUoKTphcmd1bWVudHNbMl0pOnZvaWQgMH0sZ2V0U3RyaW5nQXR0cmlidXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pfSxnZXRTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKGUpfSxnZXRGbG9hdEF0dHJpYnV0ZTpmdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9wYXJzZUZsb2F0KHRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSwwKSk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pfSxnZXRGbG9hdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRGbG9hdEF0dHJpYnV0ZShlKX0sZ2V0SW50QXR0cmlidXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSwwKToyPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSl9LGdldEludDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRJbnRBdHRyaWJ1dGUoZSl9LGhhc0NoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjB9LGFkZENoaWxkOmZ1bmN0aW9uKGUpe251bGwhPT1lJiYoZS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goZSkpfSxpbnNlcnRDaGlsZDpmdW5jdGlvbihlLHQpe2lmKGUpe2lmKG51bGw9PT1lLmdldExvY2FsTmFtZSgpJiYhdGhpcy5oYXNDaGlsZHJlbigpKXt2YXIgbj10aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdCmlmKG51bGw9PT1uLmdldExvY2FsTmFtZSgpKXJldHVybiB2b2lkIG4uc2V0Q29udGVudChuLmdldENvbnRlbnQoKStlLmdldENvbnRlbnQoKSl9ZS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnNwbGljZSh0LDAsZSl9fSxnZXRDaGlsZDpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIHRoaXMuY2hpbGRyZW5bZV0KaWYoZS5pbmRleE9mKCIvIikhPT0tMSlyZXR1cm4gdGhpcy5nZXRDaGlsZFJlY3Vyc2l2ZShlLnNwbGl0KCIvIiksMCkKZm9yKHZhciB0LG4scj0wLGk9dGhpcy5nZXRDaGlsZENvdW50KCk7cjxpO3IrKylpZih0PXRoaXMuZ2V0Q2hpbGQociksbj10LmdldE5hbWUoKSxudWxsIT09biYmbj09PWUpcmV0dXJuIHQKcmV0dXJuIG51bGx9LGdldENoaWxkcmVuOmZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXJldHVybiB0aGlzLmdldENoaWxkKGFyZ3VtZW50c1swXSkKaWYoYXJndW1lbnRzWzBdLmluZGV4T2YoIi8iKSE9PS0xKXJldHVybiB0aGlzLmdldENoaWxkcmVuUmVjdXJzaXZlKGFyZ3VtZW50c1swXS5zcGxpdCgiLyIpLDApCmZvcih2YXIgZSx0LG49W10scj0wLGk9dGhpcy5nZXRDaGlsZENvdW50KCk7cjxpO3IrKyllPXRoaXMuZ2V0Q2hpbGQociksdD1lLmdldE5hbWUoKSxudWxsIT09dCYmdD09PWFyZ3VtZW50c1swXSYmbi5wdXNoKGUpCnJldHVybiBufXJldHVybiB0aGlzLmNoaWxkcmVufSxnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RofSxnZXRDaGlsZFJlY3Vyc2l2ZTpmdW5jdGlvbihlLHQpe2lmKHQ9PT1lLmxlbmd0aClyZXR1cm4gdGhpcwpmb3IodmFyIG4scixpPWVbdF0scz0wLG89dGhpcy5nZXRDaGlsZENvdW50KCk7czxvO3MrKylpZihuPXRoaXMuZ2V0Q2hpbGQocykscj1uLmdldE5hbWUoKSxudWxsIT09ciYmcj09PWkpcmV0dXJuIG4uZ2V0Q2hpbGRSZWN1cnNpdmUoZSx0KzEpCnJldHVybiBudWxsfSxnZXRDaGlsZHJlblJlY3Vyc2l2ZTpmdW5jdGlvbihlLHQpe2lmKHQ9PT1lLmxlbmd0aC0xKXJldHVybiB0aGlzLmdldENoaWxkcmVuKGVbdF0pCmZvcih2YXIgbj10aGlzLmdldENoaWxkcmVuKGVbdF0pLHI9W10saT0wO2k8bi5sZW5ndGg7aSsrKXI9ci5jb25jYXQobltpXS5nZXRDaGlsZHJlblJlY3Vyc2l2ZShlLHQrMSkpCnJldHVybiByfSxpc0xlYWY6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5oYXNDaGlsZHJlbigpfSxsaXN0Q2hpbGRyZW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKyllLnB1c2godGhpcy5nZXRDaGlsZCh0KS5nZXROYW1lKCkpCnJldHVybiBlfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXt0aGlzLm5hbWVzcGFjZT10fHwiIgpmb3IodmFyIG49MCxyPXRoaXMuYXR0cmlidXRlcy5sZW5ndGg7bjxyO24rKylpZih0aGlzLmF0dHJpYnV0ZXNbbl0uZ2V0TmFtZSgpPT09ZSYmdGhpcy5hdHRyaWJ1dGVzW25dLmdldE5hbWVzcGFjZSgpPT09dGhpcy5uYW1lc3BhY2Upe3RoaXMuYXR0cmlidXRlcy5zcGxpY2UobiwxKQpicmVha319LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciB0PTAsbj10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKWlmKHRoaXMuY2hpbGRyZW5bdF0uZXF1YWxzKGUpKXt0aGlzLmNoaWxkcmVuLnNwbGljZSh0LDEpCmJyZWFrfX0scmVtb3ZlQ2hpbGRBdEluZGV4OmZ1bmN0aW9uKGUpe3RoaXMuY2hpbGRyZW4ubGVuZ3RoPmUmJnRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSl9LGZpbmRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXt0aGlzLm5hbWVzcGFjZT10fHwiIgpmb3IodmFyIG49MCxyPXRoaXMuYXR0cmlidXRlcy5sZW5ndGg7bjxyO24rKylpZih0aGlzLmF0dHJpYnV0ZXNbbl0uZ2V0TmFtZSgpPT09ZSYmdGhpcy5hdHRyaWJ1dGVzW25dLmdldE5hbWVzcGFjZSgpPT09dGhpcy5uYW1lc3BhY2UpcmV0dXJuIHRoaXMuYXR0cmlidXRlc1tuXQpyZXR1cm4gbnVsbH0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKCl7dmFyIGUKaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXS5pbmRleE9mKCI6Iiksbj1hcmd1bWVudHNbMF0uc3Vic3RyaW5nKHQrMSkKZT10aGlzLmZpbmRBdHRyaWJ1dGUobixhcmd1bWVudHNbMV0pLGU/ZS5zZXRWYWx1ZShhcmd1bWVudHNbMl0pOihlPW5ldyBvKGFyZ3VtZW50c1swXSxuLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sIkNEQVRBIiksdGhpcy5hdHRyaWJ1dGVzLnB1c2goZSkpfWVsc2UgZT10aGlzLmZpbmRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdKSxlP2Uuc2V0VmFsdWUoYXJndW1lbnRzWzFdKTooZT1uZXcgbyhhcmd1bWVudHNbMF0sYXJndW1lbnRzWzBdLG51bGwsYXJndW1lbnRzWzFdLCJDREFUQSIpLHRoaXMuYXR0cmlidXRlcy5wdXNoKGUpKX0sc2V0U3RyaW5nOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXRBdHRyaWJ1dGUoZSx0KX0sc2V0SW50OmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXRBdHRyaWJ1dGUoZSx0KX0sc2V0RmxvYXQ6ZnVuY3Rpb24oZSx0KXt0aGlzLnNldEF0dHJpYnV0ZShlLHQpfSxzZXRDb250ZW50OmZ1bmN0aW9uKGUpe3RoaXMuY2hpbGRyZW4ubGVuZ3RoPjAmJlByb2Nlc3NpbmcuZGVidWcoIlRyaWVkIHRvIHNldCBjb250ZW50IGZvciBYTUxFbGVtZW50IHdpdGggY2hpbGRyZW4iKSx0aGlzLmNvbnRlbnQ9ZX0sc2V0TmFtZTpmdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMubmFtZT1hcmd1bWVudHNbMF0sdGhpcy5mdWxsTmFtZT1hcmd1bWVudHNbMF0sdGhpcy5uYW1lc3BhY2U9bnVsbAplbHNle3ZhciBlPWFyZ3VtZW50c1swXS5pbmRleE9mKCI6IikKbnVsbD09PWFyZ3VtZW50c1sxXXx8ZTwwP3RoaXMubmFtZT1hcmd1bWVudHNbMF06dGhpcy5uYW1lPWFyZ3VtZW50c1swXS5zdWJzdHJpbmcoZSsxKSx0aGlzLmZ1bGxOYW1lPWFyZ3VtZW50c1swXSx0aGlzLm5hbWVzcGFjZT1hcmd1bWVudHNbMV19fSxnZXROYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnVsbE5hbWV9LGdldExvY2FsTmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LGdldEF0dHJpYnV0ZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7aWYoIlRFWFQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLmNvbnRlbnR8fCIiCmlmKCJDREFUQSI9PT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuY2RhdGF8fCIiCnZhciBlLHQsbj10aGlzLmZ1bGxOYW1lLHI9IjwiK24KZm9yKGU9MDtlPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLmF0dHJpYnV0ZXNbZV0Kcis9IiAiK2kuZ2V0TmFtZSgpKyc9IicraS5nZXRWYWx1ZSgpKyciJ31pZigwPT09dGhpcy5jaGlsZHJlbi5sZW5ndGgpcis9IiI9PT10aGlzLmNvbnRlbnR8fG51bGw9PT10aGlzLmNvbnRlbnR8fHZvaWQgMD09PXRoaXMuY29udGVudD8iLz4iOiI+Iit0aGlzLmNvbnRlbnQrIjwvIituKyI+IgplbHNle2ZvcihyKz0iPiIsdD0wO3Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7dCsrKXIrPXRoaXMuY2hpbGRyZW5bdF0udG9TdHJpbmcoKQpyKz0iPC8iK24rIj4ifXJldHVybiByfX0sYS5wYXJzZT1mdW5jdGlvbihlKXt2YXIgdD1uZXcgYQpyZXR1cm4gdC5wYXJzZShlKSx0fSxhfX0se31dLDIxOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmVlbjoiIzAwNjQwMCIsZGFya2toYWtpOiIjYmRiNzZiIixkYXJrbWFnZW50YToiIzhiMDA4YiIsZGFya29saXZlZ3JlZW46IiM1NTZiMmYiLGRhcmtvcmFuZ2U6IiNmZjhjMDAiLGRhcmtvcmNoaWQ6IiM5OTMyY2MiLGRhcmtyZWQ6IiM4YjAwMDAiLGRhcmtzYWxtb246IiNlOTk2N2EiLGRhcmtzZWFncmVlbjoiIzhmYmM4ZiIsZGFya3NsYXRlYmx1ZToiIzQ4M2Q4YiIsZGFya3NsYXRlZ3JheToiIzJmNGY0ZiIsZGFya3R1cnF1b2lzZToiIzAwY2VkMSIsZGFya3Zpb2xldDoiIzk0MDBkMyIsZGVlcHBpbms6IiNmZjE0OTMiLGRlZXBza3libHVlOiIjMDBiZmZmIixkaW1ncmF5OiIjNjk2OTY5Iixkb2RnZXJibHVlOiIjMWU5MGZmIixmaXJlYnJpY2s6IiNiMjIyMjIiLGZsb3JhbHdoaXRlOiIjZmZmYWYwIixmb3Jlc3RncmVlbjoiIzIyOGIyMiIsZnVjaHNpYToiI2ZmMDBmZiIsZ2FpbnNib3JvOiIjZGNkY2RjIixnaG9zdHdoaXRlOiIjZjhmOGZmIixnb2xkOiIjZmZkNzAwIixnb2xkZW5yb2Q6IiNkYWE1MjAiLGdyYXk6IiM4MDgwODAiLGdyZWVuOiIjMDA4MDAwIixncmVlbnllbGxvdzoiI2FkZmYyZiIsaG9uZXlkZXc6IiNmMGZmZjAiLGhvdHBpbms6IiNmZjY5YjQiLGluZGlhbnJlZDoiI2NkNWM1YyIsaW5kaWdvOiIjNGIwMDgyIixpdm9yeToiI2ZmZmZmMCIsa2hha2k6IiNmMGU2OGMiLGxhdmVuZGVyOiIjZTZlNmZhIixsYXZlbmRlcmJsdXNoOiIjZmZmMGY1IixsYXduZ3JlZW46IiM3Y2ZjMDAiLGxlbW9uY2hpZmZvbjoiI2ZmZmFjZCIsbGlnaHRibHVlOiIjYWRkOGU2IixsaWdodGNvcmFsOiIjZjA4MDgwIixsaWdodGN5YW46IiNlMGZmZmYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjZmFmYWQyIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c3RlZWxibHVlOiIjYjBjNGRlIixsaWdodHllbGxvdzoiI2ZmZmZlMCIsbGltZToiIzAwZmYwMCIsbGltZWdyZWVuOiIjMzJjZDMyIixsaW5lbjoiI2ZhZjBlNiIsbWFnZW50YToiI2ZmMDBmZiIsbWFyb29uOiIjODAwMDAwIixtZWRpdW1hcXVhbWFyaW5lOiIjNjZjZGFhIixtZWRpdW1ibHVlOiIjMDAwMGNkIixtZWRpdW1vcmNoaWQ6IiNiYTU1ZDMiLG1lZGl1bXB1cnBsZToiIzkzNzBkOCIsbWVkaXVtc2VhZ3JlZW46IiMzY2IzNzEiLG1lZGl1bXNsYXRlYmx1ZToiIzdiNjhlZSIsbWVkaXVtc3ByaW5nZ3JlZW46IiMwMGZhOWEiLG1lZGl1bXR1cnF1b2lzZToiIzQ4ZDFjYyIsbWVkaXVtdmlvbGV0cmVkOiIjYzcxNTg1IixtaWRuaWdodGJsdWU6IiMxOTE5NzAiLG1pbnRjcmVhbToiI2Y1ZmZmYSIsbWlzdHlyb3NlOiIjZmZlNGUxIixtb2NjYXNpbjoiI2ZmZTRiNSIsbmF2YWpvd2hpdGU6IiNmZmRlYWQiLG5hdnk6IiMwMDAwODAiLG9sZGxhY2U6IiNmZGY1ZTYiLG9saXZlOiIjODA4MDAwIixvbGl2ZWRyYWI6IiM2YjhlMjMiLG9yYW5nZToiI2ZmYTUwMCIsb3JhbmdlcmVkOiIjZmY0NTAwIixvcmNoaWQ6IiNkYTcwZDYiLHBhbGVnb2xkZW5yb2Q6IiNlZWU4YWEiLHBhbGVncmVlbjoiIzk4ZmI5OCIscGFsZXR1cnF1b2lzZToiI2FmZWVlZSIscGFsZXZpb2xldHJlZDoiI2Q4NzA5MyIscGFwYXlhd2hpcDoiI2ZmZWZkNSIscGVhY2hwdWZmOiIjZmZkYWI5IixwZXJ1OiIjY2Q4NTNmIixwaW5rOiIjZmZjMGNiIixwbHVtOiIjZGRhMGRkIixwb3dkZXJibHVlOiIjYjBlMGU2IixwdXJwbGU6IiM4MDAwODAiLHJlZDoiI2ZmMDAwMCIscm9zeWJyb3duOiIjYmM4ZjhmIixyb3lhbGJsdWU6IiM0MTY5ZTEiLHNhZGRsZWJyb3duOiIjOGI0NTEzIixzYWxtb246IiNmYTgwNzIiLHNhbmR5YnJvd246IiNmNGE0NjAiLHNlYWdyZWVuOiIjMmU4YjU3IixzZWFzaGVsbDoiI2ZmZjVlZSIsc2llbm5hOiIjYTA1MjJkIixzaWx2ZXI6IiNjMGMwYzAiLHNreWJsdWU6IiM4N2NlZWIiLHNsYXRlYmx1ZToiIzZhNWFjZCIsc2xhdGVncmF5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9fSx7fV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLGkpe3IuX19jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lLmNvbnRhaW5zLmFwcGx5KGUsaShhcmd1bWVudHMpKTpudWxsIT09ZSYmbnVsbCE9PXQmJiJzdHJpbmciPT10eXBlb2YgdCYmZS5pbmRleE9mKHQpPi0xfSxyLl9fcmVwbGFjZUFsbD1mdW5jdGlvbihlLHQsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2UucmVwbGFjZUFsbC5hcHBseShlLGkoYXJndW1lbnRzKSk6ZS5yZXBsYWNlKG5ldyBSZWdFeHAodCwiZyIpLG4pfSxyLl9fcmVwbGFjZUZpcnN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZS5yZXBsYWNlRmlyc3QuYXBwbHkoZSxpKGFyZ3VtZW50cykpOmUucmVwbGFjZShuZXcgUmVnRXhwKHQsIiIpLG4pfSxyLl9fcmVwbGFjZT1mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlLnJlcGxhY2UuYXBwbHkoZSxpKGFyZ3VtZW50cykpCmlmKHQgaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIGUucmVwbGFjZSh0LG4pCmlmKCJzdHJpbmciIT10eXBlb2YgdCYmKHQ9dC50b1N0cmluZygpKSwiIj09PXQpcmV0dXJuIGUKdmFyIHI9ZS5pbmRleE9mKHQpCmlmKHI8MClyZXR1cm4gZQp2YXIgcz0wLG89IiIKZG8gbys9ZS5zdWJzdHJpbmcocyxyKStuLHM9cit0Lmxlbmd0aAp3aGlsZSgocj1lLmluZGV4T2YodCxzKSk+PTApCnJldHVybiBvK2Uuc3Vic3RyaW5nKHMpfSxyLl9fZXF1YWxzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuZXF1YWxzIGluc3RhbmNlb2YgRnVuY3Rpb24/ZS5lcXVhbHMuYXBwbHkoZSxpKGFyZ3VtZW50cykpOnQoZSxuKX0sci5fX2VxdWFsc0lnbm9yZUNhc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZS5lcXVhbHNJZ25vcmVDYXNlLmFwcGx5KGUsaShhcmd1bWVudHMpKTplLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LHIuX190b0NoYXJBcnJheT1mdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGUudG9DaGFyQXJyYXkuYXBwbHkoZSxpKGFyZ3VtZW50cykpCmZvcih2YXIgdD1bXSxuPTAscj1lLmxlbmd0aDtuPHI7KytuKXRbbl09bmV3IENoYXIoZS5jaGFyQXQobikpCnJldHVybiB0fSxyLl9fc3BsaXQ9ZnVuY3Rpb24oZSx0LHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZS5zcGxpdC5hcHBseShlLGkoYXJndW1lbnRzKSkKdmFyIHM9bmV3IFJlZ0V4cCh0KQppZihyPT09bnx8cjwxKXJldHVybiBlLnNwbGl0KHMpCmZvcih2YXIgbyxhPVtdLGw9ZTsobz1sLnNlYXJjaChzKSkhPT0tMSYmYS5sZW5ndGg8ci0xOyl7dmFyIGg9cy5leGVjKGwpLnRvU3RyaW5nKCkKYS5wdXNoKGwuc3Vic3RyaW5nKDAsbykpLGw9bC5zdWJzdHJpbmcobytoLmxlbmd0aCl9cmV0dXJuIG89PT0tMSYmIiI9PT1sfHxhLnB1c2gobCksYX0sci5fX2NvZGVQb2ludEF0PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUuY2hhckNvZGVBdCh0KQpyZXR1cm4gNTUyOTY8PWkmJmk8PTU2MzE5PyhuPWkscj1lLmNoYXJDb2RlQXQodCsxKSwxMDI0KihuLTU1Mjk2KSsoci01NjMyMCkrNjU1MzYpOml9LHIuX19tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBSZWdFeHAodCkudGVzdChlKX0sci5fX3N0YXJ0c1dpdGg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lLnN0YXJ0c1dpdGguYXBwbHkoZSxpKGFyZ3VtZW50cykpOihuPW58fDAsIShuPDB8fG4+ZS5sZW5ndGgpJiYoIiI9PT10fHx0PT09ZXx8ZS5pbmRleE9mKHQpPT09bikpfSxyLl9fZW5kc1dpdGg9ZnVuY3Rpb24oZSx0KXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGUuZW5kc1dpdGguYXBwbHkoZSxpKGFyZ3VtZW50cykpCnZhciBuPXQ/dC5sZW5ndGg6MApyZXR1cm4iIj09PXR8fHQ9PT1lfHxlLmluZGV4T2YodCk9PT1lLmxlbmd0aC1ufSxyLl9faGFzaENvZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGFzaENvZGUgaW5zdGFuY2VvZiBGdW5jdGlvbj90Lmhhc2hDb2RlLmFwcGx5KHQsaShhcmd1bWVudHMpKTplKHQpfSxyLl9fcHJpbnRTdGFja1RyYWNlPWZ1bmN0aW9uKGUpe3IucHJpbnRsbigiRXhjZXB0aW9uOiAiK2UudG9TdHJpbmcoKSl9fX19LHt9XSwyMzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1lfHwzNjI0MzYwNjkscj10fHw1MjEyODg2MjksaT1mdW5jdGlvbigpe3JldHVybiBuPTM2OTY5Kig2NTUzNSZuKSsobj4+PjE2KSY0Mjk0OTY3Mjk1LHI9MThlMyooNjU1MzUmcikrKHI+Pj4xNikmNDI5NDk2NzI5NSw0Mjk0OTY3Mjk1JigoNjU1MzUmbik8PDE2fDY1NTM1JnIpfQp0aGlzLmRvdWJsZUdlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBlPWkoKS80Mjk0OTY3Mjk2CnJldHVybiBlPDA/MStlOmV9LHRoaXMuaW50R2VuZXJhdG9yPWl9ZnVuY3Rpb24gcihlKXtmdW5jdGlvbiByKGUsdCxuLHIpe3ZhciBpPTE1JmUscz1pPDg/dDpuLG89aTw0P246MTI9PT1pfHwxND09PWk/dDpyCnJldHVybigwPT09KDEmaSk/czotcykrKDA9PT0oMiZpKT9vOi1vKX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgcj0wPT09KDEmZSk/dDpuCnJldHVybiAwPT09KDImZSk/LXI6cn1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIDA9PT0oMSZlKT8tdDp0fWZ1bmN0aW9uIG8oZSx0LG4pe3JldHVybiB0K2UqKG4tdCl9dmFyIGEsbCxoPWUhPT10P25ldyBuKGUsKGU8PDE2KSsoZT4+MTYpKTpuLmNyZWF0ZVJhbmRvbWl6ZWQoKSx1PW5ldyBVaW50OEFycmF5KDUxMikKZm9yKGE9MDthPDI1NjsrK2EpdVthXT1hCmZvcihhPTA7YTwyNTY7KythKXt2YXIgYz11W2w9MjU1JmguaW50R2VuZXJhdG9yKCldCnVbbF09dVthXSx1W2FdPWN9Zm9yKGE9MDthPDI1NjsrK2EpdVthKzI1Nl09dVthXQp0aGlzLm5vaXNlM2Q9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPTI1NSZNYXRoLmZsb29yKGUpLHM9MjU1Jk1hdGguZmxvb3IodCksYT0yNTUmTWF0aC5mbG9vcihuKQplLT1NYXRoLmZsb29yKGUpLHQtPU1hdGguZmxvb3IodCksbi09TWF0aC5mbG9vcihuKQp2YXIgbD0oMy0yKmUpKmUqZSxoPSgzLTIqdCkqdCp0LGM9KDMtMipuKSpuKm4sZj11W2ldK3MscD11W2ZdK2EsbT11W2YrMV0rYSxnPXVbaSsxXStzLGQ9dVtnXSthLHY9dVtnKzFdK2EKcmV0dXJuIG8oYyxvKGgsbyhsLHIodVtwXSxlLHQsbikscih1W2RdLGUtMSx0LG4pKSxvKGwscih1W21dLGUsdC0xLG4pLHIodVt2XSxlLTEsdC0xLG4pKSksbyhoLG8obCxyKHVbcCsxXSxlLHQsbi0xKSxyKHVbZCsxXSxlLTEsdCxuLTEpKSxvKGwscih1W20rMV0sZSx0LTEsbi0xKSxyKHVbdisxXSxlLTEsdC0xLG4tMSkpKSl9LHRoaXMubm9pc2UyZD1mdW5jdGlvbihlLHQpe3ZhciBuPTI1NSZNYXRoLmZsb29yKGUpLHI9MjU1Jk1hdGguZmxvb3IodCkKZS09TWF0aC5mbG9vcihlKSx0LT1NYXRoLmZsb29yKHQpCnZhciBzPSgzLTIqZSkqZSplLGE9KDMtMip0KSp0KnQsbD11W25dK3IsaD11W24rMV0rcgpyZXR1cm4gbyhhLG8ocyxpKHVbbF0sZSx0KSxpKHVbaF0sZS0xLHQpKSxvKHMsaSh1W2wrMV0sZSx0LTEpLGkodVtoKzFdLGUtMSx0LTEpKSl9LHRoaXMubm9pc2UxZD1mdW5jdGlvbihlKXt2YXIgdD0yNTUmTWF0aC5mbG9vcihlKQplLT1NYXRoLmZsb29yKGUpCnZhciBuPSgzLTIqZSkqZSplCnJldHVybiBvKG4scyh1W3RdLGUpLHModVt0KzFdLGUtMSkpfX12YXIgaT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpfQplLmFicz1NYXRoLmFicyxlLmNlaWw9TWF0aC5jZWlsLGUuZXhwPU1hdGguZXhwLGUuZmxvb3I9TWF0aC5mbG9vcixlLmxvZz1NYXRoLmxvZyxlLnBvdz1NYXRoLnBvdyxlLnJvdW5kPU1hdGgucm91bmQsZS5zcXJ0PU1hdGguc3FydCxlLmFjb3M9TWF0aC5hY29zLGUuYXNpbj1NYXRoLmFzaW4sZS5hdGFuPU1hdGguYXRhbixlLmF0YW4yPU1hdGguYXRhbjIsZS5jb3M9TWF0aC5jb3MsZS5zaW49TWF0aC5zaW4sZS50YW49TWF0aC50YW4sZS5jb25zdHJhaW49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPm4/bjplPHQ/dDplfSxlLmRpc3Q9ZnVuY3Rpb24oKXt2YXIgZSx0LG4KcmV0dXJuIDQ9PT1hcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50c1swXS1hcmd1bWVudHNbMl0sdD1hcmd1bWVudHNbMV0tYXJndW1lbnRzWzNdLE1hdGguc3FydChlKmUrdCp0KSk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzWzBdLWFyZ3VtZW50c1szXSx0PWFyZ3VtZW50c1sxXS1hcmd1bWVudHNbNF0sbj1hcmd1bWVudHNbMl0tYXJndW1lbnRzWzVdLE1hdGguc3FydChlKmUrdCp0K24qbikpOnZvaWQgMH0sZS5sZXJwPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4odC1lKSpuK2V9LGUubWFnPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9NYXRoLnNxcnQoZSplK3QqdCtuKm4pOk1hdGguc3FydChlKmUrdCp0KX0sZS5tYXA9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gcisoaS1yKSooKGUtdCkvKG4tdCkpfSxlLm1heD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBhcmd1bWVudHNbMF08YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTphcmd1bWVudHNbMF0KdmFyIGU9MT09PWFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOmFyZ3VtZW50cwppZighKCJsZW5ndGgiaW4gZSYmZS5sZW5ndGg+MCkpdGhyb3ciTm9uLWVtcHR5IGFycmF5IGlzIGV4cGVjdGVkIgpmb3IodmFyIHQ9ZVswXSxuPWUubGVuZ3RoLHI9MTtyPG47KytyKXQ8ZVtyXSYmKHQ9ZVtyXSkKcmV0dXJuIHR9LGUubWluPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGFyZ3VtZW50c1swXTxhcmd1bWVudHNbMV0/YXJndW1lbnRzWzBdOmFyZ3VtZW50c1sxXQp2YXIgZT0xPT09YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06YXJndW1lbnRzCmlmKCEoImxlbmd0aCJpbiBlJiZlLmxlbmd0aD4wKSl0aHJvdyJOb24tZW1wdHkgYXJyYXkgaXMgZXhwZWN0ZWQiCmZvcih2YXIgdD1lWzBdLG49ZS5sZW5ndGgscj0xO3I8bjsrK3IpdD5lW3JdJiYodD1lW3JdKQpyZXR1cm4gdH0sZS5ub3JtPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4oZS10KS8obi10KX0sZS5zcT1mdW5jdGlvbihlKXtyZXR1cm4gZSplfSxlLmRlZ3JlZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIDE4MCplL01hdGguUEl9LGUucmFuZG9tPWZ1bmN0aW9uKGUsdCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGg/KHQ9MSxlPTApOjE9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1lLGU9MCksZT09PXQpcmV0dXJuIGUKZm9yKHZhciBuPTA7bjwxMDA7bisrKXt2YXIgcj1pKCkscz1yKih0LWUpK2UKaWYocyE9PXQpcmV0dXJuIHN9cmV0dXJuIGV9LG4uY3JlYXRlUmFuZG9taXplZD1mdW5jdGlvbigpe3ZhciBlPW5ldyBEYXRlCnJldHVybiBuZXcgbihlLzZlNCY0Mjk0OTY3Mjk1LDQyOTQ5NjcyOTUmZSl9LGUucmFuZG9tU2VlZD1mdW5jdGlvbihlKXtpPW5ldyBuKGUsKGU8PDE2KSsoZT4+MTYpKS5kb3VibGVHZW5lcmF0b3IsdGhpcy5oYXZlTmV4dE5leHRHYXVzc2lhbj0hMX0sZS5yYW5kb21HYXVzc2lhbj1mdW5jdGlvbigpe2lmKHRoaXMuaGF2ZU5leHROZXh0R2F1c3NpYW4pcmV0dXJuIHRoaXMuaGF2ZU5leHROZXh0R2F1c3NpYW49ITEsdGhpcy5uZXh0TmV4dEdhdXNzaWFuCnZhciBlLHQsbgpkbyBlPTIqaSgpLTEsdD0yKmkoKS0xLG49ZSplK3QqdAp3aGlsZShuPj0xfHwwPT09bikKdmFyIHI9TWF0aC5zcXJ0KC0yKk1hdGgubG9nKG4pL24pCnJldHVybiB0aGlzLm5leHROZXh0R2F1c3NpYW49dCpyLHRoaXMuaGF2ZU5leHROZXh0R2F1c3NpYW49ITAsZSpyfQp2YXIgcz17Z2VuZXJhdG9yOnQsb2N0YXZlczo0LGZhbGxvdXQ6LjUsc2VlZDp0fQplLm5vaXNlPWZ1bmN0aW9uKGUsbixpKXtzLmdlbmVyYXRvcj09PXQmJihzLmdlbmVyYXRvcj1uZXcgcihzLnNlZWQpKQpmb3IodmFyIG89cy5nZW5lcmF0b3IsYT0xLGw9MSxoPTAsdT0wO3U8cy5vY3RhdmVzOysrdSl7c3dpdGNoKGEqPXMuZmFsbG91dCxhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6aCs9YSooMStvLm5vaXNlMWQobCplKSkvMgpicmVhawpjYXNlIDI6aCs9YSooMStvLm5vaXNlMmQobCplLGwqbikpLzIKYnJlYWsKY2FzZSAzOmgrPWEqKDErby5ub2lzZTNkKGwqZSxsKm4sbCppKSkvMn1sKj0yfXJldHVybiBofSxlLm5vaXNlRGV0YWlsPWZ1bmN0aW9uKGUsbil7cy5vY3RhdmVzPWUsbiE9PXQmJihzLmZhbGxvdXQ9bil9LGUubm9pc2VTZWVkPWZ1bmN0aW9uKGUpe3Muc2VlZD1lLHMuZ2VuZXJhdG9yPXR9fX0se31dLDI0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXt0cmltOmZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXS5yZXBsYWNlKC9eXHMqLywiIikucmVwbGFjZSgvXHMqJC8sIiIpLnJlcGxhY2UoL1xyKiQvLCIiKSkKcmV0dXJuIHR9cmV0dXJuIGUucmVwbGFjZSgvXlxzKi8sIiIpLnJlcGxhY2UoL1xzKiQvLCIiKS5yZXBsYWNlKC9cciokLywiIil9LHJhZGlhbnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUvMTgwKk1hdGguUEl9LG5mQ29yZVNjYWxhcjpmdW5jdGlvbih0LG4scixpLHMsbyl7dmFyIGE9dDwwP3I6bixsPTA9PT1zLGg9cz09PWV8fHM8MD8wOnMsdT1NYXRoLmFicyh0KQppZihsKWZvcihoPTEsdSo9MTA7TWF0aC5hYnMoTWF0aC5yb3VuZCh1KS11KT4xZS02JiZoPDc7KSsraCx1Kj0xMAplbHNlIDAhPT1oJiYodSo9TWF0aC5wb3coMTAsaCkpCnZhciBjLGY9Mip1CmlmKE1hdGguZmxvb3IodSk9PT11KWM9dQplbHNlIGlmKE1hdGguZmxvb3IoZik9PT1mKXt2YXIgcD1NYXRoLmZsb29yKHUpCmM9cCtwJTJ9ZWxzZSBjPU1hdGgucm91bmQodSkKZm9yKHZhciBtPSIiLGc9aStoO2c+MHx8Yz4wOylnLS0sbT0iIitjJTEwK20sYz1NYXRoLmZsb29yKGMvMTApCmlmKG8hPT1lKWZvcih2YXIgZD1tLmxlbmd0aC0zLWg7ZD4wOyltPW0uc3Vic3RyaW5nKDAsZCkrbyttLnN1YnN0cmluZyhkKSxkLT0zCnJldHVybiBoPjA/YSttLnN1YnN0cmluZygwLG0ubGVuZ3RoLWgpKyIuIittLnN1YnN0cmluZyhtLmxlbmd0aC1oLG0ubGVuZ3RoKTphK219LG5mQ29yZTpmdW5jdGlvbihlLG4scixpLHMsbyl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIGE9W10sbD0wLGg9ZS5sZW5ndGg7bDxoO2wrKylhLnB1c2godC5uZkNvcmVTY2FsYXIoZVtsXSxuLHIsaSxzLG8pKQpyZXR1cm4gYX1yZXR1cm4gdC5uZkNvcmVTY2FsYXIoZSxuLHIsaSxzLG8pfSxuZjpmdW5jdGlvbihlLG4scil7cmV0dXJuIHQubmZDb3JlKGUsIiIsIi0iLG4scil9LG5mczpmdW5jdGlvbihlLG4scil7cmV0dXJuIHQubmZDb3JlKGUsIiAiLCItIixuLHIpfSxuZnA6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0Lm5mQ29yZShlLCIrIiwiLSIsbixyKX0sbmZjOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQubmZDb3JlKGUsIiIsIi0iLDAsbiwiLCIpfSx3aXRoQ29tbW9uRnVuY3Rpb25zOmZ1bmN0aW9uKGUpe1sidHJpbSIsInJhZGlhbnMiLCJuZiIsIm5mcyIsIm5mcCIsIm5mYyJdLmZvckVhY2goZnVuY3Rpb24obil7ZVtuXT10W25dfSl9fQpyZXR1cm4gdH0oKX0se31dLDI1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8pe2Z1bmN0aW9uIGEodCxuKXt2YXIgcj10LHM9MCxvPTAKaWYoZS5wbW91c2VYPWUubW91c2VYLGUucG1vdXNlWT1lLm1vdXNlWSxyLm9mZnNldFBhcmVudClkbyBzKz1yLm9mZnNldExlZnQsbys9ci5vZmZzZXRUb3AKd2hpbGUocj1yLm9mZnNldFBhcmVudCkKcj10CmRvIHMtPXIuc2Nyb2xsTGVmdHx8MCxvLT1yLnNjcm9sbFRvcHx8MAp3aGlsZShyPXIucGFyZW50Tm9kZSkKdmFyIGEsbCxoLHUKcmV0dXJuIGkuZGVmYXVsdFZpZXcmJmkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGE9cGFyc2VJbnQoaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkucGFkZGluZ0xlZnQsMTApfHwwLGw9cGFyc2VJbnQoaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkucGFkZGluZ1RvcCwxMCl8fDAsaD1wYXJzZUludChpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5ib3JkZXJMZWZ0V2lkdGgsMTApfHwwLHU9cGFyc2VJbnQoaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuYm9yZGVyVG9wV2lkdGgsMTApfHwwKSxzKz1hLG8rPWwscys9aCxvKz11LHMrPXdpbmRvdy5wYWdlWE9mZnNldCxvKz13aW5kb3cucGFnZVlPZmZzZXQse1g6cyxZOm99fWZ1bmN0aW9uIGwodCxuKXt2YXIgcj1hKHQsbikKZS5tb3VzZVg9bi5wYWdlWC1yLlgsZS5tb3VzZVk9bi5wYWdlWS1yLll9ZnVuY3Rpb24gaChlKXt2YXIgdCxuPWEoZS5jaGFuZ2VkVG91Y2hlc1swXS50YXJnZXQsZS5jaGFuZ2VkVG91Y2hlc1swXSkKZm9yKHQ9MDt0PGUudG91Y2hlcy5sZW5ndGg7dCsrKXt2YXIgcj1lLnRvdWNoZXNbdF0Kci5vZmZzZXRYPXIucGFnZVgtbi5YLHIub2Zmc2V0WT1yLnBhZ2VZLW4uWX1mb3IodD0wO3Q8ZS50YXJnZXRUb3VjaGVzLmxlbmd0aDt0Kyspe3ZhciBpPWUudGFyZ2V0VG91Y2hlc1t0XQppLm9mZnNldFg9aS5wYWdlWC1uLlgsaS5vZmZzZXRZPWkucGFnZVktbi5ZfWZvcih0PTA7dDxlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aDt0Kyspe3ZhciBzPWUuY2hhbmdlZFRvdWNoZXNbdF0Kcy5vZmZzZXRYPXMucGFnZVgtbi5YLHMub2Zmc2V0WT1zLnBhZ2VZLW4uWX1yZXR1cm4gZX12YXIgdT1bIm1vdXNlb3V0IiwibW91c2Vtb3ZlIiwibW91c2Vkb3duIiwibW91c2V1cCIsIkRPTU1vdXNlU2Nyb2xsIiwibW91c2V3aGVlbCIsInRvdWNoc3RhcnQiXQpuKHQsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGkpe3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsIi13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmUiKSx0LnNldEF0dHJpYnV0ZSgib25jbGljayIsInZvaWQoMCkiKSx0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKSIpLHIodCx1KSxlLnRvdWNoU3RhcnQhPT1vfHxlLnRvdWNoTW92ZSE9PW98fGUudG91Y2hFbmQhPT1vfHxlLnRvdWNoQ2FuY2VsIT09bz8obih0LCJ0b3VjaHN0YXJ0IixmdW5jdGlvbih0KXtlLnRvdWNoU3RhcnQhPT1vJiYodD1oKHQpLGUudG91Y2hTdGFydCh0KSl9KSxuKHQsInRvdWNobW92ZSIsZnVuY3Rpb24odCl7ZS50b3VjaE1vdmUhPT1vJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQ9aCh0KSxlLnRvdWNoTW92ZSh0KSl9KSxuKHQsInRvdWNoZW5kIixmdW5jdGlvbih0KXtlLnRvdWNoRW5kIT09byYmKHQ9aCh0KSxlLnRvdWNoRW5kKHQpKX0pLG4odCwidG91Y2hjYW5jZWwiLGZ1bmN0aW9uKHQpe2UudG91Y2hDYW5jZWwhPT1vJiYodD1oKHQpLGUudG91Y2hDYW5jZWwodCkpfSkpOihuKHQsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKG4pe2wodCxuLnRvdWNoZXNbMF0pLGUuX19tb3VzZVByZXNzZWQ9ITAsZS5tb3VzZURyYWdnaW5nPSExLGUubW91c2VCdXR0b249cy5MRUZULCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlUHJlc3NlZCYmZS5tb3VzZVByZXNzZWQoKX0pLG4odCwidG91Y2htb3ZlIixmdW5jdGlvbihuKXtuLnByZXZlbnREZWZhdWx0KCksbCh0LG4udG91Y2hlc1swXSksImZ1bmN0aW9uIiE9dHlwZW9mIGUubW91c2VNb3ZlZHx8ZS5fX21vdXNlUHJlc3NlZHx8ZS5tb3VzZU1vdmVkKCksImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VEcmFnZ2VkJiZlLl9fbW91c2VQcmVzc2VkJiYoZS5tb3VzZURyYWdnZWQoKSxlLm1vdXNlRHJhZ2dpbmc9ITApfSksbih0LCJ0b3VjaGVuZCIsZnVuY3Rpb24odCl7ZS5fX21vdXNlUHJlc3NlZD0hMSwiZnVuY3Rpb24iIT10eXBlb2YgZS5tb3VzZUNsaWNrZWR8fGUubW91c2VEcmFnZ2luZ3x8ZS5tb3VzZUNsaWNrZWQoKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZVJlbGVhc2VkJiZlLm1vdXNlUmVsZWFzZWQoKX0pKX0pLGZ1bmN0aW9uKCl7dmFyIHI9ITAsaT1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKX0KZS5kaXNhYmxlQ29udGV4dE1lbnU9ZnVuY3Rpb24oKXtyJiYobih0LCJjb250ZXh0bWVudSIsaSkscj0hMSl9LGUuZW5hYmxlQ29udGV4dE1lbnU9ZnVuY3Rpb24oKXtyfHwoZGV0YWNoRXZlbnRIYW5kbGVyKHtlbGVtOnQsdHlwZToiY29udGV4dG1lbnUiLGZuOml9KSxyPSEwKX19KCksbih0LCJtb3VzZW1vdmUiLGZ1bmN0aW9uKG4pe2wodCxuKSwiZnVuY3Rpb24iIT10eXBlb2YgZS5tb3VzZU1vdmVkfHxlLl9fbW91c2VQcmVzc2VkfHxlLm1vdXNlTW92ZWQoKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZURyYWdnZWQmJmUuX19tb3VzZVByZXNzZWQmJihlLm1vdXNlRHJhZ2dlZCgpLGUubW91c2VEcmFnZ2luZz0hMCl9KSxuKHQsIm1vdXNlb3V0IixmdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZU91dCYmZS5tb3VzZU91dCgpfSksbih0LCJtb3VzZW92ZXIiLGZ1bmN0aW9uKG4pe2wodCxuKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZU92ZXImJmUubW91c2VPdmVyKCl9KSx0Lm9ubW91c2Vkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZm9jdXMoKSwhMX0sbih0LCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3N3aXRjaChlLl9fbW91c2VQcmVzc2VkPSEwLGUubW91c2VEcmFnZ2luZz0hMSx0LndoaWNoKXtjYXNlIDE6ZS5tb3VzZUJ1dHRvbj1zLkxFRlQKYnJlYWsKY2FzZSAyOmUubW91c2VCdXR0b249cy5DRU5URVIKYnJlYWsKY2FzZSAzOmUubW91c2VCdXR0b249cy5SSUdIVH0iZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZVByZXNzZWQmJmUubW91c2VQcmVzc2VkKCl9KSxuKHQsIm1vdXNldXAiLGZ1bmN0aW9uKHQpe2UuX19tb3VzZVByZXNzZWQ9ITEsImZ1bmN0aW9uIiE9dHlwZW9mIGUubW91c2VDbGlja2VkfHxlLm1vdXNlRHJhZ2dpbmd8fGUubW91c2VDbGlja2VkKCksImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VSZWxlYXNlZCYmZS5tb3VzZVJlbGVhc2VkKCl9KQp2YXIgYz1mdW5jdGlvbihuKXtpZihuLnRhcmdldD09PXQpe3ZhciByPTAKbi53aGVlbERlbHRhPyhyPW4ud2hlZWxEZWx0YS8xMjAsd2luZG93Lm9wZXJhJiYocj0tcikpOm4uZGV0YWlsJiYocj0tbi5kZXRhaWwvMyksZS5tb3VzZVNjcm9sbD1yLHImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlU2Nyb2xsZWQmJihuLnN0b3BQcm9wYWdhdGlvbigpLG4ucHJldmVudERlZmF1bHQoKSxlLm1vdXNlU2Nyb2xsZWQoKSl9fQpuKGksIkRPTU1vdXNlU2Nyb2xsIixjKSxuKGksIm1vdXNld2hlZWwiLGMpfX0se31dLDI2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3ZhciBlPVsiYWJzIiwiYWNvcyIsImFscGhhIiwiYW1iaWVudCIsImFtYmllbnRMaWdodCIsImFwcGVuZCIsImFwcGx5TWF0cml4IiwiYXJjIiwiYXJyYXlDb3B5IiwiYXNpbiIsImF0YW4iLCJhdGFuMiIsImJhY2tncm91bmQiLCJiZWdpbkNhbWVyYSIsImJlZ2luRHJhdyIsImJlZ2luU2hhcGUiLCJiZXppZXIiLCJiZXppZXJEZXRhaWwiLCJiZXppZXJQb2ludCIsImJlemllclRhbmdlbnQiLCJiZXppZXJWZXJ0ZXgiLCJiaW5hcnkiLCJibGVuZCIsImJsZW5kQ29sb3IiLCJibGl0X3Jlc2l6ZSIsImJsdWUiLCJib3giLCJicmVha1NoYXBlIiwiYnJpZ2h0bmVzcyIsImNhbWVyYSIsImNlaWwiLCJDaGFyYWN0ZXIiLCJjb2xvciIsImNvbG9yTW9kZSIsImNvbmNhdCIsImNvbnN0cmFpbiIsImNvcHkiLCJjb3MiLCJjcmVhdGVGb250IiwiY3JlYXRlR3JhcGhpY3MiLCJjcmVhdGVJbWFnZSIsImN1cnNvciIsImN1cnZlIiwiY3VydmVEZXRhaWwiLCJjdXJ2ZVBvaW50IiwiY3VydmVUYW5nZW50IiwiY3VydmVUaWdodG5lc3MiLCJjdXJ2ZVZlcnRleCIsImRheSIsImRlZ3JlZXMiLCJkaXJlY3Rpb25hbExpZ2h0IiwiZGlzYWJsZUNvbnRleHRNZW51IiwiZGlzdCIsImRyYXciLCJlbGxpcHNlIiwiZWxsaXBzZU1vZGUiLCJlbWlzc2l2ZSIsImVuYWJsZUNvbnRleHRNZW51IiwiZW5kQ2FtZXJhIiwiZW5kRHJhdyIsImVuZFNoYXBlIiwiZXhpdCIsImV4cCIsImV4cGFuZCIsImV4dGVybmFscyIsImZpbGwiLCJmaWx0ZXIiLCJmbG9vciIsImZvY3VzZWQiLCJmcmFtZUNvdW50IiwiZnJhbWVSYXRlIiwiZnJ1c3R1bSIsImdldCIsImdseXBoTG9vayIsImdseXBoVGFibGUiLCJncmVlbiIsImhlaWdodCIsImhleCIsImhpbnQiLCJob3VyIiwiaHVlIiwiaW1hZ2UiLCJpbWFnZU1vZGUiLCJpbnRlcnNlY3QiLCJqb2luIiwia2V5Iiwia2V5Q29kZSIsImtleVByZXNzZWQiLCJrZXlSZWxlYXNlZCIsImtleVR5cGVkIiwibGVycCIsImxlcnBDb2xvciIsImxpZ2h0RmFsbG9mZiIsImxpZ2h0cyIsImxpZ2h0U3BlY3VsYXIiLCJsaW5lIiwibGluayIsImxvYWRCeXRlcyIsImxvYWRGb250IiwibG9hZEdseXBocyIsImxvYWRJbWFnZSIsImxvYWRQaXhlbHMiLCJsb2FkU2hhcGUiLCJsb2FkWE1MIiwibG9hZFN0cmluZ3MiLCJsb2ciLCJsb29wIiwibWFnIiwibWFwIiwibWF0Y2giLCJtYXRjaEFsbCIsIm1heCIsIm1pbGxpcyIsIm1pbiIsIm1pbnV0ZSIsIm1peCIsIm1vZGVsWCIsIm1vZGVsWSIsIm1vZGVsWiIsIm1vZGVzIiwibW9udGgiLCJtb3VzZUJ1dHRvbiIsIm1vdXNlQ2xpY2tlZCIsIm1vdXNlRHJhZ2dlZCIsIm1vdXNlTW92ZWQiLCJtb3VzZU91dCIsIm1vdXNlT3ZlciIsIm1vdXNlUHJlc3NlZCIsIm1vdXNlUmVsZWFzZWQiLCJtb3VzZVNjcm9sbCIsIm1vdXNlU2Nyb2xsZWQiLCJtb3VzZVgiLCJtb3VzZVkiLCJuYW1lIiwibmYiLCJuZmMiLCJuZnAiLCJuZnMiLCJub0N1cnNvciIsIm5vRmlsbCIsIm5vaXNlIiwibm9pc2VEZXRhaWwiLCJub2lzZVNlZWQiLCJub0xpZ2h0cyIsIm5vTG9vcCIsIm5vcm0iLCJub3JtYWwiLCJub1Ntb290aCIsIm5vU3Ryb2tlIiwibm9UaW50Iiwib3J0aG8iLCJwYXJhbSIsInBhcnNlQm9vbGVhbiIsInBhcnNlQnl0ZSIsInBhcnNlQ2hhciIsInBhcnNlRmxvYXQiLCJwYXJzZUludCIsInBhcnNlWE1MIiwicGVnIiwicGVyc3BlY3RpdmUiLCJQSW1hZ2UiLCJwaXhlbHMiLCJQTWF0cml4MkQiLCJQTWF0cml4M0QiLCJQTWF0cml4U3RhY2siLCJwbW91c2VYIiwicG1vdXNlWSIsInBvaW50IiwicG9pbnRMaWdodCIsInBvcE1hdHJpeCIsInBvcFN0eWxlIiwicG93IiwicHJpbnQiLCJwcmludENhbWVyYSIsInByaW50bG4iLCJwcmludE1hdHJpeCIsInByaW50UHJvamVjdGlvbiIsIlBTaGFwZSIsIlBTaGFwZVNWRyIsInB1c2hNYXRyaXgiLCJwdXNoU3R5bGUiLCJxdWFkIiwicmFkaWFucyIsInJhbmRvbSIsInJhbmRvbUdhdXNzaWFuIiwicmFuZG9tU2VlZCIsInJlY3QiLCJyZWN0TW9kZSIsInJlZCIsInJlZHJhdyIsInJlcXVlc3RJbWFnZSIsInJlc2V0TWF0cml4IiwicmV2ZXJzZSIsInJvdGF0ZSIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInJvdW5kIiwic2F0dXJhdGlvbiIsInNhdmUiLCJzYXZlRnJhbWUiLCJzYXZlU3RyaW5ncyIsInNjYWxlIiwic2NyZWVuWCIsInNjcmVlblkiLCJzY3JlZW5aIiwic2Vjb25kIiwic2V0Iiwic2V0dXAiLCJzaGFwZSIsInNoYXBlTW9kZSIsInNoYXJlZCIsInNoZWFyWCIsInNoZWFyWSIsInNoaW5pbmVzcyIsInNob3J0ZW4iLCJzaW4iLCJzaXplIiwic21vb3RoIiwic29ydCIsInNwZWN1bGFyIiwic3BoZXJlIiwic3BoZXJlRGV0YWlsIiwic3BsaWNlIiwic3BsaXQiLCJzcGxpdFRva2VucyIsInNwb3RMaWdodCIsInNxIiwic3FydCIsInN0YXR1cyIsInN0ciIsInN0cm9rZSIsInN0cm9rZUNhcCIsInN0cm9rZUpvaW4iLCJzdHJva2VXZWlnaHQiLCJzdWJzZXQiLCJ0YW4iLCJ0ZXh0IiwidGV4dEFsaWduIiwidGV4dEFzY2VudCIsInRleHREZXNjZW50IiwidGV4dEZvbnQiLCJ0ZXh0TGVhZGluZyIsInRleHRNb2RlIiwidGV4dFNpemUiLCJ0ZXh0dXJlIiwidGV4dHVyZU1vZGUiLCJ0ZXh0V2lkdGgiLCJ0aW50IiwidG9JbWFnZURhdGEiLCJ0b3VjaENhbmNlbCIsInRvdWNoRW5kIiwidG91Y2hNb3ZlIiwidG91Y2hTdGFydCIsInRyYW5zbGF0ZSIsInRyYW5zZm9ybSIsInRyaWFuZ2xlIiwidHJpbSIsInVuYmluYXJ5IiwidW5oZXgiLCJ1cGRhdGVQaXhlbHMiLCJ1c2UzRENvbnRleHQiLCJ2ZXJ0ZXgiLCJ3aWR0aCIsIlhNTEVsZW1lbnQiLCJYTUwiLCJ5ZWFyIiwiX19jb250YWlucyIsIl9fZXF1YWxzIiwiX19lcXVhbHNJZ25vcmVDYXNlIiwiX19mcmFtZVJhdGUiLCJfX2hhc2hDb2RlIiwiX19pbnRfY2FzdCIsIl9faW5zdGFuY2VvZiIsIl9fa2V5UHJlc3NlZCIsIl9fbW91c2VQcmVzc2VkIiwiX19wcmludFN0YWNrVHJhY2UiLCJfX3JlcGxhY2UiLCJfX3JlcGxhY2VBbGwiLCJfX3JlcGxhY2VGaXJzdCIsIl9fdG9DaGFyQXJyYXkiLCJfX3NwbGl0IiwiX19jb2RlUG9pbnRBdCIsIl9fc3RhcnRzV2l0aCIsIl9fZW5kc1dpdGgiLCJfX21hdGNoZXMiXQpoJiZPYmplY3Qua2V5cyhoKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UucHVzaCh0KX0pCnZhciBuLHIsaT17fQpmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyOysrbilpW2Vbbl1dPW51bGwKZm9yKHZhciBzIGluIHQubGliKWlmKHQubGliLmhhc093blByb3BlcnR5KHMpJiZ0LmxpYltzXS5leHBvcnRzKXt2YXIgbz10LmxpYltzXS5leHBvcnRzCmZvcihuPTAscj1vLmxlbmd0aDtuPHI7KytuKWlbb1tuXV09bnVsbH1yZXR1cm4gaX1mdW5jdGlvbiBpKGUpe2Z1bmN0aW9uIHQoZSl7Zm9yKHZhciB0PVtdLG49ZS5zcGxpdCgvKFtce1xbXChcKVxdXH1dKS8pLHI9blswXSxpPVtdLHM9MTtzPG4ubGVuZ3RoO3MrPTIpe3ZhciBvPW5bc10KaWYoIlsiPT09b3x8InsiPT09b3x8IigiPT09bylpLnB1c2gocikscj1vCmVsc2UgaWYoIl0iPT09b3x8In0iPT09b3x8IikiPT09byl7dmFyIGE9In0iPT09bz8iQSI6IikiPT09bz8iQiI6IkMiLGw9dC5sZW5ndGgKdC5wdXNoKHIrbykscj1pLnBvcCgpKyciJythKyhsKzEpKyciJ31yKz1uW3MrMV19cmV0dXJuIHQudW5zaGlmdChyKSx0fWZ1bmN0aW9uIG4oZSx0KXtyZXR1cm4gZS5yZXBsYWNlKC8nKFxkKyknL2csZnVuY3Rpb24oZSxuKXt2YXIgcj10W25dCnJldHVybiIvIj09PXIuY2hhckF0KDApP3I6L14nKCg/OlteJ1xcXG5dKXwoPzpcXC5bMC05QS1GYS1mXSopKSckLy50ZXN0KHIpPyIobmV3ICRwLkNoYXJhY3RlcigiK3IrIikpIjpyfSl9ZnVuY3Rpb24gaShlKXt2YXIgdCxuPS9eXHMqLy5leGVjKGUpCmlmKG5bMF0ubGVuZ3RoPT09ZS5sZW5ndGgpdD17bGVmdDpuWzBdLG1pZGRsZToiIixyaWdodDoiIn0KZWxzZXt2YXIgcj0vXHMqJC8uZXhlYyhlKQp0PXtsZWZ0Om5bMF0sbWlkZGxlOmUuc3Vic3RyaW5nKG5bMF0ubGVuZ3RoLHIuaW5kZXgpLHJpZ2h0OnJbMF19fXJldHVybiB0LnVudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sZWZ0K2UrdGhpcy5yaWdodH0sdH1mdW5jdGlvbiBzKGUpe3JldHVybiBlLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIil9ZnVuY3Rpb24gaChlLHQpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyOysrbillW3Rbbl1dPW51bGwKcmV0dXJuIGV9ZnVuY3Rpb24gdShlKXtmb3IodmFyIHQgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHQpKXJldHVybiExCnJldHVybiEwfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGUuc3Vic3RyaW5nKDIsZS5sZW5ndGgtMSl9ZnVuY3Rpb24gZihlLHQpe3ZhciBuPV9lLmxlbmd0aApyZXR1cm4gX2UucHVzaChlKSwnIicrdCtuKyciJ31mdW5jdGlvbiBwKCl7cmV0dXJuImNsYXNzIisgKytMZX1mdW5jdGlvbiBtKGUsdCxuKXtlLmNsYXNzSWQ9dCxlLnNjb3BlSWQ9bixSZVt0XT1lfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9ZQpyZXR1cm4gdD10LnJlcGxhY2UoSWUsZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwiRSIpfSksdD10LnJlcGxhY2UoRGUsZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwiRCIpfSksdD10LnJlcGxhY2Uoa2UsZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwiSCIpfSl9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPWUucmVwbGFjZShOZSxmdW5jdGlvbihlLG4scixpLHMsbyl7cmV0dXJuIHIhPT10P2U6ZihlLCJHIil9KQpyZXR1cm4gbn1mdW5jdGlvbiB2KGUpe3RoaXMubmFtZT1lfWZ1bmN0aW9uIHkoZSx0KXt0aGlzLnBhcmFtcz1lLHRoaXMubWV0aG9kQXJnc1BhcmFtPXR9ZnVuY3Rpb24geChlKXt2YXIgdD1zKGUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkpLG49W10scj1udWxsCmlmKCIiIT09dClmb3IodmFyIGk9dC5zcGxpdCgiLCIpLG89MDtvPGkubGVuZ3RoOysrbyl7dmFyIGE9L1xiKFtBLVphLXpfJF1bXHckXSpcYikoXHMqIltBQkNdW1xkXSoiKSpccyokLy5leGVjKGlbb10pCmlmKG89PT1pLmxlbmd0aC0xJiZpW29dLmluZGV4T2YoIi4uLiIpPj0wKXtyPW5ldyB2KGFbMV0pCmJyZWFrfW4ucHVzaChuZXcgdihhWzFdKSl9cmV0dXJuIG5ldyB5KG4scil9ZnVuY3Rpb24gQShlKXtmdW5jdGlvbiB0KGUsdCxuLHIpe3ZhciBvPV9lW3JdCnM9ITAKdmFyIGE9aShvLnN1YnN0cmluZygxLG8ubGVuZ3RoLTEpKQpyZXR1cm4iX18iK24rKCIiPT09YS5taWRkbGU/ZigiKCIrdC5yZXBsYWNlKC9cLlxzKiQvLCIiKSsiKSIsIkIiKTpmKCIoIit0LnJlcGxhY2UoL1wuXHMqJC8sIiIpKyIsIithLm1pZGRsZSsiKSIsIkIiKSl9ZnVuY3Rpb24gbihlLHQsbil7cmV0dXJuIHM9ITAsIl9faW5zdGFuY2VvZiIrZigiKCIrdCsiLCAiK24rIikiLCJCIil9dmFyIHI9ZQpyPXIucmVwbGFjZSgvXGJuZXdccysoW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikoPzpccyoiQ1xkKyIpK1xzKigiQVxkKyIpL2csZnVuY3Rpb24oZSx0LG4pe3JldHVybiBufSkscj1yLnJlcGxhY2UoL1xibmV3XHMrKFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKD86XHMqIkJcZCsiKVxzKigiQVxkKyIpL2csZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmKGUsIkYiKX0pLHI9ci5yZXBsYWNlKGtlLGZ1bmN0aW9uKGUpe3JldHVybiBmKGUsIkgiKX0pLHI9ci5yZXBsYWNlKC9cYm5ld1xzKyhbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKVxzKigiQ1xkKyIoPzpccyoiQ1xkKyIpKikvZyxmdW5jdGlvbihlLHQsbil7dmFyIHI9bi5yZXBsYWNlKC8iQyhcZCspIi9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9lW3RdfSkucmVwbGFjZSgvXFtccypcXS9nLCJbbnVsbF0iKS5yZXBsYWNlKC9ccypcXVxzKlxbXHMqL2csIiwgIiksaT0ieyIrci5zdWJzdHJpbmcoMSxyLmxlbmd0aC0xKSsifSIscz0iKCciK3QrIicsICIrZihpLCJBIikrIikiCnJldHVybiIkcC5jcmVhdGVKYXZhQXJyYXkiK2YocywiQiIpfSkscj1yLnJlcGxhY2UoLyhcLlxzKmxlbmd0aClccyoiQlxkKyIvZywiJDEiKSxyPXIucmVwbGFjZSgvIyhbMC05QS1GYS1mXXs2fSlcYi9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIjB4RkYiK3R9KSxyPXIucmVwbGFjZSgvIkIoXGQrKSIoXHMqKD86W1x3JCddfCJCKSkvZyxmdW5jdGlvbihlLHQsbil7dmFyIHI9X2VbdF0KaWYoIS9eXChccypbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqXHMqKD86IkNcZCsiXHMqKSpcKSQvLnRlc3QocikpcmV0dXJuIGUKaWYoL15cKFxzKmludFxzKlwpJC8udGVzdChyKSlyZXR1cm4iKGludCkiK24KdmFyIGk9ci5zcGxpdCgvIkMoXGQrKSIvZykKcmV0dXJuIGkubGVuZ3RoPjEmJiEvXlxbXHMqXF0kLy50ZXN0KF9lW2lbMV1dKT9lOiIiK259KSxyPXIucmVwbGFjZSgvXChpbnRcKShbXixcXVwpXH1cP1w6XCpcK1wtXC9cXlx8XCVcJlx+PFw+XD1dKykvZyxmdW5jdGlvbihlLHQpe3ZhciBuPWkodCkKcmV0dXJuIG4udW50cmltKCJfX2ludF9jYXN0KCIrbi5taWRkbGUrIikiKX0pLHI9ci5yZXBsYWNlKC9cYnN1cGVyKFxzKiJCXGQrIikvZywiJCRzdXBlckNzdHIkMSIpLnJlcGxhY2UoL1xic3VwZXIoXHMqXC4pL2csIiQkc3VwZXIkMSIpLHI9ci5yZXBsYWNlKC9cYjArKChcZCopKD86XC5bXGQqXSk/KD86W2VFXVtcLVwrXT9cZCspP1tmRl0/KVxiLyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PT1uP2U6IiI9PT1uPyIwIit0OnR9KSxyPXIucmVwbGFjZSgvXGIoXC4/XGQrXC4/KVtmRl1cYi9nLCIkMSIpLHI9ci5yZXBsYWNlKC8oW15cc10pJShbXj1cc10pL2csIiQxICUgJDIiKSxyPXIucmVwbGFjZSgvXGIoZnJhbWVSYXRlfGtleVByZXNzZWR8bW91c2VQcmVzc2VkKVxiKD8hXHMqIkIpL2csIl9fJDEiKSxyPXIucmVwbGFjZSgvXGIoYm9vbGVhbnxieXRlfGNoYXJ8ZmxvYXR8aW50KVxzKiJCL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4icGFyc2UiK3Quc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSt0LnN1YnN0cmluZygxKSsnIkInfSkscj1yLnJlcGxhY2UoL1xicGl4ZWxzXGJccyooKCJDKFxkKykiKXxcLmxlbmd0aCk/KFxzKj0oPyE9KShbXixcXVwpXH1dKykpPy9nLGZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZihuKXt2YXIgbz1fZVtyXQpyZXR1cm4gaT8icGl4ZWxzLnNldFBpeGVsIitmKCIoIitvLnN1YnN0cmluZygxLG8ubGVuZ3RoLTEpKyIsIitzKyIpIiwiQiIpOiJwaXhlbHMuZ2V0UGl4ZWwiK2YoIigiK28uc3Vic3RyaW5nKDEsby5sZW5ndGgtMSkrIikiLCJCIil9cmV0dXJuIHQ/InBpeGVscy5nZXRMZW5ndGgiK2YoIigpIiwiQiIpOmk/InBpeGVscy5zZXQiK2YoIigiK3MrIikiLCJCIik6InBpeGVscy50b0FycmF5IitmKCIoKSIsIkIiKX0pCnZhciBzCmRvIHM9ITEscj1yLnJlcGxhY2UoLygoPzonXGQrJ3xcYltBLVphLXpfJF1bXHckXSpccyooPzoiW0JDXVxkKyIpKilccypcLlxzKig/OltBLVphLXpfJF1bXHckXSpccyooPzoiW0JDXVxkKyJccyopKlwuXHMqKSopKHJlcGxhY2V8cmVwbGFjZUFsbHxyZXBsYWNlRmlyc3R8Y29udGFpbnN8ZXF1YWxzfGVxdWFsc0lnbm9yZUNhc2V8aGFzaENvZGV8dG9DaGFyQXJyYXl8cHJpbnRTdGFja1RyYWNlfHNwbGl0fHN0YXJ0c1dpdGh8ZW5kc1dpdGh8Y29kZVBvaW50QXR8bWF0Y2hlcylccyoiQihcZCspIi9nLHQpCndoaWxlKHMpCmRvIHM9ITEscj1yLnJlcGxhY2UoLygoPzonXGQrJ3xcYltBLVphLXpfJF1bXHckXSpccyooPzoiW0JDXVxkKyIpKilccyooPzpcLlxzKltBLVphLXpfJF1bXHckXSpccyooPzoiW0JDXVxkKyJccyopKikqKWluc3RhbmNlb2ZccysoW0EtWmEtel8kXVtcdyRdKlxzKig/OlwuXHMqW0EtWmEtel8kXVtcdyRdKikqKS9nLG4pCndoaWxlKHMpCnJldHVybiByPXIucmVwbGFjZSgvXGJ0aGlzKFxzKiJCXGQrIikvZywiJCRjb25zdHIkMSIpfWZ1bmN0aW9uIGIoZSx0KXt0aGlzLmJhc2VJbnRlcmZhY2VOYW1lPWUsdGhpcy5ib2R5PXQsdC5vd25lcj10aGlzfWZ1bmN0aW9uIHcoZSl7dmFyIHQ9bmV3IFJlZ0V4cCgvXGJuZXdccyooW0EtWmEtel8kXVtcdyRdKlxzKig/OlwuXHMqW0EtWmEtel8kXVtcdyRdKikqKVxzKiJCXGQrIlxzKiJBKFxkKykiLykuZXhlYyhlKSxuPXdlLHI9cCgpCndlPXIKdmFyIGk9dFsxXSsiJCIrcixzPW5ldyBiKGksRWUoX2VbdFsyXV0saSwiIiwiaW1wbGVtZW50cyAiK3RbMV0pKQpyZXR1cm4gbShzLHIsbiksd2U9bixzfWZ1bmN0aW9uIEUoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMucGFyYW1zPXQsdGhpcy5ib2R5PW59ZnVuY3Rpb24gUyhlKXt2YXIgdD1uZXcgUmVnRXhwKC9cYihbQS1aYS16XyRdW1x3JF0qKVxzKiJCKFxkKykiXHMqIkEoXGQrKSIvKS5leGVjKGUpCnJldHVybiBuZXcgRSgiZnVuY3Rpb24iIT09dFsxXT90WzFdOm51bGwseChfZVt0WzJdXSksUGUoX2VbdFszXV0pKX1mdW5jdGlvbiBQKGUpe3RoaXMubWVtYmVycz1lfWZ1bmN0aW9uIEMoZSl7Zm9yKHZhciB0PWUuc3BsaXQoIiwiKSxuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl0uaW5kZXhPZigiOiIpCnI8MD90W25dPXt2YWx1ZTpUZSh0W25dKX06dFtuXT17bGFiZWw6cyh0W25dLnN1YnN0cmluZygwLHIpKSx2YWx1ZTpUZShzKHRbbl0uc3Vic3RyaW5nKHIrMSkpKX19cmV0dXJuIG5ldyBQKHQpfWZ1bmN0aW9uIE0oZSl7aWYoIigiPT09ZS5jaGFyQXQoMCl8fCJbIj09PWUuY2hhckF0KDApKXJldHVybiBlLmNoYXJBdCgwKStNKGUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkpK2UuY2hhckF0KGUubGVuZ3RoLTEpCmlmKCJ7Ij09PWUuY2hhckF0KDApKXJldHVybi9eXHtccyooPzpbQS1aYS16XyRdW1x3JF0qfCdcZCsnKVxzKjovLnRlc3QoZSk/InsiK2YoZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSwiSSIpKyJ9IjoiWyIrTShlLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKSsiXSIKdmFyIHQ9aShlKSxuPUEodC5taWRkbGUpCnJldHVybiBuPW4ucmVwbGFjZSgvIltBQkNdKFxkKykiL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gTShfZVt0XSl9KSx0LnVudHJpbShuKX1mdW5jdGlvbiBUKGUpe3JldHVybiBlLnJlcGxhY2UoLyhcLlxzKik/KCg/OlxiW0EtWmEtel9dfFwkKVtcdyRdKikoXHMqXC5ccyooW0EtWmEtel8kXVtcdyRdKikoXHMqXCgpPyk/L2csZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKHQpcmV0dXJuIGUKdmFyIGE9e25hbWU6bixtZW1iZXI6aSxjYWxsU2lnbjohIXN9CnJldHVybiBiZShhKSsocj09PW8/IiI6cil9KX1mdW5jdGlvbiBfKGUsdCl7dGhpcy5leHByPWUsdGhpcy50cmFuc2Zvcm1zPXR9ZnVuY3Rpb24gUihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy52YWx1ZT10LHRoaXMuaXNEZWZhdWx0PW59ZnVuY3Rpb24gTChlLHQpe3ZhciBuLHIsaSxvPWUuaW5kZXhPZigiPSIpCnJldHVybiBvPDA/KG49ZSxyPXQsaT0hMCk6KG49ZS5zdWJzdHJpbmcoMCxvKSxyPVRlKGUuc3Vic3RyaW5nKG8rMSkpLGk9ITEpLG5ldyBSKHMobi5yZXBsYWNlKC8oXHMqIkNcZCsiKSsvZywiIikpLHIsaSl9ZnVuY3Rpb24gSShlKXtyZXR1cm4iaW50Ij09PWV8fCJmbG9hdCI9PT1lPyIwIjoiYm9vbGVhbiI9PT1lPyJmYWxzZSI6ImNvbG9yIj09PWU/IjB4MDAwMDAwMDAiOiJudWxsIn1mdW5jdGlvbiBEKGUsdCl7dGhpcy5kZWZpbml0aW9ucz1lLHRoaXMudmFyVHlwZT10fWZ1bmN0aW9uIE8oZSl7dGhpcy5leHByZXNzaW9uPWV9ZnVuY3Rpb24gTihlKXtpZihPZS50ZXN0KGUpKXtmb3IodmFyIHQ9RmUuZXhlYyhlKSxuPWUuc3Vic3RyaW5nKHRbMF0ubGVuZ3RoKS5zcGxpdCgiLCIpLHI9SSh0WzJdKSxpPTA7aTxuLmxlbmd0aDsrK2kpbltpXT1MKG5baV0scikKcmV0dXJuIG5ldyBEKG4sdFsyXSl9cmV0dXJuIG5ldyBPKFRlKGUpKX1mdW5jdGlvbiBGKGUsdCxuKXt0aGlzLmluaXRTdGF0ZW1lbnQ9ZSx0aGlzLmNvbmRpdGlvbj10LHRoaXMuc3RlcD1ufWZ1bmN0aW9uIGsoZSx0KXt0aGlzLmluaXRTdGF0ZW1lbnQ9ZSx0aGlzLmNvbnRhaW5lcj10fWZ1bmN0aW9uIEIoZSx0KXt0aGlzLmluaXRTdGF0ZW1lbnQ9ZSx0aGlzLmNvbnRhaW5lcj10fWZ1bmN0aW9uICQoZSl7dmFyIHQKcmV0dXJuL1xiaW5cYi8udGVzdChlKT8odD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpLnNwbGl0KC9cYmluXGIvZyksbmV3IGsoTihzKHRbMF0pKSxUZSh0WzFdKSkpOmUuaW5kZXhPZigiOiIpPj0wJiZlLmluZGV4T2YoIjsiKTwwPyh0PWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkuc3BsaXQoIjoiKSxuZXcgQihOKHModFswXSkpLFRlKHRbMV0pKSk6KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKS5zcGxpdCgiOyIpLG5ldyBGKE4ocyh0WzBdKSksVGUodFsxXSksVGUodFsyXSkpKX1mdW5jdGlvbiBHKGUpe2Uuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LndlaWdodC1lLndlaWdodH0pfWZ1bmN0aW9uIFYoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMuYm9keT10LHRoaXMuaXNTdGF0aWM9bix0Lm93bmVyPXRoaXN9ZnVuY3Rpb24geihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5ib2R5PXQsdGhpcy5pc1N0YXRpYz1uLHQub3duZXI9dGhpc31mdW5jdGlvbiBVKGUpe3ZhciB0PUllLmV4ZWMoZSkKSWUubGFzdEluZGV4PTAKdmFyIG4scj10WzFdLmluZGV4T2YoInN0YXRpYyIpPj0wLGk9X2VbYyh0WzZdKV0scz13ZSxvPXAoKQpyZXR1cm4gd2U9byxuPSJpbnRlcmZhY2UiPT09dFsyXT9uZXcgVih0WzNdLFNlKGksdFszXSx0WzRdKSxyKTpuZXcgeih0WzNdLEVlKGksdFszXSx0WzRdLHRbNV0pLHIpLG0obixvLHMpLHdlPXMsbn1mdW5jdGlvbiBIKGUsdCxuLHIpe3RoaXMubmFtZT1lLHRoaXMucGFyYW1zPXQsdGhpcy5ib2R5PW4sdGhpcy5pc1N0YXRpYz1yfWZ1bmN0aW9uIFgoZSl7dmFyIHQ9RGUuZXhlYyhlKQpEZS5sYXN0SW5kZXg9MAp2YXIgbj10WzFdLmluZGV4T2YoInN0YXRpYyIpPj0wLHI9IjsiIT09dFs2XT9fZVtjKHRbNl0pXToie30iCnJldHVybiBuZXcgSCh0WzNdLHgoX2VbYyh0WzRdKV0pLFBlKHIpLG4pfWZ1bmN0aW9uIFkoZSx0LG4pe3RoaXMuZGVmaW5pdGlvbnM9ZSx0aGlzLmZpZWxkVHlwZT10LHRoaXMuaXNTdGF0aWM9bn1mdW5jdGlvbiBqKGUpe2Zvcih2YXIgdD1GZS5leGVjKGUpLG49dFsxXS5pbmRleE9mKCJzdGF0aWMiKT49MCxyPWUuc3Vic3RyaW5nKHRbMF0ubGVuZ3RoKS5zcGxpdCgvLFxzKi9nKSxpPUkodFsyXSkscz0wO3M8ci5sZW5ndGg7KytzKXJbc109TChyW3NdLGkpCnJldHVybiBuZXcgWShyLHRbMl0sbil9ZnVuY3Rpb24gSyhlLHQpe3RoaXMucGFyYW1zPWUsdGhpcy5ib2R5PXR9ZnVuY3Rpb24gVyhlKXt2YXIgdD1uZXcgUmVnRXhwKC8iQihcZCspIlxzKiJBKFxkKykiLykuZXhlYyhlKSxuPXgoX2VbdFsxXV0pCnJldHVybiBuZXcgSyhuLFBlKF9lW3RbMl1dKSl9ZnVuY3Rpb24gWihlLHQsbixyLGkscyl7dmFyIG8sYQpmb3IodGhpcy5uYW1lPWUsdGhpcy5pbnRlcmZhY2VzTmFtZXM9dCx0aGlzLm1ldGhvZHNOYW1lcz1uLHRoaXMuZmllbGRzPXIsdGhpcy5pbm5lckNsYXNzZXM9aSx0aGlzLm1pc2M9cyxvPTAsYT1yLmxlbmd0aDtvPGE7KytvKXJbb10ub3duZXI9dGhpc31mdW5jdGlvbiBxKGUsdCxuLHIsaSxzLG8sYSxsKXt2YXIgaCx1CmZvcih0aGlzLm5hbWU9ZSx0aGlzLmJhc2VDbGFzc05hbWU9dCx0aGlzLmludGVyZmFjZXNOYW1lcz1uLHRoaXMuZnVuY3Rpb25zPXIsdGhpcy5tZXRob2RzPWksdGhpcy5maWVsZHM9cyx0aGlzLmNzdHJzPW8sdGhpcy5pbm5lckNsYXNzZXM9YSx0aGlzLm1pc2M9bCxoPTAsdT1zLmxlbmd0aDtoPHU7KytoKXNbaF0ub3duZXI9dGhpc31mdW5jdGlvbiBRKGUsdCl7dGhpcy5uYW1lPWUsdGhpcy5ib2R5PXQsdC5vd25lcj10aGlzfWZ1bmN0aW9uIEooZSx0KXt0aGlzLm5hbWU9ZSx0aGlzLmJvZHk9dCx0Lm93bmVyPXRoaXN9ZnVuY3Rpb24gZWUoZSl7dmFyIHQ9SWUuZXhlYyhlKQpJZS5sYXN0SW5kZXg9MAp2YXIgbj1fZVtjKHRbNl0pXSxyPXdlLGk9cCgpCndlPWkKdmFyIHMKcmV0dXJuIHM9ImludGVyZmFjZSI9PT10WzJdP25ldyBRKHRbM10sU2Uobix0WzNdLHRbNF0pKTpuZXcgSih0WzNdLEVlKG4sdFszXSx0WzRdLHRbNV0pKSxtKHMsaSxyKSx3ZT1yLHN9ZnVuY3Rpb24gdGUoZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMucGFyYW1zPXQsdGhpcy5ib2R5PW59ZnVuY3Rpb24gbmUoZSl7dmFyIHQ9RGUuZXhlYyhlKQpEZS5sYXN0SW5kZXg9MApyZXR1cm4gbmV3IHRlKHRbM10seChfZVtjKHRbNF0pXSksUGUoX2VbYyh0WzZdKV0pKX1mdW5jdGlvbiByZShlKXt2YXIgdD1lCnJldHVybiB0PXQucmVwbGFjZSgvXGIoY2F0Y2hccyoiQlxkKyJccyoiQVxkKyIpKFxzKmNhdGNoXHMqIkJcZCsiXHMqIkFcZCsiKSsvZywiJDEiKX1mdW5jdGlvbiBpZShlLHQpe3RoaXMuYXJndW1lbnQ9ZSx0aGlzLm1pc2M9dH1mdW5jdGlvbiBzZShlLHQpe3RoaXMuYXJndW1lbnQ9ZSx0aGlzLm1pc2M9dH1mdW5jdGlvbiBvZShlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5hcmd1bWVudD10LHRoaXMubWlzYz1ufWZ1bmN0aW9uIGFlKGUpe3RoaXMuZXhwcj1lfWZ1bmN0aW9uIGxlKGUpe3RoaXMubGFiZWw9ZX1mdW5jdGlvbiBoZShlKXtmb3IodmFyIHQ9W10sbj0wLHI9ZS5sZW5ndGg7bjxyOysrbil7dmFyIGk9ZVtuXQppIGluc3RhbmNlb2YgRD90PXQuY29uY2F0KGkuZ2V0TmFtZXMoKSk6aSBpbnN0YW5jZW9mIGllJiZpLmFyZ3VtZW50LmluaXRTdGF0ZW1lbnQgaW5zdGFuY2VvZiBEP3Q9dC5jb25jYXQoaS5hcmd1bWVudC5pbml0U3RhdGVtZW50LmdldE5hbWVzKCkpOihpIGluc3RhbmNlb2YgVnx8aSBpbnN0YW5jZW9mIHp8fGkgaW5zdGFuY2VvZiBRfHxpIGluc3RhbmNlb2YgSnx8aSBpbnN0YW5jZW9mIHRlfHxpIGluc3RhbmNlb2YgRSkmJnQucHVzaChpLm5hbWUpfXJldHVybiBoKHt9LHQpfWZ1bmN0aW9uIHVlKGUpe3RoaXMuc3RhdGVtZW50cz1lfWZ1bmN0aW9uIGNlKGUpe3RoaXMuc3RhdGVtZW50cz1lfWZ1bmN0aW9uIGZlKGUpe2Z1bmN0aW9uIHQoZSx0KXtmb3IodmFyIG4scj10LnNwbGl0KCIuIikscz1lLnNjb3BlO3M7KXtpZihzLmhhc093blByb3BlcnR5KHJbMF0pKXtuPXNbclswXV0KYnJlYWt9cz1zLnNjb3BlfW49PT1vJiYobj1pW3JbMF1dKQpmb3IodmFyIGE9MSxsPXIubGVuZ3RoO2E8bCYmbjsrK2Epbj1uLmluU2NvcGVbclthXV0KcmV0dXJuIG59dmFyIG4scixpPXt9CmZvcihuIGluIFJlKWlmKFJlLmhhc093blByb3BlcnR5KG4pKXtyPVJlW25dCnZhciBzPXIuc2NvcGVJZCxhPXIubmFtZQppZihzKXt2YXIgbD1SZVtzXQpyLnNjb3BlPWwsbC5pblNjb3BlPT09byYmKGwuaW5TY29wZT17fSksbC5pblNjb3BlW2FdPXJ9ZWxzZSBpW2FdPXJ9Zm9yKG4gaW4gUmUpaWYoUmUuaGFzT3duUHJvcGVydHkobikpe3I9UmVbbl0KdmFyIGg9ci5ib2R5LmJhc2VDbGFzc05hbWUKaWYoaCl7dmFyIHU9dChyLGgpCnUmJihyLmJhc2U9dSx1LmRlcml2ZWR8fCh1LmRlcml2ZWQ9W10pLHUuZGVyaXZlZC5wdXNoKHIpKX12YXIgYyxmLHA9ci5ib2R5LmludGVyZmFjZXNOYW1lcyxtPVtdCmlmKHAmJnAubGVuZ3RoPjApe2ZvcihjPTAsZj1wLmxlbmd0aDtjPGY7KytjKXt2YXIgZz10KHIscFtjXSkKbS5wdXNoKGcpLGcmJihnLmRlcml2ZWR8fChnLmRlcml2ZWQ9W10pLGcuZGVyaXZlZC5wdXNoKHIpKX1tLmxlbmd0aD4wJiYoci5pbnRlcmZhY2VzPW0pfX19ZnVuY3Rpb24gcGUoZSl7ZnVuY3Rpb24gdChlLHQpe3ZhciBuPW9bZV0KaWYoIW4pcmV0dXJuITEKdmFyIHI9bi5pbmRleE9mKHQpCnJldHVybiEocjwwKSYmKG4uc3BsaWNlKHIsMSksIShuLmxlbmd0aD4wKSYmKGRlbGV0ZSBvW2VdLCEwKSl9dmFyIG4scixpLHM9W10sbz17fQpmb3IobiBpbiBSZSlpZihSZS5oYXNPd25Qcm9wZXJ0eShuKSlpZihpPVJlW25dLGkuaW5TY29wZXx8aS5kZXJpdmVkKXt2YXIgYT1bXQppZihpLmluU2NvcGUpZm9yKHIgaW4gaS5pblNjb3BlKWkuaW5TY29wZS5oYXNPd25Qcm9wZXJ0eShyKSYmYS5wdXNoKGkuaW5TY29wZVtyXSkKaS5kZXJpdmVkJiYoYT1hLmNvbmNhdChpLmRlcml2ZWQpKSxvW25dPWF9ZWxzZSBzLnB1c2gobiksaS53ZWlnaHQ9MApmb3IoO3MubGVuZ3RoPjA7KWlmKG49cy5zaGlmdCgpLGk9UmVbbl0saS5zY29wZUlkJiZ0KGkuc2NvcGVJZCxpKSYmKHMucHVzaChpLnNjb3BlSWQpLFJlW2kuc2NvcGVJZF0ud2VpZ2h0PWkud2VpZ2h0KzEpLGkuYmFzZSYmdChpLmJhc2UuY2xhc3NJZCxpKSYmKHMucHVzaChpLmJhc2UuY2xhc3NJZCksaS5iYXNlLndlaWdodD1pLndlaWdodCsxKSxpLmludGVyZmFjZXMpe3ZhciBsLGgKZm9yKGw9MCxoPWkuaW50ZXJmYWNlcy5sZW5ndGg7bDxoOysrbClpLmludGVyZmFjZXNbbF0mJnQoaS5pbnRlcmZhY2VzW2xdLmNsYXNzSWQsaSkmJihzLnB1c2goaS5pbnRlcmZhY2VzW2xdLmNsYXNzSWQpLGkuaW50ZXJmYWNlc1tsXS53ZWlnaHQ9aS53ZWlnaHQrMSl9fXZhciBtZT1yKCksZ2U9ZS5yZXBsYWNlKC9cclxuP3xcblxyL2csIlxuIiksZGU9W10sdmU9Z2UucmVwbGFjZSgvKCIoPzpbXiJcXFxuXXxcXC4pKiIpfCgnKD86W14nXFxcbl18XFwuKSonKXwoKFtcW1woPXwmIVxeOj9dXHMqKShcLyg/IVsqXC9dKSg/OlteXC9cXFxuXXxcXC4pKlwvW2dpbV0qKVxiKXwoXC9cL1teXG5dKlxuKXwoXC9cKig/Oig/IVwqXC8pKD86LnxcbikpKlwqXC8pL2csZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhKXt2YXIgbApyZXR1cm4gdHx8bj8obD1kZS5sZW5ndGgsZGUucHVzaChlKSwiJyIrbCsiJyIpOnI/KGw9ZGUubGVuZ3RoLGRlLnB1c2gocyksaSsiJyIrbCsiJyIpOiIiIT09YT8iICI6IlxuIn0pCnZlPXZlLnJlcGxhY2UoL19feChbMC05QS1GXXs0fSkvZyxmdW5jdGlvbihlLHQpe3JldHVybiJfX3gwMDVGX3giK3R9KSx2ZT12ZS5yZXBsYWNlKC9cJC9nLCJfX3gwMDI0IiksdmU9dmUucmVwbGFjZSgvcmV0dXJuXHMqW1xuXHJdKy9nLCJyZXR1cm4gIikKdmFyIHllLHhlPXZlLEFlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0fHxyP2U6KHllPSEwLCIiKX0KZG8geWU9ITEseGU9eGUucmVwbGFjZSgvKFs8XT8pPFxzKigoPzpcP3xbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSg/OlxbXF0pKig/OlxzKyg/OmV4dGVuZHN8c3VwZXIpXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKik/KD86XHMqLFxzKig/Olw/fFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKD86XFtcXSkqKD86XHMrKD86ZXh0ZW5kc3xzdXBlcilccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKT8pKilccyo+KFs9XT8pL2csQWUpCndoaWxlKHllKQp2YXIgYmUsd2UsRWUsU2UsUGUsQ2UsTWUsVGUsX2U9dCh4ZSksUmU9e30sTGU9MCxJZT0vXGIoKD86KD86cHVibGljfHByaXZhdGV8ZmluYWx8cHJvdGVjdGVkfHN0YXRpY3xhYnN0cmFjdClccyspKikoY2xhc3N8aW50ZXJmYWNlKVxzKyhbQS1aYS16XyRdW1x3JF0qXGIpKFxzK2V4dGVuZHNccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqLFxzKltBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSpcYikqKT8oXHMraW1wbGVtZW50c1xzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyosXHMqW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKlxiKSopP1xzKigiQVxkKyIpL2csRGU9L1xiKCg/Oig/OnB1YmxpY3xwcml2YXRlfGZpbmFsfHByb3RlY3RlZHxzdGF0aWN8YWJzdHJhY3R8c3luY2hyb25pemVkKVxzKykqKSgoPyEoPzplbHNlfG5ld3xyZXR1cm58dGhyb3d8ZnVuY3Rpb258cHVibGljfHByaXZhdGV8cHJvdGVjdGVkKVxiKVtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyoiQ1xkKyIpKilccyooW0EtWmEtel8kXVtcdyRdKlxiKVxzKigiQlxkKyIpKFxzKnRocm93c1xzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyosXHMqW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikqKT9ccyooIkFcZCsifDspL2csT2U9L14oKD86KD86cHVibGljfHByaXZhdGV8ZmluYWx8cHJvdGVjdGVkfHN0YXRpYylccyspKikoKD8hKD86ZWxzZXxuZXd8cmV0dXJufHRocm93KVxiKVtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyoiQ1xkKyIpKilccyooW0EtWmEtel8kXVtcdyRdKlxiKVxzKig/OiJDXGQrIlxzKikqKFs9LF18JCkvLE5lPS9cYigoPzooPzpwdWJsaWN8cHJpdmF0ZXxmaW5hbHxwcm90ZWN0ZWR8c3RhdGljfGFic3RyYWN0KVxzKykqKSgoPyEoPzpuZXd8cmV0dXJufHRocm93KVxiKVtBLVphLXpfJF1bXHckXSpcYilccyooIkJcZCsiKShccyp0aHJvd3NccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKD86XHMqLFxzKltBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKik/XHMqKCJBXGQrIikvZyxGZT0vXigoPzooPzpwdWJsaWN8cHJpdmF0ZXxmaW5hbHxwcm90ZWN0ZWR8c3RhdGljKVxzKykqKSgoPyEoPzpuZXd8cmV0dXJufHRocm93KVxiKVtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyoiQ1xkKyIpKilccyovLGtlPS9cYmZ1bmN0aW9uKD86XHMrKFtBLVphLXpfJF1bXHckXSopKT9ccyooIkJcZCsiKVxzKigiQVxkKyIpL2cKdi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSx5LnByb3RvdHlwZS5nZXROYW1lcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLnBhcmFtcy5sZW5ndGg7dDxuOysrdCllLnB1c2godGhpcy5wYXJhbXNbdF0ubmFtZSkKcmV0dXJuIGV9LHkucHJvdG90eXBlLnByZXBlbmRNZXRob2RBcmdzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm1ldGhvZEFyZ3NQYXJhbT8ie1xudmFyICIrdGhpcy5tZXRob2RBcmdzUGFyYW0ubmFtZSsiID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAiK3RoaXMucGFyYW1zLmxlbmd0aCsiKTtcbiIrZS5zdWJzdHJpbmcoMSk6ZX0seS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5wYXJhbXMubGVuZ3RoKXJldHVybiIoKSIKZm9yKHZhciBlPSIoIix0PTAsbj10aGlzLnBhcmFtcy5sZW5ndGg7dDxuOysrdCllKz10aGlzLnBhcmFtc1t0XSsiLCAiCnJldHVybiBlLnN1YnN0cmluZygwLGUubGVuZ3RoLTIpKyIpIn0sYi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4ibmV3ICgiK3RoaXMuYm9keSsiKSJ9LEUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9YmUsdD1oKHt0aGlzOm51bGx9LHRoaXMucGFyYW1zLmdldE5hbWVzKCkpCmJlPWZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4ubmFtZSk/bi5uYW1lOmUobil9CnZhciBuPSJmdW5jdGlvbiIKdGhpcy5uYW1lJiYobis9IiAiK3RoaXMubmFtZSkKdmFyIHI9dGhpcy5wYXJhbXMucHJlcGVuZE1ldGhvZEFyZ3ModGhpcy5ib2R5LnRvU3RyaW5nKCkpCnJldHVybiBuKz10aGlzLnBhcmFtcysiICIrcixiZT1lLG59LFAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9YmUKYmU9ZnVuY3Rpb24odCl7cmV0dXJuInRoaXMiPT09dC5uYW1lPyJ0aGlzIjplKHQpfQpmb3IodmFyIHQ9IiIsbj0wLHI9dGhpcy5tZW1iZXJzLmxlbmd0aDtuPHI7KytuKXRoaXMubWVtYmVyc1tuXS5sYWJlbCYmKHQrPXRoaXMubWVtYmVyc1tuXS5sYWJlbCsiOiAiKSx0Kz10aGlzLm1lbWJlcnNbbl0udmFsdWUudG9TdHJpbmcoKSsiLCAiCnJldHVybiBiZT1lLHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtMil9LF8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50cmFuc2Zvcm1zLHQ9VCh0aGlzLmV4cHIpCnJldHVybiB0LnJlcGxhY2UoLyIhKFxkKykiL2csZnVuY3Rpb24odCxuKXtyZXR1cm4gZVtuXS50b1N0cmluZygpfSl9LFRlPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49TShlKQpyZXR1cm4gbj1uLnJlcGxhY2UoLyJIKFxkKykiL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5wdXNoKFMoX2Vbbl0pKSwnIiEnKyh0Lmxlbmd0aC0xKSsnIid9KSxuPW4ucmVwbGFjZSgvIkYoXGQrKSIvZyxmdW5jdGlvbihlLG4pe3JldHVybiB0LnB1c2godyhfZVtuXSkpLCciIScrKHQubGVuZ3RoLTEpKyciJ30pLG49bi5yZXBsYWNlKC8iSShcZCspIi9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQucHVzaChDKF9lW25dKSksJyIhJysodC5sZW5ndGgtMSkrJyInfSksbmV3IF8obix0KX0sUi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lKyIgPSAiK3RoaXMudmFsdWV9LEQucHJvdG90eXBlLmdldE5hbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuZGVmaW5pdGlvbnMubGVuZ3RoO3Q8bjsrK3QpZS5wdXNoKHRoaXMuZGVmaW5pdGlvbnNbdF0ubmFtZSkKcmV0dXJuIGV9LEQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInZhciAiK3RoaXMuZGVmaW5pdGlvbnMuam9pbigiLCIpfSxPLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cHJlc3Npb24udG9TdHJpbmcoKX0sRi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKCIrdGhpcy5pbml0U3RhdGVtZW50KyI7ICIrdGhpcy5jb25kaXRpb24rIjsgIit0aGlzLnN0ZXArIikifSxrLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5pdFN0YXRlbWVudC50b1N0cmluZygpCnJldHVybiBlLmluZGV4T2YoIj0iKT49MCYmKGU9ZS5zdWJzdHJpbmcoMCxlLmluZGV4T2YoIj0iKSkpLCIoIitlKyIgaW4gIit0aGlzLmNvbnRhaW5lcisiKSJ9LEIuaXRlcmF0b3JJZD0wLEIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5pbml0U3RhdGVtZW50LnRvU3RyaW5nKCksdD0iJGl0IitCLml0ZXJhdG9ySWQrKyxuPWUucmVwbGFjZSgvXlxzKnZhclxzKi8sIiIpLnNwbGl0KCI9IilbMF0scj0idmFyICIrdCsiID0gbmV3ICRwLk9iamVjdEl0ZXJhdG9yKCIrdGhpcy5jb250YWluZXIrIiksICIrbisiID0gdm9pZCgwKSIsaT10KyIuaGFzTmV4dCgpICYmICgoIituKyIgPSAiK3QrIi5uZXh0KCkpIHx8IHRydWUpIgpyZXR1cm4iKCIrcisiOyAiK2krIjspIn0sVi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmJvZHl9LHoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5ib2R5fSxILnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWgoe30sdGhpcy5wYXJhbXMuZ2V0TmFtZXMoKSksdD1iZQpiZT1mdW5jdGlvbihuKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eShuLm5hbWUpP24ubmFtZTp0KG4pfQp2YXIgbj10aGlzLnBhcmFtcy5wcmVwZW5kTWV0aG9kQXJncyh0aGlzLmJvZHkudG9TdHJpbmcoKSkscj0iZnVuY3Rpb24gIit0aGlzLm1ldGhvZElkK3RoaXMucGFyYW1zKyIgIituKyJcbiIKcmV0dXJuIGJlPXQscn0sWS5wcm90b3R5cGUuZ2V0TmFtZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5kZWZpbml0aW9ucy5sZW5ndGg7dDxuOysrdCllLnB1c2godGhpcy5kZWZpbml0aW9uc1t0XS5uYW1lKQpyZXR1cm4gZX0sWS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1iZSh7bmFtZToiW3RoaXNdIn0pCmlmKHRoaXMuaXNTdGF0aWMpe2Zvcih2YXIgdD10aGlzLm93bmVyLm5hbWUsbj1bXSxyPTAsaT10aGlzLmRlZmluaXRpb25zLmxlbmd0aDtyPGk7KytyKXt2YXIgcz10aGlzLmRlZmluaXRpb25zW3JdLG89cy5uYW1lLGE9dCsiLiIrbyxsPSJpZigiK2ErIiA9PT0gdm9pZCgwKSkge1xuICIrYSsiID0gIitzLnZhbHVlKyI7IH1cbiRwLmRlZmluZVByb3BlcnR5KCIrZSsiLCAnIitvKyInLCB7IGdldDogZnVuY3Rpb24oKXtyZXR1cm4gIithKyI7fSwgc2V0OiBmdW5jdGlvbih2YWwpeyIrYSsiID0gdmFsO30gfSk7XG4iCm4ucHVzaChsKX1yZXR1cm4gbi5qb2luKCIiKX1yZXR1cm4gZSsiLiIrdGhpcy5kZWZpbml0aW9ucy5qb2luKCI7ICIrZSsiLiIpfSxLLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWgoe30sdGhpcy5wYXJhbXMuZ2V0TmFtZXMoKSksdD1iZQpiZT1mdW5jdGlvbihuKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eShuLm5hbWUpP24ubmFtZTp0KG4pfQp2YXIgbj0iZnVuY3Rpb24gJGNvbnN0cl8iK3RoaXMucGFyYW1zLnBhcmFtcy5sZW5ndGgrdGhpcy5wYXJhbXMudG9TdHJpbmcoKSxyPXRoaXMucGFyYW1zLnByZXBlbmRNZXRob2RBcmdzKHRoaXMuYm9keS50b1N0cmluZygpKQpyZXR1cm4vXCQoc3VwZXJDc3RyfGNvbnN0cilcYi8udGVzdChyKXx8KHI9IntcbiRzdXBlckNzdHIoKTtcbiIrci5zdWJzdHJpbmcoMSkpLGJlPXQsbityKyJcbiJ9LFoucHJvdG90eXBlLmdldE1lbWJlcnM9ZnVuY3Rpb24oZSx0LG4pe3RoaXMub3duZXIuYmFzZSYmdGhpcy5vd25lci5iYXNlLmJvZHkuZ2V0TWVtYmVycyhlLHQsbikKdmFyIHIsaSxzLG8KZm9yKHI9MCxzPXRoaXMuZmllbGRzLmxlbmd0aDtyPHM7KytyKXt2YXIgYT10aGlzLmZpZWxkc1tyXS5nZXROYW1lcygpCmZvcihpPTAsbz1hLmxlbmd0aDtpPG87KytpKWVbYVtpXV09dGhpcy5maWVsZHNbcl19Zm9yKHI9MCxzPXRoaXMubWV0aG9kc05hbWVzLmxlbmd0aDtyPHM7KytyKXt2YXIgbD10aGlzLm1ldGhvZHNOYW1lc1tyXQp0W2xdPSEwfWZvcihyPTAscz10aGlzLmlubmVyQ2xhc3Nlcy5sZW5ndGg7cjxzOysrcil7dmFyIGg9dGhpcy5pbm5lckNsYXNzZXNbcl0KbltoLm5hbWVdPWh9fSxaLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciB0PTA7ZTspKyt0LGU9ZS5zY29wZQpyZXR1cm4gdH12YXIgdD0oZSh0aGlzLm93bmVyKSx0aGlzLm5hbWUpLG49IiIscj0iIixpPXt9LHM9e30sbz17fQp0aGlzLmdldE1lbWJlcnMoaSxzLG8pCnZhciBhLGwKaWYodGhpcy5vd25lci5pbnRlcmZhY2VzKXt2YXIgaCx1PVtdCmZvcihhPTAsbD10aGlzLmludGVyZmFjZXNOYW1lcy5sZW5ndGg7YTxsOysrYSl0aGlzLm93bmVyLmludGVyZmFjZXNbYV0mJihoPWJlKHtuYW1lOnRoaXMuaW50ZXJmYWNlc05hbWVzW2FdfSksdS5wdXNoKGgpLG4rPSIkcC5leHRlbmRJbnRlcmZhY2VNZW1iZXJzKCIrdCsiLCAiK2grIik7XG4iKQpyKz10KyIuJGludGVyZmFjZXMgPSBbIit1LmpvaW4oIiwgIikrIl07XG4ifWZvcihyKz10KyIuJGlzSW50ZXJmYWNlID0gdHJ1ZTtcbiIscis9dCsiLiRtZXRob2RzID0gWyciK3RoaXMubWV0aG9kc05hbWVzLmpvaW4oIicsICciKSsiJ107XG4iLEcodGhpcy5pbm5lckNsYXNzZXMpLGE9MCxsPXRoaXMuaW5uZXJDbGFzc2VzLmxlbmd0aDthPGw7KythKXt2YXIgYz10aGlzLmlubmVyQ2xhc3Nlc1thXQpjLmlzU3RhdGljJiYobis9dCsiLiIrYy5uYW1lKyIgPSAiK2MrIjtcbiIpfWZvcihhPTAsbD10aGlzLmZpZWxkcy5sZW5ndGg7YTxsOysrYSl7dmFyIGY9dGhpcy5maWVsZHNbYV0KZi5pc1N0YXRpYyYmKG4rPXQrIi4iK2YuZGVmaW5pdGlvbnMuam9pbigiO1xuIit0KyIuIikrIjtcbiIpfXJldHVybiIoZnVuY3Rpb24oKSB7XG5mdW5jdGlvbiAiK3QrIigpIHsgdGhyb3cgJ1VuYWJsZSB0byBjcmVhdGUgdGhlIGludGVyZmFjZSc7IH1cbiIrbityKyJyZXR1cm4gIit0KyI7XG59KSgpIn0sU2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkKcj1nKHIpLHI9ZChyLHQpCnZhciBzPVtdLGE9W10Kcj1yLnJlcGxhY2UoLyIoW0RFXSkoXGQrKSIvZyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIkQiPT09dD9zLnB1c2gobik6IkUiPT09dCYmYS5wdXNoKG4pLCIifSkKdmFyIGwsaCx1LGM9ci5zcGxpdCgvOyg/OlxzKjspKi9nKQpmb3IobiE9PW8mJihsPW4ucmVwbGFjZSgvXlxzKmV4dGVuZHNccysoLis/KVxzKiQvZywiJDEiKS5zcGxpdCgvXHMqLFxzKi9nKSksaD0wLHU9cy5sZW5ndGg7aDx1OysraCl7dmFyIGY9WChfZVtzW2hdXSkKc1toXT1mLm5hbWV9Zm9yKGg9MCx1PWMubGVuZ3RoLTE7aDx1OysraCl7dmFyIHA9aShjW2hdKQpjW2hdPWoocC5taWRkbGUpfXZhciBtPWMucG9wKCkKZm9yKGg9MCx1PWEubGVuZ3RoO2g8dTsrK2gpYVtoXT1VKF9lW2FbaF1dKQpyZXR1cm4gbmV3IFoodCxsLHMsYyxhLHt0YWlsOm19KX0scS5wcm90b3R5cGUuZ2V0TWVtYmVycz1mdW5jdGlvbihlLHQsbil7dGhpcy5vd25lci5iYXNlJiZ0aGlzLm93bmVyLmJhc2UuYm9keS5nZXRNZW1iZXJzKGUsdCxuKQp2YXIgcixpLHMsbwpmb3Iocj0wLHM9dGhpcy5maWVsZHMubGVuZ3RoO3I8czsrK3Ipe3ZhciBhPXRoaXMuZmllbGRzW3JdLmdldE5hbWVzKCkKZm9yKGk9MCxvPWEubGVuZ3RoO2k8bzsrK2kpZVthW2ldXT10aGlzLmZpZWxkc1tyXX1mb3Iocj0wLHM9dGhpcy5tZXRob2RzLmxlbmd0aDtyPHM7KytyKXt2YXIgbD10aGlzLm1ldGhvZHNbcl0KdFtsLm5hbWVdPWx9Zm9yKHI9MCxzPXRoaXMuaW5uZXJDbGFzc2VzLmxlbmd0aDtyPHM7KytyKXt2YXIgaD10aGlzLmlubmVyQ2xhc3Nlc1tyXQpuW2gubmFtZV09aH19LHEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIHQ9MDtlOykrK3QsZT1lLnNjb3BlCnJldHVybiB0fXZhciB0PWUodGhpcy5vd25lciksbj0iJHRoaXNfIit0LHI9dGhpcy5uYW1lLGk9InZhciAiK24rIiA9IHRoaXM7XG4iLG89IiIsYT0iIixsPXt9LGg9e30sdT17fQp0aGlzLmdldE1lbWJlcnMobCxoLHUpCnZhciBjPWJlCmJlPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZQpyZXR1cm4idGhpcyI9PT10P2UuY2FsbFNpZ258fCFlLm1lbWJlcj9uKyIuJHNlbGYiOm46bC5oYXNPd25Qcm9wZXJ0eSh0KT9sW3RdLmlzU3RhdGljP3IrIi4iK3Q6bisiLiIrdDp1Lmhhc093blByb3BlcnR5KHQpP24rIi4iK3Q6aC5oYXNPd25Qcm9wZXJ0eSh0KT9oW3RdLmlzU3RhdGljP3IrIi4iK3Q6bisiLiRzZWxmLiIrdDpjKGUpfQp2YXIgZgp0aGlzLmJhc2VDbGFzc05hbWU/KGY9Yyh7bmFtZTp0aGlzLmJhc2VDbGFzc05hbWV9KSxpKz0idmFyICRzdXBlciA9IHsgJHVwY2FzdDogIituKyIgfTtcbiIsaSs9ImZ1bmN0aW9uICRzdXBlckNzdHIoKXsiK2YrIi5hcHBseSgkc3VwZXIsYXJndW1lbnRzKTtpZighKCckc2VsZicgaW4gJHN1cGVyKSkgJHAuZXh0ZW5kQ2xhc3NDaGFpbigkc3VwZXIpfVxuIixhKz1yKyIuJGJhc2UgPSAiK2YrIjtcbiIpOmkrPSJmdW5jdGlvbiAkc3VwZXJDc3RyKCl7JHAuZXh0ZW5kQ2xhc3NDaGFpbigiK24rIil9XG4iLHRoaXMub3duZXIuYmFzZSYmKG8rPSIkcC5leHRlbmRTdGF0aWNNZW1iZXJzKCIrcisiLCAiK2YrIik7XG4iKQp2YXIgcCxtLGcsZAppZih0aGlzLm93bmVyLmludGVyZmFjZXMpe3ZhciB2LHk9W10KZm9yKHA9MCxtPXRoaXMuaW50ZXJmYWNlc05hbWVzLmxlbmd0aDtwPG07KytwKXRoaXMub3duZXIuaW50ZXJmYWNlc1twXSYmKHY9Yyh7bmFtZTp0aGlzLmludGVyZmFjZXNOYW1lc1twXX0pLHkucHVzaCh2KSxvKz0iJHAuZXh0ZW5kSW50ZXJmYWNlTWVtYmVycygiK3IrIiwgIit2KyIpO1xuIikKYSs9cisiLiRpbnRlcmZhY2VzID0gWyIreS5qb2luKCIsICIpKyJdO1xuIn1mb3IodGhpcy5mdW5jdGlvbnMubGVuZ3RoPjAmJihpKz10aGlzLmZ1bmN0aW9ucy5qb2luKCJcbiIpKyJcbiIpLEcodGhpcy5pbm5lckNsYXNzZXMpLHA9MCxtPXRoaXMuaW5uZXJDbGFzc2VzLmxlbmd0aDtwPG07KytwKXt2YXIgeD10aGlzLmlubmVyQ2xhc3Nlc1twXQp4LmlzU3RhdGljPyhvKz1yKyIuIit4Lm5hbWUrIiA9ICIreCsiO1xuIixpKz1uKyIuIit4Lm5hbWUrIiA9ICIrcisiLiIreC5uYW1lKyI7XG4iKTppKz1uKyIuIit4Lm5hbWUrIiA9ICIreCsiO1xuIn1mb3IocD0wLG09dGhpcy5maWVsZHMubGVuZ3RoO3A8bTsrK3Ape3ZhciBBPXRoaXMuZmllbGRzW3BdCmlmKEEuaXNTdGF0aWMpZm9yKG8rPXIrIi4iK0EuZGVmaW5pdGlvbnMuam9pbigiO1xuIityKyIuIikrIjtcbiIsZz0wLGQ9QS5kZWZpbml0aW9ucy5sZW5ndGg7ZzxkOysrZyl7dmFyIGI9QS5kZWZpbml0aW9uc1tnXS5uYW1lLHc9cisiLiIrYgppKz0iJHAuZGVmaW5lUHJvcGVydHkoIituKyIsICciK2IrIicsIHtnZXQ6IGZ1bmN0aW9uKCl7cmV0dXJuICIrdysifSwgc2V0OiBmdW5jdGlvbih2YWwpeyIrdysiID0gdmFsfX0pO1xuIn1lbHNlIGkrPW4rIi4iK0EuZGVmaW5pdGlvbnMuam9pbigiO1xuIituKyIuIikrIjtcbiJ9dmFyIEU9e30KZm9yKHA9MCxtPXRoaXMubWV0aG9kcy5sZW5ndGg7cDxtOysrcCl7dmFyIFM9dGhpcy5tZXRob2RzW3BdLFA9RVtTLm5hbWVdLEM9Uy5uYW1lKyIkIitTLnBhcmFtcy5wYXJhbXMubGVuZ3RoLE09ISFTLnBhcmFtcy5tZXRob2RBcmdzUGFyYW0KUD8oKytQLEMrPSJfIitQKTpQPTEsUy5tZXRob2RJZD1DLEVbUy5uYW1lXT1QLFMuaXNTdGF0aWM/KG8rPVMsbys9IiRwLmFkZE1ldGhvZCgiK3IrIiwgJyIrUy5uYW1lKyInLCAiK0MrIiwgIitNKyIpO1xuIixpKz0iJHAuYWRkTWV0aG9kKCIrbisiLCAnIitTLm5hbWUrIicsICIrQysiLCAiK00rIik7XG4iKTooaSs9UyxpKz0iJHAuYWRkTWV0aG9kKCIrbisiLCAnIitTLm5hbWUrIicsICIrQysiLCAiK00rIik7XG4iKX1pKz1zKHRoaXMubWlzYy50YWlsKSx0aGlzLmNzdHJzLmxlbmd0aD4wJiYoaSs9dGhpcy5jc3Rycy5qb2luKCJcbiIpKyJcbiIpLGkrPSJmdW5jdGlvbiAkY29uc3RyKCkge1xuIgp2YXIgVD1bXQpmb3IocD0wLG09dGhpcy5jc3Rycy5sZW5ndGg7cDxtOysrcCl7dmFyIF89dGhpcy5jc3Ryc1twXS5wYXJhbXMucGFyYW1zLmxlbmd0aCxSPSEhdGhpcy5jc3Ryc1twXS5wYXJhbXMubWV0aG9kQXJnc1BhcmFtClQucHVzaCgiaWYoYXJndW1lbnRzLmxlbmd0aCAiKyhSPyI+PSI6Ij09PSIpKyIgIitfKyIpIHsgJGNvbnN0cl8iK18rIi5hcHBseSgiK24rIiwgYXJndW1lbnRzKTsgfSIpfXJldHVybiBULmxlbmd0aD4wJiYoaSs9VC5qb2luKCIgZWxzZSAiKSsiIGVsc2UgIiksaSs9IiRzdXBlckNzdHIoKTtcbn1cbiIsaSs9IiRjb25zdHIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiIsYmU9YywiKGZ1bmN0aW9uKCkge1xuZnVuY3Rpb24gIityKyIoKSB7XG4iK2krIn1cbiIrbythKyJyZXR1cm4gIityKyI7XG59KSgpIn0sRWU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIHM9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKQpzPWcocykscz1kKHMsdCkKdmFyIGE9W10sbD1bXSxoPVtdLHU9W10Kcz1zLnJlcGxhY2UoLyIoW0RFR0hdKShcZCspIi9nLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4iRCI9PT10P2EucHVzaChuKToiRSI9PT10P2wucHVzaChuKToiSCI9PT10P3UucHVzaChuKTpoLnB1c2gobiksIiJ9KQp2YXIgYyxmLHAsbT1zLnJlcGxhY2UoL14oPzpccyo7KSsvLCIiKS5zcGxpdCgvOyg/OlxzKjspKi9nKQpmb3IobiE9PW8mJihjPW4ucmVwbGFjZSgvXlxzKmV4dGVuZHNccysoW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKilccyokL2csIiQxIikpLHIhPT1vJiYoZj1yLnJlcGxhY2UoL15ccyppbXBsZW1lbnRzXHMrKC4rPylccyokL2csIiQxIikuc3BsaXQoL1xzKixccyovZykpLHA9MDtwPHUubGVuZ3RoOysrcCl1W3BdPVMoX2VbdVtwXV0pCmZvcihwPTA7cDxhLmxlbmd0aDsrK3ApYVtwXT1YKF9lW2FbcF1dKQpmb3IocD0wO3A8bS5sZW5ndGgtMTsrK3Ape3ZhciB2PWkobVtwXSkKbVtwXT1qKHYubWlkZGxlKX12YXIgeT1tLnBvcCgpCmZvcihwPTA7cDxoLmxlbmd0aDsrK3ApaFtwXT1XKF9lW2hbcF1dKQpmb3IocD0wO3A8bC5sZW5ndGg7KytwKWxbcF09VShfZVtsW3BdXSkKcmV0dXJuIG5ldyBxKHQsYyxmLHUsYSxtLGgsbCx7dGFpbDp5fSl9LFEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInZhciAiK3RoaXMubmFtZSsiID0gIit0aGlzLmJvZHkrIjtcbiRwLiIrdGhpcy5uYW1lKyIgPSAiK3RoaXMubmFtZSsiO1xuIn0sSi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idmFyICIrdGhpcy5uYW1lKyIgPSAiK3RoaXMuYm9keSsiO1xuJHAuIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5uYW1lKyI7XG4ifSx0ZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1oKHt9LHRoaXMucGFyYW1zLmdldE5hbWVzKCkpLHQ9YmUKYmU9ZnVuY3Rpb24obil7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkobi5uYW1lKT9uLm5hbWU6dChuKX0KdmFyIG49dGhpcy5wYXJhbXMucHJlcGVuZE1ldGhvZEFyZ3ModGhpcy5ib2R5LnRvU3RyaW5nKCkpLHI9ImZ1bmN0aW9uICIrdGhpcy5uYW1lK3RoaXMucGFyYW1zKyIgIituKyJcbiRwLiIrdGhpcy5uYW1lKyIgPSAiK3RoaXMubmFtZSsiO1xuIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5uYW1lKyIuYmluZCgkcCk7IgpyZXR1cm4gYmU9dCxyfSxpZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5taXNjLnByZWZpeCt0aGlzLmFyZ3VtZW50LnRvU3RyaW5nKCl9LHNlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1pc2MucHJlZml4K3RoaXMuYXJndW1lbnQudG9TdHJpbmcoKX0sb2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5taXNjLnByZWZpeApyZXR1cm4gdGhpcy5hcmd1bWVudCE9PW8mJihlKz10aGlzLmFyZ3VtZW50LnRvU3RyaW5nKCkpLGV9LGFlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJjYXNlICIrdGhpcy5leHByKyI6In0sbGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWx9LENlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgUmVnRXhwKC9cYihjYXRjaHxmb3J8aWZ8c3dpdGNofHdoaWxlfHdpdGgpXHMqIkIoXGQrKSJ8XGIoZG98ZWxzZXxmaW5hbGx5fHJldHVybnx0aHJvd3x0cnl8YnJlYWt8Y29udGludWUpXGJ8KCJbQURFSF0oXGQrKSIpfFxiKGNhc2UpXHMrKFteOl0rKTp8XGIoW0EtWmEtel8kXVtcdyRdKlxzKjopfCg7KS9nKSxhPVtdCmU9cmUoZSkKZm9yKHZhciBsLGgsdT0wO251bGwhPT0obD1yLmV4ZWMoZSkpOyl7aWYobFsxXSE9PW8pe3ZhciBjPWUubGFzdEluZGV4T2YoJyJCJyxyLmxhc3RJbmRleCksZj1lLnN1YnN0cmluZyh1LGMpCiJmb3IiPT09bFsxXT9hLnB1c2gobmV3IGllKCQoX2VbbFsyXV0pLHtwcmVmaXg6Zn0pKToiY2F0Y2giPT09bFsxXT9hLnB1c2gobmV3IHNlKHgoX2VbbFsyXV0pLHtwcmVmaXg6Zn0pKTphLnB1c2gobmV3IG9lKGxbMV0sVGUoX2VbbFsyXV0pLHtwcmVmaXg6Zn0pKX1lbHNlIGlmKGxbM10hPT1vKWEucHVzaChuZXcgb2UobFszXSxvLHtwcmVmaXg6ZS5zdWJzdHJpbmcodSxyLmxhc3RJbmRleCl9KSkKZWxzZSBpZihsWzRdIT09byl7aWYoaD1lLnN1YnN0cmluZyh1LHIubGFzdEluZGV4LWxbNF0ubGVuZ3RoKSwwIT09cyhoKS5sZW5ndGgpY29udGludWUKYS5wdXNoKGgpCnZhciBwPWxbNF0uY2hhckF0KDEpLG09bFs1XQoiRCI9PT1wP2EucHVzaCh0KF9lW21dKSk6IkUiPT09cD9hLnB1c2gobihfZVttXSkpOiJIIj09PXA/YS5wdXNoKFMoX2VbbV0pKTphLnB1c2goUGUoX2VbbV0pKX1lbHNlIGlmKGxbNl0hPT1vKWEucHVzaChuZXcgYWUoVGUocyhsWzddKSkpKQplbHNlIGlmKGxbOF0hPT1vKXtpZihoPWUuc3Vic3RyaW5nKHUsci5sYXN0SW5kZXgtbFs4XS5sZW5ndGgpLDAhPT1zKGgpLmxlbmd0aCljb250aW51ZQphLnB1c2gobmV3IGxlKGUuc3Vic3RyaW5nKHUsci5sYXN0SW5kZXgpKSl9ZWxzZXt2YXIgZz1pKGUuc3Vic3RyaW5nKHUsci5sYXN0SW5kZXgtMSkpCmEucHVzaChnLmxlZnQpLGEucHVzaChOKGcubWlkZGxlKSksYS5wdXNoKGcucmlnaHQrIjsiKX11PXIubGFzdEluZGV4fXZhciBkPWkoZS5zdWJzdHJpbmcodSkpCnJldHVybiBhLnB1c2goZC5sZWZ0KSwiIiE9PWQubWlkZGxlJiYoYS5wdXNoKE4oZC5taWRkbGUpKSxhLnB1c2goIjsiK2QucmlnaHQpKSxhfSx1ZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1oZSh0aGlzLnN0YXRlbWVudHMpLHQ9YmUKdShlKXx8KGJlPWZ1bmN0aW9uKG4pe3JldHVybiBlLmhhc093blByb3BlcnR5KG4ubmFtZSk/bi5uYW1lOnQobil9KQp2YXIgbj0ie1xuIit0aGlzLnN0YXRlbWVudHMuam9pbigiIikrIlxufSIKcmV0dXJuIGJlPXQsbn0sUGU9ZnVuY3Rpb24oZSl7dmFyIHQ9aShlLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKQpyZXR1cm4gbmV3IHVlKENlKHQubWlkZGxlKSl9LGNlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49W10scj0wLGk9dGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDtyPGk7KytyKWU9dGhpcy5zdGF0ZW1lbnRzW3JdLGUgaW5zdGFuY2VvZiBKfHxlIGluc3RhbmNlb2YgUT90LnB1c2goZSk6bi5wdXNoKGUpCkcodCkKdmFyIHM9aGUodGhpcy5zdGF0ZW1lbnRzKQpiZT1mdW5jdGlvbihlKXt2YXIgdD1lLm5hbWUKcmV0dXJuIHMuaGFzT3duUHJvcGVydHkodCk/dDptZS5oYXNPd25Qcm9wZXJ0eSh0KXx8bC5oYXNPd25Qcm9wZXJ0eSh0KXx8YS5oYXNPd25Qcm9wZXJ0eSh0KT8iJHAuIit0OnR9CnZhciBvPSIvLyB0aGlzIGNvZGUgd2FzIGF1dG9nZW5lcmF0ZWQgZnJvbSBQSlNcbihmdW5jdGlvbigkcCkge1xuIit0LmpvaW4oIiIpKyJcbiIrbi5qb2luKCIiKSsiXG59KSIKcmV0dXJuIGJlPW51bGwsb30sTWU9ZnVuY3Rpb24oKXt2YXIgZT1nKF9lWzBdKQpyZXR1cm4gZT1lLnJlcGxhY2UoL1xiaW1wb3J0XHMrW147XSs7L2csIiIpLG5ldyBjZShDZShlLG5lLGVlKSl9CnZhciBCZT1NZSgpCmZlKEJlKSxwZShCZSkKdmFyICRlPUJlLnRvU3RyaW5nKCkKcmV0dXJuICRlPSRlLnJlcGxhY2UoL1xzKlxuKD86W1x0IF0qXG4pKy9nLCJcblxuIiksJGU9JGUucmVwbGFjZSgvX194KFswLTlBLUZdezR9KS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodCwxNikpfSksbigkZSxkZSl9ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPW5ldyBSZWdFeHAoL1wvXCpccypAcGpzXHMrKCg/OlteXCpdfFwqK1teXCpcL10pKilcKlwvL2cpLmV4ZWMoZSkKaWYobiYmMj09PW4ubGVuZ3RoKWZvcih2YXIgcj1bXSxpPW4uc3BsaWNlKDEsMilbMF0ucmVwbGFjZSgvXHsoW1xzXFNdKj8pXH0vZyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLnB1c2godCksInsiKyhyLmxlbmd0aC0xKSsifSJ9fSgpKS5yZXBsYWNlKCJcbiIsIiIpLnJlcGxhY2UoIlxyIiwiIikuc3BsaXQoIjsiKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL15ccypbIiddPy8sIiIpLnJlcGxhY2UoL1siJ10/XHMqJC8sIiIpfSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKXt2YXIgbD1pW29dLnNwbGl0KCI9IikKaWYobCYmMj09PWwubGVuZ3RoKXt2YXIgaD1zKGxbMF0pLHU9cyhsWzFdKSxjPVtdCmlmKCJwcmVsb2FkIj09PWgpe2M9dS5zcGxpdCgiLCIpCmZvcih2YXIgZj0wLHA9Yy5sZW5ndGg7ZjxwO2YrKyl7dmFyIG09cyhjW2ZdKQp0LmltYWdlQ2FjaGUuYWRkKG0pfX1lbHNlIGlmKCJmb250Ij09PWgpe2M9dS5zcGxpdCgiLCIpCmZvcih2YXIgZz0wLGQ9Yy5sZW5ndGg7ZzxkO2crKyl7dmFyIHY9cyhjW2ddKSx5PS9eXHsoXGQqPylcfSQvLmV4ZWModikKUEZvbnQucHJlbG9hZGluZy5hZGQoeT9KU09OLnBhcnNlKCJ7IityW3lbMV1dKyJ9Iik6dil9fWVsc2UicGF1c2VPbkJsdXIiPT09aD90Lm9wdGlvbnMucGF1c2VPbkJsdXI9InRydWUiPT09dToiZ2xvYmFsS2V5RXZlbnRzIj09PWg/dC5vcHRpb25zLmdsb2JhbEtleUV2ZW50cz0idHJ1ZSI9PT11OiJwYXJhbS0iPT09aC5zdWJzdHJpbmcoMCw2KT90LnBhcmFtc1toLnN1YnN0cmluZyg2KV09dTp0Lm9wdGlvbnNbaF09dX19cmV0dXJuIGV9dmFyIG8sYT1uLmRlZmF1bHRTY29wZSxsPWEuUENvbnN0YW50cyxoPW4uYUZ1bmN0aW9ucyx1PW4uQnJvd3NlcixjPXUuZG9jdW1lbnQKdC5jb21waWxlPWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0LlNrZXRjaCxyPXMoZSxuKSxvPWkocikKcmV0dXJuIG4uc291cmNlQ29kZT1vLG59CnZhciBmPWUoIi4uL0hlbHBlcnMvUGpzQ29uc29sZSIpCnJldHVybiB0LmxvZ2dlcj1uZXcgZihjKSx0fX0seyIuLi9IZWxwZXJzL1Bqc0NvbnNvbGUiOjV9XSwyNzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXtyZXR1cm4gZSBpbiBsP2xbZV06ImZ1bmN0aW9uIj09dHlwZW9mIGxbdF0/bFt0XTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUKaWYoIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgdD1bXQpyZXR1cm4gdC5sZW5ndGg9ZSx0fX19dmFyIHI9ZS5kZWZhdWx0U2NvcGUsaT1lLmV4dGVuZCxzPWUuQnJvd3NlcixvPXMuYWpheCxhPXMubmF2aWdhdG9yLGw9cy53aW5kb3csaD0obC5YTUxIdHRwUmVxdWVzdCxzLmRvY3VtZW50KSx1PWUubm9vcCxjPXIuUENvbnN0YW50cwpQRm9udD1yLlBGb250LFBTaGFwZVNWRz1yLlBTaGFwZVNWRyxQVmVjdG9yPXIuUFZlY3RvcixDaGFyPUNoYXJhY3Rlcj1yLkNoYXIsT2JqZWN0SXRlcmF0b3I9ci5PYmplY3RJdGVyYXRvcixYTUxFbGVtZW50PXIuWE1MRWxlbWVudCxYTUw9ci5YTUwKdmFyIGYscD1sLkhUTUxDYW52YXNFbGVtZW50LG09bC5IVE1MSW1hZ2VFbGVtZW50CnRyeXtmPWwubG9jYWxTdG9yYWdlfWNhdGNoKGUpe2Y9e319ImRvY3VtZW50ImluIHRoaXMmJiEoImZha2UiaW4gdGhpcy5kb2N1bWVudCkKaC5oZWFkfHwoaC5oZWFkPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSkKdmFyIGc9bigiRmxvYXQzMkFycmF5IiwiV2ViR0xGbG9hdEFycmF5IiksZD1uKCJJbnQzMkFycmF5IiwiV2ViR0xJbnRBcnJheSIpLHY9bigiVWludDE2QXJyYXkiLCJXZWJHTFVuc2lnbmVkU2hvcnRBcnJheSIpLHk9bigiVWludDhBcnJheSIsIldlYkdMVW5zaWduZWRCeXRlQXJyYXkiKQppZihoLmRvY3VtZW50TW9kZT49OSYmIWguZG9jdHlwZSl0aHJvdyJUaGUgZG9jdHlwZSBkaXJlY3RpdmUgaXMgbWlzc2luZy4gVGhlIHJlY29tbWVuZGVkIGRvY3R5cGUgaW4gSW50ZXJuZXQgRXhwbG9yZXIgaXMgdGhlIEhUTUw1IGRvY3R5cGU6IDwhRE9DVFlQRSBodG1sPiIKdmFyIHg9W10sQT17fSxiPWZ1bmN0aW9uKGUpe2UuZXh0ZXJuYWxzLmNhbnZhcy5pZCE9PXQmJmUuZXh0ZXJuYWxzLmNhbnZhcy5pZC5sZW5ndGh8fChlLmV4dGVybmFscy5jYW52YXMuaWQ9Il9fcHJvY2Vzc2luZyIreC5sZW5ndGgpLEFbZS5leHRlcm5hbHMuY2FudmFzLmlkXT14Lmxlbmd0aCx4LnB1c2goZSl9LHc9ZnVuY3Rpb24oZSl7eC5zcGxpY2UoQVtlXSwxKSxkZWxldGUgQVtlXX0sRT10aGlzLlByb2Nlc3Npbmc9ZnVuY3Rpb24oZSxuLHMpe2Z1bmN0aW9uIHgoZSx0LG4pe2UuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKTplLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx5ZS5wdXNoKHtlbGVtOmUsdHlwZTp0LGZuOm59KX1mdW5jdGlvbiBBKGUpe3ZhciB0PWUuZWxlbSxuPWUudHlwZSxyPWUuZm4KdC5yZW1vdmVFdmVudExpc3RlbmVyP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIsITEpOnQuZGV0YWNoRXZlbnQmJnQuZGV0YWNoRXZlbnQoIm9uIituLHIpfWZ1bmN0aW9uIFMoZSx0KXtPYmplY3Qua2V5cyh5ZSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LmluZGV4T2Yobi50eXBlKT4tMSYmbi5lbGVtPT1lJiZBKG4udHlwZSl9KX1mdW5jdGlvbiBQKGUpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDEpfWZ1bmN0aW9uIEMoZSxuLHIsaSl7dmFyIHM9V3QubG9jYXRpb25zW2VdCnM9PT10JiYocz1BZS5nZXRVbmlmb3JtTG9jYXRpb24obixyKSxXdC5sb2NhdGlvbnNbZV09cyksbnVsbCE9PXMmJig0PT09aS5sZW5ndGg/QWUudW5pZm9ybTRmdihzLGkpOjM9PT1pLmxlbmd0aD9BZS51bmlmb3JtM2Z2KHMsaSk6Mj09PWkubGVuZ3RoP0FlLnVuaWZvcm0yZnYocyxpKTpBZS51bmlmb3JtMWYocyxpKSl9ZnVuY3Rpb24gTShlLG4scixpKXt2YXIgcz1XdC5sb2NhdGlvbnNbZV0Kcz09PXQmJihzPUFlLmdldFVuaWZvcm1Mb2NhdGlvbihuLHIpLFd0LmxvY2F0aW9uc1tlXT1zKSxudWxsIT09cyYmKDQ9PT1pLmxlbmd0aD9BZS51bmlmb3JtNGl2KHMsaSk6Mz09PWkubGVuZ3RoP0FlLnVuaWZvcm0zaXYocyxpKToyPT09aS5sZW5ndGg/QWUudW5pZm9ybTJpdihzLGkpOkFlLnVuaWZvcm0xaShzLGkpKX1mdW5jdGlvbiBUKGUsbixyLGkscyl7dmFyIG89V3QubG9jYXRpb25zW2VdCm89PT10JiYobz1BZS5nZXRVbmlmb3JtTG9jYXRpb24obixyKSxXdC5sb2NhdGlvbnNbZV09byksbyE9PS0xJiYoMTY9PT1zLmxlbmd0aD9BZS51bmlmb3JtTWF0cml4NGZ2KG8saSxzKTo5PT09cy5sZW5ndGg/QWUudW5pZm9ybU1hdHJpeDNmdihvLGkscyk6QWUudW5pZm9ybU1hdHJpeDJmdihvLGkscykpfWZ1bmN0aW9uIF8oZSxuLHIsaSxzKXt2YXIgbz1XdC5hdHRyaWJ1dGVzW2VdCm89PT10JiYobz1BZS5nZXRBdHRyaWJMb2NhdGlvbihuLHIpLFd0LmF0dHJpYnV0ZXNbZV09byksbyE9PS0xJiYoQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIscyksQWUudmVydGV4QXR0cmliUG9pbnRlcihvLGksQWUuRkxPQVQsITEsMCwwKSxBZS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShvKSl9ZnVuY3Rpb24gUihlLG4scil7dmFyIGk9V3QuYXR0cmlidXRlc1tlXQppPT09dCYmKGk9QWUuZ2V0QXR0cmliTG9jYXRpb24obixyKSxXdC5hdHRyaWJ1dGVzW2VdPWkpLGkhPT0tMSYmQWUuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpfWZ1bmN0aW9uIEwoZSx0LG4scil7dmFyIGkscyxvLGEKaWYoVXQ9PT1jLkhTQil7dmFyIGw9eGUuY29sb3IudG9SR0IoZSx0LG4pCmk9bFswXSxzPWxbMV0sbz1sWzJdfWVsc2UgaT1NYXRoLnJvdW5kKDI1NSooZS9CdCkpLHM9TWF0aC5yb3VuZCgyNTUqKHQvJHQpKSxvPU1hdGgucm91bmQoMjU1KihuL0d0KSkKcmV0dXJuIGE9TWF0aC5yb3VuZCgyNTUqKHIva3QpKSxpPWk8MD8wOmkscz1zPDA/MDpzLG89bzwwPzA6byxhPWE8MD8wOmEsaT1pPjI1NT8yNTU6aSxzPXM+MjU1PzI1NTpzLG89bz4yNTU/MjU1Om8sYT1hPjI1NT8yNTU6YSxhPDwyNCZjLkFMUEhBX01BU0t8aTw8MTYmYy5SRURfTUFTS3xzPDw4JmMuR1JFRU5fTUFTS3xvJmMuQkxVRV9NQVNLfWZ1bmN0aW9uIEkoZSx0KXt2YXIgbgpyZXR1cm4gZSZjLkFMUEhBX01BU0s/KG49TWF0aC5yb3VuZCgyNTUqKHQva3QpKSxuPW4+MjU1PzI1NTpuLG49bjwwPzA6bixlLShlJmMuQUxQSEFfTUFTSykrKG48PDI0JmMuQUxQSEFfTUFTSykpOlV0PT09Yy5SR0I/TChlLGUsZSx0KTpVdD09PWMuSFNCP0woMCwwLGUvQnQqR3QsdCk6dm9pZCAwfWZ1bmN0aW9uIEQoZSl7aWYoZTw9QnQmJmU+PTApe2lmKFV0PT09Yy5SR0IpcmV0dXJuIEwoZSxlLGUsa3QpCmlmKFV0PT09Yy5IU0IpcmV0dXJuIEwoMCwwLGUvQnQqR3Qsa3QpfWlmKGUpcmV0dXJuIGU+MjE0NzQ4MzY0NyYmKGUtPTQyOTQ5NjcyOTYpLGV9ZnVuY3Rpb24gTyhlKXt2YXIgdCxuLHIKdD0oKGUmYy5SRURfTUFTSyk+Pj4xNikvMjU1LG49KChlJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUscj0oZSZjLkJMVUVfTUFTSykvMjU1CnZhciBpLHMsbz14ZS5tYXgoeGUubWF4KHQsbiksciksYT14ZS5taW4oeGUubWluKHQsbikscikKcmV0dXJuIGE9PT1vP1swLDAsbypHdF06KHM9KG8tYSkvbyxpPXQ9PT1vPyhuLXIpLyhvLWEpOm49PT1vPzIrKHItdCkvKG8tYSk6NCsodC1uKS8oby1hKSxpLz02LGk8MD9pKz0xOmk+MSYmKGktPTEpLFtpKkJ0LHMqJHQsbypHdF0pfWZ1bmN0aW9uIE4oKXtBZS5zYXZlKCl9ZnVuY3Rpb24gRigpe0FlLnJlc3RvcmUoKSxtdD0hMCx1dD0hMH1mdW5jdGlvbiBrKCl7dmFyIGU9KERhdGUubm93KCktanQpLzFlMwpLdCsrCnZhciB0PUt0L2UKZT4uNSYmKGp0PURhdGUubm93KCksS3Q9MCx4ZS5fX2ZyYW1lUmF0ZT10KSx4ZS5mcmFtZUNvdW50Kyt9ZnVuY3Rpb24gQihlKXt2YXIgdD1wYXJzZUludCgiMHgiK2UsMTYpCnJldHVybiB0PjIxNDc0ODM2NDcmJih0LT00Mjk0OTY3Mjk2KSx0fWZ1bmN0aW9uICQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlPzAhPT1lOiJib29sZWFuIj09dHlwZW9mIGU/ZToic3RyaW5nIj09dHlwZW9mIGU/InRydWUiPT09ZS50b0xvd2VyQ2FzZSgpOmUgaW5zdGFuY2VvZiBDaGFyPzQ5PT09ZS5jb2RlfHw4ND09PWUuY29kZXx8MTE2PT09ZS5jb2RlOnZvaWQgMH1mdW5jdGlvbiBHKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lOiJib29sZWFuIj09dHlwZW9mIGU/ZT8xOjA6InN0cmluZyI9PXR5cGVvZiBlP3BhcnNlRmxvYXQoZSk6ZSBpbnN0YW5jZW9mIENoYXI/ZS5jb2RlOnZvaWQgMH1mdW5jdGlvbiBWKGUsdCl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiA0Mjk0OTY3Mjk1JmUKaWYoImJvb2xlYW4iPT10eXBlb2YgZSlyZXR1cm4gZT8xOjAKaWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgbj1wYXJzZUludChlLHR8fDEwKQpyZXR1cm4gNDI5NDk2NzI5NSZufXJldHVybiBlIGluc3RhbmNlb2YgQ2hhcj9lLmNvZGU6dm9pZCAwfWZ1bmN0aW9uIHooKXthdCYmKHV0JiYoQWUuZmlsbFN0eWxlPXhlLmNvbG9yLnRvU3RyaW5nKGh0KSx1dD0hMSksQWUuZmlsbCgpKX1mdW5jdGlvbiBVKCl7Y3QmJihtdCYmKEFlLnN0cm9rZVN0eWxlPXhlLmNvbG9yLnRvU3RyaW5nKHB0KSxtdD0hMSksQWUuc3Ryb2tlKCkpfWZ1bmN0aW9uIEgoKXt6KCksVSgpLEFlLmNsb3NlUGF0aCgpfWZ1bmN0aW9uIFgoZSxuLHIpe3ZhciBpPXdyLnNoaWZ0KCkKaT09PXQmJihpPXt9LGkuY2FudmFzPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaS5jb250ZXh0PWkuY2FudmFzLmdldENvbnRleHQoIjJkIikpLHdyLnB1c2goaSkKdmFyIHM9aS5jYW52YXMsbz1pLmNvbnRleHQsYT1ufHxlLndpZHRoLGw9cnx8ZS5oZWlnaHQKcmV0dXJuIHMud2lkdGg9YSxzLmhlaWdodD1sLGU/ImRhdGEiaW4gZT9vLnB1dEltYWdlRGF0YShlLDAsMCk6KG8uY2xlYXJSZWN0KDAsMCxhLGwpLG8uZHJhd0ltYWdlKGUsMCwwLGEsbCkpOm8uY2xlYXJSZWN0KDAsMCxhLGwpLGl9ZnVuY3Rpb24gWShlKXtyZXR1cm57Z2V0TGVuZ3RoOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKGUuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZ2V0IGxlbmd0aC4iCnJldHVybiBlLmltYWdlRGF0YS5kYXRhLmxlbmd0aD9lLmltYWdlRGF0YS5kYXRhLmxlbmd0aC80OjB9fShlKSxnZXRQaXhlbDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49NCp0LHI9ZS5pbWFnZURhdGEuZGF0YQppZihlLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGdldCBwaXhlbHMuIgpyZXR1cm4gcltuKzNdPDwyNCZjLkFMUEhBX01BU0t8cltuXTw8MTYmYy5SRURfTUFTS3xyW24rMV08PDgmYy5HUkVFTl9NQVNLfHJbbisyXSZjLkJMVUVfTUFTS319KGUpLHNldFBpeGVsOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3ZhciByPTQqdCxpPWUuaW1hZ2VEYXRhLmRhdGEKaWYoZS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBzZXQgcGl4ZWwuIgppW3IrMF09KG4mYy5SRURfTUFTSyk+Pj4xNixpW3IrMV09KG4mYy5HUkVFTl9NQVNLKT4+PjgsaVtyKzJdPW4mYy5CTFVFX01BU0ssaVtyKzNdPShuJmMuQUxQSEFfTUFTSyk+Pj4yNCxlLl9faXNEaXJ0eT0hMH19KGUpLHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9W10sbj1lLmltYWdlRGF0YS5kYXRhLHI9ZS53aWR0aCplLmhlaWdodAppZihlLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGdldCBwaXhlbHMuIgpmb3IodmFyIGk9MCxzPTA7aTxyO2krKyxzKz00KXQucHVzaChuW3MrM108PDI0JmMuQUxQSEFfTUFTS3xuW3NdPDwxNiZjLlJFRF9NQVNLfG5bcysxXTw8OCZjLkdSRUVOX01BU0t8bltzKzJdJmMuQkxVRV9NQVNLKQpyZXR1cm4gdH19KGUpLHNldDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG4scixpCmlmKHRoaXMuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3Qgc2V0IHBpeGVscy4iCnI9ZS5pbWFnZURhdGEuZGF0YQpmb3IodmFyIHM9MCxvPXQubGVuZ3RoO3M8bztzKyspaT10W3NdLG49NCpzLHJbbiswXT0oaSZjLlJFRF9NQVNLKT4+PjE2LHJbbisxXT0oaSZjLkdSRUVOX01BU0spPj4+OCxyW24rMl09aSZjLkJMVUVfTUFTSyxyW24rM109KGkmYy5BTFBIQV9NQVNLKT4+PjI0CmUuX19pc0RpcnR5PSEwfX0oZSl9fWZ1bmN0aW9uIGooZSx0KXt2YXIgbgppZihlPj14ZS53aWR0aHx8ZTwwfHx0PDB8fHQ+PXhlLmhlaWdodClyZXR1cm4gMAppZih1bil7dmFyIHI9NCooKDB8ZSkreGUud2lkdGgqKDB8dCkpCnJldHVybiBuPXhlLmltYWdlRGF0YS5kYXRhLG5bciszXTw8MjQmYy5BTFBIQV9NQVNLfG5bcl08PDE2JmMuUkVEX01BU0t8bltyKzFdPDw4JmMuR1JFRU5fTUFTS3xuW3IrMl0mYy5CTFVFX01BU0t9cmV0dXJuIG49eGUudG9JbWFnZURhdGEoMHxlLDB8dCwxLDEpLmRhdGEsblszXTw8MjQmYy5BTFBIQV9NQVNLfG5bMF08PDE2JmMuUkVEX01BU0t8blsxXTw8OCZjLkdSRUVOX01BU0t8blsyXSZjLkJMVUVfTUFTS31mdW5jdGlvbiBLKGUsdCxuKXtpZihuLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGdldCB4LHkuIgp2YXIgcj10Km4ud2lkdGgqNCs0KmUsaT1uLmltYWdlRGF0YS5kYXRhCnJldHVybiBpW3IrM108PDI0JmMuQUxQSEFfTUFTS3xpW3JdPDwxNiZjLlJFRF9NQVNLfGlbcisxXTw8OCZjLkdSRUVOX01BU0t8aVtyKzJdJmMuQkxVRV9NQVNLfWZ1bmN0aW9uIFcoZSx0LG4scil7dmFyIGk9bmV3IEVyKG4scixjLkFSR0IpCnJldHVybiBpLmZyb21JbWFnZURhdGEoeGUudG9JbWFnZURhdGEoZSx0LG4scikpLGl9ZnVuY3Rpb24gWihlLHQsbixyLGkpe2lmKGkuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZ2V0IHgseSx3LGguIgpmb3IodmFyIHM9bmV3IEVyKG4scixjLkFSR0IpLG89cy5pbWFnZURhdGEuZGF0YSxhPWkud2lkdGgsbD1pLmhlaWdodCxoPWkuaW1hZ2VEYXRhLmRhdGEsdT1NYXRoLm1heCgwLC10KSxmPU1hdGgubWF4KDAsLWUpLHA9TWF0aC5taW4ocixsLXQpLG09TWF0aC5taW4obixhLWUpLGc9dTtnPHA7KytnKWZvcih2YXIgZD00KigodCtnKSphKyhlK2YpKSx2PTQqKGcqbitmKSx5PWY7eTxtOysreSlvW3YrK109aFtkKytdLG9bdisrXT1oW2QrK10sb1t2KytdPWhbZCsrXSxvW3YrK109aFtkKytdCnJldHVybiBzLl9faXNEaXJ0eT0hMCxzfWZ1bmN0aW9uIHEoKXt1biYmKEFlPVplLHVuPSExLHhlLnVwZGF0ZVBpeGVscygpKX1mdW5jdGlvbiBRKCl7ZnVuY3Rpb24gZShlLHQpe2Z1bmN0aW9uIG4oKXtxKCksQWVbdF0uYXBwbHkoQWUsYXJndW1lbnRzKX1lW3RdPW59ZnVuY3Rpb24gdChlLHQpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gcSgpLEFlW3RdfWZ1bmN0aW9uIHIoZSl7cSgpLEFlW3RdPWV9eGUuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6bixzZXQ6cn0pfWZvcih2YXIgbiBpbiBBZSkiZnVuY3Rpb24iPT10eXBlb2YgQWVbbl0/ZSh0aGlzLG4pOnQodGhpcyxuKX1mdW5jdGlvbiBKKCl7dW58fCh4ZS5sb2FkUGl4ZWxzKCksbnVsbD09PWhuJiYoWmU9QWUsaG49bmV3IFEpLHVuPSEwLEFlPWhuLHFlPTApfWZ1bmN0aW9uIGVlKGUsdCxuKXtlPHhlLndpZHRoJiZlPj0wJiZ0Pj0wJiZ0PHhlLmhlaWdodCYmKEooKSx4ZS5waXhlbHMuc2V0UGl4ZWwoKDB8ZSkreGUud2lkdGgqKDB8dCksbiksKytxZT5jbiYmcSgpKX1mdW5jdGlvbiB0ZShlLHQsbixyKXtpZihyLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IHNldCB4LHkuIgp2YXIgaT14ZS5jb2xvci50b0FycmF5KG4pLHM9dCpyLndpZHRoKjQrNCplLG89ci5pbWFnZURhdGEuZGF0YQpvW3NdPWlbMF0sb1tzKzFdPWlbMV0sb1tzKzJdPWlbMl0sb1tzKzNdPWlbM119ZnVuY3Rpb24gbmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBTdHJpbmc/ZToibnVtYmVyIj09dHlwZW9mIGU/ZT09PSgwfGUpP2UudG9TdHJpbmcoKTp4ZS5uZihlLDAsMyk6bnVsbD09PWV8fGU9PT10PyIiOmUudG9TdHJpbmcoKX1mdW5jdGlvbiByZShlLHQsbixyKXt2YXIgaSxzCmUuaW5kZXhPZigiXG4iKTwwPyhpPVtlXSxzPTEpOihpPWUuc3BsaXQoL1xyP1xuL2cpLHM9aS5sZW5ndGgpCnZhciBvPTAKZW49PT1jLlRPUD9vPXNuK29uOmVuPT09Yy5DRU5URVI/bz1zbi8yLShzLTEpKmFuLzI6ZW49PT1jLkJPVFRPTSYmKG89LShvbisocy0xKSphbikpCmZvcih2YXIgYT0wO2E8czsrK2Epe3ZhciBsPWlbYV0Kd2UudGV4dCRsaW5lKGwsdCxuK28scixKdCksbys9YW59fWZ1bmN0aW9uIGllKGUsdCxuLHIsaSxzKXtpZigwIT09ZS5sZW5ndGgmJjAhPT1yJiYwIT09aSYmIShybj5pKSl7Zm9yKHZhciBvPS0xLGE9MCxsPTAsaD1bXSx1PTAsZj1lLmxlbmd0aDt1PGY7dSsrKXt2YXIgcD1lW3VdLG09IiAiPT09cCxnPWxuLm1lYXN1cmVUZXh0V2lkdGgocCkKaWYoIlxuIiE9PXAmJmwrZzw9ciltJiYobz11KSxsKz1nCmVsc2V7aWYobysxPT09YSl7aWYoISh1PjApKXJldHVybgpvPXV9IlxuIj09PXA/KGgucHVzaCh7dGV4dDplLnN1YnN0cmluZyhhLHUpLHdpZHRoOmx9KSxhPXUrMSk6KGgucHVzaCh7dGV4dDplLnN1YnN0cmluZyhhLG8rMSksd2lkdGg6bH0pLGE9bysxKSxsPTAsdT1hLTF9fWE8ZiYmaC5wdXNoKHt0ZXh0OmUuc3Vic3RyaW5nKGEpLHdpZHRoOmx9KQp2YXIgZD0xLHY9c24KSnQ9PT1jLkNFTlRFUj9kPXIvMjpKdD09PWMuUklHSFQmJihkPXIpCnZhciB5PWgubGVuZ3RoLHg9TWF0aC5taW4oeSxNYXRoLmZsb29yKGkvYW4pKQplbj09PWMuVE9QP3Y9c24rb246ZW49PT1jLkNFTlRFUj92PWkvMi1hbiooeC8yLTEpOmVuPT09Yy5CT1RUT00mJih2PW9uK2FuKQp2YXIgQSxiLHcKZm9yKEE9MDtBPHkmJih3PUEqYW4sISh2K3c+aS1vbikpO0ErKyliPWhbQV0sd2UudGV4dCRsaW5lKGIudGV4dCx0K2Qsbit2K3cscyxKdCl9fWZ1bmN0aW9uIHNlKGUpe3dlPSIzRCI9PT1lP25ldyBzcjoiMkQiPT09ZT9uZXcgaXI6bmV3IG9yCmZvcih2YXIgdCBpbiBvci5wcm90b3R5cGUpb3IucHJvdG90eXBlLmhhc093blByb3BlcnR5KHQpJiZ0LmluZGV4T2YoIiQiKTwwJiYoeGVbdF09d2VbdF0pCndlLiRpbml0KCl9ZnVuY3Rpb24gb2UoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHNlKCIyRCIpLHdlW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYWUoZSl7dmFyIHQ9ZS53aGljaHx8ZS5rZXlDb2RlCnN3aXRjaCh0KXtjYXNlIDEzOnJldHVybiAxMApjYXNlIDkxOmNhc2UgOTM6Y2FzZSAyMjQ6cmV0dXJuIDE1NwpjYXNlIDU3MzkyOnJldHVybiAxNwpjYXNlIDQ2OnJldHVybiAxMjcKY2FzZSA0NTpyZXR1cm4gMTU1fXJldHVybiB0fWZ1bmN0aW9uIGxlKGUpe3ZhciB0PWUud2hpY2h8fGUua2V5Q29kZSxuPWUuc2hpZnRLZXl8fGUuY3RybEtleXx8ZS5hbHRLZXl8fGUubWV0YUtleQpzd2l0Y2godCl7Y2FzZSAxMzp0PW4/MTM6MTAKYnJlYWsKY2FzZSA4OnQ9bj8xMjc6OH1yZXR1cm4gbmV3IENoYXIodCl9ZnVuY3Rpb24gaGUoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0b3BQcm9wYWdhdGlvbiYmZS5zdG9wUHJvcGFnYXRpb24oKSwhMX1mdW5jdGlvbiB1ZSgpe3ZhciBlCmZvcihlIGluIGZuKWlmKGZuLmhhc093blByb3BlcnR5KGUpKXJldHVybiB2b2lkKHhlLl9fa2V5UHJlc3NlZD0hMCkKeGUuX19rZXlQcmVzc2VkPSExfWZ1bmN0aW9uIGNlKCl7eGUuX19rZXlQcmVzc2VkPSExLGZuPVtdLHBuPW51bGx9ZnVuY3Rpb24gZmUoZSx0KXtmbltlXT10LHBuPW51bGwseGUua2V5PXQseGUua2V5Q29kZT1lLHhlLmtleVByZXNzZWQoKSx4ZS5rZXlDb2RlPTAseGUua2V5VHlwZWQoKSx1ZSgpfWZ1bmN0aW9uIHBlKGUpe3ZhciB0PWFlKGUpCmlmKHQ9PT1jLkRFTEVURSlyZXR1cm4gdm9pZCBmZSh0LG5ldyBDaGFyKDEyNykpCmlmKG1uLmluZGV4T2YodCk8MClyZXR1cm4gdm9pZChwbj10KQp2YXIgbj1uZXcgQ2hhcihjLkNPREVEKQpyZXR1cm4geGUua2V5PW4seGUua2V5Q29kZT10LGZuW3RdPW4seGUua2V5UHJlc3NlZCgpLHBuPW51bGwsdWUoKSxoZShlKX1mdW5jdGlvbiBtZShlKXtpZihudWxsIT09cG4pe3ZhciB0PXBuLG49bGUoZSkKcmV0dXJuIGZlKHQsbiksaGUoZSl9fWZ1bmN0aW9uIGdlKGUpe3ZhciBuPWFlKGUpLHI9Zm5bbl0KciE9PXQmJih4ZS5rZXk9cix4ZS5rZXlDb2RlPW4seGUua2V5UmVsZWFzZWQoKSxkZWxldGUgZm5bbl0sdWUoKSl9aWYoISh0aGlzIGluc3RhbmNlb2YgRSkpdGhyb3ciY2FsbGVkIFByb2Nlc3NpbmcgY29uc3RydWN0b3IgYXMgaWYgaXQgd2VyZSBhIGZ1bmN0aW9uOiBtaXNzaW5nICduZXcnLiIKdmFyIGRlPXt9LHZlPWU9PT10JiZuPT09dAppZihkZT12ZT9oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOiJzdHJpbmciPT10eXBlb2YgZT9oLmdldEVsZW1lbnRCeUlkKGUpOmUsISgiZ2V0Q29udGV4dCJpbiBkZSkpdGhyb3ciY2FsbGVkIFByb2Nlc3NpbmcgY29uc3RydWN0b3Igd2l0aG91dCBwYXNzaW5nIGNhbnZhcyBlbGVtZW50IHJlZmVyZW5jZSBvciBpZC4iCnZhciB5ZT1bXSx4ZT10aGlzCnhlLkNoYXI9eGUuQ2hhcmFjdGVyPUNoYXIseWU9W10saS53aXRoQ29tbW9uRnVuY3Rpb25zKHhlKSxpLndpdGhNYXRoKHhlKSxpLndpdGhQcm94eUZ1bmN0aW9ucyh4ZSxQKSxpLndpdGhUb3VjaCh4ZSxkZSx4LFMsaCxjKSxzJiZPYmplY3Qua2V5cyhzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3hlW2VdPXNbZV19KSx4ZS5leHRlcm5hbHM9e2NhbnZhczpkZSxjb250ZXh0OnQsc2tldGNoOnQsd2luZG93Omx9LHhlLm5hbWU9IlByb2Nlc3NpbmcuanMgSW5zdGFuY2UiLHhlLnVzZTNEQ29udGV4dD0hMSx4ZS5mb2N1c2VkPSExLHhlLmJyZWFrU2hhcGU9ITEseGUuZ2x5cGhUYWJsZT17fSx4ZS5wbW91c2VYPTAseGUucG1vdXNlWT0wLHhlLm1vdXNlWD0wLHhlLm1vdXNlWT0wLHhlLm1vdXNlQnV0dG9uPTAseGUubW91c2VTY3JvbGw9MCx4ZS5tb3VzZUNsaWNrZWQ9dCx4ZS5tb3VzZURyYWdnZWQ9dCx4ZS5tb3VzZU1vdmVkPXQseGUubW91c2VQcmVzc2VkPXQseGUubW91c2VSZWxlYXNlZD10LHhlLm1vdXNlU2Nyb2xsZWQ9dCx4ZS5tb3VzZU92ZXI9dCx4ZS5tb3VzZU91dD10LHhlLnRvdWNoU3RhcnQ9dCx4ZS50b3VjaEVuZD10LHhlLnRvdWNoTW92ZT10LHhlLnRvdWNoQ2FuY2VsPXQseGUua2V5PXQseGUua2V5Q29kZT10LHhlLmtleVByZXNzZWQ9dSx4ZS5rZXlSZWxlYXNlZD11LHhlLmtleVR5cGVkPXUseGUuZHJhdz10LHhlLnNldHVwPXQseGUuX19tb3VzZVByZXNzZWQ9ITEseGUuX19rZXlQcmVzc2VkPSExLHhlLl9fZnJhbWVSYXRlPTYwLHhlLmZyYW1lQ291bnQ9MCx4ZS53aWR0aD0xMDAseGUuaGVpZ2h0PTEwMAp2YXIgQWUsYmUsd2UsRWUsU2UsUGUsQ2UsTWUsVGUsX2UsUmUsTGUsSWUsRGUsT2UsTmUsRmUsa2UsQmUsJGUsR2UsVmUsemUsVWUsSGUsWGUsWWUsamUsS2UsV2UsWmUscWUsUWUsSmUsZXQsdHQsbnQscnQsaXQsc3Qsb3QsYXQ9ITAsbHQ9WzEsMSwxLDFdLGh0PTQyOTQ5NjcyOTUsdXQ9ITAsY3Q9ITAsZnQ9WzAsMCwwLDFdLHB0PTQyNzgxOTAwODAsbXQ9ITAsZ3Q9MSxkdD0hMSx2dD0hMSx5dD0hMCx4dD0wLEF0PWMuQ09STkVSLGJ0PWMuQ0VOVEVSLHd0PTAsRXQ9MCxTdD0wLFB0PWMuTk9STUFMX01PREVfQVVUTyxDdD02MCxNdD0xZTMvQ3QsVHQ9Yy5BUlJPVyxfdD1kZS5zdHlsZS5jdXJzb3IsUnQ9Yy5QT0xZR09OLEx0PVtdLEl0PTAsRHQ9MjAsT3Q9ITEsTnQ9LTMzNTU0NDQsRnQ9MjAsa3Q9MjU1LEJ0PTI1NSwkdD0yNTUsR3Q9MjU1LFZ0PTAsenQ9MCxVdD1jLlJHQixIdD1udWxsLFh0PW51bGwsWXQ9RGF0ZS5ub3coKSxqdD1ZdCxLdD0wLFd0PXthdHRyaWJ1dGVzOnt9LGxvY2F0aW9uczp7fX0sWnQ9e3dpZHRoOjAsaGVpZ2h0OjB9LHF0PWMuSU1BR0UsUXQ9ITEsSnQ9Yy5MRUZULGVuPWMuQkFTRUxJTkUsdG49Yy5NT0RFTCxubj0iQXJpYWwiLHJuPTEyLHNuPTksb249Mixhbj0xNCxsbj1QRm9udC5nZXQobm4scm4pLGhuPW51bGwsdW49ITEsY249MWUzLGZuPVtdLHBuPW51bGwsbW49W2MuU0hJRlQsYy5DT05UUk9MLGMuQUxULGMuQ0FQU0xLLGMuUEdVUCxjLlBHRE4sYy5FTkQsYy5IT01FLGMuTEVGVCxjLlVQLGMuUklHSFQsYy5ET1dOLGMuTlVNTEssYy5JTlNFUlQsYy5GMSxjLkYyLGMuRjMsYy5GNCxjLkY1LGMuRjYsYy5GNyxjLkY4LGMuRjksYy5GMTAsYy5GMTEsYy5GMTIsYy5NRVRBXSxnbj0wLGRuPTAsdm49MCx5bj1bXSx4bj1bXSxBbj1bXSxibj1uZXcgZyhjLlNJTkNPU19MRU5HVEgpLHduPW5ldyBnKGMuU0lOQ09TX0xFTkdUSCksRW49ITEsU249ITEsUG49NjAqKE1hdGguUEkvMTgwKSxDbj14ZS53aWR0aC8yLE1uPXhlLmhlaWdodC8yLFRuPU1uL01hdGgudGFuKFBuLzIpLF9uPVRuLzEwLFJuPTEwKlRuLExuPXhlLndpZHRoL3hlLmhlaWdodCxJbj1bXSxEbj1bXSxPbj0wLE5uPSExLEZuPSExLGtuPSEwLEJuPWMuQ09STkVSLCRuPVtdLEduPW5ldyBnKFsuNSwuNSwtLjUsLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLjUsLS41LC41LC41LC0uNSwuNSwuNSwuNSwtLjUsLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC41LC0uNSwuNSwuNSwuNSwuNSwuNSwuNSwtLjUsLjUsLjUsLjUsLjUsLS41LC41LC41LC0uNSwuNSwuNSwtLjUsLS41LC41LC41LC0uNSwuNSwtLjUsLS41LC41LC0uNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwtLjUsLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC41LC0uNSwuNSwuNSwtLjUsLjUsLjUsLS41LC41LC0uNSwtLjUsLS41LC0uNSwuNSwuNSwuNSwuNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwuNSwuNSwuNSwuNV0pLFZuPW5ldyBnKFsuNSwuNSwuNSwuNSwtLjUsLjUsLjUsLjUsLS41LC41LC0uNSwtLjUsLS41LC41LC0uNSwtLjUsLS41LC0uNSwtLjUsLjUsLjUsLS41LC0uNSwuNSwuNSwuNSwuNSwuNSwuNSwtLjUsLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLjUsLS41LC41LC41LC41LC41LC41LC41LC0uNSwuNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC41LC0uNSwuNV0pLHpuPW5ldyBnKFswLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMF0pLFVuPW5ldyBnKFswLDAsMCwwLDEsMCwxLDEsMCwxLDAsMF0pLEhuPW5ldyBnKFswLDAsMSwwLDAsMSwwLDAsMSwwLDAsMV0pLFhuPSJ2YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7YXR0cmlidXRlIHZlYzMgYVZlcnRleDthdHRyaWJ1dGUgdmVjNCBhQ29sb3I7dW5pZm9ybSBtYXQ0IHVWaWV3O3VuaWZvcm0gbWF0NCB1UHJvamVjdGlvbjt1bmlmb3JtIGZsb2F0IHVQb2ludFNpemU7dm9pZCBtYWluKHZvaWQpIHsgIHZGcm9udENvbG9yID0gYUNvbG9yOyAgZ2xfUG9pbnRTaXplID0gdVBvaW50U2l6ZTsgIGdsX1Bvc2l0aW9uID0gdVByb2plY3Rpb24gKiB1VmlldyAqIHZlYzQoYVZlcnRleCwgMS4wKTt9IixZbj0iI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZW5kaWZcbnZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjt1bmlmb3JtIGJvb2wgdVNtb290aDt2b2lkIG1haW4odm9pZCl7ICBpZih1U21vb3RoID09IHRydWUpeyAgICBmbG9hdCBkaXN0ID0gZGlzdGFuY2UoZ2xfUG9pbnRDb29yZCwgdmVjMigwLjUpKTsgICAgaWYoZGlzdCA+IDAuNSl7ICAgICAgZGlzY2FyZDsgICAgfSAgfSAgZ2xfRnJhZ0NvbG9yID0gdkZyb250Q29sb3I7fSIsam49InZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjthdHRyaWJ1dGUgdmVjMyBhVmVydGV4O2F0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7dW5pZm9ybSB2ZWM0IHVDb2xvcjt1bmlmb3JtIG1hdDQgdU1vZGVsO3VuaWZvcm0gbWF0NCB1Vmlldzt1bmlmb3JtIG1hdDQgdVByb2plY3Rpb247dW5pZm9ybSBmbG9hdCB1UG9pbnRTaXplO3ZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO3ZvaWQgbWFpbih2b2lkKSB7ICBnbF9Qb2ludFNpemUgPSB1UG9pbnRTaXplOyAgdkZyb250Q29sb3IgPSB1Q29sb3I7ICBnbF9Qb3NpdGlvbiA9IHVQcm9qZWN0aW9uICogdVZpZXcgKiB1TW9kZWwgKiB2ZWM0KGFWZXJ0ZXgsIDEuMCk7ICB2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDt9IixLbj0iI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZW5kaWZcbnZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjt2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDt1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjt1bmlmb3JtIGludCB1SXNEcmF3aW5nVGV4dDt1bmlmb3JtIGJvb2wgdVNtb290aDt2b2lkIG1haW4odm9pZCl7ICBpZih1U21vb3RoID09IHRydWUpeyAgICBmbG9hdCBkaXN0ID0gZGlzdGFuY2UoZ2xfUG9pbnRDb29yZCwgdmVjMigwLjUpKTsgICAgaWYoZGlzdCA+IDAuNSl7ICAgICAgZGlzY2FyZDsgICAgfSAgfSAgaWYodUlzRHJhd2luZ1RleHQgPT0gMSl7ICAgIGZsb2F0IGFscGhhID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKS5hOyAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZGcm9udENvbG9yLnJnYiAqIGFscGhhLCBhbHBoYSk7ICB9ICBlbHNleyAgICBnbF9GcmFnQ29sb3IgPSB2RnJvbnRDb2xvcjsgIH19IixXbj0vV2luZG93cy8udGVzdChhLnVzZXJBZ2VudCksWm49InZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjthdHRyaWJ1dGUgdmVjMyBhVmVydGV4O2F0dHJpYnV0ZSB2ZWMzIGFOb3JtYWw7YXR0cmlidXRlIHZlYzQgYUNvbG9yO2F0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlO3ZhcnlpbmcgICB2ZWMyIHZUZXh0dXJlO3VuaWZvcm0gdmVjNCB1Q29sb3I7dW5pZm9ybSBib29sIHVVc2luZ01hdDt1bmlmb3JtIHZlYzMgdVNwZWN1bGFyO3VuaWZvcm0gdmVjMyB1TWF0ZXJpYWxFbWlzc2l2ZTt1bmlmb3JtIHZlYzMgdU1hdGVyaWFsQW1iaWVudDt1bmlmb3JtIHZlYzMgdU1hdGVyaWFsU3BlY3VsYXI7dW5pZm9ybSBmbG9hdCB1U2hpbmluZXNzO3VuaWZvcm0gbWF0NCB1TW9kZWw7dW5pZm9ybSBtYXQ0IHVWaWV3O3VuaWZvcm0gbWF0NCB1UHJvamVjdGlvbjt1bmlmb3JtIG1hdDQgdU5vcm1hbFRyYW5zZm9ybTt1bmlmb3JtIGludCB1TGlnaHRDb3VudDt1bmlmb3JtIHZlYzMgdUZhbGxvZmY7c3RydWN0IExpZ2h0IHsgIGludCB0eXBlOyAgdmVjMyBjb2xvcjsgIHZlYzMgcG9zaXRpb247ICB2ZWMzIGRpcmVjdGlvbjsgIGZsb2F0IGFuZ2xlOyAgdmVjMyBoYWxmVmVjdG9yOyAgZmxvYXQgY29uY2VudHJhdGlvbjt9O3VuaWZvcm0gTGlnaHQgdUxpZ2h0czA7dW5pZm9ybSBMaWdodCB1TGlnaHRzMTt1bmlmb3JtIExpZ2h0IHVMaWdodHMyO3VuaWZvcm0gTGlnaHQgdUxpZ2h0czM7dW5pZm9ybSBMaWdodCB1TGlnaHRzNDt1bmlmb3JtIExpZ2h0IHVMaWdodHM1O3VuaWZvcm0gTGlnaHQgdUxpZ2h0czY7dW5pZm9ybSBMaWdodCB1TGlnaHRzNztMaWdodCBnZXRMaWdodChpbnQgaW5kZXgpeyAgaWYoaW5kZXggPT0gMCkgcmV0dXJuIHVMaWdodHMwOyAgaWYoaW5kZXggPT0gMSkgcmV0dXJuIHVMaWdodHMxOyAgaWYoaW5kZXggPT0gMikgcmV0dXJuIHVMaWdodHMyOyAgaWYoaW5kZXggPT0gMykgcmV0dXJuIHVMaWdodHMzOyAgaWYoaW5kZXggPT0gNCkgcmV0dXJuIHVMaWdodHM0OyAgaWYoaW5kZXggPT0gNSkgcmV0dXJuIHVMaWdodHM1OyAgaWYoaW5kZXggPT0gNikgcmV0dXJuIHVMaWdodHM2OyAgcmV0dXJuIHVMaWdodHM3O312b2lkIEFtYmllbnRMaWdodCggaW5vdXQgdmVjMyB0b3RhbEFtYmllbnQsIGluIHZlYzMgZWNQb3MsIGluIExpZ2h0IGxpZ2h0ICkgeyAgZmxvYXQgZCA9IGxlbmd0aCggbGlnaHQucG9zaXRpb24gLSBlY1BvcyApOyAgZmxvYXQgYXR0ZW51YXRpb24gPSAxLjAgLyAoIHVGYWxsb2ZmWzBdICsgKCB1RmFsbG9mZlsxXSAqIGQgKSArICggdUZhbGxvZmZbMl0gKiBkICogZCApKTsgIHRvdGFsQW1iaWVudCArPSBsaWdodC5jb2xvciAqIGF0dGVudWF0aW9uO312b2lkIERpcmVjdGlvbmFsTGlnaHQoIGlub3V0IHZlYzMgY29sLCBpbm91dCB2ZWMzIHNwZWMsIGluIHZlYzMgdmVydE5vcm1hbCwgaW4gdmVjMyBlY1BvcywgaW4gTGlnaHQgbGlnaHQgKSB7ICBmbG9hdCBwb3dlckZhY3RvciA9IDAuMDsgIGZsb2F0IG5Eb3RWUCA9IG1heCgwLjAsIGRvdCggdmVydE5vcm1hbCwgbm9ybWFsaXplKC1saWdodC5wb3NpdGlvbikgKSk7ICBmbG9hdCBuRG90VkggPSBtYXgoMC4wLCBkb3QoIHZlcnROb3JtYWwsIG5vcm1hbGl6ZSgtbGlnaHQucG9zaXRpb24tbm9ybWFsaXplKGVjUG9zKSApKSk7ICBpZiggbkRvdFZQICE9IDAuMCApeyAgICBwb3dlckZhY3RvciA9IHBvdyggbkRvdFZILCB1U2hpbmluZXNzICk7ICB9ICBjb2wgKz0gbGlnaHQuY29sb3IgKiBuRG90VlA7ICBzcGVjICs9IHVTcGVjdWxhciAqIHBvd2VyRmFjdG9yO312b2lkIFBvaW50TGlnaHQoIGlub3V0IHZlYzMgY29sLCBpbm91dCB2ZWMzIHNwZWMsIGluIHZlYzMgdmVydE5vcm1hbCwgaW4gdmVjMyBlY1BvcywgaW4gTGlnaHQgbGlnaHQgKSB7ICBmbG9hdCBwb3dlckZhY3RvcjsgICB2ZWMzIFZQID0gbGlnaHQucG9zaXRpb24gLSBlY1BvczsgIGZsb2F0IGQgPSBsZW5ndGgoIFZQICk7ICAgVlAgPSBub3JtYWxpemUoIFZQICk7ICBmbG9hdCBhdHRlbnVhdGlvbiA9IDEuMCAvICggdUZhbGxvZmZbMF0gKyAoIHVGYWxsb2ZmWzFdICogZCApICsgKCB1RmFsbG9mZlsyXSAqIGQgKiBkICkpOyAgZmxvYXQgbkRvdFZQID0gbWF4KCAwLjAsIGRvdCggdmVydE5vcm1hbCwgVlAgKSk7ICB2ZWMzIGhhbGZWZWN0b3IgPSBub3JtYWxpemUoIFZQIC0gbm9ybWFsaXplKGVjUG9zKSApOyAgZmxvYXQgbkRvdEhWID0gbWF4KCAwLjAsIGRvdCggdmVydE5vcm1hbCwgaGFsZlZlY3RvciApKTsgIGlmKCBuRG90VlAgPT0gMC4wICkgeyAgICBwb3dlckZhY3RvciA9IDAuMDsgIH0gIGVsc2UgeyAgICBwb3dlckZhY3RvciA9IHBvdyggbkRvdEhWLCB1U2hpbmluZXNzICk7ICB9ICBzcGVjICs9IHVTcGVjdWxhciAqIHBvd2VyRmFjdG9yICogYXR0ZW51YXRpb247ICBjb2wgKz0gbGlnaHQuY29sb3IgKiBuRG90VlAgKiBhdHRlbnVhdGlvbjt9dm9pZCBTcG90TGlnaHQoIGlub3V0IHZlYzMgY29sLCBpbm91dCB2ZWMzIHNwZWMsIGluIHZlYzMgdmVydE5vcm1hbCwgaW4gdmVjMyBlY1BvcywgaW4gTGlnaHQgbGlnaHQgKSB7ICBmbG9hdCBzcG90QXR0ZW51YXRpb247ICBmbG9hdCBwb3dlckZhY3RvciA9IDAuMDsgIHZlYzMgVlAgPSBsaWdodC5wb3NpdGlvbiAtIGVjUG9zOyAgdmVjMyBsZGlyID0gbm9ybWFsaXplKCAtbGlnaHQuZGlyZWN0aW9uICk7ICBmbG9hdCBkID0gbGVuZ3RoKCBWUCApOyAgVlAgPSBub3JtYWxpemUoIFZQICk7ICBmbG9hdCBhdHRlbnVhdGlvbiA9IDEuMCAvICggdUZhbGxvZmZbMF0gKyAoIHVGYWxsb2ZmWzFdICogZCApICsgKCB1RmFsbG9mZlsyXSAqIGQgKiBkICkgKTsgIGZsb2F0IHNwb3REb3QgPSBkb3QoIFZQLCBsZGlyICk7IisoV24/IiAgc3BvdEF0dGVudWF0aW9uID0gMS4wOyAiOiIgIGlmKCBzcG90RG90ID4gY29zKCBsaWdodC5hbmdsZSApICkgeyAgICBzcG90QXR0ZW51YXRpb24gPSBwb3coIHNwb3REb3QsIGxpZ2h0LmNvbmNlbnRyYXRpb24gKTsgIH0gIGVsc2V7ICAgIHNwb3RBdHRlbnVhdGlvbiA9IDAuMDsgIH0gIGF0dGVudWF0aW9uICo9IHNwb3RBdHRlbnVhdGlvbjsiKSsiICBmbG9hdCBuRG90VlAgPSBtYXgoIDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBWUCApICk7ICB2ZWMzIGhhbGZWZWN0b3IgPSBub3JtYWxpemUoIFZQIC0gbm9ybWFsaXplKGVjUG9zKSApOyAgZmxvYXQgbkRvdEhWID0gbWF4KCAwLjAsIGRvdCggdmVydE5vcm1hbCwgaGFsZlZlY3RvciApICk7ICBpZiggbkRvdFZQICE9IDAuMCApIHsgICAgcG93ZXJGYWN0b3IgPSBwb3coIG5Eb3RIViwgdVNoaW5pbmVzcyApOyAgfSAgc3BlYyArPSB1U3BlY3VsYXIgKiBwb3dlckZhY3RvciAqIGF0dGVudWF0aW9uOyAgY29sICs9IGxpZ2h0LmNvbG9yICogbkRvdFZQICogYXR0ZW51YXRpb247fXZvaWQgbWFpbih2b2lkKSB7ICB2ZWMzIGZpbmFsQW1iaWVudCA9IHZlYzMoIDAuMCApOyAgdmVjMyBmaW5hbERpZmZ1c2UgPSB2ZWMzKCAwLjAgKTsgIHZlYzMgZmluYWxTcGVjdWxhciA9IHZlYzMoIDAuMCApOyAgdmVjNCBjb2wgPSB1Q29sb3I7ICBpZiAoIHVDb2xvclswXSA9PSAtMS4wICl7ICAgIGNvbCA9IGFDb2xvcjsgIH0gIHZlYzMgbm9ybSA9IG5vcm1hbGl6ZSh2ZWMzKCB1Tm9ybWFsVHJhbnNmb3JtICogdmVjNCggYU5vcm1hbCwgMC4wICkgKSk7ICB2ZWM0IGVjUG9zNCA9IHVWaWV3ICogdU1vZGVsICogdmVjNChhVmVydGV4LCAxLjApOyAgdmVjMyBlY1BvcyA9ICh2ZWMzKGVjUG9zNCkpL2VjUG9zNC53OyAgaWYoIHVMaWdodENvdW50ID09IDAgKSB7ICAgIHZGcm9udENvbG9yID0gY29sICsgdmVjNCh1TWF0ZXJpYWxTcGVjdWxhciwgMS4wKTsgIH0gIGVsc2UgeyAgICBmb3IoIGludCBpID0gMDsgaSA8IDg7IGkrKyApIHsgICAgICBMaWdodCBsID0gZ2V0TGlnaHQoaSk7ICAgICAgaWYoIGkgPj0gdUxpZ2h0Q291bnQgKXsgICAgICAgIGJyZWFrOyAgICAgIH0gICAgICBpZiggbC50eXBlID09IDAgKSB7ICAgICAgICBBbWJpZW50TGlnaHQoIGZpbmFsQW1iaWVudCwgZWNQb3MsIGwgKTsgICAgICB9ICAgICAgZWxzZSBpZiggbC50eXBlID09IDEgKSB7ICAgICAgICBEaXJlY3Rpb25hbExpZ2h0KCBmaW5hbERpZmZ1c2UsIGZpbmFsU3BlY3VsYXIsIG5vcm0sIGVjUG9zLCBsICk7ICAgICAgfSAgICAgIGVsc2UgaWYoIGwudHlwZSA9PSAyICkgeyAgICAgICAgUG9pbnRMaWdodCggZmluYWxEaWZmdXNlLCBmaW5hbFNwZWN1bGFyLCBub3JtLCBlY1BvcywgbCApOyAgICAgIH0gICAgICBlbHNlIHsgICAgICAgIFNwb3RMaWdodCggZmluYWxEaWZmdXNlLCBmaW5hbFNwZWN1bGFyLCBub3JtLCBlY1BvcywgbCApOyAgICAgIH0gICAgfSAgIGlmKCB1VXNpbmdNYXQgPT0gZmFsc2UgKSB7ICAgICB2RnJvbnRDb2xvciA9IHZlYzQoICAgICAgIHZlYzMoIGNvbCApICogZmluYWxBbWJpZW50ICsgICAgICAgdmVjMyggY29sICkgKiBmaW5hbERpZmZ1c2UgKyAgICAgICB2ZWMzKCBjb2wgKSAqIGZpbmFsU3BlY3VsYXIsICAgICAgIGNvbFszXSApOyAgIH0gICBlbHNleyAgICAgdkZyb250Q29sb3IgPSB2ZWM0KCAgICAgICAgdU1hdGVyaWFsRW1pc3NpdmUgKyAgICAgICAgKHZlYzMoY29sKSAqIHVNYXRlcmlhbEFtYmllbnQgKiBmaW5hbEFtYmllbnQgKSArICAgICAgICAodmVjMyhjb2wpICogZmluYWxEaWZmdXNlKSArICAgICAgICAodU1hdGVyaWFsU3BlY3VsYXIgKiBmaW5hbFNwZWN1bGFyKSwgICAgICAgIGNvbFszXSApOyAgICB9ICB9ICB2VGV4dHVyZS54eSA9IGFUZXh0dXJlLnh5OyAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbiAqIHVWaWV3ICogdU1vZGVsICogdmVjNCggYVZlcnRleCwgMS4wICk7fSIscW49IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2VuZGlmXG52YXJ5aW5nIHZlYzQgdkZyb250Q29sb3I7dW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7dW5pZm9ybSBib29sIHVVc2luZ1RleHR1cmU7dmFyeWluZyB2ZWMyIHZUZXh0dXJlO3ZvaWQgbWFpbih2b2lkKXsgIGlmKCB1VXNpbmdUZXh0dXJlICl7ICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZS54eSkpICogdkZyb250Q29sb3I7ICB9ICBlbHNleyAgICBnbF9GcmFnQ29sb3IgPSB2RnJvbnRDb2xvcjsgIH19IixRbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jcmVhdGVTaGFkZXIoZS5WRVJURVhfU0hBREVSKQppZihlLnNoYWRlclNvdXJjZShyLHQpLGUuY29tcGlsZVNoYWRlcihyKSwhZS5nZXRTaGFkZXJQYXJhbWV0ZXIocixlLkNPTVBJTEVfU1RBVFVTKSl0aHJvdyBlLmdldFNoYWRlckluZm9Mb2cocikKdmFyIGk9ZS5jcmVhdGVTaGFkZXIoZS5GUkFHTUVOVF9TSEFERVIpCmlmKGUuc2hhZGVyU291cmNlKGksbiksZS5jb21waWxlU2hhZGVyKGkpLCFlLmdldFNoYWRlclBhcmFtZXRlcihpLGUuQ09NUElMRV9TVEFUVVMpKXRocm93IGUuZ2V0U2hhZGVySW5mb0xvZyhpKQp2YXIgcz1lLmNyZWF0ZVByb2dyYW0oKQppZihlLmF0dGFjaFNoYWRlcihzLHIpLGUuYXR0YWNoU2hhZGVyKHMsaSksZS5saW5rUHJvZ3JhbShzKSwhZS5nZXRQcm9ncmFtUGFyYW1ldGVyKHMsZS5MSU5LX1NUQVRVUykpdGhyb3ciRXJyb3IgbGlua2luZyBzaGFkZXJzLiIKcmV0dXJuIHN9LEpuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJue3g6ZSx5OnQsdzpuLGg6cn19LGVyPUpuLHRyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJue3g6ZSx5OnQsdzppP246bi1lLGg6aT9yOnItdH19LG5yPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJue3g6ZS1uLzIseTp0LXIvMix3Om4saDpyfX0scnI9ZnVuY3Rpb24oKXt9LGlyPWZ1bmN0aW9uKCl7fSxzcj1mdW5jdGlvbigpe30sb3I9ZnVuY3Rpb24oKXt9CmlyLnByb3RvdHlwZT1uZXcgcnIsaXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWlyLHNyLnByb3RvdHlwZT1uZXcgcnIsc3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPXNyLG9yLnByb3RvdHlwZT1uZXcgcnIsb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPW9yLHJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb249dSx4ZS5zaGFwZT1mdW5jdGlvbihlLHQsbixyLGkpe2FyZ3VtZW50cy5sZW5ndGg+PTEmJm51bGwhPT1hcmd1bWVudHNbMF0mJmUuaXNWaXNpYmxlKCkmJih4ZS5wdXNoTWF0cml4KCksQm49PT1jLkNFTlRFUj81PT09YXJndW1lbnRzLmxlbmd0aD8oeGUudHJhbnNsYXRlKHQtci8yLG4taS8yKSx4ZS5zY2FsZShyL2UuZ2V0V2lkdGgoKSxpL2UuZ2V0SGVpZ2h0KCkpKTozPT09YXJndW1lbnRzLmxlbmd0aD94ZS50cmFuc2xhdGUodC1lLmdldFdpZHRoKCkvMiwtZS5nZXRIZWlnaHQoKS8yKTp4ZS50cmFuc2xhdGUoLWUuZ2V0V2lkdGgoKS8yLC1lLmdldEhlaWdodCgpLzIpOkJuPT09Yy5DT1JORVI/NT09PWFyZ3VtZW50cy5sZW5ndGg/KHhlLnRyYW5zbGF0ZSh0LG4pLHhlLnNjYWxlKHIvZS5nZXRXaWR0aCgpLGkvZS5nZXRIZWlnaHQoKSkpOjM9PT1hcmd1bWVudHMubGVuZ3RoJiZ4ZS50cmFuc2xhdGUodCxuKTpCbj09PWMuQ09STkVSUyYmKDU9PT1hcmd1bWVudHMubGVuZ3RoPyhyLT10LGktPW4seGUudHJhbnNsYXRlKHQsbikseGUuc2NhbGUoci9lLmdldFdpZHRoKCksaS9lLmdldEhlaWdodCgpKSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJnhlLnRyYW5zbGF0ZSh0LG4pKSxlLmRyYXcoeGUpLCgxPT09YXJndW1lbnRzLmxlbmd0aCYmQm49PT1jLkNFTlRFUnx8YXJndW1lbnRzLmxlbmd0aD4xKSYmeGUucG9wTWF0cml4KCkpfSx4ZS5zaGFwZU1vZGU9ZnVuY3Rpb24oZSl7Qm49ZX0seGUubG9hZFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aCYmZS5pbmRleE9mKCIuc3ZnIik+LTE/bmV3IFBTaGFwZVNWRyhudWxsLGUpOm51bGx9LHhlLmxvYWRYTUw9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBYTUwoeGUsZSl9LHhlLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBYTUwKcmV0dXJuIHQucGFyc2UoZSksdH0KdmFyIGFyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49MDtuPGUubGVuZ3RoO24rKyl0PTAhPT1uP01hdGgubWF4KHQsTWF0aC5hYnMoZVtuXSkpOk1hdGguYWJzKGVbbl0pCnZhciByPSh0KyIiKS5pbmRleE9mKCIuIikKcmV0dXJuIDA9PT1yP3I9MTpyPT09LTEmJihyPSh0KyIiKS5sZW5ndGgpLHJ9LGxyPXhlLlBNYXRyaXgyRD1mdW5jdGlvbigpezA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMucmVzZXQoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBscj90aGlzLnNldChhcmd1bWVudHNbMF0uYXJyYXkoKSk6Nj09PWFyZ3VtZW50cy5sZW5ndGgmJnRoaXMuc2V0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdKX0KbHIucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oKXtpZig2PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzCnRoaXMuc2V0KFtlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XV0pfWVsc2UgMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgbHI/dGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uYXJyYXkoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKHRoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLnNsaWNlKCkpfSxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgbHIKcmV0dXJuIGUuc2V0KHRoaXMuZWxlbWVudHMpLGV9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zZXQoWzEsMCwwLDAsMSwwXSl9LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5lbGVtZW50c1syXT1lKnRoaXMuZWxlbWVudHNbMF0rdCp0aGlzLmVsZW1lbnRzWzFdK3RoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1s1XT1lKnRoaXMuZWxlbWVudHNbM10rdCp0aGlzLmVsZW1lbnRzWzRdK3RoaXMuZWxlbWVudHNbNV19LGludlRyYW5zbGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMudHJhbnNsYXRlKC1lLC10KX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7fSxtdWx0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scgpyZXR1cm4gZSBpbnN0YW5jZW9mIFBWZWN0b3I/KG49ZS54LHI9ZS55LHR8fCh0PW5ldyBQVmVjdG9yKSk6ZSBpbnN0YW5jZW9mIEFycmF5JiYobj1lWzBdLHI9ZVsxXSx0fHwodD1bXSkpLHQgaW5zdGFuY2VvZiBBcnJheT8odFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0sdFsxXT10aGlzLmVsZW1lbnRzWzNdKm4rdGhpcy5lbGVtZW50c1s0XSpyK3RoaXMuZWxlbWVudHNbNV0pOnQgaW5zdGFuY2VvZiBQVmVjdG9yJiYodC54PXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSx0Lnk9dGhpcy5lbGVtZW50c1szXSpuK3RoaXMuZWxlbWVudHNbNF0qcit0aGlzLmVsZW1lbnRzWzVdLHQuej0wKSx0fSxtdWx0WDpmdW5jdGlvbihlLHQpe3JldHVybiBlKnRoaXMuZWxlbWVudHNbMF0rdCp0aGlzLmVsZW1lbnRzWzFdK3RoaXMuZWxlbWVudHNbMl19LG11bHRZOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqdGhpcy5lbGVtZW50c1szXSt0KnRoaXMuZWxlbWVudHNbNF0rdGhpcy5lbGVtZW50c1s1XX0sc2tld1g6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSxlLDAsMCl9LHNrZXdZOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsMCxlLDApfSxzaGVhclg6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSxNYXRoLnRhbihlKSwwLDApfSxzaGVhclk6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSwwLE1hdGgudGFuKGUpLDApfSxkZXRlcm1pbmFudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNF0tdGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzNdfSxpbnZlcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRldGVybWluYW50KCkKaWYoTWF0aC5hYnMoZSk+Yy5NSU5fSU5UKXt2YXIgdD10aGlzLmVsZW1lbnRzWzBdLG49dGhpcy5lbGVtZW50c1sxXSxyPXRoaXMuZWxlbWVudHNbMl0saT10aGlzLmVsZW1lbnRzWzNdLHM9dGhpcy5lbGVtZW50c1s0XSxvPXRoaXMuZWxlbWVudHNbNV0KcmV0dXJuIHRoaXMuZWxlbWVudHNbMF09cy9lLHRoaXMuZWxlbWVudHNbM109LWkvZSx0aGlzLmVsZW1lbnRzWzFdPS1uL2UsdGhpcy5lbGVtZW50c1s0XT10L2UsdGhpcy5lbGVtZW50c1syXT0obipvLXMqcikvZSx0aGlzLmVsZW1lbnRzWzVdPShpKnItdCpvKS9lLCEwfXJldHVybiExfSxzY2FsZTpmdW5jdGlvbihlLHQpe2UmJiF0JiYodD1lKSxlJiZ0JiYodGhpcy5lbGVtZW50c1swXSo9ZSx0aGlzLmVsZW1lbnRzWzFdKj10LHRoaXMuZWxlbWVudHNbM10qPWUsdGhpcy5lbGVtZW50c1s0XSo9dCl9LGludlNjYWxlOmZ1bmN0aW9uKGUsdCl7ZSYmIXQmJih0PWUpLHRoaXMuc2NhbGUoMS9lLDEvdCl9LGFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgbHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKTo2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsdGhpcy5lbGVtZW50c1syXSwwLDAsdGhpcy5lbGVtZW50c1s1XV0sbj0wLHI9MDtyPDI7cisrKWZvcih2YXIgaT0wO2k8MztpKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbMypyKzBdKmVbaSswXSt0aGlzLmVsZW1lbnRzWzMqcisxXSplW2krM10KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHByZUFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgbHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKTo2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKdmFyIHQ9WzAsMCxlWzJdLDAsMCxlWzVdXQp0WzJdPWVbMl0rdGhpcy5lbGVtZW50c1syXSplWzBdK3RoaXMuZWxlbWVudHNbNV0qZVsxXSx0WzVdPWVbNV0rdGhpcy5lbGVtZW50c1syXSplWzNdK3RoaXMuZWxlbWVudHNbNV0qZVs0XSx0WzBdPXRoaXMuZWxlbWVudHNbMF0qZVswXSt0aGlzLmVsZW1lbnRzWzNdKmVbMV0sdFszXT10aGlzLmVsZW1lbnRzWzBdKmVbM10rdGhpcy5lbGVtZW50c1szXSplWzRdLHRbMV09dGhpcy5lbGVtZW50c1sxXSplWzBdK3RoaXMuZWxlbWVudHNbNF0qZVsxXSx0WzRdPXRoaXMuZWxlbWVudHNbMV0qZVszXSt0aGlzLmVsZW1lbnRzWzRdKmVbNF0sdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHJvdGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLHI9dGhpcy5lbGVtZW50c1swXSxpPXRoaXMuZWxlbWVudHNbMV0KdGhpcy5lbGVtZW50c1swXT10KnIrbippLHRoaXMuZWxlbWVudHNbMV09LW4qcit0Kmkscj10aGlzLmVsZW1lbnRzWzNdLGk9dGhpcy5lbGVtZW50c1s0XSx0aGlzLmVsZW1lbnRzWzNdPXQqcituKmksdGhpcy5lbGVtZW50c1s0XT0tbipyK3QqaX0scm90YXRlWjpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZShlKX0saW52Um90YXRlWjpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZVooZS1NYXRoLlBJKX0scHJpbnQ6ZnVuY3Rpb24oKXt2YXIgZT1hcih0aGlzLmVsZW1lbnRzKSx0PSIiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzBdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzFdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzJdLGUsNCkrIlxuIit4ZS5uZnModGhpcy5lbGVtZW50c1szXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s0XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s1XSxlLDQpKyJcblxuIgp4ZS5wcmludGxuKHQpfX0KdmFyIGhyPXhlLlBNYXRyaXgzRD1mdW5jdGlvbigpe3RoaXMucmVzZXQoKX0KaHIucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oKXsxNj09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lbGVtZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhyP3RoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLmFycmF5KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJih0aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5zbGljZSgpKX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IGhyCnJldHVybiBlLnNldCh0aGlzLmVsZW1lbnRzKSxlfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdfSxhcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKCl9LHRyYW5zbGF0ZTpmdW5jdGlvbihlLG4scil7cj09PXQmJihyPTApLHRoaXMuZWxlbWVudHNbM10rPWUqdGhpcy5lbGVtZW50c1swXStuKnRoaXMuZWxlbWVudHNbMV0rcip0aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbN10rPWUqdGhpcy5lbGVtZW50c1s0XStuKnRoaXMuZWxlbWVudHNbNV0rcip0aGlzLmVsZW1lbnRzWzZdLHRoaXMuZWxlbWVudHNbMTFdKz1lKnRoaXMuZWxlbWVudHNbOF0rbip0aGlzLmVsZW1lbnRzWzldK3IqdGhpcy5lbGVtZW50c1sxMF0sdGhpcy5lbGVtZW50c1sxNV0rPWUqdGhpcy5lbGVtZW50c1sxMl0rbip0aGlzLmVsZW1lbnRzWzEzXStyKnRoaXMuZWxlbWVudHNbMTRdfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnRzWzRdCnRoaXMuZWxlbWVudHNbNF09dGhpcy5lbGVtZW50c1sxXSx0aGlzLmVsZW1lbnRzWzFdPWUsZT10aGlzLmVsZW1lbnRzWzhdLHRoaXMuZWxlbWVudHNbOF09dGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzJdPWUsZT10aGlzLmVsZW1lbnRzWzZdLHRoaXMuZWxlbWVudHNbNl09dGhpcy5lbGVtZW50c1s5XSx0aGlzLmVsZW1lbnRzWzldPWUsZT10aGlzLmVsZW1lbnRzWzNdLHRoaXMuZWxlbWVudHNbM109dGhpcy5lbGVtZW50c1sxMl0sdGhpcy5lbGVtZW50c1sxMl09ZSxlPXRoaXMuZWxlbWVudHNbN10sdGhpcy5lbGVtZW50c1s3XT10aGlzLmVsZW1lbnRzWzEzXSx0aGlzLmVsZW1lbnRzWzEzXT1lLGU9dGhpcy5lbGVtZW50c1sxMV0sdGhpcy5lbGVtZW50c1sxMV09dGhpcy5lbGVtZW50c1sxNF0sdGhpcy5lbGVtZW50c1sxNF09ZX0sbXVsdDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzCnJldHVybiBlIGluc3RhbmNlb2YgUFZlY3Rvcj8obj1lLngscj1lLnksaT1lLnoscz0xLHR8fCh0PW5ldyBQVmVjdG9yKSk6ZSBpbnN0YW5jZW9mIEFycmF5JiYobj1lWzBdLHI9ZVsxXSxpPWVbMl0scz1lWzNdfHwxLCghdHx8MyE9PXQubGVuZ3RoJiY0IT09dC5sZW5ndGgpJiYodD1bMCwwLDBdKSksdCBpbnN0YW5jZW9mIEFycmF5JiYoMz09PXQubGVuZ3RoPyh0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10sdFsxXT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddLHRbMl09dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKTo0PT09dC5sZW5ndGgmJih0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10qcyx0WzFdPXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10qcyx0WzJdPXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSpzLHRbM109dGhpcy5lbGVtZW50c1sxMl0qbit0aGlzLmVsZW1lbnRzWzEzXSpyK3RoaXMuZWxlbWVudHNbMTRdKmkrdGhpcy5lbGVtZW50c1sxNV0qcykpLHQgaW5zdGFuY2VvZiBQVmVjdG9yJiYodC54PXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSppK3RoaXMuZWxlbWVudHNbM10sdC55PXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10sdC56PXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSksdH0scHJlQXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjE2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSxuPTAscj0wO3I8NDtyKyspZm9yKHZhciBpPTA7aTw0O2krKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1tpKzBdKmVbNCpyKzBdK3RoaXMuZWxlbWVudHNbaSs0XSplWzQqcisxXSt0aGlzLmVsZW1lbnRzW2krOF0qZVs0KnIrMl0rdGhpcy5lbGVtZW50c1tpKzEyXSplWzQqciszXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0sYXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjE2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSxuPTAscj0wO3I8NDtyKyspZm9yKHZhciBpPTA7aTw0O2krKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1s0KnIrMF0qZVtpKzBdK3RoaXMuZWxlbWVudHNbNCpyKzFdKmVbaSs0XSt0aGlzLmVsZW1lbnRzWzQqcisyXSplW2krOF0rdGhpcy5lbGVtZW50c1s0KnIrM10qZVtpKzEyXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scm90YXRlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGFyZ3VtZW50cy5sZW5ndGg8NCl0aGlzLnJvdGF0ZVooZSkKZWxzZXt2YXIgaT1uZXcgUFZlY3Rvcih0LG4scikscz1pLm1hZygpCmlmKDA9PT1zKXJldHVybgoxIT1zJiYoaS5ub3JtYWxpemUoKSx0PWkueCxuPWkueSxyPWkueikKdmFyIG89eGUuY29zKGUpLGE9eGUuc2luKGUpLGw9MS1vCnRoaXMuYXBwbHkobCp0KnQrbyxsKnQqbi1hKnIsbCp0KnIrYSpuLDAsbCp0Km4rYSpyLGwqbipuK28sbCpuKnItYSp0LDAsbCp0KnItYSpuLGwqbipyK2EqdCxsKnIqcitvLDAsMCwwLDAsMSl9fSxpbnZBcHBseTpmdW5jdGlvbigpe3N0PT09dCYmKHN0PW5ldyBocikKdmFyIGU9YXJndW1lbnRzCnJldHVybiBzdC5zZXQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0sZVs5XSxlWzEwXSxlWzExXSxlWzEyXSxlWzEzXSxlWzE0XSxlWzE1XSksISFzdC5pbnZlcnQoKSYmKHRoaXMucHJlQXBwbHkoc3QpLCEwKX0scm90YXRlWDpmdW5jdGlvbihlKXt2YXIgdD14ZS5jb3MoZSksbj14ZS5zaW4oZSkKdGhpcy5hcHBseShbMSwwLDAsMCwwLHQsLW4sMCwwLG4sdCwwLDAsMCwwLDFdKX0scm90YXRlWTpmdW5jdGlvbihlKXt2YXIgdD14ZS5jb3MoZSksbj14ZS5zaW4oZSkKdGhpcy5hcHBseShbdCwwLG4sMCwwLDEsMCwwLC1uLDAsdCwwLDAsMCwwLDFdKX0scm90YXRlWjpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpCnRoaXMuYXBwbHkoW3QsLW4sMCwwLG4sdCwwLDAsMCwwLDEsMCwwLDAsMCwxXSl9LHNjYWxlOmZ1bmN0aW9uKGUsdCxuKXshZXx8dHx8bj9lJiZ0JiYhbiYmKG49MSk6dD1uPWUsZSYmdCYmbiYmKHRoaXMuZWxlbWVudHNbMF0qPWUsdGhpcy5lbGVtZW50c1sxXSo9dCx0aGlzLmVsZW1lbnRzWzJdKj1uLHRoaXMuZWxlbWVudHNbNF0qPWUsdGhpcy5lbGVtZW50c1s1XSo9dCx0aGlzLmVsZW1lbnRzWzZdKj1uLHRoaXMuZWxlbWVudHNbOF0qPWUsdGhpcy5lbGVtZW50c1s5XSo9dCx0aGlzLmVsZW1lbnRzWzEwXSo9bix0aGlzLmVsZW1lbnRzWzEyXSo9ZSx0aGlzLmVsZW1lbnRzWzEzXSo9dCx0aGlzLmVsZW1lbnRzWzE0XSo9bil9LHNrZXdYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSx0LDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNrZXdZOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSwwLDAsMCx0LDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNoZWFyWDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsdCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxzaGVhclk6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLDAsMCwwLHQsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sbXVsdFg6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4/cj90aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbMl0qbit0aGlzLmVsZW1lbnRzWzNdKnI6dGhpcy5lbGVtZW50c1swXSplK3RoaXMuZWxlbWVudHNbMV0qdCt0aGlzLmVsZW1lbnRzWzJdKm4rdGhpcy5lbGVtZW50c1szXTp0aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbM119LG11bHRZOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuP3I/dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzZdKm4rdGhpcy5lbGVtZW50c1s3XSpyOnRoaXMuZWxlbWVudHNbNF0qZSt0aGlzLmVsZW1lbnRzWzVdKnQrdGhpcy5lbGVtZW50c1s2XSpuK3RoaXMuZWxlbWVudHNbN106dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzddfSxtdWx0WjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcj90aGlzLmVsZW1lbnRzWzhdKmUrdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV0qcjp0aGlzLmVsZW1lbnRzWzhdKmUrdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV19LG11bHRXOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByP3RoaXMuZWxlbWVudHNbMTJdKmUrdGhpcy5lbGVtZW50c1sxM10qdCt0aGlzLmVsZW1lbnRzWzE0XSpuK3RoaXMuZWxlbWVudHNbMTVdKnI6dGhpcy5lbGVtZW50c1sxMl0qZSt0aGlzLmVsZW1lbnRzWzEzXSp0K3RoaXMuZWxlbWVudHNbMTRdKm4rdGhpcy5lbGVtZW50c1sxNV19LGludmVydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s1XS10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbNF0sdD10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbNl0tdGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzRdLG49dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s0XSxyPXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s2XS10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbNV0saT10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzVdLHM9dGhpcy5lbGVtZW50c1syXSp0aGlzLmVsZW1lbnRzWzddLXRoaXMuZWxlbWVudHNbM10qdGhpcy5lbGVtZW50c1s2XSxvPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxM10tdGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzEyXSxhPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxNF0tdGhpcy5lbGVtZW50c1sxMF0qdGhpcy5lbGVtZW50c1sxMl0sbD10aGlzLmVsZW1lbnRzWzhdKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTJdLGg9dGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzE0XS10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzEzXSx1PXRoaXMuZWxlbWVudHNbOV0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxM10sYz10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzE0XSxmPWUqYy10KnUrbipoK3IqbC1pKmErcypvCmlmKE1hdGguYWJzKGYpPD0xZS05KXJldHVybiExCnZhciBwPVtdCnBbMF09K3RoaXMuZWxlbWVudHNbNV0qYy10aGlzLmVsZW1lbnRzWzZdKnUrdGhpcy5lbGVtZW50c1s3XSpoLHBbNF09LXRoaXMuZWxlbWVudHNbNF0qYyt0aGlzLmVsZW1lbnRzWzZdKmwtdGhpcy5lbGVtZW50c1s3XSphLHBbOF09K3RoaXMuZWxlbWVudHNbNF0qdS10aGlzLmVsZW1lbnRzWzVdKmwrdGhpcy5lbGVtZW50c1s3XSpvLHBbMTJdPS10aGlzLmVsZW1lbnRzWzRdKmgrdGhpcy5lbGVtZW50c1s1XSphLXRoaXMuZWxlbWVudHNbNl0qbyxwWzFdPS10aGlzLmVsZW1lbnRzWzFdKmMrdGhpcy5lbGVtZW50c1syXSp1LXRoaXMuZWxlbWVudHNbM10qaCxwWzVdPSt0aGlzLmVsZW1lbnRzWzBdKmMtdGhpcy5lbGVtZW50c1syXSpsK3RoaXMuZWxlbWVudHNbM10qYSxwWzldPS10aGlzLmVsZW1lbnRzWzBdKnUrdGhpcy5lbGVtZW50c1sxXSpsLXRoaXMuZWxlbWVudHNbM10qbyxwWzEzXT0rdGhpcy5lbGVtZW50c1swXSpoLXRoaXMuZWxlbWVudHNbMV0qYSt0aGlzLmVsZW1lbnRzWzJdKm8scFsyXT0rdGhpcy5lbGVtZW50c1sxM10qcy10aGlzLmVsZW1lbnRzWzE0XSppK3RoaXMuZWxlbWVudHNbMTVdKnIscFs2XT0tdGhpcy5lbGVtZW50c1sxMl0qcyt0aGlzLmVsZW1lbnRzWzE0XSpuLXRoaXMuZWxlbWVudHNbMTVdKnQscFsxMF09K3RoaXMuZWxlbWVudHNbMTJdKmktdGhpcy5lbGVtZW50c1sxM10qbit0aGlzLmVsZW1lbnRzWzE1XSplLHBbMTRdPS10aGlzLmVsZW1lbnRzWzEyXSpyK3RoaXMuZWxlbWVudHNbMTNdKnQtdGhpcy5lbGVtZW50c1sxNF0qZSxwWzNdPS10aGlzLmVsZW1lbnRzWzldKnMrdGhpcy5lbGVtZW50c1sxMF0qaS10aGlzLmVsZW1lbnRzWzExXSpyLHBbN109K3RoaXMuZWxlbWVudHNbOF0qcy10aGlzLmVsZW1lbnRzWzEwXSpuK3RoaXMuZWxlbWVudHNbMTFdKnQscFsxMV09LXRoaXMuZWxlbWVudHNbOF0qaSt0aGlzLmVsZW1lbnRzWzldKm4tdGhpcy5lbGVtZW50c1sxMV0qZSxwWzE1XT0rdGhpcy5lbGVtZW50c1s4XSpyLXRoaXMuZWxlbWVudHNbOV0qdCt0aGlzLmVsZW1lbnRzWzEwXSplCnZhciBtPTEvZgpyZXR1cm4gcFswXSo9bSxwWzFdKj1tLHBbMl0qPW0scFszXSo9bSxwWzRdKj1tLHBbNV0qPW0scFs2XSo9bSxwWzddKj1tLHBbOF0qPW0scFs5XSo9bSxwWzEwXSo9bSxwWzExXSo9bSxwWzEyXSo9bSxwWzEzXSo9bSxwWzE0XSo9bSxwWzE1XSo9bSx0aGlzLmVsZW1lbnRzPXAuc2xpY2UoKSwhMH0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtmb3IodmFyIGU9IiIsdD0wO3Q8MTU7dCsrKWUrPXRoaXMuZWxlbWVudHNbdF0rIiwgIgpyZXR1cm4gZSs9dGhpcy5lbGVtZW50c1sxNV19LHByaW50OmZ1bmN0aW9uKCl7dmFyIGU9YXIodGhpcy5lbGVtZW50cyksdD0iIit4ZS5uZnModGhpcy5lbGVtZW50c1swXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1syXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1szXSxlLDQpKyJcbiIreGUubmZzKHRoaXMuZWxlbWVudHNbNF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbNV0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbNl0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbN10sZSw0KSsiXG4iK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzhdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzldLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzEwXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxMV0sZSw0KSsiXG4iK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzEyXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxM10sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMTRdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzE1XSxlLDQpKyJcblxuIgp4ZS5wcmludGxuKHQpfSxpbnZUcmFuc2xhdGU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMucHJlQXBwbHkoMSwwLDAsLWUsMCwxLDAsLXQsMCwwLDEsLW4sMCwwLDAsMSl9LGludlJvdGF0ZVg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoWzEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxXSl9LGludlJvdGF0ZVk6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoW3QsMCxuLDAsMCwxLDAsMCwtbiwwLHQsMCwwLDAsMCwxXSl9LGludlJvdGF0ZVo6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoW3QsLW4sMCwwLG4sdCwwLDAsMCwwLDEsMCwwLDAsMCwxXSl9LGludlNjYWxlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnByZUFwcGx5KFsxL2UsMCwwLDAsMCwxL3QsMCwwLDAsMCwxL24sMCwwLDAsMCwxXSl9fQp2YXIgdXI9eGUuUE1hdHJpeFN0YWNrPWZ1bmN0aW9uKCl7dGhpcy5tYXRyaXhTdGFjaz1bXX0KdXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT13ZS4kbmV3UE1hdHJpeCgpCjE9PT1hcmd1bWVudHMubGVuZ3RoP2Uuc2V0KGFyZ3VtZW50c1swXSk6ZS5zZXQoYXJndW1lbnRzKSx0aGlzLm1hdHJpeFN0YWNrLnB1c2goZSl9LGlyLnByb3RvdHlwZS4kbmV3UE1hdHJpeD1mdW5jdGlvbigpe3JldHVybiBuZXcgbHJ9LHNyLnByb3RvdHlwZS4kbmV3UE1hdHJpeD1mdW5jdGlvbigpe3JldHVybiBuZXcgaHJ9LHVyLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5tYXRyaXhTdGFjay5wdXNoKHRoaXMucGVlaygpKX0sdXIucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdHJpeFN0YWNrLnBvcCgpfSx1ci5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe3ZhciBlPXdlLiRuZXdQTWF0cml4KCkKcmV0dXJuIGUuc2V0KHRoaXMubWF0cml4U3RhY2tbdGhpcy5tYXRyaXhTdGFjay5sZW5ndGgtMV0pLGV9LHVyLnByb3RvdHlwZS5tdWx0PWZ1bmN0aW9uKGUpe3RoaXMubWF0cml4U3RhY2tbdGhpcy5tYXRyaXhTdGFjay5sZW5ndGgtMV0uYXBwbHkoZSl9LHhlLnNwbGl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3BsaXQodCl9LHhlLnNwbGl0VG9rZW5zPWZ1bmN0aW9uKGUsbil7aWYobj09PXQpcmV0dXJuIGUuc3BsaXQoL1xzKy9nKQp2YXIgcixpLHM9bi5zcGxpdCgvKCkvZyksbz0iIixhPWUubGVuZ3RoLGw9W10KZm9yKHI9MDtyPGE7cisrKWk9ZVtyXSxzLmluZGV4T2YoaSk+LTE/KCIiIT09byYmbC5wdXNoKG8pLG89IiIpOm8rPWkKcmV0dXJuIiIhPT1vJiZsLnB1c2gobyksbH0seGUuYXBwZW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbZS5sZW5ndGhdPXQsZX0seGUuY29uY2F0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQpfSx4ZS5zb3J0PWZ1bmN0aW9uKGUsdCl7dmFyIG49W10KaWYoZS5sZW5ndGg+MCl7Zm9yKHZhciByPXQ+MD90OmUubGVuZ3RoLGk9MDtpPHI7aSsrKW4ucHVzaChlW2ldKQppZigic3RyaW5nIj09dHlwZW9mIGVbMF0/bi5zb3J0KCk6bi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pLHQ+MClmb3IodmFyIHM9bi5sZW5ndGg7czxlLmxlbmd0aDtzKyspbi5wdXNoKGVbc10pfXJldHVybiBufSx4ZS5zcGxpY2U9ZnVuY3Rpb24oZSx0LG4pe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gZQppZih0IGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciByPTAsaT1uO3I8dC5sZW5ndGg7aSsrLHIrKyllLnNwbGljZShpLDAsdFtyXSkKZWxzZSBlLnNwbGljZShuLDAsdCkKcmV0dXJuIGV9LHhlLnN1YnNldD1mdW5jdGlvbihlLG4scil7dmFyIGk9ciE9PXQ/bityOmUubGVuZ3RoCnJldHVybiBlLnNsaWNlKG4saSl9LHhlLmpvaW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5qb2luKHQpfSx4ZS5zaG9ydGVuPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWUubGVuZ3RoLHI9MDtyPG47cisrKXRbcl09ZVtyXQpyZXR1cm4gdC5wb3AoKSx0fSx4ZS5leHBhbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNsaWNlKDApLHI9dHx8MiplLmxlbmd0aApyZXR1cm4gbi5sZW5ndGg9cixufSx4ZS5hcnJheUNvcHk9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaT0wLHM9MAoyPT09YXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1lLmxlbmd0aCk6Mz09PWFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdKTo1PT09YXJndW1lbnRzLmxlbmd0aCYmKGU9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHM9YXJndW1lbnRzWzNdLHI9YXJndW1lbnRzWzRdKQpmb3IodmFyIG89aSxhPXM7bzxyK2k7bysrLGErKyl7aWYoblthXT09PXQpdGhyb3ciYXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kcyBleGNlcHRpb24iCm5bYV09ZVtvXX19LHhlLnJldmVyc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmV2ZXJzZSgpfSx4ZS5taXg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlKygodC1lKSpuPj44KX0seGUucGVnPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/MDplPjI1NT8yNTU6ZX0seGUubW9kZXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuLHIsaSxvLGEsbCxoLHUsYyl7dmFyIGY9cygoKDQyNzgxOTAwODAmZSk+Pj4yNCkrdCwyNTUpPDwyNCxwPW4rKChoLW4pKnQ+PjgpCnA9KHA8MD8wOnA+MjU1PzI1NTpwKTw8MTYKdmFyIG09cisoKHUtcikqdD4+OCkKbT0obTwwPzA6bT4yNTU/MjU1Om0pPDw4CnZhciBnPWkrKChjLWkpKnQ+PjgpCnJldHVybiBnPWc8MD8wOmc+MjU1PzI1NTpnLGZ8cHxtfGd9dmFyIHQ9Yy5BTFBIQV9NQVNLLG49Yy5SRURfTUFTSyxyPWMuR1JFRU5fTUFTSyxpPWMuQkxVRV9NQVNLLHM9TWF0aC5taW4sbz1NYXRoLm1heApyZXR1cm57cmVwbGFjZTpmdW5jdGlvbihlLHQpe3JldHVybiB0fSxibGVuZDpmdW5jdGlvbihlLG8pe3ZhciBhPShvJnQpPj4+MjQsbD1lJm4saD1lJnIsdT1lJmksYz1vJm4sZj1vJnIscD1vJmkKcmV0dXJuIHMoKChlJnQpPj4+MjQpK2EsMjU1KTw8MjR8bCsoKGMtbCkqYT4+OCkmbnxoKygoZi1oKSphPj44KSZyfHUrKChwLXUpKmE+PjgpJml9LGFkZDpmdW5jdGlvbihlLG8pe3ZhciBhPShvJnQpPj4+MjQKcmV0dXJuIHMoKChlJnQpPj4+MjQpK2EsMjU1KTw8MjR8cygoZSZuKSsoKG8mbik+PjgpKmEsbikmbnxzKChlJnIpKygobyZyKT4+OCkqYSxyKSZyfHMoKGUmaSkrKChvJmkpKmE+PjgpLGkpfSxzdWJ0cmFjdDpmdW5jdGlvbihlLGEpe3ZhciBsPShhJnQpPj4+MjQKcmV0dXJuIHMoKChlJnQpPj4+MjQpK2wsMjU1KTw8MjR8bygoZSZuKS0oKGEmbik+PjgpKmwscikmbnxvKChlJnIpLSgoYSZyKT4+OCkqbCxpKSZyfG8oKGUmaSktKChhJmkpKmw+PjgpLDApfSxsaWdodGVzdDpmdW5jdGlvbihlLGEpe3ZhciBsPShhJnQpPj4+MjQKcmV0dXJuIHMoKChlJnQpPj4+MjQpK2wsMjU1KTw8MjR8byhlJm4sKChhJm4pPj44KSpsKSZufG8oZSZyLCgoYSZyKT4+OCkqbCkmcnxvKGUmaSwoYSZpKSpsPj44KX0sZGFya2VzdDpmdW5jdGlvbihlLG8pe3ZhciBhPShvJnQpPj4+MjQsbD1lJm4saD1lJnIsdT1lJmksYz1zKGUmbiwoKG8mbik+PjgpKmEpLGY9cyhlJnIsKChvJnIpPj44KSphKSxwPXMoZSZpLChvJmkpKmE+PjgpCnJldHVybiBzKCgoZSZ0KT4+PjI0KSthLDI1NSk8PDI0fGwrKChjLWwpKmE+PjgpJm58aCsoKGYtaCkqYT4+OCkmcnx1KygocC11KSphPj44KSZpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT1sPmM/bC1jOmMtbCxnPWg+Zj9oLWY6Zi1oLGQ9dT5wP3UtcDpwLXUKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sZXhjbHVzaW9uOmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT1sK2MtKGwqYz4+NyksZz1oK2YtKGgqZj4+NyksZD11K3AtKHUqcD4+NykKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sbXVsdGlwbHk6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPWwqYz4+OCxnPWgqZj4+OCxkPXUqcD4+OApyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxzY3JlZW46ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPTI1NS0oKDI1NS1sKSooMjU1LWMpPj44KSxnPTI1NS0oKDI1NS1oKSooMjU1LWYpPj44KSxkPTI1NS0oKDI1NS11KSooMjU1LXApPj44KQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxoYXJkX2xpZ2h0OmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT1jPDEyOD9sKmM+Pjc6MjU1LSgoMjU1LWwpKigyNTUtYyk+PjcpLGc9ZjwxMjg/aCpmPj43OjI1NS0oKDI1NS1oKSooMjU1LWYpPj43KSxkPXA8MTI4P3UqcD4+NzoyNTUtKCgyNTUtdSkqKDI1NS1wKT4+NykKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sc29mdF9saWdodDpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09KGwqYz4+NykrKGwqbD4+OCktKGwqbCpjPj4xNSksZz0oaCpmPj43KSsoaCpoPj44KS0oaCpoKmY+PjE1KSxkPSh1KnA+PjcpKyh1KnU+PjgpLSh1KnUqcD4+MTUpCnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LG92ZXJsYXk6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPWw8MTI4P2wqYz4+NzoyNTUtKCgyNTUtbCkqKDI1NS1jKT4+NyksZz1oPDEyOD9oKmY+Pjc6MjU1LSgoMjU1LWgpKigyNTUtZik+PjcpLGQ9dTwxMjg/dSpwPj43OjI1NS0oKDI1NS11KSooMjU1LXApPj43KQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxkb2RnZTpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09MjU1CjI1NSE9PWMmJihtPShsPDw4KS8oMjU1LWMpLG09bTwwPzA6bT4yNTU/MjU1Om0pCnZhciBnPTI1NQoyNTUhPT1mJiYoZz0oaDw8OCkvKDI1NS1mKSxnPWc8MD8wOmc+MjU1PzI1NTpnKQp2YXIgZD0yNTUKcmV0dXJuIDI1NSE9PXAmJihkPSh1PDw4KS8oMjU1LXApLGQ9ZDwwPzA6ZD4yNTU/MjU1OmQpLGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sYnVybjpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09MAowIT09YyYmKG09KDI1NS1sPDw4KS9jLG09MjU1LShtPDA/MDptPjI1NT8yNTU6bSkpCnZhciBnPTAKMCE9PWYmJihnPSgyNTUtaDw8OCkvZixnPTI1NS0oZzwwPzA6Zz4yNTU/MjU1OmcpKQp2YXIgZD0wCnJldHVybiAwIT09cCYmKGQ9KDI1NS11PDw4KS9wLGQ9MjU1LShkPDA/MDpkPjI1NT8yNTU6ZCkpLGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX19fSgpLHhlLmNvbG9yPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBlIT09dCYmbiE9PXQmJnIhPT10JiZpIT09dD9MKGUsbixyLGkpOmUhPT10JiZuIT09dCYmciE9PXQ/TChlLG4scixrdCk6ZSE9PXQmJm4hPT10P0koZSxuKToibnVtYmVyIj09dHlwZW9mIGU/RChlKTpMKEJ0LCR0LEd0LGt0KX0seGUuY29sb3IudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuInJnYmEoIisoKGUmYy5SRURfTUFTSyk+Pj4xNikrIiwiKygoZSZjLkdSRUVOX01BU0spPj4+OCkrIiwiKyhlJmMuQkxVRV9NQVNLKSsiLCIrKChlJmMuQUxQSEFfTUFTSyk+Pj4yNCkvMjU1KyIpIn0seGUuY29sb3IudG9JbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHI8PDI0JmMuQUxQSEFfTUFTS3xlPDwxNiZjLlJFRF9NQVNLfHQ8PDgmYy5HUkVFTl9NQVNLfG4mYy5CTFVFX01BU0t9LHhlLmNvbG9yLnRvQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuWyhlJmMuUkVEX01BU0spPj4+MTYsKGUmYy5HUkVFTl9NQVNLKT4+PjgsZSZjLkJMVUVfTUFTSywoZSZjLkFMUEhBX01BU0spPj4+MjRdfSx4ZS5jb2xvci50b0dMQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuWygoZSZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChlJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKGUmYy5CTFVFX01BU0spLzI1NSwoKGUmYy5BTFBIQV9NQVNLKT4+PjI0KS8yNTVdfSx4ZS5jb2xvci50b1JHQj1mdW5jdGlvbihlLHQsbil7ZT1lPkJ0P0J0OmUsdD10PiR0PyR0OnQsbj1uPkd0P0d0Om4sZT1lPDA/MDplLGU9ZS9CdCozNjAsdD10LyR0KjEwMCxuPW4vR3QqMTAwCnZhciByPU1hdGgucm91bmQobi8xMDAqMjU1KQppZigwPT09dClyZXR1cm5bcixyLHJdCnZhciBpPWUlMzYwLHM9aSU2MCxvPU1hdGgucm91bmQobiooMTAwLXQpLzFlNCoyNTUpLGE9TWF0aC5yb3VuZChuKig2ZTMtdCpzKS82ZTUqMjU1KSxsPU1hdGgucm91bmQobiooNmUzLXQqKDYwLXMpKS82ZTUqMjU1KQpzd2l0Y2goTWF0aC5mbG9vcihpLzYwKSl7Y2FzZSAwOnJldHVybltyLGwsb10KY2FzZSAxOnJldHVyblthLHIsb10KY2FzZSAyOnJldHVybltvLHIsbF0KY2FzZSAzOnJldHVybltvLGEscl0KY2FzZSA0OnJldHVybltsLG8scl0KY2FzZSA1OnJldHVybltyLG8sYV0KZGVmYXVsdDpFLmRlYnVnKCJVbmV4cGVjdGVkbHkgaGl0IGRlZmF1bHQgY2FzZSBpbiB0b1JHQiBmdW5jdGlvbi4iKX19LHhlLmJyaWdodG5lc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSlbMl19LHhlLnNhdHVyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSlbMV19LHhlLmh1ZT1mdW5jdGlvbihlKXtyZXR1cm4gTyhlKVswXX0seGUucmVkPWZ1bmN0aW9uKGUpe3JldHVybigoZSZjLlJFRF9NQVNLKT4+PjE2KS8yNTUqQnR9LHhlLmdyZWVuPWZ1bmN0aW9uKGUpe3JldHVybigoZSZjLkdSRUVOX01BU0spPj4+OCkvMjU1KiR0fSx4ZS5ibHVlPWZ1bmN0aW9uKGUpe3JldHVybihlJmMuQkxVRV9NQVNLKS8yNTUqR3R9LHhlLmFscGhhPWZ1bmN0aW9uKGUpe3JldHVybigoZSZjLkFMUEhBX01BU0spPj4+MjQpLzI1NSprdH0seGUubGVycENvbG9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHMsbyxhLGwsaCx1LGYscCxtLGcsZCx2LHkseCxBLGI9eGUuY29sb3IoZSksdz14ZS5jb2xvcih0KQpyZXR1cm4gVXQ9PT1jLkhTQj8oZD1PKGIpLHU9KChiJmMuQUxQSEFfTUFTSyk+Pj4yNCkva3Qsdj1PKHcpLGc9KCh3JmMuQUxQSEFfTUFTSyk+Pj4yNCkva3QseD14ZS5sZXJwKGRbMF0sdlswXSxuKSxBPXhlLmxlcnAoZFsxXSx2WzFdLG4pLHM9eGUubGVycChkWzJdLHZbMl0sbikseT14ZS5jb2xvci50b1JHQih4LEEscyksbz14ZS5sZXJwKHUsZyxuKSprdCsuNXwwLG88PDI0JmMuQUxQSEFfTUFTS3x5WzBdPDwxNiZjLlJFRF9NQVNLfHlbMV08PDgmYy5HUkVFTl9NQVNLfHlbMl0mYy5CTFVFX01BU0spOihhPShiJmMuUkVEX01BU0spPj4+MTYsbD0oYiZjLkdSRUVOX01BU0spPj4+OCxoPWImYy5CTFVFX01BU0ssdT0oKGImYy5BTFBIQV9NQVNLKT4+PjI0KS9rdCxmPSh3JmMuUkVEX01BU0spPj4+MTYscD0odyZjLkdSRUVOX01BU0spPj4+OCxtPXcmYy5CTFVFX01BU0ssZz0oKHcmYy5BTFBIQV9NQVNLKT4+PjI0KS9rdCxyPXhlLmxlcnAoYSxmLG4pKy41fDAsaT14ZS5sZXJwKGwscCxuKSsuNXwwLHM9eGUubGVycChoLG0sbikrLjV8MCxvPXhlLmxlcnAodSxnLG4pKmt0Ky41fDAsbzw8MjQmYy5BTFBIQV9NQVNLfHI8PDE2JmMuUkVEX01BU0t8aTw8OCZjLkdSRUVOX01BU0t8cyZjLkJMVUVfTUFTSyl9LHhlLmNvbG9yTW9kZT1mdW5jdGlvbigpe1V0PWFyZ3VtZW50c1swXSxhcmd1bWVudHMubGVuZ3RoPjEmJihCdD1hcmd1bWVudHNbMV0sJHQ9YXJndW1lbnRzWzJdfHxhcmd1bWVudHNbMV0sR3Q9YXJndW1lbnRzWzNdfHxhcmd1bWVudHNbMV0sa3Q9YXJndW1lbnRzWzRdfHxhcmd1bWVudHNbMV0pfSx4ZS5ibGVuZENvbG9yPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj09PWMuUkVQTEFDRT94ZS5tb2Rlcy5yZXBsYWNlKGUsdCk6bj09PWMuQkxFTkQ/eGUubW9kZXMuYmxlbmQoZSx0KTpuPT09Yy5BREQ/eGUubW9kZXMuYWRkKGUsdCk6bj09PWMuU1VCVFJBQ1Q/eGUubW9kZXMuc3VidHJhY3QoZSx0KTpuPT09Yy5MSUdIVEVTVD94ZS5tb2Rlcy5saWdodGVzdChlLHQpOm49PT1jLkRBUktFU1Q/eGUubW9kZXMuZGFya2VzdChlLHQpOm49PT1jLkRJRkZFUkVOQ0U/eGUubW9kZXMuZGlmZmVyZW5jZShlLHQpOm49PT1jLkVYQ0xVU0lPTj94ZS5tb2Rlcy5leGNsdXNpb24oZSx0KTpuPT09Yy5NVUxUSVBMWT94ZS5tb2Rlcy5tdWx0aXBseShlLHQpOm49PT1jLlNDUkVFTj94ZS5tb2Rlcy5zY3JlZW4oZSx0KTpuPT09Yy5IQVJEX0xJR0hUP3hlLm1vZGVzLmhhcmRfbGlnaHQoZSx0KTpuPT09Yy5TT0ZUX0xJR0hUP3hlLm1vZGVzLnNvZnRfbGlnaHQoZSx0KTpuPT09Yy5PVkVSTEFZP3hlLm1vZGVzLm92ZXJsYXkoZSx0KTpuPT09Yy5ET0RHRT94ZS5tb2Rlcy5kb2RnZShlLHQpOm49PT1jLkJVUk4/eGUubW9kZXMuYnVybihlLHQpOnZvaWQgMH0seGUucHJpbnRNYXRyaXg9ZnVuY3Rpb24oKXt0dC5wcmludCgpfSxpci5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCl7dHQudHJhbnNsYXRlKGUsdCksbnQuaW52VHJhbnNsYXRlKGUsdCksQWUudHJhbnNsYXRlKGUsdCl9LHNyLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LG4pe3R0LnRyYW5zbGF0ZShlLHQsbiksbnQuaW52VHJhbnNsYXRlKGUsdCxuKX0saXIucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKGUsdCl7dHQuc2NhbGUoZSx0KSxudC5pbnZTY2FsZShlLHQpLEFlLnNjYWxlKGUsdHx8ZSl9LHNyLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihlLHQsbil7dHQuc2NhbGUoZSx0LG4pLG50LmludlNjYWxlKGUsdCxuKX0saXIucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihlKXt2YXIgdD1lLmFycmF5KCkKQWUudHJhbnNmb3JtKHRbMF0sdFszXSx0WzFdLHRbNF0sdFsyXSx0WzVdKX0sc3IucHJvdG90eXBlLnRyYW5zZm9ybW09ZnVuY3Rpb24oZSl7dGhyb3cicC50cmFuc2Zvcm0gaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gM0QgbW9kZSJ9LGlyLnByb3RvdHlwZS5wdXNoTWF0cml4PWZ1bmN0aW9uKCl7cnQubG9hZCh0dCksaXQubG9hZChudCksTigpfSxzci5wcm90b3R5cGUucHVzaE1hdHJpeD1mdW5jdGlvbigpe3J0LmxvYWQodHQpLGl0LmxvYWQobnQpfSxpci5wcm90b3R5cGUucG9wTWF0cml4PWZ1bmN0aW9uKCl7dHQuc2V0KHJ0LnBvcCgpKSxudC5zZXQoaXQucG9wKCkpLEYoKX0sc3IucHJvdG90eXBlLnBvcE1hdHJpeD1mdW5jdGlvbigpe3R0LnNldChydC5wb3AoKSksbnQuc2V0KGl0LnBvcCgpKX0saXIucHJvdG90eXBlLnJlc2V0TWF0cml4PWZ1bmN0aW9uKCl7dHQucmVzZXQoKSxudC5yZXNldCgpLEFlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCl9LHNyLnByb3RvdHlwZS5yZXNldE1hdHJpeD1mdW5jdGlvbigpe3R0LnJlc2V0KCksbnQucmVzZXQoKX0scnIucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzCnR0LmFwcGx5KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdLGVbOV0sZVsxMF0sZVsxMV0sZVsxMl0sZVsxM10sZVsxNF0sZVsxNV0pLG50LmludkFwcGx5KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdLGVbOV0sZVsxMF0sZVsxMV0sZVsxMl0sZVsxM10sZVsxNF0sZVsxNV0pfSxpci5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9ZS5sZW5ndGg7dDwxNjt0KyspZVt0XT0wCmVbMTBdPWVbMTVdPTEscnIucHJvdG90eXBlLmFwcGx5TWF0cml4LmFwcGx5KHRoaXMsZSl9LHhlLnJvdGF0ZVg9ZnVuY3Rpb24oZSl7dHQucm90YXRlWChlKSxudC5pbnZSb3RhdGVYKGUpfSxpci5wcm90b3R5cGUucm90YXRlWj1mdW5jdGlvbigpe3Rocm93InJvdGF0ZVooKSBpcyBub3Qgc3VwcG9ydGVkIGluIDJEIG1vZGUuIFVzZSByb3RhdGUoZmxvYXQpIGluc3RlYWQuIn0sc3IucHJvdG90eXBlLnJvdGF0ZVo9ZnVuY3Rpb24oZSl7dHQucm90YXRlWihlKSxudC5pbnZSb3RhdGVaKGUpfSx4ZS5yb3RhdGVZPWZ1bmN0aW9uKGUpe3R0LnJvdGF0ZVkoZSksbnQuaW52Um90YXRlWShlKX0saXIucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbihlKXt0dC5yb3RhdGVaKGUpLG50LmludlJvdGF0ZVooZSksQWUucm90YXRlKGUpfSxzci5wcm90b3R5cGUucm90YXRlPWZ1bmN0aW9uKGUpe2FyZ3VtZW50cy5sZW5ndGg8ND94ZS5yb3RhdGVaKGUpOih0dC5yb3RhdGUoZSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSksbnQucm90YXRlKC1lLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKSl9LGlyLnByb3RvdHlwZS5zaGVhclg9ZnVuY3Rpb24oZSl7dHQuc2hlYXJYKGUpLEFlLnRyYW5zZm9ybSgxLDAsZSwxLDAsMCl9LHNyLnByb3RvdHlwZS5zaGVhclg9ZnVuY3Rpb24oZSl7dHQuc2hlYXJYKGUpfSxpci5wcm90b3R5cGUuc2hlYXJZPWZ1bmN0aW9uKGUpe3R0LnNoZWFyWShlKSxBZS50cmFuc2Zvcm0oMSxlLDAsMSwwLDApfSxzci5wcm90b3R5cGUuc2hlYXJZPWZ1bmN0aW9uKGUpe3R0LnNoZWFyWShlKX0seGUucHVzaFN0eWxlPWZ1bmN0aW9uKCl7TigpLHhlLnB1c2hNYXRyaXgoKQp2YXIgZT17ZG9GaWxsOmF0LGN1cnJlbnRGaWxsQ29sb3I6aHQsZG9TdHJva2U6Y3QsY3VycmVudFN0cm9rZUNvbG9yOnB0LGN1clRpbnQ6SHQsY3VyUmVjdE1vZGU6QXQsY3VyQ29sb3JNb2RlOlV0LGNvbG9yTW9kZVg6QnQsY29sb3JNb2RlWjpHdCxjb2xvck1vZGVZOiR0LGNvbG9yTW9kZUE6a3QsY3VyVGV4dEZvbnQ6bG4saG9yaXpvbnRhbFRleHRBbGlnbm1lbnQ6SnQsdmVydGljYWxUZXh0QWxpZ25tZW50OmVuLHRleHRNb2RlOnRuLGN1ckZvbnROYW1lOm5uLGN1clRleHRTaXplOnJuLGN1clRleHRBc2NlbnQ6c24sY3VyVGV4dERlc2NlbnQ6b24sY3VyVGV4dExlYWRpbmc6YW59CiRuLnB1c2goZSl9LHhlLnBvcFN0eWxlPWZ1bmN0aW9uKCl7dmFyIGU9JG4ucG9wKCkKaWYoIWUpdGhyb3ciVG9vIG1hbnkgcG9wU3R5bGUoKSB3aXRob3V0IGVub3VnaCBwdXNoU3R5bGUoKSIKRigpLHhlLnBvcE1hdHJpeCgpLGF0PWUuZG9GaWxsLGh0PWUuY3VycmVudEZpbGxDb2xvcixjdD1lLmRvU3Ryb2tlLHB0PWUuY3VycmVudFN0cm9rZUNvbG9yLEh0PWUuY3VyVGludCxBdD1lLmN1clJlY3RNb2RlLFV0PWUuY3VyQ29sb3JNb2RlLEJ0PWUuY29sb3JNb2RlWCxHdD1lLmNvbG9yTW9kZVosJHQ9ZS5jb2xvck1vZGVZLGt0PWUuY29sb3JNb2RlQSxsbj1lLmN1clRleHRGb250LG5uPWUuY3VyRm9udE5hbWUscm49ZS5jdXJUZXh0U2l6ZSxKdD1lLmhvcml6b250YWxUZXh0QWxpZ25tZW50LGVuPWUudmVydGljYWxUZXh0QWxpZ25tZW50LHRuPWUudGV4dE1vZGUsc249ZS5jdXJUZXh0QXNjZW50LG9uPWUuY3VyVGV4dERlc2NlbnQsYW49ZS5jdXJUZXh0TGVhZGluZ30seGUueWVhcj1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKX0seGUubW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldE1vbnRoKCkrMX0seGUuZGF5PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXREYXRlKCl9LHhlLmhvdXI9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldEhvdXJzKCl9LHhlLm1pbnV0ZT1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0TWludXRlcygpfSx4ZS5zZWNvbmQ9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFNlY29uZHMoKX0seGUubWlsbGlzPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCktWXR9LGlyLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtrKCksQWUubGluZVdpZHRoPWd0CnZhciBlPXhlLnBtb3VzZVgsdD14ZS5wbW91c2VZCnhlLnBtb3VzZVg9VnQseGUucG1vdXNlWT16dCxOKCkseGUuZHJhdygpLEYoKSxWdD14ZS5tb3VzZVgsenQ9eGUubW91c2VZLHhlLnBtb3VzZVg9ZSx4ZS5wbW91c2VZPXR9LHNyLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtrKCkKdmFyIGU9eGUucG1vdXNlWCx0PXhlLnBtb3VzZVkKeGUucG1vdXNlWD1WdCx4ZS5wbW91c2VZPXp0LEFlLmNsZWFyKEFlLkRFUFRIX0JVRkZFUl9CSVQpLFd0PXthdHRyaWJ1dGVzOnt9LGxvY2F0aW9uczp7fX0seGUubm9MaWdodHMoKSx4ZS5saWdodEZhbGxvZmYoMSwwLDApLHhlLnNoaW5pbmVzcygxKSx4ZS5hbWJpZW50KDI1NSwyNTUsMjU1KSx4ZS5zcGVjdWxhcigwLDAsMCkseGUuZW1pc3NpdmUoMCwwLDApLHhlLmNhbWVyYSgpLHhlLmRyYXcoKSxWdD14ZS5tb3VzZVgsenQ9eGUubW91c2VZLHhlLnBtb3VzZVg9ZSx4ZS5wbW91c2VZPXR9LHhlLm5vTG9vcD1mdW5jdGlvbigpe3l0PSExLGR0PSExLGNsZWFySW50ZXJ2YWwoeHQpLGJlLm9uUGF1c2UoKX0seGUubG9vcD1mdW5jdGlvbigpe2R0fHwoanQ9RGF0ZS5ub3coKSxLdD0wLHh0PWwuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0cnl7YmUub25GcmFtZVN0YXJ0KCkseGUucmVkcmF3KCksYmUub25GcmFtZUVuZCgpfWNhdGNoKGUpe3Rocm93IGwuY2xlYXJJbnRlcnZhbCh4dCksZX19LE10KSx5dD0hMCxkdD0hMCxiZS5vbkxvb3AoKSl9LHhlLmZyYW1lUmF0ZT1mdW5jdGlvbihlKXtDdD1lLE10PTFlMy9DdCx5dCYmKHhlLm5vTG9vcCgpLHhlLmxvb3AoKSl9LHhlLmV4aXQ9ZnVuY3Rpb24oKXtsLmNsZWFySW50ZXJ2YWwoeHQpLHcoeGUuZXh0ZXJuYWxzLmNhbnZhcy5pZCksZGVsZXRlIGRlLm9ubW91c2Vkb3duCmZvcih2YXIgZSBpbiBFLmxpYilFLmxpYi5oYXNPd25Qcm9wZXJ0eShlKSYmRS5saWJbZV0uaGFzT3duUHJvcGVydHkoImRldGFjaCIpJiZFLmxpYltlXS5kZXRhY2goeGUpCmZvcih2YXIgdD15ZS5sZW5ndGg7dC0tOylBKHllW3RdKQpiZS5vbkV4aXQoKX0seGUuY3Vyc29yPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xfHwxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4ZS5QSW1hZ2Upe3ZhciBlLHQsbj1hcmd1bWVudHNbMF0KaWYoYXJndW1lbnRzLmxlbmd0aD49Myl7aWYoZT1hcmd1bWVudHNbMV0sdD1hcmd1bWVudHNbMl0sZTwwfHx0PDB8fHQ+PW4uaGVpZ2h0fHxlPj1uLndpZHRoKXRocm93InggYW5kIHkgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UifWVsc2UgZT1uLndpZHRoPj4+MSx0PW4uaGVpZ2h0Pj4+MQp2YXIgcj1uLnRvRGF0YVVSTCgpLGk9J3VybCgiJytyKyciKSAnK2UrIiAiK3QrIiwgZGVmYXVsdCIKVHQ9ZGUuc3R5bGUuY3Vyc29yPWl9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHM9YXJndW1lbnRzWzBdClR0PWRlLnN0eWxlLmN1cnNvcj1zfWVsc2UgVHQ9ZGUuc3R5bGUuY3Vyc29yPV90fSx4ZS5ub0N1cnNvcj1mdW5jdGlvbigpe1R0PWRlLnN0eWxlLmN1cnNvcj1jLk5PQ1VSU09SfSx4ZS5saW5rPWZ1bmN0aW9uKGUsbil7biE9PXQ/bC5vcGVuKGUsbik6bC5sb2NhdGlvbj1lfSx4ZS5iZWdpbkRyYXc9dSx4ZS5lbmREcmF3PXUsaXIucHJvdG90eXBlLnRvSW1hZ2VEYXRhPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBlPWUhPT10P2U6MCxuPW4hPT10P246MCxyPXIhPT10P3I6eGUud2lkdGgsaT1pIT09dD9pOnhlLmhlaWdodCxBZS5nZXRJbWFnZURhdGEoZSxuLHIsaSl9LHNyLnByb3RvdHlwZS50b0ltYWdlRGF0YT1mdW5jdGlvbihlLG4scixpKXtlPWUhPT10P2U6MCxuPW4hPT10P246MCxyPXIhPT10P3I6eGUud2lkdGgsaT1pIT09dD9pOnhlLmhlaWdodAp2YXIgcz1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG89cy5nZXRDb250ZXh0KCIyZCIpLGE9by5jcmVhdGVJbWFnZURhdGEocixpKSxsPW5ldyB5KHIqaSo0KQpBZS5yZWFkUGl4ZWxzKGUsbixyLGksQWUuUkdCQSxBZS5VTlNJR05FRF9CWVRFLGwpCmZvcih2YXIgdT0wLGM9bC5sZW5ndGgsZj1hLmRhdGE7dTxjO3UrKylmW3VdPWxbKGktMS1NYXRoLmZsb29yKHUvNC9yKSkqcio0K3UlKDQqcildCnJldHVybiBhfSx4ZS5zdGF0dXM9ZnVuY3Rpb24oZSl7bC5zdGF0dXM9ZX0seGUuYmluYXJ5PWZ1bmN0aW9uKGUsdCl7dmFyIG4KaWYodD4wKW49dAplbHNlIGlmKGUgaW5zdGFuY2VvZiBDaGFyKW49MTYsZXw9MAplbHNlIGZvcihuPTMyO24+MSYmIShlPj4+bi0xJjEpOyluLS0KZm9yKHZhciByPSIiO24+MDspcis9ZT4+Pi0tbiYxPyIxIjoiMCIKcmV0dXJuIHJ9LHhlLnVuYmluYXJ5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aC0xLG49MSxyPTA7dD49MDspe3ZhciBpPWVbdC0tXQppZigiMCIhPT1pJiYiMSIhPT1pKXRocm93InRoZSB2YWx1ZSBwYXNzZWQgaW50byB1bmJpbmFyeSB3YXMgbm90IGFuIDggYml0IGJpbmFyeSBudW1iZXIiCiIxIj09PWkmJihyKz1uKSxuPDw9MX1yZXR1cm4gcn0KdmFyIGNyPWZ1bmN0aW9uKGUsbil7bj1uPT09dHx8bnVsbD09PW4/bj04Om4sZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSkKZm9yKHZhciByPU51bWJlcihlKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyLmxlbmd0aDxuOylyPSIwIityCnJldHVybiByLmxlbmd0aD49biYmKHI9ci5zdWJzdHJpbmcoci5sZW5ndGgtbixyLmxlbmd0aCkpLHJ9CnhlLmhleD1mdW5jdGlvbihlLHQpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9ZSBpbnN0YW5jZW9mIENoYXI/NDo4KSxjcihlLHQpfSx4ZS51bmhleD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKEIoZVtuXSkpCnJldHVybiB0fXJldHVybiBCKGUpfSx4ZS5sb2FkU3RyaW5ncz1mdW5jdGlvbihlKXtpZihmW2VdKXJldHVybiBmW2VdLnNwbGl0KCJcbiIpCnZhciB0PW8oZSkKcmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHwiIj09PXQ/W106KHQ9dC5yZXBsYWNlKC8oXHJcbj8pL2csIlxuIikucmVwbGFjZSgvXG4kLywiIiksdC5zcGxpdCgiXG4iKSl9LHhlLnNhdmVTdHJpbmdzPWZ1bmN0aW9uKGUsdCl7ZltlXT10LmpvaW4oIlxuIil9LHhlLmxvYWRCeXRlcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9byhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2godC5jaGFyQ29kZUF0KHIpKQpyZXR1cm4gbn0seGUubWF0Y2hBbGw9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scj1bXSxpPW5ldyBSZWdFeHAodCwiZyIpO251bGwhPT0obj1pLmV4ZWMoZSkpOylyLnB1c2gobiksMD09PW5bMF0ubGVuZ3RoJiYrK2kubGFzdEluZGV4CnJldHVybiByLmxlbmd0aD4wP3I6bnVsbH0seGUubWF0Y2g9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXRjaCh0KX0KeGUucHJpbnRsbj1mdW5jdGlvbigpe0UubG9nZ2VyLnByaW50bG4uYXBwbHkoRS5sb2dnZXIsYXJndW1lbnRzKX0seGUucHJpbnQ9ZnVuY3Rpb24oKXtFLmxvZ2dlci5wcmludC5hcHBseShFLmxvZ2dlcixhcmd1bWVudHMpfSx4ZS5zdHI9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChlW25dLnRvU3RyaW5nKCkrIiIpCnJldHVybiB0fXJldHVybiBlLnRvU3RyaW5nKCkrIiJ9LHhlLnBhcnNlQm9vbGVhbj1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKCQoZVtuXSkpCnJldHVybiB0fXJldHVybiAkKGUpfSx4ZS5wYXJzZUJ5dGU9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCgwLSgxMjgmZVtuXSl8MTI3JmVbbl0pCnJldHVybiB0fXJldHVybiAwLSgxMjgmZSl8MTI3JmV9LHhlLnBhcnNlQ2hhcj1mdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzUmZSkpCmlmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2gobmV3IENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzNSZlW25dKSkpCnJldHVybiB0fXRocm93ImNoYXIoKSBtYXkgcmVjZWl2ZSBvbmx5IG9uZSBhcmd1bWVudCBvZiB0eXBlIGludCwgYnl0ZSwgaW50W10sIG9yIGJ5dGVbXS4ifSx4ZS5wYXJzZUZsb2F0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goRyhlW25dKSkKcmV0dXJuIHR9cmV0dXJuIEcoZSl9LHhlLnBhcnNlSW50PWZ1bmN0aW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIG49W10scj0wO3I8ZS5sZW5ndGg7cisrKSJzdHJpbmciIT10eXBlb2YgZVtyXXx8L15ccypbK1wtXT9cZCtccyokLy50ZXN0KGVbcl0pP24ucHVzaChWKGVbcl0sdCkpOm4ucHVzaCgwKQpyZXR1cm4gbn1yZXR1cm4gVihlLHQpfSx4ZS5fX2ludF9jYXN0PWZ1bmN0aW9uKGUpe3JldHVybiAwfGV9LHhlLl9faW5zdGFuY2VvZj1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IkZ1bmN0aW9uIGlzIGV4cGVjdGVkIGFzIHR5cGUgYXJndW1lbnQgZm9yIGluc3RhbmNlb2Ygb3BlcmF0b3IiCmlmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdD09PU9iamVjdHx8dD09PVN0cmluZwppZihlIGluc3RhbmNlb2YgdClyZXR1cm4hMAppZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiExCnZhciBuPWUuY29uc3RydWN0b3IKaWYodC4kaXNJbnRlcmZhY2Upe2Zvcih2YXIgcj1bXTtuOyluLiRpbnRlcmZhY2VzJiYocj1yLmNvbmNhdChuLiRpbnRlcmZhY2VzKSksbj1uLiRiYXNlCmZvcig7ci5sZW5ndGg+MDspe3ZhciBpPXIuc2hpZnQoKQppZihpPT09dClyZXR1cm4hMAppLiRpbnRlcmZhY2VzJiYocj1yLmNvbmNhdChpLiRpbnRlcmZhY2VzKSl9cmV0dXJuITF9Zm9yKDtuLmhhc093blByb3BlcnR5KCIkYmFzZSIpOylpZihuPW4uJGJhc2Usbj09PXQpcmV0dXJuITAKcmV0dXJuITF9LHJyLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKGUsdCxuKXtjdCYmeGUuc3Ryb2tlKDApLGF0JiZ4ZS5maWxsKDI1NSkKdmFyIHI9e2ZpbGxTdHlsZTpBZS5maWxsU3R5bGUsc3Ryb2tlU3R5bGU6QWUuc3Ryb2tlU3R5bGUsbGluZUNhcDpBZS5saW5lQ2FwLGxpbmVKb2luOkFlLmxpbmVKb2lufQpkZS5zdHlsZS5sZW5ndGg+MCYmKGRlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpLGRlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKSksZGUud2lkdGg9eGUud2lkdGg9ZXx8MTAwLGRlLmhlaWdodD14ZS5oZWlnaHQ9dHx8MTAwCmZvcih2YXIgaSBpbiByKXIuaGFzT3duUHJvcGVydHkoaSkmJihBZVtpXT1yW2ldKQp4ZS50ZXh0Rm9udChsbikseGUuYmFja2dyb3VuZCgpLGNuPU1hdGgubWF4KDFlMyxlKnQqLjA1KSx4ZS5leHRlcm5hbHMuY29udGV4dD1BZQpmb3IodmFyIHM9MDtzPGMuU0lOQ09TX0xFTkdUSDtzKyspYm5bc109eGUuc2luKHMqKGMuUEkvMTgwKSouNSksd25bc109eGUuY29zKHMqKGMuUEkvMTgwKSouNSl9LGlyLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKGUsbixyKXtBZT09PXQmJihBZT1kZS5nZXRDb250ZXh0KCIyZCIpLHJ0PW5ldyB1cixpdD1uZXcgdXIsdHQ9bmV3IGxyLG50PW5ldyBscikscnIucHJvdG90eXBlLnNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzci5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3ZhciBlPSExCnJldHVybiBmdW5jdGlvbih0LG4scil7ZnVuY3Rpb24gaShlKXtmb3IodmFyIHQsbj1bImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmdsIiwid2Via2l0LTNkIl0scj0wLGk9bi5sZW5ndGg7cjxpJiYhKHQ9ZS5nZXRDb250ZXh0KG5bcl0se2FudGlhbGlhczohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITB9KSk7cisrKTtyZXR1cm4gdH1pZihlKXRocm93Ik11bHRpcGxlIGNhbGxzIHRvIHNpemUoKSBmb3IgM0QgcmVuZGVycyBhcmUgbm90IGFsbG93ZWQuIgplPSEwCnRyeXtkZS53aWR0aD14ZS53aWR0aD10fHwxMDAsZGUuaGVpZ2h0PXhlLmhlaWdodD1ufHwxMDAsQWU9aShkZSksWGU9QWUuY3JlYXRlVGV4dHVyZSgpLFllPUFlLmNyZWF0ZVRleHR1cmUoKX1jYXRjaChlKXtFLmRlYnVnKGUpfWlmKCFBZSl0aHJvdyJXZWJHTCBjb250ZXh0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyLiIKQWUudmlld3BvcnQoMCwwLGRlLndpZHRoLGRlLmhlaWdodCksQWUuZW5hYmxlKEFlLkRFUFRIX1RFU1QpLEFlLmVuYWJsZShBZS5CTEVORCksQWUuYmxlbmRGdW5jKEFlLlNSQ19BTFBIQSxBZS5PTkVfTUlOVVNfU1JDX0FMUEhBKSxMZT1RbihBZSxqbixLbiksSWU9UW4oQWUsWG4sWW4pLHhlLnN0cm9rZVdlaWdodCgxKSxSZT1RbihBZSxabixxbiksQWUudXNlUHJvZ3JhbShSZSksTSgidXNpbmdUZXh0dXJlM2QiLFJlLCJ1c2luZ1RleHR1cmUiLFF0KSx4ZS5saWdodEZhbGxvZmYoMSwwLDApLHhlLnNoaW5pbmVzcygxKSx4ZS5hbWJpZW50KDI1NSwyNTUsMjU1KSx4ZS5zcGVjdWxhcigwLDAsMCkseGUuZW1pc3NpdmUoMCwwLDApLERlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLERlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixHbixBZS5TVEFUSUNfRFJBVyksT2U9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsT2UpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLHpuLEFlLlNUQVRJQ19EUkFXKSxOZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixOZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsVm4sQWUuU1RBVElDX0RSQVcpLEZlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLEZlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixVbixBZS5TVEFUSUNfRFJBVyksa2U9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsa2UpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLEhuLEFlLlNUQVRJQ19EUkFXKSxCZT1BZS5jcmVhdGVCdWZmZXIoKSwkZT1BZS5jcmVhdGVCdWZmZXIoKSxHZT1BZS5jcmVhdGVCdWZmZXIoKSxWZT1BZS5jcmVhdGVCdWZmZXIoKSx6ZT1BZS5jcmVhdGVCdWZmZXIoKSxIZT1BZS5jcmVhdGVCdWZmZXIoKSxVZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixVZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoWzAsMCwwXSksQWUuU1RBVElDX0RSQVcpLGplPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLGplKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwXSksQWUuU1RBVElDX0RSQVcpLEtlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLEtlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhbMCwwLDEsMCwxLDEsMCwxXSksQWUuU1RBVElDX0RSQVcpLFdlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsV2UpLEFlLmJ1ZmZlckRhdGEoQWUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbmV3IHYoWzAsMSwyLDIsMywwXSksQWUuU1RBVElDX0RSQVcpLEplPW5ldyBocixldD1uZXcgaHIsdHQ9bmV3IGhyLG50PW5ldyBocixvdD1uZXcgaHIseGUuY2FtZXJhKCkseGUucGVyc3BlY3RpdmUoKSxydD1uZXcgdXIsaXQ9bmV3IHVyLFNlPW5ldyBocixQZT1uZXcgaHIsQ2U9bmV3IGhyLE1lPW5ldyBocixUZT1uZXcgaHIsX2U9bmV3IGhyLF9lLnNldCgtMSwzLC0zLDEsMywtNiwzLDAsLTMsMywwLDAsMSwwLDAsMCkscnIucHJvdG90eXBlLnNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxpci5wcm90b3R5cGUuYW1iaWVudExpZ2h0PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmFtYmllbnRMaWdodD1mdW5jdGlvbihlLHQsbixyLGkscyl7aWYoZ249PT1jLk1BWF9MSUdIVFMpdGhyb3ciY2FuIG9ubHkgY3JlYXRlICIrYy5NQVhfTElHSFRTKyIgbGlnaHRzIgp2YXIgbz1uZXcgUFZlY3RvcihyLGkscyksYT1uZXcgaHIKYS5zY2FsZSgxLC0xLDEpLGEuYXBwbHkodHQuYXJyYXkoKSksYS5tdWx0KG8sbykKdmFyIGw9TChlLHQsbiwwKSxoPVsoKGwmYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgobCZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChsJmMuQkxVRV9NQVNLKS8yNTVdCkFlLnVzZVByb2dyYW0oUmUpLEMoInVMaWdodHMuY29sb3IuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5jb2xvciIsaCksQygidUxpZ2h0cy5wb3NpdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnBvc2l0aW9uIixvLmFycmF5KCkpLE0oInVMaWdodHMudHlwZS4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnR5cGUiLDApLE0oInVMaWdodENvdW50M2QiLFJlLCJ1TGlnaHRDb3VudCIsKytnbil9LGlyLnByb3RvdHlwZS5kaXJlY3Rpb25hbExpZ2h0PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmRpcmVjdGlvbmFsTGlnaHQ9ZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKGduPT09Yy5NQVhfTElHSFRTKXRocm93ImNhbiBvbmx5IGNyZWF0ZSAiK2MuTUFYX0xJR0hUUysiIGxpZ2h0cyIKQWUudXNlUHJvZ3JhbShSZSkKdmFyIG89bmV3IGhyCm8uc2NhbGUoMSwtMSwxKSxvLmFwcGx5KHR0LmFycmF5KCkpLG89by5hcnJheSgpCnZhciBhPVtvWzBdKnIrb1s0XSppK29bOF0qcyxvWzFdKnIrb1s1XSppK29bOV0qcyxvWzJdKnIrb1s2XSppK29bMTBdKnNdLGw9TChlLHQsbiwwKSxoPVsoKGwmYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgobCZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChsJmMuQkxVRV9NQVNLKS8yNTVdCkMoInVMaWdodHMuY29sb3IuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5jb2xvciIsaCksQygidUxpZ2h0cy5wb3NpdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnBvc2l0aW9uIixhKSxNKCJ1TGlnaHRzLnR5cGUuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi50eXBlIiwxKSxNKCJ1TGlnaHRDb3VudDNkIixSZSwidUxpZ2h0Q291bnQiLCsrZ24pfSxpci5wcm90b3R5cGUubGlnaHRGYWxsb2ZmPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmxpZ2h0RmFsbG9mZj1mdW5jdGlvbihlLHQsbil7QWUudXNlUHJvZ3JhbShSZSksQygidUZhbGxvZmYzZCIsUmUsInVGYWxsb2ZmIixbZSx0LG5dKX0saXIucHJvdG90eXBlLmxpZ2h0U3BlY3VsYXI9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUubGlnaHRTcGVjdWxhcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9TChlLHQsbiwwKSxpPVsoKHImYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgociZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChyJmMuQkxVRV9NQVNLKS8yNTVdCkFlLnVzZVByb2dyYW0oUmUpLEMoInVTcGVjdWxhcjNkIixSZSwidVNwZWN1bGFyIixpKX0seGUubGlnaHRzPWZ1bmN0aW9uKCl7eGUuYW1iaWVudExpZ2h0KDEyOCwxMjgsMTI4KSx4ZS5kaXJlY3Rpb25hbExpZ2h0KDEyOCwxMjgsMTI4LDAsMCwtMSkseGUubGlnaHRGYWxsb2ZmKDEsMCwwKSx4ZS5saWdodFNwZWN1bGFyKDAsMCwwKX0saXIucHJvdG90eXBlLnBvaW50TGlnaHQ9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUucG9pbnRMaWdodD1mdW5jdGlvbihlLHQsbixyLGkscyl7aWYoZ249PT1jLk1BWF9MSUdIVFMpdGhyb3ciY2FuIG9ubHkgY3JlYXRlICIrYy5NQVhfTElHSFRTKyIgbGlnaHRzIgp2YXIgbz1uZXcgUFZlY3RvcihyLGkscyksYT1uZXcgaHIKYS5zY2FsZSgxLC0xLDEpLGEuYXBwbHkodHQuYXJyYXkoKSksYS5tdWx0KG8sbykKdmFyIGw9TChlLHQsbiwwKSxoPVsoKGwmYy5SRURfTUFTSyk+Pj4xNikvMjU1LCgobCZjLkdSRUVOX01BU0spPj4+OCkvMjU1LChsJmMuQkxVRV9NQVNLKS8yNTVdCkFlLnVzZVByb2dyYW0oUmUpLEMoInVMaWdodHMuY29sb3IuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5jb2xvciIsaCksQygidUxpZ2h0cy5wb3NpdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnBvc2l0aW9uIixvLmFycmF5KCkpLE0oInVMaWdodHMudHlwZS4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnR5cGUiLDIpLE0oInVMaWdodENvdW50M2QiLFJlLCJ1TGlnaHRDb3VudCIsKytnbil9LGlyLnByb3RvdHlwZS5ub0xpZ2h0cz1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5ub0xpZ2h0cz1mdW5jdGlvbigpe2duPTAsQWUudXNlUHJvZ3JhbShSZSksTSgidUxpZ2h0Q291bnQzZCIsUmUsInVMaWdodENvdW50Iixnbil9LGlyLnByb3RvdHlwZS5zcG90TGlnaHQ9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuc3BvdExpZ2h0PWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSxsLGgsdSl7aWYoZ249PT1jLk1BWF9MSUdIVFMpdGhyb3ciY2FuIG9ubHkgY3JlYXRlICIrYy5NQVhfTElHSFRTKyIgbGlnaHRzIgpBZS51c2VQcm9ncmFtKFJlKQp2YXIgZj1uZXcgUFZlY3RvcihyLGkscykscD1uZXcgaHIKcC5zY2FsZSgxLC0xLDEpLHAuYXBwbHkodHQuYXJyYXkoKSkscC5tdWx0KGYsZikscD1wLmFycmF5KCkKdmFyIG09W3BbMF0qbytwWzRdKmErcFs4XSpsLHBbMV0qbytwWzVdKmErcFs5XSpsLHBbMl0qbytwWzZdKmErcFsxMF0qbF0sZz1MKGUsdCxuLDApLGQ9WygoZyZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChnJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKGcmYy5CTFVFX01BU0spLzI1NV0KQygidUxpZ2h0cy5jb2xvci4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmNvbG9yIixkKSxDKCJ1TGlnaHRzLnBvc2l0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIucG9zaXRpb24iLGYuYXJyYXkoKSksQygidUxpZ2h0cy5kaXJlY3Rpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5kaXJlY3Rpb24iLG0pLEMoInVMaWdodHMuY29uY2VudHJhdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmNvbmNlbnRyYXRpb24iLHUpLEMoInVMaWdodHMuYW5nbGUuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5hbmdsZSIsaCksTSgidUxpZ2h0cy50eXBlLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIudHlwZSIsMyksTSgidUxpZ2h0Q291bnQzZCIsUmUsInVMaWdodENvdW50IiwrK2duKX0saXIucHJvdG90eXBlLmJlZ2luQ2FtZXJhPWZ1bmN0aW9uKCl7dGhyb3ciYmVnaW5DYW1lcmEoKSBpcyBub3QgYXZhaWxhYmxlIGluIDJEIG1vZGUifSxzci5wcm90b3R5cGUuYmVnaW5DYW1lcmE9ZnVuY3Rpb24oKXtpZihFbil0aHJvdyJZb3UgY2Fubm90IGNhbGwgYmVnaW5DYW1lcmEoKSBhZ2FpbiBiZWZvcmUgY2FsbGluZyBlbmRDYW1lcmEoKSIKRW49ITAsdHQ9ZXQsbnQ9SmV9LGlyLnByb3RvdHlwZS5lbmRDYW1lcmE9ZnVuY3Rpb24oKXt0aHJvdyJlbmRDYW1lcmEoKSBpcyBub3QgYXZhaWxhYmxlIGluIDJEIG1vZGUifSxzci5wcm90b3R5cGUuZW5kQ2FtZXJhPWZ1bmN0aW9uKCl7aWYoIUVuKXRocm93IllvdSBjYW5ub3QgY2FsbCBlbmRDYW1lcmEoKSBiZWZvcmUgY2FsbGluZyBiZWdpbkNhbWVyYSgpIgp0dC5zZXQoSmUpLG50LnNldChldCksRW49ITF9LHhlLmNhbWVyYT1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwsaCl7ZT09PXQmJihDbj14ZS53aWR0aC8yLE1uPXhlLmhlaWdodC8yLFRuPU1uL01hdGgudGFuKFBuLzIpLGU9Q24sbj1NbixyPVRuLGk9Q24scz1NbixvPTAsYT0wLGw9MSxoPTApCnZhciB1PW5ldyBQVmVjdG9yKGUtaSxuLXMsci1vKSxjPW5ldyBQVmVjdG9yKGEsbCxoKQp1Lm5vcm1hbGl6ZSgpCnZhciBmPVBWZWN0b3IuY3Jvc3MoYyx1KQpjPVBWZWN0b3IuY3Jvc3ModSxmKSxmLm5vcm1hbGl6ZSgpLGMubm9ybWFsaXplKCkKdmFyIHA9Zi54LG09Zi55LGc9Zi56LGQ9Yy54LHY9Yy55LHk9Yy56LHg9dS54LEE9dS55LGI9dS56CkplLnNldChwLG0sZywwLGQsdix5LDAseCxBLGIsMCwwLDAsMCwxKSxKZS50cmFuc2xhdGUoLWUsLW4sLXIpLGV0LnJlc2V0KCksZXQuaW52QXBwbHkocCxtLGcsMCxkLHYseSwwLHgsQSxiLDAsMCwwLDAsMSksZXQudHJhbnNsYXRlKGUsbixyKSx0dC5zZXQoSmUpLG50LnNldChldCl9LHhlLnBlcnNwZWN0aXZlPWZ1bmN0aW9uKGUsdCxuLHIpezA9PT1hcmd1bWVudHMubGVuZ3RoJiYoTW49ZGUuaGVpZ2h0LzIsVG49TW4vTWF0aC50YW4oUG4vMiksX249VG4vMTAsUm49MTAqVG4sTG49eGUud2lkdGgveGUuaGVpZ2h0LGU9UG4sdD1MbixuPV9uLHI9Um4pCnZhciBpLHMsbyxhCmk9bipNYXRoLnRhbihlLzIpLHM9LWksbz1pKnQsYT1zKnQseGUuZnJ1c3R1bShhLG8scyxpLG4scil9LGlyLnByb3RvdHlwZS5mcnVzdHVtPWZ1bmN0aW9uKCl7dGhyb3ciUHJvY2Vzc2luZy5qczogZnJ1c3R1bSgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMkQgbW9kZSJ9LHNyLnByb3RvdHlwZS5mcnVzdHVtPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtTbj0hMCxvdD1uZXcgaHIsb3Quc2V0KDIqaS8odC1lKSwwLCh0K2UpLyh0LWUpLDAsMCwyKmkvKHItbiksKHIrbikvKHItbiksMCwwLDAsLShzK2kpLyhzLWkpLC0oMipzKmkpLyhzLWkpLDAsMCwtMSwwKQp2YXIgbz1uZXcgaHIKby5zZXQob3QpLG8udHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShMZSksVCgicHJvamVjdGlvbjJkIixMZSwidVByb2plY3Rpb24iLCExLG8uYXJyYXkoKSksQWUudXNlUHJvZ3JhbShSZSksVCgicHJvamVjdGlvbjNkIixSZSwidVByb2plY3Rpb24iLCExLG8uYXJyYXkoKSksQWUudXNlUHJvZ3JhbShJZSksVCgidVByb2plY3Rpb25VUyIsSWUsInVQcm9qZWN0aW9uIiwhMSxvLmFycmF5KCkpfSx4ZS5vcnRobz1mdW5jdGlvbihlLHQsbixyLGkscyl7MD09PWFyZ3VtZW50cy5sZW5ndGgmJihlPTAsdD14ZS53aWR0aCxuPTAscj14ZS5oZWlnaHQsaT0tMTAscz0xMCkKdmFyIG89Mi8odC1lKSxhPTIvKHItbiksbD0tMi8ocy1pKSxoPS0odCtlKS8odC1lKSx1PS0ocituKS8oci1uKSxjPS0ocytpKS8ocy1pKQpvdD1uZXcgaHIsb3Quc2V0KG8sMCwwLGgsMCxhLDAsdSwwLDAsbCxjLDAsMCwwLDEpCnZhciBmPW5ldyBocgpmLnNldChvdCksZi50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKExlKSxUKCJwcm9qZWN0aW9uMmQiLExlLCJ1UHJvamVjdGlvbiIsITEsZi5hcnJheSgpKSxBZS51c2VQcm9ncmFtKFJlKSxUKCJwcm9qZWN0aW9uM2QiLFJlLCJ1UHJvamVjdGlvbiIsITEsZi5hcnJheSgpKSxBZS51c2VQcm9ncmFtKEllKSxUKCJ1UHJvamVjdGlvblVTIixJZSwidVByb2plY3Rpb24iLCExLGYuYXJyYXkoKSksU249ITF9LHhlLnByaW50UHJvamVjdGlvbj1mdW5jdGlvbigpe290LnByaW50KCl9LHhlLnByaW50Q2FtZXJhPWZ1bmN0aW9uKCl7SmUucHJpbnQoKX0saXIucHJvdG90eXBlLmJveD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5ib3g9ZnVuY3Rpb24oZSx0LG4pe3QmJm58fCh0PW49ZSkKdmFyIHI9bmV3IGhyCnIuc2NhbGUoZSx0LG4pCnZhciBpPW5ldyBocgppZihpLnNjYWxlKDEsLTEsMSksaS5hcHBseSh0dC5hcnJheSgpKSxpLnRyYW5zcG9zZSgpLGF0KXtpZihBZS51c2VQcm9ncmFtKFJlKSxUKCJtb2RlbDNkIixSZSwidU1vZGVsIiwhMSxyLmFycmF5KCkpLFQoInZpZXczZCIsUmUsInVWaWV3IiwhMSxpLmFycmF5KCkpLEFlLmVuYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKSxBZS5wb2x5Z29uT2Zmc2V0KDEsMSksQygiY29sb3IzZCIsUmUsInVDb2xvciIsbHQpLGduPjApe3ZhciBzPW5ldyBocgpzLnNldChpKQp2YXIgbz1uZXcgaHIKby5zZXQocikscy5tdWx0KG8pCnZhciBhPW5ldyBocgphLnNldChzKSxhLmludmVydCgpLGEudHJhbnNwb3NlKCksVCgidU5vcm1hbFRyYW5zZm9ybTNkIixSZSwidU5vcm1hbFRyYW5zZm9ybSIsITEsYS5hcnJheSgpKSxfKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIiwzLE9lKX1lbHNlIFIoImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiKQpfKCJhVmVydGV4M2QiLFJlLCJhVmVydGV4IiwzLERlKSxSKCJhQ29sb3IzZCIsUmUsImFDb2xvciIpLFIoImFUZXh0dXJlM2QiLFJlLCJhVGV4dHVyZSIpLEFlLmRyYXdBcnJheXMoQWUuVFJJQU5HTEVTLDAsR24ubGVuZ3RoLzMpLEFlLmRpc2FibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCl9Z3Q+MCYmY3QmJihBZS51c2VQcm9ncmFtKExlKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsci5hcnJheSgpKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLGkuYXJyYXkoKSksQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGZ0KSxNKCJ1SXNEcmF3aW5nVGV4dDJkIixMZSwidUlzRHJhd2luZ1RleHQiLCExKSxfKCJ2ZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsTmUpLFIoImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiKSxBZS5kcmF3QXJyYXlzKEFlLkxJTkVTLDAsVm4ubGVuZ3RoLzMpKX0KdmFyIGZyPWZ1bmN0aW9uKCl7dmFyIGUKZm9yKFFlPVtdLGU9MDtlPHZuO2UrKylRZS5wdXNoKDApLFFlLnB1c2goLTEpLFFlLnB1c2goMCksUWUucHVzaCh5bltlXSksUWUucHVzaCh4bltlXSksUWUucHVzaChBbltlXSkKUWUucHVzaCgwKSxRZS5wdXNoKC0xKSxRZS5wdXNoKDApLFFlLnB1c2goeW5bMF0pLFFlLnB1c2goeG5bMF0pLFFlLnB1c2goQW5bMF0pCnZhciB0LG4scixpPTAKZm9yKGU9MjtlPGRuO2UrKyl7dD1uPWksaSs9dm4scj1pCmZvcih2YXIgcz0wO3M8dm47cysrKVFlLnB1c2goeW5bdF0pLFFlLnB1c2goeG5bdF0pLFFlLnB1c2goQW5bdCsrXSksUWUucHVzaCh5bltyXSksUWUucHVzaCh4bltyXSksUWUucHVzaChBbltyKytdKQp0PW4scj1pLFFlLnB1c2goeW5bdF0pLFFlLnB1c2goeG5bdF0pLFFlLnB1c2goQW5bdF0pLFFlLnB1c2goeW5bcl0pLFFlLnB1c2goeG5bcl0pLFFlLnB1c2goQW5bcl0pfWZvcihlPTA7ZTx2bjtlKyspcj1pK2UsUWUucHVzaCh5bltyXSksUWUucHVzaCh4bltyXSksUWUucHVzaChBbltyXSksUWUucHVzaCgwKSxRZS5wdXNoKDEpLFFlLnB1c2goMCkKUWUucHVzaCh5bltpXSksUWUucHVzaCh4bltpXSksUWUucHVzaChBbltpXSksUWUucHVzaCgwKSxRZS5wdXNoKDEpLFFlLnB1c2goMCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsQmUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKFFlKSxBZS5TVEFUSUNfRFJBVyl9CnhlLnNwaGVyZURldGFpbD1mdW5jdGlvbihlLHQpe3ZhciBuCmlmKDE9PT1hcmd1bWVudHMubGVuZ3RoJiYoZT10PWFyZ3VtZW50c1swXSksZTwzJiYoZT0zKSx0PDImJih0PTIpLGUhPT12bnx8dCE9PWRuKXt2YXIgcj1jLlNJTkNPU19MRU5HVEgvZSxpPW5ldyBnKGUpLHM9bmV3IGcoZSkKZm9yKG49MDtuPGU7bisrKWlbbl09d25bbipyJWMuU0lOQ09TX0xFTkdUSHwwXSxzW25dPWJuW24qciVjLlNJTkNPU19MRU5HVEh8MF0KdmFyIG89ZSoodC0xKSsyLGE9MAp5bj1uZXcgZyhvKSx4bj1uZXcgZyhvKSxBbj1uZXcgZyhvKQp2YXIgbD0uNSpjLlNJTkNPU19MRU5HVEgvdCxoPWwKZm9yKG49MTtuPHQ7bisrKXtmb3IodmFyIHU9Ym5baCVjLlNJTkNPU19MRU5HVEh8MF0sZj0td25baCVjLlNJTkNPU19MRU5HVEh8MF0scD0wO3A8ZTtwKyspeW5bYV09aVtwXSp1LHhuW2FdPWYsQW5bYSsrXT1zW3BdKnUKaCs9bH12bj1lLGRuPXQsZnIoKX19LGlyLnByb3RvdHlwZS5zcGhlcmU9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuc3BoZXJlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzWzBdOyh2bjwzfHxkbjwyKSYmeGUuc3BoZXJlRGV0YWlsKDMwKQp2YXIgdD1uZXcgaHIKdC5zY2FsZShlLGUsZSkKdmFyIG49bmV3IGhyCmlmKG4uc2NhbGUoMSwtMSwxKSxuLmFwcGx5KHR0LmFycmF5KCkpLG4udHJhbnNwb3NlKCksYXQpe2lmKGduPjApe3ZhciByPW5ldyBocgpyLnNldChuKQp2YXIgaT1uZXcgaHIKaS5zZXQodCksci5tdWx0KGkpCnZhciBzPW5ldyBocgpzLnNldChyKSxzLmludmVydCgpLHMudHJhbnNwb3NlKCksVCgidU5vcm1hbFRyYW5zZm9ybTNkIixSZSwidU5vcm1hbFRyYW5zZm9ybSIsITEscy5hcnJheSgpKSxfKCJhTm9ybWFsM2QiLFJlLCJhTm9ybWFsIiwzLEJlKX1lbHNlIFIoImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiKQpBZS51c2VQcm9ncmFtKFJlKSxSKCJhVGV4dHVyZTNkIixSZSwiYVRleHR1cmUiKSxUKCJ1TW9kZWwzZCIsUmUsInVNb2RlbCIsITEsdC5hcnJheSgpKSxUKCJ1VmlldzNkIixSZSwidVZpZXciLCExLG4uYXJyYXkoKSksXygiYVZlcnRleDNkIixSZSwiYVZlcnRleCIsMyxCZSksUigiYUNvbG9yM2QiLFJlLCJhQ29sb3IiKSxBZS5lbmFibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCksQWUucG9seWdvbk9mZnNldCgxLDEpLEMoInVDb2xvcjNkIixSZSwidUNvbG9yIixsdCksQWUuZHJhd0FycmF5cyhBZS5UUklBTkdMRV9TVFJJUCwwLFFlLmxlbmd0aC8zKSxBZS5kaXNhYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfWd0PjAmJmN0JiYoQWUudXNlUHJvZ3JhbShMZSksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLHQuYXJyYXkoKSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSxuLmFycmF5KCkpLF8oImFWZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsQmUpLFIoImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiKSxDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsZnQpLE0oInVJc0RyYXdpbmdUZXh0IixMZSwidUlzRHJhd2luZ1RleHQiLCExKSxBZS5kcmF3QXJyYXlzKEFlLkxJTkVfU1RSSVAsMCxRZS5sZW5ndGgvMykpfSx4ZS5tb2RlbFg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCksaT1ldC5hcnJheSgpLHM9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxvPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sYT1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sbD1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxoPWlbMF0qcytpWzFdKm8raVsyXSphK2lbM10qbCx1PWlbMTJdKnMraVsxM10qbytpWzE0XSphK2lbMTVdKmwKcmV0dXJuIDAhPT11P2gvdTpofSx4ZS5tb2RlbFk9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCksaT1ldC5hcnJheSgpLHM9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxvPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sYT1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sbD1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxoPWlbNF0qcytpWzVdKm8raVs2XSphK2lbN10qbCx1PWlbMTJdKnMraVsxM10qbytpWzE0XSphK2lbMTVdKmwKcmV0dXJuIDAhPT11P2gvdTpofSx4ZS5tb2RlbFo9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCksaT1ldC5hcnJheSgpLHM9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxvPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sYT1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sbD1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxoPWlbOF0qcytpWzldKm8raVsxMF0qYStpWzExXSpsLHU9aVsxMl0qcytpWzEzXSpvK2lbMTRdKmEraVsxNV0qbApyZXR1cm4gMCE9PXU/aC91Omh9LGlyLnByb3RvdHlwZS5hbWJpZW50PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmFtYmllbnQ9ZnVuY3Rpb24oZSx0LG4pe0FlLnVzZVByb2dyYW0oUmUpLE0oInVVc2luZ01hdDNkIixSZSwidVVzaW5nTWF0IiwhMCkKdmFyIHI9eGUuY29sb3IoZSx0LG4pCkMoInVNYXRlcmlhbEFtYmllbnQzZCIsUmUsInVNYXRlcmlhbEFtYmllbnQiLHhlLmNvbG9yLnRvR0xBcnJheShyKS5zbGljZSgwLDMpKX0saXIucHJvdG90eXBlLmVtaXNzaXZlPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmVtaXNzaXZlPWZ1bmN0aW9uKGUsdCxuKXtBZS51c2VQcm9ncmFtKFJlKSxNKCJ1VXNpbmdNYXQzZCIsUmUsInVVc2luZ01hdCIsITApCnZhciByPXhlLmNvbG9yKGUsdCxuKQpDKCJ1TWF0ZXJpYWxFbWlzc2l2ZTNkIixSZSwidU1hdGVyaWFsRW1pc3NpdmUiLHhlLmNvbG9yLnRvR0xBcnJheShyKS5zbGljZSgwLDMpKX0saXIucHJvdG90eXBlLnNoaW5pbmVzcz1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5zaGluaW5lc3M9ZnVuY3Rpb24oZSl7QWUudXNlUHJvZ3JhbShSZSksTSgidVVzaW5nTWF0M2QiLFJlLCJ1VXNpbmdNYXQiLCEwKSxDKCJ1U2hpbmluZXNzM2QiLFJlLCJ1U2hpbmluZXNzIixlKX0saXIucHJvdG90eXBlLnNwZWN1bGFyPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLnNwZWN1bGFyPWZ1bmN0aW9uKGUsdCxuKXtBZS51c2VQcm9ncmFtKFJlKSxNKCJ1VXNpbmdNYXQzZCIsUmUsInVVc2luZ01hdCIsITApCnZhciByPXhlLmNvbG9yKGUsdCxuKQpDKCJ1TWF0ZXJpYWxTcGVjdWxhcjNkIixSZSwidU1hdGVyaWFsU3BlY3VsYXIiLHhlLmNvbG9yLnRvR0xBcnJheShyKS5zbGljZSgwLDMpKX0seGUuc2NyZWVuWD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKQppZigxNj09PXIubGVuZ3RoKXt2YXIgaT1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLHM9cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxvPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxhPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGw9b3QuYXJyYXkoKSxoPWxbMF0qaStsWzFdKnMrbFsyXSpvK2xbM10qYSx1PWxbMTJdKmkrbFsxM10qcytsWzE0XSpvK2xbMTVdKmEKcmV0dXJuIDAhPT11JiYoaC89dSkseGUud2lkdGgqKDEraCkvMn1yZXR1cm4gdHQubXVsdFgoZSx0KX0seGUuc2NyZWVuWT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKQppZigxNj09PXIubGVuZ3RoKXt2YXIgaT1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLHM9cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxvPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxhPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGw9b3QuYXJyYXkoKSxoPWxbNF0qaStsWzVdKnMrbFs2XSpvK2xbN10qYSx1PWxbMTJdKmkrbFsxM10qcytsWzE0XSpvK2xbMTVdKmEKcmV0dXJuIDAhPT11JiYoaC89dSkseGUuaGVpZ2h0KigxK2gpLzJ9cmV0dXJuIHR0Lm11bHRZKGUsdCl9LHhlLnNjcmVlblo9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXR0LmFycmF5KCkKaWYoMTYhPT1yLmxlbmd0aClyZXR1cm4gMAp2YXIgaT1vdC5hcnJheSgpLHM9clswXSplK3JbMV0qdCtyWzJdKm4rclszXSxvPXJbNF0qZStyWzVdKnQrcls2XSpuK3JbN10sYT1yWzhdKmUrcls5XSp0K3JbMTBdKm4rclsxMV0sbD1yWzEyXSplK3JbMTNdKnQrclsxNF0qbityWzE1XSxoPWlbOF0qcytpWzldKm8raVsxMF0qYStpWzExXSpsLHU9aVsxMl0qcytpWzEzXSpvK2lbMTRdKmEraVsxNV0qbApyZXR1cm4gMCE9PXUmJihoLz11KSwoaCsxKS8yfSxyci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbigpe3ZhciBlPXhlLmNvbG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKQplPT09aHQmJmF0fHwoYXQ9ITAsaHQ9ZSl9LGlyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKCl7cnIucHJvdG90eXBlLmZpbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLHV0PSEwfSxzci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbigpe3JyLnByb3RvdHlwZS5maWxsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsdD14ZS5jb2xvci50b0dMQXJyYXkoaHQpfSx4ZS5ub0ZpbGw9ZnVuY3Rpb24oKXthdD0hMX0scnIucHJvdG90eXBlLnN0cm9rZT1mdW5jdGlvbigpe3ZhciBlPXhlLmNvbG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKQplPT09cHQmJmN0fHwoY3Q9ITAscHQ9ZSl9LGlyLnByb3RvdHlwZS5zdHJva2U9ZnVuY3Rpb24oKXtyci5wcm90b3R5cGUuc3Ryb2tlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxtdD0hMH0sc3IucHJvdG90eXBlLnN0cm9rZT1mdW5jdGlvbigpe3JyLnByb3RvdHlwZS5zdHJva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGZ0PXhlLmNvbG9yLnRvR0xBcnJheShwdCl9LHhlLm5vU3Ryb2tlPWZ1bmN0aW9uKCl7Y3Q9ITF9LHJyLnByb3RvdHlwZS5zdHJva2VXZWlnaHQ9ZnVuY3Rpb24oZSl7Z3Q9ZX0saXIucHJvdG90eXBlLnN0cm9rZVdlaWdodD1mdW5jdGlvbihlKXtyci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxBZS5saW5lV2lkdGg9ZX0sc3IucHJvdG90eXBlLnN0cm9rZVdlaWdodD1mdW5jdGlvbihlKXtyci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxBZS51c2VQcm9ncmFtKExlKSxDKCJwb2ludFNpemUyZCIsTGUsInVQb2ludFNpemUiLGUpLEFlLnVzZVByb2dyYW0oSWUpLEMoInBvaW50U2l6ZVVubGl0U2hhcGUiLEllLCJ1UG9pbnRTaXplIixlKSxBZS5saW5lV2lkdGgoZSl9LHhlLnN0cm9rZUNhcD1mdW5jdGlvbihlKXt3ZS4kZW5zdXJlQ29udGV4dCgpLmxpbmVDYXA9ZX0seGUuc3Ryb2tlSm9pbj1mdW5jdGlvbihlKXt3ZS4kZW5zdXJlQ29udGV4dCgpLmxpbmVKb2luPWV9LGlyLnByb3RvdHlwZS5zbW9vdGg9ZnVuY3Rpb24oKXt2dD0hMAp2YXIgZT1kZS5zdHlsZQplLnNldFByb3BlcnR5KCJpbWFnZS1yZW5kZXJpbmciLCJvcHRpbWl6ZVF1YWxpdHkiLCJpbXBvcnRhbnQiKSxlLnNldFByb3BlcnR5KCItbXMtaW50ZXJwb2xhdGlvbi1tb2RlIiwiYmljdWJpYyIsImltcG9ydGFudCIpLEFlLmhhc093blByb3BlcnR5KCJtb3pJbWFnZVNtb290aGluZ0VuYWJsZWQiKSYmKEFlLm1vekltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCl9LHNyLnByb3RvdHlwZS5zbW9vdGg9ZnVuY3Rpb24oKXt2dD0hMH0saXIucHJvdG90eXBlLm5vU21vb3RoPWZ1bmN0aW9uKCl7dnQ9ITEKdmFyIGU9ZGUuc3R5bGUKZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIiwib3B0aW1pemVTcGVlZCIsImltcG9ydGFudCIpLGUuc2V0UHJvcGVydHkoImltYWdlLXJlbmRlcmluZyIsIi1tb3otY3Jpc3AtZWRnZXMiLCJpbXBvcnRhbnQiKSxlLnNldFByb3BlcnR5KCJpbWFnZS1yZW5kZXJpbmciLCItd2Via2l0LW9wdGltaXplLWNvbnRyYXN0IiwiaW1wb3J0YW50IiksZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIiwib3B0aW1pemUtY29udHJhc3QiLCJpbXBvcnRhbnQiKSxlLnNldFByb3BlcnR5KCItbXMtaW50ZXJwb2xhdGlvbi1tb2RlIiwibmVhcmVzdC1uZWlnaGJvciIsImltcG9ydGFudCIpLEFlLmhhc093blByb3BlcnR5KCJtb3pJbWFnZVNtb290aGluZ0VuYWJsZWQiKSYmKEFlLm1vekltYWdlU21vb3RoaW5nRW5hYmxlZD0hMSl9LHNyLnByb3RvdHlwZS5ub1Ntb290aD1mdW5jdGlvbigpe3Z0PSExfSxpci5wcm90b3R5cGUucG9pbnQ9ZnVuY3Rpb24oZSx0KXtjdCYmKHZ0fHwoZT1NYXRoLnJvdW5kKGUpLHQ9TWF0aC5yb3VuZCh0KSksQWUuZmlsbFN0eWxlPXhlLmNvbG9yLnRvU3RyaW5nKHB0KSx1dD0hMCxndD4xPyhBZS5iZWdpblBhdGgoKSxBZS5hcmMoZSx0LGd0LzIsMCxjLlRXT19QSSwhMSksQWUuZmlsbCgpKTpBZS5maWxsUmVjdChlLHQsMSwxKSl9LHNyLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGhyCnIudHJhbnNsYXRlKGUsdCxufHwwKSxyLnRyYW5zcG9zZSgpCnZhciBpPW5ldyBocgppLnNjYWxlKDEsLTEsMSksaS5hcHBseSh0dC5hcnJheSgpKSxpLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oTGUpLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSxyLmFycmF5KCkpLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsaS5hcnJheSgpKSxndD4wJiZjdCYmKEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixmdCksTSgidUlzRHJhd2luZ1RleHQyZCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMSksTSgidVNtb290aDJkIixMZSwidVNtb290aCIsdnQpLF8oImFWZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsVWUpLFIoImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiKSxBZS5kcmF3QXJyYXlzKEFlLlBPSU5UUywwLDEpKX0seGUuYmVnaW5TaGFwZT1mdW5jdGlvbihlKXtSdD1lLEx0PVtdLEluPVtdfSxpci5wcm90b3R5cGUudmVydGV4PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXQprbiYmKGtuPSExKSxyLmlzVmVydD0hMCxyWzBdPWUsclsxXT10LHJbMl09MCxyWzNdPTAscls0XT0wLHJbNV09aHQscls2XT1wdCxJbi5wdXNoKHIpLG4mJihJbltJbi5sZW5ndGgtMV0ubW92ZVRvPW4pfSxzci5wcm90b3R5cGUudmVydGV4PWZ1bmN0aW9uKGUsbixyLGkscyl7dmFyIG89W10Ka24mJihrbj0hMSksby5pc1ZlcnQ9ITAscz09PXQmJlF0JiYocz1pLGk9cixyPTApLGkhPT10JiZzIT09dCYmKHF0PT09Yy5JTUFHRSYmKGkvPVp0LndpZHRoLHMvPVp0LmhlaWdodCksaT1pPjE/MTppLGk9aTwwPzA6aSxzPXM+MT8xOnMscz1zPDA/MDpzKSxvWzBdPWUsb1sxXT1uLG9bMl09cnx8MCxvWzNdPWl8fDAsb1s0XT1zfHwwLG9bNV09bHRbMF0sb1s2XT1sdFsxXSxvWzddPWx0WzJdLG9bOF09bHRbM10sb1s5XT1mdFswXSxvWzEwXT1mdFsxXSxvWzExXT1mdFsyXSxvWzEyXT1mdFszXSxvWzEzXT13dCxvWzE0XT1FdCxvWzE1XT1TdCxJbi5wdXNoKG8pfQp2YXIgcHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgaHIKbi5zY2FsZSgxLC0xLDEpLG4uYXBwbHkodHQuYXJyYXkoKSksbi50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKEllKSxUKCJ1Vmlld1VTIixJZSwidVZpZXciLCExLG4uYXJyYXkoKSksTSgidVNtb290aFVTIixJZSwidVNtb290aCIsdnQpLF8oImFWZXJ0ZXhVUyIsSWUsImFWZXJ0ZXgiLDMsVWUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKGUpLEFlLlNUUkVBTV9EUkFXKSxfKCJhQ29sb3JVUyIsSWUsImFDb2xvciIsNCxWZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcodCksQWUuU1RSRUFNX0RSQVcpLEFlLmRyYXdBcnJheXMoQWUuUE9JTlRTLDAsZS5sZW5ndGgvMyl9LG1yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcgpyPSJMSU5FUyI9PT10P0FlLkxJTkVTOiJMSU5FX0xPT1AiPT09dD9BZS5MSU5FX0xPT1A6QWUuTElORV9TVFJJUAp2YXIgaT1uZXcgaHIKaS5zY2FsZSgxLC0xLDEpLGkuYXBwbHkodHQuYXJyYXkoKSksaS50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKEllKSxUKCJ1Vmlld1VTIixJZSwidVZpZXciLCExLGkuYXJyYXkoKSksXygiYVZlcnRleFVTIixJZSwiYVZlcnRleCIsMywkZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoZSksQWUuU1RSRUFNX0RSQVcpLF8oImFDb2xvclVTIixJZSwiYUNvbG9yIiw0LHplKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhuKSxBZS5TVFJFQU1fRFJBVyksQWUuZHJhd0FycmF5cyhyLDAsZS5sZW5ndGgvMyl9LGdyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpCmk9IlRSSUFOR0xFUyI9PT10P0FlLlRSSUFOR0xFUzoiVFJJQU5HTEVfRkFOIj09PXQ/QWUuVFJJQU5HTEVfRkFOOkFlLlRSSUFOR0xFX1NUUklQCnZhciBzPW5ldyBocgpzLnNjYWxlKDEsLTEsMSkscy5hcHBseSh0dC5hcnJheSgpKSxzLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oUmUpLFQoIm1vZGVsM2QiLFJlLCJ1TW9kZWwiLCExLFsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSksVCgidmlldzNkIixSZSwidVZpZXciLCExLHMuYXJyYXkoKSksQWUuZW5hYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLEFlLnBvbHlnb25PZmZzZXQoMSwxKSxDKCJjb2xvcjNkIixSZSwidUNvbG9yIixbLTEsMCwwLDBdKSxfKCJ2ZXJ0ZXgzZCIsUmUsImFWZXJ0ZXgiLDMsR2UpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKGUpLEFlLlNUUkVBTV9EUkFXKSxRdCYmbnVsbCE9PUh0JiZYdChuKSxfKCJhQ29sb3IzZCIsUmUsImFDb2xvciIsNCxWZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcobiksQWUuU1RSRUFNX0RSQVcpLFIoImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiKSxRdCYmKE0oInVVc2luZ1RleHR1cmUzZCIsUmUsInVVc2luZ1RleHR1cmUiLFF0KSxfKCJhVGV4dHVyZTNkIixSZSwiYVRleHR1cmUiLDIsSGUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKHIpLEFlLlNUUkVBTV9EUkFXKSksQWUuZHJhd0FycmF5cyhpLDAsZS5sZW5ndGgvMyksQWUuZGlzYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKX0KaXIucHJvdG90eXBlLmVuZFNoYXBlPWZ1bmN0aW9uKGUpe2lmKDAhPT1Jbi5sZW5ndGgpe3ZhciBuPWU9PT1jLkNMT1NFCm4mJkluLnB1c2goSW5bMF0pCnZhciByLGk9W10scz1bXSxvPVtdLGE9W10Ka249ITAKdmFyIGwsaCx1PUluLmxlbmd0aApmb3IobD0wO2w8dTtsKyspZm9yKHI9SW5bbF0saD0wO2g8MztoKyspaS5wdXNoKHJbaF0pCmZvcihsPTA7bDx1O2wrKylmb3Iocj1JbltsXSxoPTU7aDw5O2grKylzLnB1c2gocltoXSkKZm9yKGw9MDtsPHU7bCsrKWZvcihyPUluW2xdLGg9OTtoPDEzO2grKylvLnB1c2gocltoXSkKZm9yKGw9MDtsPHU7bCsrKXI9SW5bbF0sYS5wdXNoKHJbM10pLGEucHVzaChyWzRdKQppZighTm58fFJ0IT09Yy5QT0xZR09OJiZSdCE9PXQpaWYoIUZufHxSdCE9PWMuUE9MWUdPTiYmUnQhPT10KWlmKFJ0PT09Yy5QT0lOVFMpZm9yKGw9MDtsPHU7bCsrKXI9SW5bbF0sY3QmJnhlLnN0cm9rZShyWzZdKSx4ZS5wb2ludChyWzBdLHJbMV0pCmVsc2UgaWYoUnQ9PT1jLkxJTkVTKWZvcihsPTA7bCsxPHU7bCs9MilyPUluW2xdLGN0JiZ4ZS5zdHJva2UoSW5bbCsxXVs2XSkseGUubGluZShyWzBdLHJbMV0sSW5bbCsxXVswXSxJbltsKzFdWzFdKQplbHNlIGlmKFJ0PT09Yy5UUklBTkdMRVMpZm9yKGw9MDtsKzI8dTtsKz0zKXI9SW5bbF0sQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKHJbMF0sclsxXSksQWUubGluZVRvKEluW2wrMV1bMF0sSW5bbCsxXVsxXSksQWUubGluZVRvKEluW2wrMl1bMF0sSW5bbCsyXVsxXSksQWUubGluZVRvKHJbMF0sclsxXSksYXQmJih4ZS5maWxsKEluW2wrMl1bNV0pLHooKSksY3QmJih4ZS5zdHJva2UoSW5bbCsyXVs2XSksVSgpKSxBZS5jbG9zZVBhdGgoKQplbHNlIGlmKFJ0PT09Yy5UUklBTkdMRV9TVFJJUClmb3IobD0wO2wrMTx1O2wrKylyPUluW2xdLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhJbltsKzFdWzBdLEluW2wrMV1bMV0pLEFlLmxpbmVUbyhyWzBdLHJbMV0pLGN0JiZ4ZS5zdHJva2UoSW5bbCsxXVs2XSksYXQmJnhlLmZpbGwoSW5bbCsxXVs1XSksbCsyPHUmJihBZS5saW5lVG8oSW5bbCsyXVswXSxJbltsKzJdWzFdKSxjdCYmeGUuc3Ryb2tlKEluW2wrMl1bNl0pLGF0JiZ4ZS5maWxsKEluW2wrMl1bNV0pKSxIKCkKZWxzZSBpZihSdD09PWMuVFJJQU5HTEVfRkFOKXtpZih1PjIpZm9yKEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhJblswXVswXSxJblswXVsxXSksQWUubGluZVRvKEluWzFdWzBdLEluWzFdWzFdKSxBZS5saW5lVG8oSW5bMl1bMF0sSW5bMl1bMV0pLGF0JiYoeGUuZmlsbChJblsyXVs1XSkseigpKSxjdCYmKHhlLnN0cm9rZShJblsyXVs2XSksVSgpKSxBZS5jbG9zZVBhdGgoKSxsPTM7bDx1O2wrKylyPUluW2xdLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhJblswXVswXSxJblswXVsxXSksQWUubGluZVRvKEluW2wtMV1bMF0sSW5bbC0xXVsxXSksQWUubGluZVRvKHJbMF0sclsxXSksYXQmJih4ZS5maWxsKHJbNV0pLHooKSksY3QmJih4ZS5zdHJva2Uocls2XSksVSgpKSxBZS5jbG9zZVBhdGgoKX1lbHNlIGlmKFJ0PT09Yy5RVUFEUylmb3IobD0wO2wrMzx1O2wrPTQpe2ZvcihyPUluW2xdLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhyWzBdLHJbMV0pLGg9MTtoPDQ7aCsrKUFlLmxpbmVUbyhJbltsK2hdWzBdLEluW2wraF1bMV0pCkFlLmxpbmVUbyhyWzBdLHJbMV0pLGF0JiYoeGUuZmlsbChJbltsKzNdWzVdKSx6KCkpLGN0JiYoeGUuc3Ryb2tlKEluW2wrM11bNl0pLFUoKSksQWUuY2xvc2VQYXRoKCl9ZWxzZSBpZihSdD09PWMuUVVBRF9TVFJJUCl7aWYodT4zKWZvcihsPTA7bCsxPHU7bCs9MilyPUluW2xdLEFlLmJlZ2luUGF0aCgpLGwrMzx1PyhBZS5tb3ZlVG8oSW5bbCsyXVswXSxJbltsKzJdWzFdKSxBZS5saW5lVG8oclswXSxyWzFdKSxBZS5saW5lVG8oSW5bbCsxXVswXSxJbltsKzFdWzFdKSxBZS5saW5lVG8oSW5bbCszXVswXSxJbltsKzNdWzFdKSxhdCYmeGUuZmlsbChJbltsKzNdWzVdKSxjdCYmeGUuc3Ryb2tlKEluW2wrM11bNl0pKTooQWUubW92ZVRvKHJbMF0sclsxXSksQWUubGluZVRvKEluW2wrMV1bMF0sSW5bbCsxXVsxXSkpLEgoKX1lbHNle2ZvcihBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oSW5bMF1bMF0sSW5bMF1bMV0pLGw9MTtsPHU7bCsrKXI9SW5bbF0sci5pc1ZlcnQmJihyLm1vdmVUbz9BZS5tb3ZlVG8oclswXSxyWzFdKTpBZS5saW5lVG8oclswXSxyWzFdKSkKSCgpfWVsc2V7Zm9yKEFlLmJlZ2luUGF0aCgpLGw9MDtsPHU7bCsrKXI9SW5bbF0sSW5bbF0uaXNWZXJ0P0luW2xdLm1vdmVUbz9BZS5tb3ZlVG8oclswXSxyWzFdKTpBZS5saW5lVG8oclswXSxyWzFdKTpBZS5iZXppZXJDdXJ2ZVRvKEluW2xdWzBdLEluW2xdWzFdLEluW2xdWzJdLEluW2xdWzNdLEluW2xdWzRdLEluW2xdWzVdKQpIKCl9ZWxzZSBpZih1PjMpe3ZhciBmPVtdLHA9MS1JdApmb3IoQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKEluWzFdWzBdLEluWzFdWzFdKSxsPTE7bCsyPHU7bCsrKXI9SW5bbF0sZlswXT1bclswXSxyWzFdXSxmWzFdPVtyWzBdKyhwKkluW2wrMV1bMF0tcCpJbltsLTFdWzBdKS82LHJbMV0rKHAqSW5bbCsxXVsxXS1wKkluW2wtMV1bMV0pLzZdLGZbMl09W0luW2wrMV1bMF0rKHAqSW5bbF1bMF0tcCpJbltsKzJdWzBdKS82LEluW2wrMV1bMV0rKHAqSW5bbF1bMV0tcCpJbltsKzJdWzFdKS82XSxmWzNdPVtJbltsKzFdWzBdLEluW2wrMV1bMV1dLEFlLmJlemllckN1cnZlVG8oZlsxXVswXSxmWzFdWzFdLGZbMl1bMF0sZlsyXVsxXSxmWzNdWzBdLGZbM11bMV0pCkgoKX1Obj0hMSxGbj0hMSxEbj1bXSxPbj0wLG4mJkluLnBvcCgpfX0sc3IucHJvdG90eXBlLmVuZFNoYXBlPWZ1bmN0aW9uKGUpe2lmKDAhPT1Jbi5sZW5ndGgpe3ZhciBuLHI9ZT09PWMuQ0xPU0UsaT1bXSxzPVtdLG89W10sYT1bXSxsPVtdCmtuPSEwCnZhciBoLHUsZixwPUluLmxlbmd0aApmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT0wO3U8Mzt1Kyspcy5wdXNoKG5bdV0pCmZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTU7dTw5O3UrKylvLnB1c2goblt1XSkKZm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9OTt1PDEzO3UrKylhLnB1c2goblt1XSkKZm9yKGg9MDtoPHA7aCsrKW49SW5baF0sbC5wdXNoKG5bM10pLGwucHVzaChuWzRdKQppZihyKXtmb3Iocy5wdXNoKEluWzBdWzBdKSxzLnB1c2goSW5bMF1bMV0pLHMucHVzaChJblswXVsyXSksaD01O2g8OTtoKyspby5wdXNoKEluWzBdW2hdKQpmb3IoaD05O2g8MTM7aCsrKWEucHVzaChJblswXVtoXSkKbC5wdXNoKEluWzBdWzNdKSxsLnB1c2goSW5bMF1bNF0pfWlmKCFObnx8UnQhPT1jLlBPTFlHT04mJlJ0IT09dClpZighRm58fFJ0IT09Yy5QT0xZR09OJiZSdCE9PXQpe2lmKFJ0PT09Yy5QT0lOVFMpe2ZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylpLnB1c2goblt1XSkKcHIoaSxhKX1lbHNlIGlmKFJ0PT09Yy5MSU5FUyl7Zm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9MDt1PDM7dSsrKWkucHVzaChuW3VdKQpmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT01O3U8OTt1Kyspby5wdXNoKG5bdV0pCm1yKGksIkxJTkVTIixhKX1lbHNlIGlmKFJ0PT09Yy5UUklBTkdMRVMpe2lmKHA+Milmb3IoaD0wO2grMjxwO2grPTMpe2ZvcihzPVtdLGw9W10saT1bXSxvPVtdLGE9W10sdT0wO3U8Mzt1KyspZm9yKGY9MDtmPDM7ZisrKWkucHVzaChJbltoK3VdW2ZdKSxzLnB1c2goSW5baCt1XVtmXSkKZm9yKHU9MDt1PDM7dSsrKWZvcihmPTM7Zjw1O2YrKylsLnB1c2goSW5baCt1XVtmXSkKZm9yKHU9MDt1PDM7dSsrKWZvcihmPTU7Zjw5O2YrKylvLnB1c2goSW5baCt1XVtmXSksYS5wdXNoKEluW2grdV1bZis0XSkKY3QmJm1yKGksIkxJTkVfTE9PUCIsYSksKGF0fHxRdCkmJmdyKHMsIlRSSUFOR0xFUyIsbyxsKX19ZWxzZSBpZihSdD09PWMuVFJJQU5HTEVfU1RSSVApe2lmKHA+Milmb3IoaD0wO2grMjxwO2grKyl7Zm9yKGk9W10scz1bXSxhPVtdLG89W10sbD1bXSx1PTA7dTwzO3UrKylmb3IoZj0wO2Y8MztmKyspaS5wdXNoKEluW2grdV1bZl0pLHMucHVzaChJbltoK3VdW2ZdKQpmb3IodT0wO3U8Mzt1KyspZm9yKGY9MztmPDU7ZisrKWwucHVzaChJbltoK3VdW2ZdKQpmb3IodT0wO3U8Mzt1KyspZm9yKGY9NTtmPDk7ZisrKWEucHVzaChJbltoK3VdW2YrNF0pLG8ucHVzaChJbltoK3VdW2ZdKTsoYXR8fFF0KSYmZ3IocywiVFJJQU5HTEVfU1RSSVAiLG8sbCksY3QmJm1yKGksIkxJTkVfTE9PUCIsYSl9fWVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFX0ZBTil7aWYocD4yKXtmb3IoaD0wO2g8MztoKyspZm9yKG49SW5baF0sdT0wO3U8Mzt1KyspaS5wdXNoKG5bdV0pCmZvcihoPTA7aDwzO2grKylmb3Iobj1JbltoXSx1PTk7dTwxMzt1KyspYS5wdXNoKG5bdV0pCmZvcihjdCYmbXIoaSwiTElORV9MT09QIixhKSxoPTI7aCsxPHA7aCsrKXtmb3IoaT1bXSxhPVtdLGkucHVzaChJblswXVswXSksaS5wdXNoKEluWzBdWzFdKSxpLnB1c2goSW5bMF1bMl0pLGEucHVzaChJblswXVs5XSksYS5wdXNoKEluWzBdWzEwXSksYS5wdXNoKEluWzBdWzExXSksYS5wdXNoKEluWzBdWzEyXSksdT0wO3U8Mjt1KyspZm9yKGY9MDtmPDM7ZisrKWkucHVzaChJbltoK3VdW2ZdKQpmb3IodT0wO3U8Mjt1KyspZm9yKGY9OTtmPDEzO2YrKylhLnB1c2goSW5baCt1XVtmXSkKY3QmJm1yKGksIkxJTkVfU1RSSVAiLGEpfShhdHx8UXQpJiZncihzLCJUUklBTkdMRV9GQU4iLG8sbCl9fWVsc2UgaWYoUnQ9PT1jLlFVQURTKWZvcihoPTA7aCszPHA7aCs9NCl7Zm9yKGk9W10sdT0wO3U8NDt1KyspZm9yKG49SW5baCt1XSxmPTA7ZjwzO2YrKylpLnB1c2gobltmXSkKaWYoY3QmJm1yKGksIkxJTkVfTE9PUCIsYSksYXQpe2ZvcihzPVtdLG89W10sbD1bXSx1PTA7dTwzO3UrKylzLnB1c2goSW5baF1bdV0pCmZvcih1PTU7dTw5O3UrKylvLnB1c2goSW5baF1bdV0pCmZvcih1PTA7dTwzO3UrKylzLnB1c2goSW5baCsxXVt1XSkKZm9yKHU9NTt1PDk7dSsrKW8ucHVzaChJbltoKzFdW3VdKQpmb3IodT0wO3U8Mzt1Kyspcy5wdXNoKEluW2grM11bdV0pCmZvcih1PTU7dTw5O3UrKylvLnB1c2goSW5baCszXVt1XSkKZm9yKHU9MDt1PDM7dSsrKXMucHVzaChJbltoKzJdW3VdKQpmb3IodT01O3U8OTt1Kyspby5wdXNoKEluW2grMl1bdV0pClF0JiYobC5wdXNoKEluW2grMF1bM10pLGwucHVzaChJbltoKzBdWzRdKSxsLnB1c2goSW5baCsxXVszXSksbC5wdXNoKEluW2grMV1bNF0pLGwucHVzaChJbltoKzNdWzNdKSxsLnB1c2goSW5baCszXVs0XSksbC5wdXNoKEluW2grMl1bM10pLGwucHVzaChJbltoKzJdWzRdKSksZ3IocywiVFJJQU5HTEVfU1RSSVAiLG8sbCl9fWVsc2UgaWYoUnQ9PT1jLlFVQURfU1RSSVApe3ZhciBtPVtdCmlmKHA+Myl7Zm9yKGg9MDtoPDI7aCsrKWZvcihuPUluW2hdLHU9MDt1PDM7dSsrKWkucHVzaChuW3VdKQpmb3IoaD0wO2g8MjtoKyspZm9yKG49SW5baF0sdT05O3U8MTM7dSsrKWEucHVzaChuW3VdKQpmb3IobXIoaSwiTElORV9TVFJJUCIsYSkscD40JiZwJTI+MCYmKG09cy5zcGxpY2Uocy5sZW5ndGgtMyksSW4ucG9wKCkpLGg9MDtoKzM8cDtoKz0yKXtmb3IoaT1bXSxhPVtdLHU9MDt1PDM7dSsrKWkucHVzaChJbltoKzFdW3VdKQpmb3IodT0wO3U8Mzt1KyspaS5wdXNoKEluW2grM11bdV0pCmZvcih1PTA7dTwzO3UrKylpLnB1c2goSW5baCsyXVt1XSkKZm9yKHU9MDt1PDM7dSsrKWkucHVzaChJbltoKzBdW3VdKQpmb3IodT05O3U8MTM7dSsrKWEucHVzaChJbltoKzFdW3VdKQpmb3IodT05O3U8MTM7dSsrKWEucHVzaChJbltoKzNdW3VdKQpmb3IodT05O3U8MTM7dSsrKWEucHVzaChJbltoKzJdW3VdKQpmb3IodT05O3U8MTM7dSsrKWEucHVzaChJbltoKzBdW3VdKQpjdCYmbXIoaSwiTElORV9TVFJJUCIsYSl9KGF0fHxRdCkmJmdyKHMsIlRSSUFOR0xFX0xJU1QiLG8sbCl9fWVsc2UgaWYoMT09PXApe2Zvcih1PTA7dTwzO3UrKylpLnB1c2goSW5bMF1bdV0pCmZvcih1PTk7dTwxMzt1KyspYS5wdXNoKEluWzBdW3VdKQpwcihpLGEpfWVsc2V7Zm9yKGg9MDtoPHA7aCsrKXtmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylpLnB1c2goblt1XSkKZm9yKHU9NTt1PDk7dSsrKWEucHVzaChuW3VdKX1jdCYmcj9tcihpLCJMSU5FX0xPT1AiLGEpOmN0JiYhciYmbXIoaSwiTElORV9TVFJJUCIsYSksKGF0fHxRdCkmJmdyKHMsIlRSSUFOR0xFX0ZBTiIsbyxsKX1RdD0hMSxBZS51c2VQcm9ncmFtKFJlKSxNKCJ1c2luZ1RleHR1cmUzZCIsUmUsInVVc2luZ1RleHR1cmUiLFF0KX1lbHNlIGk9cyxpLnNwbGljZShpLmxlbmd0aC0zKSxhLnNwbGljZShhLmxlbmd0aC00KSxjdCYmbXIoaSxudWxsLGEpLGF0JiZncihzLCJUUklBTkdMRVMiLG8pCmVsc2UgaT1zLGN0JiZtcihpLG51bGwsYSksYXQmJmdyKHMsbnVsbCxvKQpObj0hMSxGbj0hMSxEbj1bXSxPbj0wfX0KdmFyIGRyPWZ1bmN0aW9uKGUsdCl7dmFyIG49MS9lLHI9bipuLGk9cipuCnQuc2V0KDAsMCwwLDEsaSxyLG4sMCw2KmksMipyLDAsMCw2KmksMCwwLDApfSx2cj1mdW5jdGlvbigpe0NlfHwoU2U9bmV3IGhyLENlPW5ldyBocixPdD0hMCkKdmFyIGU9SXQKU2Uuc2V0KChlLTEpLzIsKGUrMykvMiwoLTMtZSkvMiwoMS1lKS8yLDEtZSwoLTUtZSkvMixlKzIsKGUtMSkvMiwoZS0xKS8yLDAsKDEtZSkvMiwwLDAsMSwwLDApLGRyKER0LENlKSxUZXx8KFBlPW5ldyBociksUGUuc2V0KFNlKSxQZS5wcmVBcHBseShUZSksQ2UuYXBwbHkoU2UpfQppci5wcm90b3R5cGUuYmV6aWVyVmVydGV4PWZ1bmN0aW9uKCl7Rm49ITAKdmFyIGU9W10KaWYoa24pdGhyb3cidmVydGV4KCkgbXVzdCBiZSB1c2VkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGNhbGxpbmcgYmV6aWVyVmVydGV4KCkiCmZvcih2YXIgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF0KSW4ucHVzaChlKSxJbltJbi5sZW5ndGgtMV0uaXNWZXJ0PSExfSxzci5wcm90b3R5cGUuYmV6aWVyVmVydGV4PWZ1bmN0aW9uKCl7Rm49ITAKaWYoa24pdGhyb3cidmVydGV4KCkgbXVzdCBiZSB1c2VkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGNhbGxpbmcgYmV6aWVyVmVydGV4KCkiCmlmKDk9PT1hcmd1bWVudHMubGVuZ3RoKXtNZT09PXQmJihNZT1uZXcgaHIpCnZhciBlPUluLmxlbmd0aC0xCmRyKEZ0LE1lKSxNZS5hcHBseShfZSkKZm9yKHZhciBuPU1lLmFycmF5KCkscj1JbltlXVswXSxpPUluW2VdWzFdLHM9SW5bZV1bMl0sbz1uWzRdKnIrbls1XSphcmd1bWVudHNbMF0rbls2XSphcmd1bWVudHNbM10rbls3XSphcmd1bWVudHNbNl0sYT1uWzhdKnIrbls5XSphcmd1bWVudHNbMF0rblsxMF0qYXJndW1lbnRzWzNdK25bMTFdKmFyZ3VtZW50c1s2XSxsPW5bMTJdKnIrblsxM10qYXJndW1lbnRzWzBdK25bMTRdKmFyZ3VtZW50c1szXStuWzE1XSphcmd1bWVudHNbNl0saD1uWzRdKmkrbls1XSphcmd1bWVudHNbMV0rbls2XSphcmd1bWVudHNbNF0rbls3XSphcmd1bWVudHNbN10sdT1uWzhdKmkrbls5XSphcmd1bWVudHNbMV0rblsxMF0qYXJndW1lbnRzWzRdK25bMTFdKmFyZ3VtZW50c1s3XSxjPW5bMTJdKmkrblsxM10qYXJndW1lbnRzWzFdK25bMTRdKmFyZ3VtZW50c1s0XStuWzE1XSphcmd1bWVudHNbN10sZj1uWzRdKnMrbls1XSphcmd1bWVudHNbMl0rbls2XSphcmd1bWVudHNbNV0rbls3XSphcmd1bWVudHNbOF0scD1uWzhdKnMrbls5XSphcmd1bWVudHNbMl0rblsxMF0qYXJndW1lbnRzWzVdK25bMTFdKmFyZ3VtZW50c1s4XSxtPW5bMTJdKnMrblsxM10qYXJndW1lbnRzWzJdK25bMTRdKmFyZ3VtZW50c1s1XStuWzE1XSphcmd1bWVudHNbOF0sZz0wO2c8RnQ7ZysrKXIrPW8sbys9YSxhKz1sLGkrPWgsaCs9dSx1Kz1jLHMrPWYsZis9cCxwKz1tLHhlLnZlcnRleChyLGkscykKeGUudmVydGV4KGFyZ3VtZW50c1s2XSxhcmd1bWVudHNbN10sYXJndW1lbnRzWzhdKX19LHhlLnRleHR1cmU9ZnVuY3Rpb24oZSl7dmFyIHQ9d2UuJGVuc3VyZUNvbnRleHQoKQppZihlLl9fdGV4dHVyZSl0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCxlLl9fdGV4dHVyZSkKZWxzZSBpZigiY2FudmFzIj09PWUubG9jYWxOYW1lKXQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELFhlKSx0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAsdC5SR0JBLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC5nZW5lcmF0ZU1pcG1hcCh0LlRFWFRVUkVfMkQpLFp0LndpZHRoPWUud2lkdGgsWnQuaGVpZ2h0PWUuaGVpZ2h0CmVsc2V7dmFyIG4scj10LmNyZWF0ZVRleHR1cmUoKSxpPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIikscz1pLmdldENvbnRleHQoIjJkIikKaWYoZS53aWR0aCZlLndpZHRoLTE9PT0wKWkud2lkdGg9ZS53aWR0aAplbHNle2ZvcihuPTE7bjxlLndpZHRoOyluKj0yCmkud2lkdGg9bn1pZihlLmhlaWdodCZlLmhlaWdodC0xPT09MClpLmhlaWdodD1lLmhlaWdodAplbHNle2ZvcihuPTE7bjxlLmhlaWdodDspbio9MgppLmhlaWdodD1ufXMuZHJhd0ltYWdlKGUuc291cmNlSW1nLDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMCxpLndpZHRoLGkuaGVpZ2h0KSx0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCxyKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLHQuTElORUFSX01JUE1BUF9MSU5FQVIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsdC5MSU5FQVIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfVCx0LkNMQU1QX1RPX0VER0UpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfUyx0LkNMQU1QX1RPX0VER0UpLHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdC5SR0JBLHQuVU5TSUdORURfQllURSxpKSx0LmdlbmVyYXRlTWlwbWFwKHQuVEVYVFVSRV8yRCksZS5fX3RleHR1cmU9cixadC53aWR0aD1lLndpZHRoLFp0LmhlaWdodD1lLmhlaWdodH1RdD0hMCx0LnVzZVByb2dyYW0oUmUpLE0oInVzaW5nVGV4dHVyZTNkIixSZSwidVVzaW5nVGV4dHVyZSIsUXQpfSx4ZS50ZXh0dXJlTW9kZT1mdW5jdGlvbihlKXtxdD1lfQp2YXIgeXI9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhLGwsaCx1LGMpe3ZhciBmPXIscD1pLG09cyxnPUNlLmFycmF5KCksZD1nWzRdKmUrZ1s1XSpyK2dbNl0qbytnWzddKmgsdj1nWzhdKmUrZ1s5XSpyK2dbMTBdKm8rZ1sxMV0qaCx5PWdbMTJdKmUrZ1sxM10qcitnWzE0XSpvK2dbMTVdKmgseD1nWzRdKnQrZ1s1XSppK2dbNl0qYStnWzddKnUsQT1nWzhdKnQrZ1s5XSppK2dbMTBdKmErZ1sxMV0qdSxiPWdbMTJdKnQrZ1sxM10qaStnWzE0XSphK2dbMTVdKnUsdz1nWzRdKm4rZ1s1XSpzK2dbNl0qbCtnWzddKmMsRT1nWzhdKm4rZ1s5XSpzK2dbMTBdKmwrZ1sxMV0qYyxTPWdbMTJdKm4rZ1sxM10qcytnWzE0XSpsK2dbMTVdKmMKeGUudmVydGV4KGYscCxtKQpmb3IodmFyIFA9MDtQPER0O1ArKylmKz1kLGQrPXYsdis9eSxwKz14LHgrPUEsQSs9YixtKz13LHcrPUUsRSs9Uyx4ZS52ZXJ0ZXgoZixwLG0pfQppci5wcm90b3R5cGUuY3VydmVWZXJ0ZXg9ZnVuY3Rpb24oZSx0KXtObj0hMCx4ZS52ZXJ0ZXgoZSx0KX0sc3IucHJvdG90eXBlLmN1cnZlVmVydGV4PWZ1bmN0aW9uKGUsdCxuKXtObj0hMCxPdHx8dnIoKQp2YXIgcj1bXQpyWzBdPWUsclsxXT10LHJbMl09bixEbi5wdXNoKHIpLE9uKyssT24+MyYmeXIoRG5bT24tNF1bMF0sRG5bT24tNF1bMV0sRG5bT24tNF1bMl0sRG5bT24tM11bMF0sRG5bT24tM11bMV0sRG5bT24tM11bMl0sRG5bT24tMl1bMF0sRG5bT24tMl1bMV0sRG5bT24tMl1bMl0sRG5bT24tMV1bMF0sRG5bT24tMV1bMV0sRG5bT24tMV1bMl0pfSxpci5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhKXt4ZS5iZWdpblNoYXBlKCkseGUuY3VydmVWZXJ0ZXgoZSx0KSx4ZS5jdXJ2ZVZlcnRleChuLHIpLHhlLmN1cnZlVmVydGV4KGkscykseGUuY3VydmVWZXJ0ZXgobyxhKSx4ZS5lbmRTaGFwZSgpfSxzci5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsLGgsdSxjLGYpe3JldHVybiBmIT09dD8oeGUuYmVnaW5TaGFwZSgpLHhlLmN1cnZlVmVydGV4KGUsbixyKSx4ZS5jdXJ2ZVZlcnRleChpLHMsbykseGUuY3VydmVWZXJ0ZXgoYSxsLGgpLHhlLmN1cnZlVmVydGV4KHUsYyxmKSx2b2lkIHhlLmVuZFNoYXBlKCkpOih4ZS5iZWdpblNoYXBlKCkseGUuY3VydmVWZXJ0ZXgoZSxuKSx4ZS5jdXJ2ZVZlcnRleChyLGkpLHhlLmN1cnZlVmVydGV4KHMsbykseGUuY3VydmVWZXJ0ZXgoYSxsKSx2b2lkIHhlLmVuZFNoYXBlKCkpfSx4ZS5jdXJ2ZVRpZ2h0bmVzcz1mdW5jdGlvbihlKXtJdD1lfSx4ZS5jdXJ2ZURldGFpbD1mdW5jdGlvbihlKXtEdD1lLHZyKCl9LHhlLnJlY3RNb2RlPWZ1bmN0aW9uKGUpe0F0PWV9LHhlLmltYWdlTW9kZT1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSBjLkNPUk5FUjplcj1KbgpicmVhawpjYXNlIGMuQ09STkVSUzplcj10cgpicmVhawpjYXNlIGMuQ0VOVEVSOmVyPW5yCmJyZWFrCmRlZmF1bHQ6dGhyb3ciSW52YWxpZCBpbWFnZU1vZGUifX0seGUuZWxsaXBzZU1vZGU9ZnVuY3Rpb24oZSl7YnQ9ZX0seGUuYXJjPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8pe2lmKCEobjw9MHx8czxpKSl7Zm9yKGJ0PT09Yy5DT1JORVJTPyhuLT1lLHItPXQpOmJ0PT09Yy5SQURJVVM/KGUtPW4sdC09cixuPTIqbixyPTIqcik6YnQ9PT1jLkNFTlRFUiYmKGUtPW4vMix0LT1yLzIpO2k8MDspaSs9Yy5UV09fUEkscys9Yy5UV09fUEkKcy1pPmMuVFdPX1BJJiYocz1pK2MuVFdPX1BJKQp2YXIgYT1uLzIsbD1yLzIsaD1lK2EsdT10K2wsZj0xLyhhK2wpLHA9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gZnVuY3Rpb24ocyxmLHAsbSxnKXtmb3IocD0wLG09bixnPWkrcixzLmJlZ2luU2hhcGUoKSxmJiZzLnZlcnRleChlLS41LHQtLjUpO208ZztwKyssbT1wKnIrbilzLnZlcnRleChlK01hdGguY29zKG0pKmF8MCx0K01hdGguc2luKG0pKmx8MCkKbz09PWMuT1BFTiYmYXQ/cy52ZXJ0ZXgoaCtNYXRoLmNvcyhuKSphLHUrTWF0aC5zaW4obikqbCk6bz09PWMuQ0hPUkQ/cy52ZXJ0ZXgoaCtNYXRoLmNvcyhuKSphLHUrTWF0aC5zaW4obikqbCk6bz09PWMuUElFJiYocy5saW5lKGgrTWF0aC5jb3MobikqYSx1K01hdGguc2luKG4pKmwsaCx1KSxzLmxpbmUoaCx1LGgrTWF0aC5jb3MoaSkqYSx1K01hdGguc2luKGkpKmwpKSxzLmVuZFNoYXBlKGY/Yy5DTE9TRTp2b2lkIDApfX0oaCsuNSx1Ky41LGksZixzKQppZihhdCl7dmFyIG09Y3QKY3Q9ITEscCh4ZSwhMCksY3Q9bX1pZihjdCl7dmFyIGc9YXQKYXQ9ITEscCh4ZSksYXQ9Z319fSxpci5wcm90b3R5cGUubGluZT1mdW5jdGlvbihlLG4scixpKXtpZihjdCl7aWYodnR8fChlPU1hdGgucm91bmQoZSkscj1NYXRoLnJvdW5kKHIpLG49TWF0aC5yb3VuZChuKSxpPU1hdGgucm91bmQoaSkpLGU9PT1yJiZuPT09aSlyZXR1cm4gdm9pZCB4ZS5wb2ludChlLG4pCmZvcih2YXIgcz10LG89dCxhPSEwLGw9dHQuYXJyYXkoKSxoPVsxLDAsMCwwLDEsMF0sdT0wO3U8NiYmYTt1KyspYT1sW3VdPT09aFt1XQphJiYoZT09PXI/KG4+aSYmKHM9bixuPWksaT1zKSxpKyssZ3QlMj09PTEmJkFlLnRyYW5zbGF0ZSguNSwwKSk6bj09PWkmJihlPnImJihzPWUsZT1yLHI9cykscisrLGd0JTI9PT0xJiZBZS50cmFuc2xhdGUoMCwuNSkpLDE9PT1ndCYmKG89QWUubGluZUNhcCxBZS5saW5lQ2FwPSJidXR0IikpLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhlfHwwLG58fDApLEFlLmxpbmVUbyhyfHwwLGl8fDApLFUoKSxhJiYoZT09PXImJmd0JTI9PT0xP0FlLnRyYW5zbGF0ZSgtLjUsMCk6bj09PWkmJmd0JTI9PT0xJiZBZS50cmFuc2xhdGUoMCwtLjUpLDE9PT1ndCYmKEFlLmxpbmVDYXA9bykpfX0sc3IucHJvdG90eXBlLmxpbmU9ZnVuY3Rpb24oZSxuLHIsaSxzLG8pe2lmKHMhPT10JiZvIT09dHx8KG89MCxzPWksaT1yLHI9MCksZT09PWkmJm49PT1zJiZyPT09bylyZXR1cm4gdm9pZCB4ZS5wb2ludChlLG4scikKdmFyIGE9W2UsbixyLGkscyxvXSxsPW5ldyBocgpsLnNjYWxlKDEsLTEsMSksbC5hcHBseSh0dC5hcnJheSgpKSxsLnRyYW5zcG9zZSgpLGd0PjAmJmN0JiYoQWUudXNlUHJvZ3JhbShMZSksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLFsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSxsLmFycmF5KCkpLEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixmdCksTSgidUlzRHJhd2luZ1RleHQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITEpLF8oImFWZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsJGUpLFIoImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhhKSxBZS5TVFJFQU1fRFJBVyksQWUuZHJhd0FycmF5cyhBZS5MSU5FUywwLDIpKX0saXIucHJvdG90eXBlLmJlemllcj1mdW5jdGlvbigpe2lmKDghPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IllvdSBtdXN0IHVzZSA4IHBhcmFtZXRlcnMgZm9yIGJlemllcigpIGluIDJEIG1vZGUiCnhlLmJlZ2luU2hhcGUoKSx4ZS52ZXJ0ZXgoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkseGUuYmV6aWVyVmVydGV4KGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSxhcmd1bWVudHNbNl0sYXJndW1lbnRzWzddKSx4ZS5lbmRTaGFwZSgpfSxzci5wcm90b3R5cGUuYmV6aWVyPWZ1bmN0aW9uKCl7aWYoMTIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IllvdSBtdXN0IHVzZSAxMiBwYXJhbWV0ZXJzIGZvciBiZXppZXIoKSBpbiAzRCBtb2RlIgp4ZS5iZWdpblNoYXBlKCkseGUudmVydGV4KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSx4ZS5iZXppZXJWZXJ0ZXgoYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0sYXJndW1lbnRzWzZdLGFyZ3VtZW50c1s3XSxhcmd1bWVudHNbOF0sYXJndW1lbnRzWzldLGFyZ3VtZW50c1sxMF0sYXJndW1lbnRzWzExXSkseGUuZW5kU2hhcGUoKX0seGUuYmV6aWVyRGV0YWlsPWZ1bmN0aW9uKGUpe0Z0PWV9LHhlLmJlemllclBvaW50PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuKDEtaSkqKDEtaSkqKDEtaSkqZSszKigxLWkpKigxLWkpKmkqdCszKigxLWkpKmkqaSpuK2kqaSppKnJ9LHhlLmJlemllclRhbmdlbnQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gMyppKmkqKC1lKzMqdC0zKm4rcikrNippKihlLTIqdCtuKSszKigtZSt0KX0seGUuY3VydmVQb2ludD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybi41KigyKnQrKC1lK24pKmkrKDIqZS01KnQrNCpuLXIpKmkqaSsoLWUrMyp0LTMqbityKSppKmkqaSl9LHhlLmN1cnZlVGFuZ2VudD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybi41KigtZStuKzIqKDIqZS01KnQrNCpuLXIpKmkrMyooLWUrMyp0LTMqbityKSppKmkpfSx4ZS50cmlhbmdsZT1mdW5jdGlvbihlLHQsbixyLGkscyl7eGUuYmVnaW5TaGFwZShjLlRSSUFOR0xFUykseGUudmVydGV4KGUsdCwwKSx4ZS52ZXJ0ZXgobixyLDApLHhlLnZlcnRleChpLHMsMCkseGUuZW5kU2hhcGUoKX0seGUucXVhZD1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEpe3hlLmJlZ2luU2hhcGUoYy5RVUFEUykseGUudmVydGV4KGUsdCwwKSx4ZS52ZXJ0ZXgobixyLDApLHhlLnZlcnRleChpLHMsMCkseGUudmVydGV4KG8sYSwwKSx4ZS5lbmRTaGFwZSgpfQp2YXIgeHI9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsKXtsPT09dCYmKG89cyxhPXMsbD1zKQp2YXIgaD1yLzIsdT1pLzI7KHM+aHx8cz51KSYmKHM9TWF0aC5taW4oaCx1KSksKG8+aHx8bz51KSYmKG89TWF0aC5taW4oaCx1KSksKGE+aHx8YT51KSYmKGE9TWF0aC5taW4oaCx1KSksKGw+aHx8bD51KSYmKGw9TWF0aC5taW4oaCx1KSksYXQmJiFjdHx8QWUudHJhbnNsYXRlKC41LC41KSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oZStzLG4pLEFlLmxpbmVUbyhlK3ItbyxuKSxBZS5xdWFkcmF0aWNDdXJ2ZVRvKGUrcixuLGUrcixuK28pLEFlLmxpbmVUbyhlK3IsbitpLWEpLEFlLnF1YWRyYXRpY0N1cnZlVG8oZStyLG4raSxlK3ItYSxuK2kpLEFlLmxpbmVUbyhlK2wsbitpKSxBZS5xdWFkcmF0aWNDdXJ2ZVRvKGUsbitpLGUsbitpLWwpLEFlLmxpbmVUbyhlLG4rcyksQWUucXVhZHJhdGljQ3VydmVUbyhlLG4sZStzLG4pLGF0JiYhY3R8fEFlLnRyYW5zbGF0ZSgtLjUsLS41KSx6KCksVSgpfQppci5wcm90b3R5cGUucmVjdD1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwpe2lmKHI9PSIiK3J8fGk9PSIiK2kpe2lmKEF0PT09Yy5DT1JORVJTPyhyLT1lLGktPW4pOkF0PT09Yy5SQURJVVM/KHIqPTIsaSo9MixlLT1yLzIsbi09aS8yKTpBdD09PWMuQ0VOVEVSJiYoZS09ci8yLG4tPWkvMiksdnR8fChlPU1hdGgucm91bmQoZSksbj1NYXRoLnJvdW5kKG4pLHI9TWF0aC5yb3VuZChyKSxpPU1hdGgucm91bmQoaSkpLHMhPT10KXJldHVybiB2b2lkIHhyKGUsbixyLGkscyxvLGEsbCkKY3QmJmd0JTI9PT0xJiZBZS50cmFuc2xhdGUoLjUsLjUpLEFlLmJlZ2luUGF0aCgpLEFlLnJlY3QoZSxuLHIsaSkseigpLFUoKSxjdCYmZ3QlMj09PTEmJkFlLnRyYW5zbGF0ZSgtLjUsLS41KX19LHNyLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCl7aWYocyE9PXQpdGhyb3cicmVjdCgpIHdpdGggcm91bmRlZCBjb3JuZXJzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gM0QgbW9kZSIKQXQ9PT1jLkNPUk5FUlM/KHItPWUsaS09bik6QXQ9PT1jLlJBRElVUz8ocio9MixpKj0yLGUtPXIvMixuLT1pLzIpOkF0PT09Yy5DRU5URVImJihlLT1yLzIsbi09aS8yKQp2YXIgaD1uZXcgaHIKaC50cmFuc2xhdGUoZSxuLDApLGguc2NhbGUocixpLDEpLGgudHJhbnNwb3NlKCkKdmFyIHU9bmV3IGhyCmlmKHUuc2NhbGUoMSwtMSwxKSx1LmFwcGx5KHR0LmFycmF5KCkpLHUudHJhbnNwb3NlKCksZ3Q+MCYmY3QmJihBZS51c2VQcm9ncmFtKExlKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsaC5hcnJheSgpKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLHUuYXJyYXkoKSksQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGZ0KSxNKCJ1SXNEcmF3aW5nVGV4dDJkIixMZSwidUlzRHJhd2luZ1RleHQiLCExKSxfKCJhVmVydGV4MmQiLExlLCJhVmVydGV4IiwzLEZlKSxSKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiksQWUuZHJhd0FycmF5cyhBZS5MSU5FX0xPT1AsMCxVbi5sZW5ndGgvMykpLGF0KXtpZihBZS51c2VQcm9ncmFtKFJlKSxUKCJ1TW9kZWwzZCIsUmUsInVNb2RlbCIsITEsaC5hcnJheSgpKSxUKCJ1VmlldzNkIixSZSwidVZpZXciLCExLHUuYXJyYXkoKSksQWUuZW5hYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLEFlLnBvbHlnb25PZmZzZXQoMSwxKSxDKCJjb2xvcjNkIixSZSwidUNvbG9yIixsdCksZ24+MCl7dmFyIGY9bmV3IGhyCmYuc2V0KHUpCnZhciBwPW5ldyBocgpwLnNldChoKSxmLm11bHQocCkKdmFyIG09bmV3IGhyCm0uc2V0KGYpLG0uaW52ZXJ0KCksbS50cmFuc3Bvc2UoKSxUKCJ1Tm9ybWFsVHJhbnNmb3JtM2QiLFJlLCJ1Tm9ybWFsVHJhbnNmb3JtIiwhMSxtLmFycmF5KCkpLF8oImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiLDMsa2UpfWVsc2UgUigibm9ybWFsM2QiLFJlLCJhTm9ybWFsIikKXygidmVydGV4M2QiLFJlLCJhVmVydGV4IiwzLEZlKSxBZS5kcmF3QXJyYXlzKEFlLlRSSUFOR0xFX0ZBTiwwLFVuLmxlbmd0aC8zKSxBZS5kaXNhYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfX0saXIucHJvdG90eXBlLmVsbGlwc2U9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT1lfHwwLHQ9dHx8MCwhKG48PTAmJnI8PTApKWlmKGJ0PT09Yy5SQURJVVM/KG4qPTIscio9Mik6YnQ9PT1jLkNPUk5FUlM/KG4tPWUsci09dCxlKz1uLzIsdCs9ci8yKTpidD09PWMuQ09STkVSJiYoZSs9bi8yLHQrPXIvMiksbj09PXIpQWUuYmVnaW5QYXRoKCksQWUuYXJjKGUsdCxuLzIsMCxjLlRXT19QSSwhMSkseigpLFUoKQplbHNle3ZhciBpPW4vMixzPXIvMixvPS41NTIyODQ3NDk4MzA3OTMzLGE9byppLGw9bypzCnhlLmJlZ2luU2hhcGUoKSx4ZS52ZXJ0ZXgoZStpLHQpLHhlLmJlemllclZlcnRleChlK2ksdC1sLGUrYSx0LXMsZSx0LXMpLHhlLmJlemllclZlcnRleChlLWEsdC1zLGUtaSx0LWwsZS1pLHQpLHhlLmJlemllclZlcnRleChlLWksdCtsLGUtYSx0K3MsZSx0K3MpLHhlLmJlemllclZlcnRleChlK2EsdCtzLGUraSx0K2wsZStpLHQpLHhlLmVuZFNoYXBlKCl9fSxzci5wcm90b3R5cGUuZWxsaXBzZT1mdW5jdGlvbihlLHQsbixyKXtpZihlPWV8fDAsdD10fHwwLCEobjw9MCYmcjw9MCkpe2J0PT09Yy5SQURJVVM/KG4qPTIscio9Mik6YnQ9PT1jLkNPUk5FUlM/KG4tPWUsci09dCxlKz1uLzIsdCs9ci8yKTpidD09PWMuQ09STkVSJiYoZSs9bi8yLHQrPXIvMikKdmFyIGk9bi8yLHM9ci8yLG89LjU1MjI4NDc0OTgzMDc5MzMsYT1vKmksbD1vKnMKaWYoeGUuYmVnaW5TaGFwZSgpLHhlLnZlcnRleChlK2ksdCkseGUuYmV6aWVyVmVydGV4KGUraSx0LWwsMCxlK2EsdC1zLDAsZSx0LXMsMCkseGUuYmV6aWVyVmVydGV4KGUtYSx0LXMsMCxlLWksdC1sLDAsZS1pLHQsMCkseGUuYmV6aWVyVmVydGV4KGUtaSx0K2wsMCxlLWEsdCtzLDAsZSx0K3MsMCkseGUuYmV6aWVyVmVydGV4KGUrYSx0K3MsMCxlK2ksdCtsLDAsZStpLHQsMCkseGUuZW5kU2hhcGUoKSxhdCl7dmFyIGgsdSxmPTAscD0wCmZvcihoPTA7aDxJbi5sZW5ndGg7aCsrKWYrPUluW2hdWzBdLHArPUluW2hdWzFdCmYvPUluLmxlbmd0aCxwLz1Jbi5sZW5ndGgKdmFyIG09W10sZz1bXSxkPVtdCmZvcihtWzBdPWYsbVsxXT1wLG1bMl09MCxtWzNdPTAsbVs0XT0wLG1bNV09bHRbMF0sbVs2XT1sdFsxXSxtWzddPWx0WzJdLG1bOF09bHRbM10sbVs5XT1mdFswXSxtWzEwXT1mdFsxXSxtWzExXT1mdFsyXSxtWzEyXT1mdFszXSxtWzEzXT13dCxtWzE0XT1FdCxtWzE1XT1TdCxJbi51bnNoaWZ0KG0pLGg9MDtoPEluLmxlbmd0aDtoKyspe2Zvcih1PTA7dTwzO3UrKylnLnB1c2goSW5baF1bdV0pCmZvcih1PTU7dTw5O3UrKylkLnB1c2goSW5baF1bdV0pfWdyKGcsIlRSSUFOR0xFX0ZBTiIsZCl9fX0seGUubm9ybWFsPWZ1bmN0aW9uKGUsdCxuKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aHx8Im51bWJlciIhPXR5cGVvZiBlfHwibnVtYmVyIiE9dHlwZW9mIHR8fCJudW1iZXIiIT10eXBlb2Ygbil0aHJvdyJub3JtYWwoKSByZXF1aXJlcyB0aHJlZSBudW1lcmljIGFyZ3VtZW50cy4iCnd0PWUsRXQ9dCxTdD1uLDAhPT1SdCYmKFB0PT09Yy5OT1JNQUxfTU9ERV9BVVRPP1B0PWMuTk9STUFMX01PREVfU0hBUEU6UHQ9PT1jLk5PUk1BTF9NT0RFX1NIQVBFJiYoUHQ9Yy5OT1JNQUxfTU9ERV9WRVJURVgpKX0seGUuc2F2ZT1mdW5jdGlvbihlLG4pe3JldHVybiBuIT09dD9sLm9wZW4obi50b0RhdGFVUkwoKSwiX2JsYW5rIik6bC5vcGVuKHhlLmV4dGVybmFscy5jYW52YXMudG9EYXRhVVJMKCksIl9ibGFuayIpfQp2YXIgQXI9MAp4ZS5zYXZlRnJhbWU9ZnVuY3Rpb24oZSl7ZT09PXQmJihlPSJzY3JlZW4tIyMjIy5wbmciKQp2YXIgbj1lLnJlcGxhY2UoLyMrLyxmdW5jdGlvbihlKXtmb3IodmFyIHQ9IiIrQXIrKzt0Lmxlbmd0aDxlLmxlbmd0aDspdD0iMCIrdApyZXR1cm4gdH0pCnhlLnNhdmUobil9CnZhciBicj1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIiksd3I9W3QsdCx0XSxFcj1mdW5jdGlvbihlLHQsbil7aWYodGhpcy5fX2lzRGlydHk9ITEsZSBpbnN0YW5jZW9mIG0pdGhpcy5mcm9tSFRNTEltYWdlRGF0YShlKQplbHNlIGlmKHR8fG4pe3RoaXMud2lkdGg9ZXx8MSx0aGlzLmhlaWdodD10fHwxCnZhciByPXRoaXMuc291cmNlSW1nPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIikKci53aWR0aD10aGlzLndpZHRoLHIuaGVpZ2h0PXRoaXMuaGVpZ2h0CnRoaXMuaW1hZ2VEYXRhPXIuZ2V0Q29udGV4dCgiMmQiKS5jcmVhdGVJbWFnZURhdGEodGhpcy53aWR0aCx0aGlzLmhlaWdodCkKaWYodGhpcy5mb3JtYXQ9bj09PWMuQVJHQnx8bj09PWMuQUxQSEE/bjpjLlJHQix0aGlzLmZvcm1hdD09PWMuUkdCKWZvcih2YXIgaT0zLHM9dGhpcy5pbWFnZURhdGEuZGF0YSxvPXMubGVuZ3RoO2k8bztpKz00KXNbaV09MjU1CnRoaXMuX19pc0RpcnR5PSEwLHRoaXMudXBkYXRlUGl4ZWxzKCl9ZWxzZSB0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmltYWdlRGF0YT1ici5jcmVhdGVJbWFnZURhdGEoMSwxKSx0aGlzLmZvcm1hdD1jLkFSR0IKdGhpcy5waXhlbHM9WSh0aGlzKX0KRXIucHJvdG90eXBlPXtfX2lzUEltYWdlOiEwLHVwZGF0ZVBpeGVsczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc291cmNlSW1nCmUmJmUgaW5zdGFuY2VvZiBwJiZ0aGlzLl9faXNEaXJ0eSYmZS5nZXRDb250ZXh0KCIyZCIpLnB1dEltYWdlRGF0YSh0aGlzLmltYWdlRGF0YSwwLDApLHRoaXMuX19pc0RpcnR5PSExfSxmcm9tSFRNTEltYWdlRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1YKGUpCnRyeXt2YXIgbj10LmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCxlLndpZHRoLGUuaGVpZ2h0KQp0aGlzLmZyb21JbWFnZURhdGEobil9Y2F0Y2godCl7ZS53aWR0aCYmZS5oZWlnaHQmJih0aGlzLmlzUmVtb3RlPSEwLHRoaXMud2lkdGg9ZS53aWR0aCx0aGlzLmhlaWdodD1lLmhlaWdodCl9dGhpcy5zb3VyY2VJbWc9ZX0sZ2V0OmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPzI9PT1hcmd1bWVudHMubGVuZ3RoP3hlLmdldChlLHQsdGhpcyk6ND09PWFyZ3VtZW50cy5sZW5ndGg/eGUuZ2V0KGUsdCxuLHIsdGhpcyk6dm9pZCAwOnhlLmdldCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt4ZS5zZXQoZSx0LG4sdGhpcyksdGhpcy5fX2lzRGlydHk9ITB9LGJsZW5kOmZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSxsLGgpezk9PT1hcmd1bWVudHMubGVuZ3RoP3hlLmJsZW5kKHRoaXMsZSx0LG4scixpLHMsbyxhLGwsdGhpcyk6MTA9PT1hcmd1bWVudHMubGVuZ3RoJiZ4ZS5ibGVuZChlLHQsbixyLGkscyxvLGEsbCxoLHRoaXMpLGRlbGV0ZSB0aGlzLnNvdXJjZUltZ30sY29weTpmdW5jdGlvbihlLHQsbixyLGkscyxvLGEsbCl7OD09PWFyZ3VtZW50cy5sZW5ndGg/eGUuYmxlbmQodGhpcyxlLHQsbixyLGkscyxvLGEsYy5SRVBMQUNFLHRoaXMpOjk9PT1hcmd1bWVudHMubGVuZ3RoJiZ4ZS5ibGVuZChlLHQsbixyLGkscyxvLGEsbCxjLlJFUExBQ0UsdGhpcyksZGVsZXRlIHRoaXMuc291cmNlSW1nfSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXsyPT09YXJndW1lbnRzLmxlbmd0aD94ZS5maWx0ZXIoZSx0LHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZ4ZS5maWx0ZXIoZSxudWxsLHRoaXMpLGRlbGV0ZSB0aGlzLnNvdXJjZUltZ30sc2F2ZTpmdW5jdGlvbihlKXt4ZS5zYXZlKGUsdGhpcyl9LHJlc2l6ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgcmVzaXplLiIKaWYoMCE9PXRoaXMud2lkdGh8fDAhPT10aGlzLmhlaWdodCl7MD09PWUmJjAhPT10P2U9TWF0aC5mbG9vcih0aGlzLndpZHRoL3RoaXMuaGVpZ2h0KnQpOjA9PT10JiYwIT09ZSYmKHQ9TWF0aC5mbG9vcih0aGlzLmhlaWdodC90aGlzLndpZHRoKmUpKQp2YXIgbj1YKHRoaXMuaW1hZ2VEYXRhKS5jYW52YXMscj1YKG4sZSx0KS5jb250ZXh0LmdldEltYWdlRGF0YSgwLDAsZSx0KQp0aGlzLmZyb21JbWFnZURhdGEocil9fSxtYXNrOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLnRvSW1hZ2VEYXRhKCkKaWYoZSBpbnN0YW5jZW9mIEVyfHxlLl9faXNQSW1hZ2Upe2lmKGUud2lkdGghPT10aGlzLndpZHRofHxlLmhlaWdodCE9PXRoaXMuaGVpZ2h0KXRocm93Im1hc2sgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgUEltYWdlLiIKZm9yKGU9ZS50b0ltYWdlRGF0YSgpLHQ9MixuPXRoaXMud2lkdGgqdGhpcy5oZWlnaHQqNDt0PG47dCs9NClyLmRhdGFbdCsxXT1lLmRhdGFbdF19ZWxzZSBpZihlIGluc3RhbmNlb2YgQXJyYXkpe2lmKHRoaXMud2lkdGgqdGhpcy5oZWlnaHQhPT1lLmxlbmd0aCl0aHJvdyJtYXNrIGFycmF5IG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIFBJbWFnZSBwaXhlbHMgYXJyYXkuIgpmb3IodD0wLG49ZS5sZW5ndGg7dDxuOysrdClyLmRhdGFbNCp0KzNdPWVbdF19dGhpcy5mcm9tSW1hZ2VEYXRhKHIpfSxsb2FkUGl4ZWxzOnUsdG9JbWFnZURhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLmlzUmVtb3RlKXJldHVybiB0aGlzLnNvdXJjZUltZwppZighdGhpcy5fX2lzRGlydHkpcmV0dXJuIHRoaXMuaW1hZ2VEYXRhCnZhciBlPVgodGhpcy5zb3VyY2VJbWcpCnJldHVybiBlLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sdG9EYXRhVVJMOmZ1bmN0aW9uKCl7aWYodGhpcy5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBjcmVhdGUgZGF0YVVSSS4iCnZhciBlPVgodGhpcy5pbWFnZURhdGEpCnJldHVybiBlLmNhbnZhcy50b0RhdGFVUkwoKX0sZnJvbUltYWdlRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQscj1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGk9ci5nZXRDb250ZXh0KCIyZCIpCnRoaXMud2lkdGg9ci53aWR0aD10LHRoaXMuaGVpZ2h0PXIuaGVpZ2h0PW4saS5wdXRJbWFnZURhdGEoZSwwLDApLHRoaXMuZm9ybWF0PWMuQVJHQix0aGlzLmltYWdlRGF0YT1lLHRoaXMuc291cmNlSW1nPXJ9fSx4ZS5QSW1hZ2U9RXIseGUuY3JlYXRlSW1hZ2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuZXcgRXIoZSx0LG4pfSx4ZS5sb2FkSW1hZ2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByCmlmKGJlLmltYWdlQ2FjaGUuaW1hZ2VzW2VdKXJldHVybiByPW5ldyBFcihiZS5pbWFnZUNhY2hlLmltYWdlc1tlXSksci5sb2FkZWQ9ITAscgpyPW5ldyBFcgp2YXIgaT1oLmNyZWF0ZUVsZW1lbnQoImltZyIpCnJldHVybiByLnNvdXJjZUltZz1pLGkub25sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLGk9dCxzPW4KcmV0dXJuIGZ1bmN0aW9uKCl7aS5mcm9tSFRNTEltYWdlRGF0YShyKSxpLmxvYWRlZD0hMCxzJiZzKCl9fShpLHIsbiksaS5zcmM9ZSxyfSx4ZS5yZXF1ZXN0SW1hZ2U9eGUubG9hZEltYWdlLHhlLmdldD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiB2b2lkIDAhPT1pP1ooZSx0LG4scixpKTp2b2lkIDAhPT1yP1coZSx0LG4scik6dm9pZCAwIT09bj9LKGUsdCxuKTp2b2lkIDAhPT10P2ooZSx0KTp2b2lkIDAhPT1lP1ooMCwwLGUud2lkdGgsZS5oZWlnaHQsZSk6VygwLDAseGUud2lkdGgseGUuaGVpZ2h0KX0seGUuY3JlYXRlR3JhcGhpY3M9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBFCnJldHVybiByLnNpemUoZSx0LG4pLHIuYmFja2dyb3VuZCgwLDApLHJ9LHhlLnNldD1mdW5jdGlvbihlLHQsbixyKXszPT09YXJndW1lbnRzLmxlbmd0aD8ibnVtYmVyIj09dHlwZW9mIG4/ZWUoZSx0LG4pOihuIGluc3RhbmNlb2YgRXJ8fG4uX19pc1BJbWFnZSkmJnhlLmltYWdlKG4sZSx0KTo0PT09YXJndW1lbnRzLmxlbmd0aCYmdGUoZSx0LG4scil9LHhlLmltYWdlRGF0YT17fSx4ZS5waXhlbHM9e2dldExlbmd0aDpmdW5jdGlvbigpe3JldHVybiB4ZS5pbWFnZURhdGEuZGF0YS5sZW5ndGg/eGUuaW1hZ2VEYXRhLmRhdGEubGVuZ3RoLzQ6MH0sZ2V0UGl4ZWw6ZnVuY3Rpb24oZSl7dmFyIHQ9NCplLG49eGUuaW1hZ2VEYXRhLmRhdGEKcmV0dXJuIG5bdCszXTw8MjQmNDI3ODE5MDA4MHxuW3QrMF08PDE2JjE2NzExNjgwfG5bdCsxXTw8OCY2NTI4MHwyNTUmblt0KzJdfSxzZXRQaXhlbDpmdW5jdGlvbihlLHQpe3ZhciBuPTQqZSxyPXhlLmltYWdlRGF0YS5kYXRhCnJbbiswXT0oMTY3MTE2ODAmdCk+Pj4xNixyW24rMV09KDY1MjgwJnQpPj4+OCxyW24rMl09MjU1JnQscltuKzNdPSg0Mjc4MTkwMDgwJnQpPj4+MjR9LHRvQXJyYXk6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD14ZS5pbWFnZURhdGEud2lkdGgqeGUuaW1hZ2VEYXRhLmhlaWdodCxuPXhlLmltYWdlRGF0YS5kYXRhLHI9MCxpPTA7cjx0O3IrKyxpKz00KWUucHVzaChuW2krM108PDI0JjQyNzgxOTAwODB8bltpKzBdPDwxNiYxNjcxMTY4MHxuW2krMV08PDgmNjUyODB8MjU1Jm5baSsyXSkKcmV0dXJuIGV9LHNldDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspdGhpcy5zZXRQaXhlbCh0LGVbdF0pfX0seGUubG9hZFBpeGVscz1mdW5jdGlvbigpe3hlLmltYWdlRGF0YT13ZS4kZW5zdXJlQ29udGV4dCgpLmdldEltYWdlRGF0YSgwLDAseGUud2lkdGgseGUuaGVpZ2h0KX0seGUudXBkYXRlUGl4ZWxzPWZ1bmN0aW9uKCl7eGUuaW1hZ2VEYXRhJiZ3ZS4kZW5zdXJlQ29udGV4dCgpLnB1dEltYWdlRGF0YSh4ZS5pbWFnZURhdGEsMCwwKX0seGUuaGludD1mdW5jdGlvbihlKXt2YXIgdD13ZS4kZW5zdXJlQ29udGV4dCgpCmU9PT1jLkRJU0FCTEVfREVQVEhfVEVTVD8odC5kaXNhYmxlKHQuREVQVEhfVEVTVCksdC5kZXB0aE1hc2soITEpLHQuY2xlYXIodC5ERVBUSF9CVUZGRVJfQklUKSk6ZT09PWMuRU5BQkxFX0RFUFRIX1RFU1Q/KHQuZW5hYmxlKHQuREVQVEhfVEVTVCksdC5kZXB0aE1hc2soITApKTplPT09Yy5FTkFCTEVfT1BFTkdMXzJYX1NNT09USHx8ZT09PWMuRU5BQkxFX09QRU5HTF80WF9TTU9PVEg/dnQ9ITA6ZT09PWMuRElTQUJMRV9PUEVOR0xfMlhfU01PT1RIJiYodnQ9ITEpfQp2YXIgU3I9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGkKaWYoZSBpbnN0YW5jZW9mIEVyfHxlLl9faXNQSW1hZ2Upe2lmKGk9ZSwhaS5sb2FkZWQpdGhyb3ciRXJyb3IgdXNpbmcgaW1hZ2UgaW4gYmFja2dyb3VuZCgpOiBQSW1hZ2Ugbm90IGxvYWRlZC4iCmlmKGkud2lkdGghPT14ZS53aWR0aHx8aS5oZWlnaHQhPT14ZS5oZWlnaHQpdGhyb3ciQmFja2dyb3VuZCBpbWFnZSBtdXN0IGJlIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIGNhbnZhcy4ifWVsc2UgaT14ZS5jb2xvcihlLHQsbixyKQpOdD1pfQppci5wcm90b3R5cGUuYmFja2dyb3VuZD1mdW5jdGlvbihlLG4scixpKXtlIT09dCYmU3IoZSxuLHIsaSksTnQgaW5zdGFuY2VvZiBFcnx8TnQuX19pc1BJbWFnZT8oTigpLEFlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCkseGUuaW1hZ2UoTnQsMCwwKSxGKCkpOihOKCksQWUuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSx4ZS5hbHBoYShOdCkhPT1rdCYmQWUuY2xlYXJSZWN0KDAsMCx4ZS53aWR0aCx4ZS5oZWlnaHQpLEFlLmZpbGxTdHlsZT14ZS5jb2xvci50b1N0cmluZyhOdCksQWUuZmlsbFJlY3QoMCwwLHhlLndpZHRoLHhlLmhlaWdodCksdXQ9ITAsRigpKX0sc3IucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oZSx0LG4scil7YXJndW1lbnRzLmxlbmd0aD4wJiZTcihlLHQsbixyKQp2YXIgaT14ZS5jb2xvci50b0dMQXJyYXkoTnQpCkFlLmNsZWFyQ29sb3IoaVswXSxpWzFdLGlbMl0saVszXSksQWUuY2xlYXIoQWUuQ09MT1JfQlVGRkVSX0JJVHxBZS5ERVBUSF9CVUZGRVJfQklUKX0saXIucHJvdG90eXBlLmltYWdlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodD1NYXRoLnJvdW5kKHQpLG49TWF0aC5yb3VuZChuKSxlLndpZHRoPjApe3ZhciBzPShyfHxlLndpZHRoLGl8fGUuaGVpZ2h0LGVyKHR8fDAsbnx8MCxyfHxlLndpZHRoLGl8fGUuaGVpZ2h0LGFyZ3VtZW50cy5sZW5ndGg8NCkpLG89ISFlLnNvdXJjZUltZyYmbnVsbD09PUh0CmlmKG8pe3ZhciBhPWUuc291cmNlSW1nCmUuX19pc0RpcnR5JiZlLnVwZGF0ZVBpeGVscygpLEFlLmRyYXdJbWFnZShhLDAsMCxhLndpZHRoLGEuaGVpZ2h0LHMueCxzLnkscy53LHMuaCl9ZWxzZXt2YXIgbD1lLnRvSW1hZ2VEYXRhKCkKbnVsbCE9PUh0JiYoSHQobCksZS5fX2lzRGlydHk9ITApLEFlLmRyYXdJbWFnZShYKGwpLmNhbnZhcywwLDAsZS53aWR0aCxlLmhlaWdodCxzLngscy55LHMudyxzLmgpfX19LHNyLnByb3RvdHlwZS5pbWFnZT1mdW5jdGlvbihlLHQsbixyLGkpe2Uud2lkdGg+MCYmKHQ9TWF0aC5yb3VuZCh0KSxuPU1hdGgucm91bmQobikscj1yfHxlLndpZHRoLGk9aXx8ZS5oZWlnaHQseGUuYmVnaW5TaGFwZSh4ZS5RVUFEUykseGUudGV4dHVyZShlKSx4ZS52ZXJ0ZXgodCxuLDAsMCwwKSx4ZS52ZXJ0ZXgodCxuK2ksMCwwLGkpLHhlLnZlcnRleCh0K3IsbitpLDAscixpKSx4ZS52ZXJ0ZXgodCtyLG4sMCxyLDApLHhlLmVuZFNoYXBlKCkpfSx4ZS50aW50PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXhlLmNvbG9yKGUsdCxuLHIpLHM9eGUucmVkKGkpL0J0LG89eGUuZ3JlZW4oaSkvJHQsYT14ZS5ibHVlKGkpL0d0LGw9eGUuYWxwaGEoaSkva3QKSHQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuZGF0YSxuPTQqZS53aWR0aCplLmhlaWdodCxyPTA7cjxuOyl0W3IrK10qPXMsdFtyKytdKj1vLHRbcisrXSo9YSx0W3IrK10qPWx9LFh0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7KWVbdCsrXT1zLGVbdCsrXT1vLGVbdCsrXT1hLGVbdCsrXT1sfX0seGUubm9UaW50PWZ1bmN0aW9uKCl7SHQ9bnVsbCxYdD1udWxsfSx4ZS5jb3B5PWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCxoKXtoPT09dCYmKGg9bCxsPWEsYT1vLG89cyxzPWksaT1yLHI9bixuPWUsZT14ZSkseGUuYmxlbmQoZSxuLHIsaSxzLG8sYSxsLGgsYy5SRVBMQUNFKX0seGUuYmxlbmQ9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsLGgsdSxjKXtpZihlLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGJsZW5kIGltYWdlLiIKdT09PXQmJih1PWgsaD1sLGw9YSxhPW8sbz1zLHM9aSxpPXIscj1uLG49ZSxlPXhlKQp2YXIgZj1uK2kscD1yK3MsbT1vK2wsZz1hK2gsZD1jfHx4ZQpjIT09dCYmdSE9PXR8fHhlLmxvYWRQaXhlbHMoKSxlLmxvYWRQaXhlbHMoKSxlPT09eGUmJnhlLmludGVyc2VjdChuLHIsZixwLG8sYSxtLGcpP3hlLmJsaXRfcmVzaXplKHhlLmdldChuLHIsZi1uLHAtciksMCwwLGYtbi0xLHAtci0xLGQuaW1hZ2VEYXRhLmRhdGEsZC53aWR0aCxkLmhlaWdodCxvLGEsbSxnLHUpOnhlLmJsaXRfcmVzaXplKGUsbixyLGYscCxkLmltYWdlRGF0YS5kYXRhLGQud2lkdGgsZC5oZWlnaHQsbyxhLG0sZyx1KSxjPT09dCYmeGUudXBkYXRlUGl4ZWxzKCl9CnZhciBQcj1mdW5jdGlvbihlKXt2YXIgdCxuPXhlLmZsb29yKDMuNSplKQppZihuPW48MT8xOm48MjQ4P246MjQ4LHhlLnNoYXJlZC5ibHVyUmFkaXVzIT09bil7eGUuc2hhcmVkLmJsdXJSYWRpdXM9bix4ZS5zaGFyZWQuYmx1cktlcm5lbFNpemU9MSsoeGUuc2hhcmVkLmJsdXJSYWRpdXM8PDEpLHhlLnNoYXJlZC5ibHVyS2VybmVsPW5ldyBnKHhlLnNoYXJlZC5ibHVyS2VybmVsU2l6ZSkKdmFyIHI9eGUuc2hhcmVkLmJsdXJLZXJuZWwsaT14ZS5zaGFyZWQuYmx1cktlcm5lbFNpemUKeGUuc2hhcmVkLmJsdXJSYWRpdXMKZm9yKHQ9MDt0PGk7dCsrKXJbdF09MAp2YXIgcz0obi0xKSoobi0xKQpmb3IodD0xO3Q8bjt0KyspcltuK3RdPXJbbi10XT1zCnJbbl09bipufX0sQ3I9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvLGEsbCxoLHUsYyxmLHAsbSxkLHYseT10LnBpeGVscy5nZXRMZW5ndGgoKSx4PW5ldyBnKHkpLEE9bmV3IGcoeSksYj1uZXcgZyh5KSx3PW5ldyBnKHkpLEU9MApQcihlKQp2YXIgUz10LmhlaWdodCxQPXQud2lkdGgsQz14ZS5zaGFyZWQuYmx1cktlcm5lbFNpemUsTT14ZS5zaGFyZWQuYmx1clJhZGl1cyxUPXhlLnNoYXJlZC5ibHVyS2VybmVsLF89dC5pbWFnZURhdGEuZGF0YQpmb3IobT0wO208UzttKyspe2ZvcihwPTA7cDxQO3ArKyl7aWYocz1pPXI9bz1uPTAsbD1wLU0sbDwwKWY9LWwsbD0wCmVsc2V7aWYobD49UClicmVhawpmPTB9Zm9yKGQ9ZjtkPEMmJiEobD49UCk7ZCsrKXY9NCoobCtFKSxhPVRbZF0sbys9YSpfW3YrM10scis9YSpfW3ZdLGkrPWEqX1t2KzFdLHMrPWEqX1t2KzJdLG4rPWEsbCsrCmg9RStwLHdbaF09by9uLHhbaF09ci9uLEFbaF09aS9uLGJbaF09cy9ufUUrPVB9Zm9yKEU9MCx1PS1NLGM9dSpQLG09MDttPFM7bSsrKXtmb3IocD0wO3A8UDtwKyspe2lmKHM9aT1yPW89bj0wLHU8MClmPWg9LXUsbD1wCmVsc2V7aWYodT49UylicmVhawpmPTAsaD11LGw9cCtjfWZvcihkPWY7ZDxDJiYhKGg+PVMpO2QrKylhPVRbZF0sbys9YSp3W2xdLHIrPWEqeFtsXSxpKz1hKkFbbF0scys9YSpiW2xdLG4rPWEsaCsrLGwrPVAKdj00KihwK0UpLF9bdl09ci9uLF9bdisxXT1pL24sX1t2KzJdPXMvbixfW3YrM109by9ufUUrPVAsYys9UCx1Kyt9fSxNcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG8sYSxsLGgsdSxjLGYscCxtLGcsdix5LHgsQT0wLGI9dC5waXhlbHMuZ2V0TGVuZ3RoKCksdz1uZXcgZChiKQppZihlKWZvcig7QTxiOylmb3Iobj1BLHI9QSt0LndpZHRoO0E8cjspaT1zPXQucGl4ZWxzLmdldFBpeGVsKEEpLGw9QS0xLGE9QSsxLGg9QS10LndpZHRoLHU9QSt0LndpZHRoLGw8biYmKGw9QSksYT49ciYmKGE9QSksaDwwJiYoaD0wKSx1Pj1iJiYodT1BKSxwPXQucGl4ZWxzLmdldFBpeGVsKGgpLGY9dC5waXhlbHMuZ2V0UGl4ZWwobCksbT10LnBpeGVscy5nZXRQaXhlbCh1KSxjPXQucGl4ZWxzLmdldFBpeGVsKGEpLG89NzcqKGk+PjE2JjI1NSkrMTUxKihpPj44JjI1NSkrMjgqKDI1NSZpKSx2PTc3KihmPj4xNiYyNTUpKzE1MSooZj4+OCYyNTUpKzI4KigyNTUmZiksZz03NyooYz4+MTYmMjU1KSsxNTEqKGM+PjgmMjU1KSsyOCooMjU1JmMpLHk9NzcqKHA+PjE2JjI1NSkrMTUxKihwPj44JjI1NSkrMjgqKDI1NSZwKSx4PTc3KihtPj4xNiYyNTUpKzE1MSoobT4+OCYyNTUpKzI4KigyNTUmbSksdjxvJiYocz1mLG89diksZzxvJiYocz1jLG89ZykseTxvJiYocz1wLG89eSkseDxvJiYocz1tLG89eCksd1tBKytdPXMKZWxzZSBmb3IoO0E8YjspZm9yKG49QSxyPUErdC53aWR0aDtBPHI7KWk9cz10LnBpeGVscy5nZXRQaXhlbChBKSxsPUEtMSxhPUErMSxoPUEtdC53aWR0aCx1PUErdC53aWR0aCxsPG4mJihsPUEpLGE+PXImJihhPUEpLGg8MCYmKGg9MCksdT49YiYmKHU9QSkscD10LnBpeGVscy5nZXRQaXhlbChoKSxmPXQucGl4ZWxzLmdldFBpeGVsKGwpLG09dC5waXhlbHMuZ2V0UGl4ZWwodSksYz10LnBpeGVscy5nZXRQaXhlbChhKSxvPTc3KihpPj4xNiYyNTUpKzE1MSooaT4+OCYyNTUpKzI4KigyNTUmaSksdj03NyooZj4+MTYmMjU1KSsxNTEqKGY+PjgmMjU1KSsyOCooMjU1JmYpLGc9NzcqKGM+PjE2JjI1NSkrMTUxKihjPj44JjI1NSkrMjgqKDI1NSZjKSx5PTc3KihwPj4xNiYyNTUpKzE1MSoocD4+OCYyNTUpKzI4KigyNTUmcCkseD03NyoobT4+MTYmMjU1KSsxNTEqKG0+PjgmMjU1KSsyOCooMjU1Jm0pLHY+byYmKHM9ZixvPXYpLGc+byYmKHM9YyxvPWcpLHk+byYmKHM9cCxvPXkpLHg+byYmKHM9bSxvPXgpLHdbQSsrXT1zCnQucGl4ZWxzLnNldCh3KX0KeGUuZmlsdGVyPWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxzLG8sYQppZigzPT09YXJndW1lbnRzLmxlbmd0aD8oci5sb2FkUGl4ZWxzKCksaT1yKTooeGUubG9hZFBpeGVscygpLGk9eGUpLG49PT10JiYobj1udWxsKSxpLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGZpbHRlciBpbWFnZS4iCnZhciBsPWkucGl4ZWxzLmdldExlbmd0aCgpCnN3aXRjaChlKXtjYXNlIGMuQkxVUjp2YXIgaD1ufHwxCkNyKGgsaSkKYnJlYWsKY2FzZSBjLkdSQVk6aWYoaS5mb3JtYXQ9PT1jLkFMUEhBKXtmb3IoYT0wO2E8bDthKyspcz0yNTUtaS5waXhlbHMuZ2V0UGl4ZWwoYSksaS5waXhlbHMuc2V0UGl4ZWwoYSw0Mjc4MTkwMDgwfHM8PDE2fHM8PDh8cykKaS5mb3JtYXQ9Yy5SR0J9ZWxzZSBmb3IoYT0wO2E8bDthKyspcz1pLnBpeGVscy5nZXRQaXhlbChhKSxvPTc3KihzPj4xNiYyNTUpKzE1MSoocz4+OCYyNTUpKzI4KigyNTUmcyk+PjgsaS5waXhlbHMuc2V0UGl4ZWwoYSxzJmMuQUxQSEFfTUFTS3xvPDwxNnxvPDw4fG8pCmJyZWFrCmNhc2UgYy5JTlZFUlQ6Zm9yKGE9MDthPGw7YSsrKWkucGl4ZWxzLnNldFBpeGVsKGEsMTY3NzcyMTVeaS5waXhlbHMuZ2V0UGl4ZWwoYSkpCmJyZWFrCmNhc2UgYy5QT1NURVJJWkU6aWYobnVsbD09PW4pdGhyb3ciVXNlIGZpbHRlcihQT1NURVJJWkUsIGludCBsZXZlbHMpIGluc3RlYWQgb2YgZmlsdGVyKFBPU1RFUklaRSkiCnZhciB1PXhlLmZsb29yKG4pCmlmKHU8Mnx8dT4yNTUpdGhyb3ciTGV2ZWxzIG11c3QgYmUgYmV0d2VlbiAyIGFuZCAyNTUgZm9yIGZpbHRlcihQT1NURVJJWkUsIGxldmVscykiCnZhciBmPXUtMQpmb3IoYT0wO2E8bDthKyspe3ZhciBwPWkucGl4ZWxzLmdldFBpeGVsKGEpPj4xNiYyNTUsbT1pLnBpeGVscy5nZXRQaXhlbChhKT4+OCYyNTUsZz0yNTUmaS5waXhlbHMuZ2V0UGl4ZWwoYSkKcD0yNTUqKHAqdT4+OCkvZixtPTI1NSoobSp1Pj44KS9mLGc9MjU1KihnKnU+PjgpL2YsaS5waXhlbHMuc2V0UGl4ZWwoYSw0Mjc4MTkwMDgwJmkucGl4ZWxzLmdldFBpeGVsKGEpfHA8PDE2fG08PDh8Zyl9YnJlYWsKY2FzZSBjLk9QQVFVRTpmb3IoYT0wO2E8bDthKyspaS5waXhlbHMuc2V0UGl4ZWwoYSw0Mjc4MTkwMDgwfGkucGl4ZWxzLmdldFBpeGVsKGEpKQppLmZvcm1hdD1jLlJHQgpicmVhawpjYXNlIGMuVEhSRVNIT0xEOmlmKG51bGw9PT1uJiYobj0uNSksbjwwfHxuPjEpdGhyb3ciTGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEgZm9yIGZpbHRlcihUSFJFU0hPTEQsIGxldmVsKSIKdmFyIGQ9eGUuZmxvb3IoMjU1Km4pCmZvcihhPTA7YTxsO2ErKyl7dmFyIHY9eGUubWF4KChpLnBpeGVscy5nZXRQaXhlbChhKSZjLlJFRF9NQVNLKT4+MTYseGUubWF4KChpLnBpeGVscy5nZXRQaXhlbChhKSZjLkdSRUVOX01BU0spPj44LGkucGl4ZWxzLmdldFBpeGVsKGEpJmMuQkxVRV9NQVNLKSkKaS5waXhlbHMuc2V0UGl4ZWwoYSxpLnBpeGVscy5nZXRQaXhlbChhKSZjLkFMUEhBX01BU0t8KHY8ZD8wOjE2Nzc3MjE1KSl9YnJlYWsKY2FzZSBjLkVST0RFOk1yKCEwLGkpCmJyZWFrCmNhc2UgYy5ESUxBVEU6TXIoITEsaSl9aS51cGRhdGVQaXhlbHMoKX0seGUuc2hhcmVkPXtmcmFjVTowLGlmVTowLGZyYWNWOjAsaWZWOjAsdTE6MCx1MjowLHYxOjAsdjI6MCxzWDowLHNZOjAsaXc6MCxpdzE6MCxpaDE6MCx1bDowLGxsOjAsdXI6MCxscjowLGNVTDowLGNMTDowLGNVUjowLGNMUjowLHNyY1hPZmZzZXQ6MCxzcmNZT2Zmc2V0OjAscjowLGc6MCxiOjAsYTowLHNyY0J1ZmZlcjpudWxsLGJsdXJSYWRpdXM6MCxibHVyS2VybmVsU2l6ZTowLGJsdXJLZXJuZWw6bnVsbH0seGUuaW50ZXJzZWN0PWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSl7dmFyIGw9bi1lKzEsaD1yLXQrMSx1PW8taSsxLGM9YS1zKzEKaWYoaTxlKXUrPWktZSx1PmwmJih1PWwpCmVsc2V7dmFyIGY9bCtlLWkKdT5mJiYodT1mKX1pZihzPHQpYys9cy10LGM+aCYmKGM9aCkKZWxzZXt2YXIgcD1oK3QtcwpjPnAmJihjPXApfXJldHVybiEodTw9MHx8Yzw9MCl9CnZhciBUcj17fQppZihUcltjLkJMRU5EXT14ZS5tb2Rlcy5ibGVuZCxUcltjLkFERF09eGUubW9kZXMuYWRkLFRyW2MuU1VCVFJBQ1RdPXhlLm1vZGVzLnN1YnRyYWN0LFRyW2MuTElHSFRFU1RdPXhlLm1vZGVzLmxpZ2h0ZXN0LFRyW2MuREFSS0VTVF09eGUubW9kZXMuZGFya2VzdCxUcltjLlJFUExBQ0VdPXhlLm1vZGVzLnJlcGxhY2UsVHJbYy5ESUZGRVJFTkNFXT14ZS5tb2Rlcy5kaWZmZXJlbmNlLFRyW2MuRVhDTFVTSU9OXT14ZS5tb2Rlcy5leGNsdXNpb24sVHJbYy5NVUxUSVBMWV09eGUubW9kZXMubXVsdGlwbHksVHJbYy5TQ1JFRU5dPXhlLm1vZGVzLnNjcmVlbixUcltjLk9WRVJMQVldPXhlLm1vZGVzLm92ZXJsYXksVHJbYy5IQVJEX0xJR0hUXT14ZS5tb2Rlcy5oYXJkX2xpZ2h0LFRyW2MuU09GVF9MSUdIVF09eGUubW9kZXMuc29mdF9saWdodCxUcltjLkRPREdFXT14ZS5tb2Rlcy5kb2RnZSxUcltjLkJVUk5dPXhlLm1vZGVzLmJ1cm4seGUuYmxpdF9yZXNpemU9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhLGwsaCx1LGYscCl7dmFyIG0sZwp0PDAmJih0PTApLG48MCYmKG49MCkscj49ZS53aWR0aCYmKHI9ZS53aWR0aC0xKSxpPj1lLmhlaWdodCYmKGk9ZS5oZWlnaHQtMSkKdmFyIGQ9ci10LHY9aS1uLHk9dS1sLHg9Zi1oCmlmKCEoeTw9MHx8eDw9MHx8ZDw9MHx8djw9MHx8bD49b3x8aD49YXx8dD49ZS53aWR0aHx8bj49ZS5oZWlnaHQpKXt2YXIgQT1NYXRoLmZsb29yKGQveSpjLlBSRUNJU0lPTkYpLGI9TWF0aC5mbG9vcih2L3gqYy5QUkVDSVNJT05GKSx3PXhlLnNoYXJlZAp3LnNyY1hPZmZzZXQ9TWF0aC5mbG9vcihsPDA/LWwqQTp0KmMuUFJFQ0lTSU9ORiksdy5zcmNZT2Zmc2V0PU1hdGguZmxvb3IoaDwwPy1oKmI6bipjLlBSRUNJU0lPTkYpLGw8MCYmKHkrPWwsbD0wKSxoPDAmJih4Kz1oLGg9MCkseT1NYXRoLm1pbih5LG8tbCkseD1NYXRoLm1pbih4LGEtaCkKdmFyIEUsUz1oKm8rbAp3LnNyY0J1ZmZlcj1lLmltYWdlRGF0YS5kYXRhLHcuaXc9ZS53aWR0aCx3Lml3MT1lLndpZHRoLTEsdy5paDE9ZS5oZWlnaHQtMQp2YXIgUCxDLE0sVCxfLFIsTD0oeGUuZmlsdGVyX2JpbGluZWFyLHhlLmZpbHRlcl9uZXdfc2NhbmxpbmUsVHJbcF0pLEk9Yy5BTFBIQV9NQVNLLEQ9Yy5SRURfTUFTSyxPPWMuR1JFRU5fTUFTSyxOPWMuQkxVRV9NQVNLLEY9Yy5QUkVDX01BWFZBTCxrPWMuUFJFQ0lTSU9OQixCPWMuUFJFQ19SRURfU0hJRlQsJD1jLlBSRUNfQUxQSEFfU0hJRlQsRz13LnNyY0J1ZmZlcixWPU1hdGgubWluCmZvcihnPTA7Zzx4O2crKyl7Zm9yKHcuc1g9dy5zcmNYT2Zmc2V0LHcuZnJhY1Y9dy5zcmNZT2Zmc2V0JkYsdy5pZlY9Ri13LmZyYWNWLHcudjE9KHcuc3JjWU9mZnNldD4+aykqdy5pdyx3LnYyPVYoKHcuc3JjWU9mZnNldD4+aykrMSx3LmloMSkqdy5pdyxtPTA7bTx5O20rKylDPTQqKFMrbSksRT1zW0MrM108PDI0Jkl8c1tDXTw8MTYmRHxzW0MrMV08PDgmT3xzW0MrMl0mTix3LmZyYWNVPXcuc1gmRix3LmlmVT1GLXcuZnJhY1Usdy51bD13LmlmVSp3LmlmVj4+ayx3LmxsPXcuaWZVKncuZnJhY1Y+Pmssdy51cj13LmZyYWNVKncuaWZWPj5rLHcubHI9dy5mcmFjVSp3LmZyYWNWPj5rLHcudTE9dy5zWD4+ayx3LnUyPVYody51MSsxLHcuaXcxKSxNPTQqKHcudjErdy51MSksVD00Kih3LnYxK3cudTIpLF89NCoody52Mit3LnUxKSxSPTQqKHcudjIrdy51Miksdy5jVUw9R1tNKzNdPDwyNCZJfEdbTV08PDE2JkR8R1tNKzFdPDw4Jk98R1tNKzJdJk4sdy5jVVI9R1tUKzNdPDwyNCZJfEdbVF08PDE2JkR8R1tUKzFdPDw4Jk98R1tUKzJdJk4sdy5jTEw9R1tfKzNdPDwyNCZJfEdbX108PDE2JkR8R1tfKzFdPDw4Jk98R1tfKzJdJk4sdy5jTFI9R1tSKzNdPDwyNCZJfEdbUl08PDE2JkR8R1tSKzFdPDw4Jk98R1tSKzJdJk4sdy5yPXcudWwqKCh3LmNVTCZEKT4+MTYpK3cubGwqKCh3LmNMTCZEKT4+MTYpK3cudXIqKCh3LmNVUiZEKT4+MTYpK3cubHIqKCh3LmNMUiZEKT4+MTYpPDxCJkQsdy5nPXcudWwqKHcuY1VMJk8pK3cubGwqKHcuY0xMJk8pK3cudXIqKHcuY1VSJk8pK3cubHIqKHcuY0xSJk8pPj4+ayZPLHcuYj13LnVsKih3LmNVTCZOKSt3LmxsKih3LmNMTCZOKSt3LnVyKih3LmNVUiZOKSt3LmxyKih3LmNMUiZOKT4+Pmssdy5hPXcudWwqKCh3LmNVTCZJKT4+PjI0KSt3LmxsKigody5jTEwmSSk+Pj4yNCkrdy51ciooKHcuY1VSJkkpPj4+MjQpK3cubHIqKCh3LmNMUiZJKT4+PjI0KTw8JCZJLFA9TChFLHcuYXx3LnJ8dy5nfHcuYiksc1tDXT0oUCZEKT4+PjE2LHNbQysxXT0oUCZPKT4+Pjgsc1tDKzJdPVAmTixzW0MrM109KFAmSSk+Pj4yNCx3LnNYKz1BClMrPW8sdy5zcmNZT2Zmc2V0Kz1ifX19LHhlLmxvYWRGb250PWZ1bmN0aW9uKGUsbil7aWYoZT09PXQpdGhyb3ciZm9udCBuYW1lIHJlcXVpcmVkIGluIGxvYWRGb250LiIKaWYoZS5pbmRleE9mKCIuc3ZnIik9PT0tMSlyZXR1cm4gbj09PXQmJihuPWxuLnNpemUpLFBGb250LmdldChlLG4pCnZhciByPXhlLmxvYWRHbHlwaHMoZSkKcmV0dXJue25hbWU6ZSxjc3M6IjEycHggc2Fucy1zZXJpZiIsZ2x5cGg6ITAsdW5pdHNfcGVyX2VtOnIudW5pdHNfcGVyX2VtLGhvcml6X2Fkdl94OjEvci51bml0c19wZXJfZW0qci5ob3Jpel9hZHZfeCxhc2NlbnQ6ci5hc2NlbnQsZGVzY2VudDpyLmRlc2NlbnQsd2lkdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aCxpPTA7aTxyO2krKyl0cnl7bis9cGFyc2VGbG9hdCh4ZS5nbHlwaExvb2soeGUuZ2x5cGhUYWJsZVtlXSx0W2ldKS5ob3Jpel9hZHZfeCl9Y2F0Y2goZSl7RS5kZWJ1ZyhlKX1yZXR1cm4gbi94ZS5nbHlwaFRhYmxlW2VdLnVuaXRzX3Blcl9lbX19fSx4ZS5jcmVhdGVGb250PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHhlLmxvYWRGb250KGUsdCl9LHhlLnRleHRGb250PWZ1bmN0aW9uKGUsbil7biE9PXQmJihlLmdseXBofHwoZT1QRm9udC5nZXQoZS5uYW1lLG4pKSxybj1uKSxsbj1lLG5uPWxuLm5hbWUsc249bG4uYXNjZW50LG9uPWxuLmRlc2NlbnQsYW49bG4ubGVhZGluZwp2YXIgcj13ZS4kZW5zdXJlQ29udGV4dCgpCnIuZm9udD1sbi5jc3N9LHhlLnRleHRTaXplPWZ1bmN0aW9uKGUpe2xuPVBGb250LmdldChubixlKSxybj1lLHNuPWxuLmFzY2VudCxvbj1sbi5kZXNjZW50LGFuPWxuLmxlYWRpbmcKdmFyIHQ9d2UuJGVuc3VyZUNvbnRleHQoKQp0LmZvbnQ9bG4uY3NzfSx4ZS50ZXh0QXNjZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHNufSx4ZS50ZXh0RGVzY2VudD1mdW5jdGlvbigpe3JldHVybiBvbn0seGUudGV4dExlYWRpbmc9ZnVuY3Rpb24oZSl7YW49ZX0seGUudGV4dEFsaWduPWZ1bmN0aW9uKGUsdCl7SnQ9ZSxlbj10fHxjLkJBU0VMSU5FfSxpci5wcm90b3R5cGUudGV4dFdpZHRoPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmUoZSkuc3BsaXQoL1xyP1xuL2cpLHI9MCxpPW4ubGVuZ3RoCmZvcihBZS5mb250PWxuLmNzcyx0PTA7dDxpOysrdClyPU1hdGgubWF4KHIsbG4ubWVhc3VyZVRleHRXaWR0aChuW3RdKSkKcmV0dXJuIDB8cn0sc3IucHJvdG90eXBlLnRleHRXaWR0aD1mdW5jdGlvbihlKXt2YXIgbixyPW5lKGUpLnNwbGl0KC9ccj9cbi9nKSxpPTAscz1yLmxlbmd0aApFZT09PXQmJihFZT1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKQp2YXIgbz1FZS5nZXRDb250ZXh0KCIyZCIpCmZvcihvLmZvbnQ9bG4uY3NzLG49MDtuPHM7KytuKWk9TWF0aC5tYXgoaSxvLm1lYXN1cmVUZXh0KHJbbl0pLndpZHRoKQpyZXR1cm4gMHxpfSx4ZS5nbHlwaExvb2s9ZnVuY3Rpb24oZSx0KXt0cnl7c3dpdGNoKHQpe2Nhc2UiMSI6cmV0dXJuIGUub25lCmNhc2UiMiI6cmV0dXJuIGUudHdvCmNhc2UiMyI6cmV0dXJuIGUudGhyZWUKY2FzZSI0IjpyZXR1cm4gZS5mb3VyCmNhc2UiNSI6cmV0dXJuIGUuZml2ZQpjYXNlIjYiOnJldHVybiBlLnNpeApjYXNlIjciOnJldHVybiBlLnNldmVuCmNhc2UiOCI6cmV0dXJuIGUuZWlnaHQKY2FzZSI5IjpyZXR1cm4gZS5uaW5lCmNhc2UiMCI6cmV0dXJuIGUuemVybwpjYXNlIiAiOnJldHVybiBlLnNwYWNlCmNhc2UiJCI6cmV0dXJuIGUuZG9sbGFyCmNhc2UiISI6cmV0dXJuIGUuZXhjbGFtCmNhc2UnIic6cmV0dXJuIGUucXVvdGVkYmwKY2FzZSIjIjpyZXR1cm4gZS5udW1iZXJzaWduCmNhc2UiJSI6cmV0dXJuIGUucGVyY2VudApjYXNlIiYiOnJldHVybiBlLmFtcGVyc2FuZApjYXNlIiciOnJldHVybiBlLnF1b3Rlc2luZ2xlCmNhc2UiKCI6cmV0dXJuIGUucGFyZW5sZWZ0CmNhc2UiKSI6cmV0dXJuIGUucGFyZW5yaWdodApjYXNlIioiOnJldHVybiBlLmFzdGVyaXNrCmNhc2UiKyI6cmV0dXJuIGUucGx1cwpjYXNlIiwiOnJldHVybiBlLmNvbW1hCmNhc2UiLSI6cmV0dXJuIGUuaHlwaGVuCmNhc2UiLiI6cmV0dXJuIGUucGVyaW9kCmNhc2UiLyI6cmV0dXJuIGUuc2xhc2gKY2FzZSJfIjpyZXR1cm4gZS51bmRlcnNjb3JlCmNhc2UiOiI6cmV0dXJuIGUuY29sb24KY2FzZSI7IjpyZXR1cm4gZS5zZW1pY29sb24KY2FzZSI8IjpyZXR1cm4gZS5sZXNzCmNhc2UiPSI6cmV0dXJuIGUuZXF1YWwKY2FzZSI+IjpyZXR1cm4gZS5ncmVhdGVyCmNhc2UiPyI6cmV0dXJuIGUucXVlc3Rpb24KY2FzZSJAIjpyZXR1cm4gZS5hdApjYXNlIlsiOnJldHVybiBlLmJyYWNrZXRsZWZ0CmNhc2UiXFwiOnJldHVybiBlLmJhY2tzbGFzaApjYXNlIl0iOnJldHVybiBlLmJyYWNrZXRyaWdodApjYXNlIl4iOnJldHVybiBlLmFzY2lpY2lyY3VtCmNhc2UiYCI6cmV0dXJuIGUuZ3JhdmUKY2FzZSJ7IjpyZXR1cm4gZS5icmFjZWxlZnQKY2FzZSJ8IjpyZXR1cm4gZS5iYXIKY2FzZSJ9IjpyZXR1cm4gZS5icmFjZXJpZ2h0CmNhc2UifiI6cmV0dXJuIGUuYXNjaWl0aWxkZQpkZWZhdWx0OnJldHVybiBlW3RdfX1jYXRjaChlKXtFLmRlYnVnKGUpfX0saXIucHJvdG90eXBlLnRleHQkbGluZT1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPTAsbz0wCmlmKGxuLmdseXBoKXt2YXIgYT14ZS5nbHlwaFRhYmxlW25uXQpOKCksQWUudHJhbnNsYXRlKHQsbitybiksaSE9PWMuUklHSFQmJmkhPT1jLkNFTlRFUnx8KHM9YS53aWR0aChlKSxvPWk9PT1jLlJJR0hUPy1zOi1zLzIpCnZhciBsPWEudW5pdHNfcGVyX2VtLGg9MS9sKnJuCkFlLnNjYWxlKGgsaCkKZm9yKHZhciB1PTAsZj1lLmxlbmd0aDt1PGY7dSsrKXRyeXt4ZS5nbHlwaExvb2soYSxlW3VdKS5kcmF3KCl9Y2F0Y2goZSl7RS5kZWJ1ZyhlKX1GKCl9ZWxzZSBlJiYiZmlsbFRleHQiaW4gQWUmJih1dCYmKEFlLmZpbGxTdHlsZT14ZS5jb2xvci50b1N0cmluZyhodCksdXQ9ITEpLGkhPT1jLlJJR0hUJiZpIT09Yy5DRU5URVJ8fChzPWxuLm1lYXN1cmVUZXh0V2lkdGgoZSksbz1pPT09Yy5SSUdIVD8tczotcy8yKSxBZS5maWxsVGV4dChlLHQrbyxuKSl9LHNyLnByb3RvdHlwZS50ZXh0JGxpbmU9ZnVuY3Rpb24oZSxuLHIsaSxzKXtFZT09PXQmJihFZT1oLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKQp2YXIgbz1BZQpBZT1FZS5nZXRDb250ZXh0KCIyZCIpLEFlLmZvbnQ9bG4uY3NzCnZhciBhPWxuLm1lYXN1cmVUZXh0V2lkdGgoZSkKRWUud2lkdGg9YSxFZS5oZWlnaHQ9cm4sQWU9RWUuZ2V0Q29udGV4dCgiMmQiKSxBZS5mb250PWxuLmNzcyxBZS50ZXh0QmFzZWxpbmU9InRvcCIsaXIucHJvdG90eXBlLnRleHQkbGluZShlLDAsMCwwLGMuTEVGVCkKdmFyIGw9RWUud2lkdGgvRWUuaGVpZ2h0CkFlPW8sQWUuYmluZFRleHR1cmUoQWUuVEVYVFVSRV8yRCxZZSksQWUudGV4SW1hZ2UyRChBZS5URVhUVVJFXzJELDAsQWUuUkdCQSxBZS5SR0JBLEFlLlVOU0lHTkVEX0JZVEUsRWUpLEFlLnRleFBhcmFtZXRlcmkoQWUuVEVYVFVSRV8yRCxBZS5URVhUVVJFX01BR19GSUxURVIsQWUuTElORUFSKSxBZS50ZXhQYXJhbWV0ZXJpKEFlLlRFWFRVUkVfMkQsQWUuVEVYVFVSRV9NSU5fRklMVEVSLEFlLkxJTkVBUiksQWUudGV4UGFyYW1ldGVyaShBZS5URVhUVVJFXzJELEFlLlRFWFRVUkVfV1JBUF9ULEFlLkNMQU1QX1RPX0VER0UpLEFlLnRleFBhcmFtZXRlcmkoQWUuVEVYVFVSRV8yRCxBZS5URVhUVVJFX1dSQVBfUyxBZS5DTEFNUF9UT19FREdFKQp2YXIgdT0wCnM9PT1jLlJJR0hUP3U9LWE6cz09PWMuQ0VOVEVSJiYodT0tYS8yKQp2YXIgZj1uZXcgaHIscD0uNSpybgpmLnRyYW5zbGF0ZShuK3UtcC8yLHItcCxpKSxmLnNjYWxlKC1sKnAsLXAscCksZi50cmFuc2xhdGUoLTEsLTEsLTEpLGYudHJhbnNwb3NlKCkKdmFyIG09bmV3IGhyCm0uc2NhbGUoMSwtMSwxKSxtLmFwcGx5KHR0LmFycmF5KCkpLG0udHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShMZSksXygiYVZlcnRleDJkIixMZSwiYVZlcnRleCIsMyxqZSksXygiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIsMixLZSksTSgidVNhbXBsZXIyZCIsTGUsInVTYW1wbGVyIixbMF0pLE0oInVJc0RyYXdpbmdUZXh0MmQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITApLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSxmLmFycmF5KCkpLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsbS5hcnJheSgpKSxDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsbHQpLEFlLmJpbmRCdWZmZXIoQWUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsV2UpLEFlLmRyYXdFbGVtZW50cyhBZS5UUklBTkdMRVMsNixBZS5VTlNJR05FRF9TSE9SVCwwKX0seGUudGV4dD1mdW5jdGlvbigpe3RuIT09Yy5TSEFQRSYmKDM9PT1hcmd1bWVudHMubGVuZ3RoP3JlKG5lKGFyZ3VtZW50c1swXSksYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSwwKTo0PT09YXJndW1lbnRzLmxlbmd0aD9yZShuZShhcmd1bWVudHNbMF0pLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTo1PT09YXJndW1lbnRzLmxlbmd0aD9pZShuZShhcmd1bWVudHNbMF0pLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSwwKTo2PT09YXJndW1lbnRzLmxlbmd0aCYmaWUobmUoYXJndW1lbnRzWzBdKSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdKSl9LHhlLnRleHRNb2RlPWZ1bmN0aW9uKGUpe3RuPWV9LHhlLmxvYWRHbHlwaHM9ZnVuY3Rpb24oZSl7dmFyIG4scixpLHMsbyxhLHUsYyxmLHAsbSxnLGQ9IlswLTlcXC1dKyIsdj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPVtdLHM9bmV3IFJlZ0V4cChlLCJnIikKZm9yKG49aVtyXT1zLmV4ZWModCk7bjspcisrLG49aVtyXT1zLmV4ZWModCkKcmV0dXJuIGl9LHk9ZnVuY3Rpb24oZSl7dmFyIHQ9digiW0EtWmEtel1bMC05XFwtIF0rfFoiLGUpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gTigpLHdlLiRlbnN1cmVDb250ZXh0KCl9LGg9ZnVuY3Rpb24oKXt6KCksVSgpLEYoKX0KZz0icmV0dXJuIHtkcmF3OmZ1bmN0aW9uKCl7dmFyIGN1ckNvbnRleHQ9YmVmb3JlUGF0aERyYXcoKTtjdXJDb250ZXh0LmJlZ2luUGF0aCgpOyIsbj0wLHI9MCxpPTAscz0wLG89MCxhPTAsZT0wLGM9MCxmPSIiLHA9dC5sZW5ndGgtMQpmb3IodmFyIHU9MDt1PHA7dSsrKXt2YXIgeT10W3VdWzBdLHg9dihkLHkpCnN3aXRjaCh5WzBdKXtjYXNlIk0iOm49cGFyc2VGbG9hdCh4WzBdWzBdKSxyPXBhcnNlRmxvYXQoeFsxXVswXSksZys9ImN1ckNvbnRleHQubW92ZVRvKCIrbisiLCIrLXIrIik7IgpicmVhawpjYXNlIkwiOm49cGFyc2VGbG9hdCh4WzBdWzBdKSxyPXBhcnNlRmxvYXQoeFsxXVswXSksZys9ImN1ckNvbnRleHQubGluZVRvKCIrbisiLCIrLXIrIik7IgpicmVhawpjYXNlIkgiOm49cGFyc2VGbG9hdCh4WzBdWzBdKSxnKz0iY3VyQ29udGV4dC5saW5lVG8oIituKyIsIistcisiKTsiCmJyZWFrCmNhc2UiViI6cj1wYXJzZUZsb2F0KHhbMF1bMF0pLGcrPSJjdXJDb250ZXh0LmxpbmVUbygiK24rIiwiKy1yKyIpOyIKYnJlYWsKY2FzZSJUIjpvPXBhcnNlRmxvYXQoeFswXVswXSksYT1wYXJzZUZsb2F0KHhbMV1bMF0pLCJRIj09PWZ8fCJUIj09PWY/KGU9TWF0aC5zcXJ0KE1hdGgucG93KG4taSwyKStNYXRoLnBvdyhzLXIsMikpLGM9TWF0aC5QSStNYXRoLmF0YW4yKGktbixzLXIpLGk9bitNYXRoLnNpbihjKSplLHM9citNYXRoLmNvcyhjKSplKTooaT1uLHM9ciksZys9ImN1ckNvbnRleHQucXVhZHJhdGljQ3VydmVUbygiK2krIiwiKy1zKyIsIitvKyIsIistYSsiKTsiLG49byxyPWEKYnJlYWsKY2FzZSJRIjppPXBhcnNlRmxvYXQoeFswXVswXSkscz1wYXJzZUZsb2F0KHhbMV1bMF0pLG89cGFyc2VGbG9hdCh4WzJdWzBdKSxhPXBhcnNlRmxvYXQoeFszXVswXSksZys9ImN1ckNvbnRleHQucXVhZHJhdGljQ3VydmVUbygiK2krIiwiKy1zKyIsIitvKyIsIistYSsiKTsiLG49byxyPWEKYnJlYWsKY2FzZSJaIjpnKz0iY3VyQ29udGV4dC5jbG9zZVBhdGgoKTsifWY9eVswXX1yZXR1cm4gZys9ImFmdGVyUGF0aERyYXcoKTsiLGcrPSJjdXJDb250ZXh0LnRyYW5zbGF0ZSgiK20rIiwwKTsiLGcrPSJ9fSIsbmV3IEZ1bmN0aW9uKCJiZWZvcmVQYXRoRHJhdyIsImFmdGVyUGF0aERyYXciLGcpKGwsaCl9LHg9ZnVuY3Rpb24obil7dmFyIHI9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9udCIpCnhlLmdseXBoVGFibGVbZV0uaG9yaXpfYWR2X3g9clswXS5nZXRBdHRyaWJ1dGUoImhvcml6LWFkdi14IikKdmFyIGk9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9udC1mYWNlIilbMF0KeGUuZ2x5cGhUYWJsZVtlXS51bml0c19wZXJfZW09cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgidW5pdHMtcGVyLWVtIikpLHhlLmdseXBoVGFibGVbZV0uYXNjZW50PXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImFzY2VudCIpKSx4ZS5nbHlwaFRhYmxlW2VdLmRlc2NlbnQ9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGVzY2VudCIpKQpmb3IodmFyIHM9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZ2x5cGgiKSxvPXMubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgbD1zW2FdLmdldEF0dHJpYnV0ZSgidW5pY29kZSIpLGg9c1thXS5nZXRBdHRyaWJ1dGUoImdseXBoLW5hbWUiKQptPXNbYV0uZ2V0QXR0cmlidXRlKCJob3Jpei1hZHYteCIpLG51bGw9PT1tJiYobT14ZS5nbHlwaFRhYmxlW2VdLmhvcml6X2Fkdl94KSx1PXNbYV0uZ2V0QXR0cmlidXRlKCJkIiksdSE9PXQmJihnPXkodSkseGUuZ2x5cGhUYWJsZVtlXVtoXT17bmFtZTpoLHVuaWNvZGU6bCxob3Jpel9hZHZfeDptLGRyYXc6Zy5kcmF3fSl9fSxBPWZ1bmN0aW9uKCl7dmFyIHQKdHJ5e3Q9aC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwiIixudWxsKX1jYXRjaChlKXtyZXR1cm4gdm9pZCBFLmRlYnVnKGUubWVzc2FnZSl9dHJ5e3QuYXN5bmM9ITEsdC5sb2FkKGUpLHgodC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3ZnIilbMF0pfWNhdGNoKHQpe0UuZGVidWcodCkKdHJ5e3ZhciBuPW5ldyBsLlhNTEh0dHBSZXF1ZXN0Cm4ub3BlbigiR0VUIixlLCExKSxuLnNlbmQobnVsbCkseChuLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudCl9Y2F0Y2goZSl7RS5kZWJ1Zyh0KX19fQpyZXR1cm4geGUuZ2x5cGhUYWJsZVtlXT17fSxBKGUpLHhlLmdseXBoVGFibGVbZV19LHhlLnBhcmFtPWZ1bmN0aW9uKGUpe3ZhciB0PSJkYXRhLXByb2Nlc3NpbmctIitlCmlmKGRlLmhhc0F0dHJpYnV0ZSh0KSlyZXR1cm4gZGUuZ2V0QXR0cmlidXRlKHQpCmZvcih2YXIgbj0wLHI9ZGUuY2hpbGROb2Rlcy5sZW5ndGg7bjxyOysrbil7dmFyIGk9ZGUuY2hpbGROb2Rlcy5pdGVtKG4pCmlmKDE9PT1pLm5vZGVUeXBlJiYicGFyYW0iPT09aS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJmkuZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1lKXJldHVybiBpLmdldEF0dHJpYnV0ZSgidmFsdWUiKX1yZXR1cm4gYmUucGFyYW1zLmhhc093blByb3BlcnR5KGUpP2JlLnBhcmFtc1tlXTpudWxsfSxvci5wcm90b3R5cGUudHJhbnNsYXRlPW9lKCJ0cmFuc2xhdGUiKSxvci5wcm90b3R5cGUudHJhbnNmb3JtPW9lKCJ0cmFuc2Zvcm0iKSxvci5wcm90b3R5cGUuc2NhbGU9b2UoInNjYWxlIiksb3IucHJvdG90eXBlLnB1c2hNYXRyaXg9b2UoInB1c2hNYXRyaXgiKSxvci5wcm90b3R5cGUucG9wTWF0cml4PW9lKCJwb3BNYXRyaXgiKSxvci5wcm90b3R5cGUucmVzZXRNYXRyaXg9b2UoInJlc2V0TWF0cml4Iiksb3IucHJvdG90eXBlLmFwcGx5TWF0cml4PW9lKCJhcHBseU1hdHJpeCIpLG9yLnByb3RvdHlwZS5yb3RhdGU9b2UoInJvdGF0ZSIpLG9yLnByb3RvdHlwZS5yb3RhdGVaPW9lKCJyb3RhdGVaIiksb3IucHJvdG90eXBlLnNoZWFyWD1vZSgic2hlYXJYIiksb3IucHJvdG90eXBlLnNoZWFyWT1vZSgic2hlYXJZIiksb3IucHJvdG90eXBlLnJlZHJhdz1vZSgicmVkcmF3Iiksb3IucHJvdG90eXBlLnRvSW1hZ2VEYXRhPW9lKCJ0b0ltYWdlRGF0YSIpLG9yLnByb3RvdHlwZS5hbWJpZW50TGlnaHQ9b2UoImFtYmllbnRMaWdodCIpLG9yLnByb3RvdHlwZS5kaXJlY3Rpb25hbExpZ2h0PW9lKCJkaXJlY3Rpb25hbExpZ2h0Iiksb3IucHJvdG90eXBlLmxpZ2h0RmFsbG9mZj1vZSgibGlnaHRGYWxsb2ZmIiksb3IucHJvdG90eXBlLmxpZ2h0U3BlY3VsYXI9b2UoImxpZ2h0U3BlY3VsYXIiKSxvci5wcm90b3R5cGUucG9pbnRMaWdodD1vZSgicG9pbnRMaWdodCIpLG9yLnByb3RvdHlwZS5ub0xpZ2h0cz1vZSgibm9MaWdodHMiKSxvci5wcm90b3R5cGUuc3BvdExpZ2h0PW9lKCJzcG90TGlnaHQiKSxvci5wcm90b3R5cGUuYmVnaW5DYW1lcmE9b2UoImJlZ2luQ2FtZXJhIiksb3IucHJvdG90eXBlLmVuZENhbWVyYT1vZSgiZW5kQ2FtZXJhIiksb3IucHJvdG90eXBlLmZydXN0dW09b2UoImZydXN0dW0iKSxvci5wcm90b3R5cGUuYm94PW9lKCJib3giKSxvci5wcm90b3R5cGUuc3BoZXJlPW9lKCJzcGhlcmUiKSxvci5wcm90b3R5cGUuYW1iaWVudD1vZSgiYW1iaWVudCIpLG9yLnByb3RvdHlwZS5lbWlzc2l2ZT1vZSgiZW1pc3NpdmUiKSxvci5wcm90b3R5cGUuc2hpbmluZXNzPW9lKCJzaGluaW5lc3MiKSxvci5wcm90b3R5cGUuc3BlY3VsYXI9b2UoInNwZWN1bGFyIiksb3IucHJvdG90eXBlLmZpbGw9b2UoImZpbGwiKSxvci5wcm90b3R5cGUuc3Ryb2tlPW9lKCJzdHJva2UiKSxvci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0PW9lKCJzdHJva2VXZWlnaHQiKSxvci5wcm90b3R5cGUuc21vb3RoPW9lKCJzbW9vdGgiKSxvci5wcm90b3R5cGUubm9TbW9vdGg9b2UoIm5vU21vb3RoIiksb3IucHJvdG90eXBlLnBvaW50PW9lKCJwb2ludCIpLG9yLnByb3RvdHlwZS52ZXJ0ZXg9b2UoInZlcnRleCIpLG9yLnByb3RvdHlwZS5lbmRTaGFwZT1vZSgiZW5kU2hhcGUiKSxvci5wcm90b3R5cGUuYmV6aWVyVmVydGV4PW9lKCJiZXppZXJWZXJ0ZXgiKSxvci5wcm90b3R5cGUuY3VydmVWZXJ0ZXg9b2UoImN1cnZlVmVydGV4Iiksb3IucHJvdG90eXBlLmN1cnZlPW9lKCJjdXJ2ZSIpLG9yLnByb3RvdHlwZS5saW5lPW9lKCJsaW5lIiksb3IucHJvdG90eXBlLmJlemllcj1vZSgiYmV6aWVyIiksb3IucHJvdG90eXBlLnJlY3Q9b2UoInJlY3QiKSxvci5wcm90b3R5cGUuZWxsaXBzZT1vZSgiZWxsaXBzZSIpLG9yLnByb3RvdHlwZS5iYWNrZ3JvdW5kPW9lKCJiYWNrZ3JvdW5kIiksb3IucHJvdG90eXBlLmltYWdlPW9lKCJpbWFnZSIpLG9yLnByb3RvdHlwZS50ZXh0V2lkdGg9b2UoInRleHRXaWR0aCIpLG9yLnByb3RvdHlwZS50ZXh0JGxpbmU9b2UoInRleHQkbGluZSIpLG9yLnByb3RvdHlwZS4kZW5zdXJlQ29udGV4dD1vZSgiJGVuc3VyZUNvbnRleHQiKSxvci5wcm90b3R5cGUuJG5ld1BNYXRyaXg9b2UoIiRuZXdQTWF0cml4Iiksb3IucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oZSx0LG4pe3NlKG49PT1jLldFQkdMPyIzRCI6IjJEIikseGUuc2l6ZShlLHQsbil9LG9yLnByb3RvdHlwZS4kaW5pdD11LGlyLnByb3RvdHlwZS4kaW5pdD1mdW5jdGlvbigpe3hlLnNpemUoeGUud2lkdGgseGUuaGVpZ2h0KSxBZS5saW5lQ2FwPSJyb3VuZCIseGUubm9TbW9vdGgoKSx4ZS5kaXNhYmxlQ29udGV4dE1lbnUoKX0sc3IucHJvdG90eXBlLiRpbml0PWZ1bmN0aW9uKCl7eGUudXNlM0RDb250ZXh0PSEwLHhlLmRpc2FibGVDb250ZXh0TWVudSgpfSxyci5wcm90b3R5cGUuJGVuc3VyZUNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQWV9LGRlLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8ZGUuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsMCksdmUpYmU9bmV3IEUuU2tldGNoLHNlKCkseGUuc2l6ZT1mdW5jdGlvbihlLHQsbil7c2UobiYmbj09PWMuV0VCR0w/IjNEIjoiMkQiKSx4ZS5zaXplKGUsdCxuKX0KZWxzZXtiZT1uIGluc3RhbmNlb2YgRS5Ta2V0Y2g/bjoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uZXcgRS5Ta2V0Y2gobik6bj9FLmNvbXBpbGUobik6bmV3IEUuU2tldGNoKGZ1bmN0aW9uKCl7fSkseGUuZXh0ZXJuYWxzLnNrZXRjaD1iZSxzZSgpLGRlLm9uZm9jdXM9ZnVuY3Rpb24oKXt4ZS5mb2N1c2VkPSEwfSxkZS5vbmJsdXI9ZnVuY3Rpb24oKXt4ZS5mb2N1c2VkPSExLGJlLm9wdGlvbnMuZ2xvYmFsS2V5RXZlbnRzfHxjZSgpfSxiZS5vcHRpb25zLnBhdXNlT25CbHVyJiYoeChsLCJmb2N1cyIsZnVuY3Rpb24oKXt5dCYmeGUubG9vcCgpfSkseChsLCJibHVyIixmdW5jdGlvbigpe3l0JiZkdCYmKHhlLm5vTG9vcCgpLHl0PSEwKSxjZSgpfSkpCnZhciBfcj1iZS5vcHRpb25zLmdsb2JhbEtleUV2ZW50cz9sOmRlCngoX3IsImtleWRvd24iLHBlKSx4KF9yLCJrZXlwcmVzcyIsbWUpLHgoX3IsImtleXVwIixnZSkKZm9yKHZhciBSciBpbiBFLmxpYilFLmxpYi5oYXNPd25Qcm9wZXJ0eShScikmJihFLmxpYltScl0uaGFzT3duUHJvcGVydHkoImF0dGFjaCIpP0UubGliW1JyXS5hdHRhY2goeGUpOkUubGliW1JyXWluc3RhbmNlb2YgRnVuY3Rpb24mJkUubGliW1JyXS5jYWxsKHRoaXMpKQp2YXIgTHI9MTAwLElyPWZ1bmN0aW9uKGUpe2lmKGJlLmltYWdlQ2FjaGUucGVuZGluZ3x8UEZvbnQucHJlbG9hZGluZy5wZW5kaW5nKExyKSlsLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtJcihlKX0sTHIpCmVsc2V7aWYobC5vcGVyYSl7dmFyIHQsbixpPWJlLmltYWdlQ2FjaGUub3BlcmFDYWNoZQpmb3IodCBpbiBpKWkuaGFzT3duUHJvcGVydHkodCkmJihuPWlbdF0sbnVsbCE9PW4mJmguYm9keS5yZW1vdmVDaGlsZChuKSxkZWxldGUgaVt0XSl9YmUuYXR0YWNoKGUsciksYmUub25Mb2FkKGUpLGUuc2V0dXAmJihlLnNldHVwKCksZS5yZXNldE1hdHJpeCgpLGJlLm9uU2V0dXAoKSkscSgpLGUuZHJhdyYmKHl0P2UubG9vcCgpOmUucmVkcmF3KCkpfX0KYih0aGlzKSxJcih4ZSl9fQpyZXR1cm4gRS5kZWJ1Zz1mdW5jdGlvbigpe3JldHVybiJjb25zb2xlImluIGw/ZnVuY3Rpb24oZSl7bC5jb25zb2xlLmxvZygiUHJvY2Vzc2luZy5qczogIitlKX06dX0oKSxFLnByb3RvdHlwZT1yLEUuaW5zdGFuY2VzPXgsRS5nZXRJbnN0YW5jZUJ5SWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHhbQVtlXV19LGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3ciUHJvY2Vzc2luZy5qcyBkb2VzIG5vdCBzdXBwb3J0ICIrZSsiLiJ9fWZvcih2YXIgbixyLGk9Im9wZW4oKSBjcmVhdGVPdXRwdXQoKSBjcmVhdGVJbnB1dCgpIEJ1ZmZlcmVkUmVhZGVyIHNlbGVjdEZvbGRlcigpIGRhdGFQYXRoKCkgY3JlYXRlV3JpdGVyKCkgc2VsZWN0T3V0cHV0KCkgYmVnaW5SZWNvcmQoKSBzYXZlU3RyZWFtKCkgZW5kUmVjb3JkKCkgc2VsZWN0SW5wdXQoKSBzYXZlQnl0ZXMoKSBjcmVhdGVSZWFkZXIoKSBiZWdpblJhdygpIGVuZFJhdygpIFByaW50V3JpdGVyIGRlbGF5KCkiLnNwbGl0KCIgIikscz1pLmxlbmd0aDtzLS07KW49aVtzXSxyPW4ucmVwbGFjZSgiKCkiLCIiKSxlW3JdPXQobil9KHIpLEV9fSx7fV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj17dmlydEVxdWFsczplKCIuL0hlbHBlcnMvdmlydEVxdWFscyIpLHZpcnRIYXNoQ29kZTplKCIuL0hlbHBlcnMvdmlydEhhc2hDb2RlIiksT2JqZWN0SXRlcmF0b3I6ZSgiLi9IZWxwZXJzL09iamVjdEl0ZXJhdG9yIiksUENvbnN0YW50czplKCIuL0hlbHBlcnMvUENvbnN0YW50cyIpLEFycmF5TGlzdDplKCIuL09iamVjdHMvQXJyYXlMaXN0IiksSGFzaE1hcDplKCIuL09iamVjdHMvSGFzaE1hcCIpLFBWZWN0b3I6ZSgiLi9PYmplY3RzL1BWZWN0b3IiKSxQRm9udDplKCIuL09iamVjdHMvUEZvbnQiKSxDaGFyOmUoIi4vT2JqZWN0cy9DaGFyIiksWE1MQXR0cmlidXRlOmUoIi4vT2JqZWN0cy9YTUxBdHRyaWJ1dGUiKSxYTUxFbGVtZW50OmUoIi4vT2JqZWN0cy9YTUxFbGVtZW50IiksUE1hdHJpeDJEOmUoIi4vT2JqZWN0cy9QTWF0cml4MkQiKSxQTWF0cml4M0Q6ZSgiLi9PYmplY3RzL1BNYXRyaXgzRCIpLFBTaGFwZTplKCIuL09iamVjdHMvUFNoYXBlIiksY29sb3JzOmUoIi4vT2JqZWN0cy93ZWJjb2xvcnMiKSxQU2hhcGVTVkc6ZSgiLi9PYmplY3RzL1BTaGFwZVNWRyIpLENvbW1vbkZ1bmN0aW9uczplKCIuL1A1RnVuY3Rpb25zL2NvbW1vbkZ1bmN0aW9ucyIpLGRlZmF1bHRTY29wZTplKCIuL0hlbHBlcnMvZGVmYXVsdFNjb3BlIiksUHJvY2Vzc2luZzplKCIuL1Byb2Nlc3NpbmciKSxzZXR1cFBhcnNlcjplKCIuL1BhcnNlci9QYXJzZXIiKSxmaW5hbGl6ZTplKCIuL0hlbHBlcnMvZmluYWxpemVQcm9jZXNzaW5nIil9CnIuZXh0ZW5kPXt3aXRoTWF0aDplKCIuL1A1RnVuY3Rpb25zL01hdGguanMiKSx3aXRoUHJveHlGdW5jdGlvbnM6ZSgiLi9QNUZ1bmN0aW9ucy9KYXZhUHJveHlGdW5jdGlvbnMiKShyLnZpcnRIYXNoQ29kZSxyLnZpcnRFcXVhbHMpLHdpdGhUb3VjaDplKCIuL1A1RnVuY3Rpb25zL3RvdWNobW91c2UiKSx3aXRoQ29tbW9uRnVuY3Rpb25zOnIuQ29tbW9uRnVuY3Rpb25zLndpdGhDb21tb25GdW5jdGlvbnN9LHQuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciBpPWZ1bmN0aW9uKCl7fSxzPXIudmlydEVxdWFscyxvPXIudmlydEhhc2hDb2RlLGE9ci5QQ29uc3RhbnRzLGw9ci5Db21tb25GdW5jdGlvbnMsaD1yLk9iamVjdEl0ZXJhdG9yLHU9ci5DaGFyLGM9ci5YTUxBdHRyaWJ1dGUoKSxmPXIuQXJyYXlMaXN0KHt2aXJ0SGFzaENvZGU6byx2aXJ0RXF1YWxzOnN9KSxwPXIuSGFzaE1hcCh7dmlydEhhc2hDb2RlOm8sdmlydEVxdWFsczpzfSksbT1yLlBWZWN0b3Ioe1BDb25zdGFudHM6YX0pLGc9ci5QRm9udCh7QnJvd3Nlcjp0LG5vb3A6aX0pLGQ9ci5YTUxFbGVtZW50KHtCcm93c2VyOnQsWE1MQXR0cmlidXRlOmN9KSx2PXIuUE1hdHJpeDJEKHtwOmx9KSx5PXIuUE1hdHJpeDNEKHtwOmx9KSx4PXIuUFNoYXBlKHtQQ29uc3RhbnRzOmEsUE1hdHJpeDJEOnYsUE1hdHJpeDNEOnl9KSxBPXIuUFNoYXBlU1ZHKHtDb21tb25GdW5jdGlvbnM6bCxQQ29uc3RhbnRzOmEsUFNoYXBlOngsWE1MRWxlbWVudDpkLGNvbG9yczpyLmNvbG9yc30pLGI9ci5kZWZhdWx0U2NvcGUoe0FycmF5TGlzdDpmLEhhc2hNYXA6cCxQVmVjdG9yOm0sUEZvbnQ6ZyxQU2hhcGVTVkc6QSxPYmplY3RJdGVyYXRvcjpoLFBDb25zdGFudHM6YSxDaGFyOnUsWE1MRWxlbWVudDpkLFhNTDpkfSksdz1yLlByb2Nlc3Npbmcoe2RlZmF1bHRTY29wZTpiLEJyb3dzZXI6dCxleHRlbmQ6ci5leHRlbmQsbm9vcDppfSkKcmV0dXJuIHc9ci5zZXR1cFBhcnNlcih3LHtCcm93c2VyOnQsYUZ1bmN0aW9uczpuLGRlZmF1bHRTY29wZTpifSksdz1yLmZpbmFsaXplKHcse3ZlcnNpb246ZSgiLi4vcGFja2FnZS5qc29uIikudmVyc2lvbixpc0RvbVByZXNlbnQ6dC5pc0RvbVByZXNlbnQsd2luZG93OnQud2luZG93LGRvY3VtZW50OnQuZG9jdW1lbnQsbm9vcDppfSl9fSx7Ii4uL3BhY2thZ2UuanNvbiI6MiwiLi9IZWxwZXJzL09iamVjdEl0ZXJhdG9yIjozLCIuL0hlbHBlcnMvUENvbnN0YW50cyI6NCwiLi9IZWxwZXJzL2RlZmF1bHRTY29wZSI6NiwiLi9IZWxwZXJzL2ZpbmFsaXplUHJvY2Vzc2luZyI6NywiLi9IZWxwZXJzL3ZpcnRFcXVhbHMiOjgsIi4vSGVscGVycy92aXJ0SGFzaENvZGUiOjksIi4vT2JqZWN0cy9BcnJheUxpc3QiOjEwLCIuL09iamVjdHMvQ2hhciI6MTEsIi4vT2JqZWN0cy9IYXNoTWFwIjoxMiwiLi9PYmplY3RzL1BGb250IjoxMywiLi9PYmplY3RzL1BNYXRyaXgyRCI6MTQsIi4vT2JqZWN0cy9QTWF0cml4M0QiOjE1LCIuL09iamVjdHMvUFNoYXBlIjoxNiwiLi9PYmplY3RzL1BTaGFwZVNWRyI6MTcsIi4vT2JqZWN0cy9QVmVjdG9yIjoxOCwiLi9PYmplY3RzL1hNTEF0dHJpYnV0ZSI6MTksIi4vT2JqZWN0cy9YTUxFbGVtZW50IjoyMCwiLi9PYmplY3RzL3dlYmNvbG9ycyI6MjEsIi4vUDVGdW5jdGlvbnMvSmF2YVByb3h5RnVuY3Rpb25zIjoyMiwiLi9QNUZ1bmN0aW9ucy9NYXRoLmpzIjoyMywiLi9QNUZ1bmN0aW9ucy9jb21tb25GdW5jdGlvbnMiOjI0LCIuL1A1RnVuY3Rpb25zL3RvdWNobW91c2UiOjI1LCIuL1BhcnNlci9QYXJzZXIiOjI2LCIuL1Byb2Nlc3NpbmciOjI3fV19LHt9LFsxXSkKCiAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIHdpbmRvdy5vbmVycm9yID0gKG1zZywgdXJsLCBsaW5lLCBjb2x1bW4sIGVycm9yKSA9PiB7CiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gewogICAgICAgICAgICBtZXNzYWdlOiBtc2csCiAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICBsaW5lOiBsaW5lLAogICAgICAgICAgICBjb2x1bW46IGNvbHVtbiwKICAgICAgICAgICAgZXJyb3I6IEpTT04uc3RyaW5naWZ5KGVycm9yKQogICAgICAgICAgfQoKICAgICAgICAgIGlmICh3aW5kb3cud2Via2l0KSB7CiAgICAgICAgICAgIHdpbmRvdy53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmVycm9yLnBvc3RNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yOiIsIG1lc3NhZ2UpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIC8vIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGZldGNoIElEIG9mIHNrZXRjaCBodG1sIGVsZW1lbnQKICAgICAgICBmdW5jdGlvbiBnZXRQcm9jZXNzaW5nU2tldGNoSUQgKCkgeyByZXR1cm4gJ1NrZXRjaCc7IH0KCiAgICA8L3NjcmlwdD4KICAgIAogICAgPHRpdGxlPnRpbTwvdGl0bGU+CgogIDwvaGVhZD4KCiAgPGJvZHk+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvcHJvY2Vzc2luZyI+CiAgICAgIAovLyAwLjIuNgovLyB0ZXN0ZXJzIHJlZWYgbWljaGEgYXRoaWwgZG9vZGxlIGphY2tzb24KaW50IFg9NzAzOwppbnQgWT02NjE7CmludCBndW5YPTcwMzsKaW50IGd1blk9NDYxOwppbnQgZ3Vuc2NvcmU9MDsKaW50IG1vdmVzY29yZT0wOwppbnQgc2NvcmU9MDsKaW50IGFpbXNjb3JlPTA7CmludCBzdGFydD0wOwppbnQgc3BlZWQ9MTsKaW50IGd1bnNwZWVkPTE7CmludCBjaGFuZ2U9MTsKaW50IHNwYWNlPTEwMDsKaW50IHNwYWNlTG9jaz0xOwppbnQgc2hvb3Rsb2NrPTA7CmZsb2F0IGJpb21lQ2hvb3NlPTE7CmludCBiaW9tZTE9MzQ7CmludCBiaW9tZTI9MTM5OwppbnQgYmlvbWUzPTM0OwppbnQgYmlvbWVMb2NrPTE7CmludCBoZWFsdGg9MTAwMDsKaW50IHNub3dMb2NrPTE7CmludCBtYXhIZWFsdGg9MTAwMDsKaW50IHBsYWluc1Njb3JlQWltPTE7CmludCBwZXdzY29yZT0xOwppbnQgc3BlZWRtYXg9OTsKaW50IHdpbj0wOwppbnQgWDE9NDAwOwppbnQgWTE9MTAwOwppbnQgWDI9NDAwOwppbnQgWTI9MzAwOwppbnQgWDM9NDAwOwppbnQgWTM9MzAwOwppbnQgWDQ9NjAwOwppbnQgWTQ9MzAwOwppbnQgWDU9NjAwOwppbnQgWTU9MzAwOwppbnQgWDY9NjAwOwppbnQgWTY9MTAwOwppbnQgWDc9NjAwOwppbnQgWTc9MTAwOwppbnQgWDg9NDAwOwppbnQgWTg9MTAwOwpmbG9hdCBlbmVteVNwYXduOwpmbG9hdCBlbmVteU1vdmU7CmludCBlbmVteUhlYWx0aD0xOwppbnQgd2luPTA7Cgp2b2lkIHNldHVwKCl7CnNpemUoMTEwMCw4MDApOwpmaWxsKDApOwpzdHJva2VXZWlnaHQoMTAwKTsKYmFja2dyb3VuZChiaW9tZTEsYmlvbWUyLGJpb21lMyk7CnRleHQoInVzZSBXQVNEIHRvIG1vdmUgdGhlIGdyZWVuIHRhbmsuIHVzZSBJSktMIHRvIG1vdmUgdGhlIGJsYWNrIGNpcmNsZSBhaW1lci4gdXNlIHRoZSBudW1iZXJzIHRvIGNvbnRyb2wgc3BlZWQiLDUwLDUwKTsKdGV4dCgicHJlc3MgRiB0byBmaXJlIHRoZSBndW4gZ2V0IDEwMDAwMCBzY29yZSBpbiBhbGwgb2YgdGhlIHNjb3JlcyB0byB3aW4uIHByZXNzIEggdG8gaGVhbCIsNTAsMTAwKTsKdGV4dFNpemUoNzUpOwp0ZXh0KCJUQU5LIFNJTVVMQVRPUiBQUkVTUyBCIiw1MCw1MDApOwp0ZXh0U2l6ZSgyNSk7CnRleHQoIkVQTElQU1kgV0FSTklORyIsNzAwLDUwKTsKdGV4dFNpemUoNyk7CnRleHQoImRvbid0IHByZXNzIHNwYWNlIiw1MCw2MDApOwpzdHJva2UoMCwxMDAsMCk7CnN0cm9rZVdlaWdodCgxMDApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKDApOwpzdHJva2VXZWlnaHQoNjApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApO30KCnZvaWQgZHJhdygpewppZiAoZ3Vuc2NvcmU+MTAwMDAwKXsKaWYgKHNjb3JlPjEwMDAwMCl7CmlmIChtb3Zlc2NvcmU+MTAwMDAwKXsKaWYgKGFpbXNjb3JlPjEwMDAwMCl7CmJpb21lQ2hvb3NlPS0xOTk7Cndpbj0xO319fX0KewppZiAoaGVhbHRoPm1heEhlYWx0aCl7CmhlYWx0aD1tYXhIZWFsdGg7fQp7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKc3Ryb2tlV2VpZ2h0KDUwKTsKbGluZSg0MDAsMjAwLDcwMCw0MDApOwpzdHJva2UoMCk7CnN0cm9rZVdlaWdodCg2MCk7CnBvaW50KDQwMCwyMDApOwppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2InKXsKc3RhcnQ9MTt9CnsKaWYgKFg8MCl7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7CmVuZW15U3Bhd249cmFuZG9tKDEwKTsKWD0xMTAwO30KewppZiAoWT43NTApewpZPTE7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7CmVuZW15U3Bhd249cmFuZG9tKDEwKTt9CnsKaWYgKFk8MCl7Clk9NzQ5OwpiaW9tZUNob29zZT1yYW5kb20oMSw1LjEpOwplbmVteVNwYXduPXJhbmRvbSgxMCk7fQp7CmlmIChYPjExMDApewpYPTE7CmJpb21lQ2hvb3NlPXJhbmRvbSgxLDUuMSk7CmVuZW15U3Bhd249cmFuZG9tKDEwKTt9CnsKaWYgKGd1blg+MTEwMCl7Cmd1blg9WDt9CnsKaWYgKGd1blg8MCl7Cmd1blg9WDt9CnsKaWYgKGd1blk+NzUwKXsKZ3VuWT1ZO30KewppZiAoZ3VuWTwwKXsKZ3VuWT1ZO30KewppZiAoc3RhcnQ9PTEpewppZiAoc3BlZWQ+c3BlZWRtYXgpewpzcGVlZD1zcGVlZG1heDt9CnsKdGV4dFNpemUoMTUpOwpiYWNrZ3JvdW5kKGJpb21lMSxiaW9tZTIsYmlvbWUzKTsKc3Ryb2tlV2VpZ2h0KDEwKTsKc3Ryb2tlKDApOwpsaW5lKDAsMCwxMTAwLDApOwpsaW5lKDAsMCwwLDgwMCk7CmxpbmUoMCw4MDAsMTEwMCw4MDApOwpsaW5lKDExMDAsMCwxMTAwLDgwMCk7CnRleHQoInNob290aW5nIHNjb3JlIiw1MCwzMCk7CnRleHQoZ3Vuc2NvcmUsNTAsNTApOwp0ZXh0KG1vdmVzY29yZSwyMDAsNTApOwp0ZXh0KCJtb3Zpbmcgc2NvcmUiLDIwMCwzMCk7CnRleHQoYWltc2NvcmUsNDAwLDUwKTsKdGV4dCgiYWltaW5nIHNjb3JlIiw0MDAsMzApOwpzY29yZT1haW1zY29yZStndW5zY29yZSttb3Zlc2NvcmU7CnRleHQoc2NvcmUsNTAwLDUwKTsKdGV4dCgiYmlvbWUiLDgwMCwzMCk7CnRleHQoInNjb3JlIiw1MDAsMzApOwpzdHJva2VXZWlnaHQoMTAwKTsKc3Ryb2tlKDApOwpzdHJva2UoMCwxMDAsMCk7CnBvaW50KFgsWSk7CnN0cm9rZVdlaWdodCgyNSk7CnN0cm9rZSgwKTsKcG9pbnQoZ3VuWCxndW5ZKTsKc3Ryb2tlV2VpZ2h0KDE1KTsKc3Ryb2tlKDM0LDEzOSwzNCk7CnBvaW50KGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCg2NSk7CnN0cm9rZSgwKTsKdGV4dCgiaGVhbHRoIiw5MDAsMzApOwp0ZXh0KGhlYWx0aCw5MDAsNTApOwpwb2ludChYLFkpOwpzdHJva2UoMCk7CmZpbGwoMCk7CnRleHQoInRhbmsgc3BlZWQiLDY1MCwzMCk7CnRleHQoc3BlZWQsNjUwLDUwKTsKdGV4dCgibWF4IGhlYWx0aCIsMTAwMCwzMCk7CnRleHQobWF4SGVhbHRoLDEwMDAsNTApOwppZiAoc3BhY2VMb2NrPjApewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JyAnKXsKYmFja2dyb3VuZCgwKTsKZmlsbCgyNTUpOwp0ZXh0U2l6ZSg3NSk7CnRleHQoImRvbid0IHByZXNzIHNwYWNlIiwxMCw0MDApOwpzcGFjZT1zcGFjZS0xOwp0ZXh0KHNwYWNlLDEwLDYwMCk7CnRleHRTaXplKDEpO30KfXsKaWYgKHNwYWNlPDApewpiaW9tZUxvY2s9MjsKc3BhY2VMb2NrPTA7CnRleHRTaXplKHJhbmRvbSgxMDApKTsKZmlsbChyYW5kb20oMjU1KSxyYW5kb20oMjU1KSxyYW5kb20oMjU1KSk7CnN0cm9rZShyYW5kb20oMjU1KSxyYW5kb20oMjU1KSxyYW5kb20oMjU1KSk7CmJhY2tncm91bmQocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwpsaW5lKHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSxyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwpwb2ludChyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwpiZWdpblNoYXBlKCk7CnZlcnRleChyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwp2ZXJ0ZXgocmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKdmVydGV4KHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7CmVuZFNoYXBlKCk7CnNob290bG9jaz0xOwpndW5YPTEwMDAwMDAwMDA7Clg9MTAwMDAwMDAwMDsKdGV4dCgieW91IHByZXNzZWQgc3BhY2UiLHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nMScpewpzcGVlZD0xO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzInKXsKc3BlZWQ9Mjt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSczJyl7CnNwZWVkPTM7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nNCcpewpzcGVlZD00O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzUnKXsKc3BlZWQ9NTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc2Jyl7CnNwZWVkPTY7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nNycpewpzcGVlZD03O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzgnKXsKc3BlZWQ9ODt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc5Jyl7CnNwZWVkPTk7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0ndycpewpZPVktc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrc3BlZWQ7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0ncycpewpZPVkrc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrc3BlZWQ7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nZCcpewpYPVgrc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrc3BlZWQ7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nYScpewpYPVgtc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrc3BlZWQ7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0naScpewpndW5ZPWd1blktMjsKYWltc2NvcmU9YWltc2NvcmUrcGxhaW5zU2NvcmVBaW07fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0naycpewpndW5ZPWd1blkrMjsKYWltc2NvcmU9YWltc2NvcmUrcGxhaW5zU2NvcmVBaW07fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nbCcpewpndW5YPWd1blgrMjsKYWltc2NvcmU9YWltc2NvcmUrcGxhaW5zU2NvcmVBaW07fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0naicpewpndW5YPWd1blgtMjthaW1zY29yZT1haW1zY29yZStwbGFpbnNTY29yZUFpbTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdmJyl7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKZ3Vuc2NvcmU9Z3Vuc2NvcmUrcGxhaW5zU2NvcmVBaW07CnN0cm9rZVdlaWdodCg0OCk7CmxpbmUoWCxZLGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCg1MSk7CnN0cm9rZSgwKTsKcG9pbnQoWCxZKTt9CnsKaWYgKGVuZW15U3Bhd248MS4wMSl7CmlmIChlbmVteUhlYWx0aD4wKXsKZW5lbXlNb3ZlPXJhbmRvbSg0KTsKc3Ryb2tlV2VpZ2h0KDEwKTsKbGluZShYMSxZMSxYMixZMik7CmxpbmUoWDMsWTMsWDQsWTQpOwpsaW5lKFg1LFk1LFg2LFk2KTsKbGluZShYNyxZNyxYOCxZOCk7CnN0cm9rZVdlaWdodCgyNSk7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKaGVhbHRoPWhlYWx0aC0yOwpsaW5lKFgxLFkxLFgsWSk7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKbGluZShYMixZMixYLFkpOwpzdHJva2UocmFuZG9tKDEwMCwyNTUpLDAsMCk7CmxpbmUoWDMsWTMsWCxZKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApOwpsaW5lKFg0LFk0LFgsWSk7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKbGluZShYNSxZNSxYLFkpOwpzdHJva2UocmFuZG9tKDEwMCwyNTUpLDAsMCk7CmxpbmUoWDYsWTYsWCxZKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApOwpsaW5lKFg3LFk3LFgsWSk7fX0KewppZiAoZW5lbXlTcGF3bjwxLjAxKXsKaWYgKG1vdXNlUHJlc3NlZD09dHJ1ZSl7CmlmIChtb3VzZVg+WDEpewppZiAobW91c2VYPFg3KXsKaWYgKG1vdXNlWT5ZMSl7CmlmIChtb3VzZVk8WTUpewplbmVteUhlYWx0aD1lbmVteUhlYWx0aC0xO319fX19fQp7CmlmIChlbmVteVNwYXduPjEpewplbmVteUhlYWx0aD0zMDA7CiBYMT00MDA7CiBZMT0xMDA7CiBYMj00MDA7CiBZMj0zMDA7CiBYMz00MDA7CiBZMz0zMDA7CiBYND02MDA7CiBZND0zMDA7CiBYNT02MDA7CiBZNT0zMDA7CiBYNj02MDA7CiBZNj0xMDA7CiBYNz02MDA7CiBZNz0xMDA7CiBYOD00MDA7CiBZOD0xMDA7fQp7CmlmIChiaW9tZUxvY2s9PTEpewppZiAoYmlvbWVDaG9vc2U+MC41OSl7CmlmIChiaW9tZUNob29zZTwyKXsKZmlsbCgwKTsKcmVjdCgzMDAsNTAwLDMwMCw0MDApOwpmaWxsKDI1NSk7CnRleHQoIkhvbWUgYmFzZSIsMzAwLDcwMCk7CmZpbGwoMCk7CnN0cm9rZVdlaWdodCgyMCk7CmxpbmUoODAwLDgwMCw4MDAsNjAwKTsKbGluZSg4MDAsNjAwLDExMTAsNjAwKTsKZmlsbCgwKTsKdGV4dCgiUHJhY3RpY2UgdGFuayIsOTAwLDc5MCk7CnN0cm9rZVdlaWdodCgxMDApOwp0ZXh0U2l6ZSg1MCk7CnRleHQoIkFMTCBTVEFUUyBBUkUgQk9PU1RFRCBJTiBQTEFJTlMiLDEwLDMwMCk7CnRleHRTaXplKDE1KTsKcG9pbnQoOTAwLDcwMCk7CmVuZW15U3Bhd249MTE7CmJpb21lMT0zNDsKYmlvbWUyPTEzOTsKYmlvbWUzPTM0Owp0ZXh0KCJwbGFpbnMiLDgwMCw1MCk7CnNwZWVkbWF4PTEwOwpzcGVlZD0xMDsKcGxhaW5zU2NvcmVBaW09MTA7CmhlYWx0aD1oZWFsdGgrMTt9Cn17CmlmIChiaW9tZUNob29zZT4xLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDMpewpiaW9tZTE9MTA1OwpiaW9tZTI9MTA1OwpiaW9tZTM9MTA1OwpzdHJva2UoMCk7CnRleHQoIk1vdW50YWlucyIsODAwLDUwKTsKc3BlZWRtYXg9OTsKcGV3c2NvcmU9MTsKcGxhaW5zU2NvcmVBaW09MTt9Cn17CmlmIChiaW9tZUNob29zZT4yLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDQpewpiaW9tZTE9MjQwOwpiaW9tZTI9MjQwOwpiaW9tZTM9OTA7CnBsYWluc1Njb3JlQWltPTE7CnRleHQoImRlc2VydCIsODAwLDUwKTsKc3BlZWRtYXg9OTsKcGV3c2NvcmU9MTsKc3Ryb2tlV2VpZ2h0KDUwKTt9Cn17CmlmIChzbm93TG9jaz09MSl7CmlmIChiaW9tZUNob29zZT4zLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDQuODApO3sKYmlvbWUxPTI1NTsKYmlvbWUyPTI1MDsKYmlvbWUzPTI1NTsKcGxhaW5zU2NvcmVBaW09MTsKdGV4dCgic25vdyIsODAwLDUwKTsKc3BlZWRtYXg9OTsKcGV3c2NvcmU9MTsKCn0KfX17CiAgaWYgKGJpb21lQ2hvb3NlPDUuMSl7CiAgICBzbm93TG9jaz0xO30KICAgIHsKaWYgKGJpb21lQ2hvb3NlPT01LjEpewogIHNub3dMb2NrPTA7CiAgYmlvbWUxPTE7CiAgYmlvbWUyPTQwOwogIGJpb21lMz0xOwp0ZXh0KCJ3YXN0ZWxhbmQiLDgwMCw1MCk7CnBsYWluc1Njb3JlQWltPTE7CnN0cm9rZSgwKTsKc3Ryb2tlV2VpZ2h0KDEwMCk7CnBvaW50KDIwMCwyMDApOwpzdHJva2VXZWlnaHQoNTApOwpzdHJva2UocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwptYXhIZWFsdGg9bWF4SGVhbHRoLTI7CmZpbGwocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwp0ZXh0U2l6ZShyYW5kb20oMTAwKSk7CnBld3Njb3JlPTE7CnRleHQoImVzY2FwZSIscmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKZmlsbCgwKTsKbGluZSgyMDAsMjAwLFgsWSk7CnNwZWVkPTE7fQp7CmlmIChoZWFsdGg8MCl7CnNob290bG9jaz0xOwpiYWNrZ3JvdW5kKDApOwpmaWxsKDI1NSk7CnRleHRTaXplKDI1KTsKdGV4dCgiaXRzIG92ZXIiLDQwMCw1MDApO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2gnKXsKaGVhbHRoPWhlYWx0aCsxO30KewppZiAoaGVhbHRoPjEwMDApewpoZWFsdGg9MTAwMDt9CnsKaWYgKHNob290bG9jaz09MCl7CmlmIChtb3VzZVByZXNzZWQ9PXRydWUpewpndW5YPW1vdXNlWDsKZ3VuWT1tb3VzZVk7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKc3Ryb2tlV2VpZ2h0KDQ4KTsKbGluZShYLFksZ3VuWCxndW5ZKTsKc3Ryb2tlV2VpZ2h0KDQwKTsKc3Ryb2tlKDApOwpwb2ludChYLFkpOwphaW1zY29yZT1haW1zY29yZStwbGFpbnNTY29yZUFpbTsKZ3Vuc2NvcmU9Z3Vuc2NvcmUrcGxhaW5zU2NvcmVBaW07fQp9ewppZiAobW91c2VQcmVzc2VkPT10cnVlKXsKaWYgKGJpb21lQ2hvb3NlPjAuNTkpewppZiAoYmlvbWVDaG9vc2U8Mil7CmlmIChtb3VzZVg+ODAwKXsKaWYgKG1vdXNlWT42MDApewpwZXdzY29yZT0xMDt9fX19fQp7CmlmIChlbmVteU1vdmU+MCk7ewppZiAoZW5lbXlNb3ZlPDEuMDEpewpYMT1YMS05OwpYMj1YMi05OwpYMz1YMy05OwpYND1YNC05OwpYNT1YNS05OwpYNj1YNi05OwpYNz1YNy05OwpYOD1YOC05O319CnsKaWYgKGVuZW15TW92ZT4xKXsKaWYgKGVuZW15TW92ZTwyLjAxKXsKWDE9WDErOTsKWDI9WDIrOTsKWDM9WDMrOTsKWDQ9WDQrOTsKWDU9WDUrOTsKWDY9WDYrOTsKWDc9WDcrOTsKWDg9WDgrOTt9fQp7CmlmIChlbmVteU1vdmU+Mil7CmlmIChlbmVteU1vdmU8My4wMSl7ClkxPVkxLTk7ClkyPVkyLTk7ClkzPVkzLTk7Clk0PVk0LTk7Clk1PVk1LTk7Clk2PVk2LTk7Clk3PVk3LTk7Clk4PVk4LTk7fX0KewppZiAoZW5lbXlNb3ZlPjMpewppZiAoZW5lbXlNb3ZlPDQpewpZMT1ZMSs5OwpZMj1ZMis5OwpZMz1ZMys5OwpZND1ZNCs5OwpZNT1ZNSs5OwpZNj1ZNis5OwpZNz1ZNys5OwpZOD1ZOCs5O319CnsKaWYgKHdpbj09MSl7CmJhY2tncm91bmQoMCk7CmZpbGwocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwp0ZXh0U2l6ZSgxMDApOwp0ZXh0KCJZT1UgV0lOIiw1MCw1NTApO30Kewp9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0KCgogICAgPC9zY3JpcHQ+CiAgICAKICAgIDxjYW52YXMgaWQ9IlNrZXRjaCI+PC9jYW52YXM+CiAgICAKICA8L2JvZHk+CjwvaHRtbD4K