Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error: rosetta: (502) bad gateway #10088

Closed
4 tasks
yaruwangway opened this issue Sep 6, 2021 · 12 comments · Fixed by #10150
Closed
4 tasks

Error: rosetta: (502) bad gateway #10088

yaruwangway opened this issue Sep 6, 2021 · 12 comments · Fixed by #10150

Comments

@yaruwangway
Copy link
Contributor

Summary of Bug

I run a local test of gaia upgrade (upgrade dependency of cosmos-sdk from 0.42 to 0.43) and have the bug of resetta bad gateway after upgrade.

I export the genesis file from live cosmoshub-4 and change the genesis file: I change two validators in the exported genesis file to be my nodes, and change one validator's power over 67% so I can start a local chain. then I use cosmovisor starts the two nodes and let them listen to each other. I submit upgrade proposal and the node upgrades successfully upon the proposed height, however, the validator stops and throw the Error: rosetta: (502) bad gateway after upgrade and produced a few blocks. I can restart the validator again ,but it will just produce a couple more blocks and throw the same error.

INF ABCIQuery data= module=rpc path=/cosmos.bank.v1beta1.Query/TotalSupply result={"code":0,"codespace":"","height":"7368611","index":"0","info":"","key":null,"log":"","proofOps":null,"value":"CkwKRGliYy8wNzkxMkMyNDAwNDkzMkNENTYxQjE3NTE1NjJCMjJFQTc4N0YzMUY5ODIxNTY4Qjg4RjU1QThGNTFEMzI2NzIyEgQ1MDAwClIKRGliYy8wODBENzYwNEQ5QzE5NjBBMzU2MkUxQUU0RThFQThGMzBCNzgxMzgxMEFFMzA2NjBENDFERDY3NzBCMUM1OTI5EgoxMDAwMDAwMDAwCkkKRGliYy8wODgzNEE3NkY0RTVBRUQwODY5MDkxNkY2MUVBMTJBQTcxQ0ZENjM2QkJBMzI4MDYyMDI3REY5RkE2MjBCN0UzEgExCkkKRGliYy8wRU ... ... Error: rosetta: (502) bad gateway

Version

upgrade dependency of cosmos-sdk 0.42 to 0.43

Steps to Reproduce

details of procedures:
gaia vega upgrade


For Admin Use

  • Not duplicate issue
  • Appropriate labels applied
  • Appropriate contributors tagged
  • Contributor assigned/self-assigned
@fdymylja
Copy link
Contributor

fdymylja commented Sep 7, 2021

I'm not currently understanding how rosetta can be in any way involved in this. The bad gateway error is returned by rosetta if it is trying to communicate with a node which is unreachable.

The following are the two lines of code which return the bad gateway error:

  1. https://github.com/cosmos/cosmos-sdk/blob/v0.43.0/server/rosetta/client_online.go#L181
  2. https://github.com/cosmos/cosmos-sdk/blob/v0.43.0/server/rosetta/client_online.go#L190

This is an API call, which some component is making (I'm not sure which one?). And I'm not understanding why this should in any way hinder an upgrade. Unless there's some conflicting readiness check on rosetta (which to work needs the tendermint RPC node it is pointing to to be functional).

Maybe having the full error would be helpful.

@jgimeno @noandrea

@yaruwangway
Copy link
Contributor Author

yaruwangway commented Sep 7, 2021

Hi @fdymylja,

Here is the full error after upgrade, the validator produced a few blocks then:
5:21PM INF committed state app_hash=4B11D76BA7EF7F274DEC97750BDC3CA32E76D5E564345CB8ABB15C217FD3F724 height=7368611 module=state num_txs=0 5:21PM INF indexed block height=7368611 module=txindex 5:21PM INF ABCIQuery data= module=rpc path=/cosmos.bank.v1beta1.Query/TotalSupply result={"code":0,"codespace":"","height":"7368611","index":"0","info":"","key":null,"log":"","proofOps":null,"value":"CkwKRGliYy8wNzkxMkMyNDAwNDkzMkNENTYxQjE3NTE1NjJCMjJFQTc4N0YzMUY5ODIxNTY4Qjg4RjU1QThGNTFEMzI2NzIyEgQ1MDAwClIKRGliYy8wODBENzYwNEQ5QzE5NjBBMzU2MkUxQUU0RThFQThGMzBCNzgxMzgxMEFFMzA2NjBENDFERDY3NzBCMUM1OTI5EgoxMDAwMDAwMDAwCkkKRGliYy8wODgzNEE3NkY0RTVBRUQwODY5MDkxNkY2MUVBMTJBQTcxQ0ZENjM2QkJBMzI4MDYyMDI3REY5RkE2MjBCN0UzEgExCkkKRGliYy8wRUZDOUNFNTE3RDVDODY4QzIzRkI5MUYzMUIyMkFBMUZBNEI2M0JEN0NDNTgzQkQ1ODU1RjQ1RjVEQkY5OUJCEgExClUKRGliYy8xMkRBNDIzMDRFRTFDRTk2MDcxRjcxMkFBNEQ1ODE4NkFEMTFDMzE2NUMwRENEQTcxRTAxN0E1NEYzOTM1RTY2Eg04NTU1OTA5OTM0MjA4ClQKRGliYy8xNEY5QkMzRTQ0QjhBOUMxQkUxRkIwODk4MEZBQjg3MDM0Qzk5MDVFRjE3Q0YyRjUwMDhGQzA4NTIxODgxMUNDEgwxMDM0Nzg1NjQ2NTEKTApEaWJjLzE1MTRBOTcyRTFGREE3MzExQjBCRkM5NzU2QjhENjNBRTA5NDUyNzkwMDVEOERDQzU3NTFFMzQ3NkFBQkI4RjYSBDk1MDAKSwpEaWJjLzE2OUQ4M0E0RkJDN0YzNDhGRDAzQkJBMjVEMTUzODAyRUUxQjEwNTZGMjcxODE5MEFENkUwMEQ2OEJBMkVCOEUSAzUwMApMCkRpYmMvMTc4RjA2NjVDQzc4RkQ2QUNBNDBFM0VEMjNBNzI4RDk2NTkyQjI5OTYxRDNCMjlDRDhGNjA4OENCMjhENDk4RhIEMTAwMApRCkRpYmMvMTg4ODQ0RDc1NzE5MTc4QTY1M0MzNzgzNDIxRjk3MzE3NTk4MTVGRTJENThCRDM3RjYxMkQ5NTQzMDhBNTI2RRIJMTM2NjYyNzgxCksKRGliYy8xQTQyMTU4MzJCNTY2RTRDMkNBRTg5N0U0QTYwRUJCOTQ5OEE1Qjg3OUREREE1RUMzQzIxNDUwNjMyRDZDRDY4EgM1MDAKTApEaWJjLzFCNzJGNjQxMTIwMzgwQUIwQjc4OUY2QTQ2QjdGMzNCMTkyQTA5RkY5M0NCQ0MyOTkwNDRFNzk1M0ZGNUFDMDkSBDIwMDAKTgpEaWJjLzFCQUJCOTY3QkYzMEUzMzE0OEYxNkM3NjNEN0U1MzRDRDZFRDdBOTA4OTMwRTZGQjVCRUZDNERFODExMjg2QzISBjk4NzY1NApVCkRpYmMvMUJFOTFENjc3NzU3MjNEMzIzMEE5QTVBQzU0QkIyOUI5MkE1QTUxQjRCOEYyMEJCQTM3REYxQ0ZBNjAyMjk3QxINMjA0MDE2MjU0OTkyNApPCkRpYmMvMUM3M0Q1MjUxODc5QzRCQjgzMTA2RTg5MEVFMzNCRjU0NjREMjIwNjZGQ0RDQTVFQ0NBN0NDNTcwNUFFMTNENRIHMTAwMDAwMApUCkRpYmMvMUZCREQ1OEQ0MzhCNEQwNEQyNkNCRkIyRTcyMkMxODk4NEEwRjFBNTI0NjhDNEY0MkYzN0QxMDJGM0QzRjM5ORIMMzU4MTczODYxNTg3ClQKRGliYy8yMTgxQUFCMDIxOEVBQzI0QkM5Rjg2QkQxMzY0RkJCRkEzRTZFM0ZDQzI1RTg4RTNFNjhDMTVEQzZFNzUyRDg2EgwzNDIxMzc0NjAzMDgKTApEaWJjLzMwOTQyRDM4NTRDNzk3MTE2NTQ1NDUwNzNEMkQ2QzdBNTlDQTZDODdGRkQzNzkyQ0Y0NUVFNkUzNTMyQjU4RTkSBDEwMDAKTgpEaWJjLzMxMUE2Rjc1MTE1NzYyRjg4RjJBQzdENzExMEMyNjk0NTQ3Q0FDQTQzMTEwQThCNTIzREVCQkU3RTY1OTFFMUESBjUwMDAwMApRCkRpYmMvMzNBOUQwREVGQzZFQ0FFOUE4OTMxRDQyNjYwQzJFNzQxODBCRUY3QzdERUYyMTdFNEFBRDZEODFDMThFQjA2RhIJMTE0NTI3NTAwCkkKRGliYy8zQTEyNzgxNzFBMzczQUYzOTdFNTYxNzFCNDQzRTI5RDA1N0Y1QjMwOTU1REJBNUM1RUE5MjBBREM2N0U5OUJCEgExCkkKRGliYy8zQUUxMjlBNDEyOUE2OEJENTY5Qjk4NUU4ODc3NTdCNEZEMEY5RTI0Qjg2RTA0RUQzOTE3MDYwRDMyQkFGNTY5EgExCk8KRGliYy8zQkM3QjZGRDJDOTUyQTdDOTZGMUJFNDA4RTA0OUYxOUQ4ODIxRUFDRUREQTRGQTI4NEJBQjM3QjQ4NTQ1NjRBEgcyMDAwMDAwClYKRGliYy80MkU0N0E1QkE3MDhFQkU2RTBDMjI3MDA2MjU0RjI3ODRFMjA5RjREQkQzQzZCQjc3RURDNEIyOUVGODc1RThFEg40MDYxMTM1MDQ2MzkyMgpPCkRpYmMvNDUzNUUzOUJDQjZGOTMxRDQ5MkIwQjAxRUIyOTFDNDcwNDE2QzdCRTE5NTExMEYxQkFGMDgxOEU1NDNDRkU4NhIHNTAwMDAwMApMCkRpYmMvNDYxQjQwOEQwM0VFQUU5QTUxMkM4RUE4QUY5MzQ5MzM2NDRCQkVCMEY3ODI1MkEyMkU4NkU3MDM1NjI1Q0Y2NBIEMTIzNApPCkRpYmMvNTE5RTgzMURCNUMzNjMzOEYyRDczNENBRjZDQjdGQzY4OUI5MjY3RTEwRUUwMDQ1NDI3MzI3NThGQjExRjZCNBIHMTg2Mjk3NQpJCkRpYmMvNTRBN0YyNkVFMTRGNDVDNzQ5MUJBMENEQ0EzMDVFQTFFN0JFMkE0RUREMzQyNDA4RjEzMzhGMkI5RTZFQUU4OBIBMQpPCkRpYmMvNUJCNjk0RDQ2NkNDRjA5OUVGNzNGMTY1Rjg4NDcyQUY1MUQ5QzQ5OTFFQUE0MkJEMTE2OEM1MzA0NzEyQ0MwRBIHMzY1NDUxMApJCkRpYmMvNUY4MTRGMDc5MUY4NDI4NjkzMjUyQTBBNzI3OEFCQkExNjFDMTBCMjNCOUYwRkYzRTk3QzBGMjFCOUIzNjA3RRIBMQpUCkRpYmMvNjhBMzMzNjg4RTVCMDc0NTFGOTU1NTVGOEZFNTEwRTQzRUY5RDNENDRERjA5MDk5NjRGOTIwODFFRjlCRTVBNxIMMjAwNDgzNTMyNDU1ClAKRGliYy82RDBBNkFCNTcwRDRFM0U1QkY0NkEzQkE0QTFGRjI1QTUxRDVDOUUyMzhBQzk0QzE4N0RDRDI1NDNGODc4MUVDEggyNDAzMDAwMApLCkRpYmMvNzBFQ0ZCNzlFNEQ1QUU1MkY1N0RENzVCMUVDMTdFMDQ4NDcyQTQwMDA1NzExREU5NkZGRjFDQ0U2RjQ0NzFGRRIDNTAwCkwKRGliYy83MUMyQzI2QTg0OTk2RDlFODZBMDA3RTg4N0ZCNTk2NDk4MDhBNzQ3M0E4OUU3NDc3MzhFQUUxQkVDOTMxMURFEgQxMDAwCkkKRGliYy83M0NEOUMwRTVBNEEyNTVEODFDQUFEOTdGOTMxMDg0RUZEMDA2RTY4REUwRUIwQzJDQkFBNTVGNkUzQjQxNjkxEgExCkoKRGliYy83NkU3MUU2OUQ4QjQ4N0VDQ0NGOTMwRDI0RjU5OUI1NDhGMUMyRjlDODQ1MEJFN0JFREQ1M0ExRjM0NzcyQUJDEgI5OQpOCkRpYmMvNzhEMkU3MjcyNEZENDcwRTQ1MUYwOEFFQjY1REJDMDExMTA2Q0Y3NkE5RkZGRDBGNjFENzYxNzg5MTRBMDk3MBIGOTkwMDAwClEKRGliYy83Q0JGRTYzMjU5OUVDMzM5M0U0M0Q4OTlFMDVCRjY3MUE0MUJGMzg4Q0YzMzNGRURBMDU5NUM2MEUzNDVEQTI3EgkxMDk1MjcyNTcKVApEaWJjLzgxRDA4QkMzOUZCNTIwRUJEOTQ4Q0YwMTc5MTBERDY5NzAyRDM0QkY1QUMxNjBGNzZEM0I1Q0ZDNDQ0RUJDRTASDDEyODQyNjEwNTAyMApSCkRpYmMvODU0QTJCM0YzQzY3OTU5ODU5MTQxMTg4M0RGNjBFRjIxNkUwRENBODNFMTQxODA4QTU1RDhDNEJDODQ0MzY0MRIKMTkwNzk0OTc1MwpOCkRpYmMvODYxOTk5QTA3QjlBMjgwQTAyNjJDNzYxRDJDOEUwMzBGRERGOUI5RThBMDlCQThFMEE5NjdCMEMzODFCQThFORIGMTAwMDAwCkoKRGliYy84OEE4OTdENjgyRDVFQTlFNDJCNDcxNUJFMDYyMzQ2RjVERkJBNzI4M0E3QTAzNDcwQUQwREFBMUU5NUQ1NDc3EgIxMApOCkRpYmMvOEFGM0IyN0EzQUJDMDlGN0RENjI5QTY0N0U0REExMzJEM0FDRjkwNjc4RjhEMkIzQ0Q3OUI1N0E2MDFDNEM2QxIGNjAwMDAwClIKRGliYy84QzlFOEE5RUZGNzA2REY5ODUzRDVFOEJENTFBRjMwNUY0OUI3Q0QyQTI5RjUwNDQ0Q0RBNzExRkZGQThEQjM4EgoxMDEwMDAxMTAwCk8KRGliYy84RkMyMUYyQzVFNDhENTcyREExQTYyMDQzRjc3QjFBNkNGNkNBRUQ0MjVCQjMzRDIwOTBGNjREOUU4RTBBQUZGEgc1MDAwMDAwClAKRGliYy85MEZBMzNGN0FFMzlGODgyRDRGRTk5RUE5NUNFQUU2MzM3QkUzMEVEMEUxRkI5ODU0NENDOEYwNzIzNzkyMjE4Egg3MTAwMDAwMApTCkRpYmMvOTEyNjk0QzFCNjc1RkQxMTRFNTIyM0NFNUQ4QTQzMEZEOTA4RERDMDU0OTU3OEZGNkM3NUIwMUE2NUEyMzkyQRILMjUwMDAwMDAxMDAKTQpEaWJjLzkyNjc2REFCNUZCRjcxQzVDNkU4MTlCMDY1Q0JGMEYyQkEzOTA3RDZGRDU4RUE3RjY2QTJBMkY0RTNFM0NEODISBTIwMDAwCk8KRGliYy85QTdGRkYwRDAyNTEzMzI5MzExNjkyNzhGNzg1NTVEMEY5NEUzMkU2QjYzNjY2NzBBOEY2RTNGQjk4REU2Q0ZEEgcxOTk5ODc3CksKRGliYy85QzQ1N0YzNkRCNUIzNDlDQzExQTkzNEIzMDRCRkJCMDM0OTlGMjFCQzM1MDIzRkVBQUE0RkI5QUNGRTJDOUYyEgM3NzcKUQpEaWJjLzlGQkE3OUY4MzA2MTdEOEMxN0M2RDIyQkExQkIwNjlDMDUxNURBRjJGOTQyQzVEODI4NjM1NTI4MzJFMDBGMDESCTY3ODU2OTc0OApKCkRpYmMvQTE3NkEzRTkyOTc2QzdGQjBGRTJCNTBEQzAxMUQyM0VDODRCNTBBMDNBODg3NzNFRkMxOUYyNzM4RUYzMjNDORICMTAKTApEaWJjL0E0QTc5QzBFNjkwQTk5ODlEQUZENkU2RTYyQzY3QTNDNkM5QzkzOEU4NjExNDk2QkNGNzc4NThFQTVEODZDNTcSBDEwMDAKSQpEaWJjL0E4MzEyMjE2MkE5RTBGRjVCMEI1NDJGMUU5Njk1QjczQjVEMEFEOEMxNDc1QjM3NzExQThENjE5ODVEREJFQjESATEKTwpEaWJjL0FGRTkwOTI3NzFGMDI4QTA2OTA1NDhFMjFENDI2RkIxQ0E0RTZEOUY1REM4QzZCM0ZFREY2MkU5QTdBNTZCQTMSBzEwMDAwMDAKVwpEaWJjL0M5MzJBREZFMkI0MjE2Mzk3QTRGMTc0NThCNkU0NDY4NDk5Qjg2QzNCQzgxMTYxODBGODVENzk5RDZGNUNDMUISDzEwNzc1NjM0NjE3NzgzMwpRCkRpYmMvQ0E3NjI3MTNCNEFFMDUxNjYwQ0VCQTEzRDlFQkIwRUI5OTY1QTFDOUJBNTE3N0JCOTZGMDAyQTM4MDYyOUYyQxIJMTAwMDAwMDAwCkkKRGliYy9DQkI5NUZDQjYwNzk0QTRENTRFNTcwNkI1NTA2RDJCQUJCQkVCNTQyQjBBRDBBNDBEODY4ODI0NEM5QTc4RDExEgExCkwKRGliYy9DRDFDNjlGQjE3MzU1QjA5NzIzODU2MzNCQzBBOEU1MTlDNDJCRDg0MDlCRDY5NjRBRUVFNTdFMDRGOUY2OUJEEgQxMDAwCk4KRGliYy9DRDJCMzY5Rjg5NDE2MzMxOUU0MzdCMUE1RURFNzRBRUNFN0Y0NTMzQjgxMjEzMDhEQkU2RjUwOTdGNTBBQUYxEgYxMDAwMDAKTwpEaWJjL0NERjBCM0IzQjA5NkNEREIwQTUwMDVFNzE5ODUwMEI0MzNFOUQzNUZFODhGRTVGRTgwQThCMEUxQzcyQUNENEUSBzEwMDAwMDAKUApEaWJjL0Q2Njg4RTFCMDhFQjk5QUIzRTc0Qjg5NjRGMTA4MzRCNTBENjJDMDA0NkQxNTBGNDk1RUYzRkVBNzdGOUEyMjgSCDE0ODkyNTY5CkwKRGliYy9EREMzQ0REMkMzNkMyODk3M0ZGMzAzQjQ5MkY2MkFDMTk1Q0NDMjhENzU5QzU0M0UwMzM1NDI4MkE1RkI0N0VEEgQxMDAwClIKRGliYy9ERjNGQjI5RjQ2MTUwMzY0NkZFNUQ1RjdFNDBEREY3NkUyRjk4MUI3QkEyQjU2MDMxQ0ZBQ0UxQ0ZDNDYxNzI5EgoxMDAwMDAwMDAwCk8KRGliYy9ERjk0MDQxNEU2MzcxREZFNDY3NDhFNkM1MjBGNkJCNDgxQTczRkRGMUFEMjYyNDcyNTY1MjIxMUEwNDI5MjczEgcxMjM0NTY3Ck8KRGliYy9FMjg0NEEwNEE1REU0QkRFQzQ5OTI1MURCOTAyRjI3MzM2OTQ3MEY3RkVEQjY2ODI5NTI1MzBDRUJGOTlCQUJBEgcxMDAwMDAwClIKRGliYy9FMzczN0I1RkQwNEM0MTBBM0Y0QTg2MjkzRUZCOEE1NjBDOTMxMTlBMjAzQjExMkZGMDg3M0NBNzQ4QkVCQjk5Ego4NzA2Nzg0MjI1Ck8KRGliYy9FNkY0QjU1QjRDODlCMjZGMERFRkM3NkI2RjJEN0M3MDNCQkUyQzgwNkRCQkJFMDU2Qjg2QzBGRjk3QTI0RjNEEgcxMTAwMDAwClEKRGliYy9FNzFENzRBQzRBRTI4NDVCOEU1MTQ2MjRBRTUyNzNGRUJBOEVCMEM0MkY1MjdEREVBN0ZBOTQ5MTVBMzJGMTQyEgkzODQyNTg1NzgKUApEaWJjL0VBRTRCRjMzQ0EwMDc0MTg2MTIxQjUzMjI4OTcwN0UwMDZCNEM2Mjk0MDI1Q0E2RDUzOTcyOTNCMjg3RTk4QTUSCDEwMDAwMDAwCkkKRGliYy9FQjkyQzZGQUQ1QTk5MDUwRDJGQ0NFQzM3RkZCMUU5MTNCOTNFNTYyMkE1OTg4NUYxNjlBMUEwMDlBMTQ3MDc5EgExCk8KRGliYy9FQzRCNUQ4NzkxN0RENTY2OEQ5OTk4MTQ2RjgyRDcwRkRGODY2NTJEQjMzM0QwNENFMjlEMUVCMThFMjk2QUY1EgcxOTEyMDAwCkkKRGliYy9FRDc0MDZCMEJEN0RCMTI3MUNBMDgzOUYxMTJDRENEODQ3OTY0NDJEM0Y2QjdBNzc0Rjk4OUM5QUVFQTcyNzA3EgE1ClQKRGliYy9GNjgzRkNBM0M2QkJDNjkyNEQ4QkQ2NTE3NTFERTM2RDM5NTY4MDYxMUVFQThENzJFQjA3OTg0NzVDMzVENkJEEgw2MDMyOTU3MTEwMzUKTwpEaWJjL0Y3QUE4NDg3QTlGQUNFNDRBNDZBQzFDRDlBNjY4RUExMEY5RjE2Mzg5Rjg1OTE1NTVDNjc0RkNEOENGNzBENUYSBzQ2MzIwMDAKTwpEaWJjL0Y4OEJBODhGM0RFQURDRkREODM1RkEzNDE1MzdDNDdDRkYwMEFCQjAxN0M1NjZGOUVERDQ2MTAyRDFBNDgwREUSBzUwMDAwMDAKTgpEaWJjL0ZFRTNGQjE5NjgyREFBQUIwMkEwMzI4QTJCODRBODBFN0RERkU1QkE0OEY3RDJDOEMzMEFBQzY0OUI4REQ1MTkSBjIwMDAwMApSCkRwb29sMkI5QzI0ODMzQ0FBMjY4QzkwODFFQzI1MTY5M0E3MjRFOEQzNDNGQzI1QTg0MUZGMDBGRDM3QjA0N0JBNERFQRIKMTA0MTk2Njg3MQpPCkRwb29sMzJERDA2NkJFOTQ5RTVGRENDN0RDMDlFQkI2N0M3MzAxRDBDQTk1N0MyRUY1NkEzOUIzNzQzMDE2NTQ0N0RBQxIHMTE0OTM2NgpPCkRwb29sNEJGQUZDNDk5Nzc2RDMwQTRGQTBENjAzMzEzNUYwMENDNEVGQzc3MEQxOUE3NENBRDM3NDMzQjU3OUY3N0ZDMBIHMTE4ODk3MgpPCkRwb29sN0FFMzkxQzA5OUQxRDg4Q0M4NUE5RkE4QTBEQzU2NTBCRjhEREUwRENFN0QwODI0QzA3MzgwMkMwMjBBNzc0NxIHMTAzNjI4MApPCkRwb29sQjQ1N0NFOTI0MEMyMjFDMEY3Njk1MkZFRDY1MDZGNzQzNzVFREQzOEIzMkE2MDIwQjdERERGRDVBNDg2N0Q1QxIHMTQ4MDIwMwpPCkRwb29sQkQ1RjFBRjdBOEIxRjA2OEMxNzhGMUQ2MzdERjEyNjk2OEVDMTBBQjIwNEExMDExNkUzMjBCMkI4QUY0RkFDMhIHMTMwMzgxNgpQCkRwb29sRDYzOUE5OTQxNDY0NkQ3MTM2QzY1QzY4NDVEMEVCMzQ1NkVERDNENkMyQzQzMDUwRDNGQTNBMjQ5OTVCMEU3NRIINDA2NzMxNDcKUwpEcG9vbERGQjg0MzRENUE4MEI0RUFGQTk0QjY4NzhCRDVCODUyNjVBQzZDNUQzNzIwNEFCODk5QjFDM0M1MjU0M0RBN0USCzE0NDE2MzM2ODQ1Ck8KRHBvb2xFNzFGRTEzNjgxQTI4M0I3MDE1RTRFNEM0ODUyQjBFREE3MkNDOTdBNUNERTJFQ0EyQTZDOEMwNkM4NkFDNzc1EgcxMDAwMDAwCk8KRHBvb2xGMjgwNTk4MEM1NEUxNDc0QkRDQ0Y3MEVGNUZFODgxRjNCOEVGQ0Y4QkEzMTk4NzY1QzAxRDkxOTA0NTIxNzg4EgcxMDY1NDI3ChkKBXVhdG9tEhA2Mjc3ODU3NDMxNTA4Mjg3EgIQWA=="} Error: rosetta: (502) bad gateway

I also find out that before the upgrade height, if I query gaiad q bank total, everything looks fine. but if I query the proposals by gaiad q gov proposals , the node will get blocked (see below), which node gets blocked depends on which node I query. If I don't query the proposals and I just propose and vote pass, I will get an upgrade upon upgrade height, and then get the above error after upgrade.

the node will be blocked (no error of rosseta 502 though) here if I query the proposal before the upgrade height:
INF ABCIQuery data=22021864 module=rpc path=/cosmos.gov.v1beta1.Query/Proposals result={"code":0,"codespace":"","height":"7368426","index":"0","info":"","key":null,"log":"","proofOps":null,"value":"CrkDCAEStwIKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEpICCkRBZGp1c3RtZW50IG9mIGJsb2Nrc19wZXJfeWVhciB0byBjb21lIGFsaWduZWQgd2l0aCBhY3R1YWwgYmxvY2sgdGltZRLJAVRoaXMgZ292ZXJuYW5jZSBwcm9wb3NhbCBpcyBmb3IgYWRqdXN0bWVudCBvZiBibG9ja3NfcGVyX3llYXIgcGFyYW1ldGVyIHRvIG5vcm1hbGl6ZSB0aGUgaW5mbGF0aW9uIHJhdGUgYW5kIHJld2FyZCByYXRlLlxuIGlwZnMgbGluazogaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1YcUVCcjU2eGVVekZwZ2pzbURLTVNpdDNpcW5LYURFTDR0YWJ4UFhvejl4YxgDIi8KDjk3MTE4OTAzNTI2Nzk5Egw0MDIzODA1NzcyMzQaDDMyMDU0NTQwMDAwMCIBMCoLCJfBx+QFEOSDjhMyCwiXq5HlBRDkg44TOhIKBXVhdG9tEgk1MTIxMDAwMDBCDAiPzMrkBRCTmdKsAkoMCI+2lOUFEJOZ0qwCCoEFCAIS8gMKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEs0DChhBVE9NIFRyYW5zZmVyIEVuYWJsZW1lbnQSsANBIHBsYW4gaXMgcHJvcG9zZWQgdG8gc2V0IHVwIGEgdGVzdG5ldCB1c2luZyB0aGUgQ29zbW9zIFNESyB2MC4zNC4wIHJlbGVhc2UsIGFsb25nIHdpdGggbWFpbm5ldCBjb25kaXRpb25zLCBwbHVzIHRyYW5zZmVyIGVuYWJsZW1lbnQgYW5kIGluY3JlYXNlZCBibG9jayBzaXplLCBhcyBhIHRlc3RpbmcgZ3JvdW5kLiBGdXJ0aGVybW9yZSwgYSBwYXRoIGZvciB1cGdyYWRpbmcgdGhlIGNvc21vc2h1Yi0xIGNoYWluIHRvIHVzZSB0aGUgQ29zbW9zIFNESyByZWxlYXNlIHYwLjM0LjAsIGFsb25nIHdpdGggdGhlIG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHRoZSBnZW5lc2lzIGZpbGUsIGF0IGJsb2NrIDQyNTAwMCwgaXMgb3V0bGluZWQuIElQRlM6IGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtYVVhTWpYUEU2aTRnSlIxTmFrUWMxNVRacFNxalNyWE5tclMxdkE1dmVGOVcYBCI+Cg01MTk1NjEwNTkzNjI4Eg0yNjE5ODQ0NzgzNTAwGg41ODMyMjEzNTQwNDk0MCIONDM0ODMyOTY4ODMyNTYqCwi7luXkBRDlgtpyMgsIu4Cv5QUQ5YLacjoSCgV1YXRvbRIJNTIxNDAwMDAwQgsIxM/l5AUQmfqDL0oLCMS5r+UFEJn6gy8K7wQIAxLhAwogL2Nvc21vcy5nb3YudjFiZXRhMS5UZXh0UHJvcG9zYWwSvAMKG0FUT00gVHJhbnNmZXIgRW5hYmxlbWVudCB2MhKcA0EgcGxhbiBmb3IgZW5hYmxpbmcgQVRPTSB0cmFuc2ZlcnMgaXMgYmVpbmcgcHJvcG9zZWQsIHdoaWNoIGludm9sdmVzIHRoZSByZWxlYXNlIGFuZCB0ZXN0IG9mIENvc21vcyBTREsgdjAuMzQuMCBhbmQgYSBzdHJhdGVneSBmb3IgdGhlIG5ldHdvcmsgdG8gYWNjZXB0IHRoZSByZWxlYXNlIGFuZCB1cGdyYWRlIHRoZSBtYWlubmV0IG9uY2UgdGVzdGluZyBoYXMgYmVlbiBkZWVtZWQgdG8gYmUgc3VjY2Vzc2Z1bC4gUmVhZCB0aGUgZnVsbCBwcm9wb3NhbCBhdCAgaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1hbTFQVTM5cW1MQnpLdjNlWUEza01tU0pkZ1I2bnVyc0d3V1Zqbm1vdnBTeSBvciBmb3JtYXR0ZWQgYXQgaHR0cHM6Ly9pcGZzLmluay9lL1FtYW0xUFUzOXFtTEJ6S3YzZVlBM2tNbVNKZGdSNm51cnNHd1dWam5tb3ZwU3kYAyI5Cg45MTA3MzAwNjAxMDY4ORILODIxMDAwMDAwMDEaDTg5NjA2MTQyMjA0NjQiCzkxMTY5OTk5OTk5KgwIuo+S5QUQgP3rigEyDAi6+dvlBRCA/euKAToSCgV1YXRvbRIJNTIxNTAwMDAwQgwI0N2T5QUQ2qOtwQJKDAjQx93lBRDao63BAgqmBAgEEpYDCiAvY29zbW9zLmdvdi52MWJldGExLlRleHRQcm9wb3NhbBLxAgpDUHJvcG9zYWwgZm9yIGlzc3VhbmNlIG9mIGZ1bmdpYmxlIHRva2VucyBkaXJlY3RseSBvbiB0aGUgQ29zbW9zIEh1YhKpAlRoaXMgcHJvcG9zYWwgaXMgYSBmaXJzdCBzdGVwIHRvd2FyZHMgZW5hYmxpbmcgZnVuZ2libGUgdG9rZW4gaXNzdWFuY2Ugb24gdGhlIENvc21vcyBIdWIsIHdpdGggbGlzdGluZyBvZiBuZXcgdG9rZW5zIHJlcXVpcmluZyBnb3Zlcm5hbmNlIGFwcHJvdmFsLiBSZWFkIHRoZSBmdWxsIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS92YWxpZGF0b3ItbmV0d29yay9jb3Ntb3NodWItcHJvcG9zYWxzL2Jsb2IvMGQzMDZmMWZjYzg0MWEwYWM2ZWQxMTcxYWY5NmU2ODY5ZDY3NTRiNi9pc3N1YW5jZS1wcm9wb3NhbC5tZBgEIj0KDjMzNzIzNTUyODg4MTIyEgsyMDcwNjE2ODkzOBoOMjY0Mjc5ODgyNjY1MDciDjEzMzY4OTgyNDA5MzIxKgsIs4nR5QUQ5ePNIjILCLPzmuYFEOXjzSI6EgoFdWF0b20SCTUxMjAwMDAwMUIMCPzE0uUFEJq8k94BSgwI/K6c5gUQmryT3gEK7wIIBRLhAQogL2Nvc21vcy5nb3YudjFiZXRhMS5UZXh0UHJvcG9zYWwSvAEKIUV4cGVkaXRlZCBDb3Ntb3MgVXBncmFkZSBQcm9wb3NhbBKWAVByb3Bvc2FsIHRvIHVwZ3JhZGUgdGhlIENvc21vcyBIdWIgYXQgYmxvY2sgNTAwLDAwMCBvbiBBcHJpbCAyMm5kIDVwbSBHTVQuIERldGFpbHM6aHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1TMTNHUE5zMWNSS1NvamV0ZTV5OVJnVzd3eWYxc1oxQkdxWDN6alRHczdzWBgDIj0KDzEwMDY0OTM2MzY0MDA1MRIMNDQwMzgyNDA2NDQwGg0zMjYxMjYzMzU3OTc0Ig00Nzc1MjAwNDI2MzE5KgsIs7bk5QUQ+PvqdzILCLOgruYFEPj76nc6EgoFdWF0b20SCTUxMzAwMDAwMEILCOHt5OUFEID/+2JKCwjh167mBRCA//tiCoARCAYShRAKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEuAPCkNEb24ndCBCdXJuIERlcG9zaXRzIGZvciBSZWplY3RlZCBHb3Zlcm5hbmNlIFByb3Bvc2FscyBVbmxlc3MgVmV0b2VkEpgPUmVhZCBoZXJlLCBvciBvbiBodHRwczovL2lwZnMuaW5rL2UvUW1SdFI3cWtlYVpDcEN6SER3SGdKZUpBWmRUcmJtSEx4RkRZWGh3N1JvRjFwcAoKVGhlIENvc21vcyBIdWIncyBzdGF0ZSBtYWNoaW5lIGhhbmRsZXMgc3BhbSBwcmV2ZW50aW9uIG9mIGdvdmVybmFuY2UgcHJvcG9zYWxzIGJ5IG1lYW5zIG9mIGEgZGVwb3NpdCBzeXN0ZW0uIEEgZ292ZXJuYW5jZSBwcm9wb3NhbCBpcyBvbmx5IGNvbnNpZGVyZWQgZWxpZ2libGUgZm9yIHZvdGluZyBieSB0aGUgd2hvbGUgdmFsaWRhdG9yIHNldCBpZiBhIGNlcnRhaW4gYW1vdW50IG9mIHN0YWtpbmcgdG9rZW4gaXMgZGVwb3NpdGVkIG9uIHRoZSBwcm9wb3NhbC4gVGhlIGludGVudGlvbiBpcyB0aGF0IHRoZSBkZXBvc2l0IHdpbGwgYmUgYnVybmVkIGlmIGEgcHJvcG9zYWwgaXMgc3BhbSBvciBoYXMgY2F1c2VkIGEgbmVnYXRpdmUgZXh0ZXJuYWxpdHkgdG8gdGhlIENvc21vcyBjb21tdW5pdHkgKHN1Y2ggYXMgd2FzdGluZyBzdGFrZWhvbGRlcnPigJkgdGltZSBoYXZpbmcgdG8gcmV2aWV3IHRoZSBwcm9wb3NhbCkuCgpJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ292ZXJuYW5jZSBtb2R1bGUgdXNlZCBpbiB0aGUgQ29zbW9zIEh1YiwgdGhlIGRlcG9zaXQgaXMgYnVybmVkIGlmIGEgcHJvcG9zYWwgZG9lcyBub3QgcGFzcywgcmVnYXJkbGVzcyBvZiBob3cgY2xvc2UgdGhlIGZpbmFsIHRhbGx5IHJlc3VsdCBtYXkgaGF2ZSBiZWVuLiBGb3IgZXhhbXBsZSwgaWYgNDklIG9mIHN0YWtlIHZvdGVzIGluIGZhdm9yIG9mIGEgcHJvcG9zYWwgd2hpbGUgNTElIHZvdGVzIGFnYWluc3QgaXQsIHRoZSBkZXBvc2l0IHdpbGwgc3RpbGwgYmUgYnVybmVkLiBUaGlzIHNlZW1zIHRvIGJlIGFuIHVuZGVzaXJhYmxlIGJlaGF2aW9yIGFzIGl0IGRpc2luY2VudGl2aXplcyBhbnlvbmUgZnJvbSBjcmVhdGluZyBvciBkZXBvc2l0aW5nIG9uIGEgcHJvcG9zYWwgdGhhdCBtaWdodCBiZSBzbGlnaHRseSBjb250ZW50aW91cyBidXQgbm90IHNwYW0sIGR1ZSB0byBmZWFyIG9mIGxvc2luZyB0aGUgZGVwb3NpdCBtaW5pbXVtIChjdXJyZW50bHkgNTEyIGF0b21zKS4gVGhpcyB3aWxsIGVzcGVjaWFsbHkgYmUgdGhlIGNhc2UgYXMgVGV4dFByb3Bvc2FscyB3aWxsIGJlIHVzZWQgZm9yIHNpZ25hbGluZyBwdXJwb3NlcywgdG8gZ2F1Z2UgdGhlIHNlbnRpbWVudCBvZiBzdGFrZWQgQXRvbSBob2xkZXJzLiBEaXNpbmNlbnRpdml6aW5nIHByb3Bvc2FscyBmb3Igd2hpY2ggdGhlIG91dGNvbWUgaXMgdW5jZXJ0YWluIHdvdWxkIHVuZGVybWluZSB0aGF0IGVmZm9ydC4KCldlIGluc3RlYWQgcHJvcG9zZSB0aGF0IHRoZSBkZXBvc2l0IGJlIHJldHVybmVkIG9uIGZhaWxlZCB2b3RlcywgYW5kIHRoYXQgdGhlIGRlcG9zaXQgb25seSBiZSBidXJuZWQgb24gdmV0b2VkIHZvdGVzLiBJZiBhIHByb3Bvc2FsIHNlZW1zIHRvIGJlIHNwYW0gb3IgaXMgZGVlbWVkIHRvIGhhdmUgY2F1c2VkIGEgbmVnYXRpdmUgZXh0ZXJuYWxpdHkgdG8gQ29zbW9zIGNvbW11bm5pbnR5LCB2b3RlcnMgc2hvdWxkIHZvdGUgTm9XaXRoVmV0byBvbiB0aGUgcHJvcG9zYWwuIElmID4zMyUgb2YgdGhlIHN0YWtlIGNob29zZXMgdG8gVmV0byBhIHByb3Bvc2FsLCB0aGUgZGVwb3NpdHMgd2lsbCB0aGVuIGJlIGJ1cm5lZC4gSG93ZXZlciwgaWYgYSBwcm9wb3NhbCBnZXRzIHJlamVjdGVkIHdpdGhvdXQgYmVpbmcgdmV0b2VkLCB0aGUgZGVwb3NpdHMgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBkZXBvc2l0b3JzLiAgVGhpcyBwcm9wb3NhbCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgYmVoYXZpb3IgZm9yIHByb3Bvc2FscyB0aGF0IGZhaWwgdG8gbWVldCBxdW9ydW07IGlmIGEgcHJvcG9zYWwgZmFpbHMgdG8gbWVldCBxdW9ydW0gaXRzIGRlcG9zaXQgd2lsbCBiZSBidXJuZWQuGAMiKgoPMTEwNTIyMDc3MjMxMTM5EgsxMTc3MzQ0MDAwMBoHNDAwMDAwMCIBMCoLCImKsuYFELvR12MyCwiJ9PvmBRC70ddjOhIKBXVhdG9tEgk1MTYwMDAwMDBCCwiit7LmBRCBusEkSgsIoqH85gUQgbrBJArPAggHEtEBCiAvY29zbW9zLmdvdi52MWJldGExLlRleHRQcm9wb3NhbBKsAQobQWN0aXZhdGUgdGhlIENvbW11bml0eSBQb29sEowBRW5hYmxlIGdvdmVybmFuY2UgdG8gc3BlbmQgZnVuZHMgZnJvbSB0aGUgY29tbXVuaXR5IHBvb2wuIEZ1bGwgcHJvcG9zYWw6IGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtTnNWQ3N5Um1FaWVwOHJUUUx4Vk5kTUhtMnVpWmttYVNIQ1I2UzcyWTFzTDEYAyIrCg8xMDE1NDYyMzc1NDA0ODESBzQwMDAwMDAaDDI3MTY1NDQ2MDAwMCIBMCoMCMnbsuYFELzcqtMBMgwIycX85gUQvNyq0wE6EgoFdWF0b20SCTUxMjAwMDAwMEILCJnvtuYFEIbU13VKCwiZ2YDnBRCG1Nd1CpMMCAgSnQsKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEvgKCjxOb3RpZmljYXRpb24gZm9yIFNlY3VyaXR5IENyaXRpY2FsIEhhcmQgRm9yayBhdCBCbG9jayA0ODIxMDAStwpBcyBkZXNjcmliZWQgYnkgdXNlciBASmVzc3lzYXVydXNyZXggb24gQ29zbW9zIEZvcnVtIGluIGh0dHBzOi8vZm9ydW0uY29zbW9zLm5ldHdvcmsvdC9jcml0aWNhbC1jb3Ntb3NzZGstc2VjdXJpdHktYWR2aXNvcnkvMjIxMSwgQWxsIGluIEJpdHMgaGFzIGxlYXJuZWQgb2YgYSBjcml0aWNhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGluIHRoZSBjb2RlYmFzZSBmb3IgdGhlIENvc21vcyBIdWIuICBXZSBkZWVtIHRoZSBpc3N1ZSB0byBiZSBvZiBoaWdoIHNldmVyaXR5LCBhcyBpZiBleHBsb2l0ZWQgaXQgY2FuIHBvdGVudGlhbGx5IGRlZ3JhZGUgdGhlIHNlY3VyaXR5IG1vZGVsIG9mIHRoZSBjaGFpbidzIFByb29mIG9mIFN0YWtlIHN5c3RlbS4gIFRoaXMgdnVsbmVyYWJpbGl0eSBDQU5OT1QgbGVhZCB0byB0aGUgdGhlZnQgb2YgQXRvbXMgb3IgY3JlYXRpb24gb2YgQXRvbXMgb3V0IG9mIHRoaW4gYWlyLiAKCiBBbGwgaW4gQml0cyBoYXMgcmVsZWFzZWQgYSBzb3VyY2UgY29kZSBwYXRjaCwgR2FpYSB2MC4zNC42LCB0aGF0IGNsb3NlcyB0aGUgZXhwbG9pdGFibGUgY29kZSBwYXRoIHN0YXJ0aW5nIGF0IGJsb2NrIDQ4MjEwMC4gCgogVGhlIHByb3Bvc2VkIHVwZ3JhZGUgY29kZSBHaXQgaGFzaCBpczogIDgwMjM0YmFmOTFhMTVkZDlhN2RmOGRjYTM4Njc3YjY2YjhkMTQ4YzEgCgogQXMgYSBwcm9vZiBvZiBzdGFrZSwgd2UgYXJlIHB1dHRpbmcgc29tZSBjb2xsYXRlcmFsIGJlaGluZCB0aGlzIGxlZ2l0aW1hY3kgb2YgdGhpcyBidWcgYW5kIHBhdGNoIGFuZCBlbmNvdXJhZ2Ugb3RoZXJzIGZhbWlsaWFyIHdpdGggdGhlIHJlcG9ydCB0byBkbyBzbyBhcyB3ZWxsLiAgSWYgdGhlIGRpc2Nsb3NlZCBidWcgdHVybnMgb3V0IHRvIGJlIGZhYnJpY2F0ZWQgb3IgbWFsaWNpb3VzIGluIHNvbWUgd2F5LCB3ZSB1cmdlIHRoZSBDb3Ntb3MgSHViIGdvdmVybmFuY2UgdG8gc2xhc2ggdGhlc2UgQXRvbXMgYnkgdm90aW5nIE5vV2l0aFZldG8gb24gdGhpcyBwcm9wb3NhbC4gCgogV2UgZW5jb3VyYWdlIHZhbGlkYXRvcnMgYW5kIGFsbCB1c2VycyB0byB1cGdyYWRlIHRoZWlyIG5vZGVzIHRvIEdhaWEgdjAuMzQuNiBiZWZvcmUgYmxvY2sgNDgyMTAwLiAgSW4gdGhlIGFic2VuY2Ugb2YgYW5vdGhlciBwdWJsaWMgYnVsbGV0aW4gYm9hcmQsIHdlIHJlcXVlc3QgdmFsaWRhdG9ycyB0byBwbGVhc2Ugdm90ZSBZZXMgb24gdGhpcyBwcm9wb3NhbCBBRlRFUiB0aGV5IGhhdmUgdXBncmFkZWQgdGhlaXIgbm9kZXMgdG8gdjAuMzQuNiwgYXMgYSBtZXRob2Qgb2Ygc2lnbmFsbGluZyB0aGUgcmVhZGluZXNzIG9mIHRoZSBuZXR3b3JrIGZvciB0aGUgdXBncmFkZS4YAyIgCg8xMjYwNjczNjYwMjMzNjMSATAaBzEzODk5OTkiATAqDAjG5MDnBRCFpZWfAzIMCMbOiugFEIWllZ8DOhMKBXVhdG9tEgoxMzI4MDAwMDAwQgwI/+bA5wUQ8Oyd4QFKDAj/0IroBRDw7J3hAQqZEwgKEpMSCiAvY29zbW9zLmdvdi52MWJldGExLlRleHRQcm9wb3NhbBLuEQomSW5jcmVhc2UgTWF4IFZhbGlkYXRvciBTZXQgU2l6ZSB0byAxMjUSwxFSZWFkIGhlcmUsIG9yIG9uIGh0dHBzOi8vaXBmcy5pbmsvZS9RbVJoUXljVjE5UWlUUUdMdVB6UEhmSndDaW9qMXdEZUhIdFp2eGlIZWdURkRkIAoKVGhpcyBwcm9wb3NhbCBzdXBlcmNlZGVzIHByb3Bvc2FsIG51bWJlciA5LCB3aGljaCBjb250YWlucyBjb25mbGljdGluZyBudW1iZXJzIGluIHRoZSB0aXRsZSBhbmQgYm9keS4gCgpJbiB0aGUgQ29zbW9zIEh1YiwgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgdmFsaWRhdG9ycyBpcyBjdXJyZW50bHkgY2FwcGVkIGF0IDEwMCwgb3JkZXJlZCBieSB0b3RhbCBkZWxlZ2F0ZWQgQXRvbXMuIFRoaXMgbnVtYmVyIHdhcyBvcmlnaW5hbGx5IHByb3Bvc2VkIGluIHRoZSBDb3Ntb3Mgd2hpdGVwYXBlciBzZWN0aW9uIHRpdGxlZCBbTGltaXRhdGlvbnMgb24gdGhlIE51bWJlciBvZiBWYWxpZGF0b3JzXShodHRwczovL2dpdGh1Yi5jb20vY29zbW9zL2Nvc21vcy9ibG9iL21hc3Rlci9XSElURVBBUEVSLm1kI2xpbWl0YXRpb25zLW9uLXRoZS1udW1iZXItb2YtdmFsaWRhdG9ycyA0KS4gVGhpcyBudW1iZXIgd2FzIGNob3NlbiBhcyBhIHJlbGF0aXZlbHkgY29uc2VydmF0aXZlIGVzdGltYXRlLCBhcyBhdCB0aGUgdGltZSBvZiB3cml0aW5nLCBpdCB3YXMgdW5jbGVhciBob3cgbWFueSB3aWRlbHkgZGlzdHJpYnV0ZWQgbm9kZXMgVGVuZGVybWludCBjb25zZW5zdXMgY291bGQgc2NhbGUgdG8gb3ZlciB0aGUgcHVibGljIGludGVybmV0LiAgCgpIb3dldmVyLCBzaW5jZSB0aGVuLCB3ZSBoYXZlIHNlZW4gZW1waXJpY2FsbHkgdGhyb3VnaCB0aGUgcnVubmluZyBvZiB0aGUgR2FtZSBvZiBTdGFrZXMgaW5jZW50aXZpemVkIHRlc3RuZXQgdGhhdCBUZW5kZXJtaW50IENvcmUgd2l0aCBHYWlhIHN0YXRlIG1hY2hpbmUgY2FuIG9wZXJhdGUgd2l0aCBvdmVyIDE4MCB2YWxpZGF0b3JzIGF0IHJlYXNvbmFibGUgYXZlcmFnZSBibG9jayB0aW1lcyBvZiA8NyBzZWNvbmRzLiBUaGUgR2FtZSBvZiBTdGFrZXMgcmVzdWx0cyBlbXBpcmljYWxseSBzaG93IHRoYXQgYWRkaW5nIHZhbGlkYXRvcnMgc2hvdWxkIG5vdCBkZWxheSBjb25zZW5zdXMgYXQgc21hbGwgYmxvY2sgc2l6ZXMuIEF0IGxhcmdlIGJsb2NrIHNpemVzLCB0aGUgdGltZSBpdCB0YWtlcyBmb3IgdGhlIGJsb2NrIHRvIGdvc3NpcCB0byBhbGwgdmFsaWRhdG9ycyBtYXkgaW5jcmVhc2UgZGVwZW5kaW5nIG9uIHRoZSBuZXdmb3VuZCBuZXR3b3JrIHRvcG9sb2d5LiBIb3dldmVyIHdlIHZpZXcgdGhpcyBhcyB1bmxpa2VseSwgYW5kIGlmIGl0IGRpZCBiZWNvbWUgYSBwcm9ibGVtLCBpdCBjb3VsZCBsYXRlciBiZSBzb2x2ZWQgYnkga25vd24gaW1wcm92ZW1lbnRzIGF0IHRoZSBwMnAgbGF5ZXIuIFRoZSBvdGhlciB0cmFkZW9mZiB0byBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBpcyB0aGF0IHRoZSBzaXplIG9mIGNvbW1pdHMgYmVjb21lcyB+MjUlIGxhcmdlciBkdWUgdG8gbW9yZSBwcmVjb21taXRzIGJlaW5nIGluY2x1ZGVkLCBpbmNyZWFzaW5nIHRoZSBuZXR3b3JrIGFuZCBzdG9yYWdlIGNvc3RzIGZvciBub2Rlcy4gVGhpcyBjYW4gYWxzbyBiZSByZXNvbHZlZCBpbiB0aGUgZnV0dXJlIHdpdGggdGhlIGludGVncmF0aW9uIG9mIGFnZ3JlZ2F0ZSBzaWduYXR1cmVzLiBBdCB0aGUgdGltZSBvZiBzdWJtaXNzaW9uIG9mIHRoaXMgcHJvcG9zYWwsIHRoZSBtaW5pbXVtIGRlbGVnYXRpb24gdG8gYmVjb21lIGEgdG9wIDEwMCB2YWxpZGF0b3IgaXMgMzAsNjAwIEF0b21zLCBhIGZhaXJseSBoaWdoIGJhcnJpZXIgdG8gZW50cnkgZm9yIG5ldyB2YWxpZGF0b3JzIGxvb2tpbmcgdG8gZW50ZXIgdGhlIGFjdGl2ZSB2YWxpZGF0b3Igc2V0LiAgCgpJbiB0aGUgQ29zbW9zIHdoaXRlcGFwZXIsIGl0IHN0YXRlcyB0aGF0IHRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBvbiB0aGUgSHViIHdpbGwgaW5jcmVhc2UgYXQgYSByYXRlIG9mIDEzJSBhIHllYXIgdW50aWwgaXQgaGl0cyBhIGNhcCBvZiAzMDAgdmFsaWRhdG9ycy4gV2UgcHJvcG9zZSBzY3JhcHBpbmcgdGhpcyBtZWNoYW5pc20gYW5kIGluc3RlYWQgaW5jcmVhc2luZyB0aGUgbWF4IHZhbGlkYXRvcnMgdG8gMTI1IHZhbGlkYXRvcnMgaW4gdGhlIG5leHQgY2hhaW4gdXBncmFkZSB3aXRoIG5vIGZ1cnRoZXIgcGxhbm5lZCBpbmNyZWFzZXMuIEZ1dHVyZSBpbmNyZWFzZXMgdG8gdGhlIHZhbGlkYXRvciBzZXQgc2l6ZSB3aWxsIGJlIG9yaWdpbmF0ZWQgdGhyb3VnaCBnb3Zlcm5hbmNlLhgDIjEKDzExNTg0NTA1Nzc1OTgyNhIMMTQzNDgwMDk5OTk5Gg02MjQ0ODY2MDk2MzM0IgEwKgwIlajo6AUQ6ZbX8gEyDAiVkrLpBRDpltfyAToSCgV1YXRvbRIJNTg2NTAwMDAxQgwIp5by6AUQ49rotwJKDAingLzpBRDj2ui3AgqfEQgMEo8QCiAvY29zbW9zLmdvdi52MWJldGExLlRleHRQcm9wb3NhbBLqDwpPQXJlIFZhbGlkYXRvcnMgQ2hhcmdpbmcgMCUgQ29tbWlzc2lvbiBIYXJtZnVsIHRvIHRoZSBTdWNjZXNzIG9mIHRoZSBDb3Ntb3MgSHViPxKWD1RoaXMgZ292ZXJuYW5jZSBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBhY3QgcHVyZWx5IGFzIGEgc2lnbmFsbGluZyBwcm9wb3NhbC4gIFRocm91Z2hvdXQgdGhpcyBoaXN0b3J5IG9mIHRoZSBDb3Ntb3MgSHViLCB0aGVyZSBoYXMgYmVlbiBtdWNoIGRlYmF0ZSBhYm91dCB0aGUgaW1wYWN0IHRoYXQgdmFsaWRhdG9ycyBjaGFyZ2luZyAwJSBjb21taXNzaW9uIGhhcyBvbiB0aGUgQ29zbW9zIEh1YiwgcGFydGljdWxhcmx5IHdpdGggcmVzcGVjdCB0byB0aGUgZGVjZW50cmFsaXphdGlvbiBvZiB0aGUgQ29zbW9zIEh1YiBhbmQgdGhlIHN1c3RhaW5hYmlsaXR5IGZvciB2YWxpZGF0b3Igb3BlcmF0aW9ucy4gCgogRGlzY3Vzc2lvbiBhcm91bmQgdGhpcyB0b3BpYyBoYXMgdGFrZW4gcGxhY2UgaW4gbWFueSBwbGFjZXMgaW5jbHVkaW5nIG51bWVyb3VzIHRocmVhZHMgb24gdGhlIENvc21vcyBGb3J1bSwgcHVibGljIFRlbGVncmFtIGNoYW5uZWxzLCBhbmQgaW4tcGVyc29uIG1lZXR1cHMuICBCZWNhdXNlIHRoaXMgaGFzIGJlZW4gb25lIG9mIHRoZSBwcmltYXJ5IGRpc2N1c3Npb24gcG9pbnRzIGluIG9mZi1jaGFpbiBDb3Ntb3MgZ292ZXJuYW5jZSBkaXNjdXNzaW9ucywgd2UgYmVsaWV2ZSBpdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IGEgc2lnbmFsIG9uIHRoZSBtYXR0ZXIgZnJvbSB0aGUgb24tY2hhaW4gZ292ZXJuYW5jZSBwcm9jZXNzIG9mIHRoZSBDb3Ntb3MgSHViLiAKCiBUaGVyZSBoYXZlIGJlZW4gcGFzdCBkaXNjdXNzaW9ucyBvbiB0aGUgQ29zbW9zIEZvcnVtIGFib3V0IHBsYWNpbmcgYW4gaW4tcHJvdG9jb2wgcmVzdHJpY3Rpb24gb24gdmFsaWRhdG9ycyBmcm9tIGNoYXJnaW5nIDAlIGNvbW1pc3Npb24uICBodHRwczovL2ZvcnVtLmNvc21vcy5uZXR3b3JrL3QvZ292ZXJuYW5jZS1saW1pdC12YWxpZGF0b3JzLWZyb20tMC1jb21taXNzaW9uLWZlZS8yMTgyIAoKIFRoaXMgcHJvcG9zYWwgaXMgTk9UIHByb3Bvc2luZyBhIHByb3RvY29sLWVuZm9yY2VkIG1pbmltdW0uICBJdCBpcyBtZXJlbHkgYSBzaWduYWxsaW5nIHByb3Bvc2FsIHRvIHF1ZXJ5IHRoZSB2aWV3cG9pbnQgb2YgdGhlIGJvbmRlZCBBdG9tIGhvbGRlcnMgYXMgYSB3aG9sZS4gCgogV2UgZW5jb3VyYWdlIHBlb3BsZSB0byBkaXNjdXNzIHRoZSBxdWVzdGlvbiBiZWhpbmQgdGhpcyBnb3Zlcm5hbmNlIHByb3Bvc2FsIGluIHRoZSBhc3NvY2lhdGVkIENvc21vcyBIdWIgZm9ydW0gcG9zdCBoZXJlOiAgaHR0cHM6Ly9mb3J1bS5jb3Ntb3MubmV0d29yay90L3Byb3Bvc2FsLWFyZS12YWxpZGF0b3JzLWNoYXJnaW5nLTAtY29tbWlzc2lvbi1oYXJtZnVsLXRvLXRoZS1zdWNjZXNzLW9mLXRoZS1jb3Ntb3MtaHViLzI1MDUgCgogQWxzbywgZm9yIHZvdGVycyB3aG8gYmVsaWV2ZSB0aGF0IDAlIGNvbW1pc3Npb24gcmF0ZXMgYXJlIGhhcm1mdWwgdG8gdGhlIG5ldHdvcmssIHdlIGVuY291cmFnZSBvcHRpb25hbGx5IHNoYXJpbmcgeW91ciBiZWxpZWYgb24gd2hhdCBhIGhlYWx0aHkgbWluaW11bSBjb21taXNzaW9uIHJhdGUgZm9yIHRoZSBuZXR3b3JrIHVzaW5nIHRoZSBtZW1vIGZpZWxkIG9mIHRoZWlyIHZvdGUgdHJhbnNhY3Rpb24gb24gdGhpcyBnb3Zlcm5hbmNlIHByb3Bvc2FsIG9yIGxpbmtpbmcgdG8gYSBsb25nZXIgd3JpdHRlbiBleHBsYW5hdGlvbiBzdWNoIGFzIGEgRm9ydW0gb3IgYmxvZyBwb3N0LiAKCiBUaGUgcXVlc3Rpb24gb24gdGhpcyBwcm9wb3NhbCBpcyDigJxBcmUgdmFsaWRhdG9ycyBjaGFyZ2luZyAwJSBjb21taXNzaW9uIGhhcm1mdWwgdG8gdGhlIHN1Y2Nlc3Mgb2YgdGhlIENvc21vcyBIdWI/4oCdLiAgQSBZZXMgdm90ZSBpcyBzdGF0aW5nIHRoYXQgdGhleSBBUkUgaGFybWZ1bCB0byB0aGUgbmV0d29yaydzIHN1Y2Nlc3MsIGFuZCBhIE5vIHZvdGUgaXMgYSBzdGF0ZW1lbnQgdGhhdCB0aGV5IGFyZSBOT1QgaGFybWZ1bC4YAyI7Cg42Mjk3MzMzODIzMzQ4NBIOMzU0OTgxNDYyNTgyNTcaDTgyMDM2Njk5MTk0NzQiCjU1MjYxNDAwMDAqDAifqdnpBRDrv5+kAzIMCJ+To+oFEOu/n6QDOhIKBXVhdG9tEgk1MTQwMDAwMDBCDAj5mNvpBRD8gebWAkoMCPmCpeoFEPyB5tYCCrkGCA0SuAUKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEpMFCh9Db3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBBEu8EVGhpcyBpcyBhIHByb3Bvc2FsIHRvIGFwcHJvdmUgdGhlc2UgaGlnaC1sZXZlbCBjaGFuZ2VzIGZvciBhIGZpbmFsIHZvdGUgZm9yIHdoYXQgd2lsbCBiZWNvbWUgQ29zbW9zIEh1YiAzLiBQbGVhc2UgcmVhZCB0aGVtIGNhcmVmdWxseTogCmh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvY29zbW9zLXNkay9ibG9iL3JjMS92MC4zNi4wL0NIQU5HRUxPRy5tZAoKLT0tPS0KCklmIGFwcHJvdmVkLCBhbmQgYXNzdW1pbmcgdGhhdCB0ZXN0aW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZXJlIHdpbGwgYmUgYSBzZWNvbmQgcHJvcG9zYWwgY2FsbGVkIENvc21vcyBIdWIgMyBVcGdyYWRlIFByb3Bvc2FsIEIuIENvc21vcyBIdWIgMyBVcGdyYWRlIFByb3Bvc2FsIEIgc2hvdWxkIHNwZWNpZnkgMSkgdGhlIHNvZnR3YXJlIGhhc2g7IDIpIHRoZSBibG9jayBoZWlnaHQgc3RhdGUgZXhwb3J0IGZyb20gY29zbW9zaHViLTI7IDMpIHRoZSBnZW5lc2lzIHRpbWU7IDQpIGluc3RydWN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgbmV3IGdlbmVzaXMgZmlsZS4KCi09LT0tCgpGdWxsIHByb3Bvc2FsOiAKaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1iWG5MZng5aVNESDFyVlNrVzV6WUM4RXJSWkhVSzRxVVBmYUdzNFpkSGRjNwoYAyIsCg8xMjA0OTk3Mjg1MTA0OTUSDjE4MDkyMjE5Mzk4MzM2GgEwIgYxNTE5OTkqDAiage3pBRCFgt3GATIMCJrrtuoFEIWC3cYBOhIKBXVhdG9tEgk1NTAwMDAwMDBCDAieifzpBRCA88bYAUoMCJ7zxeoFEIDzxtgBCsoICA4SxwcKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEqIHCh9Db3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBCEv4GVGhpcyBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBzaWduYWwgYWNjZXB0YW5jZS9yZWplY3Rpb24gb2YgdGhlIHByZWNpc2Ugc29mdHdhcmUgcmVsZWFzZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY2hhbmdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQ29zbW9zIEh1YiAzIHVwZ3JhZGUuIEEgaGlnaCBsZXZlbCBvdmVydmlldyBvZiB0aGVzZSBjaGFuZ2VzIHdhcyBzdWNjZXNzZnVsbHkgYXBwcm92ZWQgYnkgdGhlIHZvdGVycyBzaWduYWxsaW5nIHZpYSBDb3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBBOiBodHRwczovL2h1YmJsZS5maWdtZW50Lm5ldHdvcmsvY29zbW9zL2NoYWlucy9jb3Ntb3NodWItMi9nb3Zlcm5hbmNlL3Byb3Bvc2Fscy8xMwoKV2UgYXJlIHByb3Bvc2luZyB0byB1c2UgdGhpcyBjb2RlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ2FpYS9yZWxlYXNlcy90YWcvdjIuMC4wIHRvIHVwZ3JhZGUgdGhlIENvc21vcyBIdWIuIFdlIGFyZSBwcm9wb3NpbmcgdG8gZXhwb3J0IHRoZSBsZWRnZXIncyBzdGF0ZSBhdCBCbG9jayBIZWlnaHQgMTgyMzAwMCwgd2hpY2ggd2UgZXhwZWN0IHRvIG9jY3VyIG9uIFN1bmRheSwgU2VwdGVtYmVyIDE1LCAyMDE5IGF0IG9yIGFyb3VuZCAyOjAwIHBtIFVUQy4gV2UgYXJlIHByb3Bvc2luZyB0byBsYXVuY2ggQ29zbW9zIEh1YiAzIGF0IDM6NTcgcG0gVVRDIG9uIFN1bmRheSwgU2VwdGVtYmVyIDE1LCAyMDE5LiAKCkluc3RydWN0aW9ucyBmb3IgbWlncmF0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vY29zbW9zL2dhaWEvd2lraS9Db3Ntb3MtSHViLTItVXBncmFkZQoKRnVsbCBwcm9wb3NhbDogaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1mNTRtd2I4Y1NSZjMxNmpTNGJ5OTZkTDkxZlBDYWJ2QjlWNWkyU2ExaHhkegoKGAQiMAoOMjUwNDE1ODE1NTkyMjISCzQxMDAwMDAwMDAwGg41NjU5MjE1NTA0NTQyMCIBMCoMCNOigOsFEOHIyYQDMgwI04zK6wUQ4cjJhAM6EgoFdWF0b20SCTUxMjAwMDAwMEILCLPLgOsFEK3izhBKCwiztcrrBRCt4s4QCvUNCBAS8gwKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEs0MCh9Db3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBEEqkMRmlnbWVudCBOZXR3b3JrcyAoaHR0cHM6Ly9maWdtZW50Lm5ldHdvcmspCgotPS09LQoKVGhpcyBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBzdXBlcnNlZGUgZmxhd2VkIENvc21vcyBIdWIgMyBVcGdyYWRlIFByb3Bvc2FsIEIgKGh0dHBzOi8vaHViYmxlLmZpZ21lbnQubmV0d29yay9jb3Ntb3MvY2hhaW5zL2Nvc21vc2h1Yi0yL2dvdmVybmFuY2UvcHJvcG9zYWxzLzE0KSBhbmQgQ29zbW9zIEh1YiAzIFVwZ3JhZGUgUHJvcG9zYWwgQyAoaHR0cHM6Ly9odWJibGUuZmlnbWVudC5uZXR3b3JrL2Nvc21vcy9jaGFpbnMvY29zbW9zaHViLTIvZ292ZXJuYW5jZS9wcm9wb3NhbHMvMTUpLCByZWdhcmRsZXNzIG9mIHRoZWlyIG91dGNvbWVzLiBUaGlzIHByb3Bvc2FsIHdpbGwgbWFrZSBib3RoIFByb3Bvc2FsIDE0IGFuZCAxNSB2b2lkLgoKVGhpcyBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBzaWduYWwgYWNjZXB0YW5jZS9yZWplY3Rpb24gb2YgdGhlIHByZWNpc2Ugc29mdHdhcmUgcmVsZWFzZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY2hhbmdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQ29zbW9zIEh1YiAzIHVwZ3JhZGUuIEEgaGlnaCBvdmVydmlldyBvZiB0aGVzZSBjaGFuZ2VzIHdhcyBzdWNjZXNzZnVsbHkgYXBwcm92ZWQgYnkgdGhlIHZvdGVycyBzaWduYWxsaW5nIHZpYSBDb3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBBOgpodHRwczovL2h1YmJsZS5maWdtZW50Lm5ldHdvcmsvY29zbW9zL2NoYWlucy9jb3Ntb3NodWItMi9nb3Zlcm5hbmNlL3Byb3Bvc2Fscy8xMwoKLT0tPS0KCldlIGFyZSBwcm9wb3NpbmcgdG8gdXNlIHRoaXMgY29kZSBodHRwczovL2dpdGh1Yi5jb20vY29zbW9zL2dhaWEvcmVsZWFzZXMvdGFnL3YyLjAuMCB0byB1cGdyYWRlIHRoZSBDb3Ntb3MgSHViLiBXZSBhcmUgcHJvcG9zaW5nIHRvIGV4cG9ydCB0aGUgbGVkZ2Vy4oCZcyBzdGF0ZSBhdCBCbG9jayBIZWlnaHQgMSw5MzMsMDAwLCB3aGljaCB3ZSBleHBlY3QgdG8gb2NjdXIgb24gU2VwdGVtYmVyIDI0LCAyMDE5IGF0IG9yIGFyb3VuZCAxOjUzIHBtIFVUQy4gUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSB3aWxsIGxpa2VseSBiZSBhIHZhcmlhbmNlIGZyb20gdGhpcyB0YXJnZXQgdGltZSwgZHVlIHRvIGNoYW5nZXMgaW4gYmxvY2sgdGltZSAoaHR0cHM6Ly9mb3J1bS5jb3Ntb3MubmV0d29yay90L2Nvc21vcy1odWItMy11cGdyYWRlLXByb3Bvc2FsLWQvMjY3NS8xOD91PWdhdmluKS4gV2UgYXJlIHByb3Bvc2luZyB0byBsYXVuY2ggQ29zbW9zIEh1YiAzIGF0IDYwIG1pbnV0ZXMgYWZ0ZXIgQmxvY2sgSGVpZ2h0IDEsOTMzLDAwMC4KCi09LT0tCgpJbnN0cnVjdGlvbnMgZm9yIG1pZ3JhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2Nvc21vcy9nYWlhL3dpa2kvQ29zbW9zLUh1Yi0yLVVwZ3JhZGUKUGxlYXNlIG5vdGUgdGhlIHJlY292ZXJ5IHNjZW5hcmlvIGluIHRoZSBjYXNlIHRoYXQgdGhlIGNoYWluIGZhaWxzIHRvIHN0YXJ0LgoKLT0tPS0KCkZ1bGwgcHJvcG9zYWw6Cmh0dHBzOi8vaXBmcy5pby9pcGZzL1FtUGJTTHZBZ1k4bTd6QWdTTEh6S0hmRHRWNHd4NVhhR3QxUzFjRHpxdlhxSmcYAyIwCg8xNTE3NjY0MzE1NjE1NDUSDDYzNzY4NTg5NTc3MRoMNTc1NTkyMjI3MjgxIgEwKgsI8P3F6wUQid/meDILCPDnj+wFEInf5ng6EgoFdWF0b20SCTYxMjAwMDAwMEIMCKmJx+sFEN6Qj4kBSgwIqfOQ7AUQ3pCPiQEKoBcIExKmFgogL2Nvc21vcy5nb3YudjFiZXRhMS5UZXh0UHJvcG9zYWwSgRYKH0Nvc21vcyBIdWIgMyBVcGdyYWRlIFByb3Bvc2FsIEUS3RVGaWdtZW50IE5ldHdvcmtzIChodHRwczovL2ZpZ21lbnQubmV0d29yaykKCi09LT0tCgpGdWxsIHByb3Bvc2FsOgpodHRwczovL2lwZnMuaW8vaXBmcy9RbWZKeWQ2NHNySlNYODI0V29ObkY2QmJ2RjR3dlBHcVZCeW5aZU45OEM3eWdxCgotPS09LQoKX0RlY2lzaW9uXwoKV2UgYXJlIHNpZ25hbGxpbmcgdGhhdDoKCjEuIFRoZSBHYWlhIDIuMC4zIGltcGxlbWVudGF0aW9uIGlzIGFsaWduZWQgd2l0aCB0aGUgbGlzdCBvZiBoaWdoLWxldmVsIGNoYW5nZXMgYXBwcm92ZWQgaW4gQ29zbW9zIEh1YiAzIFVwZ3JhZGUgUHJvcG9zYWwgQS4KCjIuIFdlIGFyZSBwcmVwYXJlZCB0byB1cGdyYWRlIHRoZSBDb3Ntb3MgSHViIHRvIGNvc21vc2h1Yi0zIGJhc2VkIHVwb24KCWEuIENvbW1pdCBoYXNoOiAyZjY3ODNlMjk4ZjI1ZmY0ZTEyY2I4NDU0OTc3NzA1M2FiODg3NDlhOwoJYi4gVGhlIHN0YXRlIGV4cG9ydCBmcm9tIGNvc21vc2h1Yi0yIGF0IEJsb2NrIEhlaWdodCAyOTAyMDAwOwoJYy4gR2VuZXNpcyB0aW1lOiA2MCBtaW51dGVzIGFmdGVyIHRoZSB0aW1lc3RhbXAgYXQgQmxvY2sgSGVpZ2h0IDI5MDIwMDAuCgozLiBXZSBhcmUgcHJlcGFyZWQgdG8gcmVsYXVuY2ggY29zbW9zaHViLTIKCWEuIEluIHRoZSBldmVudCBvZjoKCQlpLiBBIG5vbi10cml2aWFsIGVycm9yIGluIHRoZSBtaWdyYXRpb24gcHJvY2VkdXJlIGFuZC9vcgoJCWlpLiBBIG5lZWQgZm9yIGFkLWhvYyBnZW5lc2lzIGZpbGUgY2hhbmdlcwoJCWlpaS4gVGhlIGZhaWx1cmUgb2YgY29zbW9zaHViLTMgdG8gcHJvZHVjZSB0d28gKDIpIGJsb2NrcyBieSAxODAgbWludXRlcyBhZnRlciB0aGUgdGltZXN0YW1wIG9mIEJsb2NrIEhlaWdodCAyOTAyMDAwOwoJYi4gVXNpbmc6CgkJaS4gVGhlIHN0YXJ0aW5nIGJsb2NrIGhlaWdodDogMjkwMjAwMAoJCWlpLiBTb2Z0d2FyZSB2ZXJzaW9uOiBDb3Ntb3MgU0RLIHYwLjM0LjYrIGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvY29zbW9zLXNkay9yZWxlYXNlcy90YWcvdjAuMzQuMTAKCQlpaWkuIFRoZSBmdWxsIGRhdGEgc25hcHNob3QgYXQgZXhwb3J0IEJsb2NrIEhlaWdodCAyOTAyMDAwOwoJYy4gQW5kIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF1bmNoIGNvbXBsZXRlIGFmdGVyIGNvc21vc2h1Yi0yIGhhcyByZWFjaGVkIGNvbnNlbnN1cyBvbiBCbG9jayAyOTAyMDAxLgoKNC4gVGhlIHVwZ3JhZGUgd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIGNvc21vc2h1Yi0zIGhhcyByZWFjaGVkIGNvbnNlbnN1cyBvbiBCbG9jayBIZWlnaHQgMiB3aXRoaW4gMTIwIG1pbnV0ZXMgb2YgZ2VuZXNpcyB0aW1lLgoKNS4gVGhpcyBwcm9wb3NhbCBpcyB2b2lkIGlmIHRoZSB2b3RpbmcgcGVyaW9kIGhhcyBub3QgY29uY2x1ZGVkIGJ5IEJsb2NrIEhlaWdodCAyODUyMjAyLgoKLT0tPS0KCl9Db250ZXh0XwpUaGlzIHByb3Bvc2FsIGZvbGxvd3MgQ29zbW9zIEh1YiAzIFVwZ3JhZGUgUHJvcG9zYWwgRCAoaHR0cHM6Ly9odWJibGUuZmlnbWVudC5uZXR3b3JrL2Nvc21vcy9jaGFpbnMvY29zbW9zaHViLTIvZ292ZXJuYW5jZS9wcm9wb3NhbHMvMTYpIGFrYSBQcm9wIDE2LCB3aGljaCBwYXNzZWQgaW4gdm90ZSwgYnV0IGZhaWxlZCBpbiBleGVjdXRpb24gKGh0dHBzOi8vZm9ydW0uY29zbW9zLm5ldHdvcmsvdC9jb3Ntb3MtaHViLTMtdXBncmFkZS1wb3N0LW1vcnRlbS8yNzcyKS4gVGhpcyBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBzdWNjZWVkIHdoZXJlIFByb3AgMTYgZmFpbGVkLgoKVGhpcyBwcm9wb3NhbCBpcyBpbnRlbmRlZCB0byBzaWduYWwgYWNjZXB0YW5jZS9yZWplY3Rpb24gb2YgdGhlIHByZWNpc2Ugc29mdHdhcmUgcmVsZWFzZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY2hhbmdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQ29zbW9zIEh1YiAzIHVwZ3JhZGUuIEEgaGlnaCBsZXZlbCBvdmVydmlldyBvZiB0aGVzZSBjaGFuZ2VzIHdhcyBzdWNjZXNzZnVsbHkgYXBwcm92ZWQgYnkgdGhlIHZvdGVycyBzaWduYWxsaW5nIHZpYSBDb3Ntb3MgSHViIDMgVXBncmFkZSBQcm9wb3NhbCBBOgpodHRwczovL2h1YmJsZS5maWdtZW50Lm5ldHdvcmsvY29zbW9zL2NoYWlucy9jb3Ntb3NodWItMi9nb3Zlcm5hbmNlL3Byb3Bvc2Fscy8xMwoKV2UgYXJlIHByb3Bvc2luZyB0byB1c2UgdGhpcyBjb2RlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ2FpYS9yZWxlYXNlcy90YWcvdjIuMC4zIHRvIHVwZ3JhZGUgdGhlIENvc21vcyBIdWIuCldlIGFyZSBwcm9wb3NpbmcgdG8gZXhwb3J0IHRoZSBsZWRnZXLigJlzIHN0YXRlIGF0IEJsb2NrIEhlaWdodCAyLDkwMiwwMDAsIHdoaWNoIHdlIGV4cGVjdCB0byBvY2N1ciBvbiBEZWNlbWJlciAxMSwgMjAxOSBhdCBvciBhcm91bmQgMTQ6MjcgVVRDIGFzc3VtaW5nIGFuIGF2ZXJhZ2Ugb2YgNi45NCBzZWNvbmRzIHBlciBibG9jay4gUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSB3aWxsIGxpa2VseSBiZSBhIHZhcmlhbmNlIGZyb20gdGhpcyB0YXJnZXQgdGltZSwgZHVlIHRvIGRldmlhdGlvbnMgaW4gYmxvY2sgdGltZS4KCldlIGFyZSBwcm9wb3NpbmcgdGhhdCB0aGUgQ29zbW9zIEh1YiAzIGdlbmVzaXMgdGltZSBiZSBzZXQgdG8gNjAgbWludXRlcyBhZnRlciBCbG9jayBIZWlnaHQgMiw5MDIsMDAwLgoKLT0tPS0KCkNvLW9yZGluYXRpb24gaW4gY2FzZSBvZiBmYWlsdXJlIHdpbGwgaGFwcGVuIGluIHRoaXMgY2hhbm5lbDogaHR0cHM6Ly9yaW90LmltL2FwcC8jL3Jvb20vI2Nvc21vc192YWxpZGF0b3JzX3RlY2huaWNhbF91cGRhdGVzOm1hdHJpeC5vcmcYAyIlCg8xNTQxNTQ2NDIzMDQ1MDESATAaDDUyNTU4ODY2MzQwNiIBMCoMCLuWtu4FEOjdgtYDMgwIu4CA7wUQ6N2C1gM6EgoFdWF0b20SCTUxMzAwMDAwMEIMCLb8uO4FEMq63rIDSgwItuaC7wUQyrresgMKmh4IFxKOHQo3L2Nvc21vcy5kaXN0cmlidXRpb24udjFiZXRhMS5Db21tdW5pdHlQb29sU3BlbmRQcm9wb3NhbBLSHAopQ29zbW9zIEdvdmVybmFuY2UgV29ya2luZyBHcm91cCAtIFExIDIwMjAS4BtDb3Ntb3MgR292ZXJuYW5jZSBXb3JraW5nIEdyb3VwIC0gUTEgMjAyMCBmdW5kaW5nCgpDb21tdW5pdHktc3BlbmQgcHJvcG9zYWwgc3VibWl0dGVkIGJ5IEdhdmluIEJpcmNoIChodHRwczovL3R3aXR0ZXIuY29tL0V0aGVyX0dhdmluKSBvZiBGaWdtZW50IE5ldHdvcmtzIChodHRwczovL2ZpZ21lbnQubmV0d29yaykKCi09LT0tCgpGdWxsIHByb3Bvc2FsOiBodHRwczovL2lwZnMuaW8vaXBmcy9RbVNNR0VvWTJkZnhBRFBmZ29Bc0p4ampDNmh3cFNOeDFkWEFxZVBpQ0VNQ2JZCgotPS09LQoKQW1vdW50IHRvIHNwZW5kIGZyb20gdGhlIGNvbW11bml0eSBwb29sOiA1MjUwIEFUT01zCgpUaW1lbGluZTogUTEgMjAyMAoKRGVsaXZlcmFibGVzOgoxLiBBIGdvdmVybmFuY2Ugd29ya2luZyBncm91cCBjb21tdW5pdHkgJiBjaGFydGVyCjIuIEEgdGVtcGxhdGUgZm9yIGNvbW11bml0eSBzcGVuZCBwcm9wb3NhbHMKMy4gQSBiZXN0LXByYWN0aWNlcyBkb2N1bWVudCBmb3IgY29tbXVuaXR5IHNwZW5kIHByb3Bvc2Fscwo0LiBBbiBlZHVjYXRpb25hbCB3aWtpIGZvciB0aGUgQ29zbW9zIEh1YiBwYXJhbWV0ZXJzCjUuIEEgYmVzdC1wcmFjdGljZXMgZG9jdW1lbnQgZm9yIHBhcmFtZXRlciBjaGFuZ2VzCjYuIE1vbnRobHkgZ292ZXJuYW5jZSB3b3JraW5nIGdyb3VwIGNvbW11bml0eSBjYWxscyAodGhyZWUpCjcuIE1vbnRobHkgR1dHIGFydGljbGVzICh0aHJlZSkKOC4gT25lIFEyIDIwMjAgR1dHIHJlY29tbWVuZGF0aW9ucyBhcnRpY2xlCgpNaWxlc3RvbmVzOgpCeSBlbmQgb2YgTW9udGggMSwgdGhlIENvc21vcyBHb3Zlcm5hbmNlIFdvcmtpbmcgR3JvdXAgKEdXRykgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWF0ZWQgYW5kIGxlZCBieSBHYXZpbiBCaXJjaCBvZiBGaWdtZW50IE5ldHdvcmtzLgpCeSBlbmQgb2YgTW9udGggMiwgR2F2aW4gQmlyY2ggaXMgdG8gaGF2ZSBpbml0aWF0ZWQgYW5kIGxlZCBHV0figJlzIGVkdWNhdGlvbiwgYmVzdCBwcmFjdGljZXMsIGFuZCBRMiByZWNvbW1lbmRhdGlvbnMuCkJ5IGVuZCBvZiBNb250aCAzLCBHYXZpbiBCaXJjaCBpcyB0byBoYXZlIGxlZCBhbmQgcHVibGlzaGVkIGluaXRpYWwgZ292ZXJuYW5jZSBlZHVjYXRpb24sIGJlc3QgcHJhY3RpY2VzLCBhbmQgUTIgcmVjb21tZW5kYXRpb25zLgoKRGV0YWlsZWQgbWlsZXN0b25lcyBhbmQgZnVuZGluZzoKaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1GRXZNU0xiaUhvVkFZcUJxOGxvM3FRdzNLdFBNRXFERno0N0VTZjZIRWcvZWRpdD91c3A9c2hhcmluZwoKQmV5b25kIHRoZSBtaWxlc3RvbmVzLCBHYXZpbiB3aWxsIGxlYWQgdGhlIEdXRyB0byBlbmdhZ2UgaW4gYW5kIGFuc3dlciBnb3Zlcm5hbmNlLXJlbGF0ZWQgcXVlc3Rpb25zIG9uIHRoZSBDb3Ntb3MgRGlzY291cnNlIGZvcnVtLCBUd2l0dGVyLCB0aGUgcHJpdmF0ZSBDb3Ntb3MgVklQIFRlbGVncmFtIGNoYW5uZWwsIGFuZCB0aGUgQ29zbW9zIHN1YnJlZGRpdC4gVGhlIEdXRyB3aWxsIGVuZ2FnZSB3aXRoIHN0YWtlLWhvbGRlcnMgdG8gbG93ZXIgdGhlIGJhcnJpZXJzIHRvIGdvdmVybmFuY2UgcGFydGljaXBhdGlvbiB3aXRoIHRoZSBhaW0gb2YgZW1wb3dlcmluZyB0aGUgQ29zbW9zIEh1YuKAmXMgc3Rha2Vob2xkZXJzLiBUaGUgR1dHIHdpbGwgdXNlIHRoaXMgZW5nYWdlbWVudCB0byBndWlkZSByZWNvbW1lbmRhdGlvbnMgZm9yIGZ1dHVyZSBHV0cgcGxhbm5pbmcuCgpSZWFkIG1vcmUgYWJvdXQgdGhlIG91ciBlZmZvcnRzIHRvIGxhdW5jaCB0aGUgQ29zbW9zIEdXRyBoZXJlOiBodHRwczovL2ZpZ21lbnQubmV0d29yay9yZXNvdXJjZXMvaW50cm9kdWNpbmctdGhlLWNvc21vcy1nb3Zlcm5hbmNlLXdvcmtpbmctZ3JvdXAvCgotPS09LQoKX1Byb2JsZW1fClBlcmhhcHMgdGhlIG1vc3QgZGlmZmljdWx0IGJhcnJpZXIgdG8gZWZmZWN0aXZlIGdvdmVybmFuY2UgaXMgdGhhdCBpdCBkZW1hbmRzIG9uZSBvZiBvdXIgbW9zdCB2YWx1YWJsZSBhbmQgc2NhcmNlIHJlc291cmNlczogb3VyIGF0dGVudGlvbi4gU3Rha2Vob2xkZXJzIG1heSBiZSBkaXNhZHZhbnRhZ2VkIGJ5IGluZm9ybWF0aW9uYWwgb3IgcmVzb3VyY2UtYmFzZWQgYXN5bW1ldHJpZXMsIHdoaWxlIG90aGVyIGVudGl0aWVzIG1heSBleHBsb2l0IHRoZXNlIHNhbWUgYXN5bW1ldHJpZXMgdG8gY2FwdHVyZSB2YWx1ZSBjb250cm9sbGVkIGJ5IHRoZSBDb3Ntb3MgSHVi4oCZcyBnb3Zlcm5hbmNlIG1lY2hhbmlzbXMuCgpXZeKAmXJlIGNvbmNlcm5lZCB0aGF0IHdpdGhvdXQgZXN0YWJsaXNoaW5nIGNvbW11bml0eSBzdGFuZGFyZHMsIHByb2Nlc3NlcywgYW5kIGRyaXZpbmcgZGVjZW50cmFsaXplZCBkZWxlZ2F0b3ItYmFzZWQgcGFydGljaXBhdGlvbiwgdGhlIENvc21vcyBIdWIgZ292ZXJuYW5jZSBtZWNoYW5pc20gY291bGQgYmUgY28tb3B0ZWQgYnkgYSBjZW50cmFsaXplZCBwb3dlci4gQXMgZ292ZXJuYW5jZSBmdW5jdGlvbmFsaXR5IGRldmVsb3BzLCBwb3RlbnRpYWwgcGFydGljaXBhbnRzIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhc3Nlc3MgcHJvcG9zYWxzIGJ5IGtub3dpbmcgd2hhdCB0byBwYXkgYXR0ZW50aW9uIHRvLgoKX1NvbHV0aW9uXwpXZeKAmXJlIGZvcm1pbmcgYSBmb2N1c2VkLCBkaXZlcnNlIGdyb3VwIHRoYXTigJlzIGNhcGFibGUgb2YgYXNzZXNzaW5nIGFuZCBzeW50aGVzaXppbmcgdGhlIGtleSBwYXJ0cyBvZiBhIHByb3Bvc2FsIHNvIHRoYXQgdGhlIHZvdGluZyBjb21tdW5pdHkgY2FuIGdldCBhIGZhaXIgc3VtbWFyeSBvZiB3aGF0IHRoZXkgbmVlZCB0byBrbm93IGJlZm9yZSB2b3RpbmcuCgpPdXIgc29sdXRpb24gaXMgdG8gaW5pdGlhdGUgYSBDb3Ntb3MgZ292ZXJuYW5jZSB3b3JraW5nIGdyb3VwIHRoYXQgZGV2ZWxvcHMgZGVjZW50cmFsaXplZCBjb21tdW5pdHkgZ292ZXJuYW5jZSBlZmZvcnRzIGFsb25nc2lkZSB0aGUgSHVi4oCZcyBkZXZlbG9wbWVudC4gV2Ugd2lsbCBkZXZlbG9wIGFuZCBkb2N1bWVudCBnb3Zlcm5hbmNlIGZlYXR1cmVzIGFuZCBwcmFjdGljZXMsIGFuZCB0aGVuIGNvbW11bmljYXRlIHRoZXNlIHRvIHRoZSBicm9hZGVyIENvc21vcyBjb21tdW5pdHkuCgpfRnV0dXJlXwpBdCB0aGUgZW5kIG9mIFExLCB3ZeKAmWxsIHB1Ymxpc2ggcmVjb21tZW5kYXRpb25zIGZvciB0aGUgZnV0dXJlIG9mIHRoZSBDb3Ntb3MgR1dHLCBhbmQgaWRlYWxseSB3ZeKAmWxsIGJlIHByZXBhcmVkIHRvIHN1Ym1pdCBhIHByb3Bvc2FsIGJhc2VkIHVwb24gdGhvc2UgcmVjb21tZW5kYXRpb25zIGZvciBRMiAyMDIwLiBXZSBwbGFuIHRvIGNvbnRpbnVlIG91ciB3b3JrIGluIGJsb2NrY2hhaW4gZ292ZXJuYW5jZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBIdWIgcGFzc2VzIG91ciBwcm9wb3NhbHMuCgotPS09LQoKQ29zbW9zIGZvcnVtOiBodHRwczovL2ZvcnVtLmNvc21vcy5uZXR3b3JrL2MvZ292ZXJuYW5jZQpDb3Ntb3MgR1dHIFRlbGVncmFtIGNoYW5uZWw6IGh0dHBzOi8vdC5tZS9odWJnb3YKVHdpdHRlcjogaHR0cHM6Ly90d2l0dGVyLmNvbS9Db3Ntb3NHb3YaLWNvc21vczFoamN0NnE3bnBzc3BzZzNkZ3Z6azNzZGY4OXNwbWxwZmc4d3dmNyITCgV1YXRvbRIKNTI1MDAwMDAwMBgDIjsKDzEzMjcwNzMxNDc4MTY1MxINNjc5MjE1MjcwNTIxNBoNNjU4MzUyMDQ0OTQwOCIKMTIwNDA0OTk5OSoKCITt+vAFENqpRzIKCITXxPEFENqpRzoSCgV1YXRvbRIJNTEyMDAwMDAwQgwI+Mn98AUQ3aulkQJKDAj4s8fxBRDdq6WRAgqgGAgZEqEXCjcvY29zbW9zLmRpc3RyaWJ1dGlvbi52MWJldGExLkNvbW11bml0eVBvb2xTcGVuZFByb3Bvc2FsEuUWCjFDb3NtV2FzbSBJbnRlZ3JhdGlvbiAxIC0gUGVybWlzc2lvbnMgYW5kIFVwZ3JhZGVzEuoVQ29zbVdhc20gSW50ZWdyYXRpb24gMSAtIFBlcm1pc3Npb25zIGFuZCBVcGdyYWRlcwoKQ29tbXVuaXR5LXNwZW5kIHByb3Bvc2FsIHN1Ym1pdHRlZCBieSBFdGhhbiBGcmV5IChodHRwczovL2dpdGh1Yi5jb20vZXRoYW5mcmV5KSBvZiBDb25maW8gVU8gKGh0dHA6Ly9jb25maW8udGVjaC8pIGFuZCBDb3NtV2FzbSAoaHR0cHM6Ly93d3cuY29zbXdhc20uY29tKQoKLT0tPS0KCkZ1bGwgcHJvcG9zYWw6IGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtYkQzYk1halFDRm10RG1rdVJWV2htTVdWZE4yc0s4UVAyRm9GQ3o5Y2pQaUMKRm9ydW0gUG9zdDogaHR0cHM6Ly9mb3J1bS5jb3Ntb3MubmV0d29yay90L3Byb3Bvc2FsLWNvc213YXNtLW9uLWNvc21vcy1odWIvMzYyOQoKLT0tPS0KCkFtb3VudCB0byBzcGVuZCBmcm9tIHRoZSBjb21tdW5pdHkgcG9vbDogMjUwMDAgQVRPTXMKClRpbWVsaW5lOiAyLTQgbW9udGhzIGZyb20gYXBwcm92YWwKCkRlbGl2ZXJhYmxlczoKMS4gQWRkaW5nIGdvdmVybmFuY2UgY29udHJvbCB0byBhbGwgYXNwZWN0cyBvZiB0aGUgQ29zbVdhc20gY29udHJhY3QgbGlmZWN5Y2xlIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIHRoZSBodWIuIEFsbG93aW5nIGdvdmVybmFuY2UgdG8gY29udHJvbCBjb2RlIHVwbG9hZCwgY29udHJhY3QgaW5zdGFudGlhdGlvbiwgdXBncmFkZXMsIGFuZCBkZXN0cnVjdGlvbiAoaWYgbmVlZGVkKS4KMi4gQWRkaW5nIGFiaWxpdHkgdG8gdXBncmFkZSBjb250cmFjdHMgYWxvbmcgd2l0aCBtaWdyYXRpb25zIChhbHNvIGFsbG93aW5nIG9yZGVybHkgc2h1dGRvd25zKS4gVGhpcyBjb250cm9sbGVkIGJ5IGEgZ292ZXJuYW5jZSB2b3RlLgozLiBMYXVuY2ggYSB0ZXN0bmV0IHdpdGggd29ya2luZyB2ZXJzaW9uIG9mIHRoaXMgY29kZSAoQ29zbW9zIFNESyAwLjM4IG9yIDAuMzkpIHRvIGVuYWJsZSBhbGwgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHRyaWFsIHRoZSBwcm9jZXNzIGFuZCBwcm92aWRlIGZlZWRiYWNrLgo0LiBQcm92aWRlIHNhbXBsZSBjb250cmFjdHMgdG8gZGVtbyBvbiB0aGUgdGVzdG5ldCwgYWxvbmcgd2l0aCBzb21lIG1pZ3JhdGlvbiBzY2VuYXJpb3MKCldpdGhpbiAyIG1vbnRocywgdGhlIHdvcmtpbmcgY29kZSBhbmQgYmluYXJpZXMgc2hvdWxkIGJlIGRlbGl2ZXJlZCBhbmQgb3BlbiBmb3IgcHVibGljIHJldmlldy4gV2l0aGluIDQgbW9udGhzLCB0aGVzZSBiaW5hcmllcyB3aWxsIGJlIHVzZWQgb24gYSB0ZXN0bmV0LCB3aXRoIHN1ZmZpY2llbnQgc3Rha2luZyB0b2tlbnMgZ2l2ZW4gdG8gYWxsIGFjdGl2ZSB2b3RlcnMgb24gdGhlIENvc21vcyBIdWIsIGFuZCB3ZSB3aWxsIGdvIHRocm91Z2ggYSBmZXcgZ292ZXJuYW5jZSB2b3RpbmcgY3ljbGVzIHRvIHRyaWFsIGNvbnRyYWN0IGRlcGxveW1lbnQgYW5kIG1pZ3JhdGlvbnMgKHdpdGggYSBzaG9ydGVyIHZvdGluZyBjeWNsZXMsIGVnLiAzIGRheXMpCgpEZXRhaWxlZCBtaWxlc3RvbmVzIGluIHRoZSBmdWxsIHByb3Bvc2FsOgpodHRwczovL2lwZnMuaW8vaXBmcy9RbWJEM2JNYWpRQ0ZtdERta3VSVldobU1XVmROMnNLOFFQMkZvRkN6OWNqUGlDCgpCZXlvbmQgdGhlIG1pbGVzdG9uZXMsIENvc21XYXNtIHdpbGwgZW5oYW5jZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb2ZmZXIgdGVjaG5pY2FsIHN1cHBvcnQgb24gb3VyIFRlbGVncmFtIGNoYW5uZWwuCgotPS09LQoKX1Byb2JsZW1fCldpdGggdGhlIHVwY29taW5nIGxhdW5jaCBvZiBJQkMsIHRoZSBodWIgd2lsbCBuZWVkIHRvIGFkYXB0IG1vcmUgcmFwaWRseSB0byB0aGUgbmVlZHMgb2YgdGhlIGVjb3N5c3RlbSwgd2hpbGUgYWxzbyBsaW1pdGluZyBjaGFpbiByZXN0YXJ0cywgd2hpY2ggbWF5IGJlIGRldHJpbWVudGFsIHRvIElCQyBjb25uZWN0aW9ucy4gSW4gcGFydGljdWxhciBzdXBwb3J0IGZvciByZWxheWluZyBEeW5hbWljIElCQyBQcm90b2NvbHMgYW5kIFJlbnRlZCBTZWN1cml0eSwgdXNpbmcgQVRPTXMgYXMgY29sbGF0ZXJhbCBmb3Igc21hbGxlciB6b25lcywgd291bGQgZ3JlYXRseSBiZW5lZml0IGZyb20gQ29zbVdhc20ncyBmbGV4aWJpbGl0eS4KCl9Tb2x1dGlvbl8KV2XigJlyZSBhZGRpbmcgc29tZSBrZXkgZmVhdHVyZXMgdG8gQ29zbVdhc20gdG8gY29udmVydCBpdCBmcm9tIGEgcGVybWlzc2lvbmxlc3MsIGltbXV0YWJsZSBzbWFydCBjb250cmFjdCBwbGF0Zm9ybSB0byBhIHBlcm1pc3Npb25lZCBwbGF0Zm9ybSB3aXRoIGdvdmVybmFuY2UgY29udHJvbCBmb3IgdXBncmFkaW5nIG9yIHNodXR0aW5nIGRvd24gY29udHJhY3RzLiBUaGlzIGlzIGEga2V5IHJlcXVpcmVtZW50IHRvIGJlIGFibGUgdG8gaW50ZWdyYXRlIENvc21XYXNtIHRvIHRoZSBDb3Ntb3MgSHViIHdpdGggbWluaW1hbCBkaXNydXB0aW9uLgoKX0Z1dHVyZV8KV2Ugd2lsbCBjb250aW51ZSBkZXZlbG9wbWVudCBvZiBDb3NtV2FzbSwgZXNwZWNpYWxseSBhZGRpbmcgSUJDIGludGVncmF0aW9uIGFzIHdlbGwgYXMgd29ya2luZyB0b3dhcmRzIGEgc3RhYmxlIDEuMCByZWxlYXNlIHRoYXQgY2FuIGJlIGF1ZGl0ZWQgYW5kIHNhZmVseSBkZXBsb3llZCAoUTMvUTQgMjAyMCkuCgotPS09LQoKVHdpdHRlcjogaHR0cHM6Ly90d2l0dGVyLmNvbS9Db3NtV2FzbQpNZWRpdW06IGh0dHBzOi8vbWVkaXVtLmNvbS9jb25maW8KVGVsZWdyYW06IGh0dHBzOi8vdC5tZS9qb2luY2hhdC9Ba1pyaUVoazlxY1J3NUE1VTJNYXBBCldlYnNpdGU6IGh0dHBzOi8vd3d3LmNvc213YXNtLmNvbQpHaXRodWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9Db3NtV2FzbRotY29zbW9zMXkzeDdxNzcydThzMjVjNXp2ZTk0OWZoYW5yaHZtdG51NDg0bDh6IhQKBXVhdG9tEgsyNTAwMDAwMDAwMBgDIioKDzEzMDYzMzQxMTcxNjQ4ORIIMTc2NTAwMDAaCjY3NTQ1NjM0MTEiATAqDAjosOv1BRD7ye7dATIMCOiatfYFEPvJ7t0BOhIKBXVhdG9tEgk1NDEwMDAwMDBCDAj7rOz1BRD8wamIAkoMCPuWtvYFEPzBqYgCCqkpCBoSlygKNy9jb3Ntb3MuZGlzdHJpYnV0aW9uLnYxYmV0YTEuQ29tbXVuaXR5UG9vbFNwZW5kUHJvcG9zYWwS2ycKJVRha2VvZmYgUHJvcG9zYWwgZnJvbSBDeWJlciB0byBDb3Ntb3MS7CZjeWJlciBDb25ncmVzcyAoaHR0cHM6Ly9jeWJlcmNvbmdyZXNzLmFpKSBkZXZlbG9wZWQgQ3liZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9jeWJlcmNvbmdyZXNzL2dvLWN5YmVyKTogYSBzb2Z0d2FyZSBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIGludGVybmV0IGJlaGVtb3RoIG1vbm9wb2xpZXMsIHN1Y2ggYXMgR29vZ2xlLCB3aGljaCBleHBsb2l0ZWQgb3V0ZGF0ZWQgaW50ZXJuZXQgcHJvdG9jb2xzIHVzaW5nIHRoZSBjb21tb24gcGF0dGVybnMgb2Ygb3VyIHNlbWFudGljIGludGVyYWN0aW9uLiBUaGVzZSBjb3JwcyBsb2NrIHRoZSBpbmZvcm1hdGlvbiwgcHJvZHVjZWQgYnkgdGhlIHVzZXJzLCBmcm9tIHNlYXJjaCwgc29jaWFsIGFuZCBjb21tZXJjaWFsIGtub3dsZWRnZSBncmFwaHMgaW4gcHJpdmF0ZSBkYXRhYmFzZXMsIGFuZCB0aGVuIHNlbGwgdGhpcyBrbm93bGVkZ2UgYmFjayBhcyBhZHZlcnRpc2VtZW50LiBUaGV5IHN0YW5kIGFzIGFuIGluc3VybW91bnRhYmxlIHdhbGwgYmV0d2VlbiBjb250ZW50IGNyZWF0b3JzIGFuZCBjb25zdW1lcnMgZXh0cmFjdGluZyBhbiBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgdGhlIGNyZWF0ZWQgdmFsdWUuCgpXZSBwcm9wb3NlIEFUT00gaG9sZGVycyB0byBpbnZlc3QgMTAsMDAwIEFUT00gZnJvbSB0aGUgY29tbXVuaXR5IHBvb2wgaW50byB0aGUgVGFrZW9mZiBvZiBDeWJlci4gSW4gZXhjaGFuZ2UsIGF0IHRoZSBlbmQgb2YgaXRzIGRvbmF0aW9uIHJvdW5kIChodHRwczovL2N5YmVyLnBhZ2UvZ29sL3Rha2VvZmYpLCBhbmQgd2hlbiBhbiBJQkMgY29ubmVjdGlvbiB3aWxsIGJlY29tZSBwb3NzaWJsZSwgY3liZXIgQ29uZ3Jlc3Mgd2lsbCB0cmFuc2ZlciBDWUIgdG9rZW5zIGJhY2sgdG8gdGhlIGNvbW11bml0eSBwb29sLiBQYXNzaW5nIHRoaXMgcHJvcG9zYWwgd2lsbCB0cmFuc2ZlciAxMCwwMDAgQVRPTXMgZnJvbSB0aGUgY29tbXVuaXR5IHBvb2wgdG8gY3liZXIgQ29uZ3Jlc3MgbXVsdGlzaWcgKGh0dHBzOi8vd3d3Lm1pbnRzY2FuLmlvL2FjY291bnQvY29zbW9zMWxhdHptZTZ4ZjZzOHRzcnltdXU2bGFmMmtzMmh1bXF2MnRrZDlhKS4KCkZ1bGwgUHJvcG9zYWwtTWFuaWZlc3QgdGV4dDogaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1VWURRdDl0cUxRSnd4blVjazdkUVkzWG1aQTN0RHRwRmgzSGNoa2c3b0g0NgoKb3IgYXQgaHR0cHM6Ly9jeWJlci5wYWdlL2dvbC90YWtlb2ZmCgpUaGUgc29mdHdhcmUgd2Ugb2ZmZXIgcmVzZW1ibGVzIGEgZGVjZW50cmFsaXplZCBnb29nbGUgKGh0dHBzOi8vZ2l0aHViLmNvbS9jeWJlcmNvbmdyZXNzKToKLSBBIHByb3RvY29sIHNwZWMgYW5kIHRoZSByYXRpb25hbGUgYmVoaW5kIGl0Ci0gZ28tY3liZXI6IG91ciBpbXBsZW1lbnRhdGlvbiB1c2luZyBjb3Ntb3Mtc2RrCi0gY3liZXIucGFnZTogUG9DIHJlZmVyZW5jZSB3ZWIgaW50ZXJmYWNlCi0gbGF1bmNoLWtpdDogdXNlZnVsIHRvb2xzIGZvciBsYXVuY2hpbmcgY29zbW9zLXNkayBiYXNlZCBjaGFpbnMKLSBjeWJlcmluZGV4OiBHcmFwaFFMIG1pZGRsZXdhcmUgZm9yIGN5YmVyCi0gZXVsZXIgRm91bmRhdGlvbjogbWFpbm5ldCBwcmVkZWNlc3NvciBvZiBjeWJlciBGb3VuZGF0aW9uOiB0aGUgREFPLCB3aGljaCB3aWxsIGhhbmRsZSBhbGwgdGhlIGRvbmF0ZWQgRVRICi0gZG9jdW1lbnRhdGlvbiBhbmQgdmFyaW91cyBzaWRlIHRvb2xzCgpDeWJlciBzb2x2ZXMgdGhlIHByb2JsZW0gb2Ygb3BlbmluZyB1cCB0aGUgY2VudHJhbGlzZWQgc2VtYW50aWNzIGNvcmUgb2YgdGhlIEludGVybmV0LiBJdCBkb2VzIHNvIGJ5IG9wZW5pbmcgdXAgYWNjZXNzIHRvIGV2ZXJncm93aW5nIHNlbWFudGljcyBjb3JlIHRhdWdodCB0byBpdCBieSB0aGUgdXNlcnMuCgpFY29ub21pY3Mgb2YgdGhlIHByb3RvY29sIGFyZSBidWlsdCBhcm91bmQgdGhlIGlkZWEgdGhhdCBmZWVkYmFjayBsb29wcyBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgbGlua3MgYW5kIHRoZSB2YWx1ZSBvZiB0aGUga25vd2xlZGdlIGdyYXBoIGV4aXN0LiBUaGUgbW9yZSB1c2FnZSA9PiB0aGUgYmlnZ2VyIHRoZSBrbm93bGVkZ2UgZ3JhcGggPT4gdGhlIG1vcmUgdmFsdWUgPT4gdGhlIGJldHRlciB0aGUgcXVhbGl0eSBvZiB0aGUga25vd2xlZGdlID0+IHRoZSBtb3JlIHVzYWdlLiBUcmFuc2FjdGlvbiBmZWVzIGZvciBiYXNpYyBvcGVyYXRpb25zIGFyZSByZXBsYWNlZCBieSBsaWZldGltZSBiYW5kd2lkdGgsIHdoaWNoIG1lYW5zIHVzYWJpbGl0eSBmb3IgYm90aCwgZW5kLXVzZXJzIGFuZCBkZXZlbG9wZXJzLiBZb3UgY2FuIHRoaW5rIG9mIEN5YmVyIGFzIGEgc2hhcmVkIEFTSUMgZm9yIHNlYXJjaC4KCllvdSBhbHJlYWR5IHNlZSB0aGF0IHRoZSBpZGVhIG9mIEN5YmVyIGV2b2x2ZXMgYXJvdW5kIGNvbnRlbnQgaWRlbnRpZmllcnMgYW5kIGl0cyByYW5rcy4gRnJvbSBoZXJlLCB3ZWxjb21lIHRvIERlY2VudHJhbGl6ZWQgTWFya2V0aW5nLCBvciBEZU1hLiBZb3UndmUgY2VydGFpbmx5IGhlYXJkIG9mIERlRmkuIERlRmkgaXMgYnVpbHQgYXJvdW5kIGEgc2ltcGxlIGlkZWEgdGhhdCB5b3UgY2FuIHVzZSBhIGNvbGxhdGVyYWwgZm9yIHNvbWV0aGluZyB0aGF0IHdpbGwgYmUgc2V0dGxlZCBiYXNlZCBvbiBhIHByb3ZpZGVkIHByaWNlIGZlZWQuIEhlcmUgY29tZXMgdGhlIHN5c3RlbWF0aWMgcHJvYmxlbSBvZiBEZUZpOiBwcmljZSBvcmFjbGVzLiBEZU1hIGlzIGJhc2VkIG9uIHRoZSBzYW1lIGlkZWEgb2YgdXNpbmcgY29sbGF0ZXJhbCwgYnV0IHRoZSBpbnB1dCBmb3Igc2V0dGxlbWVudCBjYW4gYmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjb250ZW50IGlkZW50aWZpZXIgaXRzZWxmLgoKV2l0aCB0aGUgaGVscCBvZiBEZU1hIGFuZCBJQkMgY2hhaW5zIHdpbGwgYmUgYWJsZSB0byBwcm92ZSByZWxldmFuY2UgdXNpbmcgY29udGVudCBpZGVudGlmaWVycyBhbmQgdGhlaXIgcmFua3Mgb25lIHRvIGFub3RoZXIuIFRoaXMgd2lsbCBoZWxwIHRvIGdyb3cgdGhlIElCQyBlY29zeXN0ZW0sIHdoZXJlIGVhY2ggY2hhaW4gaGFzIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMgdG8gZXhjaGFuZ2UgZGF0YSwgd2hpY2ggaXMgcHJvdmFibHkgdmFsdWVkLgoKQ29zbW9zIHdhcyBjcmVhdGVkIHRvIGJlY29tZSB0aGUgaW50ZXJuZXQgb2YgYmxvY2tjaGFpbnMuIEEgcHJvdG9jb2wgdGhhdCBwcm9wYWdhdGVzIHRoZSBzcGlyaXQgb2YgZGVjZW50cmFsaXphdGlvbiBhbmQgZ292ZXJuZWQgYnkgdGhlIGNvbW11bml0eS4gRm9yIHN1Y2ggdGVjaG5vbG9neSB0byBzdWNjZWVkLCBhIGxvdCBpcyByZXF1aXJlZC4gT25lIHRoaW5nIGlzIGEgc29saWQgZm91bmRhdGlvbiBpdCBjYW4gYnVpbGQgb24uIE9uZSB2aXJ0dWUgb2Ygc3VjaCBmb3VuZGF0aW9uIGlzIG1vbmV0YXJ5IGZsb3cgb2YgaW5jb21lIHRoYXQgaGFzIHRvIGZlZWQgdGhpcyBtYWNoaW5lIGZvciBhcyBsb25nIGFzIGl0IGV4aXN0cy4KCkEgZ29vZCBxdWVzdGlvbiB0aGF0IGFyaXNlcyBpcyBob3cgdG8gdHVybiB0aGUgY29tbXVuaXR5IHBvb2wgaW50byBhIHBvb2wgdGhhdCBpc27igJl0IChhKSBhIHBvdCBvZiBtb25leSB3aGljaCBnb2VzIHNvbGVseSB0byBuZXR3b3JrIHNlY3VyaXR5LCAoYikgYSBwb29sIHRoYXQgaXNu4oCZdCBzb2xlbHkgYSBidWlsZC11cCBvZiBpbmZsYXRpb25hcnkgcmV3YXJkcyBhbmQgKNGBKSBoYXMgbG9uZyB0ZXJtIHByb3NwZXJpdHkgdmFsdWUgKGl0cyB2YWx1ZSByaXNlcykuCgpUaGUgc29sdXRpb24gdG8gdGhlIGFib3ZlIHByb2JsZW0gaXMgdG8gZXN0YWJsaXNoIGEgZnVuZCwgdGhhdCBpcyBtYW5hZ2VkIGFuZCBwcm9jZXNzZWQgY29sbGVjdGl2ZWx5IGFuZCBjb25zaXN0cyBvZiBhIGRpdmVyc2lmaWVkIG51bWJlciBvZiBhc3NldHMgdGhhdCBjYW4gYnJpbmcgbG9uZyB0ZXJtIHZhbHVlIHRvIGl0cyBzdGFrZWhvbGRlcnMuCgpUaGlzIG1lYW5zIHVzaW5nIHRoZSBmdW5kcyB0byBzdXBwb3J0IGV4Y2VwdGlvbmFsIHByb2plY3RzIHRoYXQgYXJlIGJ1aWxkaW5nIHdpdGggVGVuZGVybWludCBhbmQgQ29zbW9zLVNESy4gQWZ0ZXIgYWxsLCBpcyB3ZSB3YW50IHRvIGdsb3JpZnkgdGhlIGVjb3N5c3RlbSwgd2UgbmVlZCBmb3IgaXQgdG8gZ3Jvdy4gSG93IHdpbGwgaXQgZ3Jvdz8gSXQgd2lsbCBoYXZlIHByb2plY3RzIHdpdGggYSBjbGVhciB1dGlsaXR5LCBhbWF6aW5nIGEgcHJvZHVjdCBhbmQgcHJvdmFibGUgZGlzdHJpYnV0aW9uLiBUaGlzIHdpbGwgYXR0cmFjdCB1c2VycywgZGV2ZWxvcGVycyBhbmQgbGFyZ2Ugc3Rha2Vob2xkZXJzIHRvIHRoZSBlY29zeXN0ZW0uIFRvZ2V0aGVyIHdlIGFscmVhZHkgZGlkIG9uZSB2ZXJ5IHN1Y2Nlc3NmdWwgaW52ZXN0bWVudCBkZWNpc2lvbi4gV2UgYWxsIHBhcnRpY2lwYXRlZCBpbiBjb3Ntb3MgZnVuZHJhaXplci4gU28gbGV0IHVzIG1vdmUgdGhlIGlkZWEgZm9yd2FyZC4KCklmIHRoaXMgcHJvcG9zYWwgaXMgc3VjY2Vzc2Z1bCBhbmQgc3RhbmRzIGZvciBtb3JlIGRlbWFuZCBmcm9tIHRoZSBwdWJsaWMsIHdlIHdpbGwgb3BlbiBhbm90aGVyIHByb3Bvc2FsIHVzaW5nIHRoZSBjb21tdW5pdHkgcG9vbC4gSG93ZXZlciwgYW55b25lIGNhbiBwYXJ0aWNpcGF0ZSBpbiBHYW1lIG9mIExpbmtzIChodHRwczovL2N5YmVyLnBhZ2UvZ29sLykgb3IgVGFrZW9mZiBodHRwczovL2N5YmVyLnBhZ2UvZ29sL3Rha2VvZmYgaW5kZXBlbmRlbnRseS4gSWYgeW91IGhhdmUgcXVlc3Rpb24geW91IGNhbiBhc2sgdGhlbSBlaXRoZXIgb24gQ3liZXIgdG9waWMgb24gQ29zbW9zIGZvcnVtIChodHRwczovL2ZvcnVtLmNvc21vcy5uZXR3b3JrL3QvY3liZXItYS1kZWNlbnRyYWxpemVkLWdvb2dsZS1mb3ItcHJvdmFibGUtYW5kLXJlbGV2YW50LWFuc3dlcnMpIG9yIEN5YmVyIGZvcnVtIChodHRwczovL2FpLmN5YmVyY29uZ3Jlc3MuYWkpLgoKUHJvcG9zYWwgcmVzdWx0czogaHR0cHM6Ly93d3cubWludHNjYW4uaW8vcHJvcG9zYWxzLzI2Gi1jb3Ntb3MxbGF0em1lNnhmNnM4dHNyeW11dTZsYWYya3MyaHVtcXYydGtkOWEiFAoFdWF0b20SCzEwMDAwMDAwMDAwGAQiPQoOMjUyNDc2NTE2Njg1OTASDjMwODg3MDQ4MTMyMzgyGg40NzIyMzMyMjc3ODQzOSILMTg3MTk5NjQ5MzgqDAirg5v2BRCpsriLATIMCKvt5PYFEKmyuIsBOhIKBXVhdG9tEgk1MTIwMDAwMDBCDAirg5v2BRCpsriLAUoMCKvt5PYFEKmyuIsBCp0MCBsSlAsKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEu8KChtTdGFyZ2F0ZSBVcGdyYWRlIFByb3Bvc2FsIDESzwpTdGFyZ2F0ZSBpcyBvdXIgbmFtZSBmb3IgdGhlIHByb2Nlc3Mgb2YgZW5zdXJpbmcgdGhhdCB0aGUgd2lkZWx5IGludGVncmF0ZWQgcHVibGljIG5ldHdvcmsga25vd24gYXMgdGhlIENvc21vcyBIdWIgaXMgYWJsZSB0byBleGVjdXRlIHRoZSBjb3Ntb3NodWItMyAtPiBjb3Ntb3NodWItNCB1cGdyYWRlIHdpdGggdGhlIG1pbmltdW0gZGlzcnVwdGlvbiB0byBpdHMgZXhpc3RpbmcgZWNvc3lzdGVtLiBUaGlzIHVwZ3JhZGUgd2lsbCBhbHNvIHJlYWxpemUgdGhlIEludGVybmV0IG9mIEJsb2NrY2hhaW5zIHZpc2lvbiBmcm9tIHRoZSBDb3Ntb3Mgd2hpdGVwYXBlci4KSW50ZWdyYXRpb25zIGZyb20gZWNvc3lzdGVtIHBhcnRuZXJzIGFyZSBhdCByaXNrIG9mIGJyZWFraW5nIGNoYW5nZXMgZHVlIHRvIHRoZSBTdGFyZ2F0ZSBjaGFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGRyaXZlIHRoZSBuZWVkIGZvciBzdWJzdGFudGlhbCByZXNvdXJjZSBhbmQgdGltZSByZXF1aXJlbWVudHMgdG8gZW5zdXJlIHN1Y2Nlc3NmdWwgbWlncmF0aW9uLiBTdGFyZ2F0ZSByZXByZXNlbnRzIGEgdW5pcXVlIHNldCBvZiBjaXJjdW1zdGFuY2VzIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gc2V0IHByZWNlZGVudCBmb3IgZnV0dXJlIHVwZ3JhZGVzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBsZXNzIGRyYW1hdGljLgpUaGVyZSBpcyBhIHdpZGVzcHJlYWQgY29uc2Vuc3VzIGZyb20gbWFueSBDb3Ntb3Mgc3Rha2Vob2xkZXJzIHRoYXQgdGhlc2UgY2hhbmdlcyB0byBjb3JlIHNvZnR3YXJlIGNvbXBvbmVudHMgd2lsbCBlbmhhbmNlIHRoZSBwZXJmb3JtYW5jZSBhbmQgY29tcG9zYWJpbGl0eSBvZiB0aGUgc29mdHdhcmUgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgQ29zbW9zIEh1YiBpbiBhIHdvcmxkIG9mIG1hbnkgYmxvY2tjaGFpbnMuCkEgWWVzIHJlc3VsdCBvbiB0aGlzIHByb3Bvc2FsIHByb3ZpZGVzIGEgY2xlYXIgc2lnbmFsIHRoYXQgdGhlIENvc21vcyBIdWIgYWNjZXB0cyBhbmQgdW5kZXJzdGFuZHMgdGhlIFN0YXJnYXRlIHByb2Nlc3MgYW5kIGlzIHByZXBhcmVkIHRvIGFwcHJvdmUgYW4gdXBncmFkZSB3aXRoIHByb3Bvc2VkIGNoYW5nZXMgaWYgdGhlIHBsYW4gYmVsb3cgaXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LgpBIE5vIHJlc3VsdCB3b3VsZCBmb3JjZSBhIHJlY29uc2lkZXJhdGlvbiBvZiB0aGUgdHJhZGVvZmZzIGluIHRoZSBBbHRlcm5hdGl2ZXMgc2VjdGlvbiBhbmQgdGhlIGZvcm1pbmcgYSBuZXcgcGxhbiB0byBkZWxpdmVyIElCQy4KU2VlIHRoZSBmdWxsIHByb3Bvc2FsIGhlcmU6IGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtYm8zZkY1NHRYM0pkb0haTlZMY1NCcmRrWExpZTU2VmgydTI5d0xmczRQblcYAyI0Cg8xMDE4NDU5NzMwNDMyNjgSCTU1OTQwODg2NBoLMjExODUwMjY3MDYiCTEwNjE0NDQ5MioMCMbYqvgFEKGuotIBMgwIxsL0+AUQoa6i0gE6EgoFdWF0b20SCTUxMjAwMDAwMEIMCOv1rvgFEKKqq44BSgwI69/4+AUQoqqrjgEK2wkIHRLJCAogL2Nvc21vcy5nb3YudjFiZXRhMS5UZXh0UHJvcG9zYWwSpAgKYEdlbmVzaXMgZnVuZCByZWNvdmVyeSBwcm9wb3NhbCBvbiBiZWhhbGYgb2YgZnVuZHJhaXNlciBwYXJ0aWNpcGFudHMgdW5hYmxlIHRvIGFjY2VzcyB0aGVpciBBVE9NcxK/B1RoZSBwdXJwb3NlIG9mIHRoaXMgcHJvcG9zYWwgaXMgdG8gcmVzdG9yZSBhY2Nlc3MgdG8gZ2VuZWlzIEFUT01zIGZvciBhIHN1YnNldCBvZiBkb25vcnMgd2hvIGhhdmUgYmVlbiBhY3RpdmUgcGFydGljaXBhbnRzIGluIG91ciBjb21tdW5pdHkgdGhyb3VnaCB0aGUgbGFzdCB5ZWFyLgogVGhlIHZpZXcgb2YgaXFsdXNpb24gaXMgdGhhdCB0aGlzIGlzIGFuIGltcG9ydGFudCBtb21lbnQgZm9yIHRoZSBDb3Ntb3MgSHViLiBTdGFyZ2F0ZSBicmluZ3MgdGhlIGZ1bmRyYWlzZXIgcGVyaW9kIHRvIHRoZSBlbmQgd2l0aCBkZWxpdmVyeSBvZiBJQkMuIFRoaXMgcHJvcG9zYWwgcmVzb2x2ZXMgdGhlIG9wZW4gYnVzaW5lc3Mgb2YgYWN0aXZlIG1lbWJlcnMgb2Ygb3VyIGNvbW11bml0eSB3aG8gY2Fubm90IGFjY2VzcyB0aGVpciBBVE9NLiBUaGlzIGlzIGFuIG9wcG9ydHVuaXR5IGlzIG9wcG9ydW5pdHkgdG8gYnJpbmcgdGhpcyBidXNpbmVzcyB0byBhIGNsb3NlIGFuZCBzZXR1cCB0aGUgYWdlbmRhIGZvciBJQkMgcG93ZXJlZCBpbm5vdmF0aW9uIGNvbW1pbmcgaW4gMjAyMS5XZSBzdHJvbmdseSBlbmNvdXJhZ2UgdGhlIENvc21vcyBDb21tdW5pdHkgdG8gdmVyaWZ5IHRoZSBjcnlwdG9ncmFwaGljIGV2aWRlbmNlIGFuZCBicmluZyB0aGVzZSBjb21tdW5pdHkgbWVtYmVycyB0byBmdWxsIEFUT00gaG9sZGVyIHN0YXR1cy4KCgpGdWxsIFByb3Bvc2FsOmh0dHBzOi8vaXBmcy5pby9pcGZzL1FtVjZwQmdEcHBON1gzQmRWVzE5N0VVZTdkcGNtY2RMTWl2UGE2eHh0UGozYVcgClRoZSBvcmlnaW5hbCBhdXRob3JzIG9mIHRoZSBwcm9wb3NhbCB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnN3ZXIgcXVlc3Rpb25zIG9uIHRoZSBDb3Ntb3MgZm9ydW0uCmh0dHBzOi8vZm9ydW0uY29zbW9zLm5ldHdvcmsvdC91cGRhdGVkLWdlbmVzaXMtYXRvbXMtcmVjb3ZlcnktcmVxdWVzdC1wcm9wb3NhbC8zOTA1GAMiPQoONjAyNTIxMjQ3NTkzMjESDjE5NzY0NjAzNzExMzk4Gg02NjE0NjA2NzQzMjA2Igw5OTg1ODI0MTA4OTAqDAiS9eH6BRCTnM74ATIMCJLfq/sFEJOczvgBOhIKBXVhdG9tEgk1MTIwMDAwMDBCDAiS9eH6BRCTnM74AUoMCJLfq/sFEJOczvgBCrsHCB4SsAYKLi9jb3Ntb3MucGFyYW1zLnYxYmV0YTEuUGFyYW1ldGVyQ2hhbmdlUHJvcG9zYWwS/QUKH0FkanVzdCBCbG9ja3MgUGVyIFllYXIgdG8gNC4zNk0StwVXaGlsZSB0aGUgY3VycmVudCBpbmZsYXRpb24gcmF0ZSBpcyBzZXQgYXQgNyUsIHRoZSBlZmZlY3RpdmUgaW5mbGF0aW9uIHJhdGUgaXMgbW9yZSBsaWtlIH42LjI5JS4gVGhpcyBpcyBiZWNhdXNlIGJsb2NrcyBoYXZlIHNsb3dlZCBkb3duIHNvbWV3aGF0IGZyb20gfjYuNXMgdG8gfjcuMjRzIHBlciBibG9jaywgYW5kIHRodXMgdGhlIGN1cnJlbnQgYmxvY2tzIHBlciB5ZWFyIHZhbHVlIG9mIDQ4NTUwMTUgaXMgdG9vIGhpZ2guIEhlcmUgd2UgcHJvcG9zZSB0byBhZGp1c3QgdGhlIGJsb2NrcyBwZXIgeWVhciB2YWx1ZSBmcm9tIDQ4NTUwMTUgdG8gNDM2MDAwMCB0byBicmluZyBpdCBpbiBsaW5lIHdpdGggY3VycmVudCBibG9jayB0aW1lcywgd2hpY2ggc2hvdWxkIHJlYWxpZ24gdGhlIGVmZmVjdGl2ZSBpbmZsYXRpb24gcmF0ZS4gTW9yZSBkZXRhaWxzIHdlcmUgZHJhZnRlZCBvbiBHaXRodWIgKGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ292ZXJuYW5jZS90cmVlL21hc3Rlci9wcm9wb3NhbHMvMjAyMC0xMC1ibG9ja3MtcGVyLXllYXIpIGFuZCBhcmUgYXZhaWxhYmxlIG9uIElQRlMgKGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtVGt6RHdXcVBibkFoNVlpVjVWd2NUTG5HZHdTTnNOVG4yYUR4ZFhCRmNhN0QvZXhhbXBsZSMvaXBmcy9RbVRaM1I0VzJvZEJzeDZocHQ3YXdmUlRmWkE2N3g1ZVFhb0w2Y3R4QnI2TnlOKRogCgRtaW50Eg1CbG9ja3NQZXJZZWFyGgkiNDM2MDAwMCIYAyI2Cg8xMDc3NjIxNTQzMDMxMDISCjMyODg4MDQwODgaCzMyNzQ5NTM1MzI4Igo1MDkzMDAzMjkyKgwI2YOD/QUQz5bRkwIyDAjZ7cz9BRDPltGTAjoSCgV1YXRvbRIJNTEyMDA2MDAwQgwItP6J/QUQ+v6NlgFKDAi06NP9BRD6/o2WAQrIDggfEsMNCiAvY29zbW9zLmdvdi52MWJldGExLlRleHRQcm9wb3NhbBKeDQoWR292ZXJuYW5jZSBTcGxpdCBWb3RlcxKDDUluIHRoZSBDb3Ntb3MgSHViIGdvdmVybmFuY2Ugc3lzdGVtLCBlYWNoIGFkZHJlc3MgY2FuIG9ubHkgY2FzdCBhIHZvdGUgZm9yIG9uZSBvcHRpb24gKFllcy9Oby9BYnN0YWluL05vV2l0aFZldG8pIHdoaWNoIHVzZXMgdGhlaXIgZnVsbCB2b3RpbmcgcG93ZXIgYmVoaW5kIHRoYXQgY2hvaWNlLgoKVGhpcyBwcm9wb3NhbCBwcm9wb3NlcyBhbiB1cGdyYWRlIHRvIHRoZSBDb3Ntb3MgSHViIGdvdmVybmFuY2UgbW9kdWxlIHRoYXQgd291bGQgYWxsb3cgYSBzdGFrZXIgdG8gb3B0aW9uYWxseSBzcGxpdCB0aGVpciB2b3RlcyBpbnRvIHNldmVyYWwgdm90aW5nIG9wdGlvbnMuIEZvciBleGFtcGxlLCBhIHNpbmdsZSBhZGRyZXNzIGNvdWxkIHVzZSA3MCUgb2YgaXRzIHZvdGluZyBwb3dlciB0byB2b3RlIFllcyBhbmQgMzAlIG9mIGl0cyB2b3RpbmcgcG93ZXIgdG8gdm90ZSBOby4gQ2xpZW50cyBtYXkgb3B0IGludG8gc3VwcG9ydGluZyB0aGlzIGZlYXR1cmUsIGFzIHRoZSBleGlzdGluZyBVWCBvZiB2b3RpbmcgZm9yIGEgc2luZ2xlIG9wdGlvbiBpcyBwcmVzZXJ2ZWQuCgpUaGlzIGlzIGJlbmVmaWNpYWwgYmVjYXVzZSBvZnRlbnRpbWVzIHRoZSBlbnRpdHkgb3duaW5nIHRoYXQgYWRkcmVzcyBtaWdodCBub3QgYmUgYSBzaW5nbGUgaW5kaXZpZHVhbC4gRm9yIGV4YW1wbGUsIGEgY29tcGFueSBvciBvcmdhbml6YXRpb24gdGhhdCBvd25zIGFuIGFkZHJlc3MgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgc3Rha2Vob2xkZXJzIHdobyB3YW50IHRvIHZvdGUgZGlmZmVyZW50bHksIGFuZCBzbyBpdCBtYWtlcyBzZW5zZSB0byBhbGxvdyB0aGVtIHRvIHNwbGl0IHRoZWlyIHZvdGluZyBwb3dlci4KCkFub3RoZXIgZXhhbXBsZSB1c2UgY2FzZSBpcyBleGNoYW5nZXMgYW5kIGN1c3RvZGlhbnMuIE1hbnkgY3VzdG9kaWFucyBhbmQgZXhjaGFuZ2VzIGN1c3RvZHkgbXVsdGlwbGUgY3VzdG9tZXJz4oCZIEFUT01zIGluIHRoZSBzYW1lIGFkZHJlc3MgYW5kIHVzZSB0aGlzIGFkZHJlc3MgdG8gc3Rha2Ugb24gYmVoYWxmIG9mIHRoZW0uIEhvd2V2ZXIsIGJlY2F1c2Ugb2YgdGhpcywgaXQgbWFrZXMgaXQgaW5mZWFzaWJsZSB0byBkbyAncGFzc3Rocm91Z2ggdm90aW5nJyBhbmQgZ2l2ZSB0aGVpciBjdXN0b21lcnMgdm90aW5nIHJpZ2h0cyBvdmVyIHRoZWlyIHRva2VucywgaWYgZGlmZmVyZW50IGN1c3RvbWVycyBoYXZlIGRpZmZlcmVudCB2b3RpbmcgcHJlZmVyZW5jZXMuIFdpdGggdGhpcyBuZXcgcHJvcG9zYWwsIGN1c3RvZGlhbnMgY2FuIHVzZSBzcGxpdCB2b3RlcyB0byBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHByZWZlcmVuY2VzIG9mIHRoZWlyIGN1c3RvbWVycyBpbiBvbi1jaGFpbiBnb3Zlcm5hbmNlLgoKVGhlIHRlY2huaWNhbCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgZmVhdHVyZSBjYW4gYmUgc2VlbiBpbiBBRFIgMDM3IHRvIHRoZSBDb3Ntb3MgU0RLOiBodHRwczovL2dpdGh1Yi5jb20vY29zbW9zL2Nvc21vcy1zZGsvYmxvYi9tYXN0ZXIvZG9jcy9hcmNoaXRlY3R1cmUvYWRyLTAzNy1nb3Ytc3BsaXQtdm90ZS5tZCAKCkFjY2VwdGFuY2Ugb2YgdGhpcyBnb3Zlcm5hbmNlIHByb3Bvc2FsIGlzIHNpZ25hbGxpbmcgYXBwcm92YWwgdG8gYWRvcHQgdGhpcyBmZWF0dXJlIGluIGEgZnV0dXJlIHVwZ3JhZGUgb2YgdGhlIENvc21vcyBIdWIuGAMiMAoONzgyNDMxODg0NjIwOTISDTI2NjUxMTg5NDk0MzEaCzYwMTg0MzY1Nzg4IgI5OSoMCJKQ7P0FEKCXt/IBMgwIkvq1/gUQoJe38gE6EgoFdWF0b20SCTUxMjAwMDAwMEIMCP2U7P0FEMSxv8IBSgwI/f61/gUQxLG/wgEKjwkIIBKKCAo3L2Nvc21vcy5kaXN0cmlidXRpb24udjFiZXRhMS5Db21tdW5pdHlQb29sU3BlbmRQcm9wb3NhbBLOBwoxRnVuZGluZyBmb3IgRGV2ZWxvcG1lbnQgb2YgR292ZXJuYW5jZSBTcGxpdCBWb3RlcxLUBlNpa2thIGlzIHJlcXVlc3RpbmcgMTc3NiBBVE9NcyBmcm9tIHRoZSBjb21tdW5pdHkgcG9vbCB0byBhcmNoaXRlY3QgYW5kIGltcGxlbWVudCB0aGUgR292ZXJuYW5jZSBTcGxpdCBWb3RlcyBmZWF0dXJlIHByb3Bvc2VkIGluIENvc21vcyBIdWIgUHJvcG9zYWwgIzMxLiBUaGlzIGNvbW11bml0eSBmdW5kIHByb3Bvc2FsIGlzIGRlcGVuZGVudCBvbiB0aGUgcGFzc2luZyBvZiBQcm9wb3NhbCAjMzEgYW5kIHRodXMgc2hvdWxkIG9ubHkgYmUgYXBwcm92ZWQgaWYgUHJvcG9zYWwgIzMxIGlzIGFwcHJvdmVkLiBXZSByZXF1ZXN0IDE3NzYgQVRPTXMsIHZhbHVpbmcgZWFjaCBhdG9tIGF0ICQ1LjEgCgpTaWtrYSBoYXMgYWxyZWFkeSBiZWd1biB0aGUgZGVzaWduIG9mIHRoaXMgZmVhdHVyZSBhbmQgc3VibWl0dGVkIGl0IGFzIEFEUiAwMzcgdG8gdGhlIENvc21vcyBIdWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvY29zbW9zLXNkay9ibG9iL21hc3Rlci9kb2NzL2FyY2hpdGVjdHVyZS9hZHItMDM3LWdvdi1zcGxpdC12b3RlLm1kIAoKIEFzIHBhc3QgY29udHJpYnV0b3JzIHRvIHRoZSBjb2RlYmFzZSB0aGF0IHJ1bnMgdGhlIENvc21vcyBIdWIsIHdlIGFyZSBmYW1pbGlhciB3aXRoIHRoZSBzZWN1cml0eSBhbmQgY29kZSBxdWFsaXR5IHJlcXVpcmVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQ29zbW9zIEh1Yi4gIFNpa2thIHdpbGwgaW1wbGVtZW50ICYgdGVzdCB0aGlzIGZlYXR1cmUgYW5kIHdpbGwgd29yayB3aXRoIHRoZSBtYWludGFpbmVycyBvZiB0aGUgZ2l0aHViLmNvbS9jb3Ntb3MvY29zbW9zLXNkayByZXBvIHRvIGdldCBpdCBtZXJnZWQgaW50byB0aGUgeC9nb3YgbW9kdWxlLhotY29zbW9zMWV5NjlyMzdnZnh2eGc2MnNoNHIwa3RwdWM0NnB6anJtejI5ZzQ1IhMKBXVhdG9tEgoxNzc2MDAwMDAwGAMiMAoONzY5NTE1NjA3NzczMzESDjE0MTg4NTE1NzMwMDc1Ggs2MzU2ODM3NzU3NCIBMCoMCNyC9f0FEOGkyZYCMgwI3Oy+/gUQ4aTJlgI6EgoFdWF0b20SCTUxNDAwMDAwMEIMCI+z9f0FEK2bnIICSgwIj52//gUQrZucggIKkw0IIhKEDAo3L2Nvc21vcy5kaXN0cmlidXRpb24udjFiZXRhMS5Db21tdW5pdHlQb29sU3BlbmRQcm9wb3NhbBLICwocTHVuYSBNaXNzaW9uIC0gRnVuZGluZyAkQVRPTRLhClRoZSBDb3Ntb3MgSHViIChBVE9NKSBjb21tdW5pdHkgaXMgcmVxdWVzdGluZyBhIGNvbW11bml0eSBwb29sIHNwZW5kIGFtb3VudCBvZiAxMjksMjA4IEFUT00gaW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgY29tcHJlaGVuc2l2ZSBBVE9NIG1hcmtldGluZyBwbGFuIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiBjb2xsYWJvcmF0aW9uIHdpdGggQWlCIChUZW5kZXJtaW50KS4gVGhlIG1hcmtldGluZyBlZmZvcnRzIHdpbGwgYmUgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IHVwb24gcGFzc2luZyBvZiBwcm9wb3NhbCAjMzQuCgogVGhlIGRpc3RyaWJ1dGlvbiBvZiBmdW5kcyB3aWxsIGJlIGFkbWluaXN0ZXJlZCBieSA1IGNvbW11bml0eSBtZW1iZXJzLCB0aGF0IGhhdmUgYmVlbiBjYXJlZnVsbHkgc2VsZWN0ZWQgYnkgdGhlIGNvbW11bml0eSB2aWEgdGhlIENvc21vcyBnb3Zlcm5hbmNlIHdvcmtpbmcgZ3JvdXAgdG8gYWRtaW5pc3RlciB0aGUgbWFya2V0aW5nIHBsYW4gYW5kIHJlbGVhc2UgZnVuZHMgdG8gZWl0aGVyIEFpQiB0aGF0IHdpbGwgYWN0IGFzIGEgbGlhaXNvbiBiZXR3ZWVuIENvc21vcyBIdWIgY29tbXVuaXR5IGFuZCB0aGlyZCBwYXJ0aWVzIG9yIGRpcmVjdGx5IHRvIHBhcnRpZXMgdGhhdCB3aWxsIGJlIGluIGNoYXJnZSBvZiBleGVjdXRpbmcgdGhlIG1hcmtldGluZyBwbGFuIGJhc2VkIG9uIGEgbWFqb3JpdHkgbXVsdGlzaWduYXR1cmUgYXBwcm92YWwuIEF0IGxlYXN0IDMgbWVtYmVycyB3aWxsIGhhdmUgdG8gYXBwcm92ZSBlYWNoIG1pbGVzdG9uZS1zcGVuZCBmb3IgaXQgdG8gYmUgcmVsZWFzZWQgdG8gQWlCIGJhc2VkIG9uIHRoZSBleHBlY3RlZCBwcm9wb3NhbCBzY29wZSAmY29tcGxldGlvbi4gCgogTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbG9uZyBmb3JtIHByb3Bvc2FsIGhlcmU6IGh0dHBzOi8vY2xvdWRmbGFyZS1pcGZzLmNvbS9pcGZzL1FtV0F4dHhmN2ZVcHJQVld4MWpXeXhTS2pCTnFrY2JBM0ZHNmhScHM3UVR1M2sgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ292ZXJuYW5jZS9wdWxsLzEwIGFuZCBodHRwczovL2ZvcnVtLmNvc21vcy5uZXR3b3JrL3QvZHJhZnQtZ292ZXJuYW5jZS1wcm9wb3NhbC1mb3ItYS1jb21tdW5pdHktcG9vbC1zcGVuZC1wcm9wb3NhbC0zMy1sdW5hLW1pc3Npb24tZnVuZGluZy1hdG9tLzQyNDQvMTUgCgogVGhlIG11bHRpc2lnIGFkbWluaXN0cmF0aW9uIGluY2x1ZGVzOiAKIEBqb2hubmllY29zbW9zLCBASm9lRGlydGF5LCBAamFja3phbXBvbGluIChKYWNrIFphbXBvbGluLCBQeWxvbiBWYWxpZGF0b3IpLCBAaW1tYXNzc2kgKFNHLTEgVmFsaWRhdG9yKSwgQHpha2ltYW5pYW4gKFpha2kgTWFuaWFuLCBJcWx1c2lvbiBWYWxpZGF0b3IpLhotY29zbW9zMTZwbHlscHNneGVjaGFqbHR4OXllc2VxZXh6ZHp1dDlnOHZsYTRrIhUKBXVhdG9tEgwxMjkyMDgwMDAwMDAYAyI6Cg44NDg3MjIxNzI1NDcwMRIOMjE2MjkxOTk4NDE4NzAaDTgxNjQzNTg5MDczNDgiCTYyNDg5NDg2OSoMCKbj0/8FEKfUwOMBMgwIps2dgAYQp9TA4wE6EgoFdWF0b20SCTUxMjAwMDAwMEIMCNzd1/8FEMuqwKwBSgwI3MehgAYQy6rArAEKvwUIIxKtBAogL2Nvc21vcy5nb3YudjFiZXRhMS5UZXh0UHJvcG9zYWwSiAQKOENvc21vcyBTdGFyZ2F0ZSBIdWIgVXBncmFkZSBQcm9wb3NhbCAyOiBUaW1lIHRvIFVwZ3JhZGUuEssDUHJvcG9zYWwgdG8gY29tcGxldGUgdGhlIFN0YXJnYXRlIHVwZ3JhZGUsIGhhbHQgYGNvc21vc2h1Yi0zYCBhdCAwNjowMCBVVEMgb24gSmFuIDI4dGgsIGV4cG9ydCB0aGUgc3RhdGUgYW5kIHN0YXJ0IGBjb3Ntb3NodWItNGAgYmFzZWQgb24gZ2FpYSAzLjAuCgogR2FpYSBDb21taXQgaGFzaDogCiBkOTc0YjI3YThjYWY4Y2FkM2IwNmZiZTQ2Nzg4NzFlNGIwYjY5YTUxICBQcm9wb3NhbCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBvbiAKIGdpdGh1YjogaHR0cHM6Ly9naXRodWIuY29tL2Nvc21vcy9nb3Zlcm5hbmNlL3B1bGwvNSAKIGlwZnM6IGh0dHBzOi8vY2xvdWRmbGFyZS1pcGZzLmNvbS9pcGZzL1FtUHd3MlBTbWttdUxMdTEyR0d3UmR1NXVyMUV0Zjl1M050M1o2TnFCN0JRUDEgCiBzaWE6IGh0dHBzOi8vc2lhc2t5Lm5ldC9FQUFMR016RkNhZnZiS2tRam5BaWVvMmNBMW1weGstSkxwS3NpQzRYeHVNNmVRGAMiPQoOODMwMzE4NDE5NzE5NDQSCzM0MDYxMTcwMTc5Gg4yMjQyMzc0NjU1NjE4MyIOMTI2NTMwMDQyMDI5MzkqDAjD+vP/BRDlj4jhATIMCMPkvYAGEOWPiOEBOhIKBXVhdG9tEgk1NTYwMDIwMDBCDAirqfT/BRCV+f7CAkoMCKuTvoAGEJX5/sICCoURCCQS+A8KIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEtMPCjdEZWxheSBvZiBIdWIgU3RhcmdhdGUgVXBncmFkZSBmb3IgYXBwcm94aW1hdGVseSAyIHdlZWtzEpcPVGhlIFN0YXJnYXRlIHRlYW0gaXMgcmVjb21tZW5kaW5nIHRoYXQgdGhlIENvc21vcyBIdWIgcmVzY2hlZHVsZSB0aGUgbmV4dCB1cGdyYWRlIHRvIGEgbmV3IGNvbW1pdCBoYXNoLiBUaGUgbmV3IGNvbW1pdCBoYXNoIGlzIGV4cGVjdGVkIHRvIGJlIGF2YWlsYWJsZSBvbiBUdWVzZGF5IEphbiAyNnRoIHdpdGggYSBuZXcgdXBncmFkZSBwcm9wb3NhbCBpbW1lZGlhdGVseSBhZnRlci4KClRoaXMgZ292ZXJuYW5jZSBwcm9wb3NhbCB3aWxsIHNpZ25hbCB0aGF0IFtwcm9wb3NhbCAzNV0oaHR0cHM6Ly93d3cubWludHNjYW4uaW8vY29zbW9zL3Byb3Bvc2Fscy8zNSkgd2lsbCBub3QgYmUgZXhlY3V0ZWQuIFRoZSBIdWIgZ292ZXJuYW5jZSB3aWxsIHZvdGUgb24gdGhlIGZvcnRoY29taW5nIHByb3Bvc2FsIGFpbWluZyBmb3IgYSBmaW5hbCB1cGdyYWRlLiBUaGUgZWFybGllc3QgdGFyZ2V0IGRhdGUgd291bGQgYmUgRmVicnVhcnkgMTF0aC4gR2l2ZW4gdGhhdCBMdW5hciBOZXcgWWVhciBpcyBvbiBGZWIgMTJ0aC4gVGhlIG5leHQgYmVzdCBkYXRlIGlzIEZlYiAxOHRoIDA2OjAwVVRDLgoKV2UgYXJlIHJlY29tbWVuZGluZyB0aGUgZGVsYXkgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29ucy4KCiogQnVncyBoYXZlIGJlZW4gaWRlbnRpZmllZCBpbiB0aGUgUHJvcG9zYWwgMjkgaW1wbGVtZW50YXRpb24uICBUaGV5IGFyZSByZXNvbHZlZCBpbiB0aGlzIHB1bGwgcmVxdWVzdFtBZGRpdGlvbmFsIHJldmlldyBvZiBwcm9wIDI5IGFuZCBtaWdyYXRpb24gdGVzdGluZyBieSB6bWFuaWFuIMK3IFB1bGwgUmVxdWVzdCAjNTU5IMK3IGNvc21vcy9nYWlhIMK3IEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2Nvc21vcy9nYWlhL3B1bGwvNTU5KQoqIEEgYmFsYW5jZSB2YWxpZGF0aW9uIHJlZ3Jlc3Npb24gd2FzIGlkZW50aWZpZWQgZHVyaW5nIFByb3AgMjkgY29kZSByZXZpZXcuIFt4L2Jhbms6IGJhbGFuY2UgYW5kIG1ldGFkYXRhIHZhbGlkYXRpb24gYnkgZmVkZWt1bnplIMK3IFB1bGwgUmVxdWVzdCAjODQxNyDCtyBjb3Ntb3MvY29zbW9zLXNkayDCtyBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvY29zbW9zLXNkay9wdWxsLzg0MTcpCiogVGhlIElCQyBHbyBUbyBNYXJrZXQgV29ya2luZyBHcm91cCBoYXMgW2lkZW50aWZpZWQgTGVkZ2VyIGhhcmR3YXJlIHdhbGxldF0oaHR0cHM6Ly9naXRodWIuY29tL2Nvc21vcy9jb3Ntb3Mtc2RrL2lzc3Vlcy84MjY2KSBzdXBwb3J0IGFzIGEgbmVjZXNzYXJ5IGZlYXR1cmUgZm9yIHRoZSBpbml0aWFsIGxhdW5jaCBvZiBJQkMgb24gdGhlIEh1Yi4gV2UgaGF2ZSBhbiBvcHBvcnR1bml0eSB0byBwcm92aWRlIHRoaXMgc3VwcG9ydCBpbiB0aGlzIHVwZ3JhZGUuIFRoZSBTREsgYmVsaWV2ZXMgdGhpcyBjYW4gYmUgcXVpY2tseSByZW1lZGlhdGVkIGluIHRoZSB0aW1lIGF2YWlsYWJsZSB3aXRoIG1lcmdlZCBQUnMgb24gTW9uZGF5LgoqIFRoZSBudW1iZXIgb2YgU3RhcmdhdGUgcmVsYXRlZCBzdXBwb3J0IHJlcXVlc3RzIGZyb20gaW50ZWdyYXRvcnMgaGFzIGluY3JlYXNlZCBzaWduaWZpY2FudGx5IHNpbmNlIHRoZSBnb3Zlcm5hbmNlIHByb3Bvc2FsIHdlbnQgbGl2ZSBidXQgc29tZSB0ZWFtcyBoYXZlIGFscmVhZHkgYW5ub3VuY2VkIGEgcGVyaW9kIG9mIHJlZHVjZWQgJEFUT00gc3VwcG9ydCB3aGlsZSB0aGV5IHVwZ3JhZGUgbGlrZSA8aHR0cHM6Ly90d2l0dGVyLmNvbS9MZWRnZXJfU3VwcG9ydC9zdGF0dXMvMTM1MjI0NzQwMzYwNTM1NjU1MT9zPTIwPi4gVGhlIGFkZGl0aW9uYWwgdGltZSBzaG91bGQgbWluaW1pemUgdGhlIGRpc3J1cHRpb24gZm9yICRBVE9NIGhvbGRlcnMuIFRoYW5rIHNvIG11Y2ggdG8gdGhlICRJUklTIHRlYW0gd2hvbSBpcyBmaWVsZGluZyBhIHNpbWlsYXIgcmVxdWVzdCB2b2x1bWUgYW1vbmcgb3VyIG5vbi1FbmdsaXNoIGNvbW11bml0eS4YAyI6Cg8xMTI5NzUzNTUwMDMzNDMSDTEyNjY5NDk2MDA2NjEaCzE5MzE3ODE3MzUzIgsyMDMyMzIwNDE2NyoLCJivtoAGEJi0xRgyCwiYmYCBBhCYtMUYOhIKBXVhdG9tEgk1MTIwMDAwMDBCDAjf2baABhD15s7YAkoMCN/DgIEGEPXmztgCCrkGCCUSsAUKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEosFCilTdGFyZ2F0ZSBVcGdyYWRlLSBTZWNvbmQgdGltZSBpcyBhIGNoYXJtIRLdBFByb3Bvc2FsIHRvIGNvbXBsZXRlIHRoZSBTdGFyZ2F0ZSB1cGdyYWRlLCBoYWx0IGBjb3Ntb3NodWItM2AgYXQgMDY6MDAgVVRDIG9uIEZlYiAxOHRoLCBleHBvcnQgdGhlIHN0YXRlIGFuZCBzdGFydCBgY29zbW9zaHViLTRgIGJhc2VkIG9uIGdhaWEgNC4wLgoKIEdhaWEgQ29tbWl0IGhhc2g6IAogYTI3OWQwOTFjNmY2NmY4YTkxYzg3OTQzMTM5ZWJhZWNkZDg0ZjY4OSAgUHJvcG9zYWwgZGV0YWlscyBjYW4gYmUgZm91bmQgb24gCiBnaXRodWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ292ZXJuYW5jZS9wdWxsLzEzIAogUmVuZGVyZWQ6IGh0dHBzOi8vaXBmcy5pby9pcGZzL1FtVGt6RHdXcVBibkFoNVlpVjVWd2NUTG5HZHdTTnNOVG4yYUR4ZFhCRmNhN0QvZXhhbXBsZSMvaXBmcy9RbVluMlN4Q01ZazVTV3M1R01jWGRiWFI4d01DQ1hSbUN5VzE5U0Z5elNlWnAxIAogaXBmczogaHR0cHM6Ly9jbG91ZGZsYXJlLWlwZnMuY29tL2lwZnMvUW1ZbjJTeENNWWs1U1dzNUdNY1hkYlhSOHdNQ0NYUm1DeVcxOVNGeXpTZVpwMSAKIHNpYTogaHR0cHM6Ly9zaWFza3kubmV0L0VBQ0FzUGNVanBURXBRbEc5X25SSTFPUjA3Z05lUml1ZGZFV0F2S25mMHRqX1EgCiAgGAMiNgoOODg1MzA1ODg1NzAzNzASDDcxMjMwMzI3MTA1ORoKNzE0MjcyNDEwNiIKMjIzMDIyNDA5OSoLCJLPzIAGEKHophUyCwiSuZaBBhCh6KYVOhIKBXVhdG9tEgk1NjcwMDAwMDBCDAi6vc6ABhDN6bipAkoMCLqnmIEGEM3puKkCCoQICCYS+QYKLy9jb3Ntb3MudXBncmFkZS52MWJldGExLlNvZnR3YXJlVXBncmFkZVByb3Bvc2FsEsUGCkFTaWduYWwgUHJvcG9zYWwgdG8gQWRvcHQgdGhlIExpcXVpZGl0eSBNb2R1bGUgb250byB0aGUgQ29zbW9zIEh1YhKxBVN1bW1hcnk6IFRlbmRlcm1pbnQgKGh0dHBzOi8vdGVuZGVybWludC5jb20pIGFuZCBCLUhhcnZlc3QgKGh0dHBzOi8vYmhhcnZlc3QuaW8pIGhhdmUgam9pbmVkIGZvcmNlcyB0byBwcm9kdWNlIGFuZCBkZXZlbG9wIGEgTGlxdWlkaXR5IE1vZHVsZSAoaHR0cHM6Ly9naXRodWIuY29tL3RlbmRlcm1pbnQvbGlxdWlkaXR5KS4gVGhpcyBzaWduYWwgcHJvcG9zYWwgaXMgYSBSZXF1ZXN0IEZvciBDb21tZW50IHRvIHRoZSBBVE9NIGNvbW11bml0eSByZWdhcmRpbmcgdGhlIGFkZGl0aW9uIG9mIHRoaXMgTGlxdWlkaXR5IE1vZHVsZSBpbnRvIHRoZSBDb3Ntb3MgSHViIHNvdXJjZSBjb2RlLgpCeSB2b3RpbmcgWUVTIHRvIHRoaXMgcHJvcG9zYWwsIHlvdSB3aWxsIHNpZ25hbCB0aGF0IHlvdSBhcHByb3ZlIG9mIGhhdmluZyBhIERFWCBiYXNlZCBvbiB0aGlzIHNwZWNpZmljIExpcXVpZGl0eSBNb2R1bGUgZGVwbG95ZWQgb24gdGhlIENvc21vcyBIdWIuCkRldGFpbCBvZiB0aGUgcHJvcG9zYWwgY2FuIGJlIGZvdW5kIGF0IElQRlMgbGluayBiZWxvdy4KCkN1cnJlbnQgRGV2ZWxvcG1lbnQgOiBodHRwczovL2dpdGh1Yi5jb20vdGVuZGVybWludC9saXF1aWRpdHkvdHJlZS9kZXZlbG9wCklQRlMgOiBodHRwczovL2lwZnMuaW8vaXBmcy9RbVpwZ2tZTG9DQm5YTTFTN1RFZFF1bk1tdXI5YkF3NVZUTmdGUUN5cnFnS0RkGkwKQVNpZ25hbCBQcm9wb3NhbCB0byBBZG9wdCB0aGUgTGlxdWlkaXR5IE1vZHVsZSBvbnRvIHRoZSBDb3Ntb3MgSHViEgcIgODL/68HGAMiNgoONzIzNTQxMzIxNDY4MjcSDjIwMTM3NjY5MDM2MDUwGgsxOTY3MTc1NzA2MCIHNDkwMDAwMCoMCPyw8oEGEMbdjIEBMgwI/Jq8ggYQxt2MgQE6EgoFdWF0b20SCTc2ODAyMDAwMEIMCNq4/IEGEJWxieIBSgwI2qLGggYQlbGJ4gEKsgoIKRK2CQouL2Nvc21vcy5wYXJhbXMudjFiZXRhMS5QYXJhbWV0ZXJDaGFuZ2VQcm9wb3NhbBKDCQoURW5hYmxlIElCQyB0cmFuc2ZlcnMSqQhUaGUgUHJvcG9zYWwgZW5hYmxlcyB0cmFuc2ZlcnJpbmcgYW5kIHJlY2VpdmluZyBhc3NldHMgdXNpbmcgdGhlIElDUzIwIHN0YW5kYXJkIG9uIHRoZSBDb3Ntb3MgSHViLiBJZiB0aGlzIHByb3Bvc2FsIHBhc3NlcywgdGhlcmUgd2lsbCBiZSBJQkMgYXNzZXRzIGF2YWlsYWJsZSBpbiB0aGUgQmFuayBtb2R1bGUgb2YgdGhlIEh1YiBhbmQgQVRPTSB3aWxsIGJlIGF2YWlsYWJsZSBvbiBab25lcyBjb25uZWN0ZWQgb3ZlciBJQkMuCiBJcWx1c2lvbiBiZWxpZXZlcyB0aGF0IHRoZSBJQkMgc29mdHdhcmUgaXMgc3VmZmljaWVudGx5IHN0YWJsZSBmb3Igc21hbGwgYW1vdW50cyBvZiB2YWx1ZSB0cmFuc2Zlci4gV2UgZXhwZWN0IHRoZXJlIHRvIGJlIGlzc3VlcyB3aXRoIHN0dWNrIGZ1bmRzIGFuZCBVWCBjb25mdXNpb24gYnV0IG92ZXJjb21pbmcgdGhlc2UgaXNzdWVzIHdpbGwgb25seSBoYXBwZW4gb25jZSBJQkMgaXMgbGl2ZS4KIFNlY3VyaXR5IE1vZGVsCiBUZW5kZXJtaW50IGZ1bGwgbm9kZXMgcHJvZHVjZSBhZ3JlZW1lbnQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBhdCBtb3N0IOKFkyBvZiB0aGUgdm90aW5nIHBvd2VyIGhlbGQgYnkgdmFsaWRhdG9ycyBpcyBCeXphbnRpbmUuCiBJQkMKSUJDIGlzIGEgcHJvdG9jb2wgZm9yIGF1dGhlbnRpY2F0ZWQgbWVzc2FnZSBwYXNzaW5nIGJldHdlZW4gaGV0ZXJvZ2VuZW91cyBzb3ZlcmVpZ24gYmxvY2tjaGFpbnMuIElCQyByZXF1aXJlcyB0cnVzdGluZyB0aGF0IGNoYWlucyBvbiBib3RoIHNpZGVzIG9mIHRoZSBjb25uZWN0aW9ucyBvcGVyYXRlIHdpdGhpbiB0aGVpciBzZWN1cml0eSBtb2RlbC4KIEluY2VudGl2ZSBTZWN1cml0eSBFeHRlbnNpb25zCiBJQkMgaGFzIGEgZmFjaWxpdHkgdG8gc3VwcG9ydCBmcmVlemluZyBjb25uZWN0aW9ucyBvbmNlIGEgdmlvbGF0aW9uIG9mIHRoZSBzZWN1cml0eSBtb2RlbCBoYXMgb2NjdXJyZWQuIFRoZSBzZXQgb2YgY3JpdGVyaWEgZm9yIGRldGVjdGluZyBzdWNoIGF0dGFja3MgY29udGludWVzIHRvIGV2b2x2ZSBhbmQgaXMgYSBjb25zdGFudCBmb2N1cyBvZiByZXNlYXJjaC4aHQoIdHJhbnNmZXISC1NlbmRFbmFibGVkGgR0cnVlGiAKCHRyYW5zZmVyEg5SZWNlaXZlRW5hYmxlZBoEdHJ1ZRgDIikKDzExMTgyMDI5Mjg2NjI0MBIJMTc1ODIwMzI3Ggg3NTA5Nzk2MiIBMCoMCIzTr4IGEO61k+oCMgwIjL35ggYQ7rWT6gI6EgoFdWF0b20SCTU1NDAxMDAwMEILCK69vIIGENP/hnpKCwiup4aDBhDT/4Z6Ct8JCCoS0wgKNy9jb3Ntb3MuZGlzdHJpYnV0aW9uLnYxYmV0YTEuQ29tbXVuaXR5UG9vbFNwZW5kUHJvcG9zYWwSlwgKJFpLVmFsaWRhdG9yIENvbW11bml0eSBTcGVuZCBQcm9wb3NhbBKqB1pLVmFsaWRhdG9yIENvbW11bml0eSBTcGVuZCBQcm9wb3NhbCBRMiAyMDIxCgpDb21tdW5pdHkgU3BlbmQgcHJvcG9zYWwgZm9yIGEgc2VyaWVzIG9mIHByaXZhY3kgZm9jdXNzZWQgZXZlbnRzLiBTdWJtaXR0ZWQgYnkgWktWYWxpZGF0b3IgKGh0dHA6Ly96a3ZhbGlkYXRvci5jb20vKQoKLT0tPS0KClRoZSBwcm9wb3NhbCBpcyB0byBzcGVuZCA1ayBBdG9tcyBmcm9tIHRoZSBjb21tdW5pdHkgcG9vbCBhbmQgdG8gZGVsaXZlciBmb3VyIHF1YXJ0ZXJseSBwcml2YWN5IGZvY3Vzc2VkIGV2ZW50cy4gVGhyZWUgb2YgdGhlbSBvbmxpbmUgYW5kIHRoZSBmb3VydGggd2lsbCBiZSBpbi1wZXJzb24uIFdlIHdpbGwgYWxzbyBkZWxpdmVyIGJsb2cgcG9zdHMgYW5kIHlvdXR1YmUgdmlkZW9zIHRvIHdyYXAgdGhlIGV2ZW50cyB1cC4gVGhlIGNvbnRlbnQgb2YgdGhlIGV2ZW50IHdpbGwgYmUgcHJlc2VudGF0aW9ucywgc2hvd2Nhc2VzLCBwYW5lbHMgYW5kIFEmQSBzZXNzaW9ucyBhcm91bmQgcHJpdmFjeSBvbiBDb3Ntb3MuIFNlZSBvdXIgbW9zdCByZWNlbnQgZXZlbnRzIHJlY29yZGluZ3MgaGVyZTogKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9UExqODB6MGNKbThRR05QYlBKMmFkUWhONVc4OTBPN1lNcikKCkZ1bGwgcHJvcG9zYWwgb24gaXBmczogKGh0dHBzOi8vZ2F0ZXdheS5waW5hdGEuY2xvdWQvaXBmcy9RbVlGWXlTc1VQZHRFQ3VVbVBDWDdEa3QzY0tCczQyM3F3bW9mcFlkNU5YY0p1KQoKRnVsbCBwcm9wb3NhbCBvbiBmb3J1bS5jb3Ntb3MubmV0d29yazogKGh0dHBzOi8vZm9ydW0uY29zbW9zLm5ldHdvcmsvdC96a3ZhbGlkYXRvci1jb21tdW5pdHktc3BlbmQtcHJvcG9zYWwtcHJpdmFjeS1ldmVudHMvNDUzMSkKCi09LT0tCgpBbW91bnQgdG8gc3BlbmQgZnJvbSB0aGUgY29tbXVuaXR5IHBvb2w6IDUwMDAgQVRPTXMuGi1jb3Ntb3MxeGN2cnE1ZnhhbGxkNnZ2ZjR0NWwzOGpsdmRsajN3aDRqazZjM3kiEwoFdWF0b20SCjUwMDAwMDAwMDAYAyI7Cg43MjY2NTA1MDU0NjU1NhIMNDEyMjY1MDY5NTA2Gg4yMTIxOTc2NjMxNTgyMCILNDgwNDUxMDQxNTQqCwiUx6uDBhDS0+AcMgsIlLH1gwYQ0tPgHDoSCgV1YXRvbRIJNTEyMDAwMDAwQgsIh9i8gwYQg7bLW0oLCIfChoQGEIO2y1sK3gcILBLYBgo3L2Nvc21vcy5kaXN0cmlidXRpb24udjFiZXRhMS5Db21tdW5pdHlQb29sU3BlbmRQcm9wb3NhbBKcBgpFQWR2YW5jaW5nIEV0aGVybWludDogR1RNIGFuZCBFbmdpbmVlcmluZyBQbGFuIGZvciB0aGUgRXRoZXJtaW50IENoYWluEowFVGhhcnNpcyBpcyByZXF1ZXN0aW5nIDEwMCwwMDAgQVRPTXMgZnJvbSB0aGUgQ29zbW9zIEh1YiBjb21tdW5pdHkgcG9vbCB0byBmdW5kLCBkZXZlbG9wIGFuZCBhZHZhbmNlIHRoZSBFdGhlcm1pbnQgcHJvamVjdCBhbmQgbGF1bmNoIGFuIEV0aGVybWludCBDaGFpbi4gbgogTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbG9uZyBmb3JtIHByb3Bvc2FsIGhlcmU6IGh0dHBzOi8vZ2F0ZXdheS5waW5hdGEuY2xvdWQvaXBmcy9RbVd3SjYzVjRUdVprRGZXb0g2NnZ4ZDZOSzgyZzZyZ1BWbnlwRVNYQkZSYndzIGFuZCBodHRwczovL2dpdGh1Yi5jb20vY29zbW9zL2dvdmVybmFuY2UvcHVsbC8xOCBhbmQgaHR0cHM6Ly9mb3J1bS5jb3Ntb3MubmV0d29yay90L2FkdmFuY2luZy1ldGhlcm1pbnQtZ292ZXJuYW5jZS1wcm9wb3NhbC1ndG0tYW5kLWVuZ2luZWVyaW5nLXBsYW4tZm9yLXRoZS1ldGhlcm1pbnQtY2hhaW4vNDU1NC4gCgogVGhlIG11bHRpc2lnIGFkbWluaXN0cmF0aW9uIGluY2x1ZGVzOgoJIC0gQGZlZGVrdW56ZSAoRmVkZXJpY28gS3VuemUgS8O8bGxtZXIsIFRoYXJzaXMpCgkgLSBAem1hbmlhbiAoWmFraSBNYW5pYW4sIElxbHVzaW9uKQoJIC0gQG1hcmJhcjM3NzggKE1hcmtvIEJhcmljZXZpYywgSW50ZXJjaGFpbiBHbWJIKRotY29zbW9zMTI0ZXp5NTNzdmVsbHhxczA3NWc2OW40ZjVjMHl6Y3k1c2x3N3h6IhUKBXVhdG9tEgwxMDAwMDAwMDAwMDAYAyIxCg8xMDUwNTczMjQ2MzgyNDISDTExMTMxNzI0Mjg5ODcaDDY5NjEyMTQzMjA0NSIBMCoMCMKzsIMGENDHle0CMgwIwp36gwYQ0MeV7QI6EgoFdWF0b20SCTUxMjAwMDAwMEIMCIaas4MGEJnHxOgBSgwIhoT9gwYQmcfE6AEK1QYILRLPBQo3L2Nvc21vcy5kaXN0cmlidXRpb24udjFiZXRhMS5Db21tdW5pdHlQb29sU3BlbmRQcm9wb3NhbBKTBQpSQ29tbXVuaXR5IEZ1bmQgR292ZXJuYW5jZSBQcm9wb3NhbCBGb3IgR3Jhdml0eSBERVggSW5jZW50aXZpemVkIFRlc3RuZXQgUHJpemUgUG9vbBL4A1RoaXMgZ292ZXJuYW5jZSBwcm9wb3NhbCBpcyB0byBhc2sgQXRvbSBkZWxlZ2F0b3JzIHRvIGFsbG93IHRoZSBzcGVuZGluZyBvZiA1LDAwMCBBdG9tcyBmb3IgdGhlIEdyYXZpdHkgREVYIEluY2VudGl2aXplZCBUZXN0bmV0IChUcmFkaW5nIENvbXBldGl0aW9uKSBmcm9tIHRoZSBDb3Ntb3MgSHViIENvbW11bml0eSBGdW5kLiBCeSB2b3RpbmcgWWVzLCB0aGUgdm90ZXIgYWdyZWVzIHRvIHNlbmQgNSwwMDAgQXRvbXMgZnJvbSB0aGUgY29tbXVuaXR5IGZ1bmQgdG8gdGhlIG11bHRpc2lnIGFkZHJlc3Mgd2hpY2ggaXMgY29udHJvbGxlZCBieSA0IG11bHRpc2lnIGNvbW1pdHRlZSBtZW1iZXJzLCB3aG8gd2lsbCBkaXN0cmlidXRlIHRoZSBBdG9tcyB0byB0aGUgY29tcGV0aXRpb24gd2lubmVycy4gRGV0YWlsIG9mIHRoZSBwcm9wb3NhbCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1URnhOQTZwdW5Wb3g3Slh2Z3A3ZVVGa0M5R3hSdTI2dW5DVXdSd3l2c2lIehotY29zbW9zMWh3cTU4NWozMnBhN2Q2cGY2Z3lwbm5qYzZ5ZjRqcHR2OGU4Zzg3IhMKBXVhdG9tEgo1MDAwMDAwMDAwGAMiMQoONzMyMDcxNTMwNTEwMzISCTk2ODQ0MTQyNxoKNDQ4MTY4NjY4MyIIMzI1ODk1NDMqDAjDobeDBhDmqIa/ATIMCMOLgYQGEOaohr8BOhIKBXVhdG9tEgk1MTIwMDAwMDBCDAj55LqDBhCF/N/WA0oMCPnOhIQGEIX839YDCoYFCC4S9gMKIC9jb3Ntb3MuZ292LnYxYmV0YTEuVGV4dFByb3Bvc2FsEtEDCh1Qcm9wIDM0IENvbnRpbnVhdGlvbiBQcm9wb3NhbBKvA1RoZSBDb3Ntb3MgY29tbXVuaXR5IGFwcHJvdmVkIFByb3Bvc2FsIDM0IG9uIDIwMjEtMDEtMjAgYWxsb2NhdGluZyAxMjksMjA4IEFUT00gdG8gaW1wbGVtZW50IGEgY29tcHJlaGVuc2l2ZSBBVE9NIG1hcmtldGluZyBwbGFuIGV4ZWN1dGVkIGluIGNvbGxhYm9yYXRpb24gd2l0aCBrZXkgY29tbXVuaXR5IHN0YWtlaG9sZGVycy4gUHJvcG9zYWwgNDYgaXMgcmVxdWVzdGluZyBhbiBleHRlbnNpb24gb2YgdGhlIHRpbWUgYWxsb3dlZCB0byBzcGVuZCB0aGUgYXBwcm92ZWQgYnVkZ2V0IGFuZCBhbGxvY2F0ZSBleGlzdGluZyBmdW5kcyBmb3IgYWRkaXRpb25hbCBBVE9NLWZvY3VzZWQgcHJpb3JpdGllcy5cbiBQcm9wb3NhbCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBvbiBnaXRodWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb3Ntb3MvZ292ZXJuYW5jZS9wdWxsLzIyGAMiOwoPMTA1NTAwMzg4NjE3NDIxEg00Mzc2ODA2MDkwMjM3GgwzMjYxOTE4OTU1OTQiCzE1MzM5MzQ2NjQ3KgwIwLKLhAYQqea2xgIyDAjAnNWEBhCp5rbGAjoSCgV1YXRvbRIJNTEyMDAwMDAwQgwI2qiNhAYQ7qqFzgFKDAjakteEBhDuqoXOAQqNBAgvEvwCCi4vY29zbW9zLnBhcmFtcy52MWJldGExLlBhcmFtZXRlckNoYW5nZVByb3Bvc2FsEskCCjdQYXJhbWV0ZXIgY2hhbmdlOiBsb3dlciBtaW5pbXVtIHByb3Bvc2FsIGRlcG9zaXQgYW1vdW50ErsBVGhlIGN1cnJlbnQgZGVwb3NpdCBhbW91bnQgb2YgNTEyIEFUT01zIHByb2hpYml0cyB2YWx1YWJsZSBnb3Zlcm5hbmNlIGFjdGl2aXR5IGZyb20gc21hbGwgaG9sZGVycyBvciB0aG9zZSB3aXRoIG1vc3Qgb2YgdGhlaXIgQVRPTSBzdGFrZWQuIFdlIHByb3Bvc2UgbG93ZXJpbmcgdGhlIHJlcXVpcmVt

pic: left is the node that is blocked, right is the validator owns 67% power, and keeps producing blocks.
Screenshot 2021-09-07 at 12 32 36

@fdymylja
Copy link
Contributor

fdymylja commented Sep 7, 2021

@yaruwangway my feeling is that rosetta is unrelated to this problem.

The bad gateway error is thrown by rosetta in two cases:

  1. An external client is querying rosetta, but the tendermint node is not responsive. You will not see the error in logs, you will see it returned to the querying client.
  2. When rosetta starts, it will attempt to connect to the tendermint node, if it fails it will retry for a total amount of time and then exit.

I would suggest for now, in order to understand if the issue is really related to rosetta, to disable it in the app.toml configuration, by setting:

[rosetta]
enable = false

@yaruwangway
Copy link
Contributor Author

yaruwangway commented Sep 8, 2021

@fdymylja Thank you!!!
After I disabled rosetta API in the app.toml, I can upgrade without error.
For local upgrade test by cosmovisor, why disabling rosetta matters ?

@fdymylja
Copy link
Contributor

fdymylja commented Sep 8, 2021

After I disabled rosetta API in the app.toml, I can upgrade without error.
For local upgrade test by cosmovisor, why disabling rosetta matters ?

I think it's related to some misconfiguration, can you show your rosetta section of app.toml?

@yaruwangway
Copy link
Contributor Author

@fdymylja
Hi I find out actually it is not because I enable or disable rosetta. (sry for the last misleading comment)
It is how much result the query will produce. for example, if I gov q proposal 50, it will not block the node, if I query gov q proposals, it will block the node.

By "blocking", it is not a real blocking, because if I block validator, the other node can still produce blocks. that means the validator is still signing blocks. (I am not so sure, because if I stop the non-blocked node and start it again, it cannot find the peer - the one is blocked).

It is probably a cosmovisor issue, if I use gaiad rather than cosmovisor, I can gaiad q gov proposals without block the node, Billy said the new cosmovisor might solve this already.

I can do a follow up if the new version of cosmovisor works.

Thank you so much !

@fdymylja
Copy link
Contributor

fdymylja commented Sep 8, 2021

@fdymylja
Hi I find out actually it is not because I enable or disable rosetta. (sry for the last misleading comment)
It is how much result the query will produce. for example, if I gov q proposal 50, it will not block the node, if I query gov q proposals, it will block the node.

By "blocking", it is not a real blocking, because if I block validator, the other node can still produce blocks. that means the validator is still signing blocks. (I am not so sure, because if I stop the non-blocked node and start it again, it cannot find the peer - the one is blocked).

It is probably a cosmovisor issue, if I use gaiad rather than cosmovisor, I can gaiad q gov proposals without block the node, Billy said the new cosmovisor might solve this already.

I can do a follow up if the new version of cosmovisor works.

Thank you so much !

No problem, let me know how it goes!

@yaruwangway
Copy link
Contributor Author

Hi, Frojdi,

Now I do not have any query issues with the new version of cosmovisor.

But still, if I enable rosetta API, no matter I use gaiad start or cosmovisor start, at the upgrade height, I will have the following error:
validator node which owns over 67% power:

7:31PM INF starting API server... module=api-server
7:31PM INF Starting RPC HTTP server on [::]:1327 module=api-server
7:31PM INF Dialing peer address={"id":"592fb09197f46b28fdddd0bc38326e14efac43af","ip":"::1","port":26656} module=p2p
7:31PM INF Error reconnecting to peer. Trying again addr={"id":"592fb09197f46b28fdddd0bc38326e14efac43af","ip":"::1","port":26656} err="dial tcp [::1]:26656: connect: connection refused" module=p2p tries=1
7:31PM INF Inbound Peer rejected err="auth failure: secret conn failed: EOF" module=p2p numPeers=0
7:31PM INF Dialing peer address={"id":"592fb09197f46b28fdddd0bc38326e14efac43af","ip":"::1","port":26656} module=p2p
7:31PM INF Error reconnecting to peer. Trying again addr={"id":"592fb09197f46b28fdddd0bc38326e14efac43af","ip":"::1","port":26656} err="dial tcp [::1]:26656: connect: connection refused" module=p2p tries=2
Error: rosetta: (502) bad gateway

the other node:

ERR dialing failed (attempts: 1): auth failure: secret conn failed: EOF addr={"id":"592fb09197f46b28fdddd0bc38326e14efac43af","ip":"::1","port":26656} module=pex

The two nodes' config of Rosetta:
validator node which owns over 67% power:

# Enable defines if the Rosetta API server should be enabled.
enable = true

# Address defines the Rosetta API server to listen on.
address = ":8081"

# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"

# Network defines the name of the network that will be returned by Rosetta.
network = "network"

# Retries defines the number of retries when connecting to the node before failing.
retries = 3

# Offline defines if Rosetta server should run in offline mode.
offline = false

The other node:

# Enable defines if the Rosetta API server should be enabled.
enable = false

# Address defines the Rosetta API server to listen on.
address = ":8080"

# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"

# Network defines the name of the network that will be returned by Rosetta.
network = "network"

# Retries defines the number of retries when connecting to the node before failing.
retries = 3

# Offline defines if Rosetta server should run in offline mode.
offline = false

If I disable rosetta for both nodes,
enable = false
I can upgrade without error.

Do you have any clues of debug ? Thank you! @fdymylja

@fdymylja
Copy link
Contributor

fdymylja commented Sep 10, 2021

Could you increase the number of retries to 1000? just to understand if maybe rosetta is failing to connect because the node is not ready yet

@yaruwangway
Copy link
Contributor Author

yaruwangway commented Sep 10, 2021

If I change retries to 1000, the validator node will produce a couple of blocks then fail:

2:39PM INF indexed block height=7368552 module=txindex
Error: rosetta: (502) bad gateway

@yaruwangway
Copy link
Contributor Author

If I change retries to 1000, the validator node will produce a couple of blocks then fail:

2:39PM INF indexed block height=7368552 module=txindex
Error: rosetta: (502) bad gateway

a bit more info: I printed the error:

INF indexed block height=7368570 module=txindex
RPC error -32603 - Internal error: height 1 is not available, lowest height is 7368387
Error: rosetta: (502) bad gateway

this error is after upgrade. and 7368387 is the height to which I exported the genesis file.

@fdymylja
Copy link
Contributor

Yes we were discussing it on the architecture call. It's not a bug but rather a lack of a feature. Which is defining a custom genesis height. I will implement this feature asap and we can backport it.

@mergify mergify bot closed this as completed in #10150 Sep 16, 2021
mergify bot pushed a commit that referenced this issue Sep 16, 2021
…10150)

<!--
The default pull request template is for types feat, fix, or refactor.
For other templates, add one of the following parameters to the url:
- template=docs.md
- template=other.md
-->

## Description

closes: #10121
closes: #10088

rosetta server fails to run with genesis.json has initial_heights 2 or larger
rosetta-cli check:data fails to parse EventTypeCoinBurn

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [x] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
mergify bot pushed a commit that referenced this issue Sep 16, 2021
…10150)

<!--
The default pull request template is for types feat, fix, or refactor.
For other templates, add one of the following parameters to the url:
- template=docs.md
- template=other.md
-->

## Description

closes: #10121
closes: #10088

rosetta server fails to run with genesis.json has initial_heights 2 or larger
rosetta-cli check:data fails to parse EventTypeCoinBurn

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [x] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

(cherry picked from commit 5a72b5e)
robert-zaremba pushed a commit that referenced this issue Sep 16, 2021
…10150) (#10165)

<!--
The default pull request template is for types feat, fix, or refactor.
For other templates, add one of the following parameters to the url:
- template=docs.md
- template=other.md
-->

## Description

closes: #10121
closes: #10088

rosetta server fails to run with genesis.json has initial_heights 2 or larger
rosetta-cli check:data fails to parse EventTypeCoinBurn

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [x] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

(cherry picked from commit 5a72b5e)

Co-authored-by: Geoff Lee <thirdchance@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants