@horietakehiro/aws-cdk-utul 0.41.55 → 0.41.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/lib/types/cfn-resource-types/aws-apigatewayv2-integration.d.ts +1 -1
  2. package/lib/types/cfn-resource-types/aws-apigatewayv2-integration.js +1 -1
  3. package/lib/types/cfn-resource-types/aws-arcregionswitch-plan.d.ts +35 -2
  4. package/lib/types/cfn-resource-types/aws-arcregionswitch-plan.js +1 -1
  5. package/lib/types/cfn-resource-types/aws-autoscaling-autoscalinggroup.d.ts +8 -0
  6. package/lib/types/cfn-resource-types/aws-autoscaling-autoscalinggroup.js +1 -1
  7. package/lib/types/cfn-resource-types/aws-bedrockagentcore-gateway.d.ts +26 -1
  8. package/lib/types/cfn-resource-types/aws-bedrockagentcore-gateway.js +1 -1
  9. package/lib/types/cfn-resource-types/aws-bedrockagentcore-gatewaytarget.d.ts +7 -1
  10. package/lib/types/cfn-resource-types/aws-bedrockagentcore-gatewaytarget.js +1 -1
  11. package/lib/types/cfn-resource-types/aws-bedrockagentcore-memory.d.ts +53 -4
  12. package/lib/types/cfn-resource-types/aws-bedrockagentcore-memory.js +1 -1
  13. package/lib/types/cfn-resource-types/aws-bedrockagentcore-runtime.d.ts +4 -0
  14. package/lib/types/cfn-resource-types/aws-bedrockagentcore-runtime.js +1 -1
  15. package/lib/types/cfn-resource-types/aws-billing-billingview.d.ts +8 -0
  16. package/lib/types/cfn-resource-types/aws-billing-billingview.js +1 -1
  17. package/lib/types/cfn-resource-types/aws-billingconductor-customlineitem.d.ts +6 -4
  18. package/lib/types/cfn-resource-types/aws-billingconductor-customlineitem.js +1 -1
  19. package/lib/types/cfn-resource-types/aws-cases-caserule.d.ts +149 -0
  20. package/lib/types/cfn-resource-types/aws-cases-caserule.js +3 -0
  21. package/lib/types/cfn-resource-types/aws-cases-domain.d.ts +40 -0
  22. package/lib/types/cfn-resource-types/aws-cases-domain.js +3 -0
  23. package/lib/types/cfn-resource-types/aws-cases-field.d.ts +57 -0
  24. package/lib/types/cfn-resource-types/aws-cases-field.js +3 -0
  25. package/lib/types/cfn-resource-types/aws-cases-layout.d.ts +101 -0
  26. package/lib/types/cfn-resource-types/aws-cases-layout.js +3 -0
  27. package/lib/types/cfn-resource-types/aws-cases-template.d.ts +96 -0
  28. package/lib/types/cfn-resource-types/aws-cases-template.js +3 -0
  29. package/lib/types/cfn-resource-types/aws-cloudfront-distribution.d.ts +4 -0
  30. package/lib/types/cfn-resource-types/aws-cloudfront-distribution.js +1 -1
  31. package/lib/types/cfn-resource-types/aws-connect-contactflowmodule.d.ts +14 -0
  32. package/lib/types/cfn-resource-types/aws-connect-contactflowmodule.js +1 -1
  33. package/lib/types/cfn-resource-types/aws-connect-evaluationform.d.ts +27 -15
  34. package/lib/types/cfn-resource-types/aws-connect-evaluationform.js +1 -1
  35. package/lib/types/cfn-resource-types/aws-connect-hoursofoperation.d.ts +59 -0
  36. package/lib/types/cfn-resource-types/aws-connect-hoursofoperation.js +1 -1
  37. package/lib/types/cfn-resource-types/aws-connectcampaignsv2-campaign.d.ts +30 -2
  38. package/lib/types/cfn-resource-types/aws-connectcampaignsv2-campaign.js +1 -1
  39. package/lib/types/cfn-resource-types/aws-customerprofiles-domain.d.ts +0 -2
  40. package/lib/types/cfn-resource-types/aws-customerprofiles-domain.js +1 -1
  41. package/lib/types/cfn-resource-types/aws-datasync-locationnfs.d.ts +1 -1
  42. package/lib/types/cfn-resource-types/aws-datasync-locationnfs.js +1 -1
  43. package/lib/types/cfn-resource-types/aws-datasync-locationsmb.d.ts +1 -1
  44. package/lib/types/cfn-resource-types/aws-datasync-locationsmb.js +1 -1
  45. package/lib/types/cfn-resource-types/aws-dms-dataprovider.d.ts +1 -1
  46. package/lib/types/cfn-resource-types/aws-dms-dataprovider.js +1 -1
  47. package/lib/types/cfn-resource-types/aws-ec2-clientvpnendpoint.d.ts +2 -0
  48. package/lib/types/cfn-resource-types/aws-ec2-clientvpnendpoint.js +1 -1
  49. package/lib/types/cfn-resource-types/aws-ec2-ec2fleet.d.ts +59 -58
  50. package/lib/types/cfn-resource-types/aws-ec2-ec2fleet.js +1 -1
  51. package/lib/types/cfn-resource-types/aws-ec2-networkinterface.d.ts +35 -21
  52. package/lib/types/cfn-resource-types/aws-ec2-networkinterface.js +1 -1
  53. package/lib/types/cfn-resource-types/aws-ec2-networkinterfaceattachment.d.ts +13 -7
  54. package/lib/types/cfn-resource-types/aws-ec2-networkinterfaceattachment.js +1 -1
  55. package/lib/types/cfn-resource-types/aws-ec2-spotfleet.d.ts +138 -136
  56. package/lib/types/cfn-resource-types/aws-ec2-spotfleet.js +1 -1
  57. package/lib/types/cfn-resource-types/aws-ec2-volume.d.ts +29 -13
  58. package/lib/types/cfn-resource-types/aws-ec2-volume.js +1 -1
  59. package/lib/types/cfn-resource-types/aws-ec2-vpnconcentrator.d.ts +14 -9
  60. package/lib/types/cfn-resource-types/aws-ec2-vpnconcentrator.js +1 -1
  61. package/lib/types/cfn-resource-types/aws-ec2-vpnconnection.d.ts +17 -0
  62. package/lib/types/cfn-resource-types/aws-ec2-vpnconnection.js +1 -1
  63. package/lib/types/cfn-resource-types/aws-ecr-pulltimeupdateexclusion.d.ts +5 -6
  64. package/lib/types/cfn-resource-types/aws-ecr-pulltimeupdateexclusion.js +1 -1
  65. package/lib/types/cfn-resource-types/aws-ecr-repositorycreationtemplate.d.ts +1 -1
  66. package/lib/types/cfn-resource-types/aws-ecr-repositorycreationtemplate.js +1 -1
  67. package/lib/types/cfn-resource-types/aws-ecs-capacityprovider.d.ts +1 -0
  68. package/lib/types/cfn-resource-types/aws-ecs-capacityprovider.js +1 -1
  69. package/lib/types/cfn-resource-types/aws-ecs-service.d.ts +2 -0
  70. package/lib/types/cfn-resource-types/aws-ecs-service.js +1 -1
  71. package/lib/types/cfn-resource-types/aws-eks-nodegroup.d.ts +45 -4
  72. package/lib/types/cfn-resource-types/aws-eks-nodegroup.js +1 -1
  73. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-listener.d.ts +16 -1
  74. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-listener.js +1 -1
  75. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-listenerrule.d.ts +15 -0
  76. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-listenerrule.js +1 -1
  77. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-loadbalancer.d.ts +3 -0
  78. package/lib/types/cfn-resource-types/aws-elasticloadbalancingv2-loadbalancer.js +1 -1
  79. package/lib/types/cfn-resource-types/aws-emr-step.d.ts +8 -0
  80. package/lib/types/cfn-resource-types/aws-emr-step.js +1 -1
  81. package/lib/types/cfn-resource-types/aws-entityresolution-matchingworkflow.d.ts +8 -1
  82. package/lib/types/cfn-resource-types/aws-entityresolution-matchingworkflow.js +1 -1
  83. package/lib/types/cfn-resource-types/aws-fsx-s3accesspointattachment.d.ts +96 -4
  84. package/lib/types/cfn-resource-types/aws-fsx-s3accesspointattachment.js +1 -1
  85. package/lib/types/cfn-resource-types/aws-groundstation-dataflowendpointgroupv2.d.ts +167 -0
  86. package/lib/types/cfn-resource-types/aws-groundstation-dataflowendpointgroupv2.js +3 -0
  87. package/lib/types/cfn-resource-types/aws-iot-topicrule.d.ts +7 -0
  88. package/lib/types/cfn-resource-types/aws-iot-topicrule.js +1 -1
  89. package/lib/types/cfn-resource-types/aws-kafkaconnect-connector.d.ts +4 -0
  90. package/lib/types/cfn-resource-types/aws-kafkaconnect-connector.js +1 -1
  91. package/lib/types/cfn-resource-types/aws-lex-bot.d.ts +39 -13
  92. package/lib/types/cfn-resource-types/aws-lex-bot.js +1 -1
  93. package/lib/types/cfn-resource-types/aws-lex-botalias.d.ts +4 -1
  94. package/lib/types/cfn-resource-types/aws-lex-botalias.js +1 -1
  95. package/lib/types/cfn-resource-types/aws-logs-loggroup.d.ts +1 -0
  96. package/lib/types/cfn-resource-types/aws-logs-loggroup.js +1 -1
  97. package/lib/types/cfn-resource-types/aws-logs-transformer.d.ts +3 -1
  98. package/lib/types/cfn-resource-types/aws-logs-transformer.js +1 -1
  99. package/lib/types/cfn-resource-types/aws-mediatailor-playbackconfiguration.d.ts +35 -0
  100. package/lib/types/cfn-resource-types/aws-mediatailor-playbackconfiguration.js +1 -1
  101. package/lib/types/cfn-resource-types/aws-msk-cluster.d.ts +2 -0
  102. package/lib/types/cfn-resource-types/aws-msk-cluster.js +1 -1
  103. package/lib/types/cfn-resource-types/aws-observabilityadmin-organizationtelemetryrule.d.ts +189 -1
  104. package/lib/types/cfn-resource-types/aws-observabilityadmin-organizationtelemetryrule.js +1 -1
  105. package/lib/types/cfn-resource-types/aws-observabilityadmin-telemetryrule.d.ts +202 -2
  106. package/lib/types/cfn-resource-types/aws-observabilityadmin-telemetryrule.js +1 -1
  107. package/lib/types/cfn-resource-types/aws-odb-odbpeeringconnection.d.ts +8 -0
  108. package/lib/types/cfn-resource-types/aws-odb-odbpeeringconnection.js +1 -1
  109. package/lib/types/cfn-resource-types/aws-organizations-policy.d.ts +1 -1
  110. package/lib/types/cfn-resource-types/aws-organizations-policy.js +1 -1
  111. package/lib/types/cfn-resource-types/aws-paymentcryptography-key.d.ts +1 -1
  112. package/lib/types/cfn-resource-types/aws-paymentcryptography-key.js +1 -1
  113. package/lib/types/cfn-resource-types/aws-pcs-cluster.d.ts +2 -2
  114. package/lib/types/cfn-resource-types/aws-pcs-cluster.js +1 -1
  115. package/lib/types/cfn-resource-types/aws-quicksight-dashboard.d.ts +38 -14
  116. package/lib/types/cfn-resource-types/aws-quicksight-dashboard.js +1 -1
  117. package/lib/types/cfn-resource-types/aws-ram-resourceshare.d.ts +20 -0
  118. package/lib/types/cfn-resource-types/aws-ram-resourceshare.js +1 -1
  119. package/lib/types/cfn-resource-types/aws-route53-hostedzone.d.ts +3 -3
  120. package/lib/types/cfn-resource-types/aws-route53-hostedzone.js +1 -1
  121. package/lib/types/cfn-resource-types/aws-route53profiles-profile.d.ts +4 -0
  122. package/lib/types/cfn-resource-types/aws-route53profiles-profile.js +1 -1
  123. package/lib/types/cfn-resource-types/aws-route53resolver-resolverendpoint.d.ts +8 -0
  124. package/lib/types/cfn-resource-types/aws-route53resolver-resolverendpoint.js +1 -1
  125. package/lib/types/cfn-resource-types/aws-route53resolver-resolverruleassociation.d.ts +1 -0
  126. package/lib/types/cfn-resource-types/aws-route53resolver-resolverruleassociation.js +1 -1
  127. package/lib/types/cfn-resource-types/aws-s3-bucket.d.ts +10 -2
  128. package/lib/types/cfn-resource-types/aws-s3-bucket.js +1 -1
  129. package/lib/types/cfn-resource-types/aws-sagemaker-cluster.d.ts +4 -0
  130. package/lib/types/cfn-resource-types/aws-sagemaker-cluster.js +1 -1
  131. package/lib/types/cfn-resource-types/aws-secretsmanager-secret.d.ts +3 -0
  132. package/lib/types/cfn-resource-types/aws-secretsmanager-secret.js +1 -1
  133. package/lib/types/cfn-resource-types/aws-securityhub-connectorv2.d.ts +25 -23
  134. package/lib/types/cfn-resource-types/aws-securityhub-connectorv2.js +1 -1
  135. package/lib/types/cfn-resource-types/aws-ses-tenant.d.ts +48 -0
  136. package/lib/types/cfn-resource-types/aws-ses-tenant.js +3 -0
  137. package/lib/types/cfn-resource-types/aws-ssm-document.d.ts +37 -37
  138. package/lib/types/cfn-resource-types/aws-ssm-document.js +1 -1
  139. package/lib/types/cfn-resource-types/aws-ssm-maintenancewindowtarget.d.ts +29 -2
  140. package/lib/types/cfn-resource-types/aws-ssm-maintenancewindowtarget.js +1 -1
  141. package/lib/types/cfn-resource-types/aws-ssm-maintenancewindowtask.d.ts +52 -1
  142. package/lib/types/cfn-resource-types/aws-ssm-maintenancewindowtask.js +1 -1
  143. package/lib/types/cfn-resource-types/aws-wisdom-aiprompt.d.ts +1 -1
  144. package/lib/types/cfn-resource-types/aws-wisdom-aiprompt.js +1 -1
  145. package/lib/types/cfn-resource-types/aws-wisdom-assistantassociation.d.ts +9 -3
  146. package/lib/types/cfn-resource-types/aws-wisdom-assistantassociation.js +1 -1
  147. package/lib/types/cfn-resource-types/aws-workspacesweb-usersettings.d.ts +37 -0
  148. package/lib/types/cfn-resource-types/aws-workspacesweb-usersettings.js +1 -1
  149. package/lib/types/cfn-resource-types.d.ts +14 -0
  150. package/lib/types/cfn-resource-types.js +43 -28
  151. package/package.json +1 -1
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWVjcy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgYEFXUzo6RUNTOjpTZXJ2aWNlYGAgcmVzb3VyY2UgY3JlYXRlcyBhbiBBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSAoQW1hem9uIEVDUykgc2VydmljZSB0aGF0IHJ1bnMgYW5kIG1haW50YWlucyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0YXNrcyBhbmQgYXNzb2NpYXRlZCBsb2FkIGJhbGFuY2Vycy5cbiAqICAgVGhlIHN0YWNrIHVwZGF0ZSBmYWlscyBpZiB5b3UgY2hhbmdlIGFueSBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSByZXBsYWNlbWVudCBhbmQgYXQgbGVhc3Qgb25lIEVDUyBTZXJ2aWNlIENvbm5lY3QgYGBTZXJ2aWNlQ29ubmVjdENvbmZpZ3VyYXRpb25gYCBwcm9wZXJ0eSBpcyBjb25maWd1cmVkLiBUaGlzIGlzIGJlY2F1c2UgQVdTIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50IHNlcnZpY2UgZmlyc3QsIGJ1dCBlYWNoIGBgU2VydmljZUNvbm5lY3RTZXJ2aWNlYGAgbXVzdCBoYXZlIGEgbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiB0aGUgbmFtZXNwYWNlLlxuICogICAgU3RhcnRpbmcgQXByaWwgMTUsIDIwMjMsIEFXUzsgd2lsbCBub3Qgb25ib2FyZCBuZXcgY3VzdG9tZXJzIHRvIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSAoRUkpLCBhbmQgd2lsbCBoZWxwIGN1cnJlbnQgY3VzdG9tZXJzIG1pZ3JhdGUgdGhlaXIgd29ya2xvYWRzIHRvIG9wdGlvbnMgdGhhdCBvZmZlciBiZXR0ZXIgcHJpY2UgYW5kIHBlcmZvcm1hbmNlLiBBZnRlciBBcHJpbCAxNSwgMjAyMywgbmV3IGN1c3RvbWVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIGxhdW5jaCBpbnN0YW5jZXMgd2l0aCBBbWF6b24gRUkgYWNjZWxlcmF0b3JzIGluIEFtYXpvbiBTYWdlTWFrZXIsIEVDUywgb3IgRUMyLiBIb3dldmVyLCBjdXN0b21lcnMgd2hvIGhhdmUgdXNlZCBBbWF6b24gRUkgYXQgbGVhc3Qgb25jZSBkdXJpbmcgdGhlIHBhc3QgMzAtZGF5IHBlcmlvZCBhcmUgY29uc2lkZXJlZCBjdXJyZW50IGN1c3RvbWVycyBhbmQgd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBzZXJ2aWNlLiBcbiAqICAgIE9uIEp1bmUgMTIsIDIwMjUsIEFtYXpvbiBFQ1MgbGF1bmNoZWQgc3VwcG9ydCBmb3IgdXBkYXRpbmcgY2FwYWNpdHkgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBmb3IgRUNTIHNlcnZpY2VzLiBXaXRoIHRoaXMgbGF1bmNoLCBFQ1MgYWxzbyBhbGlnbmVkIHRoZSBDRk4gdXBkYXRlIGJlaGF2aW9yIGZvciBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHBhcmFtZXRlciB3aXRoIHRoZSBzdGFuZGFyZCBwcmFjdGljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbYWRkcyBzdXBwb3J0IGZvciB1cGRhdGluZyBjYXBhY2l0eSBwcm92aWRlciBjb25maWd1cmF0aW9uIGZvciBFQ1Mgc2VydmljZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hYm91dC1hd3Mvd2hhdHMtbmV3LzIwMjUvMDUvYW1hem9uLWVjcy1jYXBhY2l0eS1wcm92aWRlci1jb25maWd1cmF0aW9uLWVjcy8pLiBQcmV2aW91c2x5IEVDUyBpZ25vcmVkIHRoZSBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHByb3BlcnR5IGlmIGl0IHdhcyBzZXQgdG8gYW4gZW1wdHkgbGlzdCBmb3IgZXhhbXBsZSwgYGBbXWBgIGluIENGTiwgYmVjYXVzZSB1cGRhdGluZyBjYXBhY2l0eSBwcm92aWRlciBjb25maWd1cmF0aW9uIHdhcyBub3Qgc3VwcG9ydGVkLiBOb3csIHdpdGggc3VwcG9ydCBmb3IgY2FwYWNpdHkgcHJvdmlkZXIgdXBkYXRlcywgY3VzdG9tZXJzIGNhbiByZW1vdmUgY2FwYWNpdHkgcHJvdmlkZXJzIGZyb20gYSBzZXJ2aWNlIGJ5IHBhc3NpbmcgYW4gZW1wdHkgbGlzdC4gV2hlbiB5b3Ugc3BlY2lmeSBhbiBlbXB0eSBsaXN0IChgYFtdYGApIGZvciB0aGUgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBwcm9wZXJ0eSBpbiB5b3VyIENGTiB0ZW1wbGF0ZSwgRUNTIHdpbGwgcmVtb3ZlIGFueSBjYXBhY2l0eSBwcm92aWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLCBhcyBmb2xsb3dzOlxuICogICArICBGb3Igc2VydmljZXMgY3JlYXRlZCB3aXRoIGEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgYWZ0ZXIgdGhlIGxhdW5jaDpcbiAqICAgKyAgSWYgdGhlcmUncyBhIGNsdXN0ZXIgZGVmYXVsdCBzdHJhdGVneSBzZXQsIHRoZSBzZXJ2aWNlIHdpbGwgcmV2ZXJ0IHRvIHVzaW5nIHRoYXQgZGVmYXVsdCBzdHJhdGVneS5cbiAqICAgKyAgSWYgbm8gY2x1c3RlciBkZWZhdWx0IHN0cmF0ZWd5IGV4aXN0cywgeW91IHdpbGwgcmVjZWl2ZSB0aGUgZm9sbG93aW5nIGVycm9yOlxuICogIE5vIGxhdW5jaCB0eXBlIHRvIGZhbGwgYmFjayB0byBmb3IgZW1wdHkgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kuIFlvdXIgc2VydmljZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIGxhdW5jaCB0eXBlLlxuICogICBcbiAqICAgKyAgRm9yIHNlcnZpY2VzIGNyZWF0ZWQgd2l0aCBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IHByaW9yIHRvIHRoZSBsYXVuY2g6XG4gKiAgICsgIElmIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgaGFkIGBgRkFSR0FURV9TUE9UYGAgb3IgYGBGQVJHQVRFYGAgY2FwYWNpdHkgcHJvdmlkZXJzLCB0aGUgbGF1bmNoIHR5cGUgd2lsbCBiZSB1cGRhdGVkIHRvIGBgRkFSR0FURWBgIGFuZCB0aGUgY2FwYWNpdHkgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkLlxuICogICArICBJZiB0aGUgc3RyYXRlZ3kgaW5jbHVkZWQgQXV0byBTY2FsaW5nIGdyb3VwIGNhcGFjaXR5IHByb3ZpZGVycywgdGhlIHNlcnZpY2Ugd2lsbCByZXZlcnQgdG8gRUMyIGxhdW5jaCB0eXBlLCBhbmQgdGhlIEF1dG8gU2NhbGluZyBncm91cCBjYXBhY2l0eSBwcm92aWRlcnMgd2lsbCBub3QgYmUgdXNlZC5cbiAqICAgXG4gKiAgIFxuICogIFJlY29tbWVuZGVkIEFjdGlvbnNcbiAqICBJZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneTogW11gYCBpbiB5b3VyIENGTiB0ZW1wbGF0ZXMsIHlvdSBzaG91bGQgdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOlxuICogICArICBJZiB5b3UgZG8gbm90IGludGVuZCB0byB1cGRhdGUgdGhlIENhcGFjaXR5IFByb3ZpZGVyIFN0cmF0ZWd5OlxuICogICArICBSZW1vdmUgdGhlIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgcHJvcGVydHkgZW50aXJlbHkgZnJvbSB5b3VyIENGTiB0ZW1wbGF0ZVxuICogICArICBBbHRlcm5hdGl2ZWx5LCB1c2UgYGAhUmVmIDo6Tm9WYWx1ZWBgIGZvciB0aGUgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBwcm9wZXJ0eSBpbiB5b3VyIHRlbXBsYXRlXG4gKiAgIFxuICogICArICBJZiB5b3UgaW50ZW5kIHRvIG1haW50YWluIG9yIHVwZGF0ZSB0aGUgQ2FwYWNpdHkgUHJvdmlkZXIgU3RyYXRlZ3ksIHNwZWNpZnkgdGhlIGFjdHVhbCBDYXBhY2l0eSBQcm92aWRlciBTdHJhdGVneSBmb3IgdGhlIHNlcnZpY2UgaW4geW91ciBDRk4gdGVtcGxhdGUuXG4gKiAgIFxuICogIElmIHlvdXIgQ0ZOIHRlbXBsYXRlIGhhZCBhbiBlbXB0eSBsaXN0IChbXSkgZm9yIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgcHJpb3IgdG8gdGhlIGFmb3JlbWVudGlvbmVkIGxhdW5jaCBvbiBKdW5lIDEyLCBhbmQgeW91IGFyZSB1c2luZyB0aGUgc2FtZSB0ZW1wbGF0ZSB3aXRoIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5OiBbXWBgLCB5b3UgbWlnaHQgZW5jb3VudGVyIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gKiAgIEludmFsaWQgcmVxdWVzdCBwcm92aWRlZDogV2hlbiBzd2l0Y2hpbmcgZnJvbSBsYXVuY2ggdHlwZSB0byBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBvbiBhbiBleGlzdGluZyBzZXJ2aWNlLCBvciBtYWtpbmcgYSBjaGFuZ2UgdG8gYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBvbiBhIHNlcnZpY2UgdGhhdCBpcyBhbHJlYWR5IHVzaW5nIG9uZSwgeW91IG11c3QgZm9yY2UgYSBuZXcgZGVwbG95bWVudC4gKFNlcnZpY2U6IEVjcywgU3RhdHVzIENvZGU6IDQwMCwgUmVxdWVzdCBJRDogeHh4KSAoU0RLIEF0dGVtcHQgQ291bnQ6IDEpXCIgKFJlcXVlc3RUb2tlbjogeHh4IEhhbmRsZXJFcnJvckNvZGU6IEludmFsaWRSZXF1ZXN0KSBcbiAqICBOb3RlIHRoYXQgQ0ZOIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGVzIGEgbmV3IGRlcGxveW1lbnQgd2hlbiBpdCBkZXRlY3RzIGEgcGFyYW1ldGVyIGNoYW5nZSwgYnV0IGN1c3RvbWVycyBjYW5ub3QgY2hvb3NlIHRvIGZvcmNlIGEgZGVwbG95bWVudCB0aHJvdWdoIENGTi4gVGhpcyBpcyBhbiBpbnZhbGlkIGlucHV0IHNjZW5hcmlvIHRoYXQgcmVxdWlyZXMgb25lIG9mIHRoZSByZW1lZGlhdGlvbiBhY3Rpb25zIGxpc3RlZCBhYm92ZS5cbiAqICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBhY3RpdmUgcHJvZHVjdGlvbiBpc3N1ZXMgcmVsYXRlZCB0byB0aGlzIGNoYW5nZSwgY29udGFjdCBBV1MgU3VwcG9ydCBvciB5b3VyIFRlY2huaWNhbCBBY2NvdW50IE1hbmFnZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgX0FXU19FQ1NfU0VSVklDRSB7XG4vKipcbiAqIFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRoYXQgeW91ciB0YXNrcyBpbiB0aGUgc2VydmljZSBhcmUgcnVubmluZyBvbi4gQSBwbGF0Zm9ybSB2ZXJzaW9uIGlzIHNwZWNpZmllZCBvbmx5IGZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS4gSWYgb25lIGlzbid0IHNwZWNpZmllZCwgdGhlIGBgTEFURVNUYGAgcGxhdGZvcm0gdmVyc2lvbiBpcyB1c2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtwbGF0Zm9ybSB2ZXJzaW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcGxhdGZvcm1fdmVyc2lvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5QbGF0Zm9ybVZlcnNpb24/OiBzdHJpbmdcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSB0YWdzIGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgdGFzay4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgdGFncyBhcmVuJ3QgcHJvcGFnYXRlZC4gVGFncyBjYW4gb25seSBiZSBwcm9wYWdhdGVkIHRvIHRoZSB0YXNrIGR1cmluZyB0YXNrIGNyZWF0aW9uLiBUbyBhZGQgdGFncyB0byBhIHRhc2sgYWZ0ZXIgdGFzayBjcmVhdGlvbiwgdXNlIHRoZSBbVGFnUmVzb3VyY2VdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbCkgQVBJIGFjdGlvbi5cbiAqICBZb3UgbXVzdCBzZXQgdGhpcyB0byBhIHZhbHVlIG90aGVyIHRoYW4gYGBOT05FYGAgd2hlbiB5b3UgdXNlIENvc3QgRXhwbG9yZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgdXNhZ2UgcmVwb3J0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNhZ2UtcmVwb3J0cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgaXMgYGBOT05FYGAuXG4gKi9cblByb3BhZ2F0ZVRhZ3M/OiAoXCJTRVJWSUNFXCIgfCBcIlRBU0tfREVGSU5JVElPTlwiKVxuU2VydmljZUFybj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcGxhY2VtZW50IHN0cmF0ZWd5IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcyBpbiB5b3VyIHNlcnZpY2UuIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgNSBzdHJhdGVneSBydWxlcyBmb3IgZWFjaCBzZXJ2aWNlLlxuICogICBUbyByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgc2VydmljZSByZXNvdXJjZSwgc3BlY2lmeSBhbiBlbXB0eSBgYFBsYWNlbWVudFN0cmF0ZWd5YGAgYXJyYXkuXG4gKi9cblBsYWNlbWVudFN0cmF0ZWdpZXM/OiBQbGFjZW1lbnRTdHJhdGVneVtdXG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByZWdpc3RyeSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHNlcnZpY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2UgZGlzY292ZXJ5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWRpc2NvdmVyeS5odG1sKS5cbiAqICAgRWFjaCBzZXJ2aWNlIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggb25lIHNlcnZpY2UgcmVnaXN0cnkuIE11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcyBmb3IgZWFjaCBzZXJ2aWNlIGlzbid0IHN1cHBvcnRlZC5cbiAqICAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgU2VydmljZVJlZ2lzdHJ5YGAgYXJyYXkuXG4gKi9cblNlcnZpY2VSZWdpc3RyaWVzPzogU2VydmljZVJlZ2lzdHJ5W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgdm9sdW1lIHNwZWNpZmllZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uIGFzIGEgdm9sdW1lIHRoYXQgaXMgY29uZmlndXJlZCBhdCBsYXVuY2ggdGltZS4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgdm9sdW1lIHR5cGUgaXMgYW4gQW1hem9uIEVCUyB2b2x1bWUuXG4gKiAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgU2VydmljZVZvbHVtZUNvbmZpZ3VyYXRpb25gYCBhcnJheS5cbiAqL1xuVm9sdW1lQ29uZmlndXJhdGlvbnM/OiBTZXJ2aWNlVm9sdW1lQ29uZmlndXJhdGlvbltdXG4vKipcbiAqIFRoZSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSBzZXJ2aWNlLlxuICogIElmIGEgYGBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBpcyBzcGVjaWZpZWQsIHRoZSBgYGxhdW5jaFR5cGVgYCBwYXJhbWV0ZXIgbXVzdCBiZSBvbWl0dGVkLiBJZiBubyBgYGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIG9yIGBgbGF1bmNoVHlwZWBgIGlzIHNwZWNpZmllZCwgdGhlIGBgZGVmYXVsdENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIGZvciB0aGUgY2x1c3RlciBpcyB1c2VkLlxuICogIEEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgY2FuIGNvbnRhaW4gYSBtYXhpbXVtIG9mIDIwIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqICAgVG8gcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIHNlcnZpY2UgcmVzb3VyY2UsIHNwZWNpZnkgYW4gZW1wdHkgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lJdGVtYGAgYXJyYXkuXG4gKi9cbkNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneT86IENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneUl0ZW1bXVxuLyoqXG4gKiBUaGUgbGF1bmNoIHR5cGUgb24gd2hpY2ggdG8gcnVuIHlvdXIgc2VydmljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBMYXVuY2ggVHlwZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xhdW5jaF90eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIElmIHlvdSB3YW50IHRvIHVzZSBNYW5hZ2VkIEluc3RhbmNlcywgeW91IG11c3QgdXNlIHRoZSBgYGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHJlcXVlc3QgcGFyYW1ldGVyXG4gKi9cbkxhdW5jaFR5cGU/OiAoXCJFQzJcIiB8IFwiRkFSR0FURVwiIHwgXCJFWFRFUk5BTFwiKVxuTmFtZT86IHN0cmluZ1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgQXZhaWxhYmlsaXR5IFpvbmUgcmViYWxhbmNpbmcgZm9yIHRoZSBzZXJ2aWNlLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0JhbGFuY2luZyBhbiBBbWF6b24gRUNTIHNlcnZpY2UgYWNyb3NzIEF2YWlsYWJpbGl0eSBab25lc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1yZWJhbGFuY2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgYGBBdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmdgYCBkaWZmZXJzIGJldHdlZW4gY3JlYXRlIGFuZCB1cGRhdGUgcmVxdWVzdHM6XG4gKiAgICsgIEZvciBjcmVhdGUgc2VydmljZSByZXF1ZXN0cywgd2hlbiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGBgQXZhaWxhYmlsaXR5Wm9uZVJlYmFsYW5jaW5nYGAsIEFtYXpvbiBFQ1MgZGVmYXVsdHMgdGhlIHZhbHVlIHRvIGBgRU5BQkxFRGBgLlxuICogICArICBGb3IgdXBkYXRlIHNlcnZpY2UgcmVxdWVzdHMsIHdoZW4gbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBgYEF2YWlsYWJpbGl0eVpvbmVSZWJhbGFuY2luZ2BgLCBBbWF6b24gRUNTIGRlZmF1bHRzIHRvIHRoZSBleGlzdGluZyBzZXJ2aWNl4oCZcyBgYEF2YWlsYWJpbGl0eVpvbmVSZWJhbGFuY2luZ2BgIHZhbHVlLiBJZiB0aGUgc2VydmljZSBuZXZlciBoYWQgYW4gYGBBdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmdgYCB2YWx1ZSBzZXQsIEFtYXpvbiBFQ1MgdHJlYXRzIHRoaXMgYXMgYGBESVNBQkxFRGBgLlxuICovXG5BdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmc/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG4vKipcbiAqIFRoZSBzY2hlZHVsaW5nIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHNlcnZpY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Nfc2VydmljZXMuaHRtbCkuXG4gKiAgVGhlcmUgYXJlIHR3byBzZXJ2aWNlIHNjaGVkdWxlciBzdHJhdGVnaWVzIGF2YWlsYWJsZTpcbiAqICAgKyAgYGBSRVBMSUNBYGAtVGhlIHJlcGxpY2Egc2NoZWR1bGluZyBzdHJhdGVneSBwbGFjZXMgYW5kIG1haW50YWlucyB0aGUgZGVzaXJlZCBudW1iZXIgb2YgdGFza3MgYWNyb3NzIHlvdXIgY2x1c3Rlci4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHNwcmVhZHMgdGFza3MgYWNyb3NzIEF2YWlsYWJpbGl0eSBab25lcy4gWW91IGNhbiB1c2UgdGFzayBwbGFjZW1lbnQgc3RyYXRlZ2llcyBhbmQgY29uc3RyYWludHMgdG8gY3VzdG9taXplIHRhc2sgcGxhY2VtZW50IGRlY2lzaW9ucy4gVGhpcyBzY2hlZHVsZXIgc3RyYXRlZ3kgaXMgcmVxdWlyZWQgaWYgdGhlIHNlcnZpY2UgdXNlcyB0aGUgYGBDT0RFX0RFUExPWWBgIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZXMuXG4gKiAgICsgIGBgREFFTU9OYGAtVGhlIGRhZW1vbiBzY2hlZHVsaW5nIHN0cmF0ZWd5IGRlcGxveXMgZXhhY3RseSBvbmUgdGFzayBvbiBlYWNoIGFjdGl2ZSBjb250YWluZXIgaW5zdGFuY2UgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIHRoYXQgeW91IHNwZWNpZnkgaW4geW91ciBjbHVzdGVyLiBUaGUgc2VydmljZSBzY2hlZHVsZXIgYWxzbyBldmFsdWF0ZXMgdGhlIHRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGZvciBydW5uaW5nIHRhc2tzIGFuZCB3aWxsIHN0b3AgdGFza3MgdGhhdCBkb24ndCBtZWV0IHRoZSBwbGFjZW1lbnQgY29uc3RyYWludHMuIFdoZW4geW91J3JlIHVzaW5nIHRoaXMgc3RyYXRlZ3ksIHlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSBkZXNpcmVkIG51bWJlciBvZiB0YXNrcywgYSB0YXNrIHBsYWNlbWVudCBzdHJhdGVneSwgb3IgdXNlIFNlcnZpY2UgQXV0byBTY2FsaW5nIHBvbGljaWVzLlxuICogICBUYXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSBvciB0aGUgYGBDT0RFX0RFUExPWWBgIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZXMgZG9uJ3Qgc3VwcG9ydCB0aGUgYGBEQUVNT05gYCBzY2hlZHVsaW5nIHN0cmF0ZWd5LlxuICovXG5TY2hlZHVsaW5nU3RyYXRlZ3k/OiAoXCJEQUVNT05cIiB8IFwiUkVQTElDQVwiKVxuTmV0d29ya0NvbmZpZ3VyYXRpb24/OiBOZXR3b3JrQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgdGhhdCB5b3UgYXBwbHkgdG8gdGhlIHNlcnZpY2UgdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLCBib3RoIG9mIHdoaWNoIHlvdSBkZWZpbmUuIFdoZW4gYSBzZXJ2aWNlIGlzIGRlbGV0ZWQsIHRoZSB0YWdzIGFyZSBkZWxldGVkIGFzIHdlbGwuXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5Gb3JjZU5ld0RlcGxveW1lbnQ/OiBGb3JjZU5ld0RlcGxveW1lbnRcbi8qKlxuICogVGhlIHBlcmlvZCBvZiB0aW1lLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSBBbWF6b24gRUNTIHNlcnZpY2Ugc2NoZWR1bGVyIGlnbm9yZXMgdW5oZWFsdGh5IEVsYXN0aWMgTG9hZCBCYWxhbmNpbmcsIFZQQyBMYXR0aWNlLCBhbmQgY29udGFpbmVyIGhlYWx0aCBjaGVja3MgYWZ0ZXIgYSB0YXNrIGhhcyBmaXJzdCBzdGFydGVkLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBoZWFsdGggY2hlY2sgZ3JhY2UgcGVyaW9kIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAwIGlzIHVzZWQuIElmIHlvdSBkbyBub3QgdXNlIGFueSBvZiB0aGUgaGVhbHRoIGNoZWNrcywgdGhlbiBgYGhlYWx0aENoZWNrR3JhY2VQZXJpb2RTZWNvbmRzYGAgaXMgdW51c2VkLlxuICogIElmIHlvdXIgc2VydmljZSBoYXMgbW9yZSBydW5uaW5nIHRhc2tzIHRoYW4gZGVzaXJlZCwgdW5oZWFsdGh5IHRhc2tzIGluIHRoZSBncmFjZSBwZXJpb2QgbWlnaHQgYmUgc3RvcHBlZCB0byByZWFjaCB0aGUgZGVzaXJlZCBjb3VudC5cbiAqL1xuSGVhbHRoQ2hlY2tHcmFjZVBlcmlvZFNlY29uZHM/OiBudW1iZXJcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdHVybiBvbiBBbWF6b24gRUNTIG1hbmFnZWQgdGFncyBmb3IgdGhlIHRhc2tzIHdpdGhpbiB0aGUgc2VydmljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFnZ2luZyB5b3VyIEFtYXpvbiBFQ1MgcmVzb3VyY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtdXNpbmctdGFncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgV2hlbiB5b3UgdXNlIEFtYXpvbiBFQ1MgbWFuYWdlZCB0YWdzLCB5b3UgbXVzdCBzZXQgdGhlIGBgcHJvcGFnYXRlVGFnc2BgIHJlcXVlc3QgcGFyYW1ldGVyLlxuICovXG5FbmFibGVFQ1NNYW5hZ2VkVGFncz86IGJvb2xlYW5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleGVjdXRlIGNvbW1hbmQgZnVuY3Rpb25hbGl0eSBpcyB0dXJuZWQgb24gZm9yIHRoZSBzZXJ2aWNlLiBJZiBgYHRydWVgYCwgdGhlIGV4ZWN1dGUgY29tbWFuZCBmdW5jdGlvbmFsaXR5IGlzIHR1cm5lZCBvbiBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gdGFza3MgYXMgcGFydCBvZiB0aGUgc2VydmljZS5cbiAqL1xuRW5hYmxlRXhlY3V0ZUNvbW1hbmQ/OiBib29sZWFuXG4vKipcbiAqIEFuIGFycmF5IG9mIHBsYWNlbWVudCBjb25zdHJhaW50IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcyBpbiB5b3VyIHNlcnZpY2UuIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgMTAgY29uc3RyYWludHMgZm9yIGVhY2ggdGFzay4gVGhpcyBsaW1pdCBpbmNsdWRlcyBjb25zdHJhaW50cyBpbiB0aGUgdGFzayBkZWZpbml0aW9uIGFuZCB0aG9zZSBzcGVjaWZpZWQgYXQgcnVudGltZS5cbiAqICAgVG8gcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIHNlcnZpY2UgcmVzb3VyY2UsIHNwZWNpZnkgYW4gZW1wdHkgYGBQbGFjZW1lbnRDb25zdHJhaW50YGAgYXJyYXkuXG4gKi9cblBsYWNlbWVudENvbnN0cmFpbnRzPzogUGxhY2VtZW50Q29uc3RyYWludFtdXG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGNsdXN0ZXIgdGhhdCB5b3UgcnVuIHlvdXIgc2VydmljZSBvbi4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgY2x1c3RlciwgdGhlIGRlZmF1bHQgY2x1c3RlciBpcyBhc3N1bWVkLlxuICovXG5DbHVzdGVyPzogc3RyaW5nXG4vKipcbiAqIEEgbGlzdCBvZiBsb2FkIGJhbGFuY2VyIG9iamVjdHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UuIElmIHlvdSBzcGVjaWZ5IHRoZSBgYFJvbGVgYCBwcm9wZXJ0eSwgYGBMb2FkQmFsYW5jZXJzYGAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgd2VsbC4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgbG9hZCBiYWxhbmNlcnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgcGVyIHNlcnZpY2UsIHNlZSBbU2VydmljZSBMb2FkIEJhbGFuY2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1sb2FkLWJhbGFuY2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgTG9hZEJhbGFuY2VyYGAgYXJyYXkuXG4gKi9cbkxvYWRCYWxhbmNlcnM/OiBMb2FkQmFsYW5jZXJbXVxuU2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uPzogU2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgaW5zdGFudGlhdGlvbnMgb2YgdGhlIHNwZWNpZmllZCB0YXNrIGRlZmluaXRpb24gdG8gcGxhY2UgYW5kIGtlZXAgcnVubmluZyBpbiB5b3VyIHNlcnZpY2UuXG4gKiAgRm9yIG5ldyBzZXJ2aWNlcywgaWYgYSBkZXNpcmVkIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiBgYDFgYCBpcyB1c2VkLiBXaGVuIHVzaW5nIHRoZSBgYERBRU1PTmBgIHNjaGVkdWxpbmcgc3RyYXRlZ3ksIHRoZSBkZXNpcmVkIGNvdW50IGlzIG5vdCByZXF1aXJlZC5cbiAqICBGb3IgZXhpc3Rpbmcgc2VydmljZXMsIGlmIGEgZGVzaXJlZCBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBvbWl0dGVkIGZyb20gdGhlIG9wZXJhdGlvbi5cbiAqL1xuRGVzaXJlZENvdW50PzogbnVtYmVyXG4vKipcbiAqIFRoZSBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmljZSBiZWluZyBjcmVhdGVkLlxuICovXG5WcGNMYXR0aWNlQ29uZmlndXJhdGlvbnM/OiBWcGNMYXR0aWNlQ29uZmlndXJhdGlvbltdXG5EZXBsb3ltZW50Q29udHJvbGxlcj86IERlcGxveW1lbnRDb250cm9sbGVyXG4vKipcbiAqIFRoZSBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQgYWxsb3dzIEFtYXpvbiBFQ1MgdG8gbWFrZSBjYWxscyB0byB5b3VyIGxvYWQgYmFsYW5jZXIgb24geW91ciBiZWhhbGYuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgcGVybWl0dGVkIGlmIHlvdSBhcmUgdXNpbmcgYSBsb2FkIGJhbGFuY2VyIHdpdGggeW91ciBzZXJ2aWNlIGFuZCB5b3VyIHRhc2sgZGVmaW5pdGlvbiBkb2Vzbid0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuIElmIHlvdSBzcGVjaWZ5IHRoZSBgYHJvbGVgYCBwYXJhbWV0ZXIsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBhIGxvYWQgYmFsYW5jZXIgb2JqZWN0IHdpdGggdGhlIGBgbG9hZEJhbGFuY2Vyc2BgIHBhcmFtZXRlci5cbiAqICAgSWYgeW91ciBhY2NvdW50IGhhcyBhbHJlYWR5IGNyZWF0ZWQgdGhlIEFtYXpvbiBFQ1Mgc2VydmljZS1saW5rZWQgcm9sZSwgdGhhdCByb2xlIGlzIHVzZWQgZm9yIHlvdXIgc2VydmljZSB1bmxlc3MgeW91IHNwZWNpZnkgYSByb2xlIGhlcmUuIFRoZSBzZXJ2aWNlLWxpbmtlZCByb2xlIGlzIHJlcXVpcmVkIGlmIHlvdXIgdGFzayBkZWZpbml0aW9uIHVzZXMgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIG9yIGlmIHRoZSBzZXJ2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHNlcnZpY2UgZGlzY292ZXJ5LCBhbiBleHRlcm5hbCBkZXBsb3ltZW50IGNvbnRyb2xsZXIsIG11bHRpcGxlIHRhcmdldCBncm91cHMsIG9yIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9ycyBpbiB3aGljaCBjYXNlIHlvdSBkb24ndCBzcGVjaWZ5IGEgcm9sZSBoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBzZXJ2aWNlLWxpbmtlZCByb2xlcyBmb3IgQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB5b3VyIHNwZWNpZmllZCByb2xlIGhhcyBhIHBhdGggb3RoZXIgdGhhbiBgYC9gYCwgdGhlbiB5b3UgbXVzdCBlaXRoZXIgc3BlY2lmeSB0aGUgZnVsbCByb2xlIEFSTiAodGhpcyBpcyByZWNvbW1lbmRlZCkgb3IgcHJlZml4IHRoZSByb2xlIG5hbWUgd2l0aCB0aGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIGEgcm9sZSB3aXRoIHRoZSBuYW1lIGBgYmFyYGAgaGFzIGEgcGF0aCBvZiBgYC9mb28vYGAgdGhlbiB5b3Ugd291bGQgc3BlY2lmeSBgYC9mb28vYmFyYGAgYXMgdGhlIHJvbGUgbmFtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRnJpZW5kbHkgbmFtZXMgYW5kIHBhdGhzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lkZW50aWZpZXJzLmh0bWwjaWRlbnRpZmllcnMtZnJpZW5kbHktbmFtZXMpIGluIHRoZSAqSUFNIFVzZXIgR3VpZGUqLlxuICovXG5Sb2xlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBgYGZhbWlseWBgIGFuZCBgYHJldmlzaW9uYGAgKGBgZmFtaWx5OnJldmlzaW9uYGApIG9yIGZ1bGwgQVJOIG9mIHRoZSB0YXNrIGRlZmluaXRpb24gdG8gcnVuIGluIHlvdXIgc2VydmljZS4gSWYgYSBgYHJldmlzaW9uYGAgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IGBgQUNUSVZFYGAgcmV2aXNpb24gaXMgdXNlZC5cbiAqICBBIHRhc2sgZGVmaW5pdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgc2VydmljZSB1c2VzIGVpdGhlciB0aGUgYGBFQ1NgYCBvciBgYENPREVfREVQTE9ZYGAgZGVwbG95bWVudCBjb250cm9sbGVycy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZXBsb3ltZW50IHR5cGVzLCBzZWUgW0FtYXpvbiBFQ1MgZGVwbG95bWVudCB0eXBlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZGVwbG95bWVudC10eXBlcy5odG1sKS5cbiAqL1xuVGFza0RlZmluaXRpb24/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgeW91ciBzZXJ2aWNlLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuIFNlcnZpY2UgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgY2x1c3RlciwgYnV0IHlvdSBjYW4gaGF2ZSBzaW1pbGFybHkgbmFtZWQgc2VydmljZXMgaW4gbXVsdGlwbGUgY2x1c3RlcnMgd2l0aGluIGEgUmVnaW9uIG9yIGFjcm9zcyBtdWx0aXBsZSBSZWdpb25zLlxuICogICBUaGUgc3RhY2sgdXBkYXRlIGZhaWxzIGlmIHlvdSBjaGFuZ2UgYW55IHByb3BlcnRpZXMgdGhhdCByZXF1aXJlIHJlcGxhY2VtZW50IGFuZCB0aGUgYGBTZXJ2aWNlTmFtZWBgIGlzIGNvbmZpZ3VyZWQuIFRoaXMgaXMgYmVjYXVzZSBBV1MgQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnQgc2VydmljZSBmaXJzdCwgYnV0IGVhY2ggYGBTZXJ2aWNlTmFtZWBgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBjbHVzdGVyLlxuICovXG5TZXJ2aWNlTmFtZT86IHN0cmluZ1xuRGVwbG95bWVudENvbmZpZ3VyYXRpb24/OiBEZXBsb3ltZW50Q29uZmlndXJhdGlvblxufVxuLyoqXG4gKiBUaGUgdGFzayBwbGFjZW1lbnQgc3RyYXRlZ3kgZm9yIGEgdGFzayBvciBzZXJ2aWNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUYXNrIHBsYWNlbWVudCBzdHJhdGVnaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1zdHJhdGVnaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRTdHJhdGVneSB7XG4vKipcbiAqIFRoZSBmaWVsZCB0byBhcHBseSB0aGUgcGxhY2VtZW50IHN0cmF0ZWd5IGFnYWluc3QuIEZvciB0aGUgYGBzcHJlYWRgYCBwbGFjZW1lbnQgc3RyYXRlZ3ksIHZhbGlkIHZhbHVlcyBhcmUgYGBpbnN0YW5jZUlkYGAgKG9yIGBgaG9zdGBgLCB3aGljaCBoYXMgdGhlIHNhbWUgZWZmZWN0KSwgb3IgYW55IHBsYXRmb3JtIG9yIGN1c3RvbSBhdHRyaWJ1dGUgdGhhdCdzIGFwcGxpZWQgdG8gYSBjb250YWluZXIgaW5zdGFuY2UsIHN1Y2ggYXMgYGBhdHRyaWJ1dGU6ZWNzLmF2YWlsYWJpbGl0eS16b25lYGAuIEZvciB0aGUgYGBiaW5wYWNrYGAgcGxhY2VtZW50IHN0cmF0ZWd5LCB2YWxpZCB2YWx1ZXMgYXJlIGBgY3B1YGAgYW5kIGBgbWVtb3J5YGAuIEZvciB0aGUgYGByYW5kb21gYCBwbGFjZW1lbnQgc3RyYXRlZ3ksIHRoaXMgZmllbGQgaXMgbm90IHVzZWQuXG4gKi9cbkZpZWxkPzogc3RyaW5nXG4vKipcbiAqIFRoZSB0eXBlIG9mIHBsYWNlbWVudCBzdHJhdGVneS4gVGhlIGBgcmFuZG9tYGAgcGxhY2VtZW50IHN0cmF0ZWd5IHJhbmRvbWx5IHBsYWNlcyB0YXNrcyBvbiBhdmFpbGFibGUgY2FuZGlkYXRlcy4gVGhlIGBgc3ByZWFkYGAgcGxhY2VtZW50IHN0cmF0ZWd5IHNwcmVhZHMgcGxhY2VtZW50IGFjcm9zcyBhdmFpbGFibGUgY2FuZGlkYXRlcyBldmVubHkgYmFzZWQgb24gdGhlIGBgZmllbGRgYCBwYXJhbWV0ZXIuIFRoZSBgYGJpbnBhY2tgYCBzdHJhdGVneSBwbGFjZXMgdGFza3Mgb24gYXZhaWxhYmxlIGNhbmRpZGF0ZXMgdGhhdCBoYXZlIHRoZSBsZWFzdCBhdmFpbGFibGUgYW1vdW50IG9mIHRoZSByZXNvdXJjZSB0aGF0J3Mgc3BlY2lmaWVkIHdpdGggdGhlIGBgZmllbGRgYCBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgYmlucGFjayBvbiBtZW1vcnksIGEgdGFzayBpcyBwbGFjZWQgb24gdGhlIGluc3RhbmNlIHdpdGggdGhlIGxlYXN0IGFtb3VudCBvZiByZW1haW5pbmcgbWVtb3J5IGJ1dCBzdGlsbCBlbm91Z2ggdG8gcnVuIHRoZSB0YXNrLlxuICovXG5UeXBlOiAoXCJiaW5wYWNrXCIgfCBcInJhbmRvbVwiIHwgXCJzcHJlYWRcIilcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LlxuICogIEVhY2ggc2VydmljZSBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBNdWx0aXBsZSBzZXJ2aWNlIHJlZ2lzdHJpZXMgZm9yIGVhY2ggc2VydmljZSBhcmUgbm90IHN1cHBvcnRlZC5cbiAqICBXaGVuIHlvdSBhZGQsIHVwZGF0ZSwgb3IgcmVtb3ZlIHRoZSBzZXJ2aWNlIHJlZ2lzdHJpZXMgY29uZmlndXJhdGlvbiwgQW1hem9uIEVDUyBzdGFydHMgYSBuZXcgZGVwbG95bWVudC4gTmV3IHRhc2tzIGFyZSByZWdpc3RlcmVkIGFuZCBkZXJlZ2lzdGVyZWQgdG8gdGhlIHVwZGF0ZWQgc2VydmljZSByZWdpc3RyeSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4vKipcbiAqIFRoZSBjb250YWluZXIgbmFtZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB5b3VyIHNlcnZpY2UgZGlzY292ZXJ5IHNlcnZpY2UuIEl0J3MgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi4gSWYgdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdXIgc2VydmljZSB0YXNrIHNwZWNpZmllcyB1c2VzIHRoZSBgYGJyaWRnZWBgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IG11c3Qgc3BlY2lmeSBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24uIElmIHRoZSB0YXNrIGRlZmluaXRpb24gdGhhdCB5b3VyIHNlcnZpY2UgdGFzayBzcGVjaWZpZXMgdXNlcyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgYW5kIGEgdHlwZSBTUlYgRE5TIHJlY29yZCBpcyB1c2VkLCB5b3UgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBvciBhIGBgcG9ydGBgIHZhbHVlLiBIb3dldmVyLCB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoLlxuICovXG5Db250YWluZXJOYW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IHZhbHVlIHVzZWQgaWYgeW91ciBzZXJ2aWNlIGRpc2NvdmVyeSBzZXJ2aWNlIHNwZWNpZmllZCBhbiBTUlYgcmVjb3JkLiBUaGlzIGZpZWxkIG1pZ2h0IGJlIHVzZWQgaWYgYm90aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgYW5kIFNSViByZWNvcmRzIGFyZSB1c2VkLlxuICovXG5Qb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwb3J0IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHlvdXIgc2VydmljZSBkaXNjb3Zlcnkgc2VydmljZS4gSXQncyBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBJZiB0aGUgdGFzayBkZWZpbml0aW9uIHlvdXIgc2VydmljZSB0YXNrIHNwZWNpZmllcyB1c2VzIHRoZSBgYGJyaWRnZWBgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IG11c3Qgc3BlY2lmeSBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24uIElmIHRoZSB0YXNrIGRlZmluaXRpb24geW91ciBzZXJ2aWNlIHRhc2sgc3BlY2lmaWVzIHVzZXMgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGFuZCBhIHR5cGUgU1JWIEROUyByZWNvcmQgaXMgdXNlZCwgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSBgYGNvbnRhaW5lck5hbWVgYCBhbmQgYGBjb250YWluZXJQb3J0YGAgY29tYmluYXRpb24gb3IgYSBgYHBvcnRgYCB2YWx1ZS4gSG93ZXZlciwgeW91IGNhbid0IHNwZWNpZnkgYm90aC5cbiAqL1xuQ29udGFpbmVyUG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNlcnZpY2UgcmVnaXN0cnkuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHNlcnZpY2UgcmVnaXN0cnkgaXMgQ01BUC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRlU2VydmljZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkLW1hcC9sYXRlc3QvYXBpL0FQSV9DcmVhdGVTZXJ2aWNlLmh0bWwpLlxuICovXG5SZWdpc3RyeUFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgYSB2b2x1bWUgc3BlY2lmaWVkIGluIHRoZSB0YXNrIGRlZmluaXRpb24gYXMgYSB2b2x1bWUgdGhhdCBpcyBjb25maWd1cmVkIGF0IGxhdW5jaCB0aW1lLiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2b2x1bWUgdHlwZSBpcyBhbiBBbWF6b24gRUJTIHZvbHVtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVm9sdW1lQ29uZmlndXJhdGlvbiB7XG5NYW5hZ2VkRUJTVm9sdW1lPzogU2VydmljZU1hbmFnZWRFQlNWb2x1bWVDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUuIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdm9sdW1lIG5hbWUgZnJvbSB0aGUgYGBWb2x1bWVgYCBvYmplY3QgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQW1hem9uIEVCUyB2b2x1bWUgdGhhdCBBbWF6b24gRUNTIGNyZWF0ZXMgYW5kIG1hbmFnZXMgb24geW91ciBiZWhhbGYuIFRoZXNlIHNldHRpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBlYWNoIEFtYXpvbiBFQlMgdm9sdW1lLCB3aXRoIG9uZSB2b2x1bWUgY3JlYXRlZCBmb3IgZWFjaCB0YXNrIGluIHRoZSBzZXJ2aWNlLiBUaGUgQW1hem9uIEVCUyB2b2x1bWVzIGFyZSB2aXNpYmxlIGluIHlvdXIgYWNjb3VudCBpbiB0aGUgQW1hem9uIEVDMiBjb25zb2xlIG9uY2UgdGhleSBhcmUgY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTWFuYWdlZEVCU1ZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgc25hcHNob3QgdGhhdCBBbWF6b24gRUNTIHVzZXMgdG8gY3JlYXRlIHZvbHVtZXMgZm9yIGF0dGFjaG1lbnQgdG8gdGFza3MgbWFpbnRhaW5lZCBieSB0aGUgc2VydmljZS4gWW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYGBzbmFwc2hvdElkYGAgb3IgYGBzaXplSW5HaUJgYCBpbiB5b3VyIHZvbHVtZSBjb25maWd1cmF0aW9uLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFNuYXBzaG90SWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cblNuYXBzaG90SWQ/OiBzdHJpbmdcbi8qKlxuICogVGhlIHZvbHVtZSB0eXBlLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFZvbHVtZVR5cGVgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQlMgdm9sdW1lIHR5cGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWJzLXZvbHVtZS10eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgVXNlciBHdWlkZSouXG4gKiAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN1cHBvcnRlZCB2b2x1bWUgdHlwZXMuXG4gKiAgICsgIEdlbmVyYWwgUHVycG9zZSBTU0Q6IGBgZ3AyYGB8YGBncDNgYFxuICogICArICBQcm92aXNpb25lZCBJT1BTIFNTRDogYGBpbzFgYHxgYGlvMmBgXG4gKiAgICsgIFRocm91Z2hwdXQgT3B0aW1pemVkIEhERDogYGBzdDFgYFxuICogICArICBDb2xkIEhERDogYGBzYzFgYFxuICogICArICBNYWduZXRpYzogYGBzdGFuZGFyZGBgXG4gKiAgIFRoZSBtYWduZXRpYyB2b2x1bWUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIG9uIEZhcmdhdGUuXG4gKi9cblZvbHVtZVR5cGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIGlkZW50aWZpZXIgb2YgdGhlIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSB0byB1c2UgZm9yIEFtYXpvbiBFQlMgZW5jcnlwdGlvbi4gV2hlbiBhIGtleSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhpcyBwYXJhbWV0ZXIsIGl0IG92ZXJyaWRlcyBBbWF6b24gRUJTIGRlZmF1bHQgZW5jcnlwdGlvbiBvciBhbnkgS01TIGtleSB0aGF0IHlvdSBzcGVjaWZpZWQgZm9yIGNsdXN0ZXItbGV2ZWwgbWFuYWdlZCBzdG9yYWdlIGVuY3J5cHRpb24uIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgS21zS2V5SWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGVuY3J5cHRpbmcgQW1hem9uIEVCUyB2b2x1bWVzIGF0dGFjaGVkIHRvIHRhc2tzLCBzZWUgW0VuY3J5cHQgZGF0YSBzdG9yZWQgaW4gQW1hem9uIEVCUyB2b2x1bWVzIGF0dGFjaGVkIHRvIEFtYXpvbiBFQ1MgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vicy1rbXMtZW5jcnlwdGlvbi5odG1sKS5cbiAqICAgQVdTIGF1dGhlbnRpY2F0ZXMgdGhlIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSBhc3luY2hyb25vdXNseS4gVGhlcmVmb3JlLCBpZiB5b3Ugc3BlY2lmeSBhbiBJRCwgYWxpYXMsIG9yIEFSTiB0aGF0IGlzIGludmFsaWQsIHRoZSBhY3Rpb24gY2FuIGFwcGVhciB0byBjb21wbGV0ZSwgYnV0IGV2ZW50dWFsbHkgZmFpbHMuXG4gKi9cbkttc0tleUlkPzogc3RyaW5nXG4vKipcbiAqIFRoZSB0YWdzIHRvIGFwcGx5IHRvIHRoZSB2b2x1bWUuIEFtYXpvbiBFQ1MgYXBwbGllcyBzZXJ2aWNlLW1hbmFnZWQgdGFncyBieSBkZWZhdWx0LiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFRhZ1NwZWNpZmljYXRpb25zLk5gYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cblRhZ1NwZWNpZmljYXRpb25zPzogRUJTVGFnU3BlY2lmaWNhdGlvbltdXG4vKipcbiAqIFRoZSBmaWxlc3lzdGVtIHR5cGUgZm9yIHRoZSB2b2x1bWUuIEZvciB2b2x1bWVzIGNyZWF0ZWQgZnJvbSBhIHNuYXBzaG90LCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIGZpbGVzeXN0ZW0gdHlwZSB0aGF0IHRoZSB2b2x1bWUgd2FzIHVzaW5nIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBjcmVhdGVkLiBJZiB0aGVyZSBpcyBhIGZpbGVzeXN0ZW0gdHlwZSBtaXNtYXRjaCwgdGhlIHRhc2tzIHdpbGwgZmFpbCB0byBzdGFydC5cbiAqICBUaGUgYXZhaWxhYmxlIExpbnV4IGZpbGVzeXN0ZW0gdHlwZXMgYXJl4oCoIGBgZXh0M2BgLCBgYGV4dDRgYCwgYW5kIGBgeGZzYGAuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGBgeGZzYGAgZmlsZXN5c3RlbSB0eXBlIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqICBUaGUgYXZhaWxhYmxlIFdpbmRvd3MgZmlsZXN5c3RlbSB0eXBlcyBhcmUgYGBOVEZTYGAuXG4gKi9cbkZpbGVzeXN0ZW1UeXBlPzogc3RyaW5nXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGVuY3J5cHRlZC4gSWYgeW91IHR1cm4gb24gUmVnaW9uLWxldmVsIEFtYXpvbiBFQlMgZW5jcnlwdGlvbiBieSBkZWZhdWx0IGJ1dCBzZXQgdGhpcyB2YWx1ZSBhcyBgYGZhbHNlYGAsIHRoZSBzZXR0aW5nIGlzIG92ZXJyaWRkZW4gYW5kIHRoZSB2b2x1bWUgaXMgZW5jcnlwdGVkIHdpdGggdGhlIEtNUyBrZXkgc3BlY2lmaWVkIGZvciBBbWF6b24gRUJTIGVuY3J5cHRpb24gYnkgZGVmYXVsdC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyAxOjEgd2l0aCB0aGUgYGBFbmNyeXB0ZWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cbkVuY3J5cHRlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIHRocm91Z2hwdXQgdG8gcHJvdmlzaW9uIGZvciBhIHZvbHVtZSwgaW4gTWlCL3MsIHdpdGggYSBtYXhpbXVtIG9mIDEsMDAwIE1pQi9zLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFRocm91Z2hwdXRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgYGBncDNgYCB2b2x1bWUgdHlwZS5cbiAqL1xuVGhyb3VnaHB1dD86IG51bWJlclxuLyoqXG4gKiBUaGUgcmF0ZSwgaW4gTWlCL3MsIGF0IHdoaWNoIGRhdGEgaXMgZmV0Y2hlZCBmcm9tIGEgc25hcHNob3Qgb2YgYW4gZXhpc3RpbmcgRUJTIHZvbHVtZSB0byBjcmVhdGUgbmV3IHZvbHVtZXMgZm9yIGF0dGFjaG1lbnQgdG8gdGhlIHRhc2tzIG1haW50YWluZWQgYnkgdGhlIHNlcnZpY2UuIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNwZWNpZmllZCBvbmx5IGlmIHlvdSBzcGVjaWZ5IGEgYGBzbmFwc2hvdElkYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0luaXRpYWxpemUgQW1hem9uIEVCUyB2b2x1bWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWJzL2xhdGVzdC91c2VyZ3VpZGUvaW5pdGFsaXplLXZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQlMgVXNlciBHdWlkZSouXG4gKi9cblZvbHVtZUluaXRpYWxpemF0aW9uUmF0ZT86IG51bWJlclxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQgKElPUFMpLiBGb3IgYGBncDNgYCwgYGBpbzFgYCwgYW5kIGBgaW8yYGAgdm9sdW1lcywgdGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgSU9QUyB0aGF0IGFyZSBwcm92aXNpb25lZCBmb3IgdGhlIHZvbHVtZS4gRm9yIGBgZ3AyYGAgdm9sdW1lcywgdGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBwZXJmb3JtYW5jZSBvZiB0aGUgdm9sdW1lIGFuZCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdW1lIGFjY3VtdWxhdGVzIEkvTyBjcmVkaXRzIGZvciBidXJzdGluZy5cbiAqICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCB2b2x1bWUgdHlwZS5cbiAqICAgKyAgYGBncDNgYDogMywwMDAgLSAxNiwwMDAgSU9QU1xuICogICArICBgYGlvMWBgOiAxMDAgLSA2NCwwMDAgSU9QU1xuICogICArICBgYGlvMmBgOiAxMDAgLSAyNTYsMDAwIElPUFNcbiAqICAgXG4gKiAgVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIGBgaW8xYGAgYW5kIGBgaW8yYGAgdm9sdW1lIHR5cGVzLiBUaGUgZGVmYXVsdCBmb3IgYGBncDNgYCB2b2x1bWVzIGlzIGBgMywwMDAgSU9QU2BgLiBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYHN0MWBgLCBgYHNjMWBgLCBvciBgYHN0YW5kYXJkYGAgdm9sdW1lIHR5cGVzLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgSW9wc2BgIHBhcmFtZXRlciBvZiB0aGUgW0NyZWF0ZVZvbHVtZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVm9sdW1lLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDMiBBUEkgUmVmZXJlbmNlKi5cbiAqL1xuSW9wcz86IG51bWJlclxuLyoqXG4gKiBUaGUgc2l6ZSBvZiB0aGUgdm9sdW1lIGluIEdpQi4gWW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB2b2x1bWUgc2l6ZSBvciBhIHNuYXBzaG90IElELiBJZiB5b3Ugc3BlY2lmeSBhIHNuYXBzaG90IElELCB0aGUgc25hcHNob3Qgc2l6ZSBpcyB1c2VkIGZvciB0aGUgdm9sdW1lIHNpemUgYnkgZGVmYXVsdC4gWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSB2b2x1bWUgc2l6ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNuYXBzaG90IHNpemUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgU2l6ZWBgIHBhcmFtZXRlciBvZiB0aGUgW0NyZWF0ZVZvbHVtZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVm9sdW1lLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDMiBBUEkgUmVmZXJlbmNlKi5cbiAqICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3VwcG9ydGVkIHZvbHVtZSBzaXplIHZhbHVlcyBmb3IgZWFjaCB2b2x1bWUgdHlwZS5cbiAqICAgKyAgYGBncDJgYCBhbmQgYGBncDNgYDogMS0xNiwzODRcbiAqICAgKyAgYGBpbzFgYCBhbmQgYGBpbzJgYDogNC0xNiwzODRcbiAqICAgKyAgYGBzdDFgYCBhbmQgYGBzYzFgYDogMTI1LTE2LDM4NFxuICogICArICBgYHN0YW5kYXJkYGA6IDEtMSwwMjRcbiAqL1xuU2l6ZUluR2lCPzogbnVtYmVyXG4vKipcbiAqIFRoZSBBUk4gb2YgdGhlIElBTSByb2xlIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdm9sdW1lLiBUaGlzIGlzIHRoZSBBbWF6b24gRUNTIGluZnJhc3RydWN0dXJlIElBTSByb2xlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgeW91ciBBV1MgaW5mcmFzdHJ1Y3R1cmUuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgQW1hem9uIEVDUy1tYW5hZ2VkIGBgQW1hem9uRUNTSW5mcmFzdHJ1Y3R1cmVSb2xlUG9saWN5Rm9yVm9sdW1lc2BgIElBTSBwb2xpY3kgd2l0aCB0aGlzIHJvbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgaW5mcmFzdHJ1Y3R1cmUgSUFNIHJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2luZnJhc3RydWN0dXJlX0lBTV9yb2xlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Sb2xlQXJuOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHRhZyBzcGVjaWZpY2F0aW9ucyBvZiBhbiBBbWF6b24gRUJTIHZvbHVtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFQlNUYWdTcGVjaWZpY2F0aW9uIHtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHByb3BhZ2F0ZSB0aGUgdGFncyBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24gdG8g4oCodGhlIEFtYXpvbiBFQlMgdm9sdW1lLiBUYWdzIGNhbiBvbmx5IHByb3BhZ2F0ZSB0byBhIGBgU0VSVklDRWBgIHNwZWNpZmllZCBpbiDigKhgYFNlcnZpY2VWb2x1bWVDb25maWd1cmF0aW9uYGAuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIHRhZ3MgYXJlbid0IOKAqHByb3BhZ2F0ZWQuXG4gKi9cblByb3BhZ2F0ZVRhZ3M/OiAoXCJTRVJWSUNFXCIgfCBcIlRBU0tfREVGSU5JVElPTlwiKVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB2b2x1bWUgcmVzb3VyY2UuXG4gKi9cblJlc291cmNlVHlwZTogc3RyaW5nXG4vKipcbiAqIFRoZSB0YWdzIGFwcGxpZWQgdG8gdGhpcyBBbWF6b24gRUJTIHZvbHVtZS4gYGBBbWF6b25FQ1NDcmVhdGVkYGAgYW5kIGBgQW1hem9uRUNTTWFuYWdlZGBgIGFyZSByZXNlcnZlZCB0YWdzIHRoYXQgY2FuJ3QgYmUgdXNlZC5cbiAqL1xuVGFncz86IFRhZ1tdXG59XG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byBhIHJlc291cmNlIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSB0aGVtLlxuICogIFRoZSBmb2xsb3dpbmcgYmFzaWMgcmVzdHJpY3Rpb25zIGFwcGx5IHRvIHRhZ3M6XG4gKiAgICsgIE1heGltdW0gbnVtYmVyIG9mIHRhZ3MgcGVyIHJlc291cmNlIC0gNTBcbiAqICAgKyAgRm9yIGVhY2ggcmVzb3VyY2UsIGVhY2ggdGFnIGtleSBtdXN0IGJlIHVuaXF1ZSwgYW5kIGVhY2ggdGFnIGtleSBjYW4gaGF2ZSBvbmx5IG9uZSB2YWx1ZS5cbiAqICAgKyAgTWF4aW11bSBrZXkgbGVuZ3RoIC0gMTI4IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBNYXhpbXVtIHZhbHVlIGxlbmd0aCAtIDI1NiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgSWYgeW91ciB0YWdnaW5nIHNjaGVtYSBpcyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBzZXJ2aWNlcyBhbmQgcmVzb3VyY2VzLCByZW1lbWJlciB0aGF0IG90aGVyIHNlcnZpY2VzIG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIGNoYXJhY3RlcnMuIEdlbmVyYWxseSBhbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BhY2VzIHJlcHJlc2VudGFibGUgaW4gVVRGLTgsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICsgLSA9IC4gXyA6IC8gQC5cbiAqICAgKyAgVGFnIGtleXMgYW5kIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gKiAgICsgIERvIG5vdCB1c2UgYGBhd3M6YGAsIGBgQVdTOmBgLCBvciBhbnkgdXBwZXIgb3IgbG93ZXJjYXNlIGNvbWJpbmF0aW9uIG9mIHN1Y2ggYXMgYSBwcmVmaXggZm9yIGVpdGhlciBrZXlzIG9yIHZhbHVlcyBhcyBpdCBpcyByZXNlcnZlZCBmb3IgQVdTIHVzZS4gWW91IGNhbm5vdCBlZGl0IG9yIGRlbGV0ZSB0YWcga2V5cyBvciB2YWx1ZXMgd2l0aCB0aGlzIHByZWZpeC4gVGFncyB3aXRoIHRoaXMgcHJlZml4IGRvIG5vdCBjb3VudCBhZ2FpbnN0IHlvdXIgdGFncyBwZXIgcmVzb3VyY2UgbGltaXQuXG4gKiAgIFxuICogIEluIG9yZGVyIHRvIHRhZyBhIHNlcnZpY2UgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBBUk4gZm9ybWF0LCB5b3UgbmVlZCB0byBtaWdyYXRlIHRoZSBzZXJ2aWNlIHRvIHRoZSBsb25nIEFSTi4gWW91IG11c3QgdXNlIHRoZSBBUEksIENMSSBvciBjb25zb2xlIHRvIG1pZ3JhdGUgdGhlIHNlcnZpY2UgQVJOLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNaWdyYXRlIGFuIHNob3J0IHNlcnZpY2UgQVJOIHRvIGEgbG9uZyBBUk5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtYXJuLW1pZ3JhdGlvbi5odG1sKSBpbiB0aGUgKkRldmVsb3BlciBHdWlkZSouXG4gKiAgIGBgYXJuOmF3czplY3M6cmVnaW9uOmF3c19hY2NvdW50X2lkOnNlcnZpY2Uvc2VydmljZS1uYW1lYGAgXG4gKiAgQWZ0ZXIgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZSwgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTpcbiAqICAgKyAgIFRoZSBzZXJ2aWNlIEFSTiBpczogYGBhcm46YXdzOmVjczpyZWdpb246YXdzX2FjY291bnRfaWQ6c2VydmljZS9jbHVzdGVyLW5hbWUvc2VydmljZS1uYW1lYGBcbiAqICAgKyAgWW91IGNhbiB1c2UgQ0ZOIHRvIHRhZyB0aGUgc2VydmljZSBhcyB5b3Ugd291bGQgYSBzZXJ2aWNlIHdpdGggYSBsb25nIEFSTiBmb3JtYXQuXG4gKiAgICsgIFdoZW4gdGhlIGBgUGh5c2ljYWxSZXNvdXJjZUlkYGAgaW4gdGhlIENGTiBzdGFjayByZXByZXNlbnRzIGEgc2VydmljZSwgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBhbmQgd2lsbCBiZSB0aGUgc2hvcnQgc2VydmljZSBBUk4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbi8qKlxuICogVGhlIG9wdGlvbmFsIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGB2YWx1ZWBgIGFjdHMgYXMgYSBkZXNjcmlwdG9yIHdpdGhpbiBhIHRhZyBjYXRlZ29yeSAoa2V5KS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogT25lIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGBrZXlgYCBpcyBhIGdlbmVyYWwgbGFiZWwgdGhhdCBhY3RzIGxpa2UgYSBjYXRlZ29yeSBmb3IgbW9yZSBzcGVjaWZpYyB0YWcgdmFsdWVzLlxuICovXG5LZXk/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneS4gQSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBjYW4gYmUgc2V0IHdoZW4gdXNpbmcgdGhlIGBgUnVuVGFza2BgIG9yIGBgQ3JlYXRlU2VydmljZWBgIEFQSXMgb3IgYXMgdGhlIGRlZmF1bHQgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgZm9yIGEgY2x1c3RlciB3aXRoIHRoZSBgYENyZWF0ZUNsdXN0ZXJgYCBBUEkuXG4gKiAgT25seSBjYXBhY2l0eSBwcm92aWRlcnMgdGhhdCBhcmUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBjbHVzdGVyIGFuZCBoYXZlIGFuIGBgQUNUSVZFYGAgb3IgYGBVUERBVElOR2BgIHN0YXR1cyBjYW4gYmUgdXNlZCBpbiBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5LiBUaGUgYGBQdXRDbHVzdGVyQ2FwYWNpdHlQcm92aWRlcnNgYCBBUEkgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBjYXBhY2l0eSBwcm92aWRlciB3aXRoIGEgY2x1c3Rlci5cbiAqICBJZiBzcGVjaWZ5aW5nIGEgY2FwYWNpdHkgcHJvdmlkZXIgdGhhdCB1c2VzIGFuIEF1dG8gU2NhbGluZyBncm91cCwgdGhlIGNhcGFjaXR5IHByb3ZpZGVyIG11c3QgYWxyZWFkeSBiZSBjcmVhdGVkLiBOZXcgQXV0byBTY2FsaW5nIGdyb3VwIGNhcGFjaXR5IHByb3ZpZGVycyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBgYENyZWF0ZUNhcGFjaXR5UHJvdmlkZXJgYCBBUEkgb3BlcmF0aW9uLlxuICogIFRvIHVzZSBhbiBGQVJHQVRFbG9uZyBjYXBhY2l0eSBwcm92aWRlciwgc3BlY2lmeSBlaXRoZXIgdGhlIGBgRkFSR0FURWBgIG9yIGBgRkFSR0FURV9TUE9UYGAgY2FwYWNpdHkgcHJvdmlkZXJzLiBUaGUgRkFSR0FURWxvbmcgY2FwYWNpdHkgcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUgdG8gYWxsIGFjY291bnRzIGFuZCBvbmx5IG5lZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgY2x1c3RlciB0byBiZSB1c2VkIGluIGEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5SXRlbSB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjYXBhY2l0eSBwcm92aWRlci4gVGhpcyBjYW4gYmUgZWl0aGVyIGFuIEFXUyBtYW5hZ2VkIGNhcGFjaXR5IHByb3ZpZGVyIChgYEZBUkdBVEVgYCBvciBgYEZBUkdBVEVfU1BPVGBgKSBvciB0aGUgbmFtZSBvZiBhIGN1c3RvbSBjYXBhY2l0eSBwcm92aWRlciB0aGF0IHlvdSBjcmVhdGVkLlxuICovXG5DYXBhY2l0eVByb3ZpZGVyPzogc3RyaW5nXG4vKipcbiAqIFRoZSAqYmFzZSogdmFsdWUgZGVzaWduYXRlcyBob3cgbWFueSB0YXNrcywgYXQgYSBtaW5pbXVtLCB0byBydW4gb24gdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBwcm92aWRlciBmb3IgZWFjaCBzZXJ2aWNlLiBPbmx5IG9uZSBjYXBhY2l0eSBwcm92aWRlciBpbiBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IGNhbiBoYXZlIGEgKmJhc2UqIGRlZmluZWQuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGAwYGAgaXMgdXNlZC5cbiAqICBCYXNlIHZhbHVlIGNoYXJhY3RlcmlzdGljczpcbiAqICAgKyAgT25seSBvbmUgY2FwYWNpdHkgcHJvdmlkZXIgaW4gYSBzdHJhdGVneSBjYW4gaGF2ZSBhIGJhc2UgZGVmaW5lZFxuICogICArICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDBgYCBpZiBub3Qgc3BlY2lmaWVkXG4gKiAgICsgIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRvIDEwMCwwMDBcbiAqICAgKyAgQmFzZSByZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZCBmaXJzdCBiZWZvcmUgd2VpZ2h0IGRpc3RyaWJ1dGlvblxuICovXG5CYXNlPzogbnVtYmVyXG4vKipcbiAqIFRoZSAqd2VpZ2h0KiB2YWx1ZSBkZXNpZ25hdGVzIHRoZSByZWxhdGl2ZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MgbGF1bmNoZWQgdGhhdCBzaG91bGQgdXNlIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgcHJvdmlkZXIuIFRoZSBgYHdlaWdodGBgIHZhbHVlIGlzIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhZnRlciB0aGUgYGBiYXNlYGAgdmFsdWUsIGlmIGRlZmluZWQsIGlzIHNhdGlzZmllZC5cbiAqICBJZiBubyBgYHdlaWdodGBgIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGAwYGAgaXMgdXNlZC4gV2hlbiBtdWx0aXBsZSBjYXBhY2l0eSBwcm92aWRlcnMgYXJlIHNwZWNpZmllZCB3aXRoaW4gYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSwgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhY2l0eSBwcm92aWRlcnMgbXVzdCBoYXZlIGEgd2VpZ2h0IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBhbnkgY2FwYWNpdHkgcHJvdmlkZXJzIHdpdGggYSB3ZWlnaHQgb2YgYGAwYGAgY2FuJ3QgYmUgdXNlZCB0byBwbGFjZSB0YXNrcy4gSWYgeW91IHNwZWNpZnkgbXVsdGlwbGUgY2FwYWNpdHkgcHJvdmlkZXJzIGluIGEgc3RyYXRlZ3kgdGhhdCBhbGwgaGF2ZSBhIHdlaWdodCBvZiBgYDBgYCwgYW55IGBgUnVuVGFza2BgIG9yIGBgQ3JlYXRlU2VydmljZWBgIGFjdGlvbnMgdXNpbmcgdGhlIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IHdpbGwgZmFpbC5cbiAqICBXZWlnaHQgdmFsdWUgY2hhcmFjdGVyaXN0aWNzOlxuICogICArICBXZWlnaHQgaXMgY29uc2lkZXJlZCBhZnRlciB0aGUgYmFzZSB2YWx1ZSBpcyBzYXRpc2ZpZWRcbiAqICAgKyAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGAwYGAgaWYgbm90IHNwZWNpZmllZFxuICogICArICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0byAxLDAwMFxuICogICArICBBdCBsZWFzdCBvbmUgY2FwYWNpdHkgcHJvdmlkZXIgbXVzdCBoYXZlIGEgd2VpZ2h0IGdyZWF0ZXIgdGhhbiB6ZXJvXG4gKiAgICsgIENhcGFjaXR5IHByb3ZpZGVycyB3aXRoIHdlaWdodCBvZiBgYDBgYCBjYW5ub3QgcGxhY2UgdGFza3NcbiAqICAgXG4gKiAgVGFzayBkaXN0cmlidXRpb24gbG9naWM6XG4gKiAgIDEuICBCYXNlIHNhdGlzZmFjdGlvbjogVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRhc2tzIHNwZWNpZmllZCBieSB0aGUgYmFzZSB2YWx1ZSBhcmUgcGxhY2VkIG9uIHRoYXQgY2FwYWNpdHkgcHJvdmlkZXJcbiAqICAgMS4gIFdlaWdodCBkaXN0cmlidXRpb246IEFmdGVyIGJhc2UgcmVxdWlyZW1lbnRzIGFyZSBtZXQsIGFkZGl0aW9uYWwgdGFza3MgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB3ZWlnaHQgcmF0aW9zXG4gKiAgIFxuICogIEV4YW1wbGVzOlxuICogIEVxdWFsIERpc3RyaWJ1dGlvbjogVHdvIGNhcGFjaXR5IHByb3ZpZGVycyBib3RoIHdpdGggd2VpZ2h0IGBgMWBgIHdpbGwgc3BsaXQgdGFza3MgZXZlbmx5IGFmdGVyIGJhc2UgcmVxdWlyZW1lbnRzIGFyZSBtZXQuXG4gKiAgV2VpZ2h0ZWQgRGlzdHJpYnV0aW9uOiBJZiBjYXBhY2l0eVByb3ZpZGVyQSBoYXMgd2VpZ2h0IGBgMWBgIGFuZCBjYXBhY2l0eVByb3ZpZGVyQiBoYXMgd2VpZ2h0IGBgNGBgLCB0aGVuIGZvciBldmVyeSAxIHRhc2sgb24gQSwgNCB0YXNrcyB3aWxsIHJ1biBvbiBCLlxuICovXG5XZWlnaHQ/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlcnZpY2UuIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGZvciB0YXNrIGRlZmluaXRpb25zIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSB0byByZWNlaXZlIHRoZWlyIG93biBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlLCBhbmQgaXQgaXMgbm90IHN1cHBvcnRlZCBmb3Igb3RoZXIgbmV0d29yayBtb2Rlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtDb25maWd1cmF0aW9uIHtcbkF3c3ZwY0NvbmZpZ3VyYXRpb24/OiBBd3NWcGNDb25maWd1cmF0aW9uXG59XG4vKipcbiAqIFRoZSBWUEMgc3VibmV0cyBhbmQgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHRhc2suXG4gKiAgIEFsbCBzcGVjaWZpZWQgc3VibmV0cyBhbmQgc2VjdXJpdHkgZ3JvdXBzIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBWUEMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzVnBjQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIHNlY3VyaXR5IGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgb3Igc2VydmljZS4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSBzZWN1cml0eSBncm91cCwgdGhlIGRlZmF1bHQgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBWUEMgaXMgdXNlZC4gVGhlcmUncyBhIGxpbWl0IG9mIDUgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC5cbiAqICAgQWxsIHNwZWNpZmllZCBzZWN1cml0eSBncm91cHMgbXVzdCBiZSBmcm9tIHRoZSBzYW1lIFZQQy5cbiAqL1xuU2VjdXJpdHlHcm91cHM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgSURzIG9mIHRoZSBzdWJuZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBvciBzZXJ2aWNlLiBUaGVyZSdzIGEgbGltaXQgb2YgMTYgc3VibmV0cyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQuXG4gKiAgIEFsbCBzcGVjaWZpZWQgc3VibmV0cyBtdXN0IGJlIGZyb20gdGhlIHNhbWUgVlBDLlxuICovXG5TdWJuZXRzPzogc3RyaW5nW11cbi8qKlxuICogV2hldGhlciB0aGUgdGFzaydzIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UgcmVjZWl2ZXMgYSBwdWJsaWMgSVAgYWRkcmVzcy4gXG4gKiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyB3aGVuIHlvdSBzZXQgdGhpcyB2YWx1ZTpcbiAqICAgKyAgV2hlbiB5b3UgdXNlIGBgY3JlYXRlLXNlcnZpY2VgYCBvciBgYHVwZGF0ZS1zZXJ2aWNlYGAsIHRoZSBkZWZhdWx0IGlzIGBgRElTQUJMRURgYC4gXG4gKiAgICsgIFdoZW4gdGhlIHNlcnZpY2UgYGBkZXBsb3ltZW50Q29udHJvbGxlcmBgIGlzIGBgRUNTYGAsIHRoZSB2YWx1ZSBtdXN0IGJlIGBgRElTQUJMRURgYC5cbiAqL1xuQXNzaWduUHVibGljSXA/OiAoXCJESVNBQkxFRFwiIHwgXCJFTkFCTEVEXCIpXG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byBmb3JjZSBhIG5ldyBkZXBsb3ltZW50IG9mIHRoZSBzZXJ2aWNlLiBCeSBkZWZhdWx0LCBkZXBsb3ltZW50cyBhcmVuJ3QgZm9yY2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBzdGFydCBhIG5ldyBkZXBsb3ltZW50IHdpdGggbm8gc2VydmljZSBkZWZpbml0aW9uIGNoYW5nZXMuIEZvciBleGFtcGxlLCB5b3UgY2FuIHVwZGF0ZSBhIHNlcnZpY2UncyB0YXNrcyB0byB1c2UgYSBuZXdlciBEb2NrZXIgaW1hZ2Ugd2l0aCB0aGUgc2FtZSBpbWFnZS90YWcgY29tYmluYXRpb24gKGBgbXlfaW1hZ2U6bGF0ZXN0YGApIG9yIHRvIHJvbGwgRmFyZ2F0ZSB0YXNrcyBvbnRvIGEgbmV3ZXIgcGxhdGZvcm0gdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JjZU5ld0RlcGxveW1lbnQge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZm9yY2UgYSBuZXcgZGVwbG95bWVudCBvZiB0aGUgc2VydmljZS4gQnkgZGVmYXVsdCwgZGVwbG95bWVudHMgYXJlbid0IGZvcmNlZC4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3RhcnQgYSBuZXcgZGVwbG95bWVudCB3aXRoIG5vIHNlcnZpY2UgZGVmaW5pdGlvbiBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1cGRhdGUgYSBzZXJ2aWNlJ3MgdGFza3MgdG8gdXNlIGEgbmV3ZXIgRG9ja2VyIGltYWdlIHdpdGggdGhlIHNhbWUgaW1hZ2UvdGFnIGNvbWJpbmF0aW9uIChgYG15X2ltYWdlOmxhdGVzdGBgKSBvciB0byByb2xsIEZhcmdhdGUgdGFza3Mgb250byBhIG5ld2VyIHBsYXRmb3JtIHZlcnNpb24uXG4gKi9cbkVuYWJsZUZvcmNlTmV3RGVwbG95bWVudDogYm9vbGVhblxuLyoqXG4gKiBXaGVuIHlvdSBjaGFuZ2UgdGhlYGBGb3JjZU5ld0RlcGxveW1lbnROb25jZWBgIHZhbHVlIGluIHlvdXIgdGVtcGxhdGUsIGl0IHNpZ25hbHMgRUNTIHRvIHN0YXJ0IGEgbmV3IGRlcGxveW1lbnQgZXZlbiB0aG91Z2ggbm8gb3RoZXIgc2VydmljZSBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC4gVGhlIHZhbHVlIG11c3QgYmUgYSB1bmlxdWUsIHRpbWUtIHZhcnlpbmcgdmFsdWUgbGlrZSBhIHRpbWVzdGFtcCwgcmFuZG9tIHN0cmluZywgb3Igc2VxdWVuY2UgbnVtYmVyLiBVc2UgdGhpcyBwcm9wZXJ0eSB3aGVuIHlvdSB3YW50IHRvIGVuc3VyZSB5b3VyIHRhc2tzIHBpY2sgdXAgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgRG9ja2VyIGltYWdlIHRoYXQgdXNlcyB0aGUgc2FtZSB0YWcgYnV0IGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5Gb3JjZU5ld0RlcGxveW1lbnROb25jZT86IHN0cmluZ1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29uc3RyYWludCBvbiB0YXNrIHBsYWNlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBwbGFjZW1lbnQgY29uc3RyYWludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2stcGxhY2VtZW50LWNvbnN0cmFpbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0YXNrIHBsYWNlbWVudCBjb25zdHJhaW50cyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBVc2UgYGBkaXN0aW5jdEluc3RhbmNlYGAgdG8gZW5zdXJlIHRoYXQgZWFjaCB0YXNrIGluIGEgcGFydGljdWxhciBncm91cCBpcyBydW5uaW5nIG9uIGEgZGlmZmVyZW50IGNvbnRhaW5lciBpbnN0YW5jZS4gVXNlIGBgbWVtYmVyT2ZgYCB0byByZXN0cmljdCB0aGUgc2VsZWN0aW9uIHRvIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogKFwiZGlzdGluY3RJbnN0YW5jZVwiIHwgXCJtZW1iZXJPZlwiKVxuLyoqXG4gKiBBIGNsdXN0ZXIgcXVlcnkgbGFuZ3VhZ2UgZXhwcmVzc2lvbiB0byBhcHBseSB0byB0aGUgY29uc3RyYWludC4gVGhlIGV4cHJlc3Npb24gY2FuIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAyMDAwIGNoYXJhY3RlcnMuIFlvdSBjYW4ndCBzcGVjaWZ5IGFuIGV4cHJlc3Npb24gaWYgdGhlIGNvbnN0cmFpbnQgdHlwZSBpcyBgYGRpc3RpbmN0SW5zdGFuY2VgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2x1c3RlciBxdWVyeSBsYW5ndWFnZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY2x1c3Rlci1xdWVyeS1sYW5ndWFnZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkV4cHJlc3Npb24/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgTG9hZEJhbGFuY2VyYGAgcHJvcGVydHkgc3BlY2lmaWVzIGRldGFpbHMgb24gYSBsb2FkIGJhbGFuY2VyIHRoYXQgaXMgdXNlZCB3aXRoIGEgc2VydmljZS5cbiAqICBJZiB0aGUgc2VydmljZSBpcyB1c2luZyB0aGUgYGBDT0RFX0RFUExPWWBgIGRlcGxveW1lbnQgY29udHJvbGxlciwgdGhlIHNlcnZpY2UgaXMgcmVxdWlyZWQgdG8gdXNlIGVpdGhlciBhbiBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIG9yIE5ldHdvcmsgTG9hZCBCYWxhbmNlci4gV2hlbiB5b3UgYXJlIGNyZWF0aW5nIGFuIEFDRGxvbmcgZGVwbG95bWVudCBncm91cCwgeW91IHNwZWNpZnkgdHdvIHRhcmdldCBncm91cHMgKHJlZmVycmVkIHRvIGFzIGEgYGB0YXJnZXRHcm91cFBhaXJgYCkuIEVhY2ggdGFyZ2V0IGdyb3VwIGJpbmRzIHRvIGEgc2VwYXJhdGUgdGFzayBzZXQgaW4gdGhlIGRlcGxveW1lbnQuIFRoZSBsb2FkIGJhbGFuY2VyIGNhbiBhbHNvIGhhdmUgdXAgdG8gdHdvIGxpc3RlbmVycywgYSByZXF1aXJlZCBsaXN0ZW5lciBmb3IgcHJvZHVjdGlvbiB0cmFmZmljIGFuZCBhbiBvcHRpb25hbCBsaXN0ZW5lciB0aGF0IGFsbG93cyB5b3UgdG8gdGVzdCBuZXcgcmV2aXNpb25zIG9mIHRoZSBzZXJ2aWNlIGJlZm9yZSByb3V0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYyB0byBpdC5cbiAqICBTZXJ2aWNlcyB3aXRoIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSAoZm9yIGV4YW1wbGUsIHRob3NlIHdpdGggdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUpIG9ubHkgc3VwcG9ydCBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VycyBhbmQgTmV0d29yayBMb2FkIEJhbGFuY2Vycy4gQ2xhc3NpYyBMb2FkIEJhbGFuY2VycyBhcmUgbm90IHN1cHBvcnRlZC4gQWxzbywgd2hlbiB5b3UgY3JlYXRlIGFueSB0YXJnZXQgZ3JvdXBzIGZvciB0aGVzZSBzZXJ2aWNlcywgeW91IG11c3QgY2hvb3NlIGBgaXBgYCBhcyB0aGUgdGFyZ2V0IHR5cGUsIG5vdCBgYGluc3RhbmNlYGAuIFRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UsIG5vdCBhbiBBbWF6b24gRUMyIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlciB7XG4vKipcbiAqIFRoZSBmdWxsIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIHRhcmdldCBncm91cCBvciBncm91cHMgYXNzb2NpYXRlZCB3aXRoIGEgc2VydmljZSBvciB0YXNrIHNldC5cbiAqICBBIHRhcmdldCBncm91cCBBUk4gaXMgb25seSBzcGVjaWZpZWQgd2hlbiB1c2luZyBhbiBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIG9yIE5ldHdvcmsgTG9hZCBCYWxhbmNlci4gXG4gKiAgRm9yIHNlcnZpY2VzIHVzaW5nIHRoZSBgYEVDU2BgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBtdWx0aXBsZSB0YXJnZXQgZ3JvdXBzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSZWdpc3RlcmluZyBtdWx0aXBsZSB0YXJnZXQgZ3JvdXBzIHdpdGggYSBzZXJ2aWNlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9yZWdpc3Rlci1tdWx0aXBsZS10YXJnZXRncm91cHMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEZvciBzZXJ2aWNlcyB1c2luZyB0aGUgYGBDT0RFX0RFUExPWWBgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91J3JlIHJlcXVpcmVkIHRvIGRlZmluZSB0d28gdGFyZ2V0IGdyb3VwcyBmb3IgdGhlIGxvYWQgYmFsYW5jZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0JsdWUvZ3JlZW4gZGVwbG95bWVudCB3aXRoIENvZGVEZXBsb3ldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtdHlwZS1ibHVlZ3JlZW4uaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB5b3VyIHNlcnZpY2UncyB0YXNrIGRlZmluaXRpb24gdXNlcyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHlvdSBtdXN0IGNob29zZSBgYGlwYGAgYXMgdGhlIHRhcmdldCB0eXBlLCBub3QgYGBpbnN0YW5jZWBgLiBEbyB0aGlzIHdoZW4gY3JlYXRpbmcgeW91ciB0YXJnZXQgZ3JvdXBzIGJlY2F1c2UgdGFza3MgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgbm90IGFuIEFtYXpvbiBFQzIgaW5zdGFuY2UuIFRoaXMgbmV0d29yayBtb2RlIGlzIHJlcXVpcmVkIGZvciB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5cbiAqL1xuVGFyZ2V0R3JvdXBBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGxvYWQgYmFsYW5jZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhlIEFtYXpvbiBFQ1Mgc2VydmljZSBvciB0YXNrIHNldC5cbiAqICBJZiB5b3UgYXJlIHVzaW5nIGFuIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgb3IgYSBOZXR3b3JrIExvYWQgQmFsYW5jZXIgdGhlIGxvYWQgYmFsYW5jZXIgbmFtZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG9taXR0ZWQuXG4gKi9cbkxvYWRCYWxhbmNlck5hbWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciAoYXMgaXQgYXBwZWFycyBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uKSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAqICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBjb250YWluZXIgbmFtZSB3aGVuIGNvbmZpZ3VyaW5nIHRoZSB0YXJnZXQgZ3JvdXAgZm9yIGFuIEFtYXpvbiBFQ1MgbG9hZCBiYWxhbmNlci5cbiAqL1xuQ29udGFpbmVyTmFtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcG9ydCBvbiB0aGUgY29udGFpbmVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBsb2FkIGJhbGFuY2VyLiBUaGlzIHBvcnQgbXVzdCBjb3JyZXNwb25kIHRvIGEgYGBjb250YWluZXJQb3J0YGAgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgYXJlIHVzaW5nLiBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0aGV5J3JlIGxhdW5jaGVkIG9uIG11c3QgYWxsb3cgaW5ncmVzcyB0cmFmZmljIG9uIHRoZSBgYGhvc3RQb3J0YGAgb2YgdGhlIHBvcnQgbWFwcGluZy5cbiAqL1xuQ29udGFpbmVyUG9ydD86IG51bWJlclxuQWR2YW5jZWRDb25maWd1cmF0aW9uPzogQWR2YW5jZWRDb25maWd1cmF0aW9uXG59XG4vKipcbiAqIFRoZSBhZHZhbmNlZCBzZXR0aW5ncyBmb3IgdGhlIGxvYWQgYmFsYW5jZXIgdXNlZCBpbiBibHVlL2dyZWVuIGRlcGxveW1lbnRzLiBTcGVjaWZ5IHRoZSBhbHRlcm5hdGUgdGFyZ2V0IGdyb3VwLCBsaXN0ZW5lciBydWxlcywgYW5kIElBTSByb2xlIHJlcXVpcmVkIGZvciB0cmFmZmljIHNoaWZ0aW5nIGR1cmluZyBibHVlL2dyZWVuIGRlcGxveW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSB0aGF0IGlkZW50aWZpZXMgKSB0aGF0IGlkZW50aWZpZXMgdGhlIHRlc3QgbGlzdGVuZXIgcnVsZSAoaW4gdGhlIGNhc2Ugb2YgYW4gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgb3IgbGlzdGVuZXIgKGluIHRoZSBjYXNlIGZvciBhbiBOZXR3b3JrIExvYWQgQmFsYW5jZXIpIGZvciByb3V0aW5nIHRlc3QgdHJhZmZpYy5cbiAqL1xuVGVzdExpc3RlbmVyUnVsZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGFsdGVybmF0ZSB0YXJnZXQgZ3JvdXAgZm9yIEFtYXpvbiBFQ1MgYmx1ZS9ncmVlbiBkZXBsb3ltZW50cy5cbiAqL1xuQWx0ZXJuYXRlVGFyZ2V0R3JvdXBBcm46IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgdGhhdCB0aGF0IGlkZW50aWZpZXMgdGhlIHByb2R1Y3Rpb24gbGlzdGVuZXIgcnVsZSAoaW4gdGhlIGNhc2Ugb2YgYW4gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgb3IgbGlzdGVuZXIgKGluIHRoZSBjYXNlIGZvciBhbiBOZXR3b3JrIExvYWQgQmFsYW5jZXIpIGZvciByb3V0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYy5cbiAqL1xuUHJvZHVjdGlvbkxpc3RlbmVyUnVsZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQgZ3JhbnRzIEFtYXpvbiBFQ1MgcGVybWlzc2lvbiB0byBjYWxsIHRoZSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIEFQSXMgZm9yIHlvdS5cbiAqL1xuUm9sZUFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlIHRvIGRpc2NvdmVyIGFuZCBjb25uZWN0IHRvIHNlcnZpY2VzLCBhbmQgYmUgZGlzY292ZXJlZCBieSwgYW5kIGNvbm5lY3RlZCBmcm9tLCBvdGhlciBzZXJ2aWNlcyB3aXRoaW4gYSBuYW1lc3BhY2UuXG4gKiAgVGFza3MgdGhhdCBydW4gaW4gYSBuYW1lc3BhY2UgY2FuIHVzZSBzaG9ydCBuYW1lcyB0byBjb25uZWN0IHRvIHNlcnZpY2VzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNhbiBjb25uZWN0IHRvIHNlcnZpY2VzIGFjcm9zcyBhbGwgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNvbm5lY3QgdGhyb3VnaCBhIG1hbmFnZWQgcHJveHkgY29udGFpbmVyIHRoYXQgY29sbGVjdHMgbG9ncyBhbmQgbWV0cmljcyBmb3IgaW5jcmVhc2VkIHZpc2liaWxpdHkuIE9ubHkgdGhlIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBzZXJ2aWNlcyBjcmVhdGUgYXJlIHN1cHBvcnRlZCB3aXRoIFNlcnZpY2UgQ29ubmVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0Q29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBsaXN0IG9mIFNlcnZpY2UgQ29ubmVjdCBzZXJ2aWNlIG9iamVjdHMuIFRoZXNlIGFyZSBuYW1lcyBhbmQgYWxpYXNlcyAoYWxzbyBrbm93biBhcyBlbmRwb2ludHMpIHRoYXQgYXJlIHVzZWQgYnkgb3RoZXIgQW1hem9uIEVDUyBzZXJ2aWNlcyB0byBjb25uZWN0IHRvIHRoaXMgc2VydmljZS4gXG4gKiAgVGhpcyBmaWVsZCBpcyBub3QgcmVxdWlyZWQgZm9yIGEgXCJjbGllbnRcIiBBbWF6b24gRUNTIHNlcnZpY2UgdGhhdCdzIGEgbWVtYmVyIG9mIGEgbmFtZXNwYWNlIG9ubHkgdG8gY29ubmVjdCB0byBvdGhlciBzZXJ2aWNlcyB3aXRoaW4gdGhlIG5hbWVzcGFjZS4gQW4gZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGEgZnJvbnRlbmQgYXBwbGljYXRpb24gdGhhdCBhY2NlcHRzIGluY29taW5nIHJlcXVlc3RzIGZyb20gZWl0aGVyIGEgbG9hZCBiYWxhbmNlciB0aGF0J3MgYXR0YWNoZWQgdG8gdGhlIHNlcnZpY2Ugb3IgYnkgb3RoZXIgbWVhbnMuXG4gKiAgQW4gb2JqZWN0IHNlbGVjdHMgYSBwb3J0IGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiwgYXNzaWducyBhIG5hbWUgZm9yIHRoZSBDTUFQbG9uZyBzZXJ2aWNlLCBhbmQgYSBsaXN0IG9mIGFsaWFzZXMgKGVuZHBvaW50cykgYW5kIHBvcnRzIGZvciBjbGllbnQgYXBwbGljYXRpb25zIHRvIHJlZmVyIHRvIHRoaXMgc2VydmljZS5cbiAqL1xuU2VydmljZXM/OiBTZXJ2aWNlQ29ubmVjdFNlcnZpY2VbXVxuQWNjZXNzTG9nQ29uZmlndXJhdGlvbj86IFNlcnZpY2VDb25uZWN0QWNjZXNzTG9nQ29uZmlndXJhdGlvblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgU2VydmljZSBDb25uZWN0IHdpdGggdGhpcyBzZXJ2aWNlLlxuICovXG5FbmFibGVkOiBib29sZWFuXG5Mb2dDb25maWd1cmF0aW9uPzogTG9nQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbmFtZXNwYWNlIG5hbWUgb3IgZnVsbCBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgQ01BUGxvbmcgbmFtZXNwYWNlIGZvciB1c2Ugd2l0aCBTZXJ2aWNlIENvbm5lY3QuIFRoZSBuYW1lc3BhY2UgbXVzdCBiZSBpbiB0aGUgc2FtZSBBV1MgUmVnaW9uIGFzIHRoZSBBbWF6b24gRUNTIHNlcnZpY2UgYW5kIGNsdXN0ZXIuIFRoZSB0eXBlIG9mIG5hbWVzcGFjZSBkb2Vzbid0IGFmZmVjdCBTZXJ2aWNlIENvbm5lY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENNQVBsb25nLCBzZWUgW1dvcmtpbmcgd2l0aCBTZXJ2aWNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkLW1hcC9sYXRlc3QvZGcvd29ya2luZy13aXRoLXNlcnZpY2VzLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuTmFtZXNwYWNlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZSBvYmplY3QgY29uZmlndXJhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0U2VydmljZSB7XG5UaW1lb3V0PzogVGltZW91dENvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIGZvciB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5IHRvIGxpc3RlbiBvbi5cbiAqICBVc2UgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgdG8gYnlwYXNzIHRoZSBwcm94eSBmb3IgdHJhZmZpYyBvbiB0aGUgcG9ydCBudW1iZXIgc3BlY2lmaWVkIGluIHRoZSBuYW1lZCBgYHBvcnRNYXBwaW5nYGAgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiBvZiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlbiB1c2UgaXQgaW4geW91ciBWUEMgc2VjdXJpdHkgZ3JvdXBzIHRvIGFsbG93IHRyYWZmaWMgaW50byB0aGUgcHJveHkgZm9yIHRoaXMgQW1hem9uIEVDUyBzZXJ2aWNlLlxuICogIEluIGBgYXdzdnBjYGAgbW9kZSBhbmQgRmFyZ2F0ZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBwb3J0IG51bWJlci4gVGhlIGNvbnRhaW5lciBwb3J0IG51bWJlciBpcyBpbiB0aGUgYGBwb3J0TWFwcGluZ2BgIGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEluIGJyaWRnZSBtb2RlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZXBoZW1lcmFsIHBvcnQgb2YgdGhlIFNlcnZpY2UgQ29ubmVjdCBwcm94eS5cbiAqL1xuSW5ncmVzc1BvcnRPdmVycmlkZT86IG51bWJlclxuLyoqXG4gKiBUaGUgbGlzdCBvZiBjbGllbnQgYWxpYXNlcyBmb3IgdGhpcyBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gWW91IHVzZSB0aGVzZSB0byBhc3NpZ24gbmFtZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50IGFsaWFzZXMgdGhhdCB5b3UgY2FuIGhhdmUgaW4gdGhpcyBsaXN0IGlzIDEuXG4gKiAgRWFjaCBhbGlhcyAoXCJlbmRwb2ludFwiKSBpcyBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGFuZCBwb3J0IG51bWJlciB0aGF0IG90aGVyIEFtYXpvbiBFQ1MgdGFza3MgKFwiY2xpZW50c1wiKSBjYW4gdXNlIHRvIGNvbm5lY3QgdG8gdGhpcyBzZXJ2aWNlLlxuICogIEVhY2ggbmFtZSBhbmQgcG9ydCBtYXBwaW5nIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbmFtZXNwYWNlLlxuICogIEZvciBlYWNoIGBgU2VydmljZUNvbm5lY3RTZXJ2aWNlYGAsIHlvdSBtdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGBgY2xpZW50QWxpYXNgYCB3aXRoIG9uZSBgYHBvcnRgYC5cbiAqL1xuQ2xpZW50QWxpYXNlcz86IFNlcnZpY2VDb25uZWN0Q2xpZW50QWxpYXNbXVxuVGxzPzogU2VydmljZUNvbm5lY3RUbHNDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBgYGRpc2NvdmVyeU5hbWVgYCBpcyB0aGUgbmFtZSBvZiB0aGUgbmV3IENNQVAgc2VydmljZSB0aGF0IEFtYXpvbiBFQ1MgY3JlYXRlcyBmb3IgdGhpcyBBbWF6b24gRUNTIHNlcnZpY2UuIFRoaXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBDTUFQIG5hbWVzcGFjZS4gVGhlIG5hbWUgY2FuIGNvbnRhaW4gdXAgdG8gNjQgY2hhcmFjdGVycy4gVGhlIG5hbWUgY2FuIGluY2x1ZGUgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzIChfKSwgYW5kIGh5cGhlbnMgKC0pLiBUaGUgbmFtZSBjYW4ndCBzdGFydCB3aXRoIGEgaHlwaGVuLlxuICogIElmIHRoZSBgYGRpc2NvdmVyeU5hbWVgYCBpc24ndCBzcGVjaWZpZWQsIHRoZSBwb3J0IG1hcHBpbmcgbmFtZSBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24gaXMgdXNlZCBpbiBgYHBvcnROYW1lLm5hbWVzcGFjZWBgLlxuICovXG5EaXNjb3ZlcnlOYW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBgYHBvcnROYW1lYGAgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGBgcG9ydE1hcHBpbmdzYGAgZnJvbSBhbGwgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiBvZiB0aGlzIEFtYXpvbiBFQ1Mgc2VydmljZS5cbiAqL1xuUG9ydE5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjb25maWd1cmVkIHRpbWVvdXRzIGZvciBTZXJ2aWNlIENvbm5lY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZW91dENvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgYW1vdW50IG9mIHRpbWUgd2FpdGluZyBmb3IgdGhlIHVwc3RyZWFtIHRvIHJlc3BvbmQgd2l0aCBhIGNvbXBsZXRlIHJlc3BvbnNlIHBlciByZXF1ZXN0LiBBIHZhbHVlIG9mIGBgMGBgIGNhbiBiZSBzZXQgdG8gZGlzYWJsZSBgYHBlclJlcXVlc3RUaW1lb3V0YGAuIGBgcGVyUmVxdWVzdFRpbWVvdXRgYCBjYW4gb25seSBiZSBzZXQgaWYgU2VydmljZSBDb25uZWN0IGBgYXBwUHJvdG9jb2xgYCBpc24ndCBgYFRDUGBgLiBPbmx5IGBgaWRsZVRpbWVvdXRgYCBpcyBhbGxvd2VkIGZvciBgYFRDUGBgYGBhcHBQcm90b2NvbGBgLlxuICovXG5QZXJSZXF1ZXN0VGltZW91dFNlY29uZHM/OiBudW1iZXJcbi8qKlxuICogVGhlIGFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgYSBjb25uZWN0aW9uIHdpbGwgc3RheSBhY3RpdmUgd2hpbGUgaWRsZS4gQSB2YWx1ZSBvZiBgYDBgYCBjYW4gYmUgc2V0IHRvIGRpc2FibGUgYGBpZGxlVGltZW91dGBgLlxuICogIFRoZSBgYGlkbGVUaW1lb3V0YGAgZGVmYXVsdCBmb3IgYGBIVFRQYGAvYGBIVFRQMmBgL2BgR1JQQ2BgIGlzIDUgbWludXRlcy5cbiAqICBUaGUgYGBpZGxlVGltZW91dGBgIGRlZmF1bHQgZm9yIGBgVENQYGAgaXMgMSBob3VyLlxuICovXG5JZGxlVGltZW91dFNlY29uZHM/OiBudW1iZXJcbn1cbi8qKlxuICogRWFjaCBhbGlhcyAoXCJlbmRwb2ludFwiKSBpcyBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGFuZCBwb3J0IG51bWJlciB0aGF0IG90aGVyIHRhc2tzIChcImNsaWVudHNcIikgY2FuIHVzZSB0byBjb25uZWN0IHRvIHRoaXMgc2VydmljZS5cbiAqICBFYWNoIG5hbWUgYW5kIHBvcnQgbWFwcGluZyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIG5hbWVzcGFjZS5cbiAqICBUYXNrcyB0aGF0IHJ1biBpbiBhIG5hbWVzcGFjZSBjYW4gdXNlIHNob3J0IG5hbWVzIHRvIGNvbm5lY3QgdG8gc2VydmljZXMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY2FuIGNvbm5lY3QgdG8gc2VydmljZXMgYWNyb3NzIGFsbCBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY29ubmVjdCB0aHJvdWdoIGEgbWFuYWdlZCBwcm94eSBjb250YWluZXIgdGhhdCBjb2xsZWN0cyBsb2dzIGFuZCBtZXRyaWNzIGZvciBpbmNyZWFzZWQgdmlzaWJpbGl0eS4gT25seSB0aGUgdGFza3MgdGhhdCBBbWF6b24gRUNTIHNlcnZpY2VzIGNyZWF0ZSBhcmUgc3VwcG9ydGVkIHdpdGggU2VydmljZSBDb25uZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aWNlIENvbm5lY3RdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtY29ubmVjdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RDbGllbnRBbGlhcyB7XG4vKipcbiAqIFRoZSBgYGRuc05hbWVgYCBpcyB0aGUgbmFtZSB0aGF0IHlvdSB1c2UgaW4gdGhlIGFwcGxpY2F0aW9ucyBvZiBjbGllbnQgdGFza3MgdG8gY29ubmVjdCB0byB0aGlzIHNlcnZpY2UuIFRoZSBuYW1lIG11c3QgYmUgYSB2YWxpZCBETlMgbmFtZSBidXQgZG9lc24ndCBuZWVkIHRvIGJlIGZ1bGx5LXF1YWxpZmllZC4gVGhlIG5hbWUgY2FuIGluY2x1ZGUgdXAgdG8gMTI3IGNoYXJhY3RlcnMuIFRoZSBuYW1lIGNhbiBpbmNsdWRlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyAoXyksIGh5cGhlbnMgKC0pLCBhbmQgcGVyaW9kcyAoLikuIFRoZSBuYW1lIGNhbid0IHN0YXJ0IHdpdGggYSBoeXBoZW4uXG4gKiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYGRpc2NvdmVyeU5hbWUubmFtZXNwYWNlYGAgaXMgdXNlZC4gSWYgdGhlIGBgZGlzY292ZXJ5TmFtZWBgIGlzbid0IHNwZWNpZmllZCwgdGhlIHBvcnQgbWFwcGluZyBuYW1lIGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiBpcyB1c2VkIGluIGBgcG9ydE5hbWUubmFtZXNwYWNlYGAuXG4gKiAgVG8gYXZvaWQgY2hhbmdpbmcgeW91ciBhcHBsaWNhdGlvbnMgaW4gY2xpZW50IEFtYXpvbiBFQ1Mgc2VydmljZXMsIHNldCB0aGlzIHRvIHRoZSBzYW1lIG5hbWUgdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdC4gRm9yIGV4YW1wbGUsIGEgZmV3IGNvbW1vbiBuYW1lcyBhcmUgYGBkYXRhYmFzZWBgLCBgYGRiYGAsIG9yIHRoZSBsb3dlcmNhc2UgbmFtZSBvZiBhIGRhdGFiYXNlLCBzdWNoIGFzIGBgbXlzcWxgYCBvciBgYHJlZGlzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2UgQ29ubmVjdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1jb25uZWN0Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRG5zTmFtZT86IHN0cmluZ1xuVGVzdFRyYWZmaWNSdWxlcz86IFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc1xuLyoqXG4gKiBUaGUgbGlzdGVuaW5nIHBvcnQgbnVtYmVyIGZvciB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5LiBUaGlzIHBvcnQgaXMgYXZhaWxhYmxlIGluc2lkZSBvZiBhbGwgb2YgdGhlIHRhc2tzIHdpdGhpbiB0aGUgc2FtZSBuYW1lc3BhY2UuXG4gKiAgVG8gYXZvaWQgY2hhbmdpbmcgeW91ciBhcHBsaWNhdGlvbnMgaW4gY2xpZW50IEFtYXpvbiBFQ1Mgc2VydmljZXMsIHNldCB0aGlzIHRvIHRoZSBzYW1lIHBvcnQgdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Qb3J0OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRlc3QgdHJhZmZpYyByb3V0aW5nIHJ1bGVzIHVzZWQgZHVyaW5nIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMgd2l0aCBBbWF6b24gRUNTIFNlcnZpY2UgQ29ubmVjdC4gVGhpcyBhbGxvd3MgeW91IHRvIHJvdXRlIGEgcG9ydGlvbiBvZiB0cmFmZmljIHRvIHRoZSBuZXcgc2VydmljZSByZXZpc2lvbiBvZiB5b3VyIHNlcnZpY2UgZm9yIHRlc3RpbmcgYmVmb3JlIHNoaWZ0aW5nIGFsbCBwcm9kdWN0aW9uIHRyYWZmaWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzIHtcbkhlYWRlcjogU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzSGVhZGVyXG59XG4vKipcbiAqIFRoZSBIVFRQIGhlYWRlci1iYXNlZCByb3V0aW5nIHJ1bGVzIHRoYXQgZGV0ZXJtaW5lIHdoaWNoIHJlcXVlc3RzIHNob3VsZCBiZSByb3V0ZWQgdG8gdGhlIG5ldyBzZXJ2aWNlIHZlcnNpb24gZHVyaW5nIGJsdWUvZ3JlZW4gZGVwbG95bWVudCB0ZXN0aW5nLiBUaGVzZSBydWxlcyBwcm92aWRlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGVzdCB0cmFmZmljIHJvdXRpbmcgYmFzZWQgb24gcmVxdWVzdCBoZWFkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc0hlYWRlciB7XG5WYWx1ZT86IFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc0hlYWRlclZhbHVlXG5OYW1lOiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzSGVhZGVyVmFsdWUge1xuRXhhY3Q6IHN0cmluZ1xufVxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUbHNDb25maWd1cmF0aW9uIHtcbklzc3VlckNlcnRpZmljYXRlQXV0aG9yaXR5OiBTZXJ2aWNlQ29ubmVjdFRsc0NlcnRpZmljYXRlQXV0aG9yaXR5XG4vKipcbiAqIFRoZSBBV1MgS2V5IE1hbmFnZW1lbnQgU2VydmljZSBrZXkuXG4gKi9cbkttc0tleT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgQ29ubmVjdCBUTFMuXG4gKi9cblJvbGVBcm4/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHNpZ25lciBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUbHNDZXJ0aWZpY2F0ZUF1dGhvcml0eSB7XG4vKipcbiAqIFRoZSBBUk4gb2YgdGhlIEFXUyBQcml2YXRlIENlcnRpZmljYXRlIEF1dGhvcml0eSBjZXJ0aWZpY2F0ZS5cbiAqL1xuQXdzUGNhQXV0aG9yaXR5QXJuPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBTZXJ2aWNlIENvbm5lY3QgYWNjZXNzIGxvZ2dpbmcuIEFjY2VzcyBsb2dzIGNhcHR1cmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWVzdHMgbWFkZSB0byB5b3VyIHNlcnZpY2UsIGluY2x1ZGluZyByZXF1ZXN0IHBhdHRlcm5zLCByZXNwb25zZSBjb2RlcywgYW5kIHRpbWluZyBkYXRhLiBUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBjb25uZWN0aXZpdHkgaXNzdWVzLCBtb25pdG9yaW5nIHNlcnZpY2UgcGVyZm9ybWFuY2UsIGFuZCBhdWRpdGluZyBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbiBmb3Igc2VjdXJpdHkgYW5kIGNvbXBsaWFuY2UgcHVycG9zZXMuXG4gKiAgIFRvIGVuYWJsZSBhY2Nlc3MgbG9ncywgeW91IG11c3QgYWxzbyBzcGVjaWZ5IGEgYGBsb2dDb25maWd1cmF0aW9uYGAgaW4gdGhlIGBgc2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uYGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RBY2Nlc3NMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIGZvcm1hdCBmb3IgU2VydmljZSBDb25uZWN0IGFjY2VzcyBsb2cgb3V0cHV0LiBDaG9vc2UgVEVYVCBmb3IgaHVtYW4tcmVhZGFibGUgbG9ncyBvciBKU09OIGZvciBzdHJ1Y3R1cmVkIGRhdGEgdGhhdCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBsb2cgYW5hbHlzaXMgdG9vbHMuXG4gKi9cbkZvcm1hdDogKFwiVEVYVFwiIHwgXCJKU09OXCIpXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGluY2x1ZGUgcXVlcnkgcGFyYW1ldGVycyBpbiBTZXJ2aWNlIENvbm5lY3QgYWNjZXNzIGxvZ3MuXG4gKiAgV2hlbiBlbmFibGVkLCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gSFRUUCByZXF1ZXN0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFjY2VzcyBsb2dzLiBDb25zaWRlciBzZWN1cml0eSBhbmQgcHJpdmFjeSBpbXBsaWNhdGlvbnMgd2hlbiBlbmFibGluZyB0aGlzIGZlYXR1cmUsIGFzIHF1ZXJ5IHBhcmFtZXRlcnMgbWF5IGNvbnRhaW4gc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVxdWVzdCBJRHMgYW5kIHRva2Vucy4gQnkgZGVmYXVsdCwgdGhpcyBwYXJhbWV0ZXIgaXMgYGBESVNBQkxFRGBgLlxuICovXG5JbmNsdWRlUXVlcnlQYXJhbWV0ZXJzPzogKFwiRElTQUJMRURcIiB8IFwiRU5BQkxFRFwiKVxufVxuLyoqXG4gKiBUaGUgbG9nIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sb2ctZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsb2dnaW5nIGRyaXZlciB0aGFuIHRoZSBEb2NrZXIgZGFlbW9uIGJ5IHNwZWNpZnlpbmcgYSBsb2cgZHJpdmVyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIFVuZGVyc3RhbmQgdGhlIGZvbGxvd2luZyB3aGVuIHNwZWNpZnlpbmcgYSBsb2cgY29uZmlndXJhdGlvbiBmb3IgeW91ciBjb250YWluZXJzLlxuICogICArICBBbWF6b24gRUNTIGN1cnJlbnRseSBzdXBwb3J0cyBhIHN1YnNldCBvZiB0aGUgbG9nZ2luZyBkcml2ZXJzIGF2YWlsYWJsZSB0byB0aGUgRG9ja2VyIGRhZW1vbi4gQWRkaXRpb25hbCBsb2cgZHJpdmVycyBtYXkgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsYGBzeXNsb2dgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLlxuICogICArICBGb3IgdGFza3MgdGhhdCBhcmUgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgbXVzdCByZWdpc3RlciB0aGUgYXZhaWxhYmxlIGxvZ2dpbmcgZHJpdmVycyB3aXRoIHRoZSBgYEVDU19BVkFJTEFCTEVfTE9HR0lOR19EUklWRVJTYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBsb2cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgYXJlIG9uIEZBUkdBVEVsb25nLCBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbmZyYXN0cnVjdHVyZSB5b3VyIHRhc2tzIGFyZSBob3N0ZWQgb24sIGFueSBhZGRpdGlvbmFsIHNvZnR3YXJlIG5lZWRlZCBtdXN0IGJlIGluc3RhbGxlZCBvdXRzaWRlIG9mIHRoZSB0YXNrLiBGb3IgZXhhbXBsZSwgdGhlIEZsdWVudGQgb3V0cHV0IGFnZ3JlZ2F0b3JzIG9yIGEgcmVtb3RlIGhvc3QgcnVubmluZyBMb2dzdGFzaCB0byBzZW5kIEdlbGYgbG9ncyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgbG9nIGNvbmZpZ3VyYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRPcHRpb25zPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzZW5kIHRvIHRoZSBsb2cgZHJpdmVyLlxuICogIFRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSBkZXBlbmQgb24gdGhlIGxvZyBkcml2ZXIuIFNvbWUgb2YgdGhlIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4geW91IHVzZSB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciB0byByb3V0ZSBsb2dzIHRvIEFtYXpvbiBDbG91ZFdhdGNoIGluY2x1ZGUgdGhlIGZvbGxvd2luZzpcbiAqICAgKyBhd3Nsb2dzLWNyZWF0ZS1ncm91cCBSZXF1aXJlZDogTm8gU3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRoZSBsb2cgZ3JvdXAgdG8gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLiBZb3VyIElBTSBwb2xpY3kgbXVzdCBpbmNsdWRlIHRoZSBsb2dzOkNyZWF0ZUxvZ0dyb3VwIHBlcm1pc3Npb24gYmVmb3JlIHlvdSBhdHRlbXB0IHRvIHVzZSBhd3Nsb2dzLWNyZWF0ZS1ncm91cC4gKyBhd3Nsb2dzLXJlZ2lvbiBSZXF1aXJlZDogWWVzIFNwZWNpZnkgdGhlIFJlZ2lvbiB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgaXMgdG8gc2VuZCB5b3VyIERvY2tlciBsb2dzIHRvLiBZb3UgY2FuIGNob29zZSB0byBzZW5kIGFsbCBvZiB5b3VyIGxvZ3MgZnJvbSBjbHVzdGVycyBpbiBkaWZmZXJlbnQgUmVnaW9ucyB0byBhIHNpbmdsZSByZWdpb24gaW4gQ2xvdWRXYXRjaCBMb2dzLiBUaGlzIGlzIHNvIHRoYXQgdGhleSdyZSBhbGwgdmlzaWJsZSBpbiBvbmUgbG9jYXRpb24uIE90aGVyd2lzZSwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGJ5IFJlZ2lvbiBmb3IgbW9yZSBncmFudWxhcml0eS4gTWFrZSBzdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2cgZ3JvdXAgZXhpc3RzIGluIHRoZSBSZWdpb24gdGhhdCB5b3Ugc3BlY2lmeSB3aXRoIHRoaXMgb3B0aW9uLiArIGF3c2xvZ3MtZ3JvdXAgUmVxdWlyZWQ6IFllcyBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhIGxvZyBncm91cCB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgc2VuZHMgaXRzIGxvZyBzdHJlYW1zIHRvLiArIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBSZXF1aXJlZDogWWVzLCB3aGVuIHVzaW5nIEZhcmdhdGUuT3B0aW9uYWwgd2hlbiB1c2luZyBFQzIuIFVzZSB0aGUgYXdzbG9ncy1zdHJlYW0tcHJlZml4IG9wdGlvbiB0byBhc3NvY2lhdGUgYSBsb2cgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHRoZSBjb250YWluZXIgbmFtZSwgYW5kIHRoZSBJRCBvZiB0aGUgQW1hem9uIEVDUyB0YXNrIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLiBJZiB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIHRha2VzIHRoZSBmb3JtYXQgcHJlZml4LW5hbWUvY29udGFpbmVyLW5hbWUvZWNzLXRhc2staWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24sIHRoZW4gdGhlIGxvZyBzdHJlYW0gaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBJRCB0aGF0J3MgYXNzaWduZWQgYnkgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS4gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byB0cmFjZSBsb2dzIGJhY2sgdG8gdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSB3aXRoIGp1c3QgdGhlIERvY2tlciBjb250YWluZXIgSUQgKHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UpLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLiBGb3IgQW1hem9uIEVDUyBzZXJ2aWNlcywgeW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgbmFtZSBhcyB0aGUgcHJlZml4LiBEb2luZyBzbywgeW91IGNhbiB0cmFjZSBsb2cgc3RyZWFtcyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0bywgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSwgYW5kIHRoZSBJRCBvZiB0aGUgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gWW91IG11c3Qgc3BlY2lmeSBhIHN0cmVhbS1wcmVmaXggZm9yIHlvdXIgbG9ncyB0byBoYXZlIHlvdXIgbG9ncyBhcHBlYXIgaW4gdGhlIExvZyBwYW5lIHdoZW4gdXNpbmcgdGhlIEFtYXpvbiBFQ1MgY29uc29sZS4gKyBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIGluIFB5dGhvbiBzdHJmdGltZSBmb3JtYXQuIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gT25lIGV4YW1wbGUgb2YgYSB1c2UgY2FzZSBmb3IgdXNpbmcgdGhpcyBmb3JtYXQgaXMgZm9yIHBhcnNpbmcgb3V0cHV0IHN1Y2ggYXMgYSBzdGFjayBkdW1wLCB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgbG9nZ2VkIGluIG11bHRpcGxlIGVudHJpZXMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gYWxsb3dzIGl0IHRvIGJlIGNhcHR1cmVkIGluIGEgc2luZ2xlIGVudHJ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0LiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuICsgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIHRoYXQgdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQSBsb2cgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGFuZCBhbnkgZm9sbG93aW5nIGxpbmVzIHRoYXQgZG9u4oCZdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIG1hdGNoZWQgbGluZSBpcyB0aGUgZGVsaW1pdGVyIGJldHdlZW4gbG9nIG1lc3NhZ2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4uIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgaXMgYWxzbyBjb25maWd1cmVkLiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuIFxuICogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcHBseSB0byBhbGwgc3VwcG9ydGVkIGxvZyBkcml2ZXJzLlxuICogICArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIHRoZSBsb2cgZHJpdmVyIHNwZWNpZmllZCB1c2luZyBsb2dEcml2ZXIuIFRoZSBkZWxpdmVyeSBtb2RlIHlvdSBjaG9vc2UgYWZmZWN0cyBhcHBsaWNhdGlvbiBhdmFpbGFiaWxpdHkgd2hlbiB0aGUgZmxvdyBvZiBsb2dzIGZyb20gY29udGFpbmVyIGlzIGludGVycnVwdGVkLiBJZiB5b3UgdXNlIHRoZSBibG9ja2luZyBtb2RlIGFuZCB0aGUgZmxvdyBvZiBsb2dzIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIG1vZGUgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGFuZCBhcmUgb2theSB3aXRoIHNvbWUgbG9nIGxvc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUHJldmVudGluZyBsb2cgbG9zcyB3aXRoIG5vbi1ibG9ja2luZyBtb2RlIGluIHRoZSBhd3Nsb2dzIGNvbnRhaW5lciBsb2cgZHJpdmVyLiBZb3UgY2FuIHNldCBhIGRlZmF1bHQgbW9kZSBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSBzcGVjaWZpYyBSZWdpb24gYnkgdXNpbmcgdGhlIGRlZmF1bHRMb2dEcml2ZXJNb2RlIGFjY291bnQgc2V0dGluZy4gSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIG1vZGUgb3B0aW9uIG9yIGNvbmZpZ3VyZSB0aGUgYWNjb3VudCBzZXR0aW5nLCBBbWF6b24gRUNTIHdpbGwgZGVmYXVsdCB0byB0aGUgbm9uLWJsb2NraW5nIG1vZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IHNldHRpbmcsIHNlZSBEZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBpbiB0aGUgQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlLiBPbiBKdW5lIDI1LCAyMDI1LCBBbWF6b24gRUNTIGNoYW5nZWQgdGhlIGRlZmF1bHQgbG9nIGRyaXZlciBtb2RlIGZyb20gYmxvY2tpbmcgdG8gbm9uLWJsb2NraW5nIHRvIHByaW9yaXRpemUgdGFzayBhdmFpbGFiaWxpdHkgb3ZlciBsb2dnaW5nLiBUbyBjb250aW51ZSB1c2luZyB0aGUgYmxvY2tpbmcgbW9kZSBhZnRlciB0aGlzIGNoYW5nZSwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IFNldCB0aGUgbW9kZSBvcHRpb24gaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbidzIGxvZ0NvbmZpZ3VyYXRpb24gYXMgYmxvY2tpbmcuIFNldCB0aGUgZGVmYXVsdExvZ0RyaXZlck1vZGUgYWNjb3VudCBzZXR0aW5nIHRvIGJsb2NraW5nLiArIG1heC1idWZmZXItc2l6ZSBSZXF1aXJlZDogTm8gRGVmYXVsdCB2YWx1ZTogMTBtIFdoZW4gbm9uLWJsb2NraW5nIG1vZGUgaXMgdXNlZCwgdGhlIG1heC1idWZmZXItc2l6ZSBsb2cgb3B0aW9uIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCdzIHVzZWQgZm9yIGludGVybWVkaWF0ZSBtZXNzYWdlIHN0b3JhZ2UuIE1ha2Ugc3VyZSB0byBzcGVjaWZ5IGFuIGFkZXF1YXRlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCwgZnVydGhlciBsb2dzIGNhbm5vdCBiZSBzdG9yZWQuIExvZ3MgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGFyZSBsb3N0LiBcbiAqICBUbyByb3V0ZSBsb2dzIHVzaW5nIHRoZSBgYHNwbHVua2BgIGxvZyByb3V0ZXIsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBgYHNwbHVuay10b2tlbmBgIGFuZCBhIGBgc3BsdW5rLXVybGBgLlxuICogIFdoZW4geW91IHVzZSB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyByb3V0ZXIgdG8gcm91dGUgbG9ncyB0byBhbiBBV1MgU2VydmljZSBvciBBV1MgUGFydG5lciBOZXR3b3JrIGRlc3RpbmF0aW9uIGZvciBsb2cgc3RvcmFnZSBhbmQgYW5hbHl0aWNzLCB5b3UgY2FuIHNldCB0aGUgYGBsb2ctZHJpdmVyLWJ1ZmZlci1saW1pdGBgIG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGV2ZW50cyB0aGF0IGFyZSBidWZmZXJlZCBpbiBtZW1vcnksIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBsb2cgcm91dGVyIGNvbnRhaW5lci4gSXQgY2FuIGhlbHAgdG8gcmVzb2x2ZSBwb3RlbnRpYWwgbG9nIGxvc3MgaXNzdWUgYmVjYXVzZSBoaWdoIHRocm91Z2hwdXQgbWlnaHQgcmVzdWx0IGluIG1lbW9yeSBydW5uaW5nIG91dCBmb3IgdGhlIGJ1ZmZlciBpbnNpZGUgb2YgRG9ja2VyLlxuICogIE90aGVyIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4gdXNpbmcgYGBhd3NmaXJlbGVuc2BgIHRvIHJvdXRlIGxvZ3MgZGVwZW5kIG9uIHRoZSBkZXN0aW5hdGlvbi4gV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIERhdGEgRmlyZWhvc2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgbmFtZSBmb3IgdGhlIGxvZyBzdHJlYW0gd2l0aCBgYGRlbGl2ZXJ5X3N0cmVhbWBgLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBLaW5lc2lzIERhdGEgU3RyZWFtcywgeW91IGNhbiBzcGVjaWZ5IGFuIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIGRhdGEgc3RyZWFtIG5hbWUgd2l0aCBgYHN0cmVhbWBgLlxuICogICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLCB5b3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBsaWtlIGBgTmFtZWBgLCBgYEhvc3RgYCAoT3BlblNlYXJjaCBTZXJ2aWNlIGVuZHBvaW50IHdpdGhvdXQgcHJvdG9jb2wpLCBgYFBvcnRgYCwgYGBJbmRleGBgLCBgYFR5cGVgYCwgYGBBd3NfYXV0aGBgLCBgYEF3c19yZWdpb25gYCwgYGBTdXBwcmVzc19UeXBlX05hbWVgYCwgYW5kIGBgdGxzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VuZGVyIHRoZSBob29kOiBGaXJlTGVucyBmb3IgQW1hem9uIEVDUyBUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbnRhaW5lcnMvdW5kZXItdGhlLWhvb2QtZmlyZWxlbnMtZm9yLWFtYXpvbi1lY3MtdGFza3MvKS5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gUzMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYnVja2V0IHVzaW5nIHRoZSBgYGJ1Y2tldGBgIG9wdGlvbi4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYGByZWdpb25gYCwgYGB0b3RhbF9maWxlX3NpemVgYCwgYGB1cGxvYWRfdGltZW91dGBgLCBhbmQgYGB1c2VfcHV0X29iamVjdGBgIGFzIG9wdGlvbnMuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE5IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIGRyaXZlciB0byB1c2UgZm9yIHRoZSBjb250YWluZXIuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsIGBgc3lzbG9nYGAsIGBgc3BsdW5rYGAsIGFuZCBgYGF3c2ZpcmVsZW5zYGAuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gQ2xvdWRXYXRjaF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfYXdzbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgZHJpdmVyLCBzZWUgW1NlbmQgQW1hem9uIEVDUyBsb2dzIHRvIGFuIHNlcnZpY2Ugb3IgUGFydG5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkuXG4gKiAgIElmIHlvdSBoYXZlIGEgY3VzdG9tIGRyaXZlciB0aGF0IGlzbid0IGxpc3RlZCwgeW91IGNhbiBmb3JrIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwcm9qZWN0IHRoYXQncyBbYXZhaWxhYmxlIG9uIEdpdEh1Yl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYW1hem9uLWVjcy1hZ2VudCkgYW5kIGN1c3RvbWl6ZSBpdCB0byB3b3JrIHdpdGggdGhhdCBkcml2ZXIuIFdlIGVuY291cmFnZSB5b3UgdG8gc3VibWl0IHB1bGwgcmVxdWVzdHMgZm9yIGNoYW5nZXMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGluY2x1ZGVkLiBIb3dldmVyLCB3ZSBkb24ndCBjdXJyZW50bHkgcHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIG1vZGlmaWVkIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLlxuICovXG5Mb2dEcml2ZXI/OiBzdHJpbmdcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VjcmV0IHRvIGV4cG9zZSB0byB5b3VyIGNvbnRhaW5lci4gU2VjcmV0cyBjYW4gYmUgZXhwb3NlZCB0byBhIGNvbnRhaW5lciBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAgICsgIFRvIGluamVjdCBzZW5zaXRpdmUgZGF0YSBpbnRvIHlvdXIgY29udGFpbmVycyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHVzZSB0aGUgYGBzZWNyZXRzYGAgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVyLlxuICogICArICBUbyByZWZlcmVuY2Ugc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGluIHRoZSBsb2cgY29uZmlndXJhdGlvbiBvZiBhIGNvbnRhaW5lciwgdXNlIHRoZSBgYHNlY3JldE9wdGlvbnNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldCB7XG4vKipcbiAqIFRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHRoZSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9mIHRoZSBBU01sb25nIHNlY3JldCBvciB0aGUgZnVsbCBBUk4gb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAqICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVpcmUgSUFNbG9uZyBwZXJtaXNzaW9ucywgc2VlIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1zZWNyZXRzLmh0bWwjc2VjcmV0cy1pYW0pIChmb3IgU2VjcmV0cyBNYW5hZ2VyKSBvciBbUmVxdWlyZWQgSUFNIHBlcm1pc3Npb25zIGZvciBBbWF6b24gRUNTIHNlY3JldHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEtcGFyYW1ldGVycy5odG1sKSAoZm9yIFN5c3RlbXMgTWFuYWdlciBQYXJhbWV0ZXIgc3RvcmUpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgSWYgdGhlIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyIGV4aXN0cyBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIHRhc2sgeW91J3JlIGxhdW5jaGluZywgdGhlbiB5b3UgY2FuIHVzZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9yIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gSWYgdGhlIHBhcmFtZXRlciBleGlzdHMgaW4gYSBkaWZmZXJlbnQgUmVnaW9uLCB0aGVuIHRoZSBmdWxsIEFSTiBtdXN0IGJlIHNwZWNpZmllZC5cbiAqL1xuVmFsdWVGcm9tOiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHNlY3JldC5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uIGZvciB5b3VyIHNlcnZpY2UgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgZ3JvdXAocykgQW1hem9uIEVDUyB0YXNrcyB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjTGF0dGljZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgZnVsbCBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFyZ2V0IGdyb3VwIG9yIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIFZQQyBMYXR0aWNlIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgQW1hem9uIEVDUyB0YXNrcyB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8uXG4gKi9cblRhcmdldEdyb3VwQXJuOiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHBvcnQgbWFwcGluZyB0byByZWdpc3RlciBpbiB0aGUgVlBDIExhdHRpY2UgdGFyZ2V0IGdyb3VwLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBgYHBvcnRNYXBwaW5nYGAgeW91IGRlZmluZWQgaW4geW91ciB0YXNrIGRlZmluaXRpb24uXG4gKi9cblBvcnROYW1lOiBzdHJpbmdcbi8qKlxuICogVGhlIEFSTiBvZiB0aGUgSUFNIHJvbGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHRoZSBBbWF6b24gRUNT4oCoIGluZnJhc3RydWN0dXJlIElBTSByb2xlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgeW91ciBWUEMgTGF0dGljZSBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuUm9sZUFybjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdG8gdXNlIGZvciB0aGUgc2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50Q29udHJvbGxlciB7XG4vKipcbiAqIFRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZSB0byB1c2UuXG4gKiAgVGhlIGRlcGxveW1lbnQgY29udHJvbGxlciBpcyB0aGUgbWVjaGFuaXNtIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGFza3MgYXJlIGRlcGxveWVkIGZvciB5b3VyIHNlcnZpY2UuIFRoZSB2YWxpZCBvcHRpb25zIGFyZTpcbiAqICAgKyAgRUNTXG4gKiAgV2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSB3aGljaCB1c2VzIHRoZSBgYEVDU2BgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91IGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGRlcGxveW1lbnQgc3RyYXRlZ2llczpcbiAqICAgKyAgYGBST0xMSU5HYGA6IFdoZW4geW91IGNyZWF0ZSBhIHNlcnZpY2Ugd2hpY2ggdXNlcyB0aGUgKnJvbGxpbmcgdXBkYXRlKiAoYGBST0xMSU5HYGApIGRlcGxveW1lbnQgc3RyYXRlZ3ksIHRoZSBFQ1Mgc2VydmljZSBzY2hlZHVsZXIgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIHdpdGggbmV3IHRhc2tzLiBUaGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgRUNTIGFkZHMgb3IgcmVtb3ZlcyBmcm9tIHRoZSBzZXJ2aWNlIGR1cmluZyBhIHJvbGxpbmcgdXBkYXRlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHNlcnZpY2UgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLiBcbiAqICBSb2xsaW5nIHVwZGF0ZSBkZXBsb3ltZW50cyBhcmUgYmVzdCBzdWl0ZWQgZm9yIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOlxuICogICArICBHcmFkdWFsIHNlcnZpY2UgdXBkYXRlczogWW91IG5lZWQgdG8gdXBkYXRlIHlvdXIgc2VydmljZSBpbmNyZW1lbnRhbGx5IHdpdGhvdXQgdGFraW5nIHRoZSBlbnRpcmUgc2VydmljZSBvZmZsaW5lIGF0IG9uY2UuXG4gKiAgICsgIExpbWl0ZWQgcmVzb3VyY2UgcmVxdWlyZW1lbnRzOiBZb3Ugd2FudCB0byBhdm9pZCB0aGUgYWRkaXRpb25hbCByZXNvdXJjZSBjb3N0cyBvZiBydW5uaW5nIHR3byBjb21wbGV0ZSBlbnZpcm9ubWVudHMgc2ltdWx0YW5lb3VzbHkgKGFzIHJlcXVpcmVkIGJ5IGJsdWUvZ3JlZW4gZGVwbG95bWVudHMpLlxuICogICArICBBY2NlcHRhYmxlIGRlcGxveW1lbnQgdGltZTogWW91ciBhcHBsaWNhdGlvbiBjYW4gdG9sZXJhdGUgYSBsb25nZXIgZGVwbG95bWVudCBwcm9jZXNzLCBhcyByb2xsaW5nIHVwZGF0ZXMgcmVwbGFjZSB0YXNrcyBvbmUgYnkgb25lLlxuICogICArICBObyBuZWVkIGZvciBpbnN0YW50IHJvbGwgYmFjazogWW91ciBzZXJ2aWNlIGNhbiB0b2xlcmF0ZSBhIHJvbGxiYWNrIHByb2Nlc3MgdGhhdCB0YWtlcyBtaW51dGVzIHJhdGhlciB0aGFuIHNlY29uZHMuXG4gKiAgICsgIFNpbXBsZSBkZXBsb3ltZW50IHByb2Nlc3M6IFlvdSBwcmVmZXIgYSBzdHJhaWdodGZvcndhcmQgZGVwbG95bWVudCBhcHByb2FjaCB3aXRob3V0IHRoZSBjb21wbGV4aXR5IG9mIG1hbmFnaW5nIG11bHRpcGxlIGVudmlyb25tZW50cywgdGFyZ2V0IGdyb3VwcywgYW5kIGxpc3RlbmVycy5cbiAqICAgKyAgTm8gbG9hZCBiYWxhbmNlciByZXF1aXJlbWVudDogWW91ciBzZXJ2aWNlIGRvZXNuJ3QgdXNlIG9yIHJlcXVpcmUgYSBsb2FkIGJhbGFuY2VyLCBBTEIsIE5MQiwgb3IgU2VydmljZSBDb25uZWN0ICh3aGljaCBhcmUgcmVxdWlyZWQgZm9yIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMpLlxuICogICArICBTdGF0ZWZ1bCBhcHBsaWNhdGlvbnM6IFlvdXIgYXBwbGljYXRpb24gbWFpbnRhaW5zIHN0YXRlIHRoYXQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIHJ1biB0d28gcGFyYWxsZWwgZW52aXJvbm1lbnRzLlxuICogICArICBDb3N0IHNlbnNpdGl2aXR5OiBZb3Ugd2FudCB0byBtaW5pbWl6ZSBkZXBsb3ltZW50IGNvc3RzIGJ5IG5vdCBydW5uaW5nIGR1cGxpY2F0ZSBlbnZpcm9ubWVudHMgZHVyaW5nIGRlcGxveW1lbnQuXG4gKiAgIFxuICogIFJvbGxpbmcgdXBkYXRlcyBhcmUgdGhlIGRlZmF1bHQgZGVwbG95bWVudCBzdHJhdGVneSBmb3Igc2VydmljZXMgYW5kIHByb3ZpZGUgYSBiYWxhbmNlIGJldHdlZW4gZGVwbG95bWVudCBzYWZldHkgYW5kIHJlc291cmNlIGVmZmljaWVuY3kgZm9yIG1hbnkgY29tbW9uIGFwcGxpY2F0aW9uIHNjZW5hcmlvcy5cbiAqICAgKyAgYGBCTFVFX0dSRUVOYGA6IEEgKmJsdWUvZ3JlZW4qIGRlcGxveW1lbnQgc3RyYXRlZ3kgKGBgQkxVRV9HUkVFTmBgKSBpcyBhIHJlbGVhc2UgbWV0aG9kb2xvZ3kgdGhhdCByZWR1Y2VzIGRvd250aW1lIGFuZCByaXNrIGJ5IHJ1bm5pbmcgdHdvIGlkZW50aWNhbCBwcm9kdWN0aW9uIGVudmlyb25tZW50cyBjYWxsZWQgYmx1ZSBhbmQgZ3JlZW4uIFdpdGggRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMsIHlvdSBjYW4gdmFsaWRhdGUgbmV3IHNlcnZpY2UgcmV2aXNpb25zIGJlZm9yZSBkaXJlY3RpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIHRoZW0uIFRoaXMgYXBwcm9hY2ggcHJvdmlkZXMgYSBzYWZlciB3YXkgdG8gZGVwbG95IGNoYW5nZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBxdWlja2x5IHJvbGwgYmFjayBpZiBuZWVkZWQuXG4gKiAgRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMgYXJlIGJlc3Qgc3VpdGVkIGZvciB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczpcbiAqICAgKyAgU2VydmljZSB2YWxpZGF0aW9uOiBXaGVuIHlvdSBuZWVkIHRvIHZhbGlkYXRlIG5ldyBzZXJ2aWNlIHJldmlzaW9ucyBiZWZvcmUgZGlyZWN0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYyB0byB0aGVtXG4gKiAgICsgIFplcm8gZG93bnRpbWU6IFdoZW4geW91ciBzZXJ2aWNlIHJlcXVpcmVzIHplcm8tZG93bnRpbWUgZGVwbG95bWVudHNcbiAqICAgKyAgSW5zdGFudCByb2xsIGJhY2s6IFdoZW4geW91IG5lZWQgdGhlIGFiaWxpdHkgdG8gcXVpY2tseSByb2xsIGJhY2sgaWYgaXNzdWVzIGFyZSBkZXRlY3RlZFxuICogICArICBMb2FkIGJhbGFuY2VyIHJlcXVpcmVtZW50OiBXaGVuIHlvdXIgc2VydmljZSB1c2VzIEFMQiwgTkxCLCBvciBTZXJ2aWNlIENvbm5lY3RcbiAqICAgXG4gKiAgIFxuICogICArICBFeHRlcm5hbFxuICogIFVzZSBhIHRoaXJkLXBhcnR5IGRlcGxveW1lbnQgY29udHJvbGxlci5cbiAqICAgKyAgQmx1ZS9ncmVlbiBkZXBsb3ltZW50IChwb3dlcmVkIGJ5IEFDRClcbiAqICBBQ0QgaW5zdGFsbHMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBhcyBhIG5ldyByZXBsYWNlbWVudCB0YXNrIHNldCBhbmQgcmVyb3V0ZXMgcHJvZHVjdGlvbiB0cmFmZmljIGZyb20gdGhlIG9yaWdpbmFsIGFwcGxpY2F0aW9uIHRhc2sgc2V0IHRvIHRoZSByZXBsYWNlbWVudCB0YXNrIHNldC4gVGhlIG9yaWdpbmFsIHRhc2sgc2V0IGlzIHRlcm1pbmF0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRlcGxveW1lbnQuIFVzZSB0aGlzIGRlcGxveW1lbnQgY29udHJvbGxlciB0byB2ZXJpZnkgYSBuZXcgZGVwbG95bWVudCBvZiBhIHNlcnZpY2UgYmVmb3JlIHNlbmRpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIGl0LlxuICogICBcbiAqICBXaGVuIHVwZGF0aW5nIHRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgZm9yIGEgc2VydmljZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWlncmF0aW9uIHlvdSdyZSBwZXJmb3JtaW5nLlxuICogICArICBJZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyBgYFRhc2tTZXRgYCBhbmQgYGBQcmltYXJ5VGFza1NldGBgIHJlc291cmNlcywgYW5kIHlvdSByZW1vdmUgdGhlIHRhc2sgc2V0IHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZSB3aGVuIHVwZGF0aW5nIGZyb20gYGBFWFRFUk5BTGBgIHRvIGBgRUNTYGAsIHRoZSBgYERlc2NyaWJlVGFza1NldGBgIGFuZCBgYERlbGV0ZVRhc2tTZXRgYCBBUEkgY2FsbHMgd2lsbCByZXR1cm4gYSA0MDAgZXJyb3IgYWZ0ZXIgdGhlIGRlcGxveW1lbnQgY29udHJvbGxlciBpcyB1cGRhdGVkIHRvIGBgRUNTYGAuIFRoaXMgcmVzdWx0cyBpbiBhIGRlbGV0ZSBmYWlsdXJlIG9uIHRoZSB0YXNrIHNldCByZXNvdXJjZXMsIGV2ZW4gdGhvdWdoIHRoZSBzdGFjayB0cmFuc2l0aW9ucyB0byBgYFVQREFURV9DT01QTEVURWBgIHN0YXR1cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzb3VyY2UgcmVtb3ZlZCBmcm9tIHN0YWNrIGJ1dCBub3QgZGVsZXRlZF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvdHJvdWJsZXNob290aW5nLmh0bWwjdHJvdWJsZXNob290aW5nLWVycm9ycy1yZXNvdXJjZS1yZW1vdmVkLW5vdC1kZWxldGVkKSBpbiB0aGUgQ0ZObG9uZyBVc2VyIEd1aWRlLiBUbyBmaXggdGhpcyBpc3N1ZSwgZGVsZXRlIHRoZSB0YXNrIHNldHMgZGlyZWN0bHkgdXNpbmcgdGhlIEVDU2BgRGVsZXRlVGFza1NldGBgIEFQSS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRlbGV0ZSBhIHRhc2sgc2V0LCBzZWUgW0RlbGV0ZVRhc2tTZXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVGFza1NldC5odG1sKSBpbiB0aGUgRUNTbG9uZyBBUEkgUmVmZXJlbmNlLlxuICogICArICBJZiB5b3UncmUgbWlncmF0aW5nIGZyb20gYGBDT0RFX0RFUExPWWBgIHRvIGBgRUNTYGAgd2l0aCBhIG5ldyB0YXNrIGRlZmluaXRpb24gYW5kIENGTiBwZXJmb3JtcyBhIHJvbGxiYWNrIG9wZXJhdGlvbiwgdGhlIEVDU2BgVXBkYXRlU2VydmljZWBgIHJlcXVlc3QgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yOlxuICogIFJlc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgbWVzc2FnZTogXCJJbnZhbGlkIHJlcXVlc3QgcHJvdmlkZWQ6IFVuYWJsZSB0byB1cGRhdGUgdGFzayBkZWZpbml0aW9uIG9uIHNlcnZpY2VzIHdpdGggYSBDT0RFX0RFUExPWSBkZXBsb3ltZW50IGNvbnRyb2xsZXIuIFxuICogICArICBBZnRlciBhIHN1Y2Nlc3NmdWwgbWlncmF0aW9uIGZyb20gYGBFQ1NgYCB0byBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCBjb250cm9sbGVyLCB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgdGhlIGBgQUNUSVZFYGAgdGFzayBzZXQsIGJlY2F1c2UgRUNTIG5vIGxvbmdlciBtYW5hZ2VzIHRoZSBkZXBsb3ltZW50LiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRlbGV0ZSBhIHRhc2sgc2V0LCBzZWUgW0RlbGV0ZVRhc2tTZXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVGFza1NldC5odG1sKSBpbiB0aGUgRUNTbG9uZyBBUEkgUmVmZXJlbmNlLlxuICovXG5UeXBlPzogKFwiQ09ERV9ERVBMT1lcIiB8IFwiRUNTXCIgfCBcIkVYVEVSTkFMXCIpXG59XG4vKipcbiAqIE9wdGlvbmFsIGRlcGxveW1lbnQgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgaG93IG1hbnkgdGFza3MgcnVuIGR1cmluZyB0aGUgZGVwbG95bWVudCBhbmQgdGhlIG9yZGVyaW5nIG9mIHN0b3BwaW5nIGFuZCBzdGFydGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50Q29uZmlndXJhdGlvbiB7XG5DYW5hcnlDb25maWd1cmF0aW9uPzogQ2FuYXJ5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgZHVyYXRpb24gd2hlbiBib3RoIGJsdWUgYW5kIGdyZWVuIHNlcnZpY2UgcmV2aXNpb25zIGFyZSBydW5uaW5nIHNpbXVsdGFuZW91c2x5IGFmdGVyIHRoZSBwcm9kdWN0aW9uIHRyYWZmaWMgaGFzIHNoaWZ0ZWQuXG4gKiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB3aGVuIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWU6XG4gKiAgICsgIEZvciByb2xsaW5nIGRlcGxveW1lbnRzLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDMgaG91cnMgKDE4MCBtaW51dGVzKS5cbiAqICAgKyAgV2hlbiB5b3UgdXNlIGFuIGV4dGVybmFsIGRlcGxveW1lbnQgY29udHJvbGxlciAoYGBFWFRFUk5BTGBgKSwgb3IgdGhlIEFDRCBibHVlL2dyZWVuIGRlcGxveW1lbnQgY29udHJvbGxlciAoYGBDT0RFX0RFUExPWWBgKSwgdGhlIHZhbHVlIGlzIHNldCB0byAzIGhvdXJzICgxODAgbWludXRlcykuXG4gKiAgICsgIEZvciBhbGwgb3RoZXIgY2FzZXMsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gMzYgaG91cnMgKDIxNjAgbWludXRlcykuXG4gKi9cbkJha2VUaW1lSW5NaW51dGVzPzogbnVtYmVyXG4vKipcbiAqIEFuIGFycmF5IG9mIGRlcGxveW1lbnQgbGlmZWN5Y2xlIGhvb2sgb2JqZWN0cyB0byBydW4gY3VzdG9tIGxvZ2ljIGF0IHNwZWNpZmljIHN0YWdlcyBvZiB0aGUgZGVwbG95bWVudCBsaWZlY3ljbGUuXG4gKi9cbkxpZmVjeWNsZUhvb2tzPzogRGVwbG95bWVudExpZmVjeWNsZUhvb2tbXVxuQWxhcm1zPzogRGVwbG95bWVudEFsYXJtc1xuLyoqXG4gKiBUaGUgZGVwbG95bWVudCBzdHJhdGVneSBmb3IgdGhlIHNlcnZpY2UuIENob29zZSBmcm9tIHRoZXNlIHZhbGlkIHZhbHVlczpcbiAqICAgKyAgYGBST0xMSU5HYGAgLSBXaGVuIHlvdSBjcmVhdGUgYSBzZXJ2aWNlIHdoaWNoIHVzZXMgdGhlIHJvbGxpbmcgdXBkYXRlIChgYFJPTExJTkdgYCkgZGVwbG95bWVudCBzdHJhdGVneSwgdGhlIEFtYXpvbiBFQ1Mgc2VydmljZSBzY2hlZHVsZXIgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIHdpdGggbmV3IHRhc2tzLiBUaGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBhZGRzIG9yIHJlbW92ZXMgZnJvbSB0aGUgc2VydmljZSBkdXJpbmcgYSByb2xsaW5nIHVwZGF0ZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBzZXJ2aWNlIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbi5cbiAqICAgKyAgYGBCTFVFX0dSRUVOYGAgLSBBIGJsdWUvZ3JlZW4gZGVwbG95bWVudCBzdHJhdGVneSAoYGBCTFVFX0dSRUVOYGApIGlzIGEgcmVsZWFzZSBtZXRob2RvbG9neSB0aGF0IHJlZHVjZXMgZG93bnRpbWUgYW5kIHJpc2sgYnkgcnVubmluZyB0d28gaWRlbnRpY2FsIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIGNhbGxlZCBibHVlIGFuZCBncmVlbi4gV2l0aCBBbWF6b24gRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMsIHlvdSBjYW4gdmFsaWRhdGUgbmV3IHNlcnZpY2UgcmV2aXNpb25zIGJlZm9yZSBkaXJlY3RpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIHRoZW0uIFRoaXMgYXBwcm9hY2ggcHJvdmlkZXMgYSBzYWZlciB3YXkgdG8gZGVwbG95IGNoYW5nZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBxdWlja2x5IHJvbGwgYmFjayBpZiBuZWVkZWQuXG4gKi9cblN0cmF0ZWd5PzogKFwiUk9MTElOR1wiIHwgXCJCTFVFX0dSRUVOXCIgfCBcIkxJTkVBUlwiIHwgXCJDQU5BUllcIilcbkRlcGxveW1lbnRDaXJjdWl0QnJlYWtlcj86IERlcGxveW1lbnRDaXJjdWl0QnJlYWtlclxuLyoqXG4gKiBJZiBhIHNlcnZpY2UgaXMgdXNpbmcgdGhlIHJvbGxpbmcgdXBkYXRlIChgYEVDU2BgKSBkZXBsb3ltZW50IHR5cGUsIHRoZSBgYG1heGltdW1QZXJjZW50YGAgcGFyYW1ldGVyIHJlcHJlc2VudHMgYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB5b3VyIHNlcnZpY2UncyB0YXNrcyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBgYFJVTk5JTkdgYCBvciBgYFBFTkRJTkdgYCBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGBgZGVzaXJlZENvdW50YGAgKHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyKS4gVGhpcyBwYXJhbWV0ZXIgZW5hYmxlcyB5b3UgdG8gZGVmaW5lIHRoZSBkZXBsb3ltZW50IGJhdGNoIHNpemUuIEZvciBleGFtcGxlLCBpZiB5b3VyIHNlcnZpY2UgaXMgdXNpbmcgdGhlIGBgUkVQTElDQWBgIHNlcnZpY2Ugc2NoZWR1bGVyIGFuZCBoYXMgYSBgYGRlc2lyZWRDb3VudGBgIG9mIGZvdXIgdGFza3MgYW5kIGEgYGBtYXhpbXVtUGVyY2VudGBgIHZhbHVlIG9mIDIwMCUsIHRoZSBzY2hlZHVsZXIgbWF5IHN0YXJ0IGZvdXIgbmV3IHRhc2tzIGJlZm9yZSBzdG9wcGluZyB0aGUgZm91ciBvbGRlciB0YXNrcyAocHJvdmlkZWQgdGhhdCB0aGUgY2x1c3RlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8gZG8gdGhpcyBhcmUgYXZhaWxhYmxlKS4gVGhlIGRlZmF1bHQgYGBtYXhpbXVtUGVyY2VudGBgIHZhbHVlIGZvciBhIHNlcnZpY2UgdXNpbmcgdGhlIGBgUkVQTElDQWBgIHNlcnZpY2Ugc2NoZWR1bGVyIGlzIDIwMCUuXG4gKiAgVGhlIEFtYXpvbiBFQ1Mgc2NoZWR1bGVyIHVzZXMgdGhpcyBwYXJhbWV0ZXIgdG8gcmVwbGFjZSB1bmhlYWx0aHkgdGFza3MgYnkgc3RhcnRpbmcgcmVwbGFjZW1lbnQgdGFza3MgZmlyc3QgYW5kIHRoZW4gc3RvcHBpbmcgdGhlIHVuaGVhbHRoeSB0YXNrcywgYXMgbG9uZyBhcyBjbHVzdGVyIHJlc291cmNlcyBmb3Igc3RhcnRpbmcgcmVwbGFjZW1lbnQgdGFza3MgYXJlIGF2YWlsYWJsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBzY2hlZHVsZXIgcmVwbGFjZXMgdW5oZWFsdGh5IHRhc2tzLCBzZWUgW0FtYXpvbiBFQ1Mgc2VydmljZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjc19zZXJ2aWNlcy5odG1sKS5cbiAqICBJZiBhIHNlcnZpY2UgaXMgdXNpbmcgZWl0aGVyIHRoZSBibHVlL2dyZWVuIChgYENPREVfREVQTE9ZYGApIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IHR5cGVzLCBhbmQgdGFza3MgaW4gdGhlIHNlcnZpY2UgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoZSAqbWF4aW11bSBwZXJjZW50KiB2YWx1ZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFRoZSAqbWF4aW11bSBwZXJjZW50KiB2YWx1ZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgdGhhdCByZW1haW4gaW4gdGhlIGBgUlVOTklOR2BgIHN0YXRlIHdoaWxlIHRoZSBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBpbiB0aGUgYGBEUkFJTklOR2BgIHN0YXRlLlxuICogICBZb3UgY2FuJ3Qgc3BlY2lmeSBhIGN1c3RvbSBgYG1heGltdW1QZXJjZW50YGAgdmFsdWUgZm9yIGEgc2VydmljZSB0aGF0IHVzZXMgZWl0aGVyIHRoZSBibHVlL2dyZWVuIChgYENPREVfREVQTE9ZYGApIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IHR5cGVzIGFuZCBoYXMgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZS5cbiAqICAgSWYgdGhlIHNlcnZpY2UgdXNlcyBlaXRoZXIgdGhlIGJsdWUvZ3JlZW4gKGBgQ09ERV9ERVBMT1lgYCkgb3IgYGBFWFRFUk5BTGBgIGRlcGxveW1lbnQgdHlwZXMsIGFuZCB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgbWF4aW11bSBwZXJjZW50IHZhbHVlIGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgaXMgc3RpbGwgcmV0dXJuZWQgd2hlbiBkZXNjcmliaW5nIHlvdXIgc2VydmljZS5cbiAqL1xuTWF4aW11bVBlcmNlbnQ/OiBudW1iZXJcbi8qKlxuICogSWYgYSBzZXJ2aWNlIGlzIHVzaW5nIHRoZSByb2xsaW5nIHVwZGF0ZSAoYGBFQ1NgYCkgZGVwbG95bWVudCB0eXBlLCB0aGUgYGBtaW5pbXVtSGVhbHRoeVBlcmNlbnRgYCByZXByZXNlbnRzIGEgbG93ZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB5b3VyIHNlcnZpY2UncyB0YXNrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBgYFJVTk5JTkdgYCBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGBgZGVzaXJlZENvdW50YGAgKHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikuIFRoaXMgcGFyYW1ldGVyIGVuYWJsZXMgeW91IHRvIGRlcGxveSB3aXRob3V0IHVzaW5nIGFkZGl0aW9uYWwgY2x1c3RlciBjYXBhY2l0eS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgc2VydmljZSBoYXMgYSBgYGRlc2lyZWRDb3VudGBgIG9mIGZvdXIgdGFza3MgYW5kIGEgYGBtaW5pbXVtSGVhbHRoeVBlcmNlbnRgYCBvZiA1MCUsIHRoZSBzZXJ2aWNlIHNjaGVkdWxlciBtYXkgc3RvcCB0d28gZXhpc3RpbmcgdGFza3MgdG8gZnJlZSB1cCBjbHVzdGVyIGNhcGFjaXR5IGJlZm9yZSBzdGFydGluZyB0d28gbmV3IHRhc2tzLiBcbiAqICAgSWYgYW55IHRhc2tzIGFyZSB1bmhlYWx0aHkgYW5kIGlmIGBgbWF4aW11bVBlcmNlbnRgYCBkb2Vzbid0IGFsbG93IHRoZSBBbWF6b24gRUNTIHNjaGVkdWxlciB0byBzdGFydCByZXBsYWNlbWVudCB0YXNrcywgdGhlIHNjaGVkdWxlciBzdG9wcyB0aGUgdW5oZWFsdGh5IHRhc2tzIG9uZS1ieS1vbmUg4oCUIHVzaW5nIHRoZSBgYG1pbmltdW1IZWFsdGh5UGVyY2VudGBgIGFzIGEgY29uc3RyYWludCDigJQgdG8gY2xlYXIgdXAgY2FwYWNpdHkgdG8gbGF1bmNoIHJlcGxhY2VtZW50IHRhc2tzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIHNjaGVkdWxlciByZXBsYWNlcyB1bmhlYWx0aHkgdGFza3MsIHNlZSBbQW1hem9uIEVDUyBzZXJ2aWNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzX3NlcnZpY2VzLmh0bWwpLiBcbiAqICBGb3Igc2VydmljZXMgdGhhdCAqZG8gbm90KiB1c2UgYSBsb2FkIGJhbGFuY2VyLCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBub3RlZDpcbiAqICAgKyAgQSBzZXJ2aWNlIGlzIGNvbnNpZGVyZWQgaGVhbHRoeSBpZiBhbGwgZXNzZW50aWFsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSB0YXNrcyBpbiB0aGUgc2VydmljZSBwYXNzIHRoZWlyIGhlYWx0aCBjaGVja3MuXG4gKiAgICsgIElmIGEgdGFzayBoYXMgbm8gZXNzZW50aWFsIGNvbnRhaW5lcnMgd2l0aCBhIGhlYWx0aCBjaGVjayBkZWZpbmVkLCB0aGUgc2VydmljZSBzY2hlZHVsZXIgd2lsbCB3YWl0IGZvciA0MCBzZWNvbmRzIGFmdGVyIGEgdGFzayByZWFjaGVzIGEgYGBSVU5OSU5HYGAgc3RhdGUgYmVmb3JlIHRoZSB0YXNrIGlzIGNvdW50ZWQgdG93YXJkcyB0aGUgbWluaW11bSBoZWFsdGh5IHBlcmNlbnQgdG90YWwuXG4gKiAgICsgIElmIGEgdGFzayBoYXMgb25lIG9yIG1vcmUgZXNzZW50aWFsIGNvbnRhaW5lcnMgd2l0aCBhIGhlYWx0aCBjaGVjayBkZWZpbmVkLCB0aGUgc2VydmljZSBzY2hlZHVsZXIgd2lsbCB3YWl0IGZvciB0aGUgdGFzayB0byByZWFjaCBhIGhlYWx0aHkgc3RhdHVzIGJlZm9yZSBjb3VudGluZyBpdCB0b3dhcmRzIHRoZSBtaW5pbXVtIGhlYWx0aHkgcGVyY2VudCB0b3RhbC4gQSB0YXNrIGlzIGNvbnNpZGVyZWQgaGVhbHRoeSB3aGVuIGFsbCBlc3NlbnRpYWwgY29udGFpbmVycyB3aXRoaW4gdGhlIHRhc2sgaGF2ZSBwYXNzZWQgdGhlaXIgaGVhbHRoIGNoZWNrcy4gVGhlIGFtb3VudCBvZiB0aW1lIHRoZSBzZXJ2aWNlIHNjaGVkdWxlciBjYW4gd2FpdCBmb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGFpbmVyIGhlYWx0aCBjaGVjayBzZXR0aW5ncy4gXG4gKiAgIFxuICogIEZvciBzZXJ2aWNlcyB0aGF0ICpkbyogdXNlIGEgbG9hZCBiYWxhbmNlciwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgbm90ZWQ6XG4gKiAgICsgIElmIGEgdGFzayBoYXMgbm8gZXNzZW50aWFsIGNvbnRhaW5lcnMgd2l0aCBhIGhlYWx0aCBjaGVjayBkZWZpbmVkLCB0aGUgc2VydmljZSBzY2hlZHVsZXIgd2lsbCB3YWl0IGZvciB0aGUgbG9hZCBiYWxhbmNlciB0YXJnZXQgZ3JvdXAgaGVhbHRoIGNoZWNrIHRvIHJldHVybiBhIGhlYWx0aHkgc3RhdHVzIGJlZm9yZSBjb3VudGluZyB0aGUgdGFzayB0b3dhcmRzIHRoZSBtaW5pbXVtIGhlYWx0aHkgcGVyY2VudCB0b3RhbC5cbiAqICAgKyAgSWYgYSB0YXNrIGhhcyBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHdpdGggYSBoZWFsdGggY2hlY2sgZGVmaW5lZCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHdpbGwgd2FpdCBmb3IgYm90aCB0aGUgdGFzayB0byByZWFjaCBhIGhlYWx0aHkgc3RhdHVzIGFuZCB0aGUgbG9hZCBiYWxhbmNlciB0YXJnZXQgZ3JvdXAgaGVhbHRoIGNoZWNrIHRvIHJldHVybiBhIGhlYWx0aHkgc3RhdHVzIGJlZm9yZSBjb3VudGluZyB0aGUgdGFzayB0b3dhcmRzIHRoZSBtaW5pbXVtIGhlYWx0aHkgcGVyY2VudCB0b3RhbC5cbiAqICAgXG4gKiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgcmVwbGljYSBzZXJ2aWNlIGZvciBgYG1pbmltdW1IZWFsdGh5UGVyY2VudGBgIGlzIDEwMCUuIFRoZSBkZWZhdWx0IGBgbWluaW11bUhlYWx0aHlQZXJjZW50YGAgdmFsdWUgZm9yIGEgc2VydmljZSB1c2luZyB0aGUgYGBEQUVNT05gYCBzZXJ2aWNlIHNjaGVkdWxlIGlzIDAlIGZvciB0aGUgQ0xJLCB0aGUgQVdTIFNES3MsIGFuZCB0aGUgQVBJcyBhbmQgNTAlIGZvciB0aGUgQVdTIE1hbmFnZW1lbnQgQ29uc29sZS5cbiAqICBUaGUgbWluaW11bSBudW1iZXIgb2YgaGVhbHRoeSB0YXNrcyBkdXJpbmcgYSBkZXBsb3ltZW50IGlzIHRoZSBgYGRlc2lyZWRDb3VudGBgIG11bHRpcGxpZWQgYnkgdGhlIGBgbWluaW11bUhlYWx0aHlQZXJjZW50YGAvMTAwLCByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXG4gKiAgSWYgYSBzZXJ2aWNlIGlzIHVzaW5nIGVpdGhlciB0aGUgYmx1ZS9ncmVlbiAoYGBDT0RFX0RFUExPWWBgKSBvciBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCB0eXBlcyBhbmQgaXMgcnVubmluZyB0YXNrcyB0aGF0IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGUgKm1pbmltdW0gaGVhbHRoeSBwZXJjZW50KiB2YWx1ZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFRoZSAqbWluaW11bSBoZWFsdGh5IHBlcmNlbnQqIHZhbHVlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBsb3dlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRoZSB0YXNrcyBpbiB0aGUgc2VydmljZSB0aGF0IHJlbWFpbiBpbiB0aGUgYGBSVU5OSU5HYGAgc3RhdGUgd2hpbGUgdGhlIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGluIHRoZSBgYERSQUlOSU5HYGAgc3RhdGUuXG4gKiAgIFlvdSBjYW4ndCBzcGVjaWZ5IGEgY3VzdG9tIGBgbWluaW11bUhlYWx0aHlQZXJjZW50YGAgdmFsdWUgZm9yIGEgc2VydmljZSB0aGF0IHVzZXMgZWl0aGVyIHRoZSBibHVlL2dyZWVuIChgYENPREVfREVQTE9ZYGApIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IHR5cGVzIGFuZCBoYXMgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZS5cbiAqICAgSWYgYSBzZXJ2aWNlIGlzIHVzaW5nIGVpdGhlciB0aGUgYmx1ZS9ncmVlbiAoYGBDT0RFX0RFUExPWWBgKSBvciBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCB0eXBlcyBhbmQgaXMgcnVubmluZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIG1pbmltdW0gaGVhbHRoeSBwZXJjZW50IHZhbHVlIGlzIG5vdCB1c2VkLCBhbHRob3VnaCBpdCBpcyByZXR1cm5lZCB3aGVuIGRlc2NyaWJpbmcgeW91ciBzZXJ2aWNlLlxuICovXG5NaW5pbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXJcbkxpbmVhckNvbmZpZ3VyYXRpb24/OiBMaW5lYXJDb25maWd1cmF0aW9uXG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGNhbmFyeSBkZXBsb3ltZW50IHN0cmF0ZWd5LiBPbmx5IHZhbGlkIHdoZW4gdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kgaXMgYGBDQU5BUllgYC4gVGhpcyBjb25maWd1cmF0aW9uIGVuYWJsZXMgc2hpZnRpbmcgYSBmaXhlZCBwZXJjZW50YWdlIG9mIHRyYWZmaWMgZm9yIHRlc3RpbmcsIGZvbGxvd2VkIGJ5IHNoaWZ0aW5nIHRoZSByZW1haW5pbmcgdHJhZmZpYyBhZnRlciBhIGJha2UgcGVyaW9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmFyeUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgcGVyY2VudGFnZSBvZiBwcm9kdWN0aW9uIHRyYWZmaWMgdG8gc2hpZnQgdG8gdGhlIG5ldyBzZXJ2aWNlIHJldmlzaW9uIGR1cmluZyB0aGUgY2FuYXJ5IHBoYXNlLiBWYWxpZCB2YWx1ZXMgYXJlIG11bHRpcGxlcyBvZiAwLjEgZnJvbSAwLjEgdG8gMTAwLjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuMC5cbiAqL1xuQ2FuYXJ5UGVyY2VudD86IG51bWJlclxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbWludXRlcyB0byB3YWl0IGR1cmluZyB0aGUgY2FuYXJ5IHBoYXNlIGJlZm9yZSBzaGlmdGluZyB0aGUgcmVtYWluaW5nIHByb2R1Y3Rpb24gdHJhZmZpYyB0byB0aGUgbmV3IHNlcnZpY2UgcmV2aXNpb24uIFZhbGlkIHZhbHVlcyBhcmUgMCB0byAxNDQwIG1pbnV0ZXMgKDI0IGhvdXJzKS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTAuXG4gKi9cbkNhbmFyeUJha2VUaW1lSW5NaW51dGVzPzogbnVtYmVyXG59XG4vKipcbiAqIEEgZGVwbG95bWVudCBsaWZlY3ljbGUgaG9vayBydW5zIGN1c3RvbSBsb2dpYyBhdCBzcGVjaWZpYyBzdGFnZXMgb2YgdGhlIGRlcGxveW1lbnQgcHJvY2Vzcy4gQ3VycmVudGx5LCB5b3UgY2FuIHVzZSBMYW1iZGEgZnVuY3Rpb25zIGFzIGhvb2sgdGFyZ2V0cy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtMaWZlY3ljbGUgaG9va3MgZm9yIEFtYXpvbiBFQ1Mgc2VydmljZSBkZXBsb3ltZW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZGVwbG95bWVudC1saWZlY3ljbGUtaG9va3MuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRMaWZlY3ljbGVIb29rIHtcbi8qKlxuICogVGhlIGxpZmVjeWNsZSBzdGFnZXMgYXQgd2hpY2ggdG8gcnVuIHRoZSBob29rLiBDaG9vc2UgZnJvbSB0aGVzZSB2YWxpZCB2YWx1ZXM6XG4gKiAgICsgIFJFQ09OQ0lMRV9TRVJWSUNFXG4gKiAgVGhlIHJlY29uY2lsaWF0aW9uIHN0YWdlIHRoYXQgb25seSBoYXBwZW5zIHdoZW4geW91IHN0YXJ0IGEgbmV3IHNlcnZpY2UgZGVwbG95bWVudCB3aXRoIG1vcmUgdGhhbiAxIHNlcnZpY2UgcmV2aXNpb24gaW4gYW4gQUNUSVZFIHN0YXRlLlxuICogIFlvdSBjYW4gdXNlIGEgbGlmZWN5Y2xlIGhvb2sgZm9yIHRoaXMgc3RhZ2UuXG4gKiAgICsgIFBSRV9TQ0FMRV9VUFxuICogIFRoZSBncmVlbiBzZXJ2aWNlIHJldmlzaW9uIGhhcyBub3Qgc3RhcnRlZC4gVGhlIGJsdWUgc2VydmljZSByZXZpc2lvbiBpcyBoYW5kbGluZyAxMDAlIG9mIHRoZSBwcm9kdWN0aW9uIHRyYWZmaWMuIFRoZXJlIGlzIG5vIHRlc3QgdHJhZmZpYy5cbiAqICBZb3UgY2FuIHVzZSBhIGxpZmVjeWNsZSBob29rIGZvciB0aGlzIHN0YWdlLlxuICogICArICBQT1NUX1NDQUxFX1VQXG4gKiAgVGhlIGdyZWVuIHNlcnZpY2UgcmV2aXNpb24gaGFzIHN0YXJ0ZWQuIFRoZSBibHVlIHNlcnZpY2UgcmV2aXNpb24gaXMgaGFuZGxpbmcgMTAwJSBvZiB0aGUgcHJvZHVjdGlvbiB0cmFmZmljLiBUaGVyZSBpcyBubyB0ZXN0IHRyYWZmaWMuXG4gKiAgWW91IGNhbiB1c2UgYSBsaWZlY3ljbGUgaG9vayBmb3IgdGhpcyBzdGFnZS5cbiAqICAgKyAgVEVTVF9UUkFGRklDX1NISUZUXG4gKiAgVGhlIGJsdWUgYW5kIGdyZWVuIHNlcnZpY2UgcmV2aXNpb25zIGFyZSBydW5uaW5nLiBUaGUgYmx1ZSBzZXJ2aWNlIHJldmlzaW9uIGhhbmRsZXMgMTAwJSBvZiB0aGUgcHJvZHVjdGlvbiB0cmFmZmljLiBUaGUgZ3JlZW4gc2VydmljZSByZXZpc2lvbiBpcyBtaWdyYXRpbmcgZnJvbSAwJSB0byAxMDAlIG9mIHRlc3QgdHJhZmZpYy5cbiAqICBZb3UgY2FuIHVzZSBhIGxpZmVjeWNsZSBob29rIGZvciB0aGlzIHN0YWdlLlxuICogICArICBQT1NUX1RFU1RfVFJBRkZJQ19TSElGVFxuICogIFRoZSB0ZXN0IHRyYWZmaWMgc2hpZnQgaXMgY29tcGxldGUuIFRoZSBncmVlbiBzZXJ2aWNlIHJldmlzaW9uIGhhbmRsZXMgMTAwJSBvZiB0aGUgdGVzdCB0cmFmZmljLlxuICogIFlvdSBjYW4gdXNlIGEgbGlmZWN5Y2xlIGhvb2sgZm9yIHRoaXMgc3RhZ2UuXG4gKiAgICsgIFBST0RVQ1RJT05fVFJBRkZJQ19TSElGVFxuICogIFByb2R1Y3Rpb24gdHJhZmZpYyBpcyBzaGlmdGluZyB0byB0aGUgZ3JlZW4gc2VydmljZSByZXZpc2lvbi4gVGhlIGdyZWVuIHNlcnZpY2UgcmV2aXNpb24gaXMgbWlncmF0aW5nIGZyb20gMCUgdG8gMTAwJSBvZiBwcm9kdWN0aW9uIHRyYWZmaWMuXG4gKiAgWW91IGNhbiB1c2UgYSBsaWZlY3ljbGUgaG9vayBmb3IgdGhpcyBzdGFnZS5cbiAqICAgKyAgUE9TVF9QUk9EVUNUSU9OX1RSQUZGSUNfU0hJRlRcbiAqICBUaGUgcHJvZHVjdGlvbiB0cmFmZmljIHNoaWZ0IGlzIGNvbXBsZXRlLlxuICogIFlvdSBjYW4gdXNlIGEgbGlmZWN5Y2xlIGhvb2sgZm9yIHRoaXMgc3RhZ2UuXG4gKiAgIFxuICogIFlvdSBtdXN0IHByb3ZpZGUgdGhpcyBwYXJhbWV0ZXIgd2hlbiBjb25maWd1cmluZyBhIGRlcGxveW1lbnQgbGlmZWN5Y2xlIGhvb2suXG4gKiBcbiAqIEBtaW5JdGVtcyAxXG4gKi9cbkxpZmVjeWNsZVN0YWdlczogKFwiUkVDT05DSUxFX1NFUlZJQ0VcIiB8IFwiUFJFX1NDQUxFX1VQXCIgfCBcIlBPU1RfU0NBTEVfVVBcIiB8IFwiVEVTVF9UUkFGRklDX1NISUZUXCIgfCBcIlBPU1RfVEVTVF9UUkFGRklDX1NISUZUXCIgfCBcIlBST0RVQ1RJT05fVFJBRkZJQ19TSElGVFwiIHwgXCJQT1NUX1BST0RVQ1RJT05fVFJBRkZJQ19TSElGVFwiKVtdXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgaG9vayB0YXJnZXQuIEN1cnJlbnRseSwgb25seSBMYW1iZGEgZnVuY3Rpb24gQVJOcyBhcmUgc3VwcG9ydGVkLlxuICogIFlvdSBtdXN0IHByb3ZpZGUgdGhpcyBwYXJhbWV0ZXIgd2hlbiBjb25maWd1cmluZyBhIGRlcGxveW1lbnQgbGlmZWN5Y2xlIGhvb2suXG4gKi9cbkhvb2tUYXJnZXRBcm46IHN0cmluZ1xuLyoqXG4gKiBVc2UgdGhpcyBmaWVsZCB0byBzcGVjaWZ5IGN1c3RvbSBwYXJhbWV0ZXJzIHRoYXQgRUNTIHBhc3NlcyB0byB5b3VyIGhvb2sgdGFyZ2V0IGludm9jYXRpb25zIChzdWNoIGFzIGEgTGFtYmRhIGZ1bmN0aW9uKS5cbiAqICBUaGlzIGZpZWxkIG11c3QgYmUgYSBKU09OIG9iamVjdCBhcyBhIHN0cmluZy5cbiAqL1xuSG9va0RldGFpbHM/OiAoc3RyaW5nIHwge1xuW2s6IHN0cmluZ106IHVua25vd25cbn0pXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgSUFNIHJvbGUgdGhhdCBncmFudHMgQW1hem9uIEVDUyBwZXJtaXNzaW9uIHRvIGNhbGwgTGFtYmRhIGZ1bmN0aW9ucyBvbiB5b3VyIGJlaGFsZi5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtQZXJtaXNzaW9ucyByZXF1aXJlZCBmb3IgTGFtYmRhIGZ1bmN0aW9ucyBpbiBBbWF6b24gRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2JsdWUtZ3JlZW4tcGVybWlzc2lvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Sb2xlQXJuOiBzdHJpbmdcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIENsb3VkV2F0Y2ggYWxhcm1zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRBbGFybXMge1xuLyoqXG4gKiBPbmUgb3IgbW9yZSBDbG91ZFdhdGNoIGFsYXJtIG5hbWVzLiBVc2UgYSBcIixcIiB0byBzZXBhcmF0ZSB0aGUgYWxhcm1zLlxuICovXG5BbGFybU5hbWVzOiBzdHJpbmdbXVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBDbG91ZFdhdGNoIGFsYXJtIG9wdGlvbiBpbiB0aGUgc2VydmljZSBkZXBsb3ltZW50IHByb2Nlc3MuXG4gKi9cbkVuYWJsZTogYm9vbGVhblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY29uZmlndXJlIEFtYXpvbiBFQ1MgdG8gcm9sbCBiYWNrIHRoZSBzZXJ2aWNlIGlmIGEgc2VydmljZSBkZXBsb3ltZW50IGZhaWxzLiBJZiByb2xsYmFjayBpcyB1c2VkLCB3aGVuIGEgc2VydmljZSBkZXBsb3ltZW50IGZhaWxzLCB0aGUgc2VydmljZSBpcyByb2xsZWQgYmFjayB0byB0aGUgbGFzdCBkZXBsb3ltZW50IHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAqL1xuUm9sbGJhY2s6IGJvb2xlYW5cbn1cbi8qKlxuICogVGhlIGRlcGxveW1lbnQgY2lyY3VpdCBicmVha2VyIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHNlcnZpY2VzIHVzaW5nIHRoZSByb2xsaW5nIHVwZGF0ZSAoYGBFQ1NgYCkgZGVwbG95bWVudCB0eXBlLlxuICogICBUaGUgKmRlcGxveW1lbnQgY2lyY3VpdCBicmVha2VyKiBkZXRlcm1pbmVzIHdoZXRoZXIgYSBzZXJ2aWNlIGRlcGxveW1lbnQgd2lsbCBmYWlsIGlmIHRoZSBzZXJ2aWNlIGNhbid0IHJlYWNoIGEgc3RlYWR5IHN0YXRlLiBJZiB5b3UgdXNlIHRoZSBkZXBsb3ltZW50IGNpcmN1aXQgYnJlYWtlciwgYSBzZXJ2aWNlIGRlcGxveW1lbnQgd2lsbCB0cmFuc2l0aW9uIHRvIGEgZmFpbGVkIHN0YXRlIGFuZCBzdG9wIGxhdW5jaGluZyBuZXcgdGFza3MuIElmIHlvdSB1c2UgdGhlIHJvbGxiYWNrIG9wdGlvbiwgd2hlbiBhIHNlcnZpY2UgZGVwbG95bWVudCBmYWlscywgdGhlIHNlcnZpY2UgaXMgcm9sbGVkIGJhY2sgdG8gdGhlIGxhc3QgZGVwbG95bWVudCB0aGF0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JvbGxpbmcgdXBkYXRlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9kZXBsb3ltZW50LXR5cGUtZWNzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRDaXJjdWl0QnJlYWtlciB7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgdGhlIGRlcGxveW1lbnQgY2lyY3VpdCBicmVha2VyIGxvZ2ljIGZvciB0aGUgc2VydmljZS5cbiAqL1xuRW5hYmxlOiBib29sZWFuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byBjb25maWd1cmUgQW1hem9uIEVDUyB0byByb2xsIGJhY2sgdGhlIHNlcnZpY2UgaWYgYSBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbHMuIElmIHJvbGxiYWNrIGlzIG9uLCB3aGVuIGEgc2VydmljZSBkZXBsb3ltZW50IGZhaWxzLCB0aGUgc2VydmljZSBpcyByb2xsZWQgYmFjayB0byB0aGUgbGFzdCBkZXBsb3ltZW50IHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAqL1xuUm9sbGJhY2s6IGJvb2xlYW5cbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgbGluZWFyIGRlcGxveW1lbnQgc3RyYXRlZ3kuIE9ubHkgdmFsaWQgd2hlbiB0aGUgZGVwbG95bWVudCBzdHJhdGVneSBpcyBgYExJTkVBUmBgLiBUaGlzIGNvbmZpZ3VyYXRpb24gZW5hYmxlcyBwcm9ncmVzc2l2ZSB0cmFmZmljIHNoaWZ0aW5nIGluIGVxdWFsIHBlcmNlbnRhZ2UgaW5jcmVtZW50cyB3aXRoIGNvbmZpZ3VyYWJsZSBiYWtlIHRpbWVzIGJldHdlZW4gZWFjaCBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVhckNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbWludXRlcyB0byB3YWl0IGJldHdlZW4gZWFjaCB0cmFmZmljIHNoaWZ0aW5nIHN0ZXAgZHVyaW5nIGEgbGluZWFyIGRlcGxveW1lbnQuIFZhbGlkIHZhbHVlcyBhcmUgMCB0byAxNDQwIG1pbnV0ZXMgKDI0IGhvdXJzKS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNi4gVGhpcyBiYWtlIHRpbWUgaXMgbm90IGFwcGxpZWQgYWZ0ZXIgcmVhY2hpbmcgMTAwIHBlcmNlbnQgdHJhZmZpYy5cbiAqL1xuU3RlcEJha2VUaW1lSW5NaW51dGVzPzogbnVtYmVyXG4vKipcbiAqIFRoZSBwZXJjZW50YWdlIG9mIHByb2R1Y3Rpb24gdHJhZmZpYyB0byBzaGlmdCBpbiBlYWNoIHN0ZXAgZHVyaW5nIGEgbGluZWFyIGRlcGxveW1lbnQuIFZhbGlkIHZhbHVlcyBhcmUgbXVsdGlwbGVzIG9mIDAuMSBmcm9tIDMuMCB0byAxMDAuMC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTAuMC5cbiAqL1xuU3RlcFBlcmNlbnQ/OiBudW1iZXJcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWVjcy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgYEFXUzo6RUNTOjpTZXJ2aWNlYGAgcmVzb3VyY2UgY3JlYXRlcyBhbiBBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSAoQW1hem9uIEVDUykgc2VydmljZSB0aGF0IHJ1bnMgYW5kIG1haW50YWlucyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0YXNrcyBhbmQgYXNzb2NpYXRlZCBsb2FkIGJhbGFuY2Vycy5cbiAqICAgVGhlIHN0YWNrIHVwZGF0ZSBmYWlscyBpZiB5b3UgY2hhbmdlIGFueSBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSByZXBsYWNlbWVudCBhbmQgYXQgbGVhc3Qgb25lIEVDUyBTZXJ2aWNlIENvbm5lY3QgYGBTZXJ2aWNlQ29ubmVjdENvbmZpZ3VyYXRpb25gYCBwcm9wZXJ0eSBpcyBjb25maWd1cmVkLiBUaGlzIGlzIGJlY2F1c2UgQVdTIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50IHNlcnZpY2UgZmlyc3QsIGJ1dCBlYWNoIGBgU2VydmljZUNvbm5lY3RTZXJ2aWNlYGAgbXVzdCBoYXZlIGEgbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiB0aGUgbmFtZXNwYWNlLlxuICogICAgU3RhcnRpbmcgQXByaWwgMTUsIDIwMjMsIEFXUzsgd2lsbCBub3Qgb25ib2FyZCBuZXcgY3VzdG9tZXJzIHRvIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSAoRUkpLCBhbmQgd2lsbCBoZWxwIGN1cnJlbnQgY3VzdG9tZXJzIG1pZ3JhdGUgdGhlaXIgd29ya2xvYWRzIHRvIG9wdGlvbnMgdGhhdCBvZmZlciBiZXR0ZXIgcHJpY2UgYW5kIHBlcmZvcm1hbmNlLiBBZnRlciBBcHJpbCAxNSwgMjAyMywgbmV3IGN1c3RvbWVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIGxhdW5jaCBpbnN0YW5jZXMgd2l0aCBBbWF6b24gRUkgYWNjZWxlcmF0b3JzIGluIEFtYXpvbiBTYWdlTWFrZXIsIEVDUywgb3IgRUMyLiBIb3dldmVyLCBjdXN0b21lcnMgd2hvIGhhdmUgdXNlZCBBbWF6b24gRUkgYXQgbGVhc3Qgb25jZSBkdXJpbmcgdGhlIHBhc3QgMzAtZGF5IHBlcmlvZCBhcmUgY29uc2lkZXJlZCBjdXJyZW50IGN1c3RvbWVycyBhbmQgd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBzZXJ2aWNlLiBcbiAqICAgIE9uIEp1bmUgMTIsIDIwMjUsIEFtYXpvbiBFQ1MgbGF1bmNoZWQgc3VwcG9ydCBmb3IgdXBkYXRpbmcgY2FwYWNpdHkgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBmb3IgRUNTIHNlcnZpY2VzLiBXaXRoIHRoaXMgbGF1bmNoLCBFQ1MgYWxzbyBhbGlnbmVkIHRoZSBDRk4gdXBkYXRlIGJlaGF2aW9yIGZvciBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHBhcmFtZXRlciB3aXRoIHRoZSBzdGFuZGFyZCBwcmFjdGljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbYWRkcyBzdXBwb3J0IGZvciB1cGRhdGluZyBjYXBhY2l0eSBwcm92aWRlciBjb25maWd1cmF0aW9uIGZvciBFQ1Mgc2VydmljZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hYm91dC1hd3Mvd2hhdHMtbmV3LzIwMjUvMDUvYW1hem9uLWVjcy1jYXBhY2l0eS1wcm92aWRlci1jb25maWd1cmF0aW9uLWVjcy8pLiBQcmV2aW91c2x5IEVDUyBpZ25vcmVkIHRoZSBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHByb3BlcnR5IGlmIGl0IHdhcyBzZXQgdG8gYW4gZW1wdHkgbGlzdCBmb3IgZXhhbXBsZSwgYGBbXWBgIGluIENGTiwgYmVjYXVzZSB1cGRhdGluZyBjYXBhY2l0eSBwcm92aWRlciBjb25maWd1cmF0aW9uIHdhcyBub3Qgc3VwcG9ydGVkLiBOb3csIHdpdGggc3VwcG9ydCBmb3IgY2FwYWNpdHkgcHJvdmlkZXIgdXBkYXRlcywgY3VzdG9tZXJzIGNhbiByZW1vdmUgY2FwYWNpdHkgcHJvdmlkZXJzIGZyb20gYSBzZXJ2aWNlIGJ5IHBhc3NpbmcgYW4gZW1wdHkgbGlzdC4gV2hlbiB5b3Ugc3BlY2lmeSBhbiBlbXB0eSBsaXN0IChgYFtdYGApIGZvciB0aGUgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBwcm9wZXJ0eSBpbiB5b3VyIENGTiB0ZW1wbGF0ZSwgRUNTIHdpbGwgcmVtb3ZlIGFueSBjYXBhY2l0eSBwcm92aWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLCBhcyBmb2xsb3dzOlxuICogICArICBGb3Igc2VydmljZXMgY3JlYXRlZCB3aXRoIGEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgYWZ0ZXIgdGhlIGxhdW5jaDpcbiAqICAgKyAgSWYgdGhlcmUncyBhIGNsdXN0ZXIgZGVmYXVsdCBzdHJhdGVneSBzZXQsIHRoZSBzZXJ2aWNlIHdpbGwgcmV2ZXJ0IHRvIHVzaW5nIHRoYXQgZGVmYXVsdCBzdHJhdGVneS5cbiAqICAgKyAgSWYgbm8gY2x1c3RlciBkZWZhdWx0IHN0cmF0ZWd5IGV4aXN0cywgeW91IHdpbGwgcmVjZWl2ZSB0aGUgZm9sbG93aW5nIGVycm9yOlxuICogIE5vIGxhdW5jaCB0eXBlIHRvIGZhbGwgYmFjayB0byBmb3IgZW1wdHkgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kuIFlvdXIgc2VydmljZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIGxhdW5jaCB0eXBlLlxuICogICBcbiAqICAgKyAgRm9yIHNlcnZpY2VzIGNyZWF0ZWQgd2l0aCBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IHByaW9yIHRvIHRoZSBsYXVuY2g6XG4gKiAgICsgIElmIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgaGFkIGBgRkFSR0FURV9TUE9UYGAgb3IgYGBGQVJHQVRFYGAgY2FwYWNpdHkgcHJvdmlkZXJzLCB0aGUgbGF1bmNoIHR5cGUgd2lsbCBiZSB1cGRhdGVkIHRvIGBgRkFSR0FURWBgIGFuZCB0aGUgY2FwYWNpdHkgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkLlxuICogICArICBJZiB0aGUgc3RyYXRlZ3kgaW5jbHVkZWQgQXV0byBTY2FsaW5nIGdyb3VwIGNhcGFjaXR5IHByb3ZpZGVycywgdGhlIHNlcnZpY2Ugd2lsbCByZXZlcnQgdG8gRUMyIGxhdW5jaCB0eXBlLCBhbmQgdGhlIEF1dG8gU2NhbGluZyBncm91cCBjYXBhY2l0eSBwcm92aWRlcnMgd2lsbCBub3QgYmUgdXNlZC5cbiAqICAgXG4gKiAgIFxuICogIFJlY29tbWVuZGVkIEFjdGlvbnNcbiAqICBJZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyBgYENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneTogW11gYCBpbiB5b3VyIENGTiB0ZW1wbGF0ZXMsIHlvdSBzaG91bGQgdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOlxuICogICArICBJZiB5b3UgZG8gbm90IGludGVuZCB0byB1cGRhdGUgdGhlIENhcGFjaXR5IFByb3ZpZGVyIFN0cmF0ZWd5OlxuICogICArICBSZW1vdmUgdGhlIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgcHJvcGVydHkgZW50aXJlbHkgZnJvbSB5b3VyIENGTiB0ZW1wbGF0ZVxuICogICArICBBbHRlcm5hdGl2ZWx5LCB1c2UgYGAhUmVmIDo6Tm9WYWx1ZWBgIGZvciB0aGUgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBwcm9wZXJ0eSBpbiB5b3VyIHRlbXBsYXRlXG4gKiAgIFxuICogICArICBJZiB5b3UgaW50ZW5kIHRvIG1haW50YWluIG9yIHVwZGF0ZSB0aGUgQ2FwYWNpdHkgUHJvdmlkZXIgU3RyYXRlZ3ksIHNwZWNpZnkgdGhlIGFjdHVhbCBDYXBhY2l0eSBQcm92aWRlciBTdHJhdGVneSBmb3IgdGhlIHNlcnZpY2UgaW4geW91ciBDRk4gdGVtcGxhdGUuXG4gKiAgIFxuICogIElmIHlvdXIgQ0ZOIHRlbXBsYXRlIGhhZCBhbiBlbXB0eSBsaXN0IChbXSkgZm9yIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5YGAgcHJpb3IgdG8gdGhlIGFmb3JlbWVudGlvbmVkIGxhdW5jaCBvbiBKdW5lIDEyLCBhbmQgeW91IGFyZSB1c2luZyB0aGUgc2FtZSB0ZW1wbGF0ZSB3aXRoIGBgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5OiBbXWBgLCB5b3UgbWlnaHQgZW5jb3VudGVyIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gKiAgIEludmFsaWQgcmVxdWVzdCBwcm92aWRlZDogV2hlbiBzd2l0Y2hpbmcgZnJvbSBsYXVuY2ggdHlwZSB0byBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBvbiBhbiBleGlzdGluZyBzZXJ2aWNlLCBvciBtYWtpbmcgYSBjaGFuZ2UgdG8gYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBvbiBhIHNlcnZpY2UgdGhhdCBpcyBhbHJlYWR5IHVzaW5nIG9uZSwgeW91IG11c3QgZm9yY2UgYSBuZXcgZGVwbG95bWVudC4gKFNlcnZpY2U6IEVjcywgU3RhdHVzIENvZGU6IDQwMCwgUmVxdWVzdCBJRDogeHh4KSAoU0RLIEF0dGVtcHQgQ291bnQ6IDEpXCIgKFJlcXVlc3RUb2tlbjogeHh4IEhhbmRsZXJFcnJvckNvZGU6IEludmFsaWRSZXF1ZXN0KSBcbiAqICBOb3RlIHRoYXQgQ0ZOIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGVzIGEgbmV3IGRlcGxveW1lbnQgd2hlbiBpdCBkZXRlY3RzIGEgcGFyYW1ldGVyIGNoYW5nZSwgYnV0IGN1c3RvbWVycyBjYW5ub3QgY2hvb3NlIHRvIGZvcmNlIGEgZGVwbG95bWVudCB0aHJvdWdoIENGTi4gVGhpcyBpcyBhbiBpbnZhbGlkIGlucHV0IHNjZW5hcmlvIHRoYXQgcmVxdWlyZXMgb25lIG9mIHRoZSByZW1lZGlhdGlvbiBhY3Rpb25zIGxpc3RlZCBhYm92ZS5cbiAqICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBhY3RpdmUgcHJvZHVjdGlvbiBpc3N1ZXMgcmVsYXRlZCB0byB0aGlzIGNoYW5nZSwgY29udGFjdCBBV1MgU3VwcG9ydCBvciB5b3VyIFRlY2huaWNhbCBBY2NvdW50IE1hbmFnZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgX0FXU19FQ1NfU0VSVklDRSB7XG4vKipcbiAqIFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRoYXQgeW91ciB0YXNrcyBpbiB0aGUgc2VydmljZSBhcmUgcnVubmluZyBvbi4gQSBwbGF0Zm9ybSB2ZXJzaW9uIGlzIHNwZWNpZmllZCBvbmx5IGZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS4gSWYgb25lIGlzbid0IHNwZWNpZmllZCwgdGhlIGBgTEFURVNUYGAgcGxhdGZvcm0gdmVyc2lvbiBpcyB1c2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtwbGF0Zm9ybSB2ZXJzaW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcGxhdGZvcm1fdmVyc2lvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5QbGF0Zm9ybVZlcnNpb24/OiBzdHJpbmdcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSB0YWdzIGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgdGFzay4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgdGFncyBhcmVuJ3QgcHJvcGFnYXRlZC4gVGFncyBjYW4gb25seSBiZSBwcm9wYWdhdGVkIHRvIHRoZSB0YXNrIGR1cmluZyB0YXNrIGNyZWF0aW9uLiBUbyBhZGQgdGFncyB0byBhIHRhc2sgYWZ0ZXIgdGFzayBjcmVhdGlvbiwgdXNlIHRoZSBbVGFnUmVzb3VyY2VdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbCkgQVBJIGFjdGlvbi5cbiAqICBZb3UgbXVzdCBzZXQgdGhpcyB0byBhIHZhbHVlIG90aGVyIHRoYW4gYGBOT05FYGAgd2hlbiB5b3UgdXNlIENvc3QgRXhwbG9yZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgdXNhZ2UgcmVwb3J0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNhZ2UtcmVwb3J0cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgaXMgYGBOT05FYGAuXG4gKi9cblByb3BhZ2F0ZVRhZ3M/OiAoXCJTRVJWSUNFXCIgfCBcIlRBU0tfREVGSU5JVElPTlwiKVxuU2VydmljZUFybj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcGxhY2VtZW50IHN0cmF0ZWd5IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcyBpbiB5b3VyIHNlcnZpY2UuIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgNSBzdHJhdGVneSBydWxlcyBmb3IgZWFjaCBzZXJ2aWNlLlxuICogICBUbyByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgc2VydmljZSByZXNvdXJjZSwgc3BlY2lmeSBhbiBlbXB0eSBgYFBsYWNlbWVudFN0cmF0ZWd5YGAgYXJyYXkuXG4gKi9cblBsYWNlbWVudFN0cmF0ZWdpZXM/OiBQbGFjZW1lbnRTdHJhdGVneVtdXG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByZWdpc3RyeSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHNlcnZpY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2UgZGlzY292ZXJ5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWRpc2NvdmVyeS5odG1sKS5cbiAqICAgRWFjaCBzZXJ2aWNlIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggb25lIHNlcnZpY2UgcmVnaXN0cnkuIE11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcyBmb3IgZWFjaCBzZXJ2aWNlIGlzbid0IHN1cHBvcnRlZC5cbiAqICAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgU2VydmljZVJlZ2lzdHJ5YGAgYXJyYXkuXG4gKi9cblNlcnZpY2VSZWdpc3RyaWVzPzogU2VydmljZVJlZ2lzdHJ5W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgdm9sdW1lIHNwZWNpZmllZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uIGFzIGEgdm9sdW1lIHRoYXQgaXMgY29uZmlndXJlZCBhdCBsYXVuY2ggdGltZS4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgdm9sdW1lIHR5cGUgaXMgYW4gQW1hem9uIEVCUyB2b2x1bWUuXG4gKiAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgU2VydmljZVZvbHVtZUNvbmZpZ3VyYXRpb25gYCBhcnJheS5cbiAqL1xuVm9sdW1lQ29uZmlndXJhdGlvbnM/OiBTZXJ2aWNlVm9sdW1lQ29uZmlndXJhdGlvbltdXG4vKipcbiAqIFRoZSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSBzZXJ2aWNlLlxuICogIElmIGEgYGBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lgYCBpcyBzcGVjaWZpZWQsIHRoZSBgYGxhdW5jaFR5cGVgYCBwYXJhbWV0ZXIgbXVzdCBiZSBvbWl0dGVkLiBJZiBubyBgYGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIG9yIGBgbGF1bmNoVHlwZWBgIGlzIHNwZWNpZmllZCwgdGhlIGBgZGVmYXVsdENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIGZvciB0aGUgY2x1c3RlciBpcyB1c2VkLlxuICogIEEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgY2FuIGNvbnRhaW4gYSBtYXhpbXVtIG9mIDIwIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqICAgVG8gcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIHNlcnZpY2UgcmVzb3VyY2UsIHNwZWNpZnkgYW4gZW1wdHkgYGBDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3lJdGVtYGAgYXJyYXkuXG4gKi9cbkNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneT86IENhcGFjaXR5UHJvdmlkZXJTdHJhdGVneUl0ZW1bXVxuLyoqXG4gKiBUaGUgbGF1bmNoIHR5cGUgb24gd2hpY2ggdG8gcnVuIHlvdXIgc2VydmljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBMYXVuY2ggVHlwZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xhdW5jaF90eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIElmIHlvdSB3YW50IHRvIHVzZSBNYW5hZ2VkIEluc3RhbmNlcywgeW91IG11c3QgdXNlIHRoZSBgYGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneWBgIHJlcXVlc3QgcGFyYW1ldGVyXG4gKi9cbkxhdW5jaFR5cGU/OiAoXCJFQzJcIiB8IFwiRkFSR0FURVwiIHwgXCJFWFRFUk5BTFwiKVxuTmFtZT86IHN0cmluZ1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgQXZhaWxhYmlsaXR5IFpvbmUgcmViYWxhbmNpbmcgZm9yIHRoZSBzZXJ2aWNlLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0JhbGFuY2luZyBhbiBBbWF6b24gRUNTIHNlcnZpY2UgYWNyb3NzIEF2YWlsYWJpbGl0eSBab25lc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1yZWJhbGFuY2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgYGBBdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmdgYCBkaWZmZXJzIGJldHdlZW4gY3JlYXRlIGFuZCB1cGRhdGUgcmVxdWVzdHM6XG4gKiAgICsgIEZvciBjcmVhdGUgc2VydmljZSByZXF1ZXN0cywgd2hlbiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGBgQXZhaWxhYmlsaXR5Wm9uZVJlYmFsYW5jaW5nYGAsIEFtYXpvbiBFQ1MgZGVmYXVsdHMgdGhlIHZhbHVlIHRvIGBgRU5BQkxFRGBgLlxuICogICArICBGb3IgdXBkYXRlIHNlcnZpY2UgcmVxdWVzdHMsIHdoZW4gbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBgYEF2YWlsYWJpbGl0eVpvbmVSZWJhbGFuY2luZ2BgLCBBbWF6b24gRUNTIGRlZmF1bHRzIHRvIHRoZSBleGlzdGluZyBzZXJ2aWNl4oCZcyBgYEF2YWlsYWJpbGl0eVpvbmVSZWJhbGFuY2luZ2BgIHZhbHVlLiBJZiB0aGUgc2VydmljZSBuZXZlciBoYWQgYW4gYGBBdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmdgYCB2YWx1ZSBzZXQsIEFtYXpvbiBFQ1MgdHJlYXRzIHRoaXMgYXMgYGBESVNBQkxFRGBgLlxuICovXG5BdmFpbGFiaWxpdHlab25lUmViYWxhbmNpbmc/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG4vKipcbiAqIFRoZSBzY2hlZHVsaW5nIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHNlcnZpY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Nfc2VydmljZXMuaHRtbCkuXG4gKiAgVGhlcmUgYXJlIHR3byBzZXJ2aWNlIHNjaGVkdWxlciBzdHJhdGVnaWVzIGF2YWlsYWJsZTpcbiAqICAgKyAgYGBSRVBMSUNBYGAtVGhlIHJlcGxpY2Egc2NoZWR1bGluZyBzdHJhdGVneSBwbGFjZXMgYW5kIG1haW50YWlucyB0aGUgZGVzaXJlZCBudW1iZXIgb2YgdGFza3MgYWNyb3NzIHlvdXIgY2x1c3Rlci4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHNwcmVhZHMgdGFza3MgYWNyb3NzIEF2YWlsYWJpbGl0eSBab25lcy4gWW91IGNhbiB1c2UgdGFzayBwbGFjZW1lbnQgc3RyYXRlZ2llcyBhbmQgY29uc3RyYWludHMgdG8gY3VzdG9taXplIHRhc2sgcGxhY2VtZW50IGRlY2lzaW9ucy4gVGhpcyBzY2hlZHVsZXIgc3RyYXRlZ3kgaXMgcmVxdWlyZWQgaWYgdGhlIHNlcnZpY2UgdXNlcyB0aGUgYGBDT0RFX0RFUExPWWBgIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZXMuXG4gKiAgICsgIGBgREFFTU9OYGAtVGhlIGRhZW1vbiBzY2hlZHVsaW5nIHN0cmF0ZWd5IGRlcGxveXMgZXhhY3RseSBvbmUgdGFzayBvbiBlYWNoIGFjdGl2ZSBjb250YWluZXIgaW5zdGFuY2UgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIHRoYXQgeW91IHNwZWNpZnkgaW4geW91ciBjbHVzdGVyLiBUaGUgc2VydmljZSBzY2hlZHVsZXIgYWxzbyBldmFsdWF0ZXMgdGhlIHRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGZvciBydW5uaW5nIHRhc2tzIGFuZCB3aWxsIHN0b3AgdGFza3MgdGhhdCBkb24ndCBtZWV0IHRoZSBwbGFjZW1lbnQgY29uc3RyYWludHMuIFdoZW4geW91J3JlIHVzaW5nIHRoaXMgc3RyYXRlZ3ksIHlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSBkZXNpcmVkIG51bWJlciBvZiB0YXNrcywgYSB0YXNrIHBsYWNlbWVudCBzdHJhdGVneSwgb3IgdXNlIFNlcnZpY2UgQXV0byBTY2FsaW5nIHBvbGljaWVzLlxuICogICBUYXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSBvciB0aGUgYGBDT0RFX0RFUExPWWBgIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZXMgZG9uJ3Qgc3VwcG9ydCB0aGUgYGBEQUVNT05gYCBzY2hlZHVsaW5nIHN0cmF0ZWd5LlxuICovXG5TY2hlZHVsaW5nU3RyYXRlZ3k/OiAoXCJEQUVNT05cIiB8IFwiUkVQTElDQVwiKVxuTmV0d29ya0NvbmZpZ3VyYXRpb24/OiBOZXR3b3JrQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgdGhhdCB5b3UgYXBwbHkgdG8gdGhlIHNlcnZpY2UgdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLCBib3RoIG9mIHdoaWNoIHlvdSBkZWZpbmUuIFdoZW4gYSBzZXJ2aWNlIGlzIGRlbGV0ZWQsIHRoZSB0YWdzIGFyZSBkZWxldGVkIGFzIHdlbGwuXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5Gb3JjZU5ld0RlcGxveW1lbnQ/OiBGb3JjZU5ld0RlcGxveW1lbnRcbi8qKlxuICogVGhlIHBlcmlvZCBvZiB0aW1lLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSBBbWF6b24gRUNTIHNlcnZpY2Ugc2NoZWR1bGVyIGlnbm9yZXMgdW5oZWFsdGh5IEVsYXN0aWMgTG9hZCBCYWxhbmNpbmcsIFZQQyBMYXR0aWNlLCBhbmQgY29udGFpbmVyIGhlYWx0aCBjaGVja3MgYWZ0ZXIgYSB0YXNrIGhhcyBmaXJzdCBzdGFydGVkLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBoZWFsdGggY2hlY2sgZ3JhY2UgcGVyaW9kIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAwIGlzIHVzZWQuIElmIHlvdSBkbyBub3QgdXNlIGFueSBvZiB0aGUgaGVhbHRoIGNoZWNrcywgdGhlbiBgYGhlYWx0aENoZWNrR3JhY2VQZXJpb2RTZWNvbmRzYGAgaXMgdW51c2VkLlxuICogIElmIHlvdXIgc2VydmljZSBoYXMgbW9yZSBydW5uaW5nIHRhc2tzIHRoYW4gZGVzaXJlZCwgdW5oZWFsdGh5IHRhc2tzIGluIHRoZSBncmFjZSBwZXJpb2QgbWlnaHQgYmUgc3RvcHBlZCB0byByZWFjaCB0aGUgZGVzaXJlZCBjb3VudC5cbiAqL1xuSGVhbHRoQ2hlY2tHcmFjZVBlcmlvZFNlY29uZHM/OiBudW1iZXJcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdHVybiBvbiBBbWF6b24gRUNTIG1hbmFnZWQgdGFncyBmb3IgdGhlIHRhc2tzIHdpdGhpbiB0aGUgc2VydmljZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFnZ2luZyB5b3VyIEFtYXpvbiBFQ1MgcmVzb3VyY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtdXNpbmctdGFncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgV2hlbiB5b3UgdXNlIEFtYXpvbiBFQ1MgbWFuYWdlZCB0YWdzLCB5b3UgbXVzdCBzZXQgdGhlIGBgcHJvcGFnYXRlVGFnc2BgIHJlcXVlc3QgcGFyYW1ldGVyLlxuICovXG5FbmFibGVFQ1NNYW5hZ2VkVGFncz86IGJvb2xlYW5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleGVjdXRlIGNvbW1hbmQgZnVuY3Rpb25hbGl0eSBpcyB0dXJuZWQgb24gZm9yIHRoZSBzZXJ2aWNlLiBJZiBgYHRydWVgYCwgdGhlIGV4ZWN1dGUgY29tbWFuZCBmdW5jdGlvbmFsaXR5IGlzIHR1cm5lZCBvbiBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gdGFza3MgYXMgcGFydCBvZiB0aGUgc2VydmljZS5cbiAqL1xuRW5hYmxlRXhlY3V0ZUNvbW1hbmQ/OiBib29sZWFuXG4vKipcbiAqIEFuIGFycmF5IG9mIHBsYWNlbWVudCBjb25zdHJhaW50IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcyBpbiB5b3VyIHNlcnZpY2UuIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgMTAgY29uc3RyYWludHMgZm9yIGVhY2ggdGFzay4gVGhpcyBsaW1pdCBpbmNsdWRlcyBjb25zdHJhaW50cyBpbiB0aGUgdGFzayBkZWZpbml0aW9uIGFuZCB0aG9zZSBzcGVjaWZpZWQgYXQgcnVudGltZS5cbiAqICAgVG8gcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIHNlcnZpY2UgcmVzb3VyY2UsIHNwZWNpZnkgYW4gZW1wdHkgYGBQbGFjZW1lbnRDb25zdHJhaW50YGAgYXJyYXkuXG4gKi9cblBsYWNlbWVudENvbnN0cmFpbnRzPzogUGxhY2VtZW50Q29uc3RyYWludFtdXG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGNsdXN0ZXIgdGhhdCB5b3UgcnVuIHlvdXIgc2VydmljZSBvbi4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgY2x1c3RlciwgdGhlIGRlZmF1bHQgY2x1c3RlciBpcyBhc3N1bWVkLlxuICovXG5DbHVzdGVyPzogc3RyaW5nXG4vKipcbiAqIEEgbGlzdCBvZiBsb2FkIGJhbGFuY2VyIG9iamVjdHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UuIElmIHlvdSBzcGVjaWZ5IHRoZSBgYFJvbGVgYCBwcm9wZXJ0eSwgYGBMb2FkQmFsYW5jZXJzYGAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgd2VsbC4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgbG9hZCBiYWxhbmNlcnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgcGVyIHNlcnZpY2UsIHNlZSBbU2VydmljZSBMb2FkIEJhbGFuY2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1sb2FkLWJhbGFuY2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRvIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBzZXJ2aWNlIHJlc291cmNlLCBzcGVjaWZ5IGFuIGVtcHR5IGBgTG9hZEJhbGFuY2VyYGAgYXJyYXkuXG4gKi9cbkxvYWRCYWxhbmNlcnM/OiBMb2FkQmFsYW5jZXJbXVxuU2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uPzogU2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgaW5zdGFudGlhdGlvbnMgb2YgdGhlIHNwZWNpZmllZCB0YXNrIGRlZmluaXRpb24gdG8gcGxhY2UgYW5kIGtlZXAgcnVubmluZyBpbiB5b3VyIHNlcnZpY2UuXG4gKiAgRm9yIG5ldyBzZXJ2aWNlcywgaWYgYSBkZXNpcmVkIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiBgYDFgYCBpcyB1c2VkLiBXaGVuIHVzaW5nIHRoZSBgYERBRU1PTmBgIHNjaGVkdWxpbmcgc3RyYXRlZ3ksIHRoZSBkZXNpcmVkIGNvdW50IGlzIG5vdCByZXF1aXJlZC5cbiAqICBGb3IgZXhpc3Rpbmcgc2VydmljZXMsIGlmIGEgZGVzaXJlZCBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBvbWl0dGVkIGZyb20gdGhlIG9wZXJhdGlvbi5cbiAqL1xuRGVzaXJlZENvdW50PzogbnVtYmVyXG4vKipcbiAqIFRoZSBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmljZSBiZWluZyBjcmVhdGVkLlxuICovXG5WcGNMYXR0aWNlQ29uZmlndXJhdGlvbnM/OiBWcGNMYXR0aWNlQ29uZmlndXJhdGlvbltdXG5EZXBsb3ltZW50Q29udHJvbGxlcj86IERlcGxveW1lbnRDb250cm9sbGVyXG4vKipcbiAqIFRoZSBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQgYWxsb3dzIEFtYXpvbiBFQ1MgdG8gbWFrZSBjYWxscyB0byB5b3VyIGxvYWQgYmFsYW5jZXIgb24geW91ciBiZWhhbGYuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgcGVybWl0dGVkIGlmIHlvdSBhcmUgdXNpbmcgYSBsb2FkIGJhbGFuY2VyIHdpdGggeW91ciBzZXJ2aWNlIGFuZCB5b3VyIHRhc2sgZGVmaW5pdGlvbiBkb2Vzbid0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuIElmIHlvdSBzcGVjaWZ5IHRoZSBgYHJvbGVgYCBwYXJhbWV0ZXIsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBhIGxvYWQgYmFsYW5jZXIgb2JqZWN0IHdpdGggdGhlIGBgbG9hZEJhbGFuY2Vyc2BgIHBhcmFtZXRlci5cbiAqICAgSWYgeW91ciBhY2NvdW50IGhhcyBhbHJlYWR5IGNyZWF0ZWQgdGhlIEFtYXpvbiBFQ1Mgc2VydmljZS1saW5rZWQgcm9sZSwgdGhhdCByb2xlIGlzIHVzZWQgZm9yIHlvdXIgc2VydmljZSB1bmxlc3MgeW91IHNwZWNpZnkgYSByb2xlIGhlcmUuIFRoZSBzZXJ2aWNlLWxpbmtlZCByb2xlIGlzIHJlcXVpcmVkIGlmIHlvdXIgdGFzayBkZWZpbml0aW9uIHVzZXMgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIG9yIGlmIHRoZSBzZXJ2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHNlcnZpY2UgZGlzY292ZXJ5LCBhbiBleHRlcm5hbCBkZXBsb3ltZW50IGNvbnRyb2xsZXIsIG11bHRpcGxlIHRhcmdldCBncm91cHMsIG9yIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9ycyBpbiB3aGljaCBjYXNlIHlvdSBkb24ndCBzcGVjaWZ5IGEgcm9sZSBoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBzZXJ2aWNlLWxpbmtlZCByb2xlcyBmb3IgQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB5b3VyIHNwZWNpZmllZCByb2xlIGhhcyBhIHBhdGggb3RoZXIgdGhhbiBgYC9gYCwgdGhlbiB5b3UgbXVzdCBlaXRoZXIgc3BlY2lmeSB0aGUgZnVsbCByb2xlIEFSTiAodGhpcyBpcyByZWNvbW1lbmRlZCkgb3IgcHJlZml4IHRoZSByb2xlIG5hbWUgd2l0aCB0aGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIGEgcm9sZSB3aXRoIHRoZSBuYW1lIGBgYmFyYGAgaGFzIGEgcGF0aCBvZiBgYC9mb28vYGAgdGhlbiB5b3Ugd291bGQgc3BlY2lmeSBgYC9mb28vYmFyYGAgYXMgdGhlIHJvbGUgbmFtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRnJpZW5kbHkgbmFtZXMgYW5kIHBhdGhzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lkZW50aWZpZXJzLmh0bWwjaWRlbnRpZmllcnMtZnJpZW5kbHktbmFtZXMpIGluIHRoZSAqSUFNIFVzZXIgR3VpZGUqLlxuICovXG5Sb2xlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBgYGZhbWlseWBgIGFuZCBgYHJldmlzaW9uYGAgKGBgZmFtaWx5OnJldmlzaW9uYGApIG9yIGZ1bGwgQVJOIG9mIHRoZSB0YXNrIGRlZmluaXRpb24gdG8gcnVuIGluIHlvdXIgc2VydmljZS4gSWYgYSBgYHJldmlzaW9uYGAgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IGBgQUNUSVZFYGAgcmV2aXNpb24gaXMgdXNlZC5cbiAqICBBIHRhc2sgZGVmaW5pdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgc2VydmljZSB1c2VzIGVpdGhlciB0aGUgYGBFQ1NgYCBvciBgYENPREVfREVQTE9ZYGAgZGVwbG95bWVudCBjb250cm9sbGVycy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZXBsb3ltZW50IHR5cGVzLCBzZWUgW0FtYXpvbiBFQ1MgZGVwbG95bWVudCB0eXBlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZGVwbG95bWVudC10eXBlcy5odG1sKS5cbiAqL1xuVGFza0RlZmluaXRpb24/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgeW91ciBzZXJ2aWNlLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuIFNlcnZpY2UgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgY2x1c3RlciwgYnV0IHlvdSBjYW4gaGF2ZSBzaW1pbGFybHkgbmFtZWQgc2VydmljZXMgaW4gbXVsdGlwbGUgY2x1c3RlcnMgd2l0aGluIGEgUmVnaW9uIG9yIGFjcm9zcyBtdWx0aXBsZSBSZWdpb25zLlxuICogICBUaGUgc3RhY2sgdXBkYXRlIGZhaWxzIGlmIHlvdSBjaGFuZ2UgYW55IHByb3BlcnRpZXMgdGhhdCByZXF1aXJlIHJlcGxhY2VtZW50IGFuZCB0aGUgYGBTZXJ2aWNlTmFtZWBgIGlzIGNvbmZpZ3VyZWQuIFRoaXMgaXMgYmVjYXVzZSBBV1MgQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnQgc2VydmljZSBmaXJzdCwgYnV0IGVhY2ggYGBTZXJ2aWNlTmFtZWBgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBjbHVzdGVyLlxuICovXG5TZXJ2aWNlTmFtZT86IHN0cmluZ1xuRGVwbG95bWVudENvbmZpZ3VyYXRpb24/OiBEZXBsb3ltZW50Q29uZmlndXJhdGlvblxufVxuLyoqXG4gKiBUaGUgdGFzayBwbGFjZW1lbnQgc3RyYXRlZ3kgZm9yIGEgdGFzayBvciBzZXJ2aWNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUYXNrIHBsYWNlbWVudCBzdHJhdGVnaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1zdHJhdGVnaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRTdHJhdGVneSB7XG4vKipcbiAqIFRoZSBmaWVsZCB0byBhcHBseSB0aGUgcGxhY2VtZW50IHN0cmF0ZWd5IGFnYWluc3QuIEZvciB0aGUgYGBzcHJlYWRgYCBwbGFjZW1lbnQgc3RyYXRlZ3ksIHZhbGlkIHZhbHVlcyBhcmUgYGBpbnN0YW5jZUlkYGAgKG9yIGBgaG9zdGBgLCB3aGljaCBoYXMgdGhlIHNhbWUgZWZmZWN0KSwgb3IgYW55IHBsYXRmb3JtIG9yIGN1c3RvbSBhdHRyaWJ1dGUgdGhhdCdzIGFwcGxpZWQgdG8gYSBjb250YWluZXIgaW5zdGFuY2UsIHN1Y2ggYXMgYGBhdHRyaWJ1dGU6ZWNzLmF2YWlsYWJpbGl0eS16b25lYGAuIEZvciB0aGUgYGBiaW5wYWNrYGAgcGxhY2VtZW50IHN0cmF0ZWd5LCB2YWxpZCB2YWx1ZXMgYXJlIGBgY3B1YGAgYW5kIGBgbWVtb3J5YGAuIEZvciB0aGUgYGByYW5kb21gYCBwbGFjZW1lbnQgc3RyYXRlZ3ksIHRoaXMgZmllbGQgaXMgbm90IHVzZWQuXG4gKi9cbkZpZWxkPzogc3RyaW5nXG4vKipcbiAqIFRoZSB0eXBlIG9mIHBsYWNlbWVudCBzdHJhdGVneS4gVGhlIGBgcmFuZG9tYGAgcGxhY2VtZW50IHN0cmF0ZWd5IHJhbmRvbWx5IHBsYWNlcyB0YXNrcyBvbiBhdmFpbGFibGUgY2FuZGlkYXRlcy4gVGhlIGBgc3ByZWFkYGAgcGxhY2VtZW50IHN0cmF0ZWd5IHNwcmVhZHMgcGxhY2VtZW50IGFjcm9zcyBhdmFpbGFibGUgY2FuZGlkYXRlcyBldmVubHkgYmFzZWQgb24gdGhlIGBgZmllbGRgYCBwYXJhbWV0ZXIuIFRoZSBgYGJpbnBhY2tgYCBzdHJhdGVneSBwbGFjZXMgdGFza3Mgb24gYXZhaWxhYmxlIGNhbmRpZGF0ZXMgdGhhdCBoYXZlIHRoZSBsZWFzdCBhdmFpbGFibGUgYW1vdW50IG9mIHRoZSByZXNvdXJjZSB0aGF0J3Mgc3BlY2lmaWVkIHdpdGggdGhlIGBgZmllbGRgYCBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgYmlucGFjayBvbiBtZW1vcnksIGEgdGFzayBpcyBwbGFjZWQgb24gdGhlIGluc3RhbmNlIHdpdGggdGhlIGxlYXN0IGFtb3VudCBvZiByZW1haW5pbmcgbWVtb3J5IGJ1dCBzdGlsbCBlbm91Z2ggdG8gcnVuIHRoZSB0YXNrLlxuICovXG5UeXBlOiAoXCJiaW5wYWNrXCIgfCBcInJhbmRvbVwiIHwgXCJzcHJlYWRcIilcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LlxuICogIEVhY2ggc2VydmljZSBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBNdWx0aXBsZSBzZXJ2aWNlIHJlZ2lzdHJpZXMgZm9yIGVhY2ggc2VydmljZSBhcmUgbm90IHN1cHBvcnRlZC5cbiAqICBXaGVuIHlvdSBhZGQsIHVwZGF0ZSwgb3IgcmVtb3ZlIHRoZSBzZXJ2aWNlIHJlZ2lzdHJpZXMgY29uZmlndXJhdGlvbiwgQW1hem9uIEVDUyBzdGFydHMgYSBuZXcgZGVwbG95bWVudC4gTmV3IHRhc2tzIGFyZSByZWdpc3RlcmVkIGFuZCBkZXJlZ2lzdGVyZWQgdG8gdGhlIHVwZGF0ZWQgc2VydmljZSByZWdpc3RyeSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4vKipcbiAqIFRoZSBjb250YWluZXIgbmFtZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB5b3VyIHNlcnZpY2UgZGlzY292ZXJ5IHNlcnZpY2UuIEl0J3MgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi4gSWYgdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdXIgc2VydmljZSB0YXNrIHNwZWNpZmllcyB1c2VzIHRoZSBgYGJyaWRnZWBgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IG11c3Qgc3BlY2lmeSBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24uIElmIHRoZSB0YXNrIGRlZmluaXRpb24gdGhhdCB5b3VyIHNlcnZpY2UgdGFzayBzcGVjaWZpZXMgdXNlcyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgYW5kIGEgdHlwZSBTUlYgRE5TIHJlY29yZCBpcyB1c2VkLCB5b3UgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBvciBhIGBgcG9ydGBgIHZhbHVlLiBIb3dldmVyLCB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoLlxuICovXG5Db250YWluZXJOYW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IHZhbHVlIHVzZWQgaWYgeW91ciBzZXJ2aWNlIGRpc2NvdmVyeSBzZXJ2aWNlIHNwZWNpZmllZCBhbiBTUlYgcmVjb3JkLiBUaGlzIGZpZWxkIG1pZ2h0IGJlIHVzZWQgaWYgYm90aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgYW5kIFNSViByZWNvcmRzIGFyZSB1c2VkLlxuICovXG5Qb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwb3J0IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHlvdXIgc2VydmljZSBkaXNjb3Zlcnkgc2VydmljZS4gSXQncyBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBJZiB0aGUgdGFzayBkZWZpbml0aW9uIHlvdXIgc2VydmljZSB0YXNrIHNwZWNpZmllcyB1c2VzIHRoZSBgYGJyaWRnZWBgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IG11c3Qgc3BlY2lmeSBhIGBgY29udGFpbmVyTmFtZWBgIGFuZCBgYGNvbnRhaW5lclBvcnRgYCBjb21iaW5hdGlvbiBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24uIElmIHRoZSB0YXNrIGRlZmluaXRpb24geW91ciBzZXJ2aWNlIHRhc2sgc3BlY2lmaWVzIHVzZXMgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGFuZCBhIHR5cGUgU1JWIEROUyByZWNvcmQgaXMgdXNlZCwgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSBgYGNvbnRhaW5lck5hbWVgYCBhbmQgYGBjb250YWluZXJQb3J0YGAgY29tYmluYXRpb24gb3IgYSBgYHBvcnRgYCB2YWx1ZS4gSG93ZXZlciwgeW91IGNhbid0IHNwZWNpZnkgYm90aC5cbiAqL1xuQ29udGFpbmVyUG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNlcnZpY2UgcmVnaXN0cnkuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHNlcnZpY2UgcmVnaXN0cnkgaXMgQ01BUC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRlU2VydmljZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkLW1hcC9sYXRlc3QvYXBpL0FQSV9DcmVhdGVTZXJ2aWNlLmh0bWwpLlxuICovXG5SZWdpc3RyeUFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgYSB2b2x1bWUgc3BlY2lmaWVkIGluIHRoZSB0YXNrIGRlZmluaXRpb24gYXMgYSB2b2x1bWUgdGhhdCBpcyBjb25maWd1cmVkIGF0IGxhdW5jaCB0aW1lLiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2b2x1bWUgdHlwZSBpcyBhbiBBbWF6b24gRUJTIHZvbHVtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVm9sdW1lQ29uZmlndXJhdGlvbiB7XG5NYW5hZ2VkRUJTVm9sdW1lPzogU2VydmljZU1hbmFnZWRFQlNWb2x1bWVDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUuIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdm9sdW1lIG5hbWUgZnJvbSB0aGUgYGBWb2x1bWVgYCBvYmplY3QgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQW1hem9uIEVCUyB2b2x1bWUgdGhhdCBBbWF6b24gRUNTIGNyZWF0ZXMgYW5kIG1hbmFnZXMgb24geW91ciBiZWhhbGYuIFRoZXNlIHNldHRpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBlYWNoIEFtYXpvbiBFQlMgdm9sdW1lLCB3aXRoIG9uZSB2b2x1bWUgY3JlYXRlZCBmb3IgZWFjaCB0YXNrIGluIHRoZSBzZXJ2aWNlLiBUaGUgQW1hem9uIEVCUyB2b2x1bWVzIGFyZSB2aXNpYmxlIGluIHlvdXIgYWNjb3VudCBpbiB0aGUgQW1hem9uIEVDMiBjb25zb2xlIG9uY2UgdGhleSBhcmUgY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTWFuYWdlZEVCU1ZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgc25hcHNob3QgdGhhdCBBbWF6b24gRUNTIHVzZXMgdG8gY3JlYXRlIHZvbHVtZXMgZm9yIGF0dGFjaG1lbnQgdG8gdGFza3MgbWFpbnRhaW5lZCBieSB0aGUgc2VydmljZS4gWW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYGBzbmFwc2hvdElkYGAgb3IgYGBzaXplSW5HaUJgYCBpbiB5b3VyIHZvbHVtZSBjb25maWd1cmF0aW9uLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFNuYXBzaG90SWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cblNuYXBzaG90SWQ/OiBzdHJpbmdcbi8qKlxuICogVGhlIHZvbHVtZSB0eXBlLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFZvbHVtZVR5cGVgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQlMgdm9sdW1lIHR5cGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWJzLXZvbHVtZS10eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgVXNlciBHdWlkZSouXG4gKiAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN1cHBvcnRlZCB2b2x1bWUgdHlwZXMuXG4gKiAgICsgIEdlbmVyYWwgUHVycG9zZSBTU0Q6IGBgZ3AyYGB8YGBncDNgYFxuICogICArICBQcm92aXNpb25lZCBJT1BTIFNTRDogYGBpbzFgYHxgYGlvMmBgXG4gKiAgICsgIFRocm91Z2hwdXQgT3B0aW1pemVkIEhERDogYGBzdDFgYFxuICogICArICBDb2xkIEhERDogYGBzYzFgYFxuICogICArICBNYWduZXRpYzogYGBzdGFuZGFyZGBgXG4gKiAgIFRoZSBtYWduZXRpYyB2b2x1bWUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIG9uIEZhcmdhdGUuXG4gKi9cblZvbHVtZVR5cGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIGlkZW50aWZpZXIgb2YgdGhlIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSB0byB1c2UgZm9yIEFtYXpvbiBFQlMgZW5jcnlwdGlvbi4gV2hlbiBhIGtleSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhpcyBwYXJhbWV0ZXIsIGl0IG92ZXJyaWRlcyBBbWF6b24gRUJTIGRlZmF1bHQgZW5jcnlwdGlvbiBvciBhbnkgS01TIGtleSB0aGF0IHlvdSBzcGVjaWZpZWQgZm9yIGNsdXN0ZXItbGV2ZWwgbWFuYWdlZCBzdG9yYWdlIGVuY3J5cHRpb24uIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgS21zS2V5SWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGVuY3J5cHRpbmcgQW1hem9uIEVCUyB2b2x1bWVzIGF0dGFjaGVkIHRvIHRhc2tzLCBzZWUgW0VuY3J5cHQgZGF0YSBzdG9yZWQgaW4gQW1hem9uIEVCUyB2b2x1bWVzIGF0dGFjaGVkIHRvIEFtYXpvbiBFQ1MgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vicy1rbXMtZW5jcnlwdGlvbi5odG1sKS5cbiAqICAgQVdTIGF1dGhlbnRpY2F0ZXMgdGhlIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSBhc3luY2hyb25vdXNseS4gVGhlcmVmb3JlLCBpZiB5b3Ugc3BlY2lmeSBhbiBJRCwgYWxpYXMsIG9yIEFSTiB0aGF0IGlzIGludmFsaWQsIHRoZSBhY3Rpb24gY2FuIGFwcGVhciB0byBjb21wbGV0ZSwgYnV0IGV2ZW50dWFsbHkgZmFpbHMuXG4gKi9cbkttc0tleUlkPzogc3RyaW5nXG4vKipcbiAqIFRoZSB0YWdzIHRvIGFwcGx5IHRvIHRoZSB2b2x1bWUuIEFtYXpvbiBFQ1MgYXBwbGllcyBzZXJ2aWNlLW1hbmFnZWQgdGFncyBieSBkZWZhdWx0LiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFRhZ1NwZWNpZmljYXRpb25zLk5gYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cblRhZ1NwZWNpZmljYXRpb25zPzogRUJTVGFnU3BlY2lmaWNhdGlvbltdXG4vKipcbiAqIFRoZSBmaWxlc3lzdGVtIHR5cGUgZm9yIHRoZSB2b2x1bWUuIEZvciB2b2x1bWVzIGNyZWF0ZWQgZnJvbSBhIHNuYXBzaG90LCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIGZpbGVzeXN0ZW0gdHlwZSB0aGF0IHRoZSB2b2x1bWUgd2FzIHVzaW5nIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBjcmVhdGVkLiBJZiB0aGVyZSBpcyBhIGZpbGVzeXN0ZW0gdHlwZSBtaXNtYXRjaCwgdGhlIHRhc2tzIHdpbGwgZmFpbCB0byBzdGFydC5cbiAqICBUaGUgYXZhaWxhYmxlIExpbnV4IGZpbGVzeXN0ZW0gdHlwZXMgYXJl4oCoIGBgZXh0M2BgLCBgYGV4dDRgYCwgYW5kIGBgeGZzYGAuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGBgeGZzYGAgZmlsZXN5c3RlbSB0eXBlIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqICBUaGUgYXZhaWxhYmxlIFdpbmRvd3MgZmlsZXN5c3RlbSB0eXBlcyBhcmUgYGBOVEZTYGAuXG4gKi9cbkZpbGVzeXN0ZW1UeXBlPzogc3RyaW5nXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGVuY3J5cHRlZC4gSWYgeW91IHR1cm4gb24gUmVnaW9uLWxldmVsIEFtYXpvbiBFQlMgZW5jcnlwdGlvbiBieSBkZWZhdWx0IGJ1dCBzZXQgdGhpcyB2YWx1ZSBhcyBgYGZhbHNlYGAsIHRoZSBzZXR0aW5nIGlzIG92ZXJyaWRkZW4gYW5kIHRoZSB2b2x1bWUgaXMgZW5jcnlwdGVkIHdpdGggdGhlIEtNUyBrZXkgc3BlY2lmaWVkIGZvciBBbWF6b24gRUJTIGVuY3J5cHRpb24gYnkgZGVmYXVsdC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyAxOjEgd2l0aCB0aGUgYGBFbmNyeXB0ZWRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKi9cbkVuY3J5cHRlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIHRocm91Z2hwdXQgdG8gcHJvdmlzaW9uIGZvciBhIHZvbHVtZSwgaW4gTWlCL3MsIHdpdGggYSBtYXhpbXVtIG9mIDEsMDAwIE1pQi9zLiBUaGlzIHBhcmFtZXRlciBtYXBzIDE6MSB3aXRoIHRoZSBgYFRocm91Z2hwdXRgYCBwYXJhbWV0ZXIgb2YgdGhlIFtDcmVhdGVWb2x1bWUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQzIgQVBJIFJlZmVyZW5jZSouXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgYGBncDNgYCB2b2x1bWUgdHlwZS5cbiAqL1xuVGhyb3VnaHB1dD86IG51bWJlclxuLyoqXG4gKiBUaGUgcmF0ZSwgaW4gTWlCL3MsIGF0IHdoaWNoIGRhdGEgaXMgZmV0Y2hlZCBmcm9tIGEgc25hcHNob3Qgb2YgYW4gZXhpc3RpbmcgRUJTIHZvbHVtZSB0byBjcmVhdGUgbmV3IHZvbHVtZXMgZm9yIGF0dGFjaG1lbnQgdG8gdGhlIHRhc2tzIG1haW50YWluZWQgYnkgdGhlIHNlcnZpY2UuIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNwZWNpZmllZCBvbmx5IGlmIHlvdSBzcGVjaWZ5IGEgYGBzbmFwc2hvdElkYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0luaXRpYWxpemUgQW1hem9uIEVCUyB2b2x1bWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWJzL2xhdGVzdC91c2VyZ3VpZGUvaW5pdGFsaXplLXZvbHVtZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFQlMgVXNlciBHdWlkZSouXG4gKi9cblZvbHVtZUluaXRpYWxpemF0aW9uUmF0ZT86IG51bWJlclxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQgKElPUFMpLiBGb3IgYGBncDNgYCwgYGBpbzFgYCwgYW5kIGBgaW8yYGAgdm9sdW1lcywgdGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgSU9QUyB0aGF0IGFyZSBwcm92aXNpb25lZCBmb3IgdGhlIHZvbHVtZS4gRm9yIGBgZ3AyYGAgdm9sdW1lcywgdGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBwZXJmb3JtYW5jZSBvZiB0aGUgdm9sdW1lIGFuZCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdW1lIGFjY3VtdWxhdGVzIEkvTyBjcmVkaXRzIGZvciBidXJzdGluZy5cbiAqICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCB2b2x1bWUgdHlwZS5cbiAqICAgKyAgYGBncDNgYDogMywwMDAgLSAxNiwwMDAgSU9QU1xuICogICArICBgYGlvMWBgOiAxMDAgLSA2NCwwMDAgSU9QU1xuICogICArICBgYGlvMmBgOiAxMDAgLSAyNTYsMDAwIElPUFNcbiAqICAgXG4gKiAgVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIGBgaW8xYGAgYW5kIGBgaW8yYGAgdm9sdW1lIHR5cGVzLiBUaGUgZGVmYXVsdCBmb3IgYGBncDNgYCB2b2x1bWVzIGlzIGBgMywwMDAgSU9QU2BgLiBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYHN0MWBgLCBgYHNjMWBgLCBvciBgYHN0YW5kYXJkYGAgdm9sdW1lIHR5cGVzLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgSW9wc2BgIHBhcmFtZXRlciBvZiB0aGUgW0NyZWF0ZVZvbHVtZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVm9sdW1lLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDMiBBUEkgUmVmZXJlbmNlKi5cbiAqL1xuSW9wcz86IG51bWJlclxuLyoqXG4gKiBUaGUgc2l6ZSBvZiB0aGUgdm9sdW1lIGluIEdpQi4gWW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB2b2x1bWUgc2l6ZSBvciBhIHNuYXBzaG90IElELiBJZiB5b3Ugc3BlY2lmeSBhIHNuYXBzaG90IElELCB0aGUgc25hcHNob3Qgc2l6ZSBpcyB1c2VkIGZvciB0aGUgdm9sdW1lIHNpemUgYnkgZGVmYXVsdC4gWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSB2b2x1bWUgc2l6ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNuYXBzaG90IHNpemUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgMToxIHdpdGggdGhlIGBgU2l6ZWBgIHBhcmFtZXRlciBvZiB0aGUgW0NyZWF0ZVZvbHVtZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVm9sdW1lLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDMiBBUEkgUmVmZXJlbmNlKi5cbiAqICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3VwcG9ydGVkIHZvbHVtZSBzaXplIHZhbHVlcyBmb3IgZWFjaCB2b2x1bWUgdHlwZS5cbiAqICAgKyAgYGBncDJgYCBhbmQgYGBncDNgYDogMS0xNiwzODRcbiAqICAgKyAgYGBpbzFgYCBhbmQgYGBpbzJgYDogNC0xNiwzODRcbiAqICAgKyAgYGBzdDFgYCBhbmQgYGBzYzFgYDogMTI1LTE2LDM4NFxuICogICArICBgYHN0YW5kYXJkYGA6IDEtMSwwMjRcbiAqL1xuU2l6ZUluR2lCPzogbnVtYmVyXG4vKipcbiAqIFRoZSBBUk4gb2YgdGhlIElBTSByb2xlIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdm9sdW1lLiBUaGlzIGlzIHRoZSBBbWF6b24gRUNTIGluZnJhc3RydWN0dXJlIElBTSByb2xlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgeW91ciBBV1MgaW5mcmFzdHJ1Y3R1cmUuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgQW1hem9uIEVDUy1tYW5hZ2VkIGBgQW1hem9uRUNTSW5mcmFzdHJ1Y3R1cmVSb2xlUG9saWN5Rm9yVm9sdW1lc2BgIElBTSBwb2xpY3kgd2l0aCB0aGlzIHJvbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgaW5mcmFzdHJ1Y3R1cmUgSUFNIHJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2luZnJhc3RydWN0dXJlX0lBTV9yb2xlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Sb2xlQXJuOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHRhZyBzcGVjaWZpY2F0aW9ucyBvZiBhbiBBbWF6b24gRUJTIHZvbHVtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFQlNUYWdTcGVjaWZpY2F0aW9uIHtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHByb3BhZ2F0ZSB0aGUgdGFncyBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24gdG8g4oCodGhlIEFtYXpvbiBFQlMgdm9sdW1lLiBUYWdzIGNhbiBvbmx5IHByb3BhZ2F0ZSB0byBhIGBgU0VSVklDRWBgIHNwZWNpZmllZCBpbiDigKhgYFNlcnZpY2VWb2x1bWVDb25maWd1cmF0aW9uYGAuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIHRhZ3MgYXJlbid0IOKAqHByb3BhZ2F0ZWQuXG4gKi9cblByb3BhZ2F0ZVRhZ3M/OiAoXCJTRVJWSUNFXCIgfCBcIlRBU0tfREVGSU5JVElPTlwiKVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB2b2x1bWUgcmVzb3VyY2UuXG4gKi9cblJlc291cmNlVHlwZTogc3RyaW5nXG4vKipcbiAqIFRoZSB0YWdzIGFwcGxpZWQgdG8gdGhpcyBBbWF6b24gRUJTIHZvbHVtZS4gYGBBbWF6b25FQ1NDcmVhdGVkYGAgYW5kIGBgQW1hem9uRUNTTWFuYWdlZGBgIGFyZSByZXNlcnZlZCB0YWdzIHRoYXQgY2FuJ3QgYmUgdXNlZC5cbiAqL1xuVGFncz86IFRhZ1tdXG59XG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byBhIHJlc291cmNlIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSB0aGVtLlxuICogIFRoZSBmb2xsb3dpbmcgYmFzaWMgcmVzdHJpY3Rpb25zIGFwcGx5IHRvIHRhZ3M6XG4gKiAgICsgIE1heGltdW0gbnVtYmVyIG9mIHRhZ3MgcGVyIHJlc291cmNlIC0gNTBcbiAqICAgKyAgRm9yIGVhY2ggcmVzb3VyY2UsIGVhY2ggdGFnIGtleSBtdXN0IGJlIHVuaXF1ZSwgYW5kIGVhY2ggdGFnIGtleSBjYW4gaGF2ZSBvbmx5IG9uZSB2YWx1ZS5cbiAqICAgKyAgTWF4aW11bSBrZXkgbGVuZ3RoIC0gMTI4IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBNYXhpbXVtIHZhbHVlIGxlbmd0aCAtIDI1NiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgSWYgeW91ciB0YWdnaW5nIHNjaGVtYSBpcyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBzZXJ2aWNlcyBhbmQgcmVzb3VyY2VzLCByZW1lbWJlciB0aGF0IG90aGVyIHNlcnZpY2VzIG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIGNoYXJhY3RlcnMuIEdlbmVyYWxseSBhbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BhY2VzIHJlcHJlc2VudGFibGUgaW4gVVRGLTgsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICsgLSA9IC4gXyA6IC8gQC5cbiAqICAgKyAgVGFnIGtleXMgYW5kIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gKiAgICsgIERvIG5vdCB1c2UgYGBhd3M6YGAsIGBgQVdTOmBgLCBvciBhbnkgdXBwZXIgb3IgbG93ZXJjYXNlIGNvbWJpbmF0aW9uIG9mIHN1Y2ggYXMgYSBwcmVmaXggZm9yIGVpdGhlciBrZXlzIG9yIHZhbHVlcyBhcyBpdCBpcyByZXNlcnZlZCBmb3IgQVdTIHVzZS4gWW91IGNhbm5vdCBlZGl0IG9yIGRlbGV0ZSB0YWcga2V5cyBvciB2YWx1ZXMgd2l0aCB0aGlzIHByZWZpeC4gVGFncyB3aXRoIHRoaXMgcHJlZml4IGRvIG5vdCBjb3VudCBhZ2FpbnN0IHlvdXIgdGFncyBwZXIgcmVzb3VyY2UgbGltaXQuXG4gKiAgIFxuICogIEluIG9yZGVyIHRvIHRhZyBhIHNlcnZpY2UgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBBUk4gZm9ybWF0LCB5b3UgbmVlZCB0byBtaWdyYXRlIHRoZSBzZXJ2aWNlIHRvIHRoZSBsb25nIEFSTi4gWW91IG11c3QgdXNlIHRoZSBBUEksIENMSSBvciBjb25zb2xlIHRvIG1pZ3JhdGUgdGhlIHNlcnZpY2UgQVJOLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNaWdyYXRlIGFuIHNob3J0IHNlcnZpY2UgQVJOIHRvIGEgbG9uZyBBUk5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtYXJuLW1pZ3JhdGlvbi5odG1sKSBpbiB0aGUgKkRldmVsb3BlciBHdWlkZSouXG4gKiAgIGBgYXJuOmF3czplY3M6cmVnaW9uOmF3c19hY2NvdW50X2lkOnNlcnZpY2Uvc2VydmljZS1uYW1lYGAgXG4gKiAgQWZ0ZXIgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZSwgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTpcbiAqICAgKyAgIFRoZSBzZXJ2aWNlIEFSTiBpczogYGBhcm46YXdzOmVjczpyZWdpb246YXdzX2FjY291bnRfaWQ6c2VydmljZS9jbHVzdGVyLW5hbWUvc2VydmljZS1uYW1lYGBcbiAqICAgKyAgWW91IGNhbiB1c2UgQ0ZOIHRvIHRhZyB0aGUgc2VydmljZSBhcyB5b3Ugd291bGQgYSBzZXJ2aWNlIHdpdGggYSBsb25nIEFSTiBmb3JtYXQuXG4gKiAgICsgIFdoZW4gdGhlIGBgUGh5c2ljYWxSZXNvdXJjZUlkYGAgaW4gdGhlIENGTiBzdGFjayByZXByZXNlbnRzIGEgc2VydmljZSwgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBhbmQgd2lsbCBiZSB0aGUgc2hvcnQgc2VydmljZSBBUk4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbi8qKlxuICogVGhlIG9wdGlvbmFsIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGB2YWx1ZWBgIGFjdHMgYXMgYSBkZXNjcmlwdG9yIHdpdGhpbiBhIHRhZyBjYXRlZ29yeSAoa2V5KS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogT25lIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGBrZXlgYCBpcyBhIGdlbmVyYWwgbGFiZWwgdGhhdCBhY3RzIGxpa2UgYSBjYXRlZ29yeSBmb3IgbW9yZSBzcGVjaWZpYyB0YWcgdmFsdWVzLlxuICovXG5LZXk/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneS4gQSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSBjYW4gYmUgc2V0IHdoZW4gdXNpbmcgdGhlIGBgUnVuVGFza2BgIG9yIGBgQ3JlYXRlU2VydmljZWBgIEFQSXMgb3IgYXMgdGhlIGRlZmF1bHQgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kgZm9yIGEgY2x1c3RlciB3aXRoIHRoZSBgYENyZWF0ZUNsdXN0ZXJgYCBBUEkuXG4gKiAgT25seSBjYXBhY2l0eSBwcm92aWRlcnMgdGhhdCBhcmUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBjbHVzdGVyIGFuZCBoYXZlIGFuIGBgQUNUSVZFYGAgb3IgYGBVUERBVElOR2BgIHN0YXR1cyBjYW4gYmUgdXNlZCBpbiBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5LiBUaGUgYGBQdXRDbHVzdGVyQ2FwYWNpdHlQcm92aWRlcnNgYCBBUEkgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBjYXBhY2l0eSBwcm92aWRlciB3aXRoIGEgY2x1c3Rlci5cbiAqICBJZiBzcGVjaWZ5aW5nIGEgY2FwYWNpdHkgcHJvdmlkZXIgdGhhdCB1c2VzIGFuIEF1dG8gU2NhbGluZyBncm91cCwgdGhlIGNhcGFjaXR5IHByb3ZpZGVyIG11c3QgYWxyZWFkeSBiZSBjcmVhdGVkLiBOZXcgQXV0byBTY2FsaW5nIGdyb3VwIGNhcGFjaXR5IHByb3ZpZGVycyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBgYENyZWF0ZUNhcGFjaXR5UHJvdmlkZXJgYCBBUEkgb3BlcmF0aW9uLlxuICogIFRvIHVzZSBhbiBGQVJHQVRFbG9uZyBjYXBhY2l0eSBwcm92aWRlciwgc3BlY2lmeSBlaXRoZXIgdGhlIGBgRkFSR0FURWBgIG9yIGBgRkFSR0FURV9TUE9UYGAgY2FwYWNpdHkgcHJvdmlkZXJzLiBUaGUgRkFSR0FURWxvbmcgY2FwYWNpdHkgcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUgdG8gYWxsIGFjY291bnRzIGFuZCBvbmx5IG5lZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgY2x1c3RlciB0byBiZSB1c2VkIGluIGEgY2FwYWNpdHkgcHJvdmlkZXIgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5SXRlbSB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjYXBhY2l0eSBwcm92aWRlci4gVGhpcyBjYW4gYmUgZWl0aGVyIGFuIEFXUyBtYW5hZ2VkIGNhcGFjaXR5IHByb3ZpZGVyIChgYEZBUkdBVEVgYCBvciBgYEZBUkdBVEVfU1BPVGBgKSBvciB0aGUgbmFtZSBvZiBhIGN1c3RvbSBjYXBhY2l0eSBwcm92aWRlciB0aGF0IHlvdSBjcmVhdGVkLlxuICovXG5DYXBhY2l0eVByb3ZpZGVyPzogc3RyaW5nXG4vKipcbiAqIFRoZSAqYmFzZSogdmFsdWUgZGVzaWduYXRlcyBob3cgbWFueSB0YXNrcywgYXQgYSBtaW5pbXVtLCB0byBydW4gb24gdGhlIHNwZWNpZmllZCBjYXBhY2l0eSBwcm92aWRlciBmb3IgZWFjaCBzZXJ2aWNlLiBPbmx5IG9uZSBjYXBhY2l0eSBwcm92aWRlciBpbiBhIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IGNhbiBoYXZlIGEgKmJhc2UqIGRlZmluZWQuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGAwYGAgaXMgdXNlZC5cbiAqICBCYXNlIHZhbHVlIGNoYXJhY3RlcmlzdGljczpcbiAqICAgKyAgT25seSBvbmUgY2FwYWNpdHkgcHJvdmlkZXIgaW4gYSBzdHJhdGVneSBjYW4gaGF2ZSBhIGJhc2UgZGVmaW5lZFxuICogICArICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDBgYCBpZiBub3Qgc3BlY2lmaWVkXG4gKiAgICsgIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRvIDEwMCwwMDBcbiAqICAgKyAgQmFzZSByZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZCBmaXJzdCBiZWZvcmUgd2VpZ2h0IGRpc3RyaWJ1dGlvblxuICovXG5CYXNlPzogbnVtYmVyXG4vKipcbiAqIFRoZSAqd2VpZ2h0KiB2YWx1ZSBkZXNpZ25hdGVzIHRoZSByZWxhdGl2ZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MgbGF1bmNoZWQgdGhhdCBzaG91bGQgdXNlIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgcHJvdmlkZXIuIFRoZSBgYHdlaWdodGBgIHZhbHVlIGlzIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhZnRlciB0aGUgYGBiYXNlYGAgdmFsdWUsIGlmIGRlZmluZWQsIGlzIHNhdGlzZmllZC5cbiAqICBJZiBubyBgYHdlaWdodGBgIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGAwYGAgaXMgdXNlZC4gV2hlbiBtdWx0aXBsZSBjYXBhY2l0eSBwcm92aWRlcnMgYXJlIHNwZWNpZmllZCB3aXRoaW4gYSBjYXBhY2l0eSBwcm92aWRlciBzdHJhdGVneSwgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhY2l0eSBwcm92aWRlcnMgbXVzdCBoYXZlIGEgd2VpZ2h0IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBhbnkgY2FwYWNpdHkgcHJvdmlkZXJzIHdpdGggYSB3ZWlnaHQgb2YgYGAwYGAgY2FuJ3QgYmUgdXNlZCB0byBwbGFjZSB0YXNrcy4gSWYgeW91IHNwZWNpZnkgbXVsdGlwbGUgY2FwYWNpdHkgcHJvdmlkZXJzIGluIGEgc3RyYXRlZ3kgdGhhdCBhbGwgaGF2ZSBhIHdlaWdodCBvZiBgYDBgYCwgYW55IGBgUnVuVGFza2BgIG9yIGBgQ3JlYXRlU2VydmljZWBgIGFjdGlvbnMgdXNpbmcgdGhlIGNhcGFjaXR5IHByb3ZpZGVyIHN0cmF0ZWd5IHdpbGwgZmFpbC5cbiAqICBXZWlnaHQgdmFsdWUgY2hhcmFjdGVyaXN0aWNzOlxuICogICArICBXZWlnaHQgaXMgY29uc2lkZXJlZCBhZnRlciB0aGUgYmFzZSB2YWx1ZSBpcyBzYXRpc2ZpZWRcbiAqICAgKyAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGAwYGAgaWYgbm90IHNwZWNpZmllZFxuICogICArICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0byAxLDAwMFxuICogICArICBBdCBsZWFzdCBvbmUgY2FwYWNpdHkgcHJvdmlkZXIgbXVzdCBoYXZlIGEgd2VpZ2h0IGdyZWF0ZXIgdGhhbiB6ZXJvXG4gKiAgICsgIENhcGFjaXR5IHByb3ZpZGVycyB3aXRoIHdlaWdodCBvZiBgYDBgYCBjYW5ub3QgcGxhY2UgdGFza3NcbiAqICAgXG4gKiAgVGFzayBkaXN0cmlidXRpb24gbG9naWM6XG4gKiAgIDEuICBCYXNlIHNhdGlzZmFjdGlvbjogVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRhc2tzIHNwZWNpZmllZCBieSB0aGUgYmFzZSB2YWx1ZSBhcmUgcGxhY2VkIG9uIHRoYXQgY2FwYWNpdHkgcHJvdmlkZXJcbiAqICAgMS4gIFdlaWdodCBkaXN0cmlidXRpb246IEFmdGVyIGJhc2UgcmVxdWlyZW1lbnRzIGFyZSBtZXQsIGFkZGl0aW9uYWwgdGFza3MgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB3ZWlnaHQgcmF0aW9zXG4gKiAgIFxuICogIEV4YW1wbGVzOlxuICogIEVxdWFsIERpc3RyaWJ1dGlvbjogVHdvIGNhcGFjaXR5IHByb3ZpZGVycyBib3RoIHdpdGggd2VpZ2h0IGBgMWBgIHdpbGwgc3BsaXQgdGFza3MgZXZlbmx5IGFmdGVyIGJhc2UgcmVxdWlyZW1lbnRzIGFyZSBtZXQuXG4gKiAgV2VpZ2h0ZWQgRGlzdHJpYnV0aW9uOiBJZiBjYXBhY2l0eVByb3ZpZGVyQSBoYXMgd2VpZ2h0IGBgMWBgIGFuZCBjYXBhY2l0eVByb3ZpZGVyQiBoYXMgd2VpZ2h0IGBgNGBgLCB0aGVuIGZvciBldmVyeSAxIHRhc2sgb24gQSwgNCB0YXNrcyB3aWxsIHJ1biBvbiBCLlxuICovXG5XZWlnaHQ/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlcnZpY2UuIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGZvciB0YXNrIGRlZmluaXRpb25zIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSB0byByZWNlaXZlIHRoZWlyIG93biBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlLCBhbmQgaXQgaXMgbm90IHN1cHBvcnRlZCBmb3Igb3RoZXIgbmV0d29yayBtb2Rlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtDb25maWd1cmF0aW9uIHtcbkF3c3ZwY0NvbmZpZ3VyYXRpb24/OiBBd3NWcGNDb25maWd1cmF0aW9uXG59XG4vKipcbiAqIFRoZSBWUEMgc3VibmV0cyBhbmQgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHRhc2suXG4gKiAgIEFsbCBzcGVjaWZpZWQgc3VibmV0cyBhbmQgc2VjdXJpdHkgZ3JvdXBzIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBWUEMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzVnBjQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIHNlY3VyaXR5IGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgb3Igc2VydmljZS4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSBzZWN1cml0eSBncm91cCwgdGhlIGRlZmF1bHQgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBWUEMgaXMgdXNlZC4gVGhlcmUncyBhIGxpbWl0IG9mIDUgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC5cbiAqICAgQWxsIHNwZWNpZmllZCBzZWN1cml0eSBncm91cHMgbXVzdCBiZSBmcm9tIHRoZSBzYW1lIFZQQy5cbiAqL1xuU2VjdXJpdHlHcm91cHM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgSURzIG9mIHRoZSBzdWJuZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBvciBzZXJ2aWNlLiBUaGVyZSdzIGEgbGltaXQgb2YgMTYgc3VibmV0cyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQuXG4gKiAgIEFsbCBzcGVjaWZpZWQgc3VibmV0cyBtdXN0IGJlIGZyb20gdGhlIHNhbWUgVlBDLlxuICovXG5TdWJuZXRzPzogc3RyaW5nW11cbi8qKlxuICogV2hldGhlciB0aGUgdGFzaydzIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UgcmVjZWl2ZXMgYSBwdWJsaWMgSVAgYWRkcmVzcy4gXG4gKiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyB3aGVuIHlvdSBzZXQgdGhpcyB2YWx1ZTpcbiAqICAgKyAgV2hlbiB5b3UgdXNlIGBgY3JlYXRlLXNlcnZpY2VgYCBvciBgYHVwZGF0ZS1zZXJ2aWNlYGAsIHRoZSBkZWZhdWx0IGlzIGBgRElTQUJMRURgYC4gXG4gKiAgICsgIFdoZW4gdGhlIHNlcnZpY2UgYGBkZXBsb3ltZW50Q29udHJvbGxlcmBgIGlzIGBgRUNTYGAsIHRoZSB2YWx1ZSBtdXN0IGJlIGBgRElTQUJMRURgYC5cbiAqL1xuQXNzaWduUHVibGljSXA/OiAoXCJESVNBQkxFRFwiIHwgXCJFTkFCTEVEXCIpXG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byBmb3JjZSBhIG5ldyBkZXBsb3ltZW50IG9mIHRoZSBzZXJ2aWNlLiBCeSBkZWZhdWx0LCBkZXBsb3ltZW50cyBhcmVuJ3QgZm9yY2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBzdGFydCBhIG5ldyBkZXBsb3ltZW50IHdpdGggbm8gc2VydmljZSBkZWZpbml0aW9uIGNoYW5nZXMuIEZvciBleGFtcGxlLCB5b3UgY2FuIHVwZGF0ZSBhIHNlcnZpY2UncyB0YXNrcyB0byB1c2UgYSBuZXdlciBEb2NrZXIgaW1hZ2Ugd2l0aCB0aGUgc2FtZSBpbWFnZS90YWcgY29tYmluYXRpb24gKGBgbXlfaW1hZ2U6bGF0ZXN0YGApIG9yIHRvIHJvbGwgRmFyZ2F0ZSB0YXNrcyBvbnRvIGEgbmV3ZXIgcGxhdGZvcm0gdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JjZU5ld0RlcGxveW1lbnQge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZm9yY2UgYSBuZXcgZGVwbG95bWVudCBvZiB0aGUgc2VydmljZS4gQnkgZGVmYXVsdCwgZGVwbG95bWVudHMgYXJlbid0IGZvcmNlZC4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3RhcnQgYSBuZXcgZGVwbG95bWVudCB3aXRoIG5vIHNlcnZpY2UgZGVmaW5pdGlvbiBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1cGRhdGUgYSBzZXJ2aWNlJ3MgdGFza3MgdG8gdXNlIGEgbmV3ZXIgRG9ja2VyIGltYWdlIHdpdGggdGhlIHNhbWUgaW1hZ2UvdGFnIGNvbWJpbmF0aW9uIChgYG15X2ltYWdlOmxhdGVzdGBgKSBvciB0byByb2xsIEZhcmdhdGUgdGFza3Mgb250byBhIG5ld2VyIHBsYXRmb3JtIHZlcnNpb24uXG4gKi9cbkVuYWJsZUZvcmNlTmV3RGVwbG95bWVudDogYm9vbGVhblxuLyoqXG4gKiBXaGVuIHlvdSBjaGFuZ2UgdGhlYGBGb3JjZU5ld0RlcGxveW1lbnROb25jZWBgIHZhbHVlIGluIHlvdXIgdGVtcGxhdGUsIGl0IHNpZ25hbHMgRUNTIHRvIHN0YXJ0IGEgbmV3IGRlcGxveW1lbnQgZXZlbiB0aG91Z2ggbm8gb3RoZXIgc2VydmljZSBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC4gVGhlIHZhbHVlIG11c3QgYmUgYSB1bmlxdWUsIHRpbWUtIHZhcnlpbmcgdmFsdWUgbGlrZSBhIHRpbWVzdGFtcCwgcmFuZG9tIHN0cmluZywgb3Igc2VxdWVuY2UgbnVtYmVyLiBVc2UgdGhpcyBwcm9wZXJ0eSB3aGVuIHlvdSB3YW50IHRvIGVuc3VyZSB5b3VyIHRhc2tzIHBpY2sgdXAgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgRG9ja2VyIGltYWdlIHRoYXQgdXNlcyB0aGUgc2FtZSB0YWcgYnV0IGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5Gb3JjZU5ld0RlcGxveW1lbnROb25jZT86IHN0cmluZ1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29uc3RyYWludCBvbiB0YXNrIHBsYWNlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBwbGFjZW1lbnQgY29uc3RyYWludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2stcGxhY2VtZW50LWNvbnN0cmFpbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0YXNrIHBsYWNlbWVudCBjb25zdHJhaW50cyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBVc2UgYGBkaXN0aW5jdEluc3RhbmNlYGAgdG8gZW5zdXJlIHRoYXQgZWFjaCB0YXNrIGluIGEgcGFydGljdWxhciBncm91cCBpcyBydW5uaW5nIG9uIGEgZGlmZmVyZW50IGNvbnRhaW5lciBpbnN0YW5jZS4gVXNlIGBgbWVtYmVyT2ZgYCB0byByZXN0cmljdCB0aGUgc2VsZWN0aW9uIHRvIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogKFwiZGlzdGluY3RJbnN0YW5jZVwiIHwgXCJtZW1iZXJPZlwiKVxuLyoqXG4gKiBBIGNsdXN0ZXIgcXVlcnkgbGFuZ3VhZ2UgZXhwcmVzc2lvbiB0byBhcHBseSB0byB0aGUgY29uc3RyYWludC4gVGhlIGV4cHJlc3Npb24gY2FuIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAyMDAwIGNoYXJhY3RlcnMuIFlvdSBjYW4ndCBzcGVjaWZ5IGFuIGV4cHJlc3Npb24gaWYgdGhlIGNvbnN0cmFpbnQgdHlwZSBpcyBgYGRpc3RpbmN0SW5zdGFuY2VgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2x1c3RlciBxdWVyeSBsYW5ndWFnZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY2x1c3Rlci1xdWVyeS1sYW5ndWFnZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkV4cHJlc3Npb24/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgTG9hZEJhbGFuY2VyYGAgcHJvcGVydHkgc3BlY2lmaWVzIGRldGFpbHMgb24gYSBsb2FkIGJhbGFuY2VyIHRoYXQgaXMgdXNlZCB3aXRoIGEgc2VydmljZS5cbiAqICBJZiB0aGUgc2VydmljZSBpcyB1c2luZyB0aGUgYGBDT0RFX0RFUExPWWBgIGRlcGxveW1lbnQgY29udHJvbGxlciwgdGhlIHNlcnZpY2UgaXMgcmVxdWlyZWQgdG8gdXNlIGVpdGhlciBhbiBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIG9yIE5ldHdvcmsgTG9hZCBCYWxhbmNlci4gV2hlbiB5b3UgYXJlIGNyZWF0aW5nIGFuIEFDRGxvbmcgZGVwbG95bWVudCBncm91cCwgeW91IHNwZWNpZnkgdHdvIHRhcmdldCBncm91cHMgKHJlZmVycmVkIHRvIGFzIGEgYGB0YXJnZXRHcm91cFBhaXJgYCkuIEVhY2ggdGFyZ2V0IGdyb3VwIGJpbmRzIHRvIGEgc2VwYXJhdGUgdGFzayBzZXQgaW4gdGhlIGRlcGxveW1lbnQuIFRoZSBsb2FkIGJhbGFuY2VyIGNhbiBhbHNvIGhhdmUgdXAgdG8gdHdvIGxpc3RlbmVycywgYSByZXF1aXJlZCBsaXN0ZW5lciBmb3IgcHJvZHVjdGlvbiB0cmFmZmljIGFuZCBhbiBvcHRpb25hbCBsaXN0ZW5lciB0aGF0IGFsbG93cyB5b3UgdG8gdGVzdCBuZXcgcmV2aXNpb25zIG9mIHRoZSBzZXJ2aWNlIGJlZm9yZSByb3V0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYyB0byBpdC5cbiAqICBTZXJ2aWNlcyB3aXRoIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSAoZm9yIGV4YW1wbGUsIHRob3NlIHdpdGggdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUpIG9ubHkgc3VwcG9ydCBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VycyBhbmQgTmV0d29yayBMb2FkIEJhbGFuY2Vycy4gQ2xhc3NpYyBMb2FkIEJhbGFuY2VycyBhcmUgbm90IHN1cHBvcnRlZC4gQWxzbywgd2hlbiB5b3UgY3JlYXRlIGFueSB0YXJnZXQgZ3JvdXBzIGZvciB0aGVzZSBzZXJ2aWNlcywgeW91IG11c3QgY2hvb3NlIGBgaXBgYCBhcyB0aGUgdGFyZ2V0IHR5cGUsIG5vdCBgYGluc3RhbmNlYGAuIFRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UsIG5vdCBhbiBBbWF6b24gRUMyIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlciB7XG4vKipcbiAqIFRoZSBmdWxsIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIHRhcmdldCBncm91cCBvciBncm91cHMgYXNzb2NpYXRlZCB3aXRoIGEgc2VydmljZSBvciB0YXNrIHNldC5cbiAqICBBIHRhcmdldCBncm91cCBBUk4gaXMgb25seSBzcGVjaWZpZWQgd2hlbiB1c2luZyBhbiBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIG9yIE5ldHdvcmsgTG9hZCBCYWxhbmNlci4gXG4gKiAgRm9yIHNlcnZpY2VzIHVzaW5nIHRoZSBgYEVDU2BgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBtdWx0aXBsZSB0YXJnZXQgZ3JvdXBzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSZWdpc3RlcmluZyBtdWx0aXBsZSB0YXJnZXQgZ3JvdXBzIHdpdGggYSBzZXJ2aWNlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9yZWdpc3Rlci1tdWx0aXBsZS10YXJnZXRncm91cHMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEZvciBzZXJ2aWNlcyB1c2luZyB0aGUgYGBDT0RFX0RFUExPWWBgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91J3JlIHJlcXVpcmVkIHRvIGRlZmluZSB0d28gdGFyZ2V0IGdyb3VwcyBmb3IgdGhlIGxvYWQgYmFsYW5jZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0JsdWUvZ3JlZW4gZGVwbG95bWVudCB3aXRoIENvZGVEZXBsb3ldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtdHlwZS1ibHVlZ3JlZW4uaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB5b3VyIHNlcnZpY2UncyB0YXNrIGRlZmluaXRpb24gdXNlcyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHlvdSBtdXN0IGNob29zZSBgYGlwYGAgYXMgdGhlIHRhcmdldCB0eXBlLCBub3QgYGBpbnN0YW5jZWBgLiBEbyB0aGlzIHdoZW4gY3JlYXRpbmcgeW91ciB0YXJnZXQgZ3JvdXBzIGJlY2F1c2UgdGFza3MgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgbm90IGFuIEFtYXpvbiBFQzIgaW5zdGFuY2UuIFRoaXMgbmV0d29yayBtb2RlIGlzIHJlcXVpcmVkIGZvciB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5cbiAqL1xuVGFyZ2V0R3JvdXBBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGxvYWQgYmFsYW5jZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhlIEFtYXpvbiBFQ1Mgc2VydmljZSBvciB0YXNrIHNldC5cbiAqICBJZiB5b3UgYXJlIHVzaW5nIGFuIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgb3IgYSBOZXR3b3JrIExvYWQgQmFsYW5jZXIgdGhlIGxvYWQgYmFsYW5jZXIgbmFtZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG9taXR0ZWQuXG4gKi9cbkxvYWRCYWxhbmNlck5hbWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciAoYXMgaXQgYXBwZWFycyBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uKSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAqICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBjb250YWluZXIgbmFtZSB3aGVuIGNvbmZpZ3VyaW5nIHRoZSB0YXJnZXQgZ3JvdXAgZm9yIGFuIEFtYXpvbiBFQ1MgbG9hZCBiYWxhbmNlci5cbiAqL1xuQ29udGFpbmVyTmFtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcG9ydCBvbiB0aGUgY29udGFpbmVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBsb2FkIGJhbGFuY2VyLiBUaGlzIHBvcnQgbXVzdCBjb3JyZXNwb25kIHRvIGEgYGBjb250YWluZXJQb3J0YGAgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgYXJlIHVzaW5nLiBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0aGV5J3JlIGxhdW5jaGVkIG9uIG11c3QgYWxsb3cgaW5ncmVzcyB0cmFmZmljIG9uIHRoZSBgYGhvc3RQb3J0YGAgb2YgdGhlIHBvcnQgbWFwcGluZy5cbiAqL1xuQ29udGFpbmVyUG9ydD86IG51bWJlclxuQWR2YW5jZWRDb25maWd1cmF0aW9uPzogQWR2YW5jZWRDb25maWd1cmF0aW9uXG59XG4vKipcbiAqIFRoZSBhZHZhbmNlZCBzZXR0aW5ncyBmb3IgdGhlIGxvYWQgYmFsYW5jZXIgdXNlZCBpbiBibHVlL2dyZWVuIGRlcGxveW1lbnRzLiBTcGVjaWZ5IHRoZSBhbHRlcm5hdGUgdGFyZ2V0IGdyb3VwLCBsaXN0ZW5lciBydWxlcywgYW5kIElBTSByb2xlIHJlcXVpcmVkIGZvciB0cmFmZmljIHNoaWZ0aW5nIGR1cmluZyBibHVlL2dyZWVuIGRlcGxveW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSB0aGF0IGlkZW50aWZpZXMgKSB0aGF0IGlkZW50aWZpZXMgdGhlIHRlc3QgbGlzdGVuZXIgcnVsZSAoaW4gdGhlIGNhc2Ugb2YgYW4gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgb3IgbGlzdGVuZXIgKGluIHRoZSBjYXNlIGZvciBhbiBOZXR3b3JrIExvYWQgQmFsYW5jZXIpIGZvciByb3V0aW5nIHRlc3QgdHJhZmZpYy5cbiAqL1xuVGVzdExpc3RlbmVyUnVsZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGFsdGVybmF0ZSB0YXJnZXQgZ3JvdXAgZm9yIEFtYXpvbiBFQ1MgYmx1ZS9ncmVlbiBkZXBsb3ltZW50cy5cbiAqL1xuQWx0ZXJuYXRlVGFyZ2V0R3JvdXBBcm46IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgdGhhdCB0aGF0IGlkZW50aWZpZXMgdGhlIHByb2R1Y3Rpb24gbGlzdGVuZXIgcnVsZSAoaW4gdGhlIGNhc2Ugb2YgYW4gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgb3IgbGlzdGVuZXIgKGluIHRoZSBjYXNlIGZvciBhbiBOZXR3b3JrIExvYWQgQmFsYW5jZXIpIGZvciByb3V0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYy5cbiAqL1xuUHJvZHVjdGlvbkxpc3RlbmVyUnVsZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQgZ3JhbnRzIEFtYXpvbiBFQ1MgcGVybWlzc2lvbiB0byBjYWxsIHRoZSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIEFQSXMgZm9yIHlvdS5cbiAqL1xuUm9sZUFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlIHRvIGRpc2NvdmVyIGFuZCBjb25uZWN0IHRvIHNlcnZpY2VzLCBhbmQgYmUgZGlzY292ZXJlZCBieSwgYW5kIGNvbm5lY3RlZCBmcm9tLCBvdGhlciBzZXJ2aWNlcyB3aXRoaW4gYSBuYW1lc3BhY2UuXG4gKiAgVGFza3MgdGhhdCBydW4gaW4gYSBuYW1lc3BhY2UgY2FuIHVzZSBzaG9ydCBuYW1lcyB0byBjb25uZWN0IHRvIHNlcnZpY2VzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNhbiBjb25uZWN0IHRvIHNlcnZpY2VzIGFjcm9zcyBhbGwgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNvbm5lY3QgdGhyb3VnaCBhIG1hbmFnZWQgcHJveHkgY29udGFpbmVyIHRoYXQgY29sbGVjdHMgbG9ncyBhbmQgbWV0cmljcyBmb3IgaW5jcmVhc2VkIHZpc2liaWxpdHkuIE9ubHkgdGhlIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBzZXJ2aWNlcyBjcmVhdGUgYXJlIHN1cHBvcnRlZCB3aXRoIFNlcnZpY2UgQ29ubmVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0Q29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBsaXN0IG9mIFNlcnZpY2UgQ29ubmVjdCBzZXJ2aWNlIG9iamVjdHMuIFRoZXNlIGFyZSBuYW1lcyBhbmQgYWxpYXNlcyAoYWxzbyBrbm93biBhcyBlbmRwb2ludHMpIHRoYXQgYXJlIHVzZWQgYnkgb3RoZXIgQW1hem9uIEVDUyBzZXJ2aWNlcyB0byBjb25uZWN0IHRvIHRoaXMgc2VydmljZS4gXG4gKiAgVGhpcyBmaWVsZCBpcyBub3QgcmVxdWlyZWQgZm9yIGEgXCJjbGllbnRcIiBBbWF6b24gRUNTIHNlcnZpY2UgdGhhdCdzIGEgbWVtYmVyIG9mIGEgbmFtZXNwYWNlIG9ubHkgdG8gY29ubmVjdCB0byBvdGhlciBzZXJ2aWNlcyB3aXRoaW4gdGhlIG5hbWVzcGFjZS4gQW4gZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGEgZnJvbnRlbmQgYXBwbGljYXRpb24gdGhhdCBhY2NlcHRzIGluY29taW5nIHJlcXVlc3RzIGZyb20gZWl0aGVyIGEgbG9hZCBiYWxhbmNlciB0aGF0J3MgYXR0YWNoZWQgdG8gdGhlIHNlcnZpY2Ugb3IgYnkgb3RoZXIgbWVhbnMuXG4gKiAgQW4gb2JqZWN0IHNlbGVjdHMgYSBwb3J0IGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiwgYXNzaWducyBhIG5hbWUgZm9yIHRoZSBDTUFQbG9uZyBzZXJ2aWNlLCBhbmQgYSBsaXN0IG9mIGFsaWFzZXMgKGVuZHBvaW50cykgYW5kIHBvcnRzIGZvciBjbGllbnQgYXBwbGljYXRpb25zIHRvIHJlZmVyIHRvIHRoaXMgc2VydmljZS5cbiAqL1xuU2VydmljZXM/OiBTZXJ2aWNlQ29ubmVjdFNlcnZpY2VbXVxuQWNjZXNzTG9nQ29uZmlndXJhdGlvbj86IFNlcnZpY2VDb25uZWN0QWNjZXNzTG9nQ29uZmlndXJhdGlvblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgU2VydmljZSBDb25uZWN0IHdpdGggdGhpcyBzZXJ2aWNlLlxuICovXG5FbmFibGVkOiBib29sZWFuXG5Mb2dDb25maWd1cmF0aW9uPzogTG9nQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbmFtZXNwYWNlIG5hbWUgb3IgZnVsbCBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgQ01BUGxvbmcgbmFtZXNwYWNlIGZvciB1c2Ugd2l0aCBTZXJ2aWNlIENvbm5lY3QuIFRoZSBuYW1lc3BhY2UgbXVzdCBiZSBpbiB0aGUgc2FtZSBBV1MgUmVnaW9uIGFzIHRoZSBBbWF6b24gRUNTIHNlcnZpY2UgYW5kIGNsdXN0ZXIuIFRoZSB0eXBlIG9mIG5hbWVzcGFjZSBkb2Vzbid0IGFmZmVjdCBTZXJ2aWNlIENvbm5lY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENNQVBsb25nLCBzZWUgW1dvcmtpbmcgd2l0aCBTZXJ2aWNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkLW1hcC9sYXRlc3QvZGcvd29ya2luZy13aXRoLXNlcnZpY2VzLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuTmFtZXNwYWNlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZSBvYmplY3QgY29uZmlndXJhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0U2VydmljZSB7XG5UaW1lb3V0PzogVGltZW91dENvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIGZvciB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5IHRvIGxpc3RlbiBvbi5cbiAqICBVc2UgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgdG8gYnlwYXNzIHRoZSBwcm94eSBmb3IgdHJhZmZpYyBvbiB0aGUgcG9ydCBudW1iZXIgc3BlY2lmaWVkIGluIHRoZSBuYW1lZCBgYHBvcnRNYXBwaW5nYGAgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiBvZiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlbiB1c2UgaXQgaW4geW91ciBWUEMgc2VjdXJpdHkgZ3JvdXBzIHRvIGFsbG93IHRyYWZmaWMgaW50byB0aGUgcHJveHkgZm9yIHRoaXMgQW1hem9uIEVDUyBzZXJ2aWNlLlxuICogIEluIGBgYXdzdnBjYGAgbW9kZSBhbmQgRmFyZ2F0ZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBwb3J0IG51bWJlci4gVGhlIGNvbnRhaW5lciBwb3J0IG51bWJlciBpcyBpbiB0aGUgYGBwb3J0TWFwcGluZ2BgIGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEluIGJyaWRnZSBtb2RlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZXBoZW1lcmFsIHBvcnQgb2YgdGhlIFNlcnZpY2UgQ29ubmVjdCBwcm94eS5cbiAqL1xuSW5ncmVzc1BvcnRPdmVycmlkZT86IG51bWJlclxuLyoqXG4gKiBUaGUgbGlzdCBvZiBjbGllbnQgYWxpYXNlcyBmb3IgdGhpcyBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gWW91IHVzZSB0aGVzZSB0byBhc3NpZ24gbmFtZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50IGFsaWFzZXMgdGhhdCB5b3UgY2FuIGhhdmUgaW4gdGhpcyBsaXN0IGlzIDEuXG4gKiAgRWFjaCBhbGlhcyAoXCJlbmRwb2ludFwiKSBpcyBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGFuZCBwb3J0IG51bWJlciB0aGF0IG90aGVyIEFtYXpvbiBFQ1MgdGFza3MgKFwiY2xpZW50c1wiKSBjYW4gdXNlIHRvIGNvbm5lY3QgdG8gdGhpcyBzZXJ2aWNlLlxuICogIEVhY2ggbmFtZSBhbmQgcG9ydCBtYXBwaW5nIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbmFtZXNwYWNlLlxuICogIEZvciBlYWNoIGBgU2VydmljZUNvbm5lY3RTZXJ2aWNlYGAsIHlvdSBtdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGBgY2xpZW50QWxpYXNgYCB3aXRoIG9uZSBgYHBvcnRgYC5cbiAqL1xuQ2xpZW50QWxpYXNlcz86IFNlcnZpY2VDb25uZWN0Q2xpZW50QWxpYXNbXVxuVGxzPzogU2VydmljZUNvbm5lY3RUbHNDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBgYGRpc2NvdmVyeU5hbWVgYCBpcyB0aGUgbmFtZSBvZiB0aGUgbmV3IENNQVAgc2VydmljZSB0aGF0IEFtYXpvbiBFQ1MgY3JlYXRlcyBmb3IgdGhpcyBBbWF6b24gRUNTIHNlcnZpY2UuIFRoaXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBDTUFQIG5hbWVzcGFjZS4gVGhlIG5hbWUgY2FuIGNvbnRhaW4gdXAgdG8gNjQgY2hhcmFjdGVycy4gVGhlIG5hbWUgY2FuIGluY2x1ZGUgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzIChfKSwgYW5kIGh5cGhlbnMgKC0pLiBUaGUgbmFtZSBjYW4ndCBzdGFydCB3aXRoIGEgaHlwaGVuLlxuICogIElmIHRoZSBgYGRpc2NvdmVyeU5hbWVgYCBpc24ndCBzcGVjaWZpZWQsIHRoZSBwb3J0IG1hcHBpbmcgbmFtZSBmcm9tIHRoZSB0YXNrIGRlZmluaXRpb24gaXMgdXNlZCBpbiBgYHBvcnROYW1lLm5hbWVzcGFjZWBgLlxuICovXG5EaXNjb3ZlcnlOYW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBgYHBvcnROYW1lYGAgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGBgcG9ydE1hcHBpbmdzYGAgZnJvbSBhbGwgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbiBvZiB0aGlzIEFtYXpvbiBFQ1Mgc2VydmljZS5cbiAqL1xuUG9ydE5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjb25maWd1cmVkIHRpbWVvdXRzIGZvciBTZXJ2aWNlIENvbm5lY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZW91dENvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgYW1vdW50IG9mIHRpbWUgd2FpdGluZyBmb3IgdGhlIHVwc3RyZWFtIHRvIHJlc3BvbmQgd2l0aCBhIGNvbXBsZXRlIHJlc3BvbnNlIHBlciByZXF1ZXN0LiBBIHZhbHVlIG9mIGBgMGBgIGNhbiBiZSBzZXQgdG8gZGlzYWJsZSBgYHBlclJlcXVlc3RUaW1lb3V0YGAuIGBgcGVyUmVxdWVzdFRpbWVvdXRgYCBjYW4gb25seSBiZSBzZXQgaWYgU2VydmljZSBDb25uZWN0IGBgYXBwUHJvdG9jb2xgYCBpc24ndCBgYFRDUGBgLiBPbmx5IGBgaWRsZVRpbWVvdXRgYCBpcyBhbGxvd2VkIGZvciBgYFRDUGBgYGBhcHBQcm90b2NvbGBgLlxuICovXG5QZXJSZXF1ZXN0VGltZW91dFNlY29uZHM/OiBudW1iZXJcbi8qKlxuICogVGhlIGFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgYSBjb25uZWN0aW9uIHdpbGwgc3RheSBhY3RpdmUgd2hpbGUgaWRsZS4gQSB2YWx1ZSBvZiBgYDBgYCBjYW4gYmUgc2V0IHRvIGRpc2FibGUgYGBpZGxlVGltZW91dGBgLlxuICogIFRoZSBgYGlkbGVUaW1lb3V0YGAgZGVmYXVsdCBmb3IgYGBIVFRQYGAvYGBIVFRQMmBgL2BgR1JQQ2BgIGlzIDUgbWludXRlcy5cbiAqICBUaGUgYGBpZGxlVGltZW91dGBgIGRlZmF1bHQgZm9yIGBgVENQYGAgaXMgMSBob3VyLlxuICovXG5JZGxlVGltZW91dFNlY29uZHM/OiBudW1iZXJcbn1cbi8qKlxuICogRWFjaCBhbGlhcyAoXCJlbmRwb2ludFwiKSBpcyBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGFuZCBwb3J0IG51bWJlciB0aGF0IG90aGVyIHRhc2tzIChcImNsaWVudHNcIikgY2FuIHVzZSB0byBjb25uZWN0IHRvIHRoaXMgc2VydmljZS5cbiAqICBFYWNoIG5hbWUgYW5kIHBvcnQgbWFwcGluZyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIG5hbWVzcGFjZS5cbiAqICBUYXNrcyB0aGF0IHJ1biBpbiBhIG5hbWVzcGFjZSBjYW4gdXNlIHNob3J0IG5hbWVzIHRvIGNvbm5lY3QgdG8gc2VydmljZXMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY2FuIGNvbm5lY3QgdG8gc2VydmljZXMgYWNyb3NzIGFsbCBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY29ubmVjdCB0aHJvdWdoIGEgbWFuYWdlZCBwcm94eSBjb250YWluZXIgdGhhdCBjb2xsZWN0cyBsb2dzIGFuZCBtZXRyaWNzIGZvciBpbmNyZWFzZWQgdmlzaWJpbGl0eS4gT25seSB0aGUgdGFza3MgdGhhdCBBbWF6b24gRUNTIHNlcnZpY2VzIGNyZWF0ZSBhcmUgc3VwcG9ydGVkIHdpdGggU2VydmljZSBDb25uZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aWNlIENvbm5lY3RdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtY29ubmVjdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RDbGllbnRBbGlhcyB7XG4vKipcbiAqIFRoZSBgYGRuc05hbWVgYCBpcyB0aGUgbmFtZSB0aGF0IHlvdSB1c2UgaW4gdGhlIGFwcGxpY2F0aW9ucyBvZiBjbGllbnQgdGFza3MgdG8gY29ubmVjdCB0byB0aGlzIHNlcnZpY2UuIFRoZSBuYW1lIG11c3QgYmUgYSB2YWxpZCBETlMgbmFtZSBidXQgZG9lc24ndCBuZWVkIHRvIGJlIGZ1bGx5LXF1YWxpZmllZC4gVGhlIG5hbWUgY2FuIGluY2x1ZGUgdXAgdG8gMTI3IGNoYXJhY3RlcnMuIFRoZSBuYW1lIGNhbiBpbmNsdWRlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyAoXyksIGh5cGhlbnMgKC0pLCBhbmQgcGVyaW9kcyAoLikuIFRoZSBuYW1lIGNhbid0IHN0YXJ0IHdpdGggYSBoeXBoZW4uXG4gKiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYGRpc2NvdmVyeU5hbWUubmFtZXNwYWNlYGAgaXMgdXNlZC4gSWYgdGhlIGBgZGlzY292ZXJ5TmFtZWBgIGlzbid0IHNwZWNpZmllZCwgdGhlIHBvcnQgbWFwcGluZyBuYW1lIGZyb20gdGhlIHRhc2sgZGVmaW5pdGlvbiBpcyB1c2VkIGluIGBgcG9ydE5hbWUubmFtZXNwYWNlYGAuXG4gKiAgVG8gYXZvaWQgY2hhbmdpbmcgeW91ciBhcHBsaWNhdGlvbnMgaW4gY2xpZW50IEFtYXpvbiBFQ1Mgc2VydmljZXMsIHNldCB0aGlzIHRvIHRoZSBzYW1lIG5hbWUgdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdC4gRm9yIGV4YW1wbGUsIGEgZmV3IGNvbW1vbiBuYW1lcyBhcmUgYGBkYXRhYmFzZWBgLCBgYGRiYGAsIG9yIHRoZSBsb3dlcmNhc2UgbmFtZSBvZiBhIGRhdGFiYXNlLCBzdWNoIGFzIGBgbXlzcWxgYCBvciBgYHJlZGlzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2UgQ29ubmVjdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1jb25uZWN0Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRG5zTmFtZT86IHN0cmluZ1xuVGVzdFRyYWZmaWNSdWxlcz86IFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc1xuLyoqXG4gKiBUaGUgbGlzdGVuaW5nIHBvcnQgbnVtYmVyIGZvciB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5LiBUaGlzIHBvcnQgaXMgYXZhaWxhYmxlIGluc2lkZSBvZiBhbGwgb2YgdGhlIHRhc2tzIHdpdGhpbiB0aGUgc2FtZSBuYW1lc3BhY2UuXG4gKiAgVG8gYXZvaWQgY2hhbmdpbmcgeW91ciBhcHBsaWNhdGlvbnMgaW4gY2xpZW50IEFtYXpvbiBFQ1Mgc2VydmljZXMsIHNldCB0aGlzIHRvIHRoZSBzYW1lIHBvcnQgdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Qb3J0OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRlc3QgdHJhZmZpYyByb3V0aW5nIHJ1bGVzIHVzZWQgZHVyaW5nIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMgd2l0aCBBbWF6b24gRUNTIFNlcnZpY2UgQ29ubmVjdC4gVGhpcyBhbGxvd3MgeW91IHRvIHJvdXRlIGEgcG9ydGlvbiBvZiB0cmFmZmljIHRvIHRoZSBuZXcgc2VydmljZSByZXZpc2lvbiBvZiB5b3VyIHNlcnZpY2UgZm9yIHRlc3RpbmcgYmVmb3JlIHNoaWZ0aW5nIGFsbCBwcm9kdWN0aW9uIHRyYWZmaWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzIHtcbkhlYWRlcjogU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzSGVhZGVyXG59XG4vKipcbiAqIFRoZSBIVFRQIGhlYWRlci1iYXNlZCByb3V0aW5nIHJ1bGVzIHRoYXQgZGV0ZXJtaW5lIHdoaWNoIHJlcXVlc3RzIHNob3VsZCBiZSByb3V0ZWQgdG8gdGhlIG5ldyBzZXJ2aWNlIHZlcnNpb24gZHVyaW5nIGJsdWUvZ3JlZW4gZGVwbG95bWVudCB0ZXN0aW5nLiBUaGVzZSBydWxlcyBwcm92aWRlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGVzdCB0cmFmZmljIHJvdXRpbmcgYmFzZWQgb24gcmVxdWVzdCBoZWFkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc0hlYWRlciB7XG5WYWx1ZT86IFNlcnZpY2VDb25uZWN0VGVzdFRyYWZmaWNSdWxlc0hlYWRlclZhbHVlXG5OYW1lOiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUZXN0VHJhZmZpY1J1bGVzSGVhZGVyVmFsdWUge1xuRXhhY3Q6IHN0cmluZ1xufVxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUbHNDb25maWd1cmF0aW9uIHtcbklzc3VlckNlcnRpZmljYXRlQXV0aG9yaXR5OiBTZXJ2aWNlQ29ubmVjdFRsc0NlcnRpZmljYXRlQXV0aG9yaXR5XG4vKipcbiAqIFRoZSBBV1MgS2V5IE1hbmFnZW1lbnQgU2VydmljZSBrZXkuXG4gKi9cbkttc0tleT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgQ29ubmVjdCBUTFMuXG4gKi9cblJvbGVBcm4/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHNpZ25lciBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RUbHNDZXJ0aWZpY2F0ZUF1dGhvcml0eSB7XG4vKipcbiAqIFRoZSBBUk4gb2YgdGhlIEFXUyBQcml2YXRlIENlcnRpZmljYXRlIEF1dGhvcml0eSBjZXJ0aWZpY2F0ZS5cbiAqL1xuQXdzUGNhQXV0aG9yaXR5QXJuPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBTZXJ2aWNlIENvbm5lY3QgYWNjZXNzIGxvZ2dpbmcuIEFjY2VzcyBsb2dzIGNhcHR1cmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWVzdHMgbWFkZSB0byB5b3VyIHNlcnZpY2UsIGluY2x1ZGluZyByZXF1ZXN0IHBhdHRlcm5zLCByZXNwb25zZSBjb2RlcywgYW5kIHRpbWluZyBkYXRhLiBUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBjb25uZWN0aXZpdHkgaXNzdWVzLCBtb25pdG9yaW5nIHNlcnZpY2UgcGVyZm9ybWFuY2UsIGFuZCBhdWRpdGluZyBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbiBmb3Igc2VjdXJpdHkgYW5kIGNvbXBsaWFuY2UgcHVycG9zZXMuXG4gKiAgIFRvIGVuYWJsZSBhY2Nlc3MgbG9ncywgeW91IG11c3QgYWxzbyBzcGVjaWZ5IGEgYGBsb2dDb25maWd1cmF0aW9uYGAgaW4gdGhlIGBgc2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uYGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbm5lY3RBY2Nlc3NMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIGZvcm1hdCBmb3IgU2VydmljZSBDb25uZWN0IGFjY2VzcyBsb2cgb3V0cHV0LiBDaG9vc2UgVEVYVCBmb3IgaHVtYW4tcmVhZGFibGUgbG9ncyBvciBKU09OIGZvciBzdHJ1Y3R1cmVkIGRhdGEgdGhhdCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBsb2cgYW5hbHlzaXMgdG9vbHMuXG4gKi9cbkZvcm1hdDogKFwiVEVYVFwiIHwgXCJKU09OXCIpXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGluY2x1ZGUgcXVlcnkgcGFyYW1ldGVycyBpbiBTZXJ2aWNlIENvbm5lY3QgYWNjZXNzIGxvZ3MuXG4gKiAgV2hlbiBlbmFibGVkLCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gSFRUUCByZXF1ZXN0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFjY2VzcyBsb2dzLiBDb25zaWRlciBzZWN1cml0eSBhbmQgcHJpdmFjeSBpbXBsaWNhdGlvbnMgd2hlbiBlbmFibGluZyB0aGlzIGZlYXR1cmUsIGFzIHF1ZXJ5IHBhcmFtZXRlcnMgbWF5IGNvbnRhaW4gc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVxdWVzdCBJRHMgYW5kIHRva2Vucy4gQnkgZGVmYXVsdCwgdGhpcyBwYXJhbWV0ZXIgaXMgYGBESVNBQkxFRGBgLlxuICovXG5JbmNsdWRlUXVlcnlQYXJhbWV0ZXJzPzogKFwiRElTQUJMRURcIiB8IFwiRU5BQkxFRFwiKVxufVxuLyoqXG4gKiBUaGUgbG9nIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sb2ctZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsb2dnaW5nIGRyaXZlciB0aGFuIHRoZSBEb2NrZXIgZGFlbW9uIGJ5IHNwZWNpZnlpbmcgYSBsb2cgZHJpdmVyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIFVuZGVyc3RhbmQgdGhlIGZvbGxvd2luZyB3aGVuIHNwZWNpZnlpbmcgYSBsb2cgY29uZmlndXJhdGlvbiBmb3IgeW91ciBjb250YWluZXJzLlxuICogICArICBBbWF6b24gRUNTIGN1cnJlbnRseSBzdXBwb3J0cyBhIHN1YnNldCBvZiB0aGUgbG9nZ2luZyBkcml2ZXJzIGF2YWlsYWJsZSB0byB0aGUgRG9ja2VyIGRhZW1vbi4gQWRkaXRpb25hbCBsb2cgZHJpdmVycyBtYXkgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsYGBzeXNsb2dgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLlxuICogICArICBGb3IgdGFza3MgdGhhdCBhcmUgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgbXVzdCByZWdpc3RlciB0aGUgYXZhaWxhYmxlIGxvZ2dpbmcgZHJpdmVycyB3aXRoIHRoZSBgYEVDU19BVkFJTEFCTEVfTE9HR0lOR19EUklWRVJTYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBsb2cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgYXJlIG9uIEZBUkdBVEVsb25nLCBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbmZyYXN0cnVjdHVyZSB5b3VyIHRhc2tzIGFyZSBob3N0ZWQgb24sIGFueSBhZGRpdGlvbmFsIHNvZnR3YXJlIG5lZWRlZCBtdXN0IGJlIGluc3RhbGxlZCBvdXRzaWRlIG9mIHRoZSB0YXNrLiBGb3IgZXhhbXBsZSwgdGhlIEZsdWVudGQgb3V0cHV0IGFnZ3JlZ2F0b3JzIG9yIGEgcmVtb3RlIGhvc3QgcnVubmluZyBMb2dzdGFzaCB0byBzZW5kIEdlbGYgbG9ncyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgbG9nIGNvbmZpZ3VyYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRPcHRpb25zPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzZW5kIHRvIHRoZSBsb2cgZHJpdmVyLlxuICogIFRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSBkZXBlbmQgb24gdGhlIGxvZyBkcml2ZXIuIFNvbWUgb2YgdGhlIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4geW91IHVzZSB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciB0byByb3V0ZSBsb2dzIHRvIEFtYXpvbiBDbG91ZFdhdGNoIGluY2x1ZGUgdGhlIGZvbGxvd2luZzpcbiAqICAgKyBhd3Nsb2dzLWNyZWF0ZS1ncm91cCBSZXF1aXJlZDogTm8gU3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRoZSBsb2cgZ3JvdXAgdG8gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLiBZb3VyIElBTSBwb2xpY3kgbXVzdCBpbmNsdWRlIHRoZSBsb2dzOkNyZWF0ZUxvZ0dyb3VwIHBlcm1pc3Npb24gYmVmb3JlIHlvdSBhdHRlbXB0IHRvIHVzZSBhd3Nsb2dzLWNyZWF0ZS1ncm91cC4gKyBhd3Nsb2dzLXJlZ2lvbiBSZXF1aXJlZDogWWVzIFNwZWNpZnkgdGhlIFJlZ2lvbiB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgaXMgdG8gc2VuZCB5b3VyIERvY2tlciBsb2dzIHRvLiBZb3UgY2FuIGNob29zZSB0byBzZW5kIGFsbCBvZiB5b3VyIGxvZ3MgZnJvbSBjbHVzdGVycyBpbiBkaWZmZXJlbnQgUmVnaW9ucyB0byBhIHNpbmdsZSByZWdpb24gaW4gQ2xvdWRXYXRjaCBMb2dzLiBUaGlzIGlzIHNvIHRoYXQgdGhleSdyZSBhbGwgdmlzaWJsZSBpbiBvbmUgbG9jYXRpb24uIE90aGVyd2lzZSwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGJ5IFJlZ2lvbiBmb3IgbW9yZSBncmFudWxhcml0eS4gTWFrZSBzdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2cgZ3JvdXAgZXhpc3RzIGluIHRoZSBSZWdpb24gdGhhdCB5b3Ugc3BlY2lmeSB3aXRoIHRoaXMgb3B0aW9uLiArIGF3c2xvZ3MtZ3JvdXAgUmVxdWlyZWQ6IFllcyBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhIGxvZyBncm91cCB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgc2VuZHMgaXRzIGxvZyBzdHJlYW1zIHRvLiArIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBSZXF1aXJlZDogWWVzLCB3aGVuIHVzaW5nIEZhcmdhdGUuT3B0aW9uYWwgd2hlbiB1c2luZyBFQzIuIFVzZSB0aGUgYXdzbG9ncy1zdHJlYW0tcHJlZml4IG9wdGlvbiB0byBhc3NvY2lhdGUgYSBsb2cgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHRoZSBjb250YWluZXIgbmFtZSwgYW5kIHRoZSBJRCBvZiB0aGUgQW1hem9uIEVDUyB0YXNrIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLiBJZiB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIHRha2VzIHRoZSBmb3JtYXQgcHJlZml4LW5hbWUvY29udGFpbmVyLW5hbWUvZWNzLXRhc2staWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24sIHRoZW4gdGhlIGxvZyBzdHJlYW0gaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBJRCB0aGF0J3MgYXNzaWduZWQgYnkgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS4gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byB0cmFjZSBsb2dzIGJhY2sgdG8gdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSB3aXRoIGp1c3QgdGhlIERvY2tlciBjb250YWluZXIgSUQgKHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UpLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLiBGb3IgQW1hem9uIEVDUyBzZXJ2aWNlcywgeW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgbmFtZSBhcyB0aGUgcHJlZml4LiBEb2luZyBzbywgeW91IGNhbiB0cmFjZSBsb2cgc3RyZWFtcyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0bywgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSwgYW5kIHRoZSBJRCBvZiB0aGUgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gWW91IG11c3Qgc3BlY2lmeSBhIHN0cmVhbS1wcmVmaXggZm9yIHlvdXIgbG9ncyB0byBoYXZlIHlvdXIgbG9ncyBhcHBlYXIgaW4gdGhlIExvZyBwYW5lIHdoZW4gdXNpbmcgdGhlIEFtYXpvbiBFQ1MgY29uc29sZS4gKyBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIGluIFB5dGhvbiBzdHJmdGltZSBmb3JtYXQuIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gT25lIGV4YW1wbGUgb2YgYSB1c2UgY2FzZSBmb3IgdXNpbmcgdGhpcyBmb3JtYXQgaXMgZm9yIHBhcnNpbmcgb3V0cHV0IHN1Y2ggYXMgYSBzdGFjayBkdW1wLCB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgbG9nZ2VkIGluIG11bHRpcGxlIGVudHJpZXMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gYWxsb3dzIGl0IHRvIGJlIGNhcHR1cmVkIGluIGEgc2luZ2xlIGVudHJ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0LiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuICsgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIHRoYXQgdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQSBsb2cgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGFuZCBhbnkgZm9sbG93aW5nIGxpbmVzIHRoYXQgZG9u4oCZdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIG1hdGNoZWQgbGluZSBpcyB0aGUgZGVsaW1pdGVyIGJldHdlZW4gbG9nIG1lc3NhZ2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4uIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgaXMgYWxzbyBjb25maWd1cmVkLiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuIFxuICogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcHBseSB0byBhbGwgc3VwcG9ydGVkIGxvZyBkcml2ZXJzLlxuICogICArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIHRoZSBsb2cgZHJpdmVyIHNwZWNpZmllZCB1c2luZyBsb2dEcml2ZXIuIFRoZSBkZWxpdmVyeSBtb2RlIHlvdSBjaG9vc2UgYWZmZWN0cyBhcHBsaWNhdGlvbiBhdmFpbGFiaWxpdHkgd2hlbiB0aGUgZmxvdyBvZiBsb2dzIGZyb20gY29udGFpbmVyIGlzIGludGVycnVwdGVkLiBJZiB5b3UgdXNlIHRoZSBibG9ja2luZyBtb2RlIGFuZCB0aGUgZmxvdyBvZiBsb2dzIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIG1vZGUgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGFuZCBhcmUgb2theSB3aXRoIHNvbWUgbG9nIGxvc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUHJldmVudGluZyBsb2cgbG9zcyB3aXRoIG5vbi1ibG9ja2luZyBtb2RlIGluIHRoZSBhd3Nsb2dzIGNvbnRhaW5lciBsb2cgZHJpdmVyLiBZb3UgY2FuIHNldCBhIGRlZmF1bHQgbW9kZSBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSBzcGVjaWZpYyBSZWdpb24gYnkgdXNpbmcgdGhlIGRlZmF1bHRMb2dEcml2ZXJNb2RlIGFjY291bnQgc2V0dGluZy4gSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIG1vZGUgb3B0aW9uIG9yIGNvbmZpZ3VyZSB0aGUgYWNjb3VudCBzZXR0aW5nLCBBbWF6b24gRUNTIHdpbGwgZGVmYXVsdCB0byB0aGUgbm9uLWJsb2NraW5nIG1vZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IHNldHRpbmcsIHNlZSBEZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBpbiB0aGUgQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlLiBPbiBKdW5lIDI1LCAyMDI1LCBBbWF6b24gRUNTIGNoYW5nZWQgdGhlIGRlZmF1bHQgbG9nIGRyaXZlciBtb2RlIGZyb20gYmxvY2tpbmcgdG8gbm9uLWJsb2NraW5nIHRvIHByaW9yaXRpemUgdGFzayBhdmFpbGFiaWxpdHkgb3ZlciBsb2dnaW5nLiBUbyBjb250aW51ZSB1c2luZyB0aGUgYmxvY2tpbmcgbW9kZSBhZnRlciB0aGlzIGNoYW5nZSwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IFNldCB0aGUgbW9kZSBvcHRpb24gaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbidzIGxvZ0NvbmZpZ3VyYXRpb24gYXMgYmxvY2tpbmcuIFNldCB0aGUgZGVmYXVsdExvZ0RyaXZlck1vZGUgYWNjb3VudCBzZXR0aW5nIHRvIGJsb2NraW5nLiArIG1heC1idWZmZXItc2l6ZSBSZXF1aXJlZDogTm8gRGVmYXVsdCB2YWx1ZTogMTBtIFdoZW4gbm9uLWJsb2NraW5nIG1vZGUgaXMgdXNlZCwgdGhlIG1heC1idWZmZXItc2l6ZSBsb2cgb3B0aW9uIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCdzIHVzZWQgZm9yIGludGVybWVkaWF0ZSBtZXNzYWdlIHN0b3JhZ2UuIE1ha2Ugc3VyZSB0byBzcGVjaWZ5IGFuIGFkZXF1YXRlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCwgZnVydGhlciBsb2dzIGNhbm5vdCBiZSBzdG9yZWQuIExvZ3MgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGFyZSBsb3N0LiBcbiAqICBUbyByb3V0ZSBsb2dzIHVzaW5nIHRoZSBgYHNwbHVua2BgIGxvZyByb3V0ZXIsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBgYHNwbHVuay10b2tlbmBgIGFuZCBhIGBgc3BsdW5rLXVybGBgLlxuICogIFdoZW4geW91IHVzZSB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyByb3V0ZXIgdG8gcm91dGUgbG9ncyB0byBhbiBBV1MgU2VydmljZSBvciBBV1MgUGFydG5lciBOZXR3b3JrIGRlc3RpbmF0aW9uIGZvciBsb2cgc3RvcmFnZSBhbmQgYW5hbHl0aWNzLCB5b3UgY2FuIHNldCB0aGUgYGBsb2ctZHJpdmVyLWJ1ZmZlci1saW1pdGBgIG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGV2ZW50cyB0aGF0IGFyZSBidWZmZXJlZCBpbiBtZW1vcnksIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBsb2cgcm91dGVyIGNvbnRhaW5lci4gSXQgY2FuIGhlbHAgdG8gcmVzb2x2ZSBwb3RlbnRpYWwgbG9nIGxvc3MgaXNzdWUgYmVjYXVzZSBoaWdoIHRocm91Z2hwdXQgbWlnaHQgcmVzdWx0IGluIG1lbW9yeSBydW5uaW5nIG91dCBmb3IgdGhlIGJ1ZmZlciBpbnNpZGUgb2YgRG9ja2VyLlxuICogIE90aGVyIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4gdXNpbmcgYGBhd3NmaXJlbGVuc2BgIHRvIHJvdXRlIGxvZ3MgZGVwZW5kIG9uIHRoZSBkZXN0aW5hdGlvbi4gV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIERhdGEgRmlyZWhvc2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgbmFtZSBmb3IgdGhlIGxvZyBzdHJlYW0gd2l0aCBgYGRlbGl2ZXJ5X3N0cmVhbWBgLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBLaW5lc2lzIERhdGEgU3RyZWFtcywgeW91IGNhbiBzcGVjaWZ5IGFuIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIGRhdGEgc3RyZWFtIG5hbWUgd2l0aCBgYHN0cmVhbWBgLlxuICogICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLCB5b3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBsaWtlIGBgTmFtZWBgLCBgYEhvc3RgYCAoT3BlblNlYXJjaCBTZXJ2aWNlIGVuZHBvaW50IHdpdGhvdXQgcHJvdG9jb2wpLCBgYFBvcnRgYCwgYGBJbmRleGBgLCBgYFR5cGVgYCwgYGBBd3NfYXV0aGBgLCBgYEF3c19yZWdpb25gYCwgYGBTdXBwcmVzc19UeXBlX05hbWVgYCwgYW5kIGBgdGxzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VuZGVyIHRoZSBob29kOiBGaXJlTGVucyBmb3IgQW1hem9uIEVDUyBUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbnRhaW5lcnMvdW5kZXItdGhlLWhvb2QtZmlyZWxlbnMtZm9yLWFtYXpvbi1lY3MtdGFza3MvKS5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gUzMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYnVja2V0IHVzaW5nIHRoZSBgYGJ1Y2tldGBgIG9wdGlvbi4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYGByZWdpb25gYCwgYGB0b3RhbF9maWxlX3NpemVgYCwgYGB1cGxvYWRfdGltZW91dGBgLCBhbmQgYGB1c2VfcHV0X29iamVjdGBgIGFzIG9wdGlvbnMuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE5IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIGRyaXZlciB0byB1c2UgZm9yIHRoZSBjb250YWluZXIuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsIGBgc3lzbG9nYGAsIGBgc3BsdW5rYGAsIGFuZCBgYGF3c2ZpcmVsZW5zYGAuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gQ2xvdWRXYXRjaF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfYXdzbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgZHJpdmVyLCBzZWUgW1NlbmQgQW1hem9uIEVDUyBsb2dzIHRvIGFuIHNlcnZpY2Ugb3IgUGFydG5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkuXG4gKiAgIElmIHlvdSBoYXZlIGEgY3VzdG9tIGRyaXZlciB0aGF0IGlzbid0IGxpc3RlZCwgeW91IGNhbiBmb3JrIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwcm9qZWN0IHRoYXQncyBbYXZhaWxhYmxlIG9uIEdpdEh1Yl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYW1hem9uLWVjcy1hZ2VudCkgYW5kIGN1c3RvbWl6ZSBpdCB0byB3b3JrIHdpdGggdGhhdCBkcml2ZXIuIFdlIGVuY291cmFnZSB5b3UgdG8gc3VibWl0IHB1bGwgcmVxdWVzdHMgZm9yIGNoYW5nZXMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGluY2x1ZGVkLiBIb3dldmVyLCB3ZSBkb24ndCBjdXJyZW50bHkgcHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIG1vZGlmaWVkIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLlxuICovXG5Mb2dEcml2ZXI/OiBzdHJpbmdcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VjcmV0IHRvIGV4cG9zZSB0byB5b3VyIGNvbnRhaW5lci4gU2VjcmV0cyBjYW4gYmUgZXhwb3NlZCB0byBhIGNvbnRhaW5lciBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAgICsgIFRvIGluamVjdCBzZW5zaXRpdmUgZGF0YSBpbnRvIHlvdXIgY29udGFpbmVycyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHVzZSB0aGUgYGBzZWNyZXRzYGAgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVyLlxuICogICArICBUbyByZWZlcmVuY2Ugc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGluIHRoZSBsb2cgY29uZmlndXJhdGlvbiBvZiBhIGNvbnRhaW5lciwgdXNlIHRoZSBgYHNlY3JldE9wdGlvbnNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldCB7XG4vKipcbiAqIFRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHRoZSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9mIHRoZSBBU01sb25nIHNlY3JldCBvciB0aGUgZnVsbCBBUk4gb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAqICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVpcmUgSUFNbG9uZyBwZXJtaXNzaW9ucywgc2VlIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1zZWNyZXRzLmh0bWwjc2VjcmV0cy1pYW0pIChmb3IgU2VjcmV0cyBNYW5hZ2VyKSBvciBbUmVxdWlyZWQgSUFNIHBlcm1pc3Npb25zIGZvciBBbWF6b24gRUNTIHNlY3JldHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEtcGFyYW1ldGVycy5odG1sKSAoZm9yIFN5c3RlbXMgTWFuYWdlciBQYXJhbWV0ZXIgc3RvcmUpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgSWYgdGhlIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyIGV4aXN0cyBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIHRhc2sgeW91J3JlIGxhdW5jaGluZywgdGhlbiB5b3UgY2FuIHVzZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9yIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gSWYgdGhlIHBhcmFtZXRlciBleGlzdHMgaW4gYSBkaWZmZXJlbnQgUmVnaW9uLCB0aGVuIHRoZSBmdWxsIEFSTiBtdXN0IGJlIHNwZWNpZmllZC5cbiAqL1xuVmFsdWVGcm9tOiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHNlY3JldC5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uIGZvciB5b3VyIHNlcnZpY2UgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgZ3JvdXAocykgQW1hem9uIEVDUyB0YXNrcyB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjTGF0dGljZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgZnVsbCBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFyZ2V0IGdyb3VwIG9yIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIFZQQyBMYXR0aWNlIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgQW1hem9uIEVDUyB0YXNrcyB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8uXG4gKi9cblRhcmdldEdyb3VwQXJuOiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHBvcnQgbWFwcGluZyB0byByZWdpc3RlciBpbiB0aGUgVlBDIExhdHRpY2UgdGFyZ2V0IGdyb3VwLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBgYHBvcnRNYXBwaW5nYGAgeW91IGRlZmluZWQgaW4geW91ciB0YXNrIGRlZmluaXRpb24uXG4gKi9cblBvcnROYW1lOiBzdHJpbmdcbi8qKlxuICogVGhlIEFSTiBvZiB0aGUgSUFNIHJvbGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBWUEMgTGF0dGljZSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHRoZSBBbWF6b24gRUNT4oCoIGluZnJhc3RydWN0dXJlIElBTSByb2xlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgeW91ciBWUEMgTGF0dGljZSBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuUm9sZUFybjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdG8gdXNlIGZvciB0aGUgc2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50Q29udHJvbGxlciB7XG4vKipcbiAqIFRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgdHlwZSB0byB1c2UuXG4gKiAgVGhlIGRlcGxveW1lbnQgY29udHJvbGxlciBpcyB0aGUgbWVjaGFuaXNtIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGFza3MgYXJlIGRlcGxveWVkIGZvciB5b3VyIHNlcnZpY2UuIFRoZSB2YWxpZCBvcHRpb25zIGFyZTpcbiAqICAgKyAgRUNTXG4gKiAgV2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSB3aGljaCB1c2VzIHRoZSBgYEVDU2BgIGRlcGxveW1lbnQgY29udHJvbGxlciwgeW91IGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGRlcGxveW1lbnQgc3RyYXRlZ2llczpcbiAqICAgKyAgYGBST0xMSU5HYGA6IFdoZW4geW91IGNyZWF0ZSBhIHNlcnZpY2Ugd2hpY2ggdXNlcyB0aGUgKnJvbGxpbmcgdXBkYXRlKiAoYGBST0xMSU5HYGApIGRlcGxveW1lbnQgc3RyYXRlZ3ksIHRoZSBFQ1Mgc2VydmljZSBzY2hlZHVsZXIgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIHdpdGggbmV3IHRhc2tzLiBUaGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgRUNTIGFkZHMgb3IgcmVtb3ZlcyBmcm9tIHRoZSBzZXJ2aWNlIGR1cmluZyBhIHJvbGxpbmcgdXBkYXRlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHNlcnZpY2UgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLiBcbiAqICBSb2xsaW5nIHVwZGF0ZSBkZXBsb3ltZW50cyBhcmUgYmVzdCBzdWl0ZWQgZm9yIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOlxuICogICArICBHcmFkdWFsIHNlcnZpY2UgdXBkYXRlczogWW91IG5lZWQgdG8gdXBkYXRlIHlvdXIgc2VydmljZSBpbmNyZW1lbnRhbGx5IHdpdGhvdXQgdGFraW5nIHRoZSBlbnRpcmUgc2VydmljZSBvZmZsaW5lIGF0IG9uY2UuXG4gKiAgICsgIExpbWl0ZWQgcmVzb3VyY2UgcmVxdWlyZW1lbnRzOiBZb3Ugd2FudCB0byBhdm9pZCB0aGUgYWRkaXRpb25hbCByZXNvdXJjZSBjb3N0cyBvZiBydW5uaW5nIHR3byBjb21wbGV0ZSBlbnZpcm9ubWVudHMgc2ltdWx0YW5lb3VzbHkgKGFzIHJlcXVpcmVkIGJ5IGJsdWUvZ3JlZW4gZGVwbG95bWVudHMpLlxuICogICArICBBY2NlcHRhYmxlIGRlcGxveW1lbnQgdGltZTogWW91ciBhcHBsaWNhdGlvbiBjYW4gdG9sZXJhdGUgYSBsb25nZXIgZGVwbG95bWVudCBwcm9jZXNzLCBhcyByb2xsaW5nIHVwZGF0ZXMgcmVwbGFjZSB0YXNrcyBvbmUgYnkgb25lLlxuICogICArICBObyBuZWVkIGZvciBpbnN0YW50IHJvbGwgYmFjazogWW91ciBzZXJ2aWNlIGNhbiB0b2xlcmF0ZSBhIHJvbGxiYWNrIHByb2Nlc3MgdGhhdCB0YWtlcyBtaW51dGVzIHJhdGhlciB0aGFuIHNlY29uZHMuXG4gKiAgICsgIFNpbXBsZSBkZXBsb3ltZW50IHByb2Nlc3M6IFlvdSBwcmVmZXIgYSBzdHJhaWdodGZvcndhcmQgZGVwbG95bWVudCBhcHByb2FjaCB3aXRob3V0IHRoZSBjb21wbGV4aXR5IG9mIG1hbmFnaW5nIG11bHRpcGxlIGVudmlyb25tZW50cywgdGFyZ2V0IGdyb3VwcywgYW5kIGxpc3RlbmVycy5cbiAqICAgKyAgTm8gbG9hZCBiYWxhbmNlciByZXF1aXJlbWVudDogWW91ciBzZXJ2aWNlIGRvZXNuJ3QgdXNlIG9yIHJlcXVpcmUgYSBsb2FkIGJhbGFuY2VyLCBBTEIsIE5MQiwgb3IgU2VydmljZSBDb25uZWN0ICh3aGljaCBhcmUgcmVxdWlyZWQgZm9yIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMpLlxuICogICArICBTdGF0ZWZ1bCBhcHBsaWNhdGlvbnM6IFlvdXIgYXBwbGljYXRpb24gbWFpbnRhaW5zIHN0YXRlIHRoYXQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIHJ1biB0d28gcGFyYWxsZWwgZW52aXJvbm1lbnRzLlxuICogICArICBDb3N0IHNlbnNpdGl2aXR5OiBZb3Ugd2FudCB0byBtaW5pbWl6ZSBkZXBsb3ltZW50IGNvc3RzIGJ5IG5vdCBydW5uaW5nIGR1cGxpY2F0ZSBlbnZpcm9ubWVudHMgZHVyaW5nIGRlcGxveW1lbnQuXG4gKiAgIFxuICogIFJvbGxpbmcgdXBkYXRlcyBhcmUgdGhlIGRlZmF1bHQgZGVwbG95bWVudCBzdHJhdGVneSBmb3Igc2VydmljZXMgYW5kIHByb3ZpZGUgYSBiYWxhbmNlIGJldHdlZW4gZGVwbG95bWVudCBzYWZldHkgYW5kIHJlc291cmNlIGVmZmljaWVuY3kgZm9yIG1hbnkgY29tbW9uIGFwcGxpY2F0aW9uIHNjZW5hcmlvcy5cbiAqICAgKyAgYGBCTFVFX0dSRUVOYGA6IEEgKmJsdWUvZ3JlZW4qIGRlcGxveW1lbnQgc3RyYXRlZ3kgKGBgQkxVRV9HUkVFTmBgKSBpcyBhIHJlbGVhc2UgbWV0aG9kb2xvZ3kgdGhhdCByZWR1Y2VzIGRvd250aW1lIGFuZCByaXNrIGJ5IHJ1bm5pbmcgdHdvIGlkZW50aWNhbCBwcm9kdWN0aW9uIGVudmlyb25tZW50cyBjYWxsZWQgYmx1ZSBhbmQgZ3JlZW4uIFdpdGggRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMsIHlvdSBjYW4gdmFsaWRhdGUgbmV3IHNlcnZpY2UgcmV2aXNpb25zIGJlZm9yZSBkaXJlY3RpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIHRoZW0uIFRoaXMgYXBwcm9hY2ggcHJvdmlkZXMgYSBzYWZlciB3YXkgdG8gZGVwbG95IGNoYW5nZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBxdWlja2x5IHJvbGwgYmFjayBpZiBuZWVkZWQuXG4gKiAgRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMgYXJlIGJlc3Qgc3VpdGVkIGZvciB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczpcbiAqICAgKyAgU2VydmljZSB2YWxpZGF0aW9uOiBXaGVuIHlvdSBuZWVkIHRvIHZhbGlkYXRlIG5ldyBzZXJ2aWNlIHJldmlzaW9ucyBiZWZvcmUgZGlyZWN0aW5nIHByb2R1Y3Rpb24gdHJhZmZpYyB0byB0aGVtXG4gKiAgICsgIFplcm8gZG93bnRpbWU6IFdoZW4geW91ciBzZXJ2aWNlIHJlcXVpcmVzIHplcm8tZG93bnRpbWUgZGVwbG95bWVudHNcbiAqICAgKyAgSW5zdGFudCByb2xsIGJhY2s6IFdoZW4geW91IG5lZWQgdGhlIGFiaWxpdHkgdG8gcXVpY2tseSByb2xsIGJhY2sgaWYgaXNzdWVzIGFyZSBkZXRlY3RlZFxuICogICArICBMb2FkIGJhbGFuY2VyIHJlcXVpcmVtZW50OiBXaGVuIHlvdXIgc2VydmljZSB1c2VzIEFMQiwgTkxCLCBvciBTZXJ2aWNlIENvbm5lY3RcbiAqICAgXG4gKiAgIFxuICogICArICBFeHRlcm5hbFxuICogIFVzZSBhIHRoaXJkLXBhcnR5IGRlcGxveW1lbnQgY29udHJvbGxlci5cbiAqICAgKyAgQmx1ZS9ncmVlbiBkZXBsb3ltZW50IChwb3dlcmVkIGJ5IEFDRClcbiAqICBBQ0QgaW5zdGFsbHMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBhcyBhIG5ldyByZXBsYWNlbWVudCB0YXNrIHNldCBhbmQgcmVyb3V0ZXMgcHJvZHVjdGlvbiB0cmFmZmljIGZyb20gdGhlIG9yaWdpbmFsIGFwcGxpY2F0aW9uIHRhc2sgc2V0IHRvIHRoZSByZXBsYWNlbWVudCB0YXNrIHNldC4gVGhlIG9yaWdpbmFsIHRhc2sgc2V0IGlzIHRlcm1pbmF0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRlcGxveW1lbnQuIFVzZSB0aGlzIGRlcGxveW1lbnQgY29udHJvbGxlciB0byB2ZXJpZnkgYSBuZXcgZGVwbG95bWVudCBvZiBhIHNlcnZpY2UgYmVmb3JlIHNlbmRpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIGl0LlxuICogICBcbiAqICBXaGVuIHVwZGF0aW5nIHRoZSBkZXBsb3ltZW50IGNvbnRyb2xsZXIgZm9yIGEgc2VydmljZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWlncmF0aW9uIHlvdSdyZSBwZXJmb3JtaW5nLlxuICogICArICBJZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyBgYFRhc2tTZXRgYCBhbmQgYGBQcmltYXJ5VGFza1NldGBgIHJlc291cmNlcywgYW5kIHlvdSByZW1vdmUgdGhlIHRhc2sgc2V0IHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZSB3aGVuIHVwZGF0aW5nIGZyb20gYGBFWFRFUk5BTGBgIHRvIGBgRUNTYGAsIHRoZSBgYERlc2NyaWJlVGFza1NldGBgIGFuZCBgYERlbGV0ZVRhc2tTZXRgYCBBUEkgY2FsbHMgd2lsbCByZXR1cm4gYSA0MDAgZXJyb3IgYWZ0ZXIgdGhlIGRlcGxveW1lbnQgY29udHJvbGxlciBpcyB1cGRhdGVkIHRvIGBgRUNTYGAuIFRoaXMgcmVzdWx0cyBpbiBhIGRlbGV0ZSBmYWlsdXJlIG9uIHRoZSB0YXNrIHNldCByZXNvdXJjZXMsIGV2ZW4gdGhvdWdoIHRoZSBzdGFjayB0cmFuc2l0aW9ucyB0byBgYFVQREFURV9DT01QTEVURWBgIHN0YXR1cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzb3VyY2UgcmVtb3ZlZCBmcm9tIHN0YWNrIGJ1dCBub3QgZGVsZXRlZF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvdHJvdWJsZXNob290aW5nLmh0bWwjdHJvdWJsZXNob290aW5nLWVycm9ycy1yZXNvdXJjZS1yZW1vdmVkLW5vdC1kZWxldGVkKSBpbiB0aGUgQ0ZObG9uZyBVc2VyIEd1aWRlLiBUbyBmaXggdGhpcyBpc3N1ZSwgZGVsZXRlIHRoZSB0YXNrIHNldHMgZGlyZWN0bHkgdXNpbmcgdGhlIEVDU2BgRGVsZXRlVGFza1NldGBgIEFQSS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRlbGV0ZSBhIHRhc2sgc2V0LCBzZWUgW0RlbGV0ZVRhc2tTZXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVGFza1NldC5odG1sKSBpbiB0aGUgRUNTbG9uZyBBUEkgUmVmZXJlbmNlLlxuICogICArICBJZiB5b3UncmUgbWlncmF0aW5nIGZyb20gYGBDT0RFX0RFUExPWWBgIHRvIGBgRUNTYGAgd2l0aCBhIG5ldyB0YXNrIGRlZmluaXRpb24gYW5kIENGTiBwZXJmb3JtcyBhIHJvbGxiYWNrIG9wZXJhdGlvbiwgdGhlIEVDU2BgVXBkYXRlU2VydmljZWBgIHJlcXVlc3QgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yOlxuICogIFJlc291cmNlIGhhbmRsZXIgcmV0dXJuZWQgbWVzc2FnZTogXCJJbnZhbGlkIHJlcXVlc3QgcHJvdmlkZWQ6IFVuYWJsZSB0byB1cGRhdGUgdGFzayBkZWZpbml0aW9uIG9uIHNlcnZpY2VzIHdpdGggYSBDT0RFX0RFUExPWSBkZXBsb3ltZW50IGNvbnRyb2xsZXIuIFxuICogICArICBBZnRlciBhIHN1Y2Nlc3NmdWwgbWlncmF0aW9uIGZyb20gYGBFQ1NgYCB0byBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCBjb250cm9sbGVyLCB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgdGhlIGBgQUNUSVZFYGAgdGFzayBzZXQsIGJlY2F1c2UgRUNTIG5vIGxvbmdlciBtYW5hZ2VzIHRoZSBkZXBsb3ltZW50LiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRlbGV0ZSBhIHRhc2sgc2V0LCBzZWUgW0RlbGV0ZVRhc2tTZXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVGFza1NldC5odG1sKSBpbiB0aGUgRUNTbG9uZyBBUEkgUmVmZXJlbmNlLlxuICovXG5UeXBlPzogKFwiQ09ERV9ERVBMT1lcIiB8IFwiRUNTXCIgfCBcIkVYVEVSTkFMXCIpXG59XG4vKipcbiAqIE9wdGlvbmFsIGRlcGxveW1lbnQgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgaG93IG1hbnkgdGFza3MgcnVuIGR1cmluZyB0aGUgZGVwbG95bWVudCBhbmQgdGhlIG9yZGVyaW5nIG9mIHN0b3BwaW5nIGFuZCBzdGFydGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50Q29uZmlndXJhdGlvbiB7XG5DYW5hcnlDb25maWd1cmF0aW9uPzogQ2FuYXJ5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgZHVyYXRpb24gd2hlbiBib3RoIGJsdWUgYW5kIGdyZWVuIHNlcnZpY2UgcmV2aXNpb25zIGFyZSBydW5uaW5nIHNpbXVsdGFuZW91c2x5IGFmdGVyIHRoZSBwcm9kdWN0aW9uIHRyYWZmaWMgaGFzIHNoaWZ0ZWQuXG4gKiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB3aGVuIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWU6XG4gKiAgICsgIEZvciByb2xsaW5nIGRlcGxveW1lbnRzLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDMgaG91cnMgKDE4MCBtaW51dGVzKS5cbiAqICAgKyAgV2hlbiB5b3UgdXNlIGFuIGV4dGVybmFsIGRlcGxveW1lbnQgY29udHJvbGxlciAoYGBFWFRFUk5BTGBgKSwgb3IgdGhlIEFDRCBibHVlL2dyZWVuIGRlcGxveW1lbnQgY29udHJvbGxlciAoYGBDT0RFX0RFUExPWWBgKSwgdGhlIHZhbHVlIGlzIHNldCB0byAzIGhvdXJzICgxODAgbWludXRlcykuXG4gKiAgICsgIEZvciBhbGwgb3RoZXIgY2FzZXMsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gMzYgaG91cnMgKDIxNjAgbWludXRlcykuXG4gKi9cbkJha2VUaW1lSW5NaW51dGVzPzogbnVtYmVyXG4vKipcbiAqIEFuIGFycmF5IG9mIGRlcGxveW1lbnQgbGlmZWN5Y2xlIGhvb2sgb2JqZWN0cyB0byBydW4gY3VzdG9tIGxvZ2ljIGF0IHNwZWNpZmljIHN0YWdlcyBvZiB0aGUgZGVwbG95bWVudCBsaWZlY3ljbGUuXG4gKi9cbkxpZmVjeWNsZUhvb2tzPzogRGVwbG95bWVudExpZmVjeWNsZUhvb2tbXVxuQWxhcm1zPzogRGVwbG95bWVudEFsYXJtc1xuLyoqXG4gKiBUaGUgZGVwbG95bWVudCBzdHJhdGVneSBmb3IgdGhlIHNlcnZpY2UuIENob29zZSBmcm9tIHRoZXNlIHZhbGlkIHZhbHVlczpcbiAqICAgKyAgYGBST0xMSU5HYGAgLSBXaGVuIHlvdSBjcmVhdGUgYSBzZXJ2aWNlIHdoaWNoIHVzZXMgdGhlIHJvbGxpbmcgdXBkYXRlIChgYFJPTExJTkdgYCkgZGVwbG95bWVudCBzdHJhdGVneSwgdGhlIEFtYXpvbiBFQ1Mgc2VydmljZSBzY2hlZHVsZXIgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIHdpdGggbmV3IHRhc2tzLiBUaGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBhZGRzIG9yIHJlbW92ZXMgZnJvbSB0aGUgc2VydmljZSBkdXJpbmcgYSByb2xsaW5nIHVwZGF0ZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBzZXJ2aWNlIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbi5cbiAqICAgKyAgYGBCTFVFX0dSRUVOYGAgLSBBIGJsdWUvZ3JlZW4gZGVwbG95bWVudCBzdHJhdGVneSAoYGBCTFVFX0dSRUVOYGApIGlzIGEgcmVsZWFzZSBtZXRob2RvbG9neSB0aGF0IHJlZHVjZXMgZG93bnRpbWUgYW5kIHJpc2sgYnkgcnVubmluZyB0d28gaWRlbnRpY2FsIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIGNhbGxlZCBibHVlIGFuZCBncmVlbi4gV2l0aCBBbWF6b24gRUNTIGJsdWUvZ3JlZW4gZGVwbG95bWVudHMsIHlvdSBjYW4gdmFsaWRhdGUgbmV3IHNlcnZpY2UgcmV2aXNpb25zIGJlZm9yZSBkaXJlY3RpbmcgcHJvZHVjdGlvbiB0cmFmZmljIHRvIHRoZW0uIFRoaXMgYXBwcm9hY2ggcHJvdmlkZXMgYSBzYWZlciB3YXkgdG8gZGVwbG95IGNoYW5nZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBxdWlja2x5IHJvbGwgYmFjayBpZiBuZWVkZWQuXG4gKiAgICsgIGBgTElORUFSYGAgLSBBICpsaW5lYXIqIGRlcGxveW1lbnQgc3RyYXRlZ3kgKGBgTElORUFSYGApIGdyYWR1YWxseSBzaGlmdHMgdHJhZmZpYyBmcm9tIHRoZSBjdXJyZW50IHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgdG8gYSBuZXcgZW52aXJvbm1lbnQgaW4gZXF1YWwgcGVyY2VudGFnZXMgb3ZlciB0aW1lLiBXaXRoIEFtYXpvbiBFQ1MgbGluZWFyIGRlcGxveW1lbnRzLCB5b3UgY2FuIGNvbnRyb2wgdGhlIHBhY2Ugb2YgdHJhZmZpYyBzaGlmdGluZyBhbmQgdmFsaWRhdGUgbmV3IHNlcnZpY2UgcmV2aXNpb25zIHdpdGggaW5jcmVhc2luZyBhbW91bnRzIG9mIHByb2R1Y3Rpb24gdHJhZmZpYy5cbiAqICAgKyAgYGBDQU5BUllgYCAtIEEgKmNhbmFyeSogZGVwbG95bWVudCBzdHJhdGVneSAoYGBDQU5BUllgYCkgc2hpZnRzIGEgc21hbGwgcGVyY2VudGFnZSBvZiB0cmFmZmljIHRvIHRoZSBuZXcgc2VydmljZSByZXZpc2lvbiBmaXJzdCwgdGhlbiBzaGlmdHMgdGhlIHJlbWFpbmluZyB0cmFmZmljIGFsbCBhdCBvbmNlIGFmdGVyIGEgc3BlY2lmaWVkIHRpbWUgcGVyaW9kLiBUaGlzIGFsbG93cyB5b3UgdG8gdGVzdCB0aGUgbmV3IHZlcnNpb24gd2l0aCBhIHN1YnNldCBvZiB1c2VycyBiZWZvcmUgZnVsbCBkZXBsb3ltZW50LlxuICovXG5TdHJhdGVneT86IChcIlJPTExJTkdcIiB8IFwiQkxVRV9HUkVFTlwiIHwgXCJMSU5FQVJcIiB8IFwiQ0FOQVJZXCIpXG5EZXBsb3ltZW50Q2lyY3VpdEJyZWFrZXI/OiBEZXBsb3ltZW50Q2lyY3VpdEJyZWFrZXJcbi8qKlxuICogSWYgYSBzZXJ2aWNlIGlzIHVzaW5nIHRoZSByb2xsaW5nIHVwZGF0ZSAoYGBFQ1NgYCkgZGVwbG95bWVudCB0eXBlLCB0aGUgYGBtYXhpbXVtUGVyY2VudGBgIHBhcmFtZXRlciByZXByZXNlbnRzIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgeW91ciBzZXJ2aWNlJ3MgdGFza3MgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgYGBSVU5OSU5HYGAgb3IgYGBQRU5ESU5HYGAgc3RhdGUgZHVyaW5nIGEgZGVwbG95bWVudCwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBgYGRlc2lyZWRDb3VudGBgIChyb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikuIFRoaXMgcGFyYW1ldGVyIGVuYWJsZXMgeW91IHRvIGRlZmluZSB0aGUgZGVwbG95bWVudCBiYXRjaCBzaXplLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBzZXJ2aWNlIGlzIHVzaW5nIHRoZSBgYFJFUExJQ0FgYCBzZXJ2aWNlIHNjaGVkdWxlciBhbmQgaGFzIGEgYGBkZXNpcmVkQ291bnRgYCBvZiBmb3VyIHRhc2tzIGFuZCBhIGBgbWF4aW11bVBlcmNlbnRgYCB2YWx1ZSBvZiAyMDAlLCB0aGUgc2NoZWR1bGVyIG1heSBzdGFydCBmb3VyIG5ldyB0YXNrcyBiZWZvcmUgc3RvcHBpbmcgdGhlIGZvdXIgb2xkZXIgdGFza3MgKHByb3ZpZGVkIHRoYXQgdGhlIGNsdXN0ZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIGRvIHRoaXMgYXJlIGF2YWlsYWJsZSkuIFRoZSBkZWZhdWx0IGBgbWF4aW11bVBlcmNlbnRgYCB2YWx1ZSBmb3IgYSBzZXJ2aWNlIHVzaW5nIHRoZSBgYFJFUExJQ0FgYCBzZXJ2aWNlIHNjaGVkdWxlciBpcyAyMDAlLlxuICogIFRoZSBBbWF6b24gRUNTIHNjaGVkdWxlciB1c2VzIHRoaXMgcGFyYW1ldGVyIHRvIHJlcGxhY2UgdW5oZWFsdGh5IHRhc2tzIGJ5IHN0YXJ0aW5nIHJlcGxhY2VtZW50IHRhc2tzIGZpcnN0IGFuZCB0aGVuIHN0b3BwaW5nIHRoZSB1bmhlYWx0aHkgdGFza3MsIGFzIGxvbmcgYXMgY2x1c3RlciByZXNvdXJjZXMgZm9yIHN0YXJ0aW5nIHJlcGxhY2VtZW50IHRhc2tzIGFyZSBhdmFpbGFibGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgc2NoZWR1bGVyIHJlcGxhY2VzIHVuaGVhbHRoeSB0YXNrcywgc2VlIFtBbWF6b24gRUNTIHNlcnZpY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Nfc2VydmljZXMuaHRtbCkuXG4gKiAgSWYgYSBzZXJ2aWNlIGlzIHVzaW5nIGVpdGhlciB0aGUgYmx1ZS9ncmVlbiAoYGBDT0RFX0RFUExPWWBgKSBvciBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCB0eXBlcywgYW5kIHRhc2tzIGluIHRoZSBzZXJ2aWNlIHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGUgKm1heGltdW0gcGVyY2VudCogdmFsdWUgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgKm1heGltdW0gcGVyY2VudCogdmFsdWUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhlIHRhc2tzIGluIHRoZSBzZXJ2aWNlIHRoYXQgcmVtYWluIGluIHRoZSBgYFJVTk5JTkdgYCBzdGF0ZSB3aGlsZSB0aGUgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgaW4gdGhlIGBgRFJBSU5JTkdgYCBzdGF0ZS5cbiAqICAgWW91IGNhbid0IHNwZWNpZnkgYSBjdXN0b20gYGBtYXhpbXVtUGVyY2VudGBgIHZhbHVlIGZvciBhIHNlcnZpY2UgdGhhdCB1c2VzIGVpdGhlciB0aGUgYmx1ZS9ncmVlbiAoYGBDT0RFX0RFUExPWWBgKSBvciBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCB0eXBlcyBhbmQgaGFzIHRhc2tzIHRoYXQgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUuXG4gKiAgIElmIHRoZSBzZXJ2aWNlIHVzZXMgZWl0aGVyIHRoZSBibHVlL2dyZWVuIChgYENPREVfREVQTE9ZYGApIG9yIGBgRVhURVJOQUxgYCBkZXBsb3ltZW50IHR5cGVzLCBhbmQgdGhlIHRhc2tzIGluIHRoZSBzZXJ2aWNlIHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIG1heGltdW0gcGVyY2VudCB2YWx1ZSBpcyBub3QgdXNlZC4gVGhlIHZhbHVlIGlzIHN0aWxsIHJldHVybmVkIHdoZW4gZGVzY3JpYmluZyB5b3VyIHNlcnZpY2UuXG4gKi9cbk1heGltdW1QZXJjZW50PzogbnVtYmVyXG4vKipcbiAqIElmIGEgc2VydmljZSBpcyB1c2luZyB0aGUgcm9sbGluZyB1cGRhdGUgKGBgRUNTYGApIGRlcGxveW1lbnQgdHlwZSwgdGhlIGBgbWluaW11bUhlYWx0aHlQZXJjZW50YGAgcmVwcmVzZW50cyBhIGxvd2VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgeW91ciBzZXJ2aWNlJ3MgdGFza3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgYGBSVU5OSU5HYGAgc3RhdGUgZHVyaW5nIGEgZGVwbG95bWVudCwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBgYGRlc2lyZWRDb3VudGBgIChyb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIpLiBUaGlzIHBhcmFtZXRlciBlbmFibGVzIHlvdSB0byBkZXBsb3kgd2l0aG91dCB1c2luZyBhZGRpdGlvbmFsIGNsdXN0ZXIgY2FwYWNpdHkuIEZvciBleGFtcGxlLCBpZiB5b3VyIHNlcnZpY2UgaGFzIGEgYGBkZXNpcmVkQ291bnRgYCBvZiBmb3VyIHRhc2tzIGFuZCBhIGBgbWluaW11bUhlYWx0aHlQZXJjZW50YGAgb2YgNTAlLCB0aGUgc2VydmljZSBzY2hlZHVsZXIgbWF5IHN0b3AgdHdvIGV4aXN0aW5nIHRhc2tzIHRvIGZyZWUgdXAgY2x1c3RlciBjYXBhY2l0eSBiZWZvcmUgc3RhcnRpbmcgdHdvIG5ldyB0YXNrcy4gXG4gKiAgIElmIGFueSB0YXNrcyBhcmUgdW5oZWFsdGh5IGFuZCBpZiBgYG1heGltdW1QZXJjZW50YGAgZG9lc24ndCBhbGxvdyB0aGUgQW1hem9uIEVDUyBzY2hlZHVsZXIgdG8gc3RhcnQgcmVwbGFjZW1lbnQgdGFza3MsIHRoZSBzY2hlZHVsZXIgc3RvcHMgdGhlIHVuaGVhbHRoeSB0YXNrcyBvbmUtYnktb25lIOKAlCB1c2luZyB0aGUgYGBtaW5pbXVtSGVhbHRoeVBlcmNlbnRgYCBhcyBhIGNvbnN0cmFpbnQg4oCUIHRvIGNsZWFyIHVwIGNhcGFjaXR5IHRvIGxhdW5jaCByZXBsYWNlbWVudCB0YXNrcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBzY2hlZHVsZXIgcmVwbGFjZXMgdW5oZWFsdGh5IHRhc2tzLCBzZWUgW0FtYXpvbiBFQ1Mgc2VydmljZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjc19zZXJ2aWNlcy5odG1sKS4gXG4gKiAgRm9yIHNlcnZpY2VzIHRoYXQgKmRvIG5vdCogdXNlIGEgbG9hZCBiYWxhbmNlciwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgbm90ZWQ6XG4gKiAgICsgIEEgc2VydmljZSBpcyBjb25zaWRlcmVkIGhlYWx0aHkgaWYgYWxsIGVzc2VudGlhbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgcGFzcyB0aGVpciBoZWFsdGggY2hlY2tzLlxuICogICArICBJZiBhIHRhc2sgaGFzIG5vIGVzc2VudGlhbCBjb250YWluZXJzIHdpdGggYSBoZWFsdGggY2hlY2sgZGVmaW5lZCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHdpbGwgd2FpdCBmb3IgNDAgc2Vjb25kcyBhZnRlciBhIHRhc2sgcmVhY2hlcyBhIGBgUlVOTklOR2BgIHN0YXRlIGJlZm9yZSB0aGUgdGFzayBpcyBjb3VudGVkIHRvd2FyZHMgdGhlIG1pbmltdW0gaGVhbHRoeSBwZXJjZW50IHRvdGFsLlxuICogICArICBJZiBhIHRhc2sgaGFzIG9uZSBvciBtb3JlIGVzc2VudGlhbCBjb250YWluZXJzIHdpdGggYSBoZWFsdGggY2hlY2sgZGVmaW5lZCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHdpbGwgd2FpdCBmb3IgdGhlIHRhc2sgdG8gcmVhY2ggYSBoZWFsdGh5IHN0YXR1cyBiZWZvcmUgY291bnRpbmcgaXQgdG93YXJkcyB0aGUgbWluaW11bSBoZWFsdGh5IHBlcmNlbnQgdG90YWwuIEEgdGFzayBpcyBjb25zaWRlcmVkIGhlYWx0aHkgd2hlbiBhbGwgZXNzZW50aWFsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSB0YXNrIGhhdmUgcGFzc2VkIHRoZWlyIGhlYWx0aCBjaGVja3MuIFRoZSBhbW91bnQgb2YgdGltZSB0aGUgc2VydmljZSBzY2hlZHVsZXIgY2FuIHdhaXQgZm9yIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRhaW5lciBoZWFsdGggY2hlY2sgc2V0dGluZ3MuIFxuICogICBcbiAqICBGb3Igc2VydmljZXMgdGhhdCAqZG8qIHVzZSBhIGxvYWQgYmFsYW5jZXIsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIG5vdGVkOlxuICogICArICBJZiBhIHRhc2sgaGFzIG5vIGVzc2VudGlhbCBjb250YWluZXJzIHdpdGggYSBoZWFsdGggY2hlY2sgZGVmaW5lZCwgdGhlIHNlcnZpY2Ugc2NoZWR1bGVyIHdpbGwgd2FpdCBmb3IgdGhlIGxvYWQgYmFsYW5jZXIgdGFyZ2V0IGdyb3VwIGhlYWx0aCBjaGVjayB0byByZXR1cm4gYSBoZWFsdGh5IHN0YXR1cyBiZWZvcmUgY291bnRpbmcgdGhlIHRhc2sgdG93YXJkcyB0aGUgbWluaW11bSBoZWFsdGh5IHBlcmNlbnQgdG90YWwuXG4gKiAgICsgIElmIGEgdGFzayBoYXMgYW4gZXNzZW50aWFsIGNvbnRhaW5lciB3aXRoIGEgaGVhbHRoIGNoZWNrIGRlZmluZWQsIHRoZSBzZXJ2aWNlIHNjaGVkdWxlciB3aWxsIHdhaXQgZm9yIGJvdGggdGhlIHRhc2sgdG8gcmVhY2ggYSBoZWFsdGh5IHN0YXR1cyBhbmQgdGhlIGxvYWQgYmFsYW5jZXIgdGFyZ2V0IGdyb3VwIGhlYWx0aCBjaGVjayB0byByZXR1cm4gYSBoZWFsdGh5IHN0YXR1cyBiZWZvcmUgY291bnRpbmcgdGhlIHRhc2sgdG93YXJkcyB0aGUgbWluaW11bSBoZWFsdGh5IHBlcmNlbnQgdG90YWwuXG4gKiAgIFxuICogIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcGxpY2Egc2VydmljZSBmb3IgYGBtaW5pbXVtSGVhbHRoeVBlcmNlbnRgYCBpcyAxMDAlLiBUaGUgZGVmYXVsdCBgYG1pbmltdW1IZWFsdGh5UGVyY2VudGBgIHZhbHVlIGZvciBhIHNlcnZpY2UgdXNpbmcgdGhlIGBgREFFTU9OYGAgc2VydmljZSBzY2hlZHVsZSBpcyAwJSBmb3IgdGhlIENMSSwgdGhlIEFXUyBTREtzLCBhbmQgdGhlIEFQSXMgYW5kIDUwJSBmb3IgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUuXG4gKiAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGhlYWx0aHkgdGFza3MgZHVyaW5nIGEgZGVwbG95bWVudCBpcyB0aGUgYGBkZXNpcmVkQ291bnRgYCBtdWx0aXBsaWVkIGJ5IHRoZSBgYG1pbmltdW1IZWFsdGh5UGVyY2VudGBgLzEwMCwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxuICogIElmIGEgc2VydmljZSBpcyB1c2luZyBlaXRoZXIgdGhlIGJsdWUvZ3JlZW4gKGBgQ09ERV9ERVBMT1lgYCkgb3IgYGBFWFRFUk5BTGBgIGRlcGxveW1lbnQgdHlwZXMgYW5kIGlzIHJ1bm5pbmcgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhlICptaW5pbXVtIGhlYWx0aHkgcGVyY2VudCogdmFsdWUgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgKm1pbmltdW0gaGVhbHRoeSBwZXJjZW50KiB2YWx1ZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbG93ZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UgdGhhdCByZW1haW4gaW4gdGhlIGBgUlVOTklOR2BgIHN0YXRlIHdoaWxlIHRoZSBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBpbiB0aGUgYGBEUkFJTklOR2BgIHN0YXRlLlxuICogICBZb3UgY2FuJ3Qgc3BlY2lmeSBhIGN1c3RvbSBgYG1pbmltdW1IZWFsdGh5UGVyY2VudGBgIHZhbHVlIGZvciBhIHNlcnZpY2UgdGhhdCB1c2VzIGVpdGhlciB0aGUgYmx1ZS9ncmVlbiAoYGBDT0RFX0RFUExPWWBgKSBvciBgYEVYVEVSTkFMYGAgZGVwbG95bWVudCB0eXBlcyBhbmQgaGFzIHRhc2tzIHRoYXQgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUuXG4gKiAgIElmIGEgc2VydmljZSBpcyB1c2luZyBlaXRoZXIgdGhlIGJsdWUvZ3JlZW4gKGBgQ09ERV9ERVBMT1lgYCkgb3IgYGBFWFRFUk5BTGBgIGRlcGxveW1lbnQgdHlwZXMgYW5kIGlzIHJ1bm5pbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBtaW5pbXVtIGhlYWx0aHkgcGVyY2VudCB2YWx1ZSBpcyBub3QgdXNlZCwgYWx0aG91Z2ggaXQgaXMgcmV0dXJuZWQgd2hlbiBkZXNjcmliaW5nIHlvdXIgc2VydmljZS5cbiAqL1xuTWluaW11bUhlYWx0aHlQZXJjZW50PzogbnVtYmVyXG5MaW5lYXJDb25maWd1cmF0aW9uPzogTGluZWFyQ29uZmlndXJhdGlvblxufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBjYW5hcnkgZGVwbG95bWVudCBzdHJhdGVneS4gT25seSB2YWxpZCB3aGVuIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5IGlzIGBgQ0FOQVJZYGAuIFRoaXMgY29uZmlndXJhdGlvbiBlbmFibGVzIHNoaWZ0aW5nIGEgZml4ZWQgcGVyY2VudGFnZSBvZiB0cmFmZmljIGZvciB0ZXN0aW5nLCBmb2xsb3dlZCBieSBzaGlmdGluZyB0aGUgcmVtYWluaW5nIHRyYWZmaWMgYWZ0ZXIgYSBiYWtlIHBlcmlvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5hcnlDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHBlcmNlbnRhZ2Ugb2YgcHJvZHVjdGlvbiB0cmFmZmljIHRvIHNoaWZ0IHRvIHRoZSBuZXcgc2VydmljZSByZXZpc2lvbiBkdXJpbmcgdGhlIGNhbmFyeSBwaGFzZS4gVmFsaWQgdmFsdWVzIGFyZSBtdWx0aXBsZXMgb2YgMC4xIGZyb20gMC4xIHRvIDEwMC4wLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LjAuXG4gKi9cbkNhbmFyeVBlcmNlbnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbnV0ZXMgdG8gd2FpdCBkdXJpbmcgdGhlIGNhbmFyeSBwaGFzZSBiZWZvcmUgc2hpZnRpbmcgdGhlIHJlbWFpbmluZyBwcm9kdWN0aW9uIHRyYWZmaWMgdG8gdGhlIG5ldyBzZXJ2aWNlIHJldmlzaW9uLiBWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMTQ0MCBtaW51dGVzICgyNCBob3VycykuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwLlxuICovXG5DYW5hcnlCYWtlVGltZUluTWludXRlcz86IG51bWJlclxufVxuLyoqXG4gKiBBIGRlcGxveW1lbnQgbGlmZWN5Y2xlIGhvb2sgcnVucyBjdXN0b20gbG9naWMgYXQgc3BlY2lmaWMgc3RhZ2VzIG9mIHRoZSBkZXBsb3ltZW50IHByb2Nlc3MuIEN1cnJlbnRseSwgeW91IGNhbiB1c2UgTGFtYmRhIGZ1bmN0aW9ucyBhcyBob29rIHRhcmdldHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTGlmZWN5Y2xlIGhvb2tzIGZvciBBbWF6b24gRUNTIHNlcnZpY2UgZGVwbG95bWVudHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtbGlmZWN5Y2xlLWhvb2tzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50TGlmZWN5Y2xlSG9vayB7XG4vKipcbiAqIFRoZSBsaWZlY3ljbGUgc3RhZ2VzIGF0IHdoaWNoIHRvIHJ1biB0aGUgaG9vay4gQ2hvb3NlIGZyb20gdGhlc2UgdmFsaWQgdmFsdWVzOlxuICogICArICBSRUNPTkNJTEVfU0VSVklDRVxuICogIFRoZSByZWNvbmNpbGlhdGlvbiBzdGFnZSB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIHlvdSBzdGFydCBhIG5ldyBzZXJ2aWNlIGRlcGxveW1lbnQgd2l0aCBtb3JlIHRoYW4gMSBzZXJ2aWNlIHJldmlzaW9uIGluIGFuIEFDVElWRSBzdGF0ZS5cbiAqICBZb3UgY2FuIHVzZSBhIGxpZmVjeWNsZSBob29rIGZvciB0aGlzIHN0YWdlLlxuICogICArICBQUkVfU0NBTEVfVVBcbiAqICBUaGUgZ3JlZW4gc2VydmljZSByZXZpc2lvbiBoYXMgbm90IHN0YXJ0ZWQuIFRoZSBibHVlIHNlcnZpY2UgcmV2aXNpb24gaXMgaGFuZGxpbmcgMTAwJSBvZiB0aGUgcHJvZHVjdGlvbiB0cmFmZmljLiBUaGVyZSBpcyBubyB0ZXN0IHRyYWZmaWMuXG4gKiAgWW91IGNhbiB1c2UgYSBsaWZlY3ljbGUgaG9vayBmb3IgdGhpcyBzdGFnZS5cbiAqICAgKyAgUE9TVF9TQ0FMRV9VUFxuICogIFRoZSBncmVlbiBzZXJ2aWNlIHJldmlzaW9uIGhhcyBzdGFydGVkLiBUaGUgYmx1ZSBzZXJ2aWNlIHJldmlzaW9uIGlzIGhhbmRsaW5nIDEwMCUgb2YgdGhlIHByb2R1Y3Rpb24gdHJhZmZpYy4gVGhlcmUgaXMgbm8gdGVzdCB0cmFmZmljLlxuICogIFlvdSBjYW4gdXNlIGEgbGlmZWN5Y2xlIGhvb2sgZm9yIHRoaXMgc3RhZ2UuXG4gKiAgICsgIFRFU1RfVFJBRkZJQ19TSElGVFxuICogIFRoZSBibHVlIGFuZCBncmVlbiBzZXJ2aWNlIHJldmlzaW9ucyBhcmUgcnVubmluZy4gVGhlIGJsdWUgc2VydmljZSByZXZpc2lvbiBoYW5kbGVzIDEwMCUgb2YgdGhlIHByb2R1Y3Rpb24gdHJhZmZpYy4gVGhlIGdyZWVuIHNlcnZpY2UgcmV2aXNpb24gaXMgbWlncmF0aW5nIGZyb20gMCUgdG8gMTAwJSBvZiB0ZXN0IHRyYWZmaWMuXG4gKiAgWW91IGNhbiB1c2UgYSBsaWZlY3ljbGUgaG9vayBmb3IgdGhpcyBzdGFnZS5cbiAqICAgKyAgUE9TVF9URVNUX1RSQUZGSUNfU0hJRlRcbiAqICBUaGUgdGVzdCB0cmFmZmljIHNoaWZ0IGlzIGNvbXBsZXRlLiBUaGUgZ3JlZW4gc2VydmljZSByZXZpc2lvbiBoYW5kbGVzIDEwMCUgb2YgdGhlIHRlc3QgdHJhZmZpYy5cbiAqICBZb3UgY2FuIHVzZSBhIGxpZmVjeWNsZSBob29rIGZvciB0aGlzIHN0YWdlLlxuICogICArICBQUk9EVUNUSU9OX1RSQUZGSUNfU0hJRlRcbiAqICBQcm9kdWN0aW9uIHRyYWZmaWMgaXMgc2hpZnRpbmcgdG8gdGhlIGdyZWVuIHNlcnZpY2UgcmV2aXNpb24uIFRoZSBncmVlbiBzZXJ2aWNlIHJldmlzaW9uIGlzIG1pZ3JhdGluZyBmcm9tIDAlIHRvIDEwMCUgb2YgcHJvZHVjdGlvbiB0cmFmZmljLlxuICogIFlvdSBjYW4gdXNlIGEgbGlmZWN5Y2xlIGhvb2sgZm9yIHRoaXMgc3RhZ2UuXG4gKiAgICsgIFBPU1RfUFJPRFVDVElPTl9UUkFGRklDX1NISUZUXG4gKiAgVGhlIHByb2R1Y3Rpb24gdHJhZmZpYyBzaGlmdCBpcyBjb21wbGV0ZS5cbiAqICBZb3UgY2FuIHVzZSBhIGxpZmVjeWNsZSBob29rIGZvciB0aGlzIHN0YWdlLlxuICogICBcbiAqICBZb3UgbXVzdCBwcm92aWRlIHRoaXMgcGFyYW1ldGVyIHdoZW4gY29uZmlndXJpbmcgYSBkZXBsb3ltZW50IGxpZmVjeWNsZSBob29rLlxuICogXG4gKiBAbWluSXRlbXMgMVxuICovXG5MaWZlY3ljbGVTdGFnZXM6IChcIlJFQ09OQ0lMRV9TRVJWSUNFXCIgfCBcIlBSRV9TQ0FMRV9VUFwiIHwgXCJQT1NUX1NDQUxFX1VQXCIgfCBcIlRFU1RfVFJBRkZJQ19TSElGVFwiIHwgXCJQT1NUX1RFU1RfVFJBRkZJQ19TSElGVFwiIHwgXCJQUk9EVUNUSU9OX1RSQUZGSUNfU0hJRlRcIiB8IFwiUE9TVF9QUk9EVUNUSU9OX1RSQUZGSUNfU0hJRlRcIilbXVxuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGhvb2sgdGFyZ2V0LiBDdXJyZW50bHksIG9ubHkgTGFtYmRhIGZ1bmN0aW9uIEFSTnMgYXJlIHN1cHBvcnRlZC5cbiAqICBZb3UgbXVzdCBwcm92aWRlIHRoaXMgcGFyYW1ldGVyIHdoZW4gY29uZmlndXJpbmcgYSBkZXBsb3ltZW50IGxpZmVjeWNsZSBob29rLlxuICovXG5Ib29rVGFyZ2V0QXJuOiBzdHJpbmdcbi8qKlxuICogVXNlIHRoaXMgZmllbGQgdG8gc3BlY2lmeSBjdXN0b20gcGFyYW1ldGVycyB0aGF0IEVDUyBwYXNzZXMgdG8geW91ciBob29rIHRhcmdldCBpbnZvY2F0aW9ucyAoc3VjaCBhcyBhIExhbWJkYSBmdW5jdGlvbikuXG4gKiAgVGhpcyBmaWVsZCBtdXN0IGJlIGEgSlNPTiBvYmplY3QgYXMgYSBzdHJpbmcuXG4gKi9cbkhvb2tEZXRhaWxzPzogKHN0cmluZyB8IHtcbltrOiBzdHJpbmddOiB1bmtub3duXG59KVxuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTSByb2xlIHRoYXQgZ3JhbnRzIEFtYXpvbiBFQ1MgcGVybWlzc2lvbiB0byBjYWxsIExhbWJkYSBmdW5jdGlvbnMgb24geW91ciBiZWhhbGYuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUGVybWlzc2lvbnMgcmVxdWlyZWQgZm9yIExhbWJkYSBmdW5jdGlvbnMgaW4gQW1hem9uIEVDUyBibHVlL2dyZWVuIGRlcGxveW1lbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9ibHVlLWdyZWVuLXBlcm1pc3Npb25zLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUm9sZUFybjogc3RyaW5nXG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBDbG91ZFdhdGNoIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50QWxhcm1zIHtcbi8qKlxuICogT25lIG9yIG1vcmUgQ2xvdWRXYXRjaCBhbGFybSBuYW1lcy4gVXNlIGEgXCIsXCIgdG8gc2VwYXJhdGUgdGhlIGFsYXJtcy5cbiAqL1xuQWxhcm1OYW1lczogc3RyaW5nW11cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgQ2xvdWRXYXRjaCBhbGFybSBvcHRpb24gaW4gdGhlIHNlcnZpY2UgZGVwbG95bWVudCBwcm9jZXNzLlxuICovXG5FbmFibGU6IGJvb2xlYW5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNvbmZpZ3VyZSBBbWF6b24gRUNTIHRvIHJvbGwgYmFjayB0aGUgc2VydmljZSBpZiBhIHNlcnZpY2UgZGVwbG95bWVudCBmYWlscy4gSWYgcm9sbGJhY2sgaXMgdXNlZCwgd2hlbiBhIHNlcnZpY2UgZGVwbG95bWVudCBmYWlscywgdGhlIHNlcnZpY2UgaXMgcm9sbGVkIGJhY2sgdG8gdGhlIGxhc3QgZGVwbG95bWVudCB0aGF0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gKi9cblJvbGxiYWNrOiBib29sZWFuXG59XG4vKipcbiAqIFRoZSBkZXBsb3ltZW50IGNpcmN1aXQgYnJlYWtlciBjYW4gb25seSBiZSB1c2VkIGZvciBzZXJ2aWNlcyB1c2luZyB0aGUgcm9sbGluZyB1cGRhdGUgKGBgRUNTYGApIGRlcGxveW1lbnQgdHlwZS5cbiAqICAgVGhlICpkZXBsb3ltZW50IGNpcmN1aXQgYnJlYWtlciogZGV0ZXJtaW5lcyB3aGV0aGVyIGEgc2VydmljZSBkZXBsb3ltZW50IHdpbGwgZmFpbCBpZiB0aGUgc2VydmljZSBjYW4ndCByZWFjaCBhIHN0ZWFkeSBzdGF0ZS4gSWYgeW91IHVzZSB0aGUgZGVwbG95bWVudCBjaXJjdWl0IGJyZWFrZXIsIGEgc2VydmljZSBkZXBsb3ltZW50IHdpbGwgdHJhbnNpdGlvbiB0byBhIGZhaWxlZCBzdGF0ZSBhbmQgc3RvcCBsYXVuY2hpbmcgbmV3IHRhc2tzLiBJZiB5b3UgdXNlIHRoZSByb2xsYmFjayBvcHRpb24sIHdoZW4gYSBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbHMsIHRoZSBzZXJ2aWNlIGlzIHJvbGxlZCBiYWNrIHRvIHRoZSBsYXN0IGRlcGxveW1lbnQgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSb2xsaW5nIHVwZGF0ZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZGVwbG95bWVudC10eXBlLWVjcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50Q2lyY3VpdEJyZWFrZXIge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBkZXBsb3ltZW50IGNpcmN1aXQgYnJlYWtlciBsb2dpYyBmb3IgdGhlIHNlcnZpY2UuXG4gKi9cbkVuYWJsZTogYm9vbGVhblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY29uZmlndXJlIEFtYXpvbiBFQ1MgdG8gcm9sbCBiYWNrIHRoZSBzZXJ2aWNlIGlmIGEgc2VydmljZSBkZXBsb3ltZW50IGZhaWxzLiBJZiByb2xsYmFjayBpcyBvbiwgd2hlbiBhIHNlcnZpY2UgZGVwbG95bWVudCBmYWlscywgdGhlIHNlcnZpY2UgaXMgcm9sbGVkIGJhY2sgdG8gdGhlIGxhc3QgZGVwbG95bWVudCB0aGF0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gKi9cblJvbGxiYWNrOiBib29sZWFuXG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxpbmVhciBkZXBsb3ltZW50IHN0cmF0ZWd5LiBPbmx5IHZhbGlkIHdoZW4gdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kgaXMgYGBMSU5FQVJgYC4gVGhpcyBjb25maWd1cmF0aW9uIGVuYWJsZXMgcHJvZ3Jlc3NpdmUgdHJhZmZpYyBzaGlmdGluZyBpbiBlcXVhbCBwZXJjZW50YWdlIGluY3JlbWVudHMgd2l0aCBjb25maWd1cmFibGUgYmFrZSB0aW1lcyBiZXR3ZWVuIGVhY2ggc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5lYXJDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbnV0ZXMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggdHJhZmZpYyBzaGlmdGluZyBzdGVwIGR1cmluZyBhIGxpbmVhciBkZXBsb3ltZW50LiBWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMTQ0MCBtaW51dGVzICgyNCBob3VycykuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDYuIFRoaXMgYmFrZSB0aW1lIGlzIG5vdCBhcHBsaWVkIGFmdGVyIHJlYWNoaW5nIDEwMCBwZXJjZW50IHRyYWZmaWMuXG4gKi9cblN0ZXBCYWtlVGltZUluTWludXRlcz86IG51bWJlclxuLyoqXG4gKiBUaGUgcGVyY2VudGFnZSBvZiBwcm9kdWN0aW9uIHRyYWZmaWMgdG8gc2hpZnQgaW4gZWFjaCBzdGVwIGR1cmluZyBhIGxpbmVhciBkZXBsb3ltZW50LiBWYWxpZCB2YWx1ZXMgYXJlIG11bHRpcGxlcyBvZiAwLjEgZnJvbSAzLjAgdG8gMTAwLjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwLjAuXG4gKi9cblN0ZXBQZXJjZW50PzogbnVtYmVyXG59XG4iXX0=