Skip to content

Instantly share code, notes, and snippets.

@asoorm
Created December 13, 2017 11:34
Show Gist options
  • Save asoorm/5ed9996cda838a7a05ee557b4ca077af to your computer and use it in GitHub Desktop.
Save asoorm/5ed9996cda838a7a05ee557b4ca077af to your computer and use it in GitHub Desktop.
package main
//$ go test --bench . -benchmem
//BenchmarkBase64DecodeString-4 1000000 1781 ns/op 992 B/op 2 allocs/op
//--- BENCH: BenchmarkBase64DecodeString-4
// b64_test.go:19: decode len 516
// b64_test.go:19: decode len 516
// b64_test.go:19: decode len 516
// b64_test.go:19: decode len 516
//BenchmarkBase64DecodeString2-4 5000 250250 ns/op 147456 B/op 2 allocs/op
//--- BENCH: BenchmarkBase64DecodeString2-4
// b64_test.go:27: decode len 81376
// b64_test.go:27: decode len 81376
// b64_test.go:27: decode len 81376
//PASS
//ok github.com/TykTechnologies/tyk/perftest 3.088s
import (
"encoding/base64"
"testing"
)
const str = `ew0KICAgICJ0aXRsZSI6ICJQZXJzb24iLA0KICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJmaXJzdE5hbWUiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciDQogICAgICAgIH0sDQogICAgICAgICJsYXN0TmFtZSI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyINCiAgICAgICAgfSwNCiAgICAgICAgImFnZSI6IHsNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBZ2UgaW4geWVhcnMiLA0KICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsDQogICAgICAgICAgICAibWluaW11bSI6IDANCiAgICAgICAgfQ0KICAgIH0sDQogICAgInJlcXVpcmVkIjogWyJmaXJzdE5hbWUiLCAibGFzdE5hbWUiXQ0KfQ==`
const str2 = `TG9yZW0gSXBzdW0NCiJOZXF1ZSBwb3JybyBxdWlzcXVhbSBlc3QgcXVpIGRvbG9yZW0gaXBzdW0gcXVpYSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIsIGFkaXBpc2NpIHZlbGl0Li4uIg0KIlRoZXJlIGlzIG5vIG9uZSB3aG8gbG92ZXMgcGFpbiBpdHNlbGYsIHdobyBzZWVrcyBhZnRlciBpdCBhbmQgd2FudHMgdG8gaGF2ZSBpdCwgc2ltcGx5IGJlY2F1c2UgaXQgaXMgcGFpbi4uLiINCg0KTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMgbWFsZXN1YWRhIG1hbGVzdWFkYSBvcm5hcmUuIFNlZCBpZCBtYXVyaXMgbWFzc2EuIFZpdmFtdXMgZ3JhdmlkYSBuZXF1ZSBpbiBmZWxpcyBwcmV0aXVtLCBjb25kaW1lbnR1bSBiaWJlbmR1bSBpcHN1bSBzY2VsZXJpc3F1ZS4gUHJvaW4gdnVscHV0YXRlIGVsZWlmZW5kIG1vbGxpcy4gSW50ZWdlciBsb2JvcnRpcyBzY2VsZXJpc3F1ZSB1bHRyaWNlcy4gQWVuZWFuIHNlZCBudW5jIGF0IGFudGUgZmVybWVudHVtIGVsZWlmZW5kIG5vbiBlZ2V0IGxlY3R1cy4gRG9uZWMgbWV0dXMgcXVhbSwgdmVuZW5hdGlzIHV0IHZlc3RpYnVsdW0gaW4sIGNvbnNlcXVhdCBydXRydW0gZXguIEN1cmFiaXR1ciBpZCBlbGVpZmVuZCB0b3J0b3IsIGFjIHJob25jdXMgaXBzdW0uIEFlbmVhbiBzZW0gYXVndWUsIGV1aXNtb2QgaWQgdG9ydG9yIHNlZCwgZGFwaWJ1cyBmZXVnaWF0IGVsaXQuDQoNCk51bGxhbSBpZCB0ZWxsdXMgZ3JhdmlkYSBsb3JlbSByaG9uY3VzIG1hdHRpcyBhdCBhbGlxdWV0IHRvcnRvci4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMgcnV0cnVtIHRvcnRvciBlbGl0LCBpbiBwbGFjZXJhdCBvZGlvIHNhZ2l0dGlzIHNpdCBhbWV0LiBWZXN0aWJ1bHVtIHVsdHJpY2llcyBjdXJzdXMgdnVscHV0YXRlLiBOdWxsYSBmYWNpbGlzaS4gUGVsbGVudGVzcXVlIHZpdmVycmEsIG1hc3NhIGZhY2lsaXNpcyBibGFuZGl0IHZpdmVycmEsIG1hdXJpcyB2ZWxpdCBkaWN0dW0gZXgsIGFjY3Vtc2FuIGNvbnZhbGxpcyBuaWJoIGxlbyBpbiBsaWJlcm8uIFNlZCBlZ2V0IHBlbGxlbnRlc3F1ZSBxdWFtLiBNYWVjZW5hcyBwZWxsZW50ZXNxdWUgYW50ZSBhdCB2ZWxpdCB0ZW1wdXMgY29uZGltZW50dW0uIERvbmVjIHV0IGFyY3Ugc2VkIGxpYmVybyBzdXNjaXBpdCBpYWN1bGlzIGFjIGFjIGVsaXQuIE5hbSBtb2xlc3RpZSBleCBtZXR1cywgdml0YWUgdGVtcG9yIHB1cnVzIGVmZmljaXR1ciBhYy4gSW50ZWdlciBldSB0ZWxsdXMgc2VtLiBGdXNjZSBlZ2V0IGFudGUgZWdldCBlc3QgZXVpc21vZCBpbXBlcmRpZXQuIE51bGxhIGltcGVyZGlldCB1dCBkb2xvciBlZ2V0IHZlc3RpYnVsdW0uIFBoYXNlbGx1cyB2ZWwgZWxlaWZlbmQgbWkuDQoNClNlZCBuZWMgbmlzbCBlZ2V0IHNlbSBkaWN0dW0gc29sbGljaXR1ZGluLiBWZXN0aWJ1bHVtIGVsZW1lbnR1bSBmYWNpbGlzaXMgdGluY2lkdW50LiBEb25lYyBmYXVjaWJ1cyBlcm9zIGluIHVsbGFtY29ycGVyIHZvbHV0cGF0LiBOdWxsYW0gc2VkIGR1aSBtYXNzYS4gTWFlY2VuYXMgYWxpcXVhbSBlZ2VzdGFzIG5pc2wuIE1hZWNlbmFzIG9ybmFyZSBzYXBpZW4gZmFjaWxpc2lzLCB1bHRyaWNlcyBvZGlvIHF1aXMsIGRpZ25pc3NpbSBtaS4gTWF1cmlzIGxvYm9ydGlzIGN1cnN1cyBpcHN1bSBub24gZmluaWJ1cy4gQ3VyYWJpdHVyIGludGVyZHVtIG5vbiBtYXVyaXMgcHJldGl1bSB2ZW5lbmF0aXMuIFBoYXNlbGx1cyB0dXJwaXMgdHVycGlzLCBwdWx2aW5hciBhIGVsZW1lbnR1bSBldCwgY29udmFsbGlzIHZpdGFlIHRvcnRvci4gTnVsbGEgbGFjaW5pYSBzb2RhbGVzIG9yY2kgYWMgdGluY2lkdW50LiBRdWlzcXVlIGEgb2RpbyBlZmZpY2l0dXIsIHZvbHV0cGF0IGV4IGEsIGxhY2luaWEgbnVsbGEuIFNlZCB1cm5hIG9kaW8sIHVsbGFtY29ycGVyIGluIGxhb3JlZXQgdml0YWUsIHJob25jdXMgYXQgZXN0LiBJbiBoYWMgaGFiaXRhc3NlIHBsYXRlYSBkaWN0dW1zdC4NCg0KVmVzdGlidWx1bSB2aXRhZSBsaWd1bGEgbGFjaW5pYSwgZGlnbmlzc2ltIGFyY3Ugc2FnaXR0aXMsIGVsZW1lbnR1bSBhcmN1LiBQcm9pbiBjb252YWxsaXMgdmVoaWN1bGEgbnVuYywgdml0YWUgZmFjaWxpc2lzIHVybmEgdGluY2lkdW50IHZlbC4gUXVpc3F1ZSBvcm5hcmUganVzdG8gdml0YWUgcHVydXMgZGljdHVtIHZhcml1cy4gQ3JhcyBldSB0b3J0b3IgaWQgbGVjdHVzIHBvc3VlcmUgY29uZGltZW50dW0gZWdldCBlZ2V0IGxpZ3VsYS4gTnVsbGEgZGlnbmlzc2ltIGhlbmRyZXJpdCBudW5jLiBNYWVjZW5hcyBvcm5hcmUgYmxhbmRpdCBlcm9zIHZlbCB2ZWhpY3VsYS4gUGVsbGVudGVzcXVlIGRhcGlidXMgbmlzaSBlZ2V0IG1ldHVzIG9ybmFyZSwgYSBzb2xsaWNpdHVkaW4gYXVndWUgY29uc2VxdWF0LiBOdWxsYW0gZGlnbmlzc2ltIHZlbmVuYXRpcyBwb3J0dGl0b3IuIE5hbSBhYyB0aW5jaWR1bnQgbGVvLiBWZXN0aWJ1bHVtIHVsbGFtY29ycGVyIG5vbiBlcmF0IGEgZGljdHVtLiBQcmFlc2VudCBlZ2VzdGFzIGxlbyBldSBuaXNsIGxhb3JlZXQgbWF0dGlzLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0IHVsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTsgU2VkIHRlbXBvciB2ZXN0aWJ1bHVtIGRvbG9yLCB1bHRyaWNlcyBzb2xsaWNpdHVkaW4gZXJhdCB2b2x1dHBhdCB1dC4gTmFtIGF0IHRpbmNpZHVudCBsaWJlcm8sIGV1IHNvZGFsZXMgbGVjdHVzLiBTZWQgYWxpcXVhbSBvZGlvIHZlbCBuaXNpIGZlcm1lbnR1bSBmaW5pYnVzLiBRdWlzcXVlIHN1c2NpcGl0IG1ldHVzIHZpdGFlIGRpYW0gYWxpcXVldCwgYSBwZWxsZW50ZXNxdWUgcXVhbSBwb3N1ZXJlLg0KDQpEdWlzIHZhcml1cyBxdWlzIG1hdXJpcyB2aXRhZSBjb21tb2RvLiBQcm9pbiBjdXJzdXMgbmliaCBpbiBhdWN0b3Igb3JuYXJlLiBWZXN0aWJ1bHVtIGNvbnNlcXVhdCBldWlzbW9kIGF1Z3VlIHZpdGFlIGlhY3VsaXMuIFV0IHBvcnR0aXRvciB2ZWwgb3JjaSBlZ2V0IGNvbmd1ZS4gQWVuZWFuIHZpdmVycmEgcXVpcyBvcmNpIHZlbCBtYXR0aXMuIFBoYXNlbGx1cyB2ZWwgb2RpbyBzaXQgYW1ldCBtZXR1cyBhdWN0b3IgZGlnbmlzc2ltLiBTZWQgcXVpcyB2ZWxpdCBhIGxpZ3VsYSBmZXVnaWF0IHZpdmVycmEuIE1vcmJpIG5vbiB2ZWxpdCB2ZWhpY3VsYSwgZWdlc3RhcyBtYXNzYSB1dCwgdWx0cmljaWVzIHB1cnVzLiBWaXZhbXVzIGF0IG51bmMgcmhvbmN1cywgcGVsbGVudGVzcXVlIG1ldHVzIHV0LCBkYXBpYnVzIG5lcXVlLiBQaGFzZWxsdXMgb3JuYXJlIG1hZ25hIHVybmEsIGVnZXQgbG9ib3J0aXMgZXJhdCBtb2xlc3RpZSBhLiBWaXZhbXVzIGF0IG1ldHVzIGJpYmVuZHVtLCB2YXJpdXMgc2FwaWVuIGVnZXQsIGZhY2lsaXNpcyBxdWFtLiBOYW0gZXQgYmliZW5kdW0gYXJjdS4gUHJhZXNlbnQgZ3JhdmlkYSBvZGlvIG9kaW8sIGFjIGNvbnNlcXVhdCB0dXJwaXMgbHVjdHVzIGEuDQoNCkFsaXF1YW0gZmF1Y2lidXMgbHVjdHVzIHNlbXBlci4gTmFtIHB1bHZpbmFyIG5lYyBlbmltIGlkIGVsZW1lbnR1bS4gU3VzcGVuZGlzc2UgZXVpc21vZCB0aW5jaWR1bnQgaW1wZXJkaWV0LiBJbiBiaWJlbmR1bSwgZWxpdCBpbiBpYWN1bGlzIHNvbGxpY2l0dWRpbiwgb2RpbyBtYWduYSBwaGFyZXRyYSBtYWduYSwgYWMgYWNjdW1zYW4gbGFjdXMgc2VtIGVnZXQgZG9sb3IuIE1hdXJpcyB0aW5jaWR1bnQgZ3JhdmlkYSBsZW8gaWQgdHJpc3RpcXVlLiBDcmFzIGF1Y3RvciBldCB1cm5hIGV1IGxhb3JlZXQuIE51bGxhIGxvcmVtIGp1c3RvLCBhY2N1bXNhbiBuZWMgZW5pbSBhdCwgdWx0cmljZXMgZmluaWJ1cyBlbmltLiBFdGlhbSBpZCBuZXF1ZSBzaXQgYW1ldCBhdWd1ZSBzdXNjaXBpdCBhdWN0b3IuIERvbmVjIGluIG1ldHVzIGZyaW5naWxsYSwgdWx0cmljaWVzIGp1c3RvIGlkLCB1bHRyaWNpZXMgb2Rpby4gQWVuZWFuIGZhdWNpYnVzIGJsYW5kaXQgdG9ydG9yIG5vbiBlZmZpY2l0dXIuIEN1cmFiaXR1ciBudW5jIHF1YW0sIHNvbGxpY2l0dWRpbiB1dCBlbGVtZW50dW0gdGluY2lkdW50LCBncmF2aWRhIHNpdCBhbWV0IGxhY3VzLiBTdXNwZW5kaXNzZSBzYWdpdHRpcyBhY2N1bXNhbiBlbmltIG5lYyBmZXJtZW50dW0uDQoNCkludGVnZXIgc2VkIGV4IG5vbiBwdXJ1cyB2ZWhpY3VsYSBjb25zZWN0ZXR1ciBhYyBldCB0b3J0b3IuIERvbmVjIHNpdCBhbWV0IGVzdCBjb25kaW1lbnR1bSwgdmVuZW5hdGlzIGVzdCBwaGFyZXRyYSwgZmF1Y2lidXMgdGVsbHVzLiBOdWxsYSBmYWNpbGlzaS4gTW9yYmkgbW9sZXN0aWUgZWxlaWZlbmQgbnVuYywgZXQgdWx0cmljZXMgZXN0IHRpbmNpZHVudCB1dC4gUHJvaW4gZWdlc3RhcyBsZWN0dXMgYSBzY2VsZXJpc3F1ZSBzb2RhbGVzLiBEdWlzIHNlZCB0cmlzdGlxdWUgbmVxdWUuIEluIHByZXRpdW0gY29uc2VxdWF0IG51bGxhLiBWZXN0aWJ1bHVtIG9kaW8gZmVsaXMsIHZlbmVuYXRpcyBhIHRyaXN0aXF1ZSB0ZW1wb3IsIGJpYmVuZHVtIGEgbmVxdWUuIEluIGV1IG5pc2kgbmVxdWUuIFByYWVzZW50IHZlbCBlc3QgdXQgbmlzbCBjb252YWxsaXMgdGVtcG9yIHNlZCBpbiBqdXN0by4gTWF1cmlzIGZldWdpYXQsIGFyY3UgdXQgdmVuZW5hdGlzIHRyaXN0aXF1ZSwgbmlzaSBlc3QgZWZmaWNpdHVyIHNhcGllbiwgYXQgZmVybWVudHVtIGRpYW0gZGlhbSBydXRydW0gZGlhbS4gTWF1cmlzIHZpdmVycmEgZG9sb3IgbWFnbmEsIGVnZXQgZmVybWVudHVtIG5pYmggc2VtcGVyIGV0LiBQZWxsZW50ZXNxdWUgc3VzY2lwaXQgaXBzdW0gZXQgZXJvcyBtb2xsaXMgcG9ydHRpdG9yLg0KDQpTdXNwZW5kaXNzZSBjb25zZWN0ZXR1ciBlbGVtZW50dW0gbG9yZW0gaWQgYmxhbmRpdC4gTnVsbGFtIGFjIG1hdHRpcyBtYXVyaXMuIFN1c3BlbmRpc3NlIGVyb3MgbWFzc2EsIHZlbmVuYXRpcyBldCBlZmZpY2l0dXIgbm9uLCBlZmZpY2l0dXIgdml0YWUgbnVsbGEuIFByYWVzZW50IGVsZW1lbnR1bSBuaWJoIGRvbG9yLCBlZ2V0IHZlaGljdWxhIGxvcmVtIGNvbnZhbGxpcyBhbGlxdWV0LiBOdWxsYW0gYWMgbnVuYyBhYyBtYWduYSBwcmV0aXVtIG1heGltdXMuIENyYXMgY29tbW9kbyBuZXF1ZSB1dCBlc3QgY3Vyc3VzIGJpYmVuZHVtLiBRdWlzcXVlIHZlbCBtb2xlc3RpZSBuaWJoLiBQcmFlc2VudCByaG9uY3VzIGF0IGF1Z3VlIG5lYyBmaW5pYnVzLiBOdWxsYW0gdml0YWUgbWFnbmEgZXguIER1aXMgY29udmFsbGlzIGVsZW1lbnR1bSBuZXF1ZSBub24gYWxpcXVhbS4gU3VzcGVuZGlzc2Ugdml0YWUgdm9sdXRwYXQgbWF1cmlzLiBOdW5jIHNlZCBpbXBlcmRpZXQgYW50ZS4gTWF1cmlzIHJ1dHJ1bSBhcmN1IGlkIHVybmEgYWxpcXVhbSBhdWN0b3IuIEludGVnZXIgdWx0cmljZXMgZXN0IG9kaW8uIER1aXMgdnVscHV0YXRlIG5pYmgganVzdG8sIG5lYyBjb25ndWUgZHVpIHBvcnRhIHV0LiBNb3JiaSBjb25zZWN0ZXR1ciB2ZWxpdCBpbiBtYXhpbXVzIGNvbmRpbWVudHVtLg0KDQpPcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLCBuYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBQaGFzZWxsdXMgbWF4aW11cyBhbnRlIGlwc3VtLCBxdWlzIGx1Y3R1cyBsZW8gZmV1Z2lhdCBzaXQgYW1ldC4gU2VkIGxvYm9ydGlzIHNlbSBkaWN0dW0gZmVsaXMgc2VtcGVyIGRpZ25pc3NpbS4gRG9uZWMgZXUgbW9sbGlzIHRlbGx1cywgYWxpcXVldCBzZW1wZXIgcmlzdXMuIFZlc3RpYnVsdW0gcXVpcyBwb3J0YSBzYXBpZW4sIGVnZXQgZmF1Y2lidXMgbWV0dXMuIERvbmVjIGRpY3R1bSBwdXJ1cyBpbXBlcmRpZXQgbWFzc2EgY29tbW9kbyBwb3J0YS4gRnVzY2UgYWxpcXVldCBhbnRlIGNvbnNlcXVhdCwgc29kYWxlcyB1cm5hIGluLCBkaWduaXNzaW0gbG9yZW0uIFZlc3RpYnVsdW0gbGFjaW5pYSBpcHN1bSBldSBkb2xvciBjb25zZXF1YXQsIHF1aXMgYmliZW5kdW0gbmliaCB0ZW1wb3IuIENyYXMgdmVzdGlidWx1bSBtYXVyaXMgaWFjdWxpcywgZWdlc3RhcyBkdWkgc2l0IGFtZXQsIGZyaW5naWxsYSB0ZWxsdXMuIEluIGxhY2luaWEgaWFjdWxpcyBvZGlvLCBzZWQgcHVsdmluYXIgbnVsbGEgbG9ib3J0aXMgdXQuIEZ1c2NlIGF0IGVzdCBub24gcHVydXMgYmxhbmRpdCB2ZXN0aWJ1bHVtLiBTZWQgaWFjdWxpcyBzYXBpZW4gdmVsIHB1bHZpbmFyIHRlbXBvci4gU2VkIHZhcml1cyByaXN1cyBwb3J0YSBzYXBpZW4gbGFvcmVldCBwdWx2aW5hci4NCg0KTWF1cmlzIGFsaXF1YW0gdmVsIG1pIGN1cnN1cyBwcmV0aXVtLiBQaGFzZWxsdXMgbGVvIG51bGxhLCBzb2RhbGVzIHV0IG1hdXJpcyB1dCwgdmVoaWN1bGEgaGVuZHJlcml0IGVyb3MuIEFlbmVhbiBwaGFyZXRyYSBsYWN1cyB2ZXN0aWJ1bHVtIHNlbSBmYXVjaWJ1cyBzZW1wZXIuIE1hZWNlbmFzIGNvbnNlY3RldHVyIG1pIG5vbiBpYWN1bGlzIGxhY2luaWEuIE1hZWNlbmFzIHRlbXB1cyBxdWFtIHV0IGVsZWlmZW5kIG1vbGxpcy4gTmFtIG1vbGVzdGllIGltcGVyZGlldCBudW5jLCBxdWlzIHZlc3RpYnVsdW0gZWxpdCBwdWx2aW5hciBpZC4gQ3VyYWJpdHVyIG1hdHRpcyB1cm5hIGFjIGV4IG1vbGxpcyBoZW5kcmVyaXQuDQoNCkV0aWFtIGVuaW0gZW5pbSwgZmluaWJ1cyB2ZWwgbWF1cmlzIHV0LCBmaW5pYnVzIHByZXRpdW0gZHVpLiBBbGlxdWFtIHZhcml1cyB2ZWwgbGlndWxhIGluIGRpZ25pc3NpbS4gU2VkIHZlbCBjb25zZWN0ZXR1ciBlcm9zLiBQaGFzZWxsdXMgaWQgZW5pbSBlbGl0LiBWZXN0aWJ1bHVtIGNvbmRpbWVudHVtIG1hc3NhIGV1IGRhcGlidXMgdm9sdXRwYXQuIENyYXMgYmliZW5kdW0gbGFjaW5pYSBuaXNsLCB2aXRhZSBzb2xsaWNpdHVkaW4gdmVsaXQgdnVscHV0YXRlIGEuIFByb2luIG1hdHRpcyBsaWJlcm8gc2l0IGFtZXQgcHVydXMgc2FnaXR0aXMgYmxhbmRpdC4gUXVpc3F1ZSBwb3N1ZXJlIHZlaGljdWxhIGZhY2lsaXNpcy4gTWF1cmlzIHF1aXMgbmVxdWUgbWkuIEludGVnZXIgdmVoaWN1bGEgbW9sbGlzIG5pc2wsIGVsZW1lbnR1bSB2aXZlcnJhIG9kaW8gdmVoaWN1bGEgbmVjLiBBbGlxdWFtIGNvbmd1ZSB2YXJpdXMgY29uc2VjdGV0dXIuDQoNClByb2luIGVnZXQgcGVsbGVudGVzcXVlIGxhY3VzLiBBZW5lYW4gbGFjaW5pYSBwdXJ1cyBlZ2V0IGhlbmRyZXJpdCBhdWN0b3IuIFNlZCBlZ2V0IHNjZWxlcmlzcXVlIGxpYmVyby4gRnVzY2Ugc3VzY2lwaXQgcXVpcyBhbnRlIGlkIHBvcnR0aXRvci4gTnVuYyB2ZXN0aWJ1bHVtIGV4IHZlbCBuaXNsIHRlbXBvciBkaWN0dW0uIER1aXMgdGVtcHVzIG1vbGVzdGllIG51bmMsIHZlc3RpYnVsdW0gY29uZ3VlIG1hZ25hLiBTdXNwZW5kaXNzZSB2aXRhZSBsYWN1cyBhdCBkaWFtIHBoYXJldHJhIHNvZGFsZXMuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cy4gVmVzdGlidWx1bSBpZCBzZW0gZXN0LiBEb25lYyBydXRydW0gZG9sb3IgZXJhdCwgc2l0IGFtZXQgdGluY2lkdW50IGRvbG9yIGZlcm1lbnR1bSBzaXQgYW1ldC4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZCBsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBEb25lYyB0ZW1wb3IgZXUgbnVsbGEgbmVjIHNvZGFsZXMuIEluIHNlZCBncmF2aWRhIGR1aS4NCg0KUGhhc2VsbHVzIHNlZCBiaWJlbmR1bSBtYWduYSwgdmVoaWN1bGEgdWxsYW1jb3JwZXIgbnVuYy4gTWFlY2VuYXMgdWx0cmljaWVzIGEgZG9sb3IgbW9sbGlzIHN1c2NpcGl0LiBOdW5jIHNlZCBwdXJ1cyB2YXJpdXMsIGFsaXF1YW0gZmVsaXMgdmVsLCB2ZXN0aWJ1bHVtIGxvcmVtLiBDdXJhYml0dXIgbG9ib3J0aXMgaWFjdWxpcyBkb2xvciwgdmVsIHVsdHJpY2llcyBtYXNzYSBpbnRlcmR1bSBldS4gSW4gcnV0cnVtIGVuaW0gdHVycGlzLCBhYyBsYWNpbmlhIGVsaXQgbWF0dGlzIG5lYy4gQWVuZWFuIGZhdWNpYnVzIHZhcml1cyB1bHRyaWNlcy4gU3VzcGVuZGlzc2UgZXUgdGluY2lkdW50IGR1aSwgYXQgZWZmaWNpdHVyIG5pc2kuIE1hdXJpcyBwb3J0dGl0b3IgcmlzdXMgdHJpc3RpcXVlIG5pc2kgbHVjdHVzIHNlbXBlci4gRnVzY2Ugbm9uIHZlc3RpYnVsdW0gbWF1cmlzLCBpZCB1bGxhbWNvcnBlciBuaXNpLiBNYWVjZW5hcyBhbnRlIHNlbSwgdnVscHV0YXRlIGF0IGRvbG9yIGV1LCBmaW5pYnVzIGZlcm1lbnR1bSBvcmNpLiBJbiBkaWN0dW0gdmVsaXQgdmVsIGlwc3VtIHN1c2NpcGl0IGFsaXF1ZXQuIEludGVnZXIgdGluY2lkdW50IGRvbG9yIGF0IHVsdHJpY2VzIHBlbGxlbnRlc3F1ZS4gRHVpcyB0aW5jaWR1bnQgdmVuZW5hdGlzIHVybmEsIG5vbiB1bGxhbWNvcnBlciBlbGl0IHNlbXBlciBzZWQuIE1hdXJpcyBudWxsYSBtYXVyaXMsIGVsZWlmZW5kIGV0IGxhY3VzIGFjLCBvcm5hcmUgdmVzdGlidWx1bSBkb2xvci4gVmVzdGlidWx1bSBzb2RhbGVzIHBoYXJldHJhIGF1Z3VlIG5lYyBtYWxlc3VhZGEuIFF1aXNxdWUgbWF4aW11cyBsZW8gcXVpcyBleCBlbGVtZW50dW0sIHZpdGFlIGNvbmd1ZSBsb3JlbSBibGFuZGl0Lg0KDQpFdGlhbSBwZWxsZW50ZXNxdWUgZmFjaWxpc2lzIGVyYXQgc29kYWxlcyBtYWxlc3VhZGEuIE51bmMgY29uZGltZW50dW0gbGVvIGxlbywgc2l0IGFtZXQgcHJldGl1bSBtYWduYSBjdXJzdXMgdXQuIE1hZWNlbmFzIHNlZCBhbGlxdWV0IG5pYmguIFN1c3BlbmRpc3NlIHVsdHJpY2llcyBtYXNzYSBldCBlcmF0IGltcGVyZGlldCB0cmlzdGlxdWUuIE1hdXJpcyBub24gdXJuYSBjdXJzdXMsIG1hbGVzdWFkYSBmZWxpcyBxdWlzLCB0aW5jaWR1bnQgbWF1cmlzLiBTdXNwZW5kaXNzZSBhIGZlbGlzIG51bmMuIFByYWVzZW50IHZlc3RpYnVsdW0gZmFjaWxpc2lzIGNvbW1vZG8uIEFlbmVhbiBsdWN0dXMsIG1pIHV0IGVmZmljaXR1ciBoZW5kcmVyaXQsIHR1cnBpcyBsaWJlcm8gYmliZW5kdW0gbWFnbmEsIGVsZW1lbnR1bSBpbXBlcmRpZXQgZXJhdCBlc3QgZXUgbGFjdXMuIEFsaXF1YW0gcHJldGl1bSBlZ2VzdGFzIGNvbmRpbWVudHVtLg0KDQpOdWxsYSBldCBkaWN0dW0gdG9ydG9yLiBQaGFzZWxsdXMgc2l0IGFtZXQgbWFzc2EgZXN0LiBGdXNjZSBxdWlzIGZyaW5naWxsYSBsZW8sIGF0IGVnZXN0YXMgZXN0LiBTZWQgaWQgb2RpbyBsaWd1bGEuIE51bGxhIGZhY2lsaXNpLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkIGxpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIER1aXMgZWdldCBhbnRlIGFudGUuIFZlc3RpYnVsdW0gZXN0IG1ldHVzLCBhY2N1bXNhbiBzaXQgYW1ldCBsaWJlcm8gZXUsIGNvbmRpbWVudHVtIHRlbXBvciB0b3J0b3IuIERvbmVjIGNvbnNlcXVhdCBlcmF0IGlkIG5pc2kgcGxhY2VyYXQsIHNlZCBjb25zZXF1YXQgbnVsbGEgY3Vyc3VzLiBPcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLCBuYXNjZXR1ciByaWRpY3VsdXMgbXVzLg0KDQpQaGFzZWxsdXMgc2FnaXR0aXMgbmVxdWUgc2FwaWVuLiBOdW5jIG1hZ25hIHVybmEsIGlhY3VsaXMgaWQgZG9sb3IgcXVpcywgbWFsZXN1YWRhIHBoYXJldHJhIGFyY3UuIERvbmVjIHVsdHJpY2llcyBuaXNsIGlwc3VtLCBldCBkaWduaXNzaW0gbG9yZW0gb3JuYXJlIGluLiBEb25lYyBpbiBwb3N1ZXJlIHJpc3VzLCBlZ2V0IHRpbmNpZHVudCBudWxsYS4gTnVuYyBhbGlxdWFtIG1pIHZpdGFlIGFjY3Vtc2FuIHRlbXBvci4gUGhhc2VsbHVzIGV1IHJob25jdXMgZG9sb3IuIE51bGxhIG1hdHRpcyBlcm9zIGlkIHRvcnRvciBzY2VsZXJpc3F1ZSwgcXVpcyBmZXVnaWF0IG1hdXJpcyBsb2JvcnRpcy4gUGVsbGVudGVzcXVlIGN1cnN1cyBsYWN1cyBhYyBydXRydW0gdWxsYW1jb3JwZXIuIFZlc3RpYnVsdW0gZmluaWJ1cyBlcmF0IG5vbiBtYXNzYSBwcmV0aXVtLCBzZWQgZWdlc3RhcyBvcmNpIHVsdHJpY2llcy4gTW9yYmkgdWx0cmljaWVzIGV0IHJpc3VzIGlkIGNvbnZhbGxpcy4gRG9uZWMgY29uc2VjdGV0dXIgZWxpdCBlZ2V0IGxpYmVybyBwaGFyZXRyYSBmZXVnaWF0LiBWZXN0aWJ1bHVtIHZlbCBpcHN1bSBpZCBkdWkgdnVscHV0YXRlIHNvbGxpY2l0dWRpbiBpbiB1dCBuaXNsLiBBbGlxdWFtIGN1cnN1cyBtZXR1cyBldWlzbW9kIHVybmEgcGhhcmV0cmEgdWxsYW1jb3JwZXIuDQoNCkludGVnZXIgdWxsYW1jb3JwZXIgbWV0dXMgbWV0dXMsIHV0IHVsdHJpY2llcyBwdXJ1cyBzb2xsaWNpdHVkaW4gc2l0IGFtZXQuIFBlbGxlbnRlc3F1ZSBzZWQgZWxlbWVudHVtIHNlbS4gU2VkIHBsYWNlcmF0IG5pYmggaW4gcHJldGl1bSBlbGVpZmVuZC4gU2VkIHZlaGljdWxhIG9kaW8gbGVjdHVzLCBzZWQgdGluY2lkdW50IG9yY2kgbWF0dGlzIHNlZC4gQWVuZWFuIHBoYXJldHJhIGVsaXQgdHVycGlzLiBNb3JiaSB2aXRhZSBkaWFtIG1vbGxpcywgYmliZW5kdW0gbGVjdHVzIHNlZCwgdmVoaWN1bGEgcXVhbS4gVmVzdGlidWx1bSBoZW5kcmVyaXQgbmliaCBlcm9zLiBQZWxsZW50ZXNxdWUgYSBmZWxpcyBldSBsaWd1bGEgaW50ZXJkdW0gZXVpc21vZCBldSBzaXQgYW1ldCBzYXBpZW4uIEFlbmVhbiBxdWlzIGR1aSBtZXR1cy4gTW9yYmkgcG9ydHRpdG9yIGJpYmVuZHVtIHJob25jdXMuIFV0IG1vbGxpcyBsYWN1cyBpZCBsZW8gYXVjdG9yIGRpY3R1bS4gRHVpcyBmaW5pYnVzIGp1c3RvIHNhcGllbiwgdXQgdml2ZXJyYSBtYXVyaXMgdWx0cmljZXMgbmVjLiBNYXVyaXMgdml0YWUgc2FnaXR0aXMgZXJvcy4gTnVsbGEgYWNjdW1zYW4gYXQgdmVsaXQgcXVpcyBkaWN0dW0uDQoNClV0IGNvbnZhbGxpcyBmcmluZ2lsbGEgbGVvIHNpdCBhbWV0IGdyYXZpZGEuIERvbmVjIHF1aXMgc2FwaWVuIGlkIGp1c3RvIHNvbGxpY2l0dWRpbiBsb2JvcnRpcyBldCBuZWMgbWFzc2EuIFZlc3RpYnVsdW0gaW4gc29kYWxlcyBhcmN1LiBOdWxsYSBhYyBlcmF0IGRvbG9yLiBTZWQgZWxpdCBzYXBpZW4sIHNvbGxpY2l0dWRpbiBpZCB1bHRyaWNlcyBzZWQsIGVnZXN0YXMgbm9uIGFudGUuIERvbmVjIGV0IGxlY3R1cyBhbGlxdWFtIG1ldHVzIG1vbGVzdGllIGVnZXN0YXMuIE1hZWNlbmFzIGxvYm9ydGlzLCBtYXVyaXMgaWQgY3Vyc3VzIGVsZW1lbnR1bSwganVzdG8gbG9yZW0gcG9ydHRpdG9yIG1hZ25hLCBxdWlzIGRpY3R1bSBsb3JlbSByaXN1cyB2aXRhZSBhcmN1LiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkIGxpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIEludGVnZXIgY29uc2VxdWF0IG9ybmFyZSBwZWxsZW50ZXNxdWUuIEFlbmVhbiB2ZWwgZGljdHVtIGFudGUsIG5vbiBmZXVnaWF0IHNhcGllbi4NCg0KTnVsbGFtIHZlbCBuZXF1ZSBwdXJ1cy4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldCB1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7IE5hbSB2aXRhZSBuaXNsIHVsdHJpY2VzLCBmYWNpbGlzaXMgdGVsbHVzIGFjLCBibGFuZGl0IGVzdC4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZCBsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBVdCByaG9uY3VzIG1hc3NhIGlkIG5pc2kgc3VzY2lwaXQsIHZpdGFlIGlhY3VsaXMgbWV0dXMgYWxpcXVldC4gVXQgY29uZGltZW50dW0gbmlzbCBhdCBlcmF0IGhlbmRyZXJpdCBwaGFyZXRyYS4gTnVsbGFtIHZlbCBqdXN0byBlZmZpY2l0dXIsIHBlbGxlbnRlc3F1ZSBleCBhY2N1bXNhbiwgdGVtcG9yIGZlbGlzLg0KDQpTZWQgcGxhY2VyYXQgdG9ydG9yIG5lYyBzZW0gcnV0cnVtIHBsYWNlcmF0LiBJbnRlZ2VyIGNvbnNlcXVhdCBudWxsYSBhdCBkb2xvciBmYWNpbGlzaXMgY29uc2VxdWF0LiBOdWxsYSBwaGFyZXRyYSwgbWF1cmlzIGV1IGJpYmVuZHVtIHVsdHJpY2llcywgZW5pbSBhbnRlIGJsYW5kaXQgbWFnbmEsIGV0IGNvbnZhbGxpcyB0ZWxsdXMgbmVxdWUgbmVjIHB1cnVzLiBWZXN0aWJ1bHVtIG5lYyBhcmN1IGlkIG9yY2kgYmliZW5kdW0gbGFjaW5pYSBldCBzaXQgYW1ldCBhdWd1ZS4gTmFtIHJ1dHJ1bSBhdWd1ZSBmYWNpbGlzaXMsIHBoYXJldHJhIGxvcmVtIG5lYywgbW9sZXN0aWUgbWV0dXMuIERvbmVjIGVsZWlmZW5kLCBsaWd1bGEgaW4gZmV1Z2lhdCBjb252YWxsaXMsIHNhcGllbiBlbmltIHB1bHZpbmFyIGZlbGlzLCBhdCBlbGVtZW50dW0gbG9yZW0gcHVydXMgaGVuZHJlcml0IG1hdXJpcy4gQ3VyYWJpdHVyIGVnZXQgaW1wZXJkaWV0IHB1cnVzLiBWaXZhbXVzIGluIHNlbSBzZW0uIERvbmVjIGNvbmRpbWVudHVtIGR1aSBpcHN1bSwgaWQgdGVtcG9yIGVyYXQgZWZmaWNpdHVyIHZpdGFlLiBDcmFzIHNpdCBhbWV0IGVzdCBzaXQgYW1ldCBsZW8gc2NlbGVyaXNxdWUgdnVscHV0YXRlLiBOdWxsYSBmYWNpbGlzaS4gRG9uZWMgY29uZGltZW50dW0gZHVpIG5pc2ksIGV1IGNvbW1vZG8gbWV0dXMgcnV0cnVtIHV0Lg0KDQpWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0IHVsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTsgRG9uZWMgcXVhbSBtZXR1cywgYmliZW5kdW0gaWQgaXBzdW0gdmVsLCB2b2x1dHBhdCBtYXhpbXVzIG1hdXJpcy4gU3VzcGVuZGlzc2UgaWQgYWxpcXVhbSBkdWkuIFZpdmFtdXMgc2NlbGVyaXNxdWUgbGFjaW5pYSB0aW5jaWR1bnQuIEludGVnZXIgbnVsbGEgZXgsIGJpYmVuZHVtIGluIHRlbGx1cyBhdCwgcG9ydGEgYWxpcXVldCBsZW8uIE51bGxhbSBmYWNpbGlzaXMgbGlndWxhIG5lYyBsb3JlbSBtb2xsaXMgcGVsbGVudGVzcXVlLiBGdXNjZSB2b2x1dHBhdCB0cmlzdGlxdWUgbmliaCBjb25ndWUgY29uZ3VlLiBWZXN0aWJ1bHVtIGRvbG9yIGVzdCwgcG9zdWVyZSBpZCBoZW5kcmVyaXQgZXQsIGNvbnNlY3RldHVyIGVnZXQgc2VtLg0KDQpEb25lYyBhIHBsYWNlcmF0IG9kaW8uIER1aXMgY29uc2VjdGV0dXIgdXJuYSBhYyB0dXJwaXMgbW9sbGlzLCBpbiBmYXVjaWJ1cyBsZWN0dXMgc2NlbGVyaXNxdWUuIFByb2luIHZlbmVuYXRpcyBtaSBwdWx2aW5hciBiaWJlbmR1bSBlZ2VzdGFzLiBNYWVjZW5hcyBwcmV0aXVtIHBvc3VlcmUgZXgsIGEgdmVuZW5hdGlzIGxlY3R1cy4gTWFlY2VuYXMgbm9uIHVsdHJpY2llcyBuaXNsLiBTdXNwZW5kaXNzZSBwbGFjZXJhdCBsZW8gZXQgYXVndWUgbG9ib3J0aXMgY29uZGltZW50dW0uIEluIGhhYyBoYWJpdGFzc2UgcGxhdGVhIGRpY3R1bXN0LiBOdWxsYW0gbmliaCBlcmF0LCBzY2VsZXJpc3F1ZSBpYWN1bGlzIHBvcnRhIHV0LCBhY2N1bXNhbiBtb2xlc3RpZSBtYXVyaXMuIE5hbSBwcmV0aXVtIG9ybmFyZSBxdWFtLg0KDQpNYWVjZW5hcyB1dCBsYWN1cyB2ZWwgZGlhbSBtb2xlc3RpZSBlZmZpY2l0dXIuIE51bmMgcGxhY2VyYXQgZXUgYXJjdSBhdCByaG9uY3VzLiBOdWxsYW0gdmVsaXQgZXgsIGVmZmljaXR1ciBldCBlcm9zIGluLCBmZXJtZW50dW0gc2FnaXR0aXMgbGliZXJvLiBWaXZhbXVzIGZpbmlidXMgdXJuYSBmZWxpcywgdmVsIHRpbmNpZHVudCBsZW8gYmxhbmRpdCBpbi4gRXRpYW0gY29tbW9kbywgbnVsbGEgdXQgY29uc2VxdWF0IHByZXRpdW0sIGVzdCBvcmNpIHZ1bHB1dGF0ZSBkaWFtLCBxdWlzIHRlbXBvciBwdXJ1cyBudW5jIHZlbCBsaWJlcm8uIE51bGxhbSBleCB1cm5hLCBzZW1wZXIgYXQgZWZmaWNpdHVyIGV1LCBsdWN0dXMgaW4gbGFjdXMuIER1aXMgcHJldGl1bSBhbnRlIHNlZCBsb3JlbSBhY2N1bXNhbiwgZmVybWVudHVtIHRlbXBvciBsYWN1cyB2YXJpdXMuIE51bGxhbSBhdCBmZWxpcyBldCB0dXJwaXMgZWxlbWVudHVtIGNvbmRpbWVudHVtIGluIGludGVyZHVtIG5lcXVlLiBNYXVyaXMgbWF0dGlzIGRpY3R1bSBlcm9zLCB2aXRhZSBjb25kaW1lbnR1bSBsaWJlcm8gc29sbGljaXR1ZGluIHNlbXBlci4gUGhhc2VsbHVzIHBvc3VlcmUgc3VzY2lwaXQgdGVsbHVzIGluIGdyYXZpZGEuIFByYWVzZW50IHRpbmNpZHVudCBwdXJ1cyBmZXVnaWF0IHNhcGllbiBhY2N1bXNhbiwgc2VkIHJob25jdXMgZXJvcyBhY2N1bXNhbi4gQ3VyYWJpdHVyIG5lYyBpbnRlcmR1bSBsYWN1cywgaW4gYWNjdW1zYW4gZWxpdC4gSW50ZWdlciBhYyBzZW0gZWdldCB2ZWxpdCBkYXBpYnVzIHZvbHV0cGF0LiBWZXN0aWJ1bHVtIHNpdCBhbWV0IHVybmEgaWQgZXN0IGZldWdpYXQgZmF1Y2lidXMgbm9uIHZpdGFlIGxpYmVyby4NCg0KTWF1cmlzIGNvbnNlcXVhdCBlbGl0IGFjIGNvbmRpbWVudHVtIHNjZWxlcmlzcXVlLiBEb25lYyBiaWJlbmR1bSBkaWN0dW0gdGluY2lkdW50LiBJbnRlZ2VyIHF1aXMgZXVpc21vZCBqdXN0bywgdml0YWUgcGVsbGVudGVzcXVlIGRpYW0uIEFlbmVhbiBpbiBzb2RhbGVzIGF1Z3VlLiBTZWQgc3VzY2lwaXQgZmVsaXMgZWdldCBzYWdpdHRpcyBkaWduaXNzaW0uIE51bmMgdmVsIGZlcm1lbnR1bSBsZW8sIHZpdGFlIGZldWdpYXQgb2Rpby4gRnVzY2UgcGVsbGVudGVzcXVlIHNhZ2l0dGlzIHZlbmVuYXRpcy4NCg0KUXVpc3F1ZSBxdWlzIG5pYmggZGljdHVtLCBtYWxlc3VhZGEgbWF1cmlzIGEsIHRlbXBvciBuZXF1ZS4gTWFlY2VuYXMgdWx0cmljZXMgcXVhbSBxdWlzIGRpYW0gcHJldGl1bSwgcXVpcyBtb2xlc3RpZSBsb3JlbSB2dWxwdXRhdGUuIEludGVnZXIgZGljdHVtIGVsaXQgYWMgaWFjdWxpcyBwZWxsZW50ZXNxdWUuIFBlbGxlbnRlc3F1ZSB2aXRhZSBlc3QgZWxpdC4gRHVpcyBmZXJtZW50dW0gc3VzY2lwaXQgbW9sbGlzLiBTZWQgaWQgbGVvIGlkIGxvcmVtIHZlbmVuYXRpcyB1bHRyaWNpZXMuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQgbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gTW9yYmkgY29uZ3VlIGxpZ3VsYSBldCBmYWNpbGlzaXMgbG9ib3J0aXMuIFBlbGxlbnRlc3F1ZSBuZWMgdHJpc3RpcXVlIHRvcnRvci4gRG9uZWMgcG9zdWVyZSBmaW5pYnVzIHVsdHJpY2VzLiBOYW0gc2VkIHNhZ2l0dGlzIGVuaW0sIHV0IHZpdmVycmEgZG9sb3IuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIEluIG5lYyB0ZW1wdXMgb2Rpby4NCg0KTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gSW4gZmV1Z2lhdCBlc3Qgb3JjaSwgbHVjdHVzIHBlbGxlbnRlc3F1ZSBvZGlvIG9ybmFyZSBhdC4gTW9yYmkgZWdldCByaG9uY3VzIGp1c3RvLiBQcmFlc2VudCBkYXBpYnVzIGFjY3Vtc2FuIGxlbywgdmVsIHNlbXBlciBlbmltIHRlbXBvciBlZmZpY2l0dXIuIENyYXMgaXBzdW0gYXVndWUsIHJ1dHJ1bSBxdWlzIGR1aSBhdCwgdGVtcG9yIGNvbmd1ZSB0b3J0b3IuIE1hZWNlbmFzIGJpYmVuZHVtIGZhdWNpYnVzIHZlbGl0LCBxdWlzIGVsZW1lbnR1bSBwdXJ1cyB2ZWhpY3VsYSBhYy4gTWFlY2VuYXMgc2VkIHRyaXN0aXF1ZSB2ZWxpdC4NCg0KQWVuZWFuIGRhcGlidXMgZWxlaWZlbmQgc29kYWxlcy4gUGVsbGVudGVzcXVlIGNvbmRpbWVudHVtIGxhY2luaWEgdmVsaXQgcXVpcyBsb2JvcnRpcy4gQWxpcXVhbSBhIGxpZ3VsYSBkdWkuIE51bmMgZmluaWJ1cyBhdWN0b3IgdXJuYSBhdCBsb2JvcnRpcy4gUHJhZXNlbnQgbmVjIG1pIGV0IGF1Z3VlIGVsZW1lbnR1bSBmYXVjaWJ1cyBpZCBldCByaXN1cy4gU2VkIGluIGFyY3Ugdml0YWUgZWxpdCB0ZW1wb3IgdGluY2lkdW50IGEgdml0YWUgZXguIFByYWVzZW50IG5vbiB1cm5hIHF1aXMgbWFnbmEgYmxhbmRpdCBzb2RhbGVzIHZlbCBzZWQgbGlndWxhLiBJbnRlZ2VyIG5lYyBtYXNzYSBuaXNpLiBDbGFzcyBhcHRlbnQgdGFjaXRpIHNvY2lvc3F1IGFkIGxpdG9yYSB0b3JxdWVudCBwZXIgY29udWJpYSBub3N0cmEsIHBlciBpbmNlcHRvcyBoaW1lbmFlb3MuIFByYWVzZW50IHV0IGxhY3VzIHByZXRpdW0sIHRlbXB1cyBvcmNpIG5vbiwgcG9ydHRpdG9yIHNlbS4gRHVpcyBzaXQgYW1ldCBzYXBpZW4gbnVuYy4NCg0KU3VzcGVuZGlzc2Ugdm9sdXRwYXQgbGliZXJvIGlkIHJpc3VzIGVsZW1lbnR1bSB0ZW1wdXMuIEludGVnZXIgZmVsaXMgbnVsbGEsIGx1Y3R1cyBpbiBtZXR1cyBldCwgbG9ib3J0aXMgcG9ydGEgdXJuYS4gQWVuZWFuIGF0IGxhY3VzIHZhcml1cywgdWx0cmljZXMgbG9yZW0gbm9uLCBkaWduaXNzaW0gb3JjaS4gU3VzcGVuZGlzc2UgbHVjdHVzIGVyYXQgc2VkIGR1aSBsdWN0dXMgY3Vyc3VzLiBBbGlxdWFtIGVyb3MgYW50ZSwgcG9ydHRpdG9yIHV0IHNhcGllbiBzaXQgYW1ldCwgc29kYWxlcyBtb2xsaXMgbmVxdWUuIFBoYXNlbGx1cyBhIHB1bHZpbmFyIHRvcnRvciwgdmVsIHBlbGxlbnRlc3F1ZSBuZXF1ZS4gQWVuZWFuIGxpYmVybyBsb3JlbSwgcGVsbGVudGVzcXVlIHF1aXMgZGFwaWJ1cyBuZWMsIGRhcGlidXMgbm9uIHR1cnBpcy4NCg0KQWxpcXVhbSBibGFuZGl0IHF1aXMgZGlhbSBjb25zZXF1YXQgcG9ydGEuIEZ1c2NlIGFjIGZlcm1lbnR1bSB0dXJwaXMuIEluIHZpdmVycmEgZWdldCBhdWd1ZSBzZWQgaWFjdWxpcy4gSW4gbWF0dGlzIHRpbmNpZHVudCBtZXR1cy4gRHVpcyBhIGxhY2luaWEgcHVydXMuIFZpdmFtdXMgbG9ib3J0aXMgdGVsbHVzIGF0IG51bmMgZGFwaWJ1cyB2b2x1dHBhdC4gU2VkIHBvcnRhIGlwc3VtIG51bmMsIHRlbXB1cyBtb2xlc3RpZSBuZXF1ZSB2YXJpdXMgbm9uLiBEb25lYyBpbiBvcm5hcmUgZXN0LCBldSBncmF2aWRhIGVyYXQuIFByYWVzZW50IHZpdGFlIG1ldHVzIHZpdGFlIGVzdCBwaGFyZXRyYSBwb3J0dGl0b3IuIE51bGxhIG9yY2kgbGFjdXMsIHRlbXB1cyB2aXRhZSBpYWN1bGlzIHF1aXMsIGV1aXNtb2QgYWMgdHVycGlzLiBNb3JiaSBmaW5pYnVzIGdyYXZpZGEgZXN0IGV0IHRpbmNpZHVudC4gTWF1cmlzIG1hbGVzdWFkYSB2ZWxpdCBpZCBjb21tb2RvIGRpY3R1bS4gTmFtIHZpdGFlIHB1cnVzIGV0IG51bGxhIGZhY2lsaXNpcyBwb3J0dGl0b3IuIERvbmVjIHNvbGxpY2l0dWRpbiBlc3QgdWxsYW1jb3JwZXIgbnVuYyB1bHRyaWNpZXMsIGV1IG1heGltdXMgYW50ZSBhbGlxdWFtLg0KDQpJbnRlZ2VyIGxlY3R1cyBkb2xvciwgdWx0cmljZXMgc2VkIG5pc2wgc2l0IGFtZXQsIHRyaXN0aXF1ZSBlbGVpZmVuZCBqdXN0by4gTWF1cmlzIHBsYWNlcmF0IG1pIGF0IGFyY3UgaW1wZXJkaWV0LCBlZ2V0IGNvbW1vZG8gZXggcmhvbmN1cy4gRXRpYW0gc2l0IGFtZXQgb3JjaSBudW5jLiBQcmFlc2VudCBlZmZpY2l0dXIgZXN0IG51bmMsIHF1aXMgdWx0cmljaWVzIGlwc3VtIHBoYXJldHJhIHF1aXMuIFByb2luIHZpdGFlIHF1YW0gbmlzaS4gQ3JhcyBpZCB0dXJwaXMgbm9uIGxhY3VzIHZlbmVuYXRpcyBiaWJlbmR1bSBhYyBub24gb2Rpby4gUXVpc3F1ZSBmZXJtZW50dW0sIHR1cnBpcyBpZCBwb3J0dGl0b3IgaW50ZXJkdW0sIGxvcmVtIHVybmEgbG9ib3J0aXMgbGliZXJvLCBhIGxhY2luaWEgbmlzbCBkaWFtIG5lYyB0b3J0b3IuDQoNClZpdmFtdXMgYXQganVzdG8gYXQgYW50ZSBkYXBpYnVzIHJ1dHJ1bSBzaXQgYW1ldCBhYyB1cm5hLiBTZWQgYSBtZXR1cyB0aW5jaWR1bnQsIGV1aXNtb2QgbnVuYyB2aXRhZSwgZmV1Z2lhdCBuaXNpLiBBZW5lYW4gYWxpcXVldCBkaWFtIHNpdCBhbWV0IG5pYmggc29kYWxlcywgcXVpcyB2b2x1dHBhdCBkaWFtIHN1c2NpcGl0LiBQcm9pbiBmYXVjaWJ1cyBwbGFjZXJhdCBmZXVnaWF0LiBBbGlxdWFtIHBvcnR0aXRvciBmZXVnaWF0IGFudGUuIEN1cmFiaXR1ciBncmF2aWRhIG5pc2kgc2VkIHNhZ2l0dGlzIGltcGVyZGlldC4gTWFlY2VuYXMgcG9ydHRpdG9yIG1hZ25hIGJsYW5kaXQgZXJhdCBlZ2VzdGFzLCBub24gY29uZGltZW50dW0gcXVhbSBwdWx2aW5hci4gU2VkIGZlcm1lbnR1bSBsZWN0dXMgdGluY2lkdW50IGxvYm9ydGlzIG1vbGxpcy4gSW4gbmVjIGx1Y3R1cyBtYWduYS4gU3VzcGVuZGlzc2Ugc2VkIHBvcnRhIHRlbGx1cywgYWMgaW50ZXJkdW0gbnVsbGEuDQoNClByb2luIHNhcGllbiB1cm5hLCBlbGVtZW50dW0gaW4gdm9sdXRwYXQgaWQsIHB1bHZpbmFyIHNpdCBhbWV0IGxlby4gVXQgYmxhbmRpdCB0ZWxsdXMgaW4gc2VtIHBvcnR0aXRvciBjb25zZXF1YXQuIE1hZWNlbmFzIHZvbHV0cGF0IGxvcmVtIHF1aXMgbmlzbCB2dWxwdXRhdGUsIG5vbiB2aXZlcnJhIGp1c3RvIGFsaXF1YW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFV0IHNlZCBhdWN0b3IgZXJvcy4gVXQgaW4gZmVybWVudHVtIGxpZ3VsYS4gU3VzcGVuZGlzc2UgZW5pbSBmZWxpcywgZmVybWVudHVtIHNpdCBhbWV0IGR1aSBzaXQgYW1ldCwgdWx0cmljZXMgcnV0cnVtIG1hdXJpcy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQWxpcXVhbSBlcm9zIHR1cnBpcywgb3JuYXJlIHV0IGJsYW5kaXQgbmVjLCB2dWxwdXRhdGUgYWxpcXVldCBtYWduYS4gTnVsbGFtIHNhcGllbiByaXN1cywgdHJpc3RpcXVlIHNvZGFsZXMgdWx0cmljZXMgc2NlbGVyaXNxdWUsIGFsaXF1ZXQgaWQgb3JjaS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldCB1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7IER1aXMgZGlnbmlzc2ltIGFsaXF1YW0gZXVpc21vZC4gQ3VyYWJpdHVyIHNvbGxpY2l0dWRpbiwgbGlndWxhIHV0IGFsaXF1YW0gdml2ZXJyYSwgb2RpbyB0ZWxsdXMgZGFwaWJ1cyBtYXNzYSwgaWQgcGhhcmV0cmEgbmliaCBtaSBkYXBpYnVzIHNlbS4gTnVsbGEgbG9yZW0gZWxpdCwgbW9sbGlzIHNpdCBhbWV0IHRpbmNpZHVudCBpbiwgdWxsYW1jb3JwZXIgc2VkIG9yY2kuDQoNClBoYXNlbGx1cyBlZmZpY2l0dXIsIHB1cnVzIHZpdGFlIHNlbXBlciBsb2JvcnRpcywgbmliaCBuZXF1ZSBzZW1wZXIganVzdG8sIHZlbCBmaW5pYnVzIHJpc3VzIGZlbGlzIHZlbCBkb2xvci4gRXRpYW0gdXJuYSBmZWxpcywgdGluY2lkdW50IHV0IG1hdXJpcyB1dCwgdmVoaWN1bGEgdWxsYW1jb3JwZXIgYXVndWUuIFN1c3BlbmRpc3NlIGNvbW1vZG8gbWF1cmlzIG5pc2wsIHNpdCBhbWV0IGlhY3VsaXMgZGlhbSBhY2N1bXNhbiBuZWMuIEFsaXF1YW0gdGVtcG9yIGVyYXQgbWksIGF0IG1heGltdXMgbWkgdGluY2lkdW50IGF0LiBEdWlzIGx1Y3R1cyBsZWN0dXMgc2VkIGF1Z3VlIGZyaW5naWxsYSBldWlzbW9kLiBQZWxsZW50ZXNxdWUgZXQgY3Vyc3VzIHNhcGllbi4gSW50ZWdlciBub24gdGluY2lkdW50IGVsaXQuIEN1cmFiaXR1ciBub24gbWkgc29sbGljaXR1ZGluLCBmcmluZ2lsbGEgZW5pbSB1dCwgZmFjaWxpc2lzIGVzdC4gSW4gYSBjb21tb2RvIG5lcXVlLiBDcmFzIGx1Y3R1cyBtYWduYSB1dCBtYXVyaXMgYXVjdG9yLCBhYyBsdWN0dXMgYXJjdSBtb2xsaXMuIEluIGhhYyBoYWJpdGFzc2UgcGxhdGVhIGRpY3R1bXN0LiBQaGFzZWxsdXMgbWF4aW11cyBjb25zZXF1YXQgaW50ZXJkdW0uIFV0IGV0IGVzdCBldSBsaWd1bGEgbGFvcmVldCBwb3J0dGl0b3IuIFZpdmFtdXMgc29sbGljaXR1ZGluIHBsYWNlcmF0IHB1cnVzLCBhIGZhdWNpYnVzIGRvbG9yIGlhY3VsaXMgZXQuIFNlZCB1bHRyaWNlcyB2ZWwganVzdG8gaW4gdGVtcHVzLg0KDQpEb25lYyBmZXJtZW50dW0gbGFjaW5pYSBhbGlxdWV0LiBNYWVjZW5hcyBlbGVpZmVuZCBtYWduYSBldSBwbGFjZXJhdCBjb25kaW1lbnR1bS4gTWF1cmlzIHBoYXJldHJhIHB1cnVzIHZlbCBkdWkgY29tbW9kbywgaW4gb3JuYXJlIGxpZ3VsYSBsYWNpbmlhLiBNYXVyaXMgdmVsIGVsZWlmZW5kIGxhY3VzLiBQaGFzZWxsdXMgZnJpbmdpbGxhIHF1aXMgbG9yZW0gYWMgaW1wZXJkaWV0LiBBbGlxdWFtIG1vbGxpcyBlcmF0IG5lYyBlcm9zIGVmZmljaXR1ciwgdml0YWUgdGVtcHVzIGV4IGZlcm1lbnR1bS4gVml2YW11cyB2YXJpdXMgZXUgb2RpbyBhdCBjb21tb2RvLiBOdWxsYSBmYWNpbGlzaS4gSW4gdml2ZXJyYSwgZG9sb3IgdmVsIHNvbGxpY2l0dWRpbiBjb25kaW1lbnR1bSwgbWF1cmlzIGxpYmVybyBjb21tb2RvIG9kaW8sIHF1aXMgc29sbGljaXR1ZGluIGRpYW0gZXJvcyBhYyBpcHN1bS4gTnVsbGEgdWx0cmljaWVzIG1hZ25hIHF1aXMgZGlhbSBwZWxsZW50ZXNxdWUsIGlkIHBlbGxlbnRlc3F1ZSBuaXNsIHZ1bHB1dGF0ZS4gU2VkIHByZXRpdW0gZHVpIGlhY3VsaXMgbGFvcmVldCB2ZW5lbmF0aXMuIEN1cmFiaXR1ciBpZCBkb2xvciBsaWd1bGEuIE1hZWNlbmFzIGNvbnNlY3RldHVyIG5lcXVlIG5lYyBwb3N1ZXJlIHRpbmNpZHVudC4gU3VzcGVuZGlzc2UgZWdldCBlcmF0IHNpdCBhbWV0IHZlbGl0IHRpbmNpZHVudCBpbnRlcmR1bS4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBOdWxsYSB2YXJpdXMgbmliaCBldSBkdWkgbWF0dGlzIGhlbmRyZXJpdC4NCg0KVXQgaW4gZXggYXJjdS4gTWFlY2VuYXMgcXVpcyB0aW5jaWR1bnQgdG9ydG9yLCB2ZWwgZmVybWVudHVtIG5pc2wuIEFlbmVhbiBwdWx2aW5hciByaXN1cyBxdWFtLCBub24gdGluY2lkdW50IG5lcXVlIGZlcm1lbnR1bSBlZ2V0LiBBbGlxdWFtIGV0IG1hZ25hIHV0IGxvcmVtIG1heGltdXMgZ3JhdmlkYS4gSW50ZWdlciB0aW5jaWR1bnQgb3JjaSBibGFuZGl0IGVyb3MgcGVsbGVudGVzcXVlLCBldCBibGFuZGl0IGR1aSBzY2VsZXJpc3F1ZS4gRnVzY2Ugc2VkIGlwc3VtIGVnZXN0YXMsIGRhcGlidXMgbGlndWxhIHNpdCBhbWV0LCBwb3J0dGl0b3IgdG9ydG9yLiBQcm9pbiBub24gZXJhdCBxdWlzIG51bmMgdWx0cmljZXMgZGljdHVtLg0KDQpOdWxsYSBpbnRlcmR1bSwgbGlndWxhIG1vbGxpcyBzZW1wZXIgdmVuZW5hdGlzLCBudWxsYSBzYXBpZW4gc3VzY2lwaXQgZXJvcywgc2VkIHNvbGxpY2l0dWRpbiBtZXR1cyBudW5jIGVnZXQgZmVsaXMuIFByb2luIG5lYyByaXN1cyBpZCBudW5jIHBlbGxlbnRlc3F1ZSB0ZW1wdXMuIE51bGxhIGZhY2lsaXNpLiBQaGFzZWxsdXMgc2VkIGxlY3R1cyB0b3J0b3IuIFNlZCBpbiBudWxsYSBldCByaXN1cyBzZW1wZXIgY29udmFsbGlzIHNlZCBpbiBsYWN1cy4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBFdGlhbSBkaWduaXNzaW0gbmlzbCBxdWlzIGV4IGFsaXF1YW0sIG5lYyBzb2RhbGVzIGxlY3R1cyByaG9uY3VzLiBQZWxsZW50ZXNxdWUgc2FnaXR0aXMgYXJjdSBtYXNzYSwgYWMgc29sbGljaXR1ZGluIGxpZ3VsYSB1bHRyaWNpZXMgdmVuZW5hdGlzLiBGdXNjZSBtaSBlcm9zLCB2dWxwdXRhdGUgbm9uIGNvbnNlY3RldHVyIHF1aXMsIHByZXRpdW0gZmVybWVudHVtIG5pc2wuIERvbmVjIGEgZmluaWJ1cyBudW5jLiBTZWQgYWxpcXVldCBmcmluZ2lsbGEgZXJhdCB1dCBjb252YWxsaXMuIEV0aWFtIGxhY3VzIGR1aSwgdGVtcHVzIHNpdCBhbWV0IGRhcGlidXMgdml0YWUsIHVsdHJpY2llcyBpZCB0dXJwaXMuIERvbmVjIGRvbG9yIGF1Z3VlLCB0cmlzdGlxdWUgbmVjIGVnZXN0YXMgc2VkLCBzZW1wZXIgZXQgZG9sb3IuDQoNCk51bGxhbSB2ZWhpY3VsYSB0b3J0b3IgZWdldCBsYWN1cyBlbGVpZmVuZCwgZXUgdmVoaWN1bGEgZmVsaXMgdGluY2lkdW50LiBBbGlxdWFtIHNvZGFsZXMgdmVoaWN1bGEgbGVvLCBhdCBjdXJzdXMgcHVydXMgc29kYWxlcyBxdWlzLiBBZW5lYW4gYmliZW5kdW0gZWdlc3RhcyBudWxsYSwgc2VkIGRpZ25pc3NpbSBlbmltIGRhcGlidXMgc2VkLiBBbGlxdWFtIHJpc3VzIGxhY3VzLCBwbGFjZXJhdCBpZCBtYXVyaXMgbm9uLCB2dWxwdXRhdGUgdGluY2lkdW50IHZlbGl0LiBQcmFlc2VudCBldSBjb25kaW1lbnR1bSBhcmN1LiBEb25lYyBsYWNpbmlhIGVsaXQgZXQganVzdG8gcHJldGl1bSwgc2l0IGFtZXQgZnJpbmdpbGxhIHRlbGx1cyBwb3J0YS4gTW9yYmkgcG9ydGEgdm9sdXRwYXQgdXJuYSBpZCBwdWx2aW5hci4gQ3JhcyBibGFuZGl0IG9yY2kgbWFzc2EsIHF1aXMgY3Vyc3VzIG51bGxhIHJob25jdXMgdXQuIEluIHZlbCBsYWN1cyBzZWQgdXJuYSBldWlzbW9kIG9ybmFyZS4gSW4gaGFjIGhhYml0YXNzZSBwbGF0ZWEgZGljdHVtc3QuDQoNCk51bGxhbSBzaXQgYW1ldCBsZW8gY29udmFsbGlzLCBwaGFyZXRyYSBqdXN0byBldSwgdWx0cmljZXMgbG9yZW0uIENyYXMgYmliZW5kdW0gZWdlc3RhcyBhcmN1LCBxdWlzIHNhZ2l0dGlzIG5pYmggdnVscHV0YXRlIHNlZC4gRHVpcyBxdWlzIHR1cnBpcyBsZWN0dXMuIEN1cmFiaXR1ciBldSBwb3J0YSBzYXBpZW4sIG5vbiBjb252YWxsaXMgZG9sb3IuIFByb2luIGxpZ3VsYSBsZWN0dXMsIHZhcml1cyBpZCBzY2VsZXJpc3F1ZSBpbiwgdWx0cmljZXMgc2VkIG51bmMuIEludGVnZXIgbmVjIGxpZ3VsYSBhIG1hdXJpcyBwdWx2aW5hciBtYXhpbXVzIGF0IGV0IHB1cnVzLiBJbnRlZ2VyIGFsaXF1YW0gdmVsIHZlbGl0IHNlZCByaG9uY3VzLiBWaXZhbXVzIGEgdmFyaXVzIG5lcXVlLiBNb3JiaSBjb25zZWN0ZXR1ciBudWxsYSBkdWksIGF0IGFsaXF1YW0gbG9yZW0gdmVuZW5hdGlzIHB1bHZpbmFyLiBVdCBldWlzbW9kIGVzdCB2aXRhZSB2ZWxpdCBhdWN0b3IgYWxpcXVldC4gUGVsbGVudGVzcXVlIG1vbGxpcyB0ZWxsdXMgbmVxdWUsIGV0IGlhY3VsaXMgdHVycGlzIGFjY3Vtc2FuIHNlZC4NCg0KRHVpcyBpbiBjb21tb2RvIG1hc3NhLiBBbGlxdWFtIHVsdHJpY2llcyBlcmF0IG1hc3NhLCBxdWlzIHBoYXJldHJhIGRpYW0gZGFwaWJ1cyBhdC4gU2VkIHNjZWxlcmlzcXVlIGNvbnZhbGxpcyBvZGlvIHNpdCBhbWV0IGludGVyZHVtLiBEb25lYyBzZWQgdnVscHV0YXRlIHRlbGx1cywgbm9uIGV1aXNtb2QgbGVvLiBOdWxsYW0gZG9sb3Igc2FwaWVuLCBwb3J0YSB2aXRhZSBjb25ndWUgYWMsIHRyaXN0aXF1ZSB1dCBleC4gU3VzcGVuZGlzc2UgbG9ib3J0aXMgc2VkIGVyYXQgbmVjIGNvbnNlcXVhdC4gRXRpYW0gdmVuZW5hdGlzIHBlbGxlbnRlc3F1ZSBwb3J0dGl0b3IuIE51bGxhIHVsdHJpY2VzLCBwdXJ1cyBub24gbW9sZXN0aWUgbW9sbGlzLCBlc3QgZXJvcyBpYWN1bGlzIGxlY3R1cywgZXUgbW9sbGlzIGxlbyBqdXN0byBzZWQgbnVuYy4gTmFtIHZvbHV0cGF0IG51bmMgbmVjIGN1cnN1cyBtYXhpbXVzLiBDdXJhYml0dXIgc2l0IGFtZXQgZWdlc3RhcyBuaXNpLiBDdXJhYml0dXIgaGVuZHJlcml0IHNhZ2l0dGlzIHByZXRpdW0uIFF1aXNxdWUgbHVjdHVzIGlwc3VtIGZldWdpYXQgdXJuYSBibGFuZGl0IGVsZWlmZW5kLiBGdXNjZSBjb252YWxsaXMgbmliaCBlZ2V0IGp1c3RvIGVsZW1lbnR1bSwgdmVsIHZ1bHB1dGF0ZSBsb3JlbSBmZXJtZW50dW0uDQoNCkZ1c2NlIGFjY3Vtc2FuIHNhcGllbiBlZ2V0IHNvbGxpY2l0dWRpbiBwb3J0dGl0b3IuIE1vcmJpIGVzdCByaXN1cywgbGFjaW5pYSBzaXQgYW1ldCBzZW1wZXIgcXVpcywgbWF0dGlzIG5vbiB0ZWxsdXMuIE1hZWNlbmFzIHBvcnRhIHZpdmVycmEgbWF1cmlzIGEgc3VzY2lwaXQuIEFlbmVhbiB2ZWwgZWxlaWZlbmQgdXJuYS4gUGhhc2VsbHVzIGF0IGFudGUgdGluY2lkdW50LCBwbGFjZXJhdCBsb3JlbSBsYWNpbmlhLCBhbGlxdWV0IG5pYmguIFN1c3BlbmRpc3NlIHBvdGVudGkuIER1aXMgdHJpc3RpcXVlIGFsaXF1YW0gZXgsIHZpdGFlIHVsdHJpY2VzIG1hZ25hIHN1c2NpcGl0IGltcGVyZGlldC4gRG9uZWMgdGVtcHVzIGVsZWlmZW5kIGltcGVyZGlldC4gVmVzdGlidWx1bSBpYWN1bGlzIGZhY2lsaXNpcyB2ZWxpdCwgdmVsIGVsZWlmZW5kIGp1c3RvIHJ1dHJ1bSB2aXRhZS4NCg0KUHJvaW4gcG9ydGEgbGVjdHVzIGEgbW9sZXN0aWUgdGVtcG9yLiBTZWQgdmVsIGp1c3RvIHNlbXBlciwgbW9sZXN0aWUgdXJuYSBhdWN0b3IsIGlhY3VsaXMgbG9yZW0uIEN1cmFiaXR1ciB2ZWwgZGlhbSBhdWN0b3IsIGxvYm9ydGlzIGF1Z3VlIGV1LCB0aW5jaWR1bnQgbGlndWxhLiBEdWlzIGEgcG9zdWVyZSBlcm9zLiBOdWxsYSBxdWlzIG5pc2kgZWZmaWNpdHVyLCBwcmV0aXVtIGRvbG9yIGF0LCBpbnRlcmR1bSBuaXNsLiBFdGlhbSBzaXQgYW1ldCBwb3J0dGl0b3IgbWkuIFF1aXNxdWUgaWQgbGFjdXMgbGFvcmVldCwgZmFjaWxpc2lzIGxlbyBhdCwgZWxlbWVudHVtIG1hZ25hLiBOYW0gaWQgbWF0dGlzIHJpc3VzLiBTZWQgZnJpbmdpbGxhIGZyaW5naWxsYSByaXN1cywgZWdldCB1bGxhbWNvcnBlciBlc3QgdnVscHV0YXRlIHF1aXMuIFV0IHBsYWNlcmF0IHZlbGl0IGRvbG9yLiBFdGlhbSBldSBwdXJ1cyB2aXZlcnJhIGFyY3Ugc29sbGljaXR1ZGluIHNhZ2l0dGlzLg0KDQpRdWlzcXVlIGEgcGxhY2VyYXQgbnVsbGEuIE51bmMgZXJvcyBudWxsYSwgbG9ib3J0aXMgaWQgdml2ZXJyYSB0aW5jaWR1bnQsIHB1bHZpbmFyIGluIGFudGUuIE1vcmJpIGludGVyZHVtIGdyYXZpZGEgb2RpbywgaW4gY29uZ3VlIGFyY3UgdGluY2lkdW50IGRhcGlidXMuIEludGVnZXIgYmliZW5kdW0gZXggYSB1cm5hIGhlbmRyZXJpdCBwaGFyZXRyYS4gRnVzY2Ugc2VtcGVyIGFsaXF1YW0gZXJvcywgdXQgZGljdHVtIGVzdCBpbXBlcmRpZXQgZWdldC4gRG9uZWMgYWMgcGxhY2VyYXQgcXVhbS4gRHVpcyBmYWNpbGlzaXMsIGxpZ3VsYSBzZWQgdnVscHV0YXRlIG1vbGVzdGllLCBtYXVyaXMgbWF1cmlzIG9ybmFyZSBtYXNzYSwgZGlnbmlzc2ltIGV1aXNtb2QganVzdG8gdHVycGlzIHF1aXMgbmVxdWUuIERvbmVjIHV0IHNjZWxlcmlzcXVlIG1hdXJpcy4gTnVsbGEgYXVndWUgbGVjdHVzLCBpYWN1bGlzIGV0IG9yY2kgZWdldCwgZmFjaWxpc2lzIGRpY3R1bSBzZW0uIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQgbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgcGVyIGluY2VwdG9zIGhpbWVuYWVvcy4gTW9yYmkgcHVsdmluYXIgcHJldGl1bSBsaWd1bGEuIEludGVnZXIgZGlnbmlzc2ltIHRvcnRvciBpZCB0b3J0b3IgcGxhY2VyYXQsIGV0IHB1bHZpbmFyIG1hZ25hIGxhY2luaWEuIEluIHF1aXMgc2NlbGVyaXNxdWUgbmlzbC4gTWF1cmlzIHR1cnBpcyBxdWFtLCBzdXNjaXBpdCBhYyB2ZXN0aWJ1bHVtIG5lYywgZWxlbWVudHVtIHZlbCBuZXF1ZS4gU2VkIGxhY2luaWEsIHVybmEgYSByaG9uY3VzIHNhZ2l0dGlzLCBlcm9zIHZlbGl0IGNvbnNlY3RldHVyIHNhcGllbiwgZXUgYWNjdW1zYW4gdHVycGlzIG9kaW8gZWdldCB0ZWxsdXMuIE9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsIG5hc2NldHVyIHJpZGljdWx1cyBtdXMuDQoNClZpdmFtdXMgdHVycGlzIHVybmEsIHRyaXN0aXF1ZSB2aXRhZSB0ZWxsdXMgZWdldCwgbW9sZXN0aWUgZ3JhdmlkYSBhcmN1LiBJbiBlZ2V0IHNhcGllbiBldSBkb2xvciB0aW5jaWR1bnQgZmVybWVudHVtIGV1IHZpdGFlIGVuaW0uIFBoYXNlbGx1cyB1bGxhbWNvcnBlciBlbGl0IGluIHJpc3VzIHRyaXN0aXF1ZSwgYSBlbGVpZmVuZCB1cm5hIGNvbmRpbWVudHVtLiBQZWxsZW50ZXNxdWUgbWF4aW11cyBwb3J0YSBsaWd1bGEsIGlkIHBsYWNlcmF0IG51bmMgdGVtcG9yIHV0LiBOdWxsYW0gYSBsZWN0dXMgYW50ZS4gTW9yYmkgYSBwb3N1ZXJlIHZlbGl0LiBGdXNjZSBhYyBtZXR1cyBzZW1wZXIsIHNjZWxlcmlzcXVlIGVuaW0gc2l0IGFtZXQsIGVsZWlmZW5kIGVzdC4gTnVsbGFtIGEgZXJhdCBzaXQgYW1ldCBzYXBpZW4gcnV0cnVtIHRyaXN0aXF1ZS4gQ3JhcyB1dCBvZGlvIGV0IG5pc2kgbWF4aW11cyB2aXZlcnJhIHNpdCBhbWV0IHV0IHNlbS4gRG9uZWMgbmlzaSBpcHN1bSwgYWxpcXVhbSBpZCBuaXNpIHZlbCwgY29udmFsbGlzIGNvbnNlY3RldHVyIGxhY3VzLg0KDQpVdCBlcmF0IGF1Z3VlLCB0aW5jaWR1bnQgaWQgbW9sZXN0aWUgZXQsIHBvcnR0aXRvciB2ZWwgZXJhdC4gQ3JhcyB2ZWwgbmlzaSBldCBhdWd1ZSBibGFuZGl0IGZhY2lsaXNpcy4gTnVsbGFtIHRpbmNpZHVudCBwb3N1ZXJlIGxhb3JlZXQuIEFlbmVhbiByaXN1cyBtYXNzYSwgbHVjdHVzIHF1aXMgZXVpc21vZCBydXRydW0sIGJsYW5kaXQgaWQgbmliaC4gRG9uZWMgdWx0cmljaWVzLCBlcm9zIGVnZXQgbWF4aW11cyB2aXZlcnJhLCBzYXBpZW4gYXJjdSBmYXVjaWJ1cyBvZGlvLCBldSB2YXJpdXMgbG9yZW0gZHVpIGF0IGxpZ3VsYS4gUHJvaW4gZWdldCBudWxsYSB2ZWwgdG9ydG9yIGFsaXF1YW0gb3JuYXJlIHNpdCBhbWV0IHZlbCBtYXNzYS4gUGVsbGVudGVzcXVlIGNvbW1vZG8gYW50ZSBhcmN1LCBldSBhdWN0b3IgbmlzbCB2aXZlcnJhIHV0Lg0KDQpTZWQgdmFyaXVzIGR1aSBldSBsZWN0dXMgZmV1Z2lhdCwgaWQgc2VtcGVyIG1hdXJpcyBjdXJzdXMuIFBlbGxlbnRlc3F1ZSBtYXhpbXVzIHVybmEgbmliaCwgZXUgY29udmFsbGlzIGZlbGlzIHZlbmVuYXRpcyBhLiBNYXVyaXMgdmFyaXVzIGltcGVyZGlldCBuaXNpLCBpbiBzY2VsZXJpc3F1ZSBsaWJlcm8gY29uZ3VlIGxhb3JlZXQuIFBoYXNlbGx1cyBhIGVsaXQgbWFzc2EuIEN1cmFiaXR1ciBwb3J0dGl0b3IgbWFnbmEgZWdldCBmYWNpbGlzaXMgdGVtcHVzLiBNYXVyaXMgZWdldCBzYXBpZW4gYXQganVzdG8gcGhhcmV0cmEgY29uc2VxdWF0LiBQcmFlc2VudCBzYXBpZW4gdmVsaXQsIHB1bHZpbmFyIHZlbCBzZW0gYXQsIGlhY3VsaXMgYWxpcXVldCBpcHN1bS4gRHVpcyB0ZW1wb3IgZWxpdCBzYXBpZW4uIFZlc3RpYnVsdW0gZXN0IGxvcmVtLCBpbnRlcmR1bSBhdCB0aW5jaWR1bnQgdml0YWUsIGZyaW5naWxsYSBpbiBsaWJlcm8uIE51bGxhIGZhY2lsaXNpcyBldSB0ZWxsdXMgc2VkIHNjZWxlcmlzcXVlLiBEdWlzIHF1aXMgYXJjdSBwb3N1ZXJlLCBtb2xsaXMgZWxpdCBuZWMsIHZlc3RpYnVsdW0gZGlhbS4gRG9uZWMgdXQgc2FnaXR0aXMgbWFzc2EuIE1hZWNlbmFzIGFjIGZhdWNpYnVzIGVuaW0uDQoNClBoYXNlbGx1cyBldCBvZGlvIHN1c2NpcGl0LCBpbXBlcmRpZXQgcmlzdXMgbm9uLCB1bHRyaWNlcyBtYXNzYS4gTmFtIHRpbmNpZHVudCBxdWlzIHNlbSBxdWlzIGNvbmRpbWVudHVtLiBBZW5lYW4gcGxhY2VyYXQgdml0YWUgcmlzdXMgdmVsIHRpbmNpZHVudC4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBJbiBmcmluZ2lsbGEgaGVuZHJlcml0IG5pc2wsIHNlbXBlciBibGFuZGl0IGlwc3VtIGRpY3R1bSB2aXRhZS4gU3VzcGVuZGlzc2UgcG9zdWVyZSBzYWdpdHRpcyBuaXNpLCBpbiBsdWN0dXMgbG9yZW0gdGluY2lkdW50IGlkLiBDcmFzIHF1aXMgZXJvcyBldSBwdXJ1cyBpbXBlcmRpZXQgZWdlc3RhcyBpbiBhYyBlbGl0Lg0KDQpGdXNjZSBldSBvZGlvIGRvbG9yLiBBZW5lYW4gZGljdHVtIHRvcnRvciBudW5jLCBhYyBwcmV0aXVtIG1ldHVzIGZhdWNpYnVzIHF1aXMuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIENyYXMgbm9uIGxlbyBzZW0uIFF1aXNxdWUgdml0YWUgZW5pbSB2ZWwgZWxpdCB2b2x1dHBhdCBncmF2aWRhIHV0IHRlbXB1cyBlcm9zLiBFdGlhbSBldSBlbmltIHRyaXN0aXF1ZSwgbHVjdHVzIGxlY3R1cyBlZ2V0LCBsdWN0dXMgbnVuYy4gRnVzY2Ugc29sbGljaXR1ZGluLCBuaXNpIG5lYyBkaWduaXNzaW0gZWZmaWNpdHVyLCBqdXN0byBsZWN0dXMgdWx0cmljaWVzIGRpYW0sIHNpdCBhbWV0IHZhcml1cyBlcmF0IG51bmMgdXQgbWV0dXMuIERvbmVjIGVnZXN0YXMgZG9sb3IgdmVsIGxlY3R1cyBsYW9yZWV0LCBub24gY29tbW9kbyBudWxsYSBpYWN1bGlzLiBWZXN0aWJ1bHVtIGRpZ25pc3NpbSB2ZWwgYXVndWUgbm9uIGNvbmd1ZS4gTnVuYyBjb25zZXF1YXQgZXJvcyBpbiBpcHN1bSBtb2xsaXMgdGluY2lkdW50LiBJbnRlZ2VyIHZvbHV0cGF0IGV0IG1ldHVzIHZpdGFlIHBvcnR0aXRvci4NCg0KTnVsbGFtIGx1Y3R1cyB0ZWxsdXMgZXUgZWZmaWNpdHVyIHZpdmVycmEuIE51bGxhIGV0IGFsaXF1ZXQgYW50ZS4gRG9uZWMgZmluaWJ1cyBzaXQgYW1ldCBlbGl0IHV0IHNvZGFsZXMuIENyYXMgZWdldCBlbGl0IGlkIG9yY2kgc29sbGljaXR1ZGluIGZpbmlidXMuIE51bGxhIGVuaW0gbWF1cmlzLCBydXRydW0gcXVpcyBlbmltIGNvbmRpbWVudHVtLCBlZ2VzdGFzIGNvbmRpbWVudHVtIG1hZ25hLiBOYW0gbW9sZXN0aWUgZGlnbmlzc2ltIHZlc3RpYnVsdW0uIEFlbmVhbiBpbiBuaXNsIGxvYm9ydGlzLCB2aXZlcnJhIGRvbG9yIHF1aXMsIG1hdHRpcyBsaWJlcm8uIFN1c3BlbmRpc3NlIGV0IGxpYmVybyBmZXVnaWF0LCBwaGFyZXRyYSBlc3Qgc2VkLCBzY2VsZXJpc3F1ZSBhcmN1LiBQZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzIGV0IG5ldHVzIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3Rhcy4gRnVzY2Ugc2l0IGFtZXQgbWFnbmEgcXVpcyBmZWxpcyBlZ2VzdGFzIHNhZ2l0dGlzIG5lYyBhIG1pLiBNb3JiaSBlZ2V0IHZlbmVuYXRpcyBleC4gUGhhc2VsbHVzIGNvbmRpbWVudHVtLCB2ZWxpdCB2ZWwgY29uZ3VlIGJsYW5kaXQsIGp1c3RvIHJpc3VzIGVmZmljaXR1ciBzYXBpZW4sIGEgb3JuYXJlIGxlY3R1cyBxdWFtIHV0IGxhY3VzLiBFdGlhbSBlZmZpY2l0dXIgbG9yZW0gbGFjaW5pYSByaG9uY3VzIGNvbmd1ZS4NCg0KVml2YW11cyBvcm5hcmUgYXJjdSBsZW8sIHF1aXMgZWxlaWZlbmQgbWFnbmEgcmhvbmN1cyBlZ2V0LiBRdWlzcXVlIHRyaXN0aXF1ZSBtYXhpbXVzIGRhcGlidXMuIE1hdXJpcyBuaWJoIGxlbywgZWZmaWNpdHVyIGFjIHBlbGxlbnRlc3F1ZSBuZWMsIGZlcm1lbnR1bSBpZCB0ZWxsdXMuIERvbmVjIGV1IGVnZXN0YXMgbGVvLCBhIHRyaXN0aXF1ZSBvcmNpLiBRdWlzcXVlIGVzdCBlbmltLCBzb2xsaWNpdHVkaW4gaW4gcGVsbGVudGVzcXVlIHZpdGFlLCBjb25kaW1lbnR1bSB2ZWwgb3JjaS4gUGhhc2VsbHVzIHRlbXBvciBhbnRlIHR1cnBpcy4gVmVzdGlidWx1bSBsaWd1bGEgZGlhbSwgZWdlc3RhcyBlZ2V0IHNvZGFsZXMgaWQsIGZyaW5naWxsYSB2ZWwgZG9sb3IuIE1vcmJpIG5lYyBkb2xvciBuaWJoLiBWZXN0aWJ1bHVtIGV0IGN1cnN1cyBsZW8uIEV0aWFtIHNhcGllbiBqdXN0bywgYXVjdG9yIGF0IHVsdHJpY2llcyBlZ2V0LCBwb3J0YSBldCB1cm5hLiBGdXNjZSB0aW5jaWR1bnQgcG9ydHRpdG9yIGRvbG9yLCBuZWMgZ3JhdmlkYSBhcmN1IHBvcnRhIGEuDQoNCk1hZWNlbmFzIHNhZ2l0dGlzIHRpbmNpZHVudCB0dXJwaXMsIHNpdCBhbWV0IGZpbmlidXMgbGliZXJvIHVsbGFtY29ycGVyIHNlZC4gTmFtIHF1aXMgY29uc2VxdWF0IG1hZ25hLiBQcmFlc2VudCBvcm5hcmUsIG9yY2kgbGFjaW5pYSBkaWN0dW0gdml2ZXJyYSwgZXJhdCBqdXN0byBldWlzbW9kIGxlY3R1cywgYmliZW5kdW0gcHJldGl1bSBuZXF1ZSBkb2xvciB2ZWwgbnVuYy4gTnVuYyBhdCBlbGl0IHV0IG51bGxhIGN1cnN1cyBtb2xlc3RpZS4gRXRpYW0gZ3JhdmlkYSBmZWxpcyBhIG51bGxhIHB1bHZpbmFyIHZpdmVycmEuIE51bmMgdWx0cmljaWVzLCBsaWd1bGEgYXQgbGFjaW5pYSBmZXVnaWF0LCBlbGl0IGV4IGdyYXZpZGEgbnVsbGEsIHZlbCBlZmZpY2l0dXIgZXggYXVndWUgdml0YWUgbWkuIFByYWVzZW50IHZlc3RpYnVsdW0gc2VtIG5lYyBkaWFtIHRpbmNpZHVudCwgYXQgcHVsdmluYXIgYW50ZSBwb3J0YS4gRG9uZWMgbmVjIGZpbmlidXMgZXgsIHB1bHZpbmFyIHBoYXJldHJhIHF1YW0uIFZlc3RpYnVsdW0gdGluY2lkdW50IHRvcnRvciBlZ2V0IHRlbXBvciByaG9uY3VzLiBJbiBlZ2VzdGFzIGFjIG1ldHVzIGVnZXQgY29uZ3VlLiBQZWxsZW50ZXNxdWUgbWF0dGlzIGVnZXN0YXMgbnVsbGEgdXQgYmliZW5kdW0uIFF1aXNxdWUgY29uc2VxdWF0IGFyY3UgaW4gb2RpbyB2ZXN0aWJ1bHVtLCBlZ2V0IG1heGltdXMgcXVhbSBwb3N1ZXJlLg0KDQpTZWQgZmV1Z2lhdCBsZW8gdml0YWUgZmV1Z2lhdCBpYWN1bGlzLiBOdW5jIHNpdCBhbWV0IGFyY3UgZGlnbmlzc2ltIGVyYXQgdGVtcHVzIGVsZW1lbnR1bSBpZCBzZWQgbWkuIE1vcmJpIGVnZXQgb2RpbyBldCBlcmF0IGFjY3Vtc2FuIHNvbGxpY2l0dWRpbi4gUHJvaW4gdXJuYSBuZXF1ZSwgbWF4aW11cyBldCBhbGlxdWV0IGFjLCBtYWxlc3VhZGEgaWQgbWF1cmlzLiBRdWlzcXVlIGEgbGFjdXMgc2NlbGVyaXNxdWUsIGdyYXZpZGEgb3JjaSB2ZWwsIHRlbXB1cyBmZWxpcy4gTmFtIG1heGltdXMgdml0YWUgZW5pbSBuZWMgdGVtcHVzLiBOYW0gdmFyaXVzIG51bGxhIGlkIHRpbmNpZHVudCBjb21tb2RvLiBTZWQgYmliZW5kdW0sIGxpZ3VsYSBub24gbWF4aW11cyBzZW1wZXIsIG5pc2kgdGVsbHVzIGNvbmRpbWVudHVtIGV4LCB2ZWwgc2NlbGVyaXNxdWUgbmlzaSBlc3QgZWdldCBlbGl0LiBEdWlzIGEgZHVpIG1ldHVzLiBOdWxsYSBhbGlxdWV0IHRpbmNpZHVudCBsZW8sIHZlbCBjb25zZWN0ZXR1ciBsb3JlbSBsYW9yZWV0IHZlbC4gRnVzY2Ugc29kYWxlcyBhbGlxdWV0IG5pc2kuIFByYWVzZW50IHRvcnRvciBsb3JlbSwgdHJpc3RpcXVlIG5vbiBiaWJlbmR1bSBkaWduaXNzaW0sIHNvZGFsZXMgcXVpcyBvcmNpLiBQZWxsZW50ZXNxdWUgdnVscHV0YXRlIHRvcnRvciBkb2xvciwgZXQgcG9zdWVyZSBuaXNpIHNvbGxpY2l0dWRpbiB2aXRhZS4gQWVuZWFuIHBvcnR0aXRvciBuaWJoIGlkIG5lcXVlIHBvc3VlcmUgY29uc2VjdGV0dXIuIFBoYXNlbGx1cyB2aXRhZSBzZW0gb3JjaS4gRG9uZWMgY29uZGltZW50dW0gZ3JhdmlkYSBsaWd1bGEsIGV0IGF1Y3RvciBuaXNpIGNvbmRpbWVudHVtIG5vbi4NCg0KTnVsbGFtIGFjIG1pIGVzdC4gU2VkIHByZXRpdW0gbGVjdHVzIHZpdGFlIG1pIGVsZW1lbnR1bSwgbW9sZXN0aWUgdWxsYW1jb3JwZXIgZHVpIGxvYm9ydGlzLiBWaXZhbXVzIGVnZXQgYmxhbmRpdCBtZXR1cywgdXQgZmF1Y2lidXMgdG9ydG9yLiBOdW5jIGZldWdpYXQgYXVndWUgdXJuYSwgZWdldCBwbGFjZXJhdCB0ZWxsdXMgYXVjdG9yIGlkLiBEb25lYyBpZCBhbnRlIGJpYmVuZHVtLCBwdWx2aW5hciBkaWFtIHZpdGFlLCB2YXJpdXMgZGlhbS4gUHJhZXNlbnQgaW4gdHVycGlzIHNhZ2l0dGlzLCBzYWdpdHRpcyBvZGlvIHZlbCwgcGxhY2VyYXQgbWFzc2EuIFBoYXNlbGx1cyBldSBjb252YWxsaXMgZXJvcy4gQWVuZWFuIGF1Y3RvciBpZCBtYXVyaXMgdXQgZmluaWJ1cy4gQ3JhcyBlbGVtZW50dW0gdHVycGlzIGluIG5lcXVlIHJ1dHJ1bSwgbm9uIGVnZXN0YXMgZG9sb3IgdWx0cmljaWVzLiBNb3JiaSBwdXJ1cyBhbnRlLCBtYXhpbXVzIHNlZCBlcmF0IHNpdCBhbWV0LCBydXRydW0gZmVybWVudHVtIGxvcmVtLiBGdXNjZSBldSBkdWkgYWMgbG9yZW0gY29udmFsbGlzIHB1bHZpbmFyLiBGdXNjZSBhYyB1bHRyaWNpZXMgdHVycGlzLiBWaXZhbXVzIGV1IGxvcmVtIHZlaGljdWxhLCBmYXVjaWJ1cyBzZW0gbm9uLCBsb2JvcnRpcyBsaWJlcm8uDQoNCkN1cmFiaXR1ciBmcmluZ2lsbGEgbW9sZXN0aWUgbGVjdHVzIGV1IHNlbXBlci4gRHVpcyBtZXR1cyBlbmltLCBwbGFjZXJhdCBhdCBzb2RhbGVzIGV1LCBjdXJzdXMgYXQgdmVsaXQuIE5hbSBhbGlxdWV0IGFyY3UgdXQgbGlndWxhIGdyYXZpZGEgdm9sdXRwYXQuIE5hbSBsYW9yZWV0IG1hdXJpcyB0dXJwaXMsIGV0IHBvcnR0aXRvciBuaXNsIHRpbmNpZHVudCBldS4gRG9uZWMgZWxlaWZlbmQsIHZlbGl0IGlhY3VsaXMgcHJldGl1bSB0aW5jaWR1bnQsIGVyYXQgYXJjdSBkaWduaXNzaW0gbGFjdXMsIGlkIGFsaXF1YW0gZHVpIG1hc3NhIGluIGV4LiBGdXNjZSB2b2x1dHBhdCBwdXJ1cyBldSBwb3J0YSBwdWx2aW5hci4gQ3VyYWJpdHVyIGZlcm1lbnR1bSB0b3J0b3IgcXVpcyBtZXR1cyBwbGFjZXJhdCwgbm9uIHZlaGljdWxhIGF1Z3VlIGZldWdpYXQuDQoNCkV0aWFtIHVybmEgb2RpbywgdmFyaXVzIG5vbiBlcm9zIHF1aXMsIGxvYm9ydGlzIGNvbW1vZG8gbWFzc2EuIFV0IGlwc3VtIHJpc3VzLCBlbGVpZmVuZCBhYyB2aXZlcnJhIGV0LCB2ZXN0aWJ1bHVtIHZlbCBmZWxpcy4gVXQgY29uc2VjdGV0dXIgbGlndWxhIG1pLiBQcm9pbiBmcmluZ2lsbGEgZWxpdCBlZ2V0IHRlbGx1cyB2b2x1dHBhdCwgbmVjIHB1bHZpbmFyIG1pIHVsdHJpY2llcy4gVml2YW11cyBpZCBpbnRlcmR1bSB2ZWxpdC4gU2VkIHBlbGxlbnRlc3F1ZSBsb3JlbSBwZWxsZW50ZXNxdWUgZWxpdCB1bGxhbWNvcnBlciwgc2FnaXR0aXMgZGFwaWJ1cyBpcHN1bSBsYW9yZWV0LiBVdCBwaGFyZXRyYSBibGFuZGl0IGxlY3R1cyBpbiBsdWN0dXMuIER1aXMgZXUgbWFzc2EgZWxlbWVudHVtLCB1bGxhbWNvcnBlciBzZW0gdXQsIHBvcnRhIG5pc2kuIEN1cmFiaXR1ciB2ZW5lbmF0aXMgbmVjIGZlbGlzIHZlbCBiaWJlbmR1bS4gVmVzdGlidWx1bSBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldCB1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7IE51bmMgbWFzc2EgbGVvLCBoZW5kcmVyaXQgc2NlbGVyaXNxdWUgZWxlbWVudHVtIGEsIGRpZ25pc3NpbSBpZCB2ZWxpdC4gUXVpc3F1ZSBjb25ndWUgcHVydXMgaW4gZWxpdCBwcmV0aXVtIGFsaXF1ZXQuIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQgdWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOyBRdWlzcXVlIHZlbCBlcm9zIGFsaXF1ZXQganVzdG8gbHVjdHVzIGxvYm9ydGlzIGF0IHNpdCBhbWV0IGVuaW0uDQoNCkZ1c2NlIGlkIGR1aSBncmF2aWRhLCB1bGxhbWNvcnBlciBtYXNzYSBzaXQgYW1ldCwgZnJpbmdpbGxhIG1hdXJpcy4gTnVsbGEgYmliZW5kdW0gZXJhdCBleCwgZXQgdGluY2lkdW50IG9kaW8gbWF4aW11cyBzZWQuIER1aXMgbmVjIGFyY3UgZXN0LiBOdWxsYW0gaGVuZHJlcml0IHR1cnBpcyBldCBsYW9yZWV0IHRpbmNpZHVudC4gTWF1cmlzIGN1cnN1cyBuaXNpIG5lYyBpbXBlcmRpZXQgdml2ZXJyYS4gUGhhc2VsbHVzIGFjIHNvZGFsZXMgZWxpdC4gRG9uZWMgZmVybWVudHVtIHJpc3VzIHF1aXMgY29uc2VxdWF0IHNlbXBlci4NCg0KUHJvaW4gbWFnbmEgdG9ydG9yLCB2ZW5lbmF0aXMgYSBlbGVtZW50dW0gc2l0IGFtZXQsIGF1Y3RvciBub24gdGVsbHVzLiBTdXNwZW5kaXNzZSBlZmZpY2l0dXIgZWdldCBqdXN0byBub24gdm9sdXRwYXQuIFN1c3BlbmRpc3NlIHV0IHJob25jdXMgbGlndWxhLCBpbiBjb25kaW1lbnR1bSB1cm5hLiBTdXNwZW5kaXNzZSB0aW5jaWR1bnQgbmlzaSBuaXNpLCB2ZWwgY29uc2VjdGV0dXIgcHVydXMgZGlnbmlzc2ltIHV0LiBOYW0gaW4gZGlhbSBwb3J0YSwgdGVtcG9yIGxvcmVtIGluLCBsb2JvcnRpcyBuaWJoLiBTZWQgZmVybWVudHVtIGRvbG9yIG5lYyBtYXVyaXMgdmVoaWN1bGEsIGluIGRpY3R1bSBuaXNsIHRpbmNpZHVudC4gVXQgdXQgbGliZXJvIG1vbGVzdGllLCBwcmV0aXVtIG5pc2kgbW9sZXN0aWUsIGRpZ25pc3NpbSBsaWd1bGEuIERvbmVjIGZlcm1lbnR1bSBvZGlvIG5lYyBlcm9zIGF1Y3RvciBzZW1wZXIuIFBoYXNlbGx1cyB2aXRhZSByaG9uY3VzIGp1c3RvLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNpYnVzIG9yY2kgbHVjdHVzIGV0IHVsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTsgRHVpcyBzZWQgcnV0cnVtIGVsaXQuDQoNClByb2luIG5vbiBzZW1wZXIgbmVxdWUuIE51bGxhbSBwbGFjZXJhdCBsb3JlbSB1dCBhdWN0b3IgaGVuZHJlcml0LiBNYXVyaXMgbmVjIGxhY3VzIG9yY2kuIE51bGxhbSBtb2xsaXMgc2l0IGFtZXQgbG9yZW0gbmVjIHZlc3RpYnVsdW0uIFByb2luIHJpc3VzIHNlbSwgZWdlc3RhcyBpbiBmYXVjaWJ1cyBzaXQgYW1ldCwgaGVuZHJlcml0IHNlZCBkdWkuIFBoYXNlbGx1cyBhYyBsb2JvcnRpcyBtZXR1cy4gRG9uZWMgYWxpcXVldCB0ZW1wb3IgZmVsaXMgc2VkIGVnZXN0YXMuIEN1cmFiaXR1ciBjdXJzdXMgcXVhbSBldSBkb2xvciB0cmlzdGlxdWUgdmVuZW5hdGlzLiBOdWxsYW0gbG9ib3J0aXMsIG5pc2wgaW4gdWx0cmljaWVzIHNhZ2l0dGlzLCBvcmNpIHZlbGl0IHVsbGFtY29ycGVyIG1hdXJpcywgdml0YWUgc2NlbGVyaXNxdWUgbGVvIG9yY2kgbm9uIHB1cnVzLiBQcm9pbiBwb3J0dGl0b3IgbmliaCBkaWFtLCBub24gZWdlc3RhcyBhdWd1ZSBjb25kaW1lbnR1bSBuZWMuDQoNCkV0aWFtIHF1aXMgbW9sbGlzIG1hdXJpcy4gTW9yYmkgc2FnaXR0aXMgYXJjdSBlcm9zLCBpZCBkYXBpYnVzIGxvcmVtIGZyaW5naWxsYSBwdWx2aW5hci4gTW9yYmkgY29uc2VjdGV0dXIgb2RpbyBpZCBleCBldWlzbW9kIHNjZWxlcmlzcXVlLiBNYWVjZW5hcyBhIG5pc2kgcXVpcyBlcm9zIHVsbGFtY29ycGVyIHBsYWNlcmF0IHV0IGFsaXF1ZXQgZW5pbS4gUGVsbGVudGVzcXVlIG9ybmFyZSBudW5jIHNpdCBhbWV0IHBsYWNlcmF0IHJ1dHJ1bS4gTWF1cmlzIGN1cnN1cyB1cm5hIHNvbGxpY2l0dWRpbiBjb21tb2RvIG1vbGxpcy4gTmFtIG9kaW8gb2RpbywgZmV1Z2lhdCBhIGRhcGlidXMgdXQsIHZvbHV0cGF0IHF1aXMgcmlzdXMuIER1aXMgdXQgYXVjdG9yIGVyYXQuIE51bmMgcXVpcyBmYXVjaWJ1cyBhcmN1LCBub24gY29uZGltZW50dW0gc2FwaWVuLiBTdXNwZW5kaXNzZSBwb3J0dGl0b3IsIHRvcnRvciBtb2xsaXMgc2VtcGVyIGhlbmRyZXJpdCwgZXN0IGRvbG9yIHZ1bHB1dGF0ZSBlcm9zLCBhdCBmaW5pYnVzIGxlbyBmZWxpcyBzZWQgZGlhbS4gRHVpcyB1bGxhbWNvcnBlciBsZW8gYSBmYXVjaWJ1cyBydXRydW0uIEV0aWFtIHByZXRpdW0gZXN0IGV0IHB1cnVzIHBvcnR0aXRvciwgZWdldCB2aXZlcnJhIGxvcmVtIHNvbGxpY2l0dWRpbi4gTWFlY2VuYXMgbm9uIG5pc2wgZG9sb3IuIE51bGxhbSB1bGxhbWNvcnBlciBpcHN1bSB1cm5hLCB2aXRhZSBjb25zZXF1YXQgZXJhdCBlbGVpZmVuZCBpZC4gUHJvaW4gYmliZW5kdW0gdXJuYSB2ZWwgbmlzaSBjdXJzdXMgcGxhY2VyYXQuDQoNCkN1cmFiaXR1ciBuZWMgbG9yZW0gYmxhbmRpdCwgc3VzY2lwaXQgZXN0IG5lYywgZWxlbWVudHVtIHZlbGl0LiBEdWlzIHNvZGFsZXMgcHVydXMgbm9uIGxhY3VzIHZlbmVuYXRpcywgbmVjIGVnZXN0YXMgZGlhbSBsdWN0dXMuIE51bGxhIHNlZCB0cmlzdGlxdWUgbnVsbGEuIERvbmVjIHVsbGFtY29ycGVyIGFudGUgdXQgbnVsbGEgc2VtcGVyLCB2aXRhZSBwb3N1ZXJlIGVyYXQgcG9ydHRpdG9yLiBQcm9pbiBkYXBpYnVzIGNvbnNlY3RldHVyIHRpbmNpZHVudC4gVmVzdGlidWx1bSBydXRydW0gYXJjdSBzaXQgYW1ldCBpbXBlcmRpZXQgYWxpcXVldC4gUGhhc2VsbHVzIHNlZCBtZXR1cyB1bGxhbWNvcnBlciwgdGluY2lkdW50IG5lcXVlIGV1LCB0aW5jaWR1bnQgcmlzdXMuIFV0IGVmZmljaXR1ciBwdXJ1cyBzZW0sIGVnZXQgZ3JhdmlkYSBsaWd1bGEgYXVjdG9yIG5vbi4gUHJhZXNlbnQgbmliaCBqdXN0bywgb3JuYXJlIGlkIGludGVyZHVtIHF1aXMsIHByZXRpdW0gYXQgZmVsaXMuIE1hdXJpcyB0ZW1wb3IgZXQgcmlzdXMgc2VkIGZldWdpYXQuDQoNClF1aXNxdWUgZWZmaWNpdHVyIG51bGxhIG9kaW8sIG5vbiBhbGlxdWV0IG1ldHVzIG1heGltdXMgc2l0IGFtZXQuIFBlbGxlbnRlc3F1ZSBjb21tb2RvIHNlbXBlciBjb21tb2RvLiBNYWVjZW5hcyBhdCBtYWxlc3VhZGEgbGVvLCBpZCBwb3J0dGl0b3Igc2VtLiBTZWQgZXQgZXggZmVybWVudHVtLCByaG9uY3VzIGxlbyB2ZWwsIGFjY3Vtc2FuIG5pc2wuIFNlZCB2dWxwdXRhdGUgbnVuYyBub24gaWFjdWxpcyBiaWJlbmR1bS4gU2VkIG5lYyBkb2xvciBlcmF0LiBWZXN0aWJ1bHVtIGRpY3R1bSwgc2VtIGV1IG1hdHRpcyBlbGVtZW50dW0sIGFudGUgZXJhdCBhY2N1bXNhbiBsaWJlcm8sIG5lYyBlZ2VzdGFzIHVybmEgbGVvIHF1aXMgbGFjdXMuIER1aXMgb3JuYXJlIGltcGVyZGlldCB2YXJpdXMuIFByYWVzZW50IGxhY2luaWEgbHVjdHVzIHNhcGllbiBhIGdyYXZpZGEuIFBoYXNlbGx1cyBub24gcHVydXMgYWMgZXJvcyBzY2VsZXJpc3F1ZSBsdWN0dXMuIEluIGhhYyBoYWJpdGFzc2UgcGxhdGVhIGRpY3R1bXN0LiBNYXVyaXMgZ3JhdmlkYSBwcmV0aXVtIGV4LCBlZ2V0IGdyYXZpZGEgbWF1cmlzIGJsYW5kaXQgaW1wZXJkaWV0LiBQcmFlc2VudCBzYXBpZW4gc2FwaWVuLCB2b2x1dHBhdCBjb25ndWUgdnVscHV0YXRlIGluLCBzZW1wZXIgbm9uIHB1cnVzLg0KDQpOYW0gc2VkIHR1cnBpcyBkaWFtLiBNYXVyaXMgcmhvbmN1cyBpbnRlcmR1bSBsaWd1bGEsIGEgZWxlaWZlbmQgbmlzaSBoZW5kcmVyaXQgYS4gU3VzcGVuZGlzc2UgcG90ZW50aS4gTnVuYyBkaWduaXNzaW0sIGZlbGlzIHV0IHN1c2NpcGl0IHZlbmVuYXRpcywgc2FwaWVuIHR1cnBpcyBjb25kaW1lbnR1bSBpcHN1bSwgYSBjb25zZWN0ZXR1ciBkb2xvciBvcmNpIGVnZXQgZWxpdC4gTnVsbGFtIHF1aXMgb2RpbyB2ZWwgZGlhbSBmaW5pYnVzIGN1cnN1cy4gRHVpcyB0aW5jaWR1bnQgbGlndWxhIGV1IG1hc3NhIGNvbW1vZG8gZGlnbmlzc2ltLiBNb3JiaSBuaWJoIGxlY3R1cywgcG9ydHRpdG9yIGV0IGVsaXQgYSwgcGxhY2VyYXQgaWFjdWxpcyBsaWJlcm8uIFNlZCBkaWN0dW0gbGlndWxhIG5vbiBxdWFtIGRhcGlidXMgcG9zdWVyZS4NCg0KRG9uZWMgYXVjdG9yIHBoYXJldHJhIG1hZ25hIHNlZCBhbGlxdWV0LiBNYXVyaXMgcG9ydHRpdG9yLCBtaSBldSBwbGFjZXJhdCBhdWN0b3IsIHNlbSB0ZWxsdXMgbGFvcmVldCB0b3J0b3IsIGF0IHZhcml1cyB2ZWxpdCBvcmNpIGFjIHB1cnVzLiBOYW0gbmVjIG1pIHZlaGljdWxhIHR1cnBpcyB2ZXN0aWJ1bHVtIHRpbmNpZHVudC4gQ3JhcyB1dCBvcmNpIGx1Y3R1cywgcmhvbmN1cyBlbGl0IG1vbGxpcywgZnJpbmdpbGxhIGxlby4gRG9uZWMgcHVsdmluYXIgdmFyaXVzIGV1aXNtb2QuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBNYWVjZW5hcyBzaXQgYW1ldCBkaWN0dW0gYXJjdSwgdml0YWUgZmFjaWxpc2lzIHNlbS4gUHJvaW4gaW4gaXBzdW0gZXVpc21vZCBmZWxpcyBtYWxlc3VhZGEgdmVzdGlidWx1bSBuZWMgaW4gdXJuYS4gTWFlY2VuYXMgY29tbW9kbyBydXRydW0gYWNjdW1zYW4uIE1hZWNlbmFzIHNpdCBhbWV0IHNjZWxlcmlzcXVlIG5pc2kuDQoNClNlZCBhYyBleCB2ZW5lbmF0aXMgbGVjdHVzIHNhZ2l0dGlzIHByZXRpdW0gdml0YWUgZWdldCBkb2xvci4gU2VkIHF1aXMgZGlhbSBjb25ndWUsIG1heGltdXMgYXJjdSBhdCwgZnJpbmdpbGxhIGxpZ3VsYS4gTWFlY2VuYXMgZXUgdGluY2lkdW50IGp1c3RvLCBhYyBydXRydW0gZXguIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQgdWx0cmljZXMgcG9zdWVyZSBjdWJpbGlhIEN1cmFlOyBFdGlhbSBpcHN1bSBsaWJlcm8sIHBvcnR0aXRvciBuZWMgdGluY2lkdW50IHNlZCwgdmFyaXVzIG5vbiB2ZWxpdC4gRnVzY2UgbGlndWxhIGRpYW0sIG9ybmFyZSBuZWMgdWx0cmljZXMgZXQsIHNvbGxpY2l0dWRpbiB2ZWwgbGVvLiBJbnRlZ2VyIGVnZXQgaGVuZHJlcml0IGxpYmVyby4gRnVzY2UgbHVjdHVzIG1hdXJpcyBzaXQgYW1ldCBhcmN1IHRlbXBvciBzdXNjaXBpdC4gU3VzcGVuZGlzc2Ugdm9sdXRwYXQgYXJjdSBlZ2V0IGV4IGNvbmRpbWVudHVtLCB1dCBncmF2aWRhIHVybmEgcGxhY2VyYXQuIFNlZCBzYWdpdHRpcyBtYXhpbXVzIHBvcnRhLiBFdGlhbSBzZWQgbnVsbGEgbW9sbGlzLCBtb2xsaXMgbGVjdHVzIHZpdGFlLCBmZXVnaWF0IGxlY3R1cy4gUHJvaW4gdHJpc3RpcXVlIHF1YW0gdmVsIGZpbmlidXMgY29tbW9kby4gU2VkIHVsbGFtY29ycGVyIHNhcGllbiBhYyB2ZXN0aWJ1bHVtIG9ybmFyZS4NCg0KUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuIEV0aWFtIHZlbCBtYWxlc3VhZGEgZHVpLCBzZWQgc29kYWxlcyBsaWd1bGEuIEludGVnZXIgZXN0IGp1c3RvLCBmZXJtZW50dW0gaWQgc3VzY2lwaXQgYWMsIHRyaXN0aXF1ZSBhdCBudW5jLiBNYWVjZW5hcyBzY2VsZXJpc3F1ZSBpYWN1bGlzIHVsdHJpY2llcy4gRG9uZWMgZWdldCB2dWxwdXRhdGUgbGVvLCBsdWN0dXMgaGVuZHJlcml0IHR1cnBpcy4gQWVuZWFuIHZpdGFlIG5pc2wgdXQgYW50ZSBlbGVtZW50dW0gcGhhcmV0cmEgYWMgc2l0IGFtZXQgZXN0LiBBbGlxdWFtIGVyYXQgdm9sdXRwYXQuIFNlZCBzZWQgZXN0IGVnZXN0YXMsIGVnZXN0YXMgZXN0IHZpdGFlLCBjdXJzdXMgZG9sb3IuIEFsaXF1YW0gaWQgZGlhbSBudWxsYS4gTnVuYyB0ZW1wb3IgY29uc2VxdWF0IG9kaW8uIEludGVnZXIgZGljdHVtIGNvbmd1ZSB0ZWxsdXMsIGV1IGx1Y3R1cyBhcmN1IHZ1bHB1dGF0ZSBjdXJzdXMuIER1aXMgcmhvbmN1cyBudW5jIHZlbCBsb3JlbSBtb2xlc3RpZSBtYXR0aXMuIFByb2luIHZ1bHB1dGF0ZSBzZW0gcXVpcyBwb3N1ZXJlIGRpZ25pc3NpbS4NCg0KRXRpYW0gc29sbGljaXR1ZGluIG1hc3NhIGF0IHR1cnBpcyBhbGlxdWFtIHNvZGFsZXMuIFByb2luIGEgZGlhbSByaG9uY3VzLCB0cmlzdGlxdWUgcXVhbSBub24sIHVsdHJpY2llcyBuaWJoLiBTdXNwZW5kaXNzZSBhcmN1IHVybmEsIGx1Y3R1cyBpZCB2YXJpdXMgdml0YWUsIG1heGltdXMgZXUgb2Rpby4gUXVpc3F1ZSBsYW9yZWV0IGZpbmlidXMgdGluY2lkdW50LiBNYWVjZW5hcyBpbnRlcmR1bSwgbGlndWxhIGJpYmVuZHVtIG1vbGxpcyBtYXR0aXMsIGVuaW0gbmlzaSBpYWN1bGlzIG1pLCBpZCBtYXhpbXVzIHVybmEganVzdG8gdmVsIGxpZ3VsYS4gSW50ZWdlciBzZWQgc2VtIHBvc3VlcmUsIHZlc3RpYnVsdW0gdGVsbHVzIHNlZCwgZWxlbWVudHVtIHJpc3VzLiBNYXVyaXMgbWFzc2EgdHVycGlzLCB0aW5jaWR1bnQgZWdldCBtYXNzYSBzZWQsIHRlbXB1cyB0aW5jaWR1bnQgbmVxdWUuIENyYXMgc2NlbGVyaXNxdWUgbWF0dGlzIGxlbywgcGhhcmV0cmEgb3JuYXJlIGRpYW0gbGFvcmVldCBlZ2V0Lg0KDQpQaGFzZWxsdXMgbWF1cmlzIGxpYmVybywgYXVjdG9yIGV1IG1hdHRpcyBhLCBjb25zZWN0ZXR1ciBpbiBmZWxpcy4gRG9uZWMgYXQgbGVvIHNlZCBtYWduYSBkaWduaXNzaW0gY29udmFsbGlzIGlkIGF0IHVybmEuIEFlbmVhbiBleCBkdWksIHNlbXBlciBhYyBkaWFtIHNlZCwgY29uc2VjdGV0dXIgcHVsdmluYXIgc2VtLiBOdW5jIHNpdCBhbWV0IGFudGUgbWFsZXN1YWRhLCBlZ2VzdGFzIG51bGxhIGV1LCBzb2xsaWNpdHVkaW4gbWV0dXMuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cy4gQ3VyYWJpdHVyIGV1IGFyY3UgZWxlbWVudHVtLCB0ZW1wb3IgbWFnbmEgaW4sIGxvYm9ydGlzIGR1aS4gTW9yYmkgYWMgZW5pbSBxdWlzIHNhcGllbiBtb2xlc3RpZSBtb2xlc3RpZS4gTWFlY2VuYXMgZnJpbmdpbGxhIHZvbHV0cGF0IHZlbGl0IGluIGNvbW1vZG8uIE9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsIG5hc2NldHVyIHJpZGljdWx1cyBtdXMuIEFlbmVhbiBtb2xlc3RpZSB1bHRyaWNpZXMgbmlzbCwgYXQgcnV0cnVtIHRlbGx1cyBlZ2VzdGFzIG5vbi4gU2VkIGNvbnNlcXVhdCBzZW0gaWQgYW50ZSBzY2VsZXJpc3F1ZSBjb25ndWUuIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuDQoNClBlbGxlbnRlc3F1ZSBpZCByaXN1cyBzb2xsaWNpdHVkaW4sIGFsaXF1ZXQgbmlzbCBhLCB0cmlzdGlxdWUgbGFjdXMuIFNlZCBtYXVyaXMgbmlzaSwgaGVuZHJlcml0IHZpdGFlIG5pc2wgdmVsLCBkaWN0dW0gdmVzdGlidWx1bSBuaXNsLiBDcmFzIHF1aXMgc2VtcGVyIGVyb3MuIFBoYXNlbGx1cyB1bHRyaWNlcyBwaGFyZXRyYSBsZW8gZXQgaW1wZXJkaWV0LiBBbGlxdWFtIHBlbGxlbnRlc3F1ZSBpbXBlcmRpZXQgdGVsbHVzLCBhYyBkYXBpYnVzIG1hc3NhIGNvbnZhbGxpcyB2ZWwuIEluIGNvbmRpbWVudHVtIHRyaXN0aXF1ZSBsZW8sIHNlZCBlZ2VzdGFzIHRlbGx1cyBhY2N1bXNhbiBldC4gRHVpcyBlbGl0IHZlbGl0LCB1bHRyaWNlcyBhIGxpYmVybyB2aXRhZSwgZmVybWVudHVtIGNvbmRpbWVudHVtIGR1aS4gTmFtIGF0IHVsbGFtY29ycGVyIHRlbGx1cy4gTmFtIGZldWdpYXQgYXJjdSBub24gbGVvIHRpbmNpZHVudCBwbGFjZXJhdC4gVXQgc2l0IGFtZXQgc2FwaWVuIGxhY2luaWEsIGNvbnZhbGxpcyBuaXNsIGluLCB0cmlzdGlxdWUgZXN0LiBQaGFzZWxsdXMgZWxlaWZlbmQgZXVpc21vZCBwaGFyZXRyYS4gQWxpcXVhbSBzZWQgaXBzdW0gZWxlaWZlbmQsIHVsbGFtY29ycGVyIHRvcnRvciBpbiwgcHJldGl1bSBzYXBpZW4uIEV0aWFtIGp1c3RvIG1hc3NhLCBzdXNjaXBpdCBldCByaXN1cyBpZCwgcGVsbGVudGVzcXVlIHBvcnRhIGxlY3R1cy4gVXQgY29uc2VxdWF0IGV4IHNlZCBxdWFtIHBlbGxlbnRlc3F1ZSBsYW9yZWV0LiBRdWlzcXVlIHZ1bHB1dGF0ZSBvcm5hcmUgZGlnbmlzc2ltLg0KDQpEb25lYyB2dWxwdXRhdGUgbmVjIG9yY2kgYSBjb25zZXF1YXQuIEluIGVsZWlmZW5kLCBudW5jIHV0IHZhcml1cyBwb3J0dGl0b3IsIG51bmMgbG9yZW0gYmliZW5kdW0gZmVsaXMsIGV0IHJ1dHJ1bSBmZWxpcyBuaXNsIGFjIGp1c3RvLiBEb25lYyBhdCB2dWxwdXRhdGUgb3JjaSwgYSBtYWxlc3VhZGEgdGVsbHVzLiBWaXZhbXVzIGZpbmlidXMgZG9sb3IgZXN0LCBpZCB2aXZlcnJhIG1pIG1vbGVzdGllIGF0LiBBbGlxdWFtIHZlbCBsZWN0dXMgdml0YWUgb3JjaSBjb25kaW1lbnR1bSBwb3J0YS4gRG9uZWMgaWQgZWZmaWNpdHVyIHZlbGl0LiBNYXVyaXMgaW4ganVzdG8gYXQgZXJvcyBkYXBpYnVzIHB1bHZpbmFyIGEgbm9uIG1pLiBDdXJhYml0dXIgbnVsbGEgZmVsaXMsIHVsdHJpY2VzIHNlZCBvZGlvIHNlZCwgdnVscHV0YXRlIGFsaXF1YW0gc2FwaWVuLg0KDQpBZW5lYW4gdml0YWUgc2FwaWVuIGV1IGxvcmVtIGRpY3R1bSBpbXBlcmRpZXQuIEFlbmVhbiBvZGlvIHF1YW0sIHN1c2NpcGl0IHF1aXMgZW5pbSBlZ2V0LCBibGFuZGl0IGNvbnNlY3RldHVyIHNlbS4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuIFZlc3RpYnVsdW0gZGFwaWJ1cyB2YXJpdXMgbWFsZXN1YWRhLiBQaGFzZWxsdXMgdmVoaWN1bGEgbmlzaSB2ZWwganVzdG8gaGVuZHJlcml0LCB2ZWwgZGlnbmlzc2ltIGFyY3UgY29uZ3VlLiBOdWxsYW0gZnJpbmdpbGxhIGZlbGlzIGEgbWkgc2VtcGVyIGRpZ25pc3NpbS4gU2VkIHNvbGxpY2l0dWRpbiBmZXJtZW50dW0gY29tbW9kby4gQWVuZWFuIGNvbnNlcXVhdCBjb25zZWN0ZXR1ciBhbnRlIG5vbiB2aXZlcnJhLiBQZWxsZW50ZXNxdWUgaWFjdWxpcyBwdXJ1cyB2ZWwgZXJhdCBwbGFjZXJhdCwgdml0YWUgc29sbGljaXR1ZGluIHRlbGx1cyB2ZXN0aWJ1bHVtLiBOYW0gbmlzaSBudWxsYSwgcmhvbmN1cyBxdWlzIG51bGxhIHNlZCwgYmxhbmRpdCBjb25kaW1lbnR1bSBpcHN1bS4gVml2YW11cyBhYyBjdXJzdXMgdG9ydG9yLg0KDQpBZW5lYW4gY29uZ3VlIGZldWdpYXQgaW50ZXJkdW0uIFBoYXNlbGx1cyB2b2x1dHBhdCBleCBxdWlzIG1pIGV1aXNtb2QsIG5vbiB2ZWhpY3VsYSBudW5jIGNvbnZhbGxpcy4gUHJhZXNlbnQgbmlzaSBlc3QsIHJob25jdXMgdmVsIG5pc2wgcHVsdmluYXIsIGJpYmVuZHVtIGRhcGlidXMgbGliZXJvLiBQZWxsZW50ZXNxdWUgbmlzaSBuaXNpLCBjb25zZWN0ZXR1ciBpZCB0dXJwaXMgbm9uLCBjb25zZXF1YXQgYmxhbmRpdCB2ZWxpdC4gUGVsbGVudGVzcXVlIHN1c2NpcGl0IGRpY3R1bSBlc3QsIHNpdCBhbWV0IGNvbmRpbWVudHVtIG9kaW8uIEFsaXF1YW0gcXVpcyBwdXJ1cyBjb25ndWUsIGNvbmRpbWVudHVtIGVzdCBkaWN0dW0sIHRpbmNpZHVudCBmZWxpcy4gSW4gYWxpcXVhbSBhIGVyYXQgYXQgdGVtcHVzLiBOYW0gY29udmFsbGlzIG5vbiBhcmN1IGEgdWx0cmljaWVzLiBNb3JiaSBpYWN1bGlzIGxvcmVtIGRpY3R1bSwgYWNjdW1zYW4gcmlzdXMgc2l0IGFtZXQsIGlhY3VsaXMgYW50ZS4gU2VkIG5lYyBjdXJzdXMgZW5pbSwgaWQgdWx0cmljZXMgZXJvcy4gU3VzcGVuZGlzc2UgdmVsIG1hc3NhIGlwc3VtLiBEb25lYyBlZ2VzdGFzIHF1aXMgZW5pbSBxdWlzIHNjZWxlcmlzcXVlLiBOdWxsYW0gaGVuZHJlcml0IGlhY3VsaXMgYXJjdSwgaWQgbW9sbGlzIHZlbGl0IGNvbW1vZG8gbm9uLiBTZWQgaWQgcGVsbGVudGVzcXVlIHRlbGx1cywgYXQgdWx0cmljaWVzIG51bGxhLg0KDQpNYWVjZW5hcyBzZWQgbWFsZXN1YWRhIGZlbGlzLCB2aXRhZSBhY2N1bXNhbiBhcmN1LiBQZWxsZW50ZXNxdWUgbWkgb3JjaSwgdWx0cmljZXMgYWMgdnVscHV0YXRlIGV0LCBzYWdpdHRpcyBpbiB0ZWxsdXMuIE51bmMgZWdldCBlbGVtZW50dW0gb3JjaSwgZXUgb3JuYXJlIGR1aS4gQWxpcXVhbSBlZ2V0IHBoYXJldHJhIGVyb3MsIHNpdCBhbWV0IHNlbXBlciBudWxsYS4gTmFtIGZldWdpYXQgdHVycGlzIGlkIHR1cnBpcyBjb25kaW1lbnR1bSBlbGVpZmVuZCBxdWlzIGF0IHNhcGllbi4gRHVpcyBuZXF1ZSBkb2xvciwgZ3JhdmlkYSBlZ2V0IHRpbmNpZHVudCB2ZWwsIGVsZW1lbnR1bSB1dCBqdXN0by4gTnVsbGEgY29uc2VjdGV0dXIgbnVsbGEgbmVjIGxvcmVtIGFjY3Vtc2FuIGJsYW5kaXQuIE1hZWNlbmFzIGVnZXQgc2VtIGlkIG5lcXVlIGltcGVyZGlldCBjb25kaW1lbnR1bSBldCBzaXQgYW1ldCBleC4gU2VkIGNvbnZhbGxpcyB2ZW5lbmF0aXMgbWkgdXQgc2FnaXR0aXMuIE1hZWNlbmFzIHZlbCBhY2N1bXNhbiBsaWJlcm8uIERvbmVjIGRhcGlidXMgYW50ZSBudW5jLCBuZWMgc2VtcGVyIG9yY2kgZGlnbmlzc2ltIGF0Lg0KDQpNYWVjZW5hcyBuZWMgc2VtcGVyIGR1aSwgYWMgZGFwaWJ1cyBsb3JlbS4gVXQgaWFjdWxpcyBkaWFtIG5lYyB1cm5hIHN1c2NpcGl0LCBxdWlzIGx1Y3R1cyBhdWd1ZSBlbGVpZmVuZC4gRG9uZWMgcG9ydGEgZXJhdCBhIGV1aXNtb2QgZGlnbmlzc2ltLiBFdGlhbSBhbGlxdWV0IGVzdCBhdCBvcmNpIHBoYXJldHJhIG1vbGxpcy4gRG9uZWMgdXQgZW5pbSB1dCBsZW8gY29uZ3VlIGxhb3JlZXQgbm9uIGFjIHVybmEuIFV0IGJpYmVuZHVtIG5pc2kgZXQgY29udmFsbGlzIHJob25jdXMuIEluIHZlbCBudW5jIGlkIG9yY2kgbWF0dGlzIGVmZmljaXR1ciBldCBlZ2V0IG1hdXJpcy4gTWF1cmlzIG5vbiBkYXBpYnVzIGFyY3UuDQoNCk1vcmJpIGJpYmVuZHVtIGlwc3VtIGFudGUsIHNpdCBhbWV0IGJpYmVuZHVtIG1pIGVmZmljaXR1ciBlZ2V0LiBEb25lYyB0ZW1wdXMgcGhhcmV0cmEgbmlzbC4gQ3JhcyBjb25zZXF1YXQgaWQgcmlzdXMgaW4gZXVpc21vZC4gUHJhZXNlbnQgc2VkIGZldWdpYXQgZGlhbS4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCBuZXR1cyBldCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycGlzIGVnZXN0YXMuIFBoYXNlbGx1cyB2aXRhZSB2b2x1dHBhdCBlc3QuIEFlbmVhbiBsYW9yZWV0IGxpYmVybyBhdCBzZW0gY29uc2VxdWF0IGVsZWlmZW5kLiBTdXNwZW5kaXNzZSBhIGZhdWNpYnVzIG1hc3NhLiBBbGlxdWFtIGVyb3MgdG9ydG9yLCBmcmluZ2lsbGEgc2FnaXR0aXMgbGlndWxhIHNhZ2l0dGlzLCBncmF2aWRhIHB1bHZpbmFyIGxhY3VzLiBBZW5lYW4gY3Vyc3VzLCBkb2xvciBldCBlbGVpZmVuZCBmZXVnaWF0LCBkb2xvciBwdXJ1cyB2ZW5lbmF0aXMgdXJuYSwgZWdldCBpbXBlcmRpZXQgbWFnbmEgZW5pbSBzaXQgYW1ldCBtYXVyaXMuIE1hdXJpcyBtYXR0aXMgY29uc2VjdGV0dXIgc2FwaWVuIG5vbiB2aXZlcnJhLiBOYW0gdXQgc2FnaXR0aXMgb2Rpbywgc2l0IGFtZXQgbWFsZXN1YWRhIGFyY3UuIEludGVnZXIgcXVpcyBoZW5kcmVyaXQgZWxpdC4gTmFtIG5lYyBibGFuZGl0IG5pc2wuIFNlZCBjb21tb2RvLCBudWxsYSBhdCBldWlzbW9kIGxhb3JlZXQsIHNhcGllbiBpcHN1bSBkYXBpYnVzIGR1aSwgZXQgbW9sZXN0aWUgbGliZXJvIG5pYmggdXQgZW5pbS4NCg0KUHJvaW4gZXQgbnVsbGEgdGluY2lkdW50LCB1bGxhbWNvcnBlciBudWxsYSB2ZWwsIHZlbmVuYXRpcyBtYWduYS4gTnVsbGFtIGV0IGVuaW0gbGVjdHVzLiBOdW5jIGV1aXNtb2QgbWFsZXN1YWRhIGVyb3MgZWdldCB0ZW1wb3IuIE1hZWNlbmFzIGF0IHR1cnBpcyBxdWlzIG51bmMgYmxhbmRpdCBzYWdpdHRpcy4gQWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBNYWVjZW5hcyBzZWQgb3JjaSB2aXRhZSBtZXR1cyBmaW5pYnVzIGltcGVyZGlldC4gUGVsbGVudGVzcXVlIGJsYW5kaXQgcmlzdXMgaWQgZmVsaXMgaW1wZXJkaWV0LCB2ZWwgYXVjdG9yIG1ldHVzIHNvbGxpY2l0dWRpbi4gSW50ZWdlciBxdWlzIGZhdWNpYnVzIGRvbG9yLiBJbiB2aXRhZSBvcmNpIGhlbmRyZXJpdCwgbGFjaW5pYSBuaWJoIHZlbCwgdWxsYW1jb3JwZXIgZXN0LiBFdGlhbSB2ZW5lbmF0aXMgZWxpdCBuZWMgbWV0dXMgdGVtcHVzLCBldSB2dWxwdXRhdGUgYXVndWUgbW9sbGlzLiBWaXZhbXVzIHZlbmVuYXRpcyBlcm9zIGEgZXN0IHRpbmNpZHVudCB2ZW5lbmF0aXMuIE1vcmJpIGlkIHNhZ2l0dGlzIHVybmEuIFByYWVzZW50IGZldWdpYXQgZWxlbWVudHVtIG1vbGxpcy4NCg0KUGhhc2VsbHVzIHB1bHZpbmFyIG1ldHVzIGF0IGJsYW5kaXQgdGVtcHVzLiBFdGlhbSBsZWN0dXMgdXJuYSwgdmVuZW5hdGlzIHF1aXMgYWxpcXVldCBpbiwgZGFwaWJ1cyBub24gdG9ydG9yLiBVdCBlcm9zIGF1Z3VlLCB1bHRyaWNlcyBzaXQgYW1ldCBzZW1wZXIgZGljdHVtLCB1bHRyaWNlcyBpbiBkb2xvci4gTnVsbGEgYSBkdWkgbGVjdHVzLiBQcmFlc2VudCBjb25zZWN0ZXR1ciBtZXR1cyBxdWlzIHVybmEgdmVzdGlidWx1bSBjb25zZXF1YXQuIERvbmVjIGVsZW1lbnR1bSBtYXVyaXMgZXJvcywgdml0YWUgdmVuZW5hdGlzIGVsaXQgaGVuZHJlcml0IHNpdCBhbWV0LiBTZWQgYSBlbGVtZW50dW0gbGlndWxhLCBhYyBiaWJlbmR1bSBtaS4gRG9uZWMgbmVjIHF1YW0gZWxlaWZlbmQsIGVsZWlmZW5kIG5pc2wgdml0YWUsIGZyaW5naWxsYSBpcHN1bS4gQ3VyYWJpdHVyIGJsYW5kaXQgYWxpcXVldCB2ZWxpdC4gUGhhc2VsbHVzIHB1bHZpbmFyIGNvbW1vZG8gZmVsaXMsIGluIG1hdHRpcyBtaSB2ZW5lbmF0aXMgaW4uIE51bGxhbSBldWlzbW9kIGp1c3RvIGFyY3UsIHNlZCBvcm5hcmUgbnVsbGEgaW50ZXJkdW0gbmVjLiBQcmFlc2VudCBsb2JvcnRpcyBkdWkgbm9uIG1hc3NhIGhlbmRyZXJpdCwgaWQgZmluaWJ1cyBsaWd1bGEgb3JuYXJlLiBGdXNjZSB2aXRhZSBqdXN0byBxdWlzIGV4IHVsdHJpY2llcyBtYWxlc3VhZGEuIER1aXMgcG9zdWVyZSBlbGl0IGxhb3JlZXQganVzdG8gaW50ZXJkdW0sIHZpdGFlIHRpbmNpZHVudCBtYXVyaXMgYWxpcXVhbS4gUGhhc2VsbHVzIG5vbiBsZW8gbmVjIG51bmMgcHVsdmluYXIgZWxlaWZlbmQuIEN1cmFiaXR1ciBlbGVtZW50dW0gZHVpIGV1IGFudGUgaW1wZXJkaWV0LCBlZ2V0IHRpbmNpZHVudCBsZWN0dXMgc29kYWxlcy4NCg0KTmFtIGRpYW0gdG9ydG9yLCBmYXVjaWJ1cyBhIHNvZGFsZXMgYSwgYWxpcXVhbSBub24gZG9sb3IuIFN1c3BlbmRpc3NlIG5lYyBqdXN0byB2aXRhZSBsZW8gdm9sdXRwYXQgcHVsdmluYXIuIFZlc3RpYnVsdW0gdmVsIGVyYXQgY3Vyc3VzIG5lcXVlIGNvbnNlY3RldHVyIHBvc3VlcmUuIEFsaXF1YW0gZ3JhdmlkYSwgZHVpIHF1aXMgcGhhcmV0cmEgdmVoaWN1bGEsIGxpYmVybyBxdWFtIHZpdmVycmEgbWksIG5vbiBlZ2VzdGFzIG1hZ25hIGxvcmVtIGluIG1hdXJpcy4gVXQgZGljdHVtIHNvbGxpY2l0dWRpbiB0b3J0b3IgYXQgdWxsYW1jb3JwZXIuIFF1aXNxdWUgY29tbW9kbyBtaSBzdXNjaXBpdCwgY29uc2VxdWF0IGRpYW0gcXVpcywgZmV1Z2lhdCBtaS4gTWFlY2VuYXMgZXUgY29udmFsbGlzIG5pYmgsIHNlZCBhdWN0b3IgaXBzdW0uIEZ1c2NlIGFsaXF1ZXQsIGp1c3RvIG5vbiBwcmV0aXVtIHBvcnRhLCBtYXNzYSBtYXVyaXMgZWdlc3RhcyBsZW8sIGV0IGxhb3JlZXQgbGlndWxhIG1pIGV0IGxvcmVtLiBRdWlzcXVlIHNjZWxlcmlzcXVlIG5pc2kgcXVhbSwgaW4gZWZmaWNpdHVyIGxpZ3VsYSBwb3N1ZXJlIHZpdGFlLiBGdXNjZSBwb3J0dGl0b3IgZW5pbSBldCBtZXR1cyBsYWNpbmlhLCBlZ2V0IHZlaGljdWxhIGlwc3VtIGZldWdpYXQuIEFsaXF1YW0gcXVpcyBpYWN1bGlzIHRvcnRvci4gUXVpc3F1ZSBsYWNpbmlhIHN1c2NpcGl0IHBvc3VlcmUuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBOYW0gbmVxdWUgZHVpLCBibGFuZGl0IG5lYyBhcmN1IGF0LCBsdWN0dXMgc2VtcGVyIG51bmMuDQoNClZpdmFtdXMgaWQgbWV0dXMgZXUgZXN0IGhlbmRyZXJpdCBjb25kaW1lbnR1bSBldCBzZWQgb3JjaS4gQWxpcXVhbSB1cm5hIGVsaXQsIHRpbmNpZHVudCBpZCBtYWxlc3VhZGEgdmVsLCBlbGVpZmVuZCBzaXQgYW1ldCBpcHN1bS4gUHJhZXNlbnQgdmVsIGNvbnNlY3RldHVyIG1hZ25hLiBTZWQgZWxlaWZlbmQgaWFjdWxpcyBjb21tb2RvLiBGdXNjZSBuZWMgb2RpbyBzaXQgYW1ldCBudW5jIHNvbGxpY2l0dWRpbiB2dWxwdXRhdGUgc2VkIGVnZXQgaXBzdW0uIFNlZCB1dCBkdWkgcmlzdXMuIENyYXMgZmF1Y2lidXMgcXVhbSBlbmltLCBlZ2V0IGRhcGlidXMgbWFnbmEgcG9ydGEgc2l0IGFtZXQuIFByb2luIHJ1dHJ1bSBpcHN1bSBlZ2V0IG1hdXJpcyBsb2JvcnRpcywgaW4gdGluY2lkdW50IHNhcGllbiB1bGxhbWNvcnBlci4gQ2xhc3MgYXB0ZW50IHRhY2l0aSBzb2Npb3NxdSBhZCBsaXRvcmEgdG9ycXVlbnQgcGVyIGNvbnViaWEgbm9zdHJhLCBwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBNYXVyaXMgcHVsdmluYXIsIHRlbGx1cyBpZCBpYWN1bGlzIHNhZ2l0dGlzLCBtaSBkdWkgdGVtcG9yIG5pYmgsIGFjIHZhcml1cyByaXN1cyBkaWFtIGVnZXQgbWF1cmlzLiBTdXNwZW5kaXNzZSBhdCBmYWNpbGlzaXMgbmlzaS4gTnVuYyBkaWN0dW0gdGVsbHVzIGluIGZhdWNpYnVzIGFsaXF1ZXQuDQoNCkFlbmVhbiBpbnRlcmR1bSBvcmNpIG5vbiBwbGFjZXJhdCB1bHRyaWNpZXMuIEZ1c2NlIGFyY3UgZW5pbSwgc2NlbGVyaXNxdWUgcXVpcyB2aXZlcnJhIHZpdGFlLCBoZW5kcmVyaXQgYSBtYWduYS4gTW9yYmkgaW4gb3JuYXJlIG1ldHVzLiBOdW5jIGNvbnNlY3RldHVyIGV1aXNtb2QgYXVndWUsIHV0IGRhcGlidXMgbGliZXJvIHBvcnRhIGEuIEFlbmVhbiBwb3J0YSBtYXR0aXMgbmlzaSBxdWlzIG9ybmFyZS4gVml2YW11cyBhYyBxdWFtIGluIGxhY3VzIHVsbGFtY29ycGVyIHNvbGxpY2l0dWRpbi4gTWFlY2VuYXMgbWV0dXMgbWFnbmEsIGltcGVyZGlldCBhIGxpZ3VsYSBldCwgcG9ydHRpdG9yIGJpYmVuZHVtIG9yY2kuIFZlc3RpYnVsdW0gdGVtcHVzIGVzdCBzZWQgdGVsbHVzIHRpbmNpZHVudCBzb2RhbGVzLiBDcmFzIGluIGVmZmljaXR1ciBxdWFtLCBlZ2V0IHRpbmNpZHVudCBtYXVyaXMuIER1aXMgYSB2ZWxpdCBldCBlbGl0IGV1aXNtb2QgdmVoaWN1bGEgcHVsdmluYXIgdml0YWUgbGFjdXMuIFZlc3RpYnVsdW0gYWMgY29uc2VxdWF0IG1hc3NhLiBDdXJhYml0dXIgcHVsdmluYXIgbGFjdXMgdml0YWUgdXJuYSB0ZW1wdXMgaGVuZHJlcml0LiBJbnRlZ2VyIHRyaXN0aXF1ZSBmcmluZ2lsbGEgZW5pbS4gRXRpYW0gYWxpcXVhbSBzZWQgZG9sb3IgbmVjIGZhdWNpYnVzLiBOdW5jIGZpbmlidXMgZXggdmVsIGFjY3Vtc2FuIGFjY3Vtc2FuLg0KDQpOdWxsYSBibGFuZGl0IGRpZ25pc3NpbSBsZWN0dXMsIHZlbCBwb3J0dGl0b3IgZHVpIG9ybmFyZSB1dC4gTmFtIGNvbnNlY3RldHVyIHNhcGllbiBzaXQgYW1ldCBmaW5pYnVzIGVnZXN0YXMuIEFlbmVhbiBwbGFjZXJhdCBhIHVybmEgdmVsIHZvbHV0cGF0LiBEb25lYyBpbiBsaWJlcm8gbmVjIGFyY3UgdGluY2lkdW50IGNvbW1vZG8gYXQgdmVsIG1ldHVzLiBRdWlzcXVlIGJpYmVuZHVtIGZhY2lsaXNpcyBkYXBpYnVzLiBBZW5lYW4gYWMgbG9yZW0gYXQgbmlzbCBtYXR0aXMgZmFjaWxpc2lzLiBJbiBjdXJzdXMgbmlzbCB2ZXN0aWJ1bHVtIGFsaXF1ZXQgY29udmFsbGlzLg0KDQpBbGlxdWFtIHZpdGFlIGZlbGlzIGxvYm9ydGlzLCBkYXBpYnVzIGFudGUgdmVsLCBwZWxsZW50ZXNxdWUganVzdG8uIFN1c3BlbmRpc3NlIHBvdGVudGkuIFNlZCB0cmlzdGlxdWUgbWFzc2EgaWQgcXVhbSBlbGVtZW50dW0gdnVscHV0YXRlLiBOdWxsYSBpZCBqdXN0byBhIHRlbGx1cyBibGFuZGl0IHRpbmNpZHVudCBldCBhYyBkb2xvci4gVmVzdGlidWx1bSBzaXQgYW1ldCBibGFuZGl0IG5lcXVlLiBTZWQgY29uc2VjdGV0dXIgbnVsbGEgZWdldCBudWxsYSBwb3J0YSBmYXVjaWJ1cy4gUHJvaW4gbW9sbGlzLCBqdXN0byBlZ2V0IGVmZmljaXR1ciBwb3J0YSwgbmlzaSBuZXF1ZSBmcmluZ2lsbGEgZXN0LCBub24gdmVzdGlidWx1bSBlcmF0IGxlY3R1cyBub24gbnVsbGEuIE1vcmJpIG1pIG5lcXVlLCBzb2RhbGVzIHNlZCBmZWxpcyBuZWMsIGFsaXF1YW0gcHVsdmluYXIgb2Rpby4gQ3VyYWJpdHVyIHRlbGx1cyBmZWxpcywgZmF1Y2lidXMgc2VkIHZ1bHB1dGF0ZSBhdCwgZXVpc21vZCBuZWMgYW50ZS4gRG9uZWMgdmVoaWN1bGEsIGxpZ3VsYSBhYyB0ZW1wb3IgY29uc2VxdWF0LCBtZXR1cyB0ZWxsdXMgcGxhY2VyYXQgbnVsbGEsIHV0IG1hbGVzdWFkYSBuZXF1ZSB0ZWxsdXMgaW4gaXBzdW0uIE1hZWNlbmFzIHZpdGFlIGVuaW0gZG9sb3IuIFF1aXNxdWUgdmVsIGZlbGlzIGEgYXJjdSBmZXVnaWF0IHBvcnRhLiBEb25lYyBzZWQgb2RpbyBldCBtYXNzYSBjb25kaW1lbnR1bSBkaWduaXNzaW0gaWQgbm9uIHZlbGl0LiBEb25lYyBvcm5hcmUgYWxpcXVhbSByaXN1cyBhIGNvbnZhbGxpcy4gTnVsbGFtIGNvbW1vZG8sIG1hZ25hIHVsdHJpY2VzIGNvbnNlcXVhdCBzb2xsaWNpdHVkaW4sIG1hc3NhIGp1c3RvIHJob25jdXMgdG9ydG9yLCBhdCBjb21tb2RvIG1hc3NhIGp1c3RvIGlkIGRpYW0uDQoNCk5hbSB2b2x1dHBhdCB2YXJpdXMgbGVjdHVzIG5lYyBzb2xsaWNpdHVkaW4uIER1aXMgdml2ZXJyYSB0ZWxsdXMgbmlzaSwgYXQgbWFsZXN1YWRhIGVsaXQgdGluY2lkdW50IGFjLiBDcmFzIGF0IGZhY2lsaXNpcyBtYXNzYSwgZWdldCBmZXJtZW50dW0gbGlndWxhLiBQaGFzZWxsdXMgc2VtcGVyIGRpZ25pc3NpbSB2ZWxpdCBpbiBhbGlxdWFtLiBQcmFlc2VudCBpZCBudW5jIG1hZ25hLiBNYWVjZW5hcyBxdWlzIGV4IGZldWdpYXQsIGltcGVyZGlldCBkdWkgbmVjLCB2ZXN0aWJ1bHVtIG5lcXVlLiBDdXJhYml0dXIgbm9uIG5pYmggbWkuIEN1cmFiaXR1ciBkaWN0dW0gbWFsZXN1YWRhIG5pc2kuIFV0IGZlbGlzIG51bGxhLCBwaGFyZXRyYSB2ZWwgbWkgdml0YWUsIGN1cnN1cyBtYXR0aXMgbGVvLiBOdW5jIGRvbG9yIHB1cnVzLCBwb3J0dGl0b3Igc2l0IGFtZXQgYWxpcXVldCBxdWlzLCBpYWN1bGlzIGEgbWFzc2EuIEFsaXF1YW0gcG9ydGEgbG9yZW0gYSBlZ2VzdGFzIGRpZ25pc3NpbS4gTnVuYyB2aXRhZSB1bHRyaWNlcyBtZXR1cy4gUGVsbGVudGVzcXVlIGR1aSBuaXNpLCB2ZWhpY3VsYSBxdWlzIHB1cnVzIGFjLCBjb25zZWN0ZXR1ciB0aW5jaWR1bnQgdXJuYS4gVmVzdGlidWx1bSBxdWlzIHNhcGllbiBhIG51bGxhIGZldWdpYXQgdm9sdXRwYXQgdmVsIHF1aXMgZGlhbS4gTmFtIHZlc3RpYnVsdW0sIGFyY3UgZXQgdm9sdXRwYXQgdmVzdGlidWx1bSwgdmVsaXQgbWFnbmEgZGljdHVtIG51bGxhLCB2ZWwgdmVuZW5hdGlzIGxpZ3VsYSBuaWJoIHZlbCBlbGl0LiBTdXNwZW5kaXNzZSBzZWQgaXBzdW0gbWV0dXMuDQoNCkNyYXMgdml0YWUgc2VtIHNlbXBlciwgdWx0cmljZXMgbWFnbmEgYXQsIGZlcm1lbnR1bSBkb2xvci4gTmFtIG5lYyB2b2x1dHBhdCBuaXNpLCB1dCBzYWdpdHRpcyBtZXR1cy4gUXVpc3F1ZSBpZCBiaWJlbmR1bSBuaWJoLiBTdXNwZW5kaXNzZSB1cm5hIHR1cnBpcywgaWFjdWxpcyBzYWdpdHRpcyBzZW1wZXIgcXVpcywgcG9ydGEgYXQgZW5pbS4gUGVsbGVudGVzcXVlIHNpdCBhbWV0IHVsdHJpY2VzIG1ldHVzLiBWZXN0aWJ1bHVtIHNlZCBjb25ndWUgZW5pbSwgc2l0IGFtZXQgc3VzY2lwaXQgbWV0dXMuIEN1cmFiaXR1ciBuaXNpIGZlbGlzLCBjb252YWxsaXMgZWdldCBlbGl0IGVnZXQsIGVmZmljaXR1ciBmZXJtZW50dW0gc2VtLiBOYW0gYmxhbmRpdCB2YXJpdXMgYmxhbmRpdC4gTmFtIHRyaXN0aXF1ZSBwb3J0dGl0b3IgZG9sb3Igdml0YWUgb3JuYXJlLiBOYW0gY29uc2VjdGV0dXIgbG9yZW0gdml0YWUgdG9ydG9yIHZhcml1cyBjb25zZXF1YXQuIE1vcmJpIGVmZmljaXR1ciBzZW1wZXIganVzdG8gc2VkIHRyaXN0aXF1ZS4gTWFlY2VuYXMgc2FwaWVuIHVybmEsIGRpZ25pc3NpbSBldSBsb2JvcnRpcyBzZWQsIGJsYW5kaXQgYWMgZXguIEZ1c2NlIHF1YW0gbmlzbCwgZWxlbWVudHVtIHZlbCBvZGlvIGlkLCBlZmZpY2l0dXIgdWxsYW1jb3JwZXIgbGVjdHVzLg0KDQpTZWQgaGVuZHJlcml0IHZlbGl0IGF0IHNlbSBzYWdpdHRpcyB2ZXN0aWJ1bHVtLiBEb25lYyBlZ2VzdGFzIHVybmEgYSB0b3J0b3IgdmFyaXVzIHZpdmVycmEuIFByYWVzZW50IHV0IG5pc2wgc2l0IGFtZXQgbWF1cmlzIGJpYmVuZHVtIGltcGVyZGlldC4gQ3JhcyB2aXRhZSBtYXhpbXVzIG51bGxhLiBQaGFzZWxsdXMgbmVjIGdyYXZpZGEgZW5pbSwgZWdldCB0cmlzdGlxdWUgc2VtLiBQaGFzZWxsdXMgZG9sb3IganVzdG8sIHVsdHJpY2VzIGFjIGRpZ25pc3NpbSBpbiwgbG9ib3J0aXMgYSBsZWN0dXMuIFV0IGluIHRpbmNpZHVudCBtZXR1cywgdmVsIGltcGVyZGlldCBudWxsYS4gTnVsbGEgZmFjaWxpc2kuIE1hdXJpcyBleCB1cm5hLCBjb25ndWUgYWMgdWxsYW1jb3JwZXIgcnV0cnVtLCBtYXR0aXMgYXQgcXVhbS4NCg0KU2VkIGNvbmRpbWVudHVtIHJpc3VzIHRvcnRvciwgZXQgZWxlbWVudHVtIHR1cnBpcyBjb25zZXF1YXQgYS4gU2VkIHF1aXMgYXVndWUgZXUgc2VtIHBlbGxlbnRlc3F1ZSBjb25ndWUuIFByYWVzZW50IHRvcnRvciBhdWd1ZSwgc2VtcGVyIGluIHJob25jdXMgc2VkLCB2ZWhpY3VsYSBub24gYXVndWUuIE5hbSB0ZW1wb3IgZmVsaXMgbmVjIGhlbmRyZXJpdCBjb25zZWN0ZXR1ci4gSW50ZWdlciBjb25zZWN0ZXR1ciB0aW5jaWR1bnQgaXBzdW0gZWdldCB0ZW1wb3IuIER1aXMgbG9ib3J0aXMgY29tbW9kbyB2ZXN0aWJ1bHVtLiBOdWxsYSBsYWNpbmlhIGNvbnZhbGxpcyBtZXR1cywgbm9uIHRpbmNpZHVudCB0b3J0b3Igc29kYWxlcyBpbi4gSW4gbG9ib3J0aXMgc29kYWxlcyBlcm9zLCBzZWQgZmFjaWxpc2lzIHRlbGx1cyBlZ2VzdGFzIGNvbnNlY3RldHVyLg0KDQpQZWxsZW50ZXNxdWUgdmVzdGlidWx1bSB0ZWxsdXMgZXQgbmliaCB0aW5jaWR1bnQsIGV1IHRpbmNpZHVudCBsZW8gc2VtcGVyLiBNb3JiaSBuZWMgcHVydXMgcXVpcyBtYXNzYSB1bHRyaWNlcyB0ZW1wdXMgcXVpcyB1dCBmZWxpcy4gRG9uZWMgYmxhbmRpdCBydXRydW0gcG9ydGEuIFByYWVzZW50IHByZXRpdW0gcmhvbmN1cyBuaXNpIHZpdGFlIGZhY2lsaXNpcy4gTnVuYyBjb25zZWN0ZXR1ciBsYWN1cyBlbGl0LCBuZWMgZXVpc21vZCBhcmN1IHNvZGFsZXMgcXVpcy4gQ3VyYWJpdHVyIGN1cnN1cyBldSBxdWFtIHNpdCBhbWV0IHRlbXBvci4gU2VkIGVsZWlmZW5kIGlkIHRvcnRvciBpbiBmYWNpbGlzaXMuIENyYXMgbmVjIHVybmEgaWFjdWxpcywgdHJpc3RpcXVlIG1pIG5vbiwgcmhvbmN1cyBsZWN0dXMuIFZpdmFtdXMgc2l0IGFtZXQgZXVpc21vZCBlcm9zLCBpZCB0cmlzdGlxdWUgbWFzc2EuIEludGVnZXIgY29udmFsbGlzIG1vbGxpcyBtb2xlc3RpZS4NCg0KQWxpcXVhbSB0aW5jaWR1bnQganVzdG8gaWQgZWxlbWVudHVtIHRlbXB1cy4gTnVuYyBpbiBoZW5kcmVyaXQgZXJvcy4gTmFtIGlkIG51bGxhIGNvbnNlY3RldHVyLCBwb3J0dGl0b3IgbGVvIHZpdGFlLCBmZXVnaWF0IGFudGUuIFBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBTZWQgYWxpcXVhbSB2ZW5lbmF0aXMgbGFjdXMsIGJpYmVuZHVtIGJsYW5kaXQgbmlzbCBsb2JvcnRpcyBuZWMuIEluIG1vbGxpcyBjb25zZWN0ZXR1ciBlcm9zLiBEb25lYyBpbiBzYWdpdHRpcyB0dXJwaXMuIFByb2luIGV1IHBlbGxlbnRlc3F1ZSBkb2xvci4gTnVsbGEgYmxhbmRpdCBqdXN0byBpZCBlbmltIHN1c2NpcGl0IHB1bHZpbmFyLiBGdXNjZSBzZWQgb3JuYXJlIGRpYW0uIFZpdmFtdXMgdmVuZW5hdGlzLCBtYWduYSBuZWMgZWxlaWZlbmQgcG9ydGEsIGxlY3R1cyBzZW0gYWxpcXVldCBsaWd1bGEsIGFjIHZlaGljdWxhIHNlbSBkb2xvciBpbiBudWxsYS4gTnVsbGFtIHByZXRpdW0gYXJjdSBhdCBhdWd1ZSB0cmlzdGlxdWUsIHF1aXMgdWx0cmljaWVzIGFyY3UgbGFjaW5pYS4gRnVzY2Ugdml2ZXJyYSBhYyBsZW8gYXQgcnV0cnVtLiBDdXJhYml0dXIgdGluY2lkdW50IGZlbGlzIGVnZXQgdHVycGlzIGNvbnZhbGxpcywgc2VkIGNvbnNlY3RldHVyIGVyYXQgb3JuYXJlLg0KDQpTdXNwZW5kaXNzZSB0cmlzdGlxdWUsIG1pIGEgcHVsdmluYXIgZmFjaWxpc2lzLCBsZWN0dXMgZXJhdCBmZXJtZW50dW0gZXN0LCBiaWJlbmR1bSB2ZWhpY3VsYSBlbmltIGVzdCBub24gc2FwaWVuLiBBZW5lYW4gYXJjdSBtYWduYSwgcHVsdmluYXIgdml0YWUgYXVjdG9yIGF0LCBzdXNjaXBpdCBhIHF1YW0uIFBlbGxlbnRlc3F1ZSBzZWQgZXggZWZmaWNpdHVyLCBhdWN0b3IgZXJhdCBldCwgb3JuYXJlIHJpc3VzLiBOYW0gZHVpIG1pLCBjb25zZWN0ZXR1ciBzaXQgYW1ldCBlc3Qgbm9uLCBmZXVnaWF0IGZpbmlidXMgbmVxdWUuIEN1cmFiaXR1ciBldSBxdWFtIHZlbCBtYWduYSBzY2VsZXJpc3F1ZSBlbGVpZmVuZCBxdWlzIGFjIGR1aS4gUXVpc3F1ZSBjdXJzdXMsIG5pc2kgZWdldCB0ZW1wdXMgbGFjaW5pYSwgYXJjdSBsaWJlcm8gY29uc2VjdGV0dXIgbG9yZW0sIHV0IHRpbmNpZHVudCBuZXF1ZSBtaSB0aW5jaWR1bnQgbGVvLiBNb3JiaSByaXN1cyBkaWFtLCBlZ2VzdGFzIHV0IGxhY3VzIG5vbiwgaGVuZHJlcml0IHRpbmNpZHVudCBudW5jLiBTdXNwZW5kaXNzZSBhIGVyYXQgc2VkIHB1cnVzIGFjY3Vtc2FuIG1heGltdXMuIFNlZCBzaXQgYW1ldCBsZW8gZXUgbGVvIGludGVyZHVtIHB1bHZpbmFyLiBBZW5lYW4gaW4gbnVuYyBub24gcHVydXMgZGljdHVtIGRpZ25pc3NpbS4gU2VkIGNvbmRpbWVudHVtLCBzYXBpZW4gZXQgdGVtcG9yIGZpbmlidXMsIHZlbGl0IG1hZ25hIHBvcnR0aXRvciBlcm9zLCBlZ2V0IG1vbGxpcyBtYXNzYSBsb3JlbSBldCB1cm5hLiBBbGlxdWFtIHF1aXMgbmliaCBsYW9yZWV0LCBwb3J0dGl0b3IgZXggZWdldCwgZ3JhdmlkYSBuZXF1ZS4NCg0KTmFtIGFyY3UgcHVydXMsIGV1aXNtb2Qgc2VkIGNvbmRpbWVudHVtIGVnZXQsIHRlbXBvciBxdWlzIGZlbGlzLiBOdWxsYW0gYWMgdmVoaWN1bGEgb3JjaSwgZWdldCByaG9uY3VzIGxvcmVtLiBFdGlhbSBwdXJ1cyBxdWFtLCBlbGVpZmVuZCBhIGVyYXQgdmVsLCBjb25zZXF1YXQgdWxsYW1jb3JwZXIgcXVhbS4gQWVuZWFuIGEgZXggbm9uIGp1c3RvIGJpYmVuZHVtIHZlbmVuYXRpcyBzZWQgZXUgcHVydXMuIEN1cmFiaXR1ciBvcm5hcmUsIG51bGxhIHV0IHRyaXN0aXF1ZSBsYWNpbmlhLCBvZGlvIG1hZ25hIGFjY3Vtc2FuIGxlbywgdmVsIGZhdWNpYnVzIGFyY3UgbmlzbCBub24gbG9yZW0uIFNlZCByaG9uY3VzIGFsaXF1YW0gbnVsbGEgZXQgY3Vyc3VzLiBQZWxsZW50ZXNxdWUgcHJldGl1bSBsaWJlcm8gcXVpcyBhdWd1ZSB2ZW5lbmF0aXMsIG5vbiBwb3N1ZXJlIHB1cnVzIGxhY2luaWEuIEluIGhhYyBoYWJpdGFzc2UgcGxhdGVhIGRpY3R1bXN0Lg0KDQpQcmFlc2VudCBibGFuZGl0IGZhdWNpYnVzIGVsaXQgYXQgY3Vyc3VzLiBOdW5jIHRlbXBvciBsb3JlbSBzaXQgYW1ldCBmYXVjaWJ1cyBzZW1wZXIuIEFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gUHJvaW4gcmhvbmN1cyBpbnRlcmR1bSBmZWxpcyBhYyBzYWdpdHRpcy4gVmVzdGlidWx1bSBzZW1wZXIgYW50ZSBxdWFtLCBhdCB0ZW1wb3IgbGlndWxhIG1heGltdXMgZXUuIERvbmVjIHZlc3RpYnVsdW0gbGlndWxhIGEgdHVycGlzIHRpbmNpZHVudCB1bHRyaWNpZXMuIEV0aWFtIGV1IGFudGUgZmFjaWxpc2lzLCBjb25ndWUgbGVvIG5lYywgZWxlaWZlbmQgdG9ydG9yLg0KDQpQZWxsZW50ZXNxdWUgZmVsaXMgbmlzaSwgcG9ydHRpdG9yIHZlbCBvcmNpIG5vbiwgZWdlc3RhcyBtYXhpbXVzIG1hdXJpcy4gUHJvaW4gdmVsIGFjY3Vtc2FuIGxlY3R1cy4gQ3VyYWJpdHVyIHV0IGZyaW5naWxsYSByaXN1cywgc2VkIG1vbGVzdGllIGVyb3MuIEluIHV0IGxlbyBpZCBudW5jIG1hdHRpcyB1bGxhbWNvcnBlci4gRG9uZWMgZWZmaWNpdHVyIGp1c3RvIG1ldHVzLCBxdWlzIGZlcm1lbnR1bSB0b3J0b3IgbGFvcmVldCBub24uIE1hdXJpcyBlZ2V0IHZlbGl0IHZlbCB0ZWxsdXMgZWZmaWNpdHVyIGRpY3R1bS4gSW50ZWdlciBvcm5hcmUgbGliZXJvIGVnZXQgbWkgdm9sdXRwYXQgZGljdHVtLiBRdWlzcXVlIGF0IG51bGxhIGlkIGZlbGlzIG1vbGxpcyBsYW9yZWV0IGEgc2l0IGFtZXQgbWkuIEFsaXF1YW0gZXN0IG9kaW8sIGxhY2luaWEgc2VkIGR1aSB2aXRhZSwgc29sbGljaXR1ZGluIGRpZ25pc3NpbSB1cm5hLiBRdWlzcXVlIGlkIG1hc3NhIG1hZ25hLiBWZXN0aWJ1bHVtIGhlbmRyZXJpdCBldCBlcmF0IGF0IGZhY2lsaXNpcy4gVmVzdGlidWx1bSBlcmF0IGVzdCwgYmliZW5kdW0gYWMgdmVoaWN1bGEgc2VkLCBzb2xsaWNpdHVkaW4gbm9uIG5lcXVlLiBQcm9pbiBzYWdpdHRpcywgdHVycGlzIGluIGV1aXNtb2QgZmVybWVudHVtLCBuZXF1ZSBsZW8gdWxsYW1jb3JwZXIgcHVydXMsIGlkIGZlcm1lbnR1bSBhcmN1IGVzdCBkaWN0dW0gbWFnbmEuIFF1aXNxdWUgbW9sZXN0aWUgbmVxdWUgaW4gbG9yZW0gdWx0cmljaWVzLCBuZWMgY29uZGltZW50dW0gbmlzaSB2ZW5lbmF0aXMuIEFsaXF1YW0gYSB2ZWxpdCBtaS4NCg0KRHVpcyBsYW9yZWV0IGp1c3RvIG5pc2ksIG5lYyB2b2x1dHBhdCBkb2xvciBmYWNpbGlzaXMgcXVpcy4gTW9yYmkgcGVsbGVudGVzcXVlIGNvbnNlcXVhdCB0b3J0b3IgcXVpcyB0aW5jaWR1bnQuIFN1c3BlbmRpc3NlIHBsYWNlcmF0IGxlbyBldSBiaWJlbmR1bSBmcmluZ2lsbGEuIE1vcmJpIHNhZ2l0dGlzLCBpcHN1bSBzZWQgYmliZW5kdW0gbWF4aW11cywgcHVydXMgbGVvIGNvbnNlY3RldHVyIGZlbGlzLCBldSB2aXZlcnJhIG1ldHVzIHNlbSBzZWQgaXBzdW0uIEFlbmVhbiBzaXQgYW1ldCB0dXJwaXMgZXQgcmlzdXMgdmVzdGlidWx1bSBlZmZpY2l0dXIuIFBlbGxlbnRlc3F1ZSB0aW5jaWR1bnQsIHNhcGllbiBhYyBtYXhpbXVzIHRlbXB1cywgbmlzaSBsaWJlcm8gc29sbGljaXR1ZGluIGRpYW0sIGluIGltcGVyZGlldCBmZWxpcyBpcHN1bSBldCB1cm5hLiBVdCBwcmV0aXVtLCBudWxsYSB2ZWwgZWZmaWNpdHVyIHN1c2NpcGl0LCBsZWN0dXMgbWV0dXMgc2NlbGVyaXNxdWUgZW5pbSwgc2VkIHNjZWxlcmlzcXVlIGVzdCB1cm5hIHNlZCBqdXN0by4NCg0KTnVuYyBzZWQgY29uc2VxdWF0IHR1cnBpcywgYWMgc2FnaXR0aXMgbGlndWxhLiBOdWxsYSBjb21tb2RvIGxhb3JlZXQgbWF1cmlzLCBldCBtYXR0aXMgZmVsaXMgYmxhbmRpdCBldS4gTnVuYyBjb25zZWN0ZXR1ciB1cm5hIG5vbiBhbGlxdWV0IHJob25jdXMuIFZpdmFtdXMgcG9ydHRpdG9yIG9ybmFyZSB0b3J0b3Igdm9sdXRwYXQgYWNjdW1zYW4uIFZpdmFtdXMgYWMgZXVpc21vZCBhcmN1LiBDdXJhYml0dXIgcXVpcyBsYWN1cyBtYXVyaXMuIE1hZWNlbmFzIHF1aXMgZXggZXguIEludGVnZXIgdWxsYW1jb3JwZXIgdGVtcG9yIGV4Lg0KDQpQcmFlc2VudCB2dWxwdXRhdGUgbGFjdXMgZXUgZXN0IHRpbmNpZHVudCBtb2xsaXMuIFZlc3RpYnVsdW0gcmhvbmN1cyBydXRydW0gc2FwaWVuLCBhYyBjb21tb2RvIHNlbSB0aW5jaWR1bnQgYWMuIFV0IHJ1dHJ1bSBtaSBhdCBmZXJtZW50dW0gbW9sbGlzLiBQZWxsZW50ZXNxdWUgcG9ydHRpdG9yIGNvbnNlcXVhdCBsZWN0dXMsIHNpdCBhbWV0IGNvbW1vZG8gbWFnbmEgbGFvcmVldCBlZ2V0LiBWZXN0aWJ1bHVtIG5lcXVlIGxpZ3VsYSwgc29kYWxlcyBldSBhbnRlIG5vbiwgY29uc2VxdWF0IHNjZWxlcmlzcXVlIGVuaW0uIEluIGVnZXN0YXMgbWF4aW11cyBhbGlxdWV0LiBVdCBhdCBudW5jIGluIHRvcnRvciBhY2N1bXNhbiBwZWxsZW50ZXNxdWUuIEFlbmVhbiBmcmluZ2lsbGEgYXVjdG9yIGFyY3UgaW4gaGVuZHJlcml0LiBEb25lYyBsaWJlcm8gcmlzdXMsIHVsdHJpY2VzIHNlZCBpbXBlcmRpZXQgcXVpcywgY29uZ3VlIHF1aXMgdG9ydG9yLiBVdCBldSBsYWN1cyBsZW8uIEV0aWFtIG1hbGVzdWFkYSB0ZWxsdXMgYSBzYWdpdHRpcyBzb2xsaWNpdHVkaW4uIE51bmMgZWxlbWVudHVtIG1ldHVzIHNhcGllbiwgaW4gY29uZGltZW50dW0gcXVhbSBhbGlxdWFtIGVnZXQuIFBlbGxlbnRlc3F1ZSBjb252YWxsaXMgZWdldCBsaWJlcm8gbm9uIGZyaW5naWxsYS4gTnVsbGEgYWMgYmxhbmRpdCB0b3J0b3IsIHNlZCBpbnRlcmR1bSBtZXR1cy4gRXRpYW0gZW5pbSBtYXNzYSwgdmVuZW5hdGlzIHZpdGFlIGN1cnN1cyBwZWxsZW50ZXNxdWUsIGRhcGlidXMgcXVpcyB0dXJwaXMuIERvbmVjIG1hbGVzdWFkYSB2aXRhZSBlcm9zIHV0IGZyaW5naWxsYS4NCg0KUHJvaW4gdmVsIHZvbHV0cGF0IG9kaW8uIEV0aWFtIGZlcm1lbnR1bSwgbG9yZW0gdmVsIHNjZWxlcmlzcXVlIHBlbGxlbnRlc3F1ZSwgbnVsbGEgbGlndWxhIGFsaXF1YW0gbWFnbmEsIHNpdCBhbWV0IGRpY3R1bSB2ZWxpdCBkaWFtIGltcGVyZGlldCBsYWN1cy4gRG9uZWMgcXVpcyBzYXBpZW4gbWF1cmlzLiBOYW0gZWxlbWVudHVtIG5pc2kgY29uc2VjdGV0dXIgZG9sb3IgcHVsdmluYXIgcG9ydHRpdG9yLiBEb25lYyBpbXBlcmRpZXQgZmF1Y2lidXMgbWV0dXMgdml0YWUgbW9sbGlzLiBQcm9pbiBxdWlzIGRhcGlidXMgZWxpdCwgbm9uIHZlaGljdWxhIG9kaW8uIERvbmVjIGx1Y3R1cyBpYWN1bGlzIGVmZmljaXR1ci4gVXQgdml0YWUgdGVtcG9yIGZlbGlzLiBBbGlxdWFtIHB1bHZpbmFyIHVsdHJpY2llcyBudWxsYSwgYXVjdG9yIHZlc3RpYnVsdW0gZXJhdCBpbXBlcmRpZXQgZXQuIFNlZCBzY2VsZXJpc3F1ZSBmZXJtZW50dW0gY29uc2VxdWF0LiBRdWlzcXVlIG5vbiBkaWFtIGlkIGxpZ3VsYSBjb252YWxsaXMgZmV1Z2lhdCBldCBhIGVsaXQuIEV0aWFtIGNvbnNlY3RldHVyLCBkdWkgZWdldCBjb252YWxsaXMgcG9ydGEsIG1hc3NhIHRlbGx1cyBwbGFjZXJhdCBzYXBpZW4sIHV0IHRyaXN0aXF1ZSBtYWduYSBhcmN1IGVnZXQgZHVpLg0KDQpBZW5lYW4gbm9uIHZlbGl0IGV1IHZlbGl0IG1hbGVzdWFkYSB2b2x1dHBhdCBhIGV1IGR1aS4gTW9yYmkgdHVycGlzIHZlbGl0LCB0aW5jaWR1bnQgY29tbW9kbyBjb252YWxsaXMgdWxsYW1jb3JwZXIsIHRpbmNpZHVudCBpZCBlbmltLiBOdWxsYW0gc2VkIGFjY3Vtc2FuIG1ldHVzLiBBbGlxdWFtIGZpbmlidXMgbWV0dXMgZXQgb3JjaSB2ZXN0aWJ1bHVtIGRhcGlidXMuIER1aXMgcXVpcyBuZXF1ZSBldSBuaWJoIGF1Y3RvciBhbGlxdWV0LiBJbnRlZ2VyIHVsdHJpY2llcywgdGVsbHVzIGFjIHBlbGxlbnRlc3F1ZSBkaWduaXNzaW0sIG5lcXVlIGVyYXQgcG9ydGEgdHVycGlzLCBhdCBkaWN0dW0gZXggbmVxdWUgZXUgbGFjdXMuIFNlZCBzdXNjaXBpdCBkdWkgZWdldCBkaWduaXNzaW0gZGljdHVtLiBEb25lYyB2ZWhpY3VsYSBlcmF0IGlkIHNhZ2l0dGlzIG1hbGVzdWFkYS4gSW50ZWdlciBmcmluZ2lsbGEgaXBzdW0gc2VkIHJpc3VzIGNvbmRpbWVudHVtIHRlbXBvci4gTW9yYmkgaW4gdGluY2lkdW50IGVyb3MuIENyYXMgbW9sbGlzIG1hc3NhIHF1YW0sIHRyaXN0aXF1ZSBsb2JvcnRpcyBkaWFtIGNvbmRpbWVudHVtIHF1aXMuIEFsaXF1YW0gYWxpcXVldCBhYyBudWxsYSBlZ2V0IGZldWdpYXQuIFBlbGxlbnRlc3F1ZSBldCB2dWxwdXRhdGUgbWF1cmlzLCBldCBlbGVtZW50dW0gZHVpLiBEb25lYyBwdWx2aW5hciB1dCBhbnRlIGV1IGJsYW5kaXQuDQoNClNlZCBjdXJzdXMsIGVyYXQgcXVpcyBwaGFyZXRyYSBpbXBlcmRpZXQsIGxpZ3VsYSB0dXJwaXMgdHJpc3RpcXVlIG1hZ25hLCBzZWQgdWx0cmljZXMgdGVsbHVzIGRvbG9yIGRpZ25pc3NpbSBtYXNzYS4gRG9uZWMgbHVjdHVzIGZhdWNpYnVzIGFyY3UsIGFjIHJob25jdXMgbGVvIHBsYWNlcmF0IGFjLiBJbnRlZ2VyIGxvcmVtIGR1aSwgZGljdHVtIGF0IGNvbnNlcXVhdCB1dCwgZmFjaWxpc2lzIGV1IGxvcmVtLiBWZXN0aWJ1bHVtIHNvbGxpY2l0dWRpbiBlbGl0IG5vbiBpcHN1bSBzb2xsaWNpdHVkaW4sIHF1aXMgZWxlbWVudHVtIGxpZ3VsYSB2ZXN0aWJ1bHVtLiBBZW5lYW4gdmVoaWN1bGEgbGlndWxhIGRpYW0sIGFjIGNvbmd1ZSBhdWd1ZSBwb3J0dGl0b3IgZXQuIFByb2luIHNlZCByaXN1cyB1cm5hLiBTZWQgdmVsIGVmZmljaXR1ciBsaWJlcm8sIGVnZXQgc3VzY2lwaXQgbGlndWxhLg0KDQpWZXN0aWJ1bHVtIHNlZCBtYXVyaXMgYXQgbG9yZW0gaW50ZXJkdW0gbWFsZXN1YWRhLiBJbiBhIG5pYmggbG9yZW0uIE51bGxhbSBhbnRlIHZlbGl0LCBiaWJlbmR1bSB2aXRhZSBjb25kaW1lbnR1bSBhYywgbW9sbGlzIHZlbCB0ZWxsdXMuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFF1aXNxdWUgbmVjIHVybmEgc2VkIHNlbSBwbGFjZXJhdCBzdXNjaXBpdC4gSW4gcXVhbSByaXN1cywgZmF1Y2lidXMgc2VkIGN1cnN1cyBpZCwgb3JuYXJlIGV0IGFudGUuIENyYXMgbGliZXJvIHF1YW0sIGN1cnN1cyBhIGFjY3Vtc2FuIHF1aXMsIGFsaXF1YW0gc2VkIGlwc3VtLg0KDQpTZWQgdXQgc29sbGljaXR1ZGluIGVuaW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIENyYXMgc2VtIG1hc3NhLCBmcmluZ2lsbGEgc2l0IGFtZXQgbmliaCBzZWQsIGVmZmljaXR1ciBzb2RhbGVzIGVyb3MuIFByb2luIGF0IHN1c2NpcGl0IG1hdXJpcywgZWdldCBjb252YWxsaXMgbmliaC4gUHJhZXNlbnQgc2VkIHN1c2NpcGl0IGVsaXQsIHNpdCBhbWV0IGVsZW1lbnR1bSBkdWkuIEluIGF0IGVyb3Mgc2l0IGFtZXQgbG9yZW0gb3JuYXJlIHBoYXJldHJhLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBDdXJhYml0dXIgaWFjdWxpcyB1cm5hIGVyb3MsIGV0IHRlbXBvciBvcmNpIGJsYW5kaXQgaW4uIFV0IHZlbGl0IG1pLCBlZmZpY2l0dXIgdXQgbGFvcmVldCB2ZWwsIGVmZmljaXR1ciBpZCBuaWJoLiBEdWlzIG5lYyBzYXBpZW4gaW4gbGVvIHZ1bHB1dGF0ZSBhdWN0b3Igdml0YWUgaWQgb2Rpby4gSW4gbmVxdWUgYW50ZSwgYmliZW5kdW0gcXVpcyB2dWxwdXRhdGUgaW4sIHB1bHZpbmFyIHF1aXMgbGliZXJvLiBWaXZhbXVzIGEgYW50ZSBlZ2V0IGxpYmVybyBkaWN0dW0gY29uc2VxdWF0LiBTZWQgdGluY2lkdW50IG1hdHRpcyBncmF2aWRhLiBNYWVjZW5hcyBjb25ndWUgdmVuZW5hdGlzIGxlbyBzZWQgaW1wZXJkaWV0Lg0KDQpTZWQgc2l0IGFtZXQgc2VtIHNhZ2l0dGlzLCBhbGlxdWFtIHVybmEgcXVpcywgZGljdHVtIGVyYXQuIFN1c3BlbmRpc3NlIG1pIGxlbywgdGVtcG9yIGV0IG5pc2kgc2l0IGFtZXQsIGNvbnNlY3RldHVyIHNlbXBlciBsYWN1cy4gUGVsbGVudGVzcXVlIHBsYWNlcmF0IG5pYmggbGliZXJvLCBldSBncmF2aWRhIHF1YW0gYmxhbmRpdCBpbi4gVmVzdGlidWx1bSBjb25zZWN0ZXR1ciBhYyBwdXJ1cyBpZCBydXRydW0uIFByYWVzZW50IGdyYXZpZGEsIGVuaW0gaWQgZXVpc21vZCBjb25zZWN0ZXR1ciwgb2RpbyBmZWxpcyBjdXJzdXMgc2VtLCBzaXQgYW1ldCBmZXVnaWF0IGxpZ3VsYSBudWxsYSBlZ2V0IG5pYmguIFByYWVzZW50IHNlZCB0dXJwaXMgZWxlbWVudHVtLCBhbGlxdWV0IGR1aSBldCwgYWNjdW1zYW4gdHVycGlzLiBTZWQgaW50ZXJkdW0gdXQgdGVsbHVzIHF1aXMgcG9ydGEuIFByb2luIGVmZmljaXR1ciwgbGFjdXMgYWMgYWNjdW1zYW4gbW9sZXN0aWUsIGxlbyBtYWduYSBjb25zZXF1YXQgYW50ZSwgdGluY2lkdW50IHRyaXN0aXF1ZSBudW5jIHRlbGx1cyBpZCBqdXN0by4gQWxpcXVhbSBhYyB2ZXN0aWJ1bHVtIGVsaXQuIE9yY2kgdmFyaXVzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsIG5hc2NldHVyIHJpZGljdWx1cyBtdXMuIE1vcmJpIGxvYm9ydGlzLCBtaSB2aXRhZSBlZ2VzdGFzIGxvYm9ydGlzLCBlc3QgbWFnbmEgY29uc2VxdWF0IGR1aSwgc2VkIHZhcml1cyBuaXNsIHJpc3VzIG5vbiBvZGlvLiBOYW0gY29uZGltZW50dW0gbGliZXJvIGFjIG5pc2kgY29uc2VjdGV0dXIsIHZlbCBtYXhpbXVzIGRpYW0gZmVybWVudHVtLiBJbnRlZ2VyIGZpbmlidXMgZmV1Z2lhdCBkaWFtLCBlZ2V0IGltcGVyZGlldCBudW5jLiBJbiB2ZWhpY3VsYSBzb2RhbGVzIGR1aSwgdXQgZXVpc21vZCBudWxsYSB2aXZlcnJhIG5vbi4gUHJvaW4gbWF0dGlzIGFsaXF1ZXQgbWFnbmEgaW4gbWFsZXN1YWRhLiBBZW5lYW4gYXQgdWxsYW1jb3JwZXIgYXJjdS4NCg0KRnVzY2Ugc29kYWxlcyBsb2JvcnRpcyBwdXJ1cyBzZWQgdGluY2lkdW50LiBQcm9pbiB2aXRhZSB0dXJwaXMgbGVvLiBRdWlzcXVlIGx1Y3R1cywgbGlndWxhIHV0IG1vbGxpcyBsYWNpbmlhLCBlcm9zIG1pIGFjY3Vtc2FuIHB1cnVzLCBkaWN0dW0gdmVzdGlidWx1bSBtZXR1cyBlcm9zIHNjZWxlcmlzcXVlIG5lcXVlLiBVdCBzZW1wZXIgbG9yZW0gbmVjIG1vbGxpcyBmaW5pYnVzLiBOdWxsYW0gaW1wZXJkaWV0IHV0IGZlbGlzIHNpdCBhbWV0IHBvc3VlcmUuIFN1c3BlbmRpc3NlIGFjY3Vtc2FuIHBvcnRhIHRlbGx1cyBhYyBsb2JvcnRpcy4gSW4gbm9uIHZlbmVuYXRpcyBlbGl0LiBJbnRlZ2VyIGNvbnZhbGxpcyBub24gZG9sb3IgdXQgdnVscHV0YXRlLiBFdGlhbSBldWlzbW9kIG5pc2kgbWksIGluIGNvbnNlcXVhdCB0dXJwaXMgdmVzdGlidWx1bSB2ZWwuIERvbmVjIHNhZ2l0dGlzLCB0b3J0b3IgdmVsIGZlcm1lbnR1bSB1bHRyaWNlcywgbGVjdHVzIHRvcnRvciBwb3J0dGl0b3IgbWF1cmlzLCBpZCBlbGVtZW50dW0gbmlzbCByaXN1cyBzZWQgZXJhdC4gU2VkIGV1IGxlbyB2aXRhZSBvcmNpIGNvbnNlcXVhdCB0aW5jaWR1bnQu`
func Base64DecodeString(s string) []byte {
schemaBytes, _ := base64.StdEncoding.DecodeString(s)
return schemaBytes
}
func BenchmarkBase64DecodeString(b *testing.B) {
b.Log("decode len", len(str))
for n := 0; n < b.N; n++ {
Base64DecodeString(str)
}
}
func BenchmarkBase64DecodeString2(b *testing.B) {
b.Log("decode len", len(str2))
for n := 0; n < b.N; n++ {
Base64DecodeString(str2)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment