boilerpipe

package module
v0.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 20, 2018 License: Apache-2.0 Imports: 12 Imported by: 0

README

go-boilerpipe

Golang port of the boilerpipe Java library written by Christian Kohlschütter

Build Status GoDoc

Boilerpipe removes boilerplate and extracts text content from HTML documents.

Currently it only supports article extraction which includes the title, the date, and the content.

Best attempts will be made to follow Semantic Versioning 2.0.0 rules, but no API guarantees will be made until version 1.0.0.

However, existing tags will not change guaranteeing that vendoring will not break.

Getting Started

To install: go get -u github.com/jlubawy/go-boilerpipe/...

Command-Line Tool

$ boilerpipe help

Boilerpipe removes boilerplate and extracts text content from HTML documents.

Usage:

       boilerpipe command [arguments]

The commands are:

       extract    extract text content from an HTML document
       serve      start a HTTP server for extracting text from HTML documents
       version    print boilerpipe version

Use "boilerpipe help [command]" for more information about a command.

Using the library

See examples in filter_test.go.

Documentation

Overview

Package boilerpipe removes boilerplate and extracts text content from HTML documents.

This package is the Golang port of the original Java library written by Christian Kohlschütter that can be found here: https://github.com/kohlschutter/boilerpipe

Index

Examples

Constants

View Source
const Version = "0.3.0"

Version is the version of the boilerpipe package.

Variables

Functions

This section is empty.

Types

type Document added in v0.1.3

type Document struct {
	// Title is the title of the document.
	Title string

	Author string

	// Date is the date the document was created.
	Date time.Time

	TextBlocks []*TextBlock
	// contains filtered or unexported fields
}

func ParseDocument added in v0.2.0

func ParseDocument(r io.Reader) (*Document, error)

ParseDocument parses an HTML document and returns a Document for further processing through filters.

Example
// Order of URLs much match the content in testdata
var rawurls = []string{
	"https://blog.openshift.com/day-18-boilerpipe-article-extraction-for-java-developers",
	"https://lasvegassun.com/news/2017/apr/20/lease-no-rent-for-raiders-at-las-vegas-stadium",
	"https://lasvegassun.com/news/2017/may/22/yucca-mountain-nuclear-waste-donald-trump",
	"https://dealbook.nytimes.com/2006/09/12/big-names-pull-cash-from-venture-capital-fund-over-political-contributions",
}

for i, rawurl := range rawurls {
	var date time.Time

	// Normalize the URL
	u, err := normurl.Parse(rawurl)
	if err != nil {
		log.Fatal(err)
	}

	// Retrieve the content
	f, err := os.Open(filepath.Join("testdata", fmt.Sprintf("%d.html", i)))
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	// Create and process the document
	doc, err := ParseDocument(f)
	if err != nil {
		log.Fatal(err)
	}
	ArticlePipeline.Process(doc)

	// Log the document's title
	fmt.Println(doc.Title)

	// Get the time at which the article was written
	if d, exists := u.Date(); exists {
		// If the URL has a date use it first since it's probably more
		// reliable
		date = d
	} else {
		// Else use the document's date
		date = doc.Date
	}

	// Only log the date if it's not empty
	if !date.Equal(time.Time{}) {
		fmt.Println(date.Format("January 2, 2006"))
	}

	// Log the normalized URL
	fmt.Println(u)

	// Log the base64 encoded content
	fmt.Println(base64.StdEncoding.EncodeToString([]byte(doc.Content())))
	fmt.Println()
}
Output:

Day 18: Boilerpipe--Article Extraction for Java Developers – OpenShift Blog
November 15, 2013
https://blog.openshift.com/day-18-boilerpipe-article-extraction-for-java-developers
RGF5IDE4OiBCb2lsZXJwaXBl4oCTQXJ0aWNsZSBFeHRyYWN0aW9uIGZvciBKYXZhIERldmVsb3BlcnMKTm92ZW1iZXIgMTUsIDIwMTMKQnkgU2hla2hhciBHdWxhdGkKVG9kYXkgZm9yIG15IDMwIGRheSBjaGFsbGVuZ2UgLCBJIHdhbnRlZCB0byBsZWFybiBob3cgdG8gZG8gdGV4dCBhbmQgaW1hZ2UgZXh0cmFjdGlvbiBmcm9tIHdlYiBsaW5rcyB1c2luZyB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhpcyBpcyBhIGNvbW1vbiByZXF1aXJlbWVudCBpbiBtb3N0IG9mIHRoZSBjb250ZW50IGRpc2NvdmVyeSB3ZWJzaXRlcyBsaWtlIFByaXNtYXRpYyAuIEluIHRoaXMgYmxvZywgSSB3aWxsIHNob3cgeW91IGhvdyB0byB1c2UgYSBKYXZhIGxpYnJhcnkgY2FsbGVkIGJvaWxlcnBpcGUgdG8gYWNjb21wbGlzaCB0aGlzIHRhc2suClByZXJlcXVpc2l0ZQpCYXNpYyBKYXZhIGtub3dsZWRnZSBpcyByZXF1aXJlZC4gSW5zdGFsbCB0aGUgbGF0ZXN0IEphdmEgRGV2ZWxvcG1lbnQgS2l0IChKREspIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gWW91IGNhbiBlaXRoZXIgaW5zdGFsbCBPcGVuSkRLIDcgb3IgT3JhY2xlIEpESyA3IC4gT3BlblNoaWZ0IHN1cHBvcnRzIGJvdGggT3BlbkpESyA2IGFuZCA3LgpTaWduIHVwIGZvciBhbiBPcGVuU2hpZnQgQWNjb3VudCAuVG9kYXkgZm9yIG15IDMwIGRheSBjaGFsbGVuZ2UgLCBJIGRlY2lkZWQgdG8gbGVhcm4gaG93IHRvIGRvIHRleHQgYW5kIGltYWdlIGV4dHJhY3Rpb24gZnJvbSB3ZWIgbGlua3MgdXNpbmcgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiByZXF1aXJlbWVudCBpbiBtb3N0IG9mIHRoZSBjb250ZW50IGRpc2NvdmVyeSB3ZWJzaXRlcyBsaWtlIFByaXNtYXRpYyAuIEluIHRoaXMgYmxvZywgd2Ugd2lsbCBsZWFybiBob3cgd2UgY2FuIHVzZSBhIEphdmEgbGlicmFyeSBjYWxsZWQgYm9pbGVycGlwZSB0byBhY2NvbXBsaXNoIHRoaXMgdGFzay4KUHJlcmVxdWlzaXRlCkJhc2ljIEphdmEga25vd2xlZGdlIGlzIHJlcXVpcmVkLiBJbnN0YWxsIHRoZSBsYXRlc3QgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESykgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtLiBZb3UgY2FuIGVpdGhlciBpbnN0YWxsIE9wZW5KREsgNyBvciBPcmFjbGUgSkRLIDcgLiBPcGVuU2hpZnQgc3VwcG9ydHMgYm90aCBPcGVuSkRLIDYgYW5kIDcuClNpZ24gdXAgZm9yIGFuIE9wZW5TaGlmdCBBY2NvdW50IC4gSXQgaXMgY29tcGxldGVseSBmcmVlIGFuZCBSZWQgSGF0IGdpdmVzIGV2ZXJ5IHVzZXIgdGhyZWUgZnJlZSBHZWFycyBvbiB3aGljaCB0byBydW4geW91ciBhcHBsaWNhdGlvbnMuIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhlIGNvbWJpbmVkIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGVhY2ggdXNlciBpcyAxLjUgR0Igb2YgbWVtb3J5IGFuZCAzIEdCIG9mIGRpc2sgc3BhY2UuCkluc3RhbGwgdGhlIHJoYyBjbGllbnQgdG9vbCBvbiB5b3VyIG1hY2hpbmUuIFJIQyBpcyBhIHJ1YnkgZ2VtIHNvIHlvdSBuZWVkIHRvIGhhdmUgcnVieSAxLjguNyBvciBhYm92ZSBvbiB5b3VyIG1hY2hpbmUuIFRvIGluc3RhbGwgcmhjLCBqdXN0IHR5cGVzdWRvIGdlbSBpbnN0YWxsIHJoYyBJZiB5b3UgYWxyZWFkeSBoYXZlIG9uZSwgbWFrZSBzdXJlIGl0IGlzIHRoZSBsYXRlc3Qgb25lLiBUbyB1cGRhdGUgeW91ciByaGMsIGV4ZWN1dGUgdGhlIGNvbW1hbmQgc3VkbyBnZW0gdXBkYXRlIHJoYyBGb3IgYWRkaXRpb25hbCBhc3Npc3RhbmNlIHNldHRpbmcgdXAgdGhlIHJoYyBjb21tYW5kLWxpbmUgdG9vbCwgc2VlIHRoZSBmb2xsb3dpbmcgcGFnZTogaHR0cHM6Ly93d3cub3BlbnNoaWZ0LmNvbS9kZXZlbG9wZXJzL3JoYy1jbGllbnQtdG9vbHMtaW5zdGFsbApTZXR1cCB5b3VyIE9wZW5TaGlmdCBhY2NvdW50IHVzaW5nIHRoZSByaGMgc2V0dXAgY29tbWFuZC4gVGhpcyBjb21tYW5kIHdpbGwgaGVscCB5b3UgY3JlYXRlIGEgbmFtZXNwYWNlIGFuZCB1cGxvYWQgeW91ciBzc2gga2V5cyB0byBPcGVuU2hpZnQgc2VydmVyLgpTdGVwMSA6IENyZWF0ZSBhIEpCb3NzIEVBUCBhcHBsaWNhdGlvbgpMZXTigJlzIHN0YXJ0IGNyZWF0aW5nIHRoZSBkZW1vIGFwcGxpY2F0aW9uLiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgbmV3c2FwcC4KJCByaGMgY3JlYXRlLWFwcCBuZXdzYXBwIGpib3NzZWFwCklmIHlvdSBoYXZlIGFjY2VzcyB0byBtZWRpdW0gZ2VhcnMgdGhlbiB5b3UgY2FuIHVzZSBmb2xsb3dpbmcgY29tbWFuZC4KJCByaGMgY3JlYXRlLWFwcCBuZXdzYXBwIGpib3NzZWFwIC1nIG1lZGl1bQpUaGlzIHdpbGwgY3JlYXRlIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBmb3IgdXMsIGNhbGxlZCBhIGdlYXIsIGFuZCBzZXR1cCBhbGwgb2YgdGhlIHJlcXVpcmVkIFNFTGludXggcG9saWNpZXMgYW5kIGNncm91cCBjb25maWd1cmF0aW9uLiBPcGVuU2hpZnQgd2lsbCBhbHNvIHNldHVwIGEgcHJpdmF0ZSBnaXQgcmVwb3NpdG9yeSBmb3IgdXMgYW5kIGNsb25lIHRoZSByZXBvc2l0b3J5IHRvIHRoZSBsb2NhbCBzeXN0ZW0uIEZpbmFsbHksIE9wZW5TaGlmdCB3aWxsIHByb3BhZ2F0ZSB0aGUgRE5TIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBUaGUgYXBwbGljYXRpb24gd2lsbCBiZSBhY2Nlc3NpYmxlIGF0IGh0dHA6Ly9uZXdzYXBwLXtkb21haW4tbmFtZX0ucmhjbG91ZC5jb20vLiBSZXBsYWNlIHtkb21haW4tbmFtZX0gd2l0aCB5b3VyIG93biB1bmlxdWUgT3BlblNoaWZ0IGRvbWFpbiBuYW1lIChhbHNvIHNvbWV0aW1lcyBjYWxsZWQgYSBuYW1lc3BhY2UpLgpTdGVwIDIgOiBBZGQgTWF2ZW4gZGVwZW5kZW5jaWVzCkluIHRoZSBwb20ueG1sIGZpbGUgYWRkIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jeToKJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O2RlLmwzcy5ib2lsZXJwaXBlJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtib2lsZXJwaXBlJmx0Oy9hcnRpZmFjdElkJmd0OyAmbHQ7dmVyc2lvbiZndDsxLjIuMCZsdDsvdmVyc2lvbiZndDsgJmx0Oy9kZXBlbmRlbmN5Jmd0OyAmbHQ7ZGVwZW5kZW5jeSZndDsgJmx0O2dyb3VwSWQmZ3Q7eGVyY2VzJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDt4ZXJjZXNJbXBsJmx0Oy9hcnRpZmFjdElkJmd0OyAmbHQ7dmVyc2lvbiZndDsyLjkuMSZsdDsvdmVyc2lvbiZndDsgJmx0Oy9kZXBlbmRlbmN5Jmd0OyAmbHQ7ZGVwZW5kZW5jeSZndDsgJmx0O2dyb3VwSWQmZ3Q7bmV0LnNvdXJjZWZvcmdlLm5la29odG1sJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtuZWtvaHRtbCZsdDsvYXJ0aWZhY3RJZCZndDsgJmx0O3ZlcnNpb24mZ3Q7MS45LjEzJmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7CllvdSB3aWxsIGFsc28gbmVlZCB0byBhZGQgYSBuZXcgcmVwb3NpdG9yeQombHQ7cmVwb3NpdG9yeSZndDsgJmx0O2lkJmd0O2JvaWxlcnBpcGUtbTItcmVwbyZsdDsvaWQmZ3Q7ICZsdDt1cmwmZ3Q7aHR0cDovL2JvaWxlcnBpcGUuZ29vZ2xlY29kZS5jb20vc3ZuL3JlcG8vJmx0Oy91cmwmZ3Q7ICZsdDtyZWxlYXNlcyZndDsgJmx0O2VuYWJsZWQmZ3Q7dHJ1ZSZsdDsvZW5hYmxlZCZndDsgJmx0Oy9yZWxlYXNlcyZndDsgJmx0O3NuYXBzaG90cyZndDsgJmx0O2VuYWJsZWQmZ3Q7ZmFsc2UmbHQ7L2VuYWJsZWQmZ3Q7ICZsdDsvc25hcHNob3RzJmd0OyAmbHQ7L3JlcG9zaXRvcnkmZ3Q7CkFsc28gdXBkYXRlIHRoZSBtYXZlbiBwcm9qZWN0IHRvIEphdmEgNyBieSB1cGRhdGluZyBhIGNvdXBsZSBvZiBwcm9wZXJ0aWVzIGluIHRoZSBwb20ueG1sIGZpbGU6CiZsdDttYXZlbi5jb21waWxlci5zb3VyY2UmZ3Q7MS43Jmx0Oy9tYXZlbi5jb21waWxlci5zb3VyY2UmZ3Q7ICZsdDttYXZlbi5jb21waWxlci50YXJnZXQmZ3Q7MS43Jmx0Oy9tYXZlbi5jb21waWxlci50YXJnZXQmZ3Q7Ck5vdyB1cGRhdGUgdGhlIE1hdmVuIHByb2plY3QgUmlnaHQgY2xpY2sgJmd0OyBNYXZlbiAmZ3Q7IFVwZGF0ZSBQcm9qZWN0LgpTdGVwIDMgOiBFbmFibGUgQ0RJCldlIGFyZSB1c2luZyBDREkgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBDREkgb3IgQ29udGV4dCBhbmQgRGVwZW5kZW5jeSBpbmplY3Rpb24gaXMgYSBKYXZhIEVFIDYgc3BlY2lmaWNhdGlvbiB3aGljaCBlbmFibGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIGEgSmF2YSBFRSA2IHByb2plY3QuIENESSBkZWZpbmVzIHR5cGUtc2FmZSBkZXBlbmRlbmN5IGluamVjdGlvbiBtZWNoYW5pc20gZm9yIEphdmEgRUUuIEFsbW9zdCBhbnkgUE9KTyBjYW4gYmUgaW5qZWN0ZWQgYXMgYSBDREkgYmVhbi4KQ3JlYXRlIGEgbmV3IHhtbCBmaWxlIG5hbWVkIGJlYW5zLnhtbCBpbiB0aGUgc3JjL21haW4vd2ViYXBwL1dFQi1JTkYgZm9sZGVyLiBSZXBsYWNlIHRoZSBjb250ZW50IG9mIGJlYW5zLnhtbCB3aXRoIHRoZSBmb2xsb3dpbmc6CiZsdDtiZWFucyB4bWxucz0mIzM0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSYjMzQ7IHhtbG5zOnhzaT0mIzM0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJiMzNDsgeHNpOnNjaGVtYUxvY2F0aW9uPSYjMzQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9iZWFuc18xXzAueHNkJiMzNDsmZ3Q7ICZsdDsvYmVhbnMmZ3Q7ClN0ZXAgNCA6IENyZWF0ZSBCb2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlCk5vdyB3ZSBjYW4gY3JlYXRlIGFuIEJvaWxlcnBpcGVDb250ZW50RXh0cmFjdGlvblNlcnZpY2Ugc2VydmljZSBjbGFzcyB3aGljaCB3aWxsIHRha2UgYSB1cmwgYW5kIGZpbmQgdGhlIHRpdGxlIGFuZCBhcnRpY2xlIHRleHQgZnJvbSBpdC4KaW1wb3J0IGphdmEubmV0LlVSTDsgaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsgaW1wb3J0IGphdmEudXRpbC5MaXN0OyBpbXBvcnQgY29tLm5ld3NhcHAuYm9pbGVycGlwZS5pbWFnZS5JbWFnZTsgaW1wb3J0IGNvbS5uZXdzYXBwLmJvaWxlcnBpcGUuaW1hZ2UuSW1hZ2VFeHRyYWN0b3I7IGltcG9ydCBkZS5sM3MuYm9pbGVycGlwZS5Cb2lsZXJwaXBlRXh0cmFjdG9yOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZG9jdW1lbnQuVGV4dERvY3VtZW50OyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZXh0cmFjdG9ycy5BcnRpY2xlRXh0cmFjdG9yOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZXh0cmFjdG9ycy5Db21tb25FeHRyYWN0b3JzOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuc2F4LkJvaWxlcnBpcGVTQVhJbnB1dDsgaW1wb3J0IGRlLmwzcy5ib2lsZXJwaXBlLnNheC5IVE1MRG9jdW1lbnQ7IGltcG9ydCBkZS5sM3MuYm9pbGVycGlwZS5zYXguSFRNTEZldGNoZXI7IHB1YmxpYyBjbGFzcyBCb2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlIHsgcHVibGljIENvbnRlbnQgY29udGVudChTdHJpbmcgdXJsKSB7IHRyeSB7IGZpbmFsIEhUTUxEb2N1bWVudCBodG1sRG9jID0gSFRNTEZldGNoZXIuZmV0Y2gobmV3IFVSTCh1cmwpKTsgZmluYWwgVGV4dERvY3VtZW50IGRvYyA9IG5ldyBCb2lsZXJwaXBlU0FYSW5wdXQoaHRtbERvYy50b0lucHV0U291cmNlKCkpLmdldFRleHREb2N1bWVudCgpOyBTdHJpbmcgdGl0bGUgPSBkb2MuZ2V0VGl0bGUoKTsgU3RyaW5nIGNvbnRlbnQgPSBBcnRpY2xlRXh0cmFjdG9yLklOU1RBTkNFLmdldFRleHQoZG9jKTsgZmluYWwgQm9pbGVycGlwZUV4dHJhY3RvciBleHRyYWN0b3IgPSBDb21tb25FeHRyYWN0b3JzLktFRVBfRVZFUllUSElOR19FWFRSQUNUT1I7IGZpbmFsIEltYWdlRXh0cmFjdG9yIGllID0gSW1hZ2VFeHRyYWN0b3IuSU5TVEFOQ0U7IExpc3QmbHQ7SW1hZ2UmZ3Q7IGltYWdlcyA9IGllLnByb2Nlc3MobmV3IFVSTCh1cmwpLCBleHRyYWN0b3IpOyBDb2xsZWN0aW9ucy5zb3J0KGltYWdlcyk7IFN0cmluZyBpbWFnZSA9IG51bGw7IGlmICghaW1hZ2VzLmlzRW1wdHkoKSkgeyBpbWFnZSA9IGltYWdlcy5nZXQoMCkuZ2V0U3JjKCk7IH0gcmV0dXJuIG5ldyBDb250ZW50KHRpdGxlLCBjb250ZW50LnN1YnN0cmluZygwLCAyMDApLCBpbWFnZSk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHJldHVybiBudWxsOyB9IH0gfQpUaGUgY29kZSBhYm92ZToKRmlyc3QgZmV0Y2hlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIHVybC4KUGFyc2VzIHRoZSBIVE1MIGRvY3VtZW50IGFuZCByZXR1cm4gVGV4dERvY3VtZW50LgpHZXRzIHRoZSB0aXRsZSBmcm9tIHRoZSB0ZXh0IGRvY3VtZW50LgpFeHRyYWN0cyBjb250ZW50IGZyb20gdGhlIHRleHQgYW5kIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHZhbHVlIG9iamVjdC4KU3RlcCA1IDogRW5hYmxlIEpBWC1SUwpUbyBlbmFibGUgSkFYLVJTLCBjcmVhdGUgYSBjbGFzcyB3aGljaCBleHRlbmRzIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24gYW5kIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHBhdGggdXNpbmcgdGhlIGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aCBhbm5vdGF0aW9uIGFzIHNob3duIGJlbG93LgppbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOyBpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsgQEFwcGxpY2F0aW9uUGF0aCgmIzM0Oy9hcGkvdjEmIzM0OykgcHVibGljIGNsYXNzIEpheHJzSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBcHBsaWNhdGlvbnsgfQpTdGVwIDYgOiBDcmVhdGUgQ29udGVudEV4dHJhY3Rpb25SZXNvdXJjZQpOb3cgd2Ugd2lsbCBjcmVhdGUgb3VyIENvbnRlbnRFeHRyYWN0aW9uUmVzb3VyY2UgY2xhc3Mgd2hpY2ggd2lsbCByZXR1cm4gYSBjb250ZW50IG9iamVjdCBhcyBKU09OLiBDcmVhdGUgYSBuZXcgY2xhc3MgbmFtZWQgQ29udGVudEV4dHJhY3Rpb25SZXNvdXJjZSBhbmQgcmVwbGFjZSB0aGUgY29kZSB3aXRoIHRoZSBjb250ZW50cyBzaG93biBiZWxvdzoKaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7IGltcG9ydCBqYXZheC53cy5ycy5HRVQ7IGltcG9ydCBqYXZheC53cy5ycy5QYXRoOyBpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7IGltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOyBpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7IGltcG9ydCBjb20ubmV3c2FwcC5zZXJ2aWNlLkJvaWxlcnBpcGVDb250ZW50RXh0cmFjdGlvblNlcnZpY2U7IGltcG9ydCBjb20ubmV3c2FwcC5zZXJ2aWNlLkNvbnRlbnQ7IEBQYXRoKCYjMzQ7L2NvbnRlbnQmIzM0OykgcHVibGljIGNsYXNzIENvbnRlbnRFeHRyYWN0aW9uUmVzb3VyY2UgeyBASW5qZWN0IHByaXZhdGUgQm9pbGVycGlwZUNvbnRlbnRFeHRyYWN0aW9uU2VydmljZSBib2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlOyBAR0VUIEBQcm9kdWNlcyh2YWx1ZSA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKSBwdWJsaWMgQ29udGVudCBleHRyYWN0Q29udGVudChAUXVlcnlQYXJhbSgmIzM0O3VybCYjMzQ7KSBTdHJpbmcgdXJsKSB7IHJldHVybiBib2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlLmNvbnRlbnQodXJsKTsgfSB9CkRlcGxveSB0byBPcGVuU2hpZnQKRmluYWxseSwgZGVwbG95IHRoZSBjaGFuZ2VzIHRvIE9wZW5TaGlmdAokIGdpdCBhZGQgLiAkIGdpdCBjb21taXQgLWFtICYjMzQ7TmV3QXBwJiMzNDsgJCBnaXQgcHVzaApBZnRlciB0aGUgY29kZSBpcyBwdXNoZWQgYW5kIHRoZSB3YXIgaXMgc3VjY2Vzc2Z1bGx5IGRlcGxveWVkLCB3ZSBjYW4gdmlldyB0aGUgYXBwbGljYXRpb24gcnVubmluZyBhdCBodHRwOi8vbmV3c2FwcC17ZG9tYWluLW5hbWV9LnJoY2xvdWQuY29tLiBNeSBzYW1wbGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBhdCBodHRwOi8vbmV3c2FwcC10MjAucmhjbG91ZC5jb20gLgpOb3cgeW91IGNhbiB0ZXN0IGJ5IHN1Ym1pdHRpbmcgYSBsaW5rIGluIHRoZSBhcHBsaWNhdGlvbiB1aS4KVGhhdOKAmXMgaXQgZm9yIHRvZGF5LiBLZWVwIGdpdmluZyBmZWVkYmFjay4KTmV4dCBTdGVwcw==

Lease: No rent for Las Vegas Raiders at new stadium - Las Vegas Sun Newspaper
April 20, 2017
https://lasvegassun.com/news/2017/apr/20/lease-no-rent-for-raiders-at-las-vegas-stadium
TGVhc2U6IE5vIHJlbnQgZm9yIExhcyBWZWdhcyBSYWlkZXJzIGF0IG5ldyBzdGFkaXVtCkEgZmFuIHdlYXJzIGEgUmFpZGVycyBULXNoaXJ0IG91dHNpZGUgYSBtZWV0aW5nIG9mIHRoZSBMYXMgVmVnYXMgU3RhZGl1bSBBdXRob3JpdHkgb24gVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3LiBUaGUgUmFpZGVycyB3aWxsIG1vdmUgZnJvbSBPYWtsYW5kIHRvIExhcyBWZWdhcyBhZnRlciBjb25zdHJ1Y3Rpb24gb2YgYSBuZXcgc3RhZGl1bSBpcyBjb21wbGV0ZWQuCkZyb20gc3RhZmYgYW5kIHdpcmUgcmVwb3J0cwpQdWJsaXNoZWQgVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3IHwgMjowMiBwLm0uClVwZGF0ZWQgVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3IHwgMjoxNyBwLm0uClRoZSBPYWtsYW5kIFJhaWRlcnMgd291bGQgbm90IHBheSByZW50IGF0IHRoZSBwcm9wb3NlZCBzdGFkaXVtIHRoZXkgd2FudCB0byB1c2UgaW4gTGFzIFZlZ2FzLgpBIGRyYWZ0IG9mIGEgbGVhc2UgYWdyZWVtZW50IGNhbGxpbmcgZm9yIG5vIHJlbnQgd2FzIHVudmVpbGVkIGR1cmluZyBhIFRodXJzZGF5IGdhdGhlcmluZyBvZiB0aGUgcHVibGljIGVudGl0eSBvdmVyc2VlaW5nIHRoZSBwcm9wb3NlZCAkMS45IGJpbGxpb24gcHJvamVjdC4KTGFzIFZlZ2FzIFN0YWRpdW0gQXV0aG9yaXR5IGJvYXJkIENoYWlybWFuIFN0ZXZlIEhpbGwgaGFzIHNhaWQgdGhlIGVudGl0eSwgd2hpY2ggd291bGQgb3duIHRoZSBzdGFkaXVtLCBjYW5ub3QgcmVjZWl2ZSBhbnkgcmV2ZW51ZSBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIGJvbmRzIGZvciB0aGUgcHJvamVjdCB0byBsb3NlIHRoZWlyIHRheC1leGVtcHQgc3RhdHVzLgpBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGxlYXNlIGFncmVlbWVudCBjYWxsZWQgZm9yIGEgJDEgYW5udWFsIHJlbnQuClRoZSBSYWlkZXJzIHBhaWQgJDMuNSBtaWxsaW9uIGluIHJlbnQgdG8gcGxheSBhdCBPYWtsYW5kLUFsYW1lZGEgQ291bnR5IENvbGlzZXVtIGluIDIwMTYsIHVwIGZyb20gJDkyNSwwMDAgZm9yIHRoZSAyMDE1IHNlYXNvbi4KTkZMIHRlYW0gb3duZXJzIGFwcHJvdmVkIHRoZSBSYWlkZXJzIHJlbG9jYXRpb24gbGFzdCBtb250aC4KQXQgbGVhc3QgNDYsMDAwIHBlcnNvbmFsIHNlYXQgbGljZW5zZSBkZXBvc2l0cyBoYXZlIGJlZW4gY29sbGVjdGVkIGJ5IHRoZSBSYWlkZXJzIGFzIHRoZXkgcHJlcGFyZSB0byBtb3ZlIHRvIExhcyBWZWdhcyBpbiB0aHJlZSB5ZWFycy4KUmFpZGVycyBQcmVzaWRlbnQgTWFyYyBCYWRhaW4gYW5ub3VuY2VkIHRoYXQgZmlndXJlIGZvciB0aGUgZmlyc3QgdGltZSBpbiB1cGRhdGluZyB0aGUgYm9hcmQgYXQgaXRzIG1lZXRpbmcgYXQgdGhlIENsYXJrIENvdW50eSBHb3Zlcm5tZW50IENlbnRlci4gRWFjaCAkMTAwIGxpY2Vuc2UgZGVwb3NpdCBjb3ZlcnMgb25lIGhvdXNlaG9sZCBhbmQgY291bGQgYWNjb3VudCBmb3IgbXVsdGlwbGUgdGlja2V0cywgbWVhbmluZyB0aGUgdGVhbSBhcHBlYXJzIG9uIHRyYWNrIHRvIGJlIGFibGUgdG8gc2VsbCBtb3JlIHRoYW4gZW5vdWdoIFBTTHMgYW5kIHNlYXNvbiB0aWNrZXRzIHRvIGZpbGwgdGhlIDY1LDAwMC1zZWF0IGRvbWVkIHN0YWRpdW0uCkJhZGFpbiBhbHNvIHRvbGQgdGhlIGJvYXJkIHRoZSB0ZWFtIHdpbGwgYW5ub3VuY2UgcGlja3MgaW4gdGhlIE5GTCBkcmFmdCBmcm9tIHRoZSBMYXMgVmVnYXMgd2VsY29tZSBzaWduIGF0IHRoZSBzb3V0aCBlbmQgb2YgdGhlIFN0cmlwIG9uIFNhdHVyZGF5LCBBcHJpbCAyOS4gVGhhdCBpcyB0aGUgdGhpcmQgYW5kIGZpbmFsIGRheSBvZiB0aGUgZHJhZnQuCkxhcyBWZWdhcyBTdW4gcmVwb3J0ZXIgQWRhbSBDYW5kZWUgYW5kIHRoZSBBc3NvY2lhdGVkIFByZXNzIGNvbnRyaWJ1dGVkIHRvIHRoaXMgcmVwb3J0LgowCkpvaW4gdGhlIERpc2N1c3Npb246CkNoZWNrIHRoaXMgb3V0IGZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2Ygb3VyIGNvbnZlcnNpb24gdG8gdGhlIExpdmVGeXJlIGNvbW1lbnRpbmcgc3lzdGVtIGFuZCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHNpZ24gdXAgZm9yIGFuIGFjY291bnQu

Nevada's nuclear dilemma: Inside the reignited fight over Yucca Mountain - Las Vegas Sun Newspaper
May 22, 2017
https://lasvegassun.com/news/2017/may/22/yucca-mountain-nuclear-waste-donald-trump
TmV2YWRh4oCZcyBudWNsZWFyIGRpbGVtbWE6IEluc2lkZSB0aGUgcmVpZ25pdGVkIGZpZ2h0IG92ZXIgWXVjY2EgTW91bnRhaW4KSm9obiBMb2NoZXIvQXNzb2NpYXRlZCBQcmVzcyBmaWxlClBhcnRpY2lwYW50cyBpbiBhIDIwMTUgY29uZ3Jlc3Npb25hbCB0b3VyIG9mIFl1Y2NhIE1vdW50YWluIGVudGVyIHRoZSBwcm9qZWN04oCZcyBzb3V0aCBwb3J0YWwuIFRoZSBzaXRlIGlzIG5lYXIgdGhlIE5ldmFkYSB0b3duIG9mIE1lcmN1cnksIGFib3V0IDkwIG1pbGVzIG5vcnRod2VzdCBvZiBMYXMgVmVnYXMuCkJ5CiggY29udGFjdCApCk1vbmRheSwgTWF5IDIyLCAyMDE3IHwgMiBhLm0uCuKAnFRoZXkgdXNlZCB0byBiZSBsb29raW5nIHRvIHNlZSBpZiB0aGlzIHdhcyBhIHN1aXRhYmxlIHNpdGUuIE5vdyB0aGV54oCZcmUgbG9va2luZyB0byBzZWUgaG93IHRoZXkgY2FuIG1ha2UgaXQgc3VpdGFibGUuIFRoYXQmIzM5O3MgdGhlIGJpZyBzaGlmdCzigJ0gc2FpZCBVLlMuIFJlcC4gRGluYSBUaXR1cywgRC1MYXMgVmVnYXMsIHdobyBoYXMgYmVlbiBhY3RpdmUgaW4gb3Bwb3NpbmcgYSBZdWNjYSBNb3VudGFpbiByZXBvc2l0b3J5IGZvciBtb3JlIHRoYW4gMzAgeWVhcnMuIFRoZSBOdWNsZWFyIFdhc3RlIFBvbGljeSBBY3QgcGFzc2VkIGluIDE5ODIsIGFuZCBhIDE5ODcgYW1lbmRtZW50IHNlYWxlZCBOZXZhZGHigJlzIGZhdGUgYXMgdGhlIHNvbGUgZHVtcGluZyBncm91bmQgZm9yIHRoZSBuYXRpb27igJlzIGhpZ2gtbGV2ZWwgcmFkaW9hY3RpdmUgc2NyYXAuIFNvcnQgb2YuClRoZSDigJxTY3JldyBOZXZhZGEgQmlsbOKAnSBoYXMgbmV2ZXIgYmVlbiByZXNvbHZlZC4gVXBvbiB0aGUgZmVkZXJhbCBkZXNpZ25hdGlvbiBvZiBZdWNjYSBNb3VudGFpbiDigJQgYWJvdXQgOTAgbWlsZXMgZnJvbSBMYXMgVmVnYXMg4oCUIGFzIHRoZSBvbmx5IHZpYWJsZSBzaXRlIGZvciBzdG9yaW5nIG1hbnkgdGhvdXNhbmRzIG9mIHRvbnMgb2YgZGFuZ2Vyb3VzIHdhc3RlLCB0aGUgc3RhdGUgTGVnaXNsYXR1cmUgcGFzc2VkIGEgbGF3IG1ha2luZyBzdWNoIHN0b3JhZ2UgaWxsZWdhbC4gTGVkIGJ5IGZvcm1pZGFibGUgZm9ybWVyIFUuUy4gU2VuLiBIYXJyeSBSZWlkLCBELU5ldi4sIGEgZ2VuZXJhdGlvbiBvZiBsYXdtYWtlcnMgYW5kIHJlc2lkZW50cyBoYXZlIGZvdWdodCBhbmQgZmVhcmVkIHRoZSByZWFsaXphdGlvbiBvZiBhIHZpc2lvbiBpbnRvIHdoaWNoIHRoZSBjb3VudHJ5IGhhcyBhbHJlYWR5IHN1bmsgYW4gZXN0aW1hdGVkICQxNSBiaWxsaW9uLiBEZXNwaXRlIHRoYXQgbWFzc2l2ZSBpbnZlc3RtZW50LCBSZWlkIGFuZCBmb3JtZXIgUHJlc2lkZW50IEJhcmFjayBPYmFtYSBzdWNjZXNzZnVsbHkgZGVyYWlsZWQgdGhlIFl1Y2NhIHBsYW4sIHN0YXJ2aW5nIGl0IG9mIGZ1bmRpbmcgYW5kIHdpdGhkcmF3aW5nIGl0cyBsaWNlbnNlIGFwcGxpY2F0aW9uLgpBUCBQaG90by9Kb2UgQ2F2YXJldHRhClRoaXMgSnVuZSAyNSwgMjAwMiwgZmlsZSBwaG90byBzaG93cyB0aGUgdmlldyBmcm9tIHRoZSBzdW1taXQgcmlkZ2Ugb2YgdGhlIHByb3Bvc2VkIFl1Y2NhIE1vdW50YWluIHJlcG9zaXRvcnkgc2l0ZS4KQ3JpdGljcyBzYXkgc2Vpc21pYyBhY3Rpdml0eSBhbmQgaW5maWx0cmF0aW5nIHdhdGVyIG1ha2UgWXVjY2EgTW91bnRhaW4gdW5maXQsIHdpdGhvdXQgZXZlbiBjb25zaWRlcmluZyB0aGUgdGltZXdvcm4gaW5mcmFzdHJ1Y3R1cmUgdGhhdCB3b3VsZCBiZSB1c2VkIHRvIHRyYW5zcG9ydCB3YXN0ZSBhY3Jvc3MgdGhlIGNvdW50cnkuIFNjaWVudGlzdHMgZG9u4oCZdCBhZ3JlZSBvbiB0aGUgcmlza3Mgb3ZlciB0aG91c2FuZHMgb2YgeWVhcnMsIHdoaWNoIGlzIHdoeSBzdXBwb3J0ZXJzIGNhbGwgZm9yIHRoZSBwcm9qZWN0IHRvIG1vdmUgZm9yd2FyZCBpZiBvbmx5IHRvIGludml0ZSBtb3JlIHN0dWR5LgrigJxXZeKAmXZlIGJlZW4gc3R1ZHlpbmcgaXQgZm9yIDM1IHllYXJzOyB5b3UgZG9u4oCZdCBuZWVkIHRvIHByb2JlIGl0IGFueW1vcmUs4oCdIFRpdHVzIHNhaWQuIOKAnFRoZXkga25vdyB0aGF0IHRoZXJl4oCZcyBhIG1vdmluZyB3YXRlciB0YWJsZSwgdGhleSBrbm93IHRoYXQgdGhlcmUgYXJlIGZhdWx0cyBvdXQgdGhlcmUgLi4uIHRoZXJl4oCZcyBubyBtb3JlIHByb2JpbmcgdGhhdCB0aGV5IG5lZWQgdG8gZG8u4oCdClRoZSBwcmVzaWRlbnQgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgYmVncyB0byBkaWZmZXIuIERvbmFsZCBUcnVtcOKAmXMgTWFyY2ggYnVkZ2V0IHJlcXVlc3QgdG8gcmVzdGFydCB0aGUgbGljZW5zaW5nIHByb2Nlc3MgZm9yIFl1Y2NhIE1vdW50YWluIHdhcyAkMTIwIG1pbGxpb24uIFdoaWxlIHRoZSBidWRnZXQgY2FycnlpbmcgaW50byB0aGlzIGZhbGwgbGVhdmVzIG91dCB0aGF0IGZ1bmRpbmcsIFRpdHVzIHRoaW5rcyBZdWNjYSBoYXMgbW9tZW50dW0sIGNpdGluZyBFbmVyZ3kgU2VjcmV0YXJ5IFJpY2sgUGVycnnigJlzIHJlY2VudCB2aXNpdCB0byB0aGUgc2l0ZS4gUGVycnksIHRoZSBFbmVyZ3kgRGVwYXJ0bWVudCBhbmQgc2V2ZXJhbCBmZWRlcmFsIGFnZW5jaWVzIHdlcmUgc3VlZCBieSBUZXhhcyBBdHRvcm5leSBHZW5lcmFsIEtlbiBQYXh0b24gZm9yIGZhaWxpbmcgdG8gZnVsZmlsbCBhIGZlZGVyYWwgbWFuZGF0ZSB0byBlc3RhYmxpc2ggYSBwZXJtYW5lbnQgcmVwb3NpdG9yeSBmb3IgbnVjbGVhciB3YXN0ZSwgYW5kIGhpcyBtZXNzYWdlIHRvIE5ldmFkYSBsZWFkZXJzaGlwIHdhcyB2YWd1ZSB5ZXQgY2xlYXI6IOKAnFRoZSBzdGF0ZSBvZiBOZXZhZGEgaGFzIGhlbHBlZCBrZWVwIEFtZXJpY2Egc3Ryb25nLCBzYWZlIGFuZCBzZWN1cmUgc2luY2UgdGhlIGVhcmxpZXN0IGRheXMgb2YgdGhlIENvbGQgV2FyLiBJIGxvb2sgZm9yd2FyZCB0byB0aGUgc3RhdGUgb2YgTmV2YWRhIG1haW50YWluaW5nIGl0cyBsZWFkZXJzaGlwIHJvbGUgaW4gQW1lcmljYeKAmXMgc2FmZXR5IGFuZCBzZWN1cml0eS7igJ0KRXZlbiBpbiByZXRpcmVtZW50LCBSZWlkIG1pbmNlZCBubyB3b3JkcyBpbiByZWluZm9yY2luZyBoaXMgb2xkIG1hbnRyYSB0aGF0IFl1Y2NhIGlzIGRlYWQuIOKAnFRoZSBSZXB1YmxpY2FucyBoYXZlIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGV54oCZcmUgbm90IGFib3V0IHRvIGRvIHRoaXMuIC4uLiBUaGV5IGNhbiBwbGF5IGdhbWVzLCBidXQgaXTigJlzIHRocm91Z2guIFl1Y2NhIE1vdW50YWluIHdpbGwgYWx3YXlzIGJlIGEgaG9sZSBpbiB0aGUgc2lkZSBvZiBhIG1vdW50YWluLiBUaGF04oCZcyBhbGwgaXQgaXMu4oCdCk5ldmVydGhlbGVzcywgZGViYXRlIGlzIGhlYXRpbmcgdXAgYWdhaW4gaW4gV2FzaGluZ3RvbiwgRC5DLiBEcmFmdCBsZWdpc2xhdGlvbiBzZWVraW5nIHRvIHB1c2ggdGhlIHByb2plY3QgZm9yd2FyZCBjYW1lIHVwIGZvciBkaXNjdXNzaW9uIGluIGEgSG91c2Ugb2YgUmVwcmVzZW50YXRpdmVzIHN1YmNvbW1pdHRlZSBsYXN0IG1vbnRoLiBBbGwgYnV0IG9uZSBvZiB0aGUgbGF3bWFrZXJzIGluIE5ldmFkYeKAmXMgY29uZ3Jlc3Npb25hbCBkZWxlZ2F0aW9uIGFyZSBjb252ZXJzZWx5IHB1c2hpbmcgZm9yIGxvY2FsIGNvbnNlbnQgd2hlbiBpdCBjb21lcyB0byBzdG9yaW5nIG51Y2xlYXIgd2FzdGUuCuKAnE5vdyB0aGF0IChZdWNjYSBpcykgYmFjayBvbiB0aGUgdGFibGUs4oCdIFRpdHVzIHNhaWQsIOKAnHdl4oCZdmUgZ290IHRvIGJlIHN1cmUgdGhhdCBwZW9wbGUgaGF2ZSB0aGUgaW5mb3JtYXRpb24gYW5kIGNhbiBiZSBtb3RpdmF0ZWQgdG8gZmlnaHQgYWdhaW5zdCBpdC7igJ0K4oCTWXZvbm5lIEdvbnphbGV6Ck5FVkFEQU5TIEFSRSBOT1QgVU5BTklNT1VTCldoZW4gRGFuIFNjaGluaG9mZW4gZmlyc3Qgc3RhcnRlZCBsZWFybmluZyBhYm91dCB0aGUgWXVjY2EgTW91bnRhaW4gcHJvamVjdCBpbiAyMDA1IGFzIGEgUGFocnVtcCByZXNpZGVudCwgaGUgbmV2ZXIgZXhwZWN0ZWQgdG8gYmVjb21lIGEgbGVhZGluZyB2b2ljZSBvbiB0aGUgc3ViamVjdC4K4oCcSXQgd2FzbuKAmXQgb24gbXkgYnVja2V0IGxpc3Qs4oCdIHNhaWQgU2NoaW5ob2Zlbiwgd2hvIG5vdyBzaXRzIG9uIHRoZSBOeWUgQ291bnR5IENvbW1pc3Npb24gYW5kIHNwZWFyaGVhZHMgdGhlIGFyZWHigJlzIHB1c2ggZm9yIHJlc3RhcnRpbmcgY29uc2lkZXJhdGlvbiBvZiDigJx0aGUgc29sZSBjYW5kaWRhdGUgc2l0ZSBmb3IgdGhlIG5hdGlvbuKAmXMgZmlyc3QgaGlnaC1sZXZlbCBjaXZpbGlhbiBudWNsZWFyIHdhc3RlIHJlcG9zaXRvcnks4oCdIGFzIHRoZSBjb3VudHkgd2Vic2l0ZSBwdXRzIGl0LiDigJxXZeKAmXJlIG5vdCBhZHZvY2F0aW5nIGZvciBZdWNjYSBNb3VudGFpbi4gV2XigJlyZSBhZHZvY2F0aW5nIGZvciB0aGUgc2NpZW5jZSB0byBiZSBoZWFyZC7igJ0KV2hpbGUgbW9zdCBzdGF0ZSBvZmZpY2lhbHMgc3RhbmQgb3Bwb3NlZCB0byBhbnkgZnVydGhlciBldmFsdWF0aW9uIG9mIFl1Y2NhIE1vdW50YWluLCBOeWUgQ291bnR5IGpvaW5zIGVpZ2h0IG90aGVyIHJ1cmFsIE5ldmFkYSBjb3VudGllcyBhbmQgVS5TLiBSZXAuIE1hcmsgQW1vZGVpLCBSLUNhcnNvbiBDaXR5LCBpbiBzdXBwb3J0aW5nIHRoZSBwcm9qZWN04oCZcyByZW5ld2VkIG1vbWVudHVtIHVuZGVyIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiBEb25hbGQgVHJ1bXAuCk5ldmFkYW5zIG9uIFl1Y2NhIE1vdW50YWluCkluIGEgcG9sbCBvZiA3MDAgcmVzaWRlbnRzIGxhc3QgTWF5LCB0aGUgbWFqb3JpdHkgd2FzIG9wcG9zZWQuIFRoZSBzdXJ2ZXksIGNvbW1pc3Npb25lZCBieSB0aGUgbm9ucHJvZml0IHRoaW5rIHRhbmsgQ2VudGVyIGZvciBXZXN0ZXJuIFByaW9yaXRpZXMsIGZvdW5kIHRoYXQgNTEgcGVyY2VudCB3ZXJlIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgYSBjYW5kaWRhdGUgd2hvIHdvdWxkIGJsb2NrIHRoZSBwcm9qZWN0LCAyNiBwZXJjZW50IHNhaWQgYSBjYW5kaWRhdGXigJlzIHN0YW5jZSB3b3VsZG7igJl0IGFmZmVjdCB0aGVpciB2b3RlLCBhbmQgMjMgcGVyY2VudCB3ZXJlIGxlc3MgbGlrZWx5IHRvIHN1cHBvcnQgdGhlIGNhbmRpZGF0ZS4gVm90ZXJzIGZyb20gYWxsIHBhcnRpZXMgZm9sbG93ZWQgdGhpcyB0cmVuZC4KTnllIENvdW50eSBzdGFuZHMgdG8gYmVuZWZpdCBmaW5hbmNpYWxseSBmcm9tIFl1Y2NhIE1vdW50YWluIGlmIGl0IHdlcmUgdG8gYmUgZm91bmQgc2FmZSBhbmQgY29uc3RydWN0ZWQuIEluIHByZXZpb3VzIHllYXJzIHdoZW4gdGhlIHByb2plY3Qgd2FzIHVuZGVyIGFjdGl2ZSBjb25zaWRlcmF0aW9uLCB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50IHByb3ZpZGVkIHRoZSBjb3VudHkgdXAgdG8gJDUgbWlsbGlvbiBwZXIgeWVhci4gQ29uc3RydWN0aW9uIGFuZCBvcGVyYXRpb24gb2YgYSBZdWNjYSBNb3VudGFpbiBmYWNpbGl0eSBjb3VsZCBwcm9kdWNlIGEgd2luZGZhbGwgZm9yIGFuIGFyZWEgd2l0aG91dCBtdWNoIG90aGVyIHNpZ25pZmljYW50IGVjb25vbWljIGRldmVsb3BtZW50LgrigJxJZiBpdOKAmXMgc2FmZSwgd2hvIHdvdWxkIHNheSBubyB0byBhIG11bHRpZ2VuZXJhdGlvbiwgbXVsdGliaWxsaW9uLWRvbGxhciBwcm9qZWN0P+KAnSBTY2hpbmhvZmVuIHNhaWQuCkRyLiBNaWNoYWVsIFZvZWdlbGUgd29ya2VkIGFzIHBhcnQgb2YgYSB0ZWFtIG9mIHNjaWVudGlzdHMgY2hhcmdlZCB3aXRoIGRldGVybWluaW5nIGlmIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHRvbnMgb2Ygc3BlbnQgbnVjbGVhciBmdWVsIHNhZmVseSBjb3VsZCBiZSBzdG9yZWQgZGVlcCBiZW5lYXRoIGdyb3VuZCBhdCB0aGUgWXVjY2EgTW91bnRhaW4gc2l0ZS4gVm9lZ2VsZSwgd2hvIHdvcmtlZCBvbiB0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgbGljZW5zZSBhcHBsaWNhdGlvbiB0byB0aGUgTnVjbGVhciBSZWd1bGF0b3J5IENvbW1pc3Npb24sIHByZXZpb3VzbHkgd29ya2VkIGFzIGEgY29uc3VsdGFudCBmb3IgTnllIENvdW50eSBhbmQgam9pbnMgU2NoaW5ob2ZlbiBpbiBhZHZvY2F0aW5nIGZvciBhIGNvbnRpbnVlZCBZdWNjYSBwcm9jZXNzLgrigJxUaGUgTlJDIHJldmlld2VkIHRoZSB3b3JrIHRoYXQgd2UgZGlkIGFuZCB0aG91Z2h0IHRoYXQgd2UgZGlkIGEgZ29vZCBqb2Is4oCdIFZvZWdlbGUgc2FpZC4g4oCcVGhlIHByb2dyYW0gd2FzIHN0b3BwZWQgYnkgYW4gYWRtaW5pc3RyYXRpb24gdGhhdCBkaWQgbm90IGZvbGxvdyB0aGUgbGF3LuKAnQpIb3BlIGZvciBhIHJlc3RhcnQgb2YgdGhlIGxvbmctZGViYXRlZCBwcm9ncmFtIGdyZXcgd2l0aCBSZWlk4oCZcyByZXRpcmVtZW50IGFuZCB0aGUgZWxlY3Rpb24gb2YgVHJ1bXAsIHdobyBhbG9uZyB3aXRoIEVuZXJneSBTZWNyZXRhcnkgUmljayBQZXJyeSBhY3RzIGZhdm9yYWJseSB0b3dhcmQgWXVjY2EgTW91bnRhaW4uIFRydW1w4oCZcyBmaXJzdCBidWRnZXQgcmVxdWVzdCBpbmNsdWRlZCAkMTIwIG1pbGxpb24gdG93YXJkIHJlc3RhcnRpbmcgdGhlIHByb2plY3QuCkluIGFuIGlkZWFsIHNpdHVhdGlvbiwgU2NoaW5ob2ZlbiBzYWlkLCBZdWNjYSBNb3VudGFpbiB3b3VsZCByZWNlaXZlIGEgZnVsbCBzY2llbnRpZmljIHZldHRpbmcg4oCUIHNvbWV0aGluZyBwcm9qZWN0IG9wcG9uZW50cyBmZWVsIHN1ZmZpY2llbnRseSBoYXMgaGFwcGVuZWQsIGJ1dCBOeWUgQ291bnR5IHN1cHBvcnRlcnMgZG8gbm90LgrigJxXZeKAmWQgZm9sbG93IHRoZSBsYXcsIHdl4oCZZCBoYXZlIHRoZSBoZWFyaW5ncywgdGhlIHNjaWVuY2UgaXMgdmV0dGVkIHBlciB0aGUgTlJDIGFuZCB0aGVuIHdl4oCZZCBmaW5kIG91dCBpZiBpdOKAmXMgc2FmZSB0byBjb25zdHJ1Y3Qs4oCdIFNjaGluaG9mZW4gc2FpZC4KSW4gcGFzdCB5ZWFycywgc29tZSBwb2xpdGljaWFucyBhbmQgbG9jYWwgb2ZmaWNpYWxzIGhhdmUgYWR2b2NhdGVkIHRoYXQgTmV2YWRhIG5lZ290aWF0ZSBmb3IgdGhlIGJlc3QgZGVhbCBwb3NzaWJsZSBpbiBleGNoYW5nZSBmb3IgYWNjZXB0aW5nIHRoZSBwcm9qZWN0LiBTcGVha2luZyBvbiBiZWhhbGYgb2YgdGhlIGNvdW50eSwgU2NoaW5ob2ZlbiBjb3VsZCBub3QgcGVnIHdoYXQgYSBwb3RlbnRpYWwgY29tcGVuc2F0aW9uIGZpZ3VyZSBtaWdodCBsb29rIGxpa2UuIOKAnFRoZXJl4oCZcyBubyBudW1iZXIgSSBjb3VsZCBsYW5kIG9uIHRvIHNheSBnaXZlIHVzICQ1MCBtaWxsaW9uIHVwIGZyb250IGFuZCBnaXZlIHVzICQxMCBtaWxsaW9uIGEgeWVhci7igJ0K4oCTQWRhbSBDYW5kZWUKSGlsYXJ5IFN3aWZ0IC8gVGhlIE5ldyBZb3JrIFRpbWVzCkRhd24gYXQgdGhlIFUuUy4gQ2FwaXRvbCBpbiBXYXNoaW5ndG9uLCBKYW4uIDE5LCAyMDE3LgpMRUdJU0xBVElWRSBBUFBST0FDSEVTIFRPIFJFU09MVklORyBZVUNDQSBNT1VOVEFJTiBHTyBIRUFELVRPLUhFQUQKTnVjbGVhciBXYXN0ZSBJbmZvcm1lZCBDb25zZW50IEFjdDogUGVybWl0cyB0aGUgTnVjbGVhciBSZWd1bGF0b3J5IENvbW1pc3Npb24gdG8gYXV0aG9yaXplIGEgd2FzdGUgcmVwb3NpdG9yeSBvbmx5IGlmIHRoZSBzZWNyZXRhcnkgb2YgZW5lcmd5IG9idGFpbnMgd3JpdHRlbiBjb25zZW50IGZyb20gdGhlIGdvdmVybm9yIG9mIHRoZSBob3N0IHN0YXRlIGFuZCBhZmZlY3RlZCBsb2NhbCBnb3Zlcm5tZW50cywgYXMgd2VsbCBhcyBJbmRpYW4gdHJpYmVzLiBJZiB0aGUgYWN0IHBhc3NlZCwgWXVjY2EgY291bGQgb25seSBiZSByZXZpdmVkIHdpdGggc3VjaCBhcHByb3ZhbC4gRGVzcGl0ZSB0aGUgZ292ZXJub3IgYW5kIGFsbCBidXQgb25lIG1lbWJlciBvZiBOZXZhZGHigJlzIGNvbmdyZXNzaW9uYWwgZGVsZWdhdGlvbiBvcHBvc2luZyB0aGUgZHVtcCBzaXRlLCB0aGlzIG9wdGlvbiB3b3VsZCBhbGxvdyBmdXJ0aGVyIGRpc2N1c3Npb24gYW5kIHBvdGVudGlhbCBzdHVkeSBvZiBZdWNjYSBNb3VudGFpbiBpZiBzdXBwb3J0aW5nIHJ1cmFsIGNvdW50aWVzIHdlcmUgYWJsZSB0byBnYWluIHRyYWN0aW9uLgpOZXZhZGHigJlzIERlbW9jcmF0aWMgVS5TLiBSZXBzLiBSdWJlbiBLaWh1ZW4sIEphY2t5IFJvc2VuIGFuZCBEaW5hIFRpdHVzIGhhdmUgc2lnbmVkIG9udG8gdGhlIGNvbnNlbnQgYWN0LiBUaXR1cywgdGhlIHByaW1hcnkgc3BvbnNvciwgc2FpZCBpdCByZWZsZWN0ZWQgcmVjb21tZW5kYXRpb25zIGZyb20gdGhlIE9iYW1hIGFkbWluaXN0cmF0aW9u4oCZcyBCbHVlIFJpYmJvbiBDb21taXNzaW9uIG9uIEFtZXJpY2HigJlzIE51Y2xlYXIgRnV0dXJlLgpVLlMuIFNlbnMuIERlYW4gSGVsbGVyLCBSLU5ldi4sIGFuZCBDYXRoZXJpbmUgQ29ydGV6IE1hc3RvLCBELU5ldi4sIGhhdmUgc3BvbnNvcmVkIGEgc2ltaWxhciBTZW5hdGUgbWVhc3VyZSAuIEluIGEgbGV0dGVyIHRvIEVuZXJneSBTZWNyZXRhcnkgUmljayBQZXJyeSAsIEhlbGxlciB3cm90ZTog4oCcVGhpcyBvcGVuIHByb2Nlc3MgZW5zdXJlcyBhbGwgQW1lcmljYW5zIGhhdmUgYSBtZWFuaW5nZnVsIHZvaWNlIGluIHRoZSBwcm9jZXNzIGlmIHRoZWlyIGNvbW11bml0eSBpcyBiZWluZyBjb25zaWRlcmVkIGZvciBhIGZ1dHVyZSBudWNsZWFyIHdhc3RlIHJlcG9zaXRvcnkuIFJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gZm9yY2UgdGhlIGZhaWxlZCBZdWNjYSBNb3VudGFpbiBwcm9wb3NhbCBvbiBOZXZhZGFucywgVS5TLiB0YXhwYXllcnPigJkgZG9sbGFycyB3b3VsZCBiZSBiZXR0ZXIgc3BlbnQgb24gZnVydGhlciBpbXBsZW1lbnRpbmcgeW91ciBhZ2VuY3nigJlzIHBhc3QgZWZmb3J0cyBvbiBjb25zZW50LWJhc2VkIHNpdGluZy4gVGhpcyB3b3J0aHdoaWxlIGluaXRpYXRpdmUgd2lsbCBlbnN1cmUgdGhhdCBubyBzdGF0ZSB3aWxsIGJlIGZvcmNlZCB0byBhY2NlcHQgbnVjbGVhciB3YXN0ZSBhZ2FpbnN0IGl0cyBvd24gd2lsbC7igJ0KVS5TLiBSZXAuIE1hcmsgQW1vZGVpLCBSLUNhcnNvbiBDaXR5LCBoYXMgbm90IHNpZ25lZCBvbnRvIHRoZSBjb25zZW50IGFjdCBhbmQgc2F5cyBDb25ncmVzcyBhbmQgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5IHNob3VsZCBtYWtlIHRoZSBZdWNjYSBzaXRlIGEgY2VudGVyIGZvciByZXNlYXJjaCBhcyB3ZWxsIGFzIHJlcHJvY2Vzc2luZy4K4oCcV2hpbGUgc29tZSBvZiBteSBjb2xsZWFndWVzIGluIHRoZSBkZWxlZ2F0aW9uIGhhdmUgc3VjY2Vzc2Z1bGx5IG1hbmFnZWQgdG8gc2xvdyB0aGUgcHJvamVjdCB0aHJvdWdoIHRoZSBjb25ncmVzc2lvbmFsIGFwcHJvcHJpYXRpb25zIHByb2Nlc3MsIEkgZG8gbm90IGJlbGlldmUgaXQgaXMgYSDigJhkZWFk4oCZIGlzc3VlIGFuZCB0aGluayBpdCBpcyBtb3JlIGxpa2VseSB0aGUgcmVwb3NpdG9yeSB3aWxsIGV2ZW50dWFsbHkgY29tZSB0byBmcnVpdGlvbiB0aHJvdWdoIGEgc291bmQgc2NpZW50aWZpYyBwcm9jZXNzIG92ZXIgdGltZSzigJ0gQW1vZGVpIGhhcyBzYWlkIGluIHRoZSBwYXN0LgpOdWNsZWFyIFdhc3RlIFBvbGljeSBBbWVuZG1lbnRzIEFjdCBvZiAyMDE3OiBCeXBhc3NlcyBiYXJyaWVycyB0byBhZHZhbmNpbmcgWXVjY2EgYnkgZ2l2aW5nIG1vcmUgY29udHJvbCBvdmVyIGFpciBhbmQgd2F0ZXIgcGVybWl0dGluZyB0byB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50LCBhcyB0aGUgc3RhdGUgaGFzIGJsb2NrZWQgY2VydGFpbiBwZXJtaXRzIGluIHRoZSBwYXN0LiBJbiBhZGRpdGlvbiwgdGhlIGJpbGwgZWxpbWluYXRlcyB0aGUgY3VycmVudCByZXF1aXJlbWVudCB0aGF0IHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgbWFrZSBwcm9ncmVzcyBvbiBzaXRpbmcgYSBzZWNvbmQgcmVwb3NpdG9yeSBhbmQgdGhlIGNhcGFjaXR5IGNhcCBmb3IgWXVjY2Egb2YgNzAsMDAwIG1ldHJpYyB0b25zIG9mIHdhc3RlLiBCaWxsIHN1cHBvcnRlcnMgc2F5IE5ldmFkYeKAmXMg4oCcdGVjaG5pY2FsIG9iamVjdGlvbnPigJ0gd291bGQgYmUgYXNzZXNzZWQgYW5kIGFkZHJlc3NlZCB0aHJvdWdoIHRoZSBsb25nLWF3YWl0ZWQgbW92ZW1lbnQgb24gdGhlIGxpY2Vuc2luZyBwcm9jZXNzLgrigJxPdXIgZ29hbCBoZXJlIGlzIHRvIGlkZW50aWZ5IHRoZSByaWdodCByZWZvcm1zIHRvIGVuc3VyZSB3ZSBjYW4gZnVsZmlsbCB0aGUgZ292ZXJubWVudOKAmXMgb2JsaWdhdGlvbiB0byBkaXNwb3NlIG9mIG91ciBuYXRpb27igJlzIG51Y2xlYXIgbWF0ZXJpYWws4oCdIFUuUy4gUmVwLiBKb2huIFNoaW1rdXMsIFItSWxsLiBhbmQgY2hhaXJtYW4gb2YgdGhlIEVuZXJneSBhbmQgQ29tbWVyY2UgU3ViY29tbWl0dGVlIG9uIEVudmlyb25tZW50IGFuZCB0aGUgRWNvbm9teSwgc2FpZCBkdXJpbmcgYW4gQXByaWwgbWVldGluZy4KU2hpbWt1cyBwb2ludHMgdG8gdGhlIGJpbGxpb25zIHBhaWQgYnkgdXRpbGl0eSByYXRlcGF5ZXJzIGluIHN0YXRlcyB0aGF0IHByb2R1Y2UgbnVjbGVhciBlbmVyZ3kgdG8gZGV2ZWxvcCBZdWNjYSBNb3VudGFpbiwgd2l0aCBsaXR0bGUgcHJvZ3Jlc3MgbWFkZSBvdmVyIHRoZSBkZWNhZGVzLiBPcHBvbmVudHMgY29udGVuZCB0aGUgZHJhZnQgbGVnaXNsYXRpb24gZG9lc27igJl0IHByb3ZpZGUgZW5vdWdoIHRpbWUgZHVyaW5nIHRoZSBsaWNlbnNpbmcgcHJvY2VzcyBmb3IgTmV2YWRh4oCZcyBtb3JlIHRoYW4gMjAwIGNvbnRlbnRpb25zIHRvIGJlIGhlYXJkLgpTdGV2ZSBGcmlzaG1hbiwgY29uc3VsdGFudCBmb3IgdGhlIE5ldmFkYSBBZ2VuY3kgZm9yIE51Y2xlYXIgUHJvamVjdHMgYW5kIEF0dG9ybmV5IEdlbmVyYWzigJlzIE9mZmljZSwgc2F5cyB0aGUgYmlsbCBhbHNvIGF0dGVtcHRzIHRvIGFkZHJlc3MgYSBwcmV0dHkgdW5wcmVjZWRlbnRlZCBwcm9ibGVtOiBjb21taXR0aW5nIHRvIGEgY2VudHVyeSBvZiBhcHByb3ByaWF0aW9ucyBmb3Igb25lIHNwZWNpZmljIHByb2plY3QuIEhlIHNhaWQgaXQgd291bGQgYWxsb3cgWXVjY2EgZnVuZGluZyB0byBza2lwIGN5Y2xpY2FsIGNvbmdyZXNzaW9uYWwgYXBwcm92YWwuIOKAnFRoaXMgaGFzIGFsd2F5cyBiZWVuIHNlZW4gYXMgYSBwcm9ibGVtLOKAnSBGcmlzaG1hbiBzYWlkLiDigJxDb25ncmVzcyBydW5zIGhvdCBhbmQgY29sZCBvbiB0aGlzIHByb2plY3QgYXQgdmFyaW91cyB0aW1lcy7igJ0K4oCTWXZvbm5lIEdvbnphbGV6CkFQIFBob3RvL0pvZSBDYXZhcmV0dGEKUHJvdGVzdGVycyBvZiB0aGUgcHJvcG9zZWQgWXVjY2EgTW91bnRhaW4gbnVjbGVhciB3YXN0ZSByZXBvc2l0b3J5IGFuZCB3ZWFwb25zIHRlc3RpbmcgbGllIG9uIHRoZSBwYXZlbWVudCBhZnRlciBjcm9zc2luZyB0aGUgbGluZSBpbnRvIHRoZSBOZXZhZGEgVGVzdCBTaXRlIGluIE1lcmN1cnkuIER1cmluZyB0aGUgc3ByaW5nIDIwMDMgZGVtb25zdHJhdGlvbiwgMzQgcGVvcGxlIHdlcmUgYXJyZXN0ZWQgZm9yIHRyZXNwYXNzaW5nLgpDT05DRVJOUyBTVVJST1VORElORyBZVUNDQSBNT1VOVEFJTgpJbiAyMDEwLCBqdXN0IGFzIFl1Y2NhIE1vdW50YWluIHdhcyBnb2luZyBkb3JtYW50LCBKb2huIETigJlBZ2F0YeKAmXMg4oCcQWJvdXQgYSBNb3VudGFpbuKAnSB3YXMgcmVsZWFzZWQuIFRoZSBub25maWN0aW9uIGJvb2sgbG9va2VkIGF0IHRoZSBwcm9wb3NlZCByZXBvc2l0b3J5IGluIHRlcm1zIG9mIHBvc3NpYmlsaXR5IGFzIHdlbGwgYXMgcHJvYmFiaWxpdHksIHRoZSBzY2llbnRpc3TigJlzIGdvLXRvIGxlbnMgb24gcmlzay4g4oCcSW4gaXRzIG93biBzdHVkaWVzIGZvciBZdWNjYSBNb3VudGFpbiwgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5IGNvbnNpZGVyZWQg4oCYcmVhc29uYWJseSBmb3Jlc2VlYWJsZSBpbmNpZGVudHPigJkgZHVyaW5nIHRoZSBzaGlwcGluZyBvZiBpdHMgd2FzdGUgdG8gWXVjY2EsIGJ1dCBub3QgdGhlIOKAmHdvcnN0LWNhc2UgY3JlZGlibGXigJkgb25lcyzigJ0gROKAmUFnYXRhIHdyb3RlLCBzaGFyaW5nIHRoZSBET0XigJlzIHJlc3VsdGluZyBlc3RpbWF0aW9uIG9mIGEgMS1pbi0xMCBtaWxsaW9uIGNoYW5jZSBvZiBhIHNlcmlvdXMgYWNjaWRlbnQgdW5sZWFzaGluZyB0aGUgcmFkaW9hY3RpdmUgd2FzdGUuIOKAnFlldCwgd2hlbiBpdCBjb21lcyB0byBhIHBsYWNlIGxpa2UgdGhlIGNpdHkgb2YgTGFzIFZlZ2FzLCB3aGVyZSBuaW5lIGRlbGl2ZXJpZXMgb2YgbnVjbGVhciB3YXN0ZSBjb3VsZCBiZSBhcnJpdmluZyBldmVyeSBkYXksIHRob3NlIDEtaW4tMTAgbWlsbGlvbiBvZGRzIG92ZXIgYSA0MC15ZWFyIHBlcmlvZCBhcmUgbW9yZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIGJ5IGEgZmlndXJlIG9mIDEtaW4tMjcsMDAwIG9kZHMsIHRodXMgbWFraW5nIHRoZSBwcm9iYWJpbGl0eSBvZiBhIG51Y2xlYXIgYWNjaWRlbnQgaW4gVmVnYXMgaGlnaGVyIHRoYW4gdGhlIHBvc3NpYmlsaXR5IG9mIHN0cmlraW5nIGl0IHJpY2ggaW4gYSBjYXNpbm8u4oCdIFRoZSBhdXRob3IgZWNob2VkIFJ1dGdlcnMgVW5pdmVyc2l0eSBzb2Npb2xvZ2lzdCBMZWUgQ2xhcmtlIGluIGNvbnRlbmRpbmcgdGhhdCBpdCB3YXMgZGFuZ2Vyb3VzIHRvIGNvbmNlbnRyYXRlIHNvIG11Y2ggb24gcHJvYmFiaWxpdGllcywgYXMg4oCcdGhpbmdzIHRoYXQgaGF2ZSBuZXZlciBoYXBwZW5lZCBiZWZvcmUgaGFwcGVuIGFsbCB0aGUgdGltZS7igJ0KVHJhbnNwb3J0aW5nIG51Y2xlYXIgd2FzdGUgdG8gdGhlIHNpdGUKSG93IG11Y2ggd2FzdGUgY291bGQgdHJhdmVsIG5lYXIgTGFzIFZlZ2FzPwpTcGVudCB1cmFuaXVtIGluIHRoZSBmdWVsIHJvZHMgcmVtYWlucyByYWRpb2FjdGl2ZSBmb3IgdGhvdXNhbmRzIG9mIHllYXJzIGFuZCBtdXN0IGJlIHN0b3JlZCBpbiBjYXNrcyB3aXRoIHNwZWNpYWwgc2hpZWxkaW5nLiBBcyBtYW55IGFzIDExMCB0cmFpbmxvYWRzIGNvdWxkIHRyYXZlbCBuZWFyIExhcyBWZWdhcyBwZXIgeWVhciwgYW5kIHVwIHRvIHR3byB0cnVja3MgY291bGQgdHJhdmVsIG5lYXIgdGhlIGNpdHkgcGVyIHdlZWsuClNlcmlvdXMgcmlza3MgY29tZSB3aXRoIHNoaXBwaW5nIGhpZ2gtbGV2ZWwgbnVjbGVhciB3YXN0ZSB0byBOZXZhZGEsIGVzcGVjaWFsbHkgYmVjYXVzZSBtdWNoIG9mIHRoZSBuYXRpb27igJlzIHN0b2NrcGlsZSB3b3VsZCBjb21lIGZyb20gYWNyb3NzIHRoZSBjb3VudHJ5IGJ5IHJhaWwgYW5kIGhpZ2h3YXksIGluY3JlYXNpbmcgdGhlIGZpZWxkIG9mIHBvdGVudGlhbCBjb250YW1pbmF0aW9uIHN1YnN0YW50aWFsbHkuIEluZHVzdHJ5IHB1YmxpY2F0aW9uIEUmYW1wO0UgTmV3cyB3cm90ZSB0aGF0IHJhaWwgY2FycyBjb3VsZCBydW4gbmVhciB0aGUgVHJ1bXAgSW50ZXJuYXRpb25hbCBIb3RlbCBvbiB0aGUgU3RyaXAsIHRob3VnaCBubyByb3V0ZSBoYXMgYmVlbiBmaW5hbGl6ZWQuIE90aGVyIGNvbmNlcm5zIGluY2x1ZGUgaGFuZGxlcnMgYW5kIGRyaXZlcnMgYmVpbmcgZXhwb3NlZCB0byByYWRpb2FjdGl2ZSBtYXRlcmlhbHMgYW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBhbiBhY2NpZGVudCByZWxlYXNpbmcgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzIGludG8gdGhlIGVudmlyb25tZW50LgpHcm91bmR3YXRlciBwb2xsdXRpb24gYW5kIGVyb3Npb24KVGhlIGZlZGVyYWwgZ292ZXJubWVudCBpbml0aWFsbHkgYXJndWVkIHRoYXQgWXVjY2EgTW91bnRhaW4gc2VydmVkIGFzIGEgc3VpdGFibGUgZ2VvbG9naWMgZm9ybWF0aW9uIGZvciBudWNsZWFyIHdhc3RlIHN0b3JhZ2UgYmVjYXVzZSBhcmlkIGNvbmRpdGlvbnMgd291bGQgcHJldmVudCB3YXRlciBmcm9tIHRyYXZlbGluZyBxdWlja2x5IHRocm91Z2ggaXRzIGluZnJhc3RydWN0dXJlLiBSZWd1bGF0aW9ucyBmb3Igc2l0aW5nIG51Y2xlYXIgcmVwb3NpdG9yaWVzIHJlcXVpcmVkIHRoZSBnb3Zlcm5tZW50IHRvIGRpc3F1YWxpZnkgc2l0ZXMgaWYgZ3JvdW5kd2F0ZXIgZmxvd2VkIHRocm91Z2ggdGhlIGVudmlyb25tZW50IGZvciBhbnkgcGVyaW9kIHVuZGVyIDEsMDAwIHllYXJzLiBUaGUgd29ycnkgYWx3YXlzIHdhcyB0aGF0IHdhdGVyIGNvdWxkIGNvcnJvZGUgdGhlIHN0b3JhZ2UgY29udGFpbmVycywgdGh1cyByZWxlYXNpbmcgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzIGludG8gdGhlIGVudmlyb25tZW50IGFuZCB0aGUgZ3JvdW5kd2F0ZXIuIEhvd2V2ZXIsIGluIDE5OTYsIERlcGFydG1lbnQgb2YgRW5lcmd5IHJlc2VhcmNoZXJzIGRpc2NvdmVyZWQgYW4gaXNvdG9wZSBrbm93biBhcyBDaGxvcmluZS0zNiBhdCBZdWNjYSBNb3VudGFpbi4gSXQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZSBDaGxvcmluZS0zNiB3YXMgZmlyc3QgaW50cm9kdWNlZCBpbnRvIHRoZSBhdG1vc3BoZXJlIHdpdGggbnVjbGVhciB0ZXN0aW5nIGNvbmR1Y3RlZCBpbiB0aGUgUGFjaWZpYyBPY2Vhbi4gVGhpcyBzdWdnZXN0ZWQsIGFzIHNldmVyYWwgTmV2YWRhIHNjaWVudGlzdHMgaGFkIHdhcm5lZCwgdGhhdCB3YXRlciB0cmF2ZWxlZCB0aHJvdWdoIHRoZSBtb3VudGFpbiBtb3JlIHJhcGlkbHkgdGhhbiBleHBlY3RlZC4gSW4gcmVzcG9uc2UsIHRoZSBET0Ugc2FpZCBpdCB3b3VsZCBpbnN0YWxsIHRpdGFuaXVtIOKAnGRyaXAgc2hpZWxkc+KAnSBhcm91bmQgdGhlIHdhc3RlIGNhbmlzdGVycyB0byBwcmV2ZW50IG1hdGVyaWFscyBmcm9tIGJsZWVkaW5nIGludG8gdGhlIG1vdW50YWluLgpTZWlzbWljIGFjdGl2aXR5IGNhdXNpbmcgbGVha2FnZQpTYW0gTW9ycmlzCkEgcHJvdGVzdG9yIGhvbGRzIGEgc2lnbiBkdXJpbmcgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5JiMzOTtzIHB1YmxpYyBoZWFyaW5nIG9uIHRoZSBwcm9wb3NlZCBZdWNjYSBNb3VudGFpbiBSZXBvc2l0b3J5IFNlcHQuIDUsIDIwMDEuCk5ldmFkYSBvZmZpY2lhbHMgYW5kIG9wcG9uZW50cyBvZiBZdWNjYSBoYXZlIGxvbmcgYXJndWVkIHRoYXQgdGhlIHNpdGluZyBpcyB1bnN1aXRhYmxlIGJlY2F1c2UgdGhlIG1vdW50YWluIHJlc3RzIG9uIGVhcnRocXVha2UgZmF1bHRzLiBUaGUgc3RhdGUgc2F5cyB0aGlzIGNvdWxkIHBvc2Ugcmlza3MgZHVyaW5nIHRoZSBlbXBsYWNlbWVudCBwaGFzZSBhbmQgYWZ0ZXIgdGhlIHdhc3RlIGhhcyBiZWVuIHN0YXNoZWQgYXdheSBpbiB0aGUgbW91bnRhaW4uIEZhdWx0IG1vdmVtZW50LCBmb3IgaW5zdGFuY2UsIGNvdWxkIGFmZmVjdCB0aGUgd2F0ZXIgdGFibGUgYW5kIGdlb2xvZ2ljIHN0cnVjdHVyZXMsIGxlYWRpbmcgdG8gdGhlIHJlbGVhc2Ugb2YgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzLiBUaGUgRE9FIGFuZCBzb21lIHVuYWZmaWxpYXRlZCBzY2llbnRpc3RzIGRpc2FncmVlLiBUaGV5IGFja25vd2xlZGdlIHRoYXQgWXVjY2EgTW91bnRhaW4gc2l0cyBvbiBzZXZlcmFsIGZhdWx0IGxpbmVzLCBidXQgdGhleSBjb250ZW5kIHRoYXQgdGhlIHRlY3RvbmljcyBhcmUgbm90IHBvd2VyZnVsIGVub3VnaCB0byBjcmVhdGUgYW4gZWFydGhxdWFrZSB0aGF0IHdvdWxkIGFmZmVjdCB0aGUgcmVwb3NpdG9yeS4gSW4gdGhlIHBhc3QsIHRoZSBkZXBhcnRtZW50IGhhcyBhZGp1c3RlZCBpdHMgcGxhbnMgdG8gYXZvaWQgb25lIG9mIHRoZSBtYWpvciBmYXVsdCBsaW5lcy4KT25lIGFsdGVybmF0aXZlIHRvIHN0b3JhZ2UKTnVjbGVhciByZXByb2Nlc3NpbmcgcmVjb3ZlcnMgc29tZSBzcGVudCBudWNsZWFyIGZ1ZWwgZm9yIHJldXNlLiBUaGUgcHJvY2VzcyBpcyB1c2VkIGluIEphcGFuIGFuZCBpbiBFdXJvcGUsIGJ1dCBpdCBoYXMgYmVlbiBzbG93IHRvIGNhdGNoIG9uIGluIHRoZSBVLlMuLCBpbiBwYXJ0IGJlY2F1c2Ugb2YgdGhlIGNvc3QsIHdoaWNoIGNvdWxkIHJhaXNlIGVsZWN0cmljaXR5IHJhdGVzIG9yIGZ1cnRoZXIgYnVyZGVuIHRoZSBjb3VudHJ54oCZcyBhdHJvcGh5aW5nIG51Y2xlYXIgaW5kdXN0cnkuIEluIDIwMTIsIHRoZSBCbHVlIFJpYmJvbiBDb21taXNzaW9uIHNhaWQgdGhlIG1vdmUgd2FzIHByZW1hdHVyZSDigJxnaXZlbiB0aGUgbGFyZ2UgdW5jZXJ0YWludGllcyAuLi4gYWJvdXQgdGhlIG1lcml0cyBhbmQgY29tbWVyY2lhbCB2aWFiaWxpdHkgb2YgZGlmZmVyZW50IGZ1ZWwgY3ljbGVzIGFuZCB0ZWNobm9sb2d5IG9wdGlvbnMu4oCdClRlcnJvcmlzbSBhbmQgc2VjdXJpdHkgcmlza3MKQW4gdW5zZXR0bGluZyBuYXRpb25hbCBzZWN1cml0eSBjb25jZXJuIGlzIHRpZWQgdG8gdGhlIFl1Y2NhIHBsYW4uIERvZXMgYSBrbm93biB3YXN0ZSByZXBvc2l0b3J5IHR1cm4gWXVjY2EgTW91bnRhaW4gaW50byBhIHRlcnJvcmlzdCB0YXJnZXQ/IFByb3BvbmVudHMgc2F5IHN0b3JpbmcgdGhlIGNvdW50cnnigJlzIHNwZW50IG51Y2xlYXIgZnVlbCBpbiBvbmUgcGxhY2UgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtLCB3aGVyZSBmdWVsIGlzIHdpZGVseSBkaXN0cmlidXRlZC4gT3Bwb25lbnRzIHF1ZXN0aW9uIHRoYXQgbG9naWMsIHdvbmRlcmluZyB3aGV0aGVyIGl04oCZcyBwcnVkZW50IHRvIGNyZWF0ZSB3aGF0IGNvdWxkIGJlIGEgdGVycm9yaXN0IHRhcmdldCA5MCBtaWxlcyBvdXRzaWRlIG9mIGEgY2l0eSB3aG9zZSBlY29ub215IGlzIGhlYXZpbHkgcmVsaWFudCBvbiB0b3VyaXNtLiBPdGhlciBjb25jZXJucyBpbmNsdWRlIGRlc3RydWN0aW9uIG9mIGEgdHJhbnNwb3J0YXRpb24gY2FzayBlbiByb3V0ZSBieSBleHBsb3NpdmVzIG9yIGEgc2hvdWxkZXItZmlyZWQgbWlzc2lsZTsgdGhlZnQgb2YgcmFkaW9hY3RpdmUgbWF0ZXJpYWwgZnJvbSBhIG51Y2xlYXIgcG93ZXIgcGxhbnQsIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEg4oCcZGlydHkgYm9tYiYjMzQ7OyBhIGN5YmVyYXR0YWNrIG9uIGEgbnVjbGVhciByZWFjdG9yLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gdGhlIHJlbGVhc2Ugb2YgcmFkaWF0aW9uIGFuZCBhbHNvIGRpc3J1cHQgdGhlIHBvd2VyIGdyaWQuCkFnZS1yZWxhdGVkIGltcGFjdHMKT25jZSBlbXBsYWNlZCwgbnVjbGVhciB3YXN0ZSBhdCBZdWNjYSBNb3VudGFpbiB3b3VsZCBzbG93bHkgZGVjYXkgb3ZlciBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgeWVhcnMsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gcHJlZGljdCBsb25nLXRlcm0gaGVhbHRoIHJpc2tzLiBTY2llbnRpc3RzIGRpZmZlciwgZmlyc3Qgbm90aW5nIHRoYXQgYSBsZWFrIHdvdWxkIG5vdCBsb29rIGxpa2UgdGhlIGNsYXNzaWMgY2FydG9vbiBpbnRlcnByZXRhdGlvbiBvZiBuZW9uIGxpcXVpZCBzZWVwaW5nIG91dCBvZiB0aGUgbW91bnRhaW4uIEl0IHdvdWxkIGJlIGluIGEgc29saWQsIHN0YWJsZSBmb3JtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZWQgdGhlIHJlcG9zaXRvcnkuIE9uZSBzY2llbnRpc3QgdG9sZCB0ZWNoIHB1YmxpY2F0aW9uIFRoZSBWZXJnZSB0aGF0IHRoZSBtYXRlcmlhbCB3b3VsZCBiZSBzbyBzdGFibGUgdGhhdCBoZeKAmWQgYmUgY29tZm9ydGFibGUgc3RvcmluZyBhIHdhc3RlIGNhbmlzdGVyIGluIGhpcyBiYWNreWFyZC4gT3RoZXJzIHdvcnJ5IGFib3V0IGV2ZW4gbG93LWRvc2UgcmFkaWF0aW9uLgrigJNEYW5pZWwgUm90aGJlcmcKQSByZWNlbnQgY2F1dGlvbmFyeSB0YWxlClRlZCBTLiBXYXJyZW4gLyBBUApJbiB0aGlzIEp1bHkgOSwgMjAxNCwgZmlsZSBwaG90bywgYSBzaWduIHdhcm5zIG9mIHJhZGlvYWN0aXZpdHkgb24gdGhlIEhhbmZvcmQgTnVjbGVhciBSZXNlcnZhdGlvbiBuZWFyIFJpY2hsYW5kLCBXYXNoLgpPbiBNYXkgOSwgYWJvdXQgMjAwIG1pbGVzIGZyb20gU2VhdHRsZSwgcGFydCBvZiBhIHN0b3JhZ2UgdHVubmVsIGNvbGxhcHNlZCBhdCB0aGUgSGFuZm9yZCBOdWNsZWFyIFJlc2VydmF0aW9uIC4gUmFpbGNhcnMgZnVsbCBvZiByYWRpb2FjdGl2ZSB3YXN0ZSB3ZXJlIGluc2lkZSwgYnV0IFdhc2hpbmd0b27igJlzIERlcGFydG1lbnQgb2YgRWNvbG9neSBkZXRlY3RlZCBubyBlc2NhcGVkIHJhZGlhdGlvbi4gWXVjY2EgTW91bnRhaW4gb3Bwb25lbnRzIHBvaW50ZWQgdG8gdGhlIGluY2lkZW50IGFzIGEgd2FybmluZyBvZiB3aGF0IGNvdWxkIGhhcHBlbiBpbiBOZXZhZGEgaWYgdGhlIGNlbnRyYWwgcmVwb3NpdG9yeSBwcm9wb3NlZCBkZWNhZGVzIGFnbyB3ZXJlIGJ1aWx0IGhlcmUsIHdoaWxlIHN1cHBvcnRlcnMgc3VnZ2VzdGVkIHN1Y2ggYSBzY2FyZSBjb3VsZCBoYXZlIGJlZW4gYXZvaWRlZCBpZiB0aGUgdmlzaW9uIGZvciBZdWNjYSBoYWQgYmVlbiByZWFsaXplZC4KSGFuZm9yZCByZXBvcnRlZGx5IGlzIHRoZSBsYXJnZXN0IGRlcG9zaXRvcnkgb2YgcmFkaW9hY3RpdmUgZGVmZW5zZSB3YXN0ZSwgYXMgaXQgbWFkZSBwbHV0b25pdW0gZm9yIG51Y2xlYXIgd2VhcG9ucyBmb3IgZGVjYWRlcywgaW5jbHVkaW5nIHRoZSBib21iIHRoYXQgd2FzIGRyb3BwZWQgb24gTmFnYXNha2ksIEphcGFuLCBhdCB0aGUgZW5kIG9mIFdvcmxkIFdhciBJSS4gSW4gYSAyMDEwIHN0b3J5IGFib3V0IHRoZSBPYmFtYSBhZG1pbmlzdHJhdGlvbiB3aXRoZHJhd2luZyBZdWNjYSYjMzk7cyBsaWNlbnNlIGFwcGxpY2F0aW9uLCB0aGUgU2VhdHRsZSBUaW1lcyBzYWlkIHRoZSBtb3ZlIGxlZnQgdGhlIGZhdGUgb2YgdGhlIOKAnE1hbmhhdHRhbiBQcm9qZWN04oCZcyBuYXN0aWVzdCBnb29w4oCdIHVwIGluIHRoZSBhaXIuCkluIEFwcmlsIDIwMTYsIG9uZSBvZiBIYW5mb3Jk4oCZcyBvbGQgd2FzdGUgdGFua3Mgc3BydW5nIGEgbGVhay4gV2lyZWQgbWFnYXppbmUgcmVwb3J0ZWQgdGhhdCB3b3JrZXJzIGhhZCBiZWVuIHNodWZmbGluZyByYWRpb2FjdGl2ZSBtYXRlcmlhbCBmcm9tIHRhbmsgdG8gdGFuayBhcyB0aGV5IHdhaXRlZCBmb3IgdHdvIHRoaW5ncyB0byBoYXBwZW46IDEpIFl1Y2NhIE1vdW50YWluIHRvIGJlZ2luIHN0b3Jpbmcgd2FzdGUsIGFuZCAyKSBhbiBvbnNpdGUgdml0cmlmaWNhdGlvbiBmYWNpbGl0eSB0byB0dXJuIHdhc3RlIGludG8gZ2xhc3MgbG9ncyBmb3Igc2FmZXIgc3RvcmFnZSBhbmQgZXZlbnR1YWwgdHJhbnNwb3J0IHRvIE5ldmFkYeKAmXMgcmVwb3NpdG9yeS4gVGhlIGxhdHRlciBmYWNpbGl0eSBpcyBleHBlY3RlZCB0byBsYXVuY2ggYnkgMjAzMiwgdGhvdWdoIGl0IGFuZCBZdWNjYSBib3RoIHdlcmUgb3JpZ2luYWxseSBzbGF0ZWQgZm9yIGNvbXBsZXRpb24gaW4gMTk5OC4K4oCTRXJpbiBSeWFuCkFQIFBob3RvL0NsaWZmIE93ZW4KTGVlIEhhbWlsdG9uLCByaWdodCwgYW5kIEJyZW50IFNjb3djcm9mdCwgY2VudGVyLCBjby1jaGFpcnMsIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYSYjMzk7cyBOdWNsZWFyIEZ1dHVyZSBBZ2VuZGEsIHRhbGsgd2l0aCBmb3JtZXIgTmV3IE1leGljbyBTZW4uIFBldGUgRG9tZW5pY2ksIFRodXJzZGF5LCBNYXJjaCAyNSwgMjAxMCwgZHVyaW5nIHRoZSBncm91cCYjMzk7cyBtZWV0aW5nIGluIFdhc2hpbmd0b24uCkJMVUUgUklCQk9OIENPTU1JU1NJT04gUkVDT01NRU5EQVRJT05TCkF0IHRoZSByZXF1ZXN0IG9mIHRoZW4tUHJlc2lkZW50IEJhcmFjayBPYmFtYSwgdGhlIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYeKAmXMgTnVjbGVhciBGdXR1cmUgd2FzIGZvcm1lZCB0byByZXZpZXcgcG9saWN5IGFuZCByZWNvbW1lbmQgYSBuZXcgc3RyYXRlZ3kgZm9yIG1hbmFnaW5nIOKAnHRoZSBiYWNrIGVuZCBvZiB0aGUgbnVjbGVhciBmdWVsIGN5Y2xlLuKAnSBUaGUgZ3JvdXAgbWV0IG1vcmUgdGhhbiB0d28gZG96ZW4gdGltZXMgYmV0d2VlbiAyMDEwIGFuZCB0aGUgcmVsZWFzZSBvZiBpdHMgZmluYWwgcmVwb3J0IGluIDIwMTIsIGFmdGVyIGhlYXJpbmcgdGVzdGltb255IGZyb20gZXhwZXJ0cyBhbmQgc3Rha2Vob2xkZXJzLCB2aXNpdGluZyB3YXN0ZS1tYW5hZ2VtZW50IHNpdGVzIGhlcmUgYW5kIGFicm9hZCwgYW5kIGNvbmR1Y3RpbmcgZml2ZSBwdWJsaWMgbWVldGluZ3MuCjEuIENvbnNlbnQ6IFRoZSByZXBvcnQgaW5kaWNhdGVkIHRoYXQgZm9yY2luZyBhIGZlZGVyYWxseSBtYW5kYXRlZCBmaXggb3ZlciB0aGUgb2JqZWN0aW9ucyBvZiBhIHN0YXRlIHdvdWxkIOKAnHRha2UgbG9uZ2VyLCBjb3N0IG1vcmUgYW5kIGhhdmUgbG93ZXIgb2RkcyBvZiB1bHRpbWF0ZSBzdWNjZXNzLuKAnSBUaGUgY29tbWlzc2lvbiBzYWlkIGxvY2FsaXRpZXMgc2hvdWxkIHZvbHVudGVlciB0byBiZSBjb25zaWRlcmVkLgoyLiBPdmVyc2lnaHQ6IEdpdmVuIHRoZSBvdmVyYWxsIHJlY29yZCBvZiBwdWJsaWMgbWlzdHJ1c3QgaW4gdGhlIERPRSBhbmQgdGhlIGZlZGVyYWwgZ292ZXJubWVudCwgdGhlIGNvbW1pc3Npb24gcmVjb21tZW5kZWQgdGhhdCBDb25ncmVzcyBjaGFydGVyIGFuIGluZGVwZW5kZW50IGZlZGVyYWwgYm9keSB0byBvdmVyc2VlIHdhc3RlIG1hbmFnZW1lbnQuCjMuIEZ1bmRpbmc6IFNpbmNlIDE5ODIsIG51Y2xlYXIgd2FzdGUgZGlzcG9zYWwgaGFzIGJlZW4gcGFpZCBmb3IgYnkgdXRpbGl0aWVzIGFuZCB0aGVpciByYXRlcGF5ZXJzLiBZZXQgdGhvc2UgZnVuZHMgb2Z0ZW4gYXJlIOKAnGluYWNjZXNzaWJsZSB0byB0aGUgd2FzdGUgcHJvZ3JhbS7igJ0gVGhlIGNvbW1pc3Npb24gc2FpZCBpdCBzaG91bGRu4oCZdCBoYXZlIHRvIGNvbXBldGUgZm9yIGl0cyBvd24gZnVuZHMuCjQuIE9wdGlvbnM6IFRoZSByZXBvcnQgYXNrZWQgdGhlIGZlZGVyYWwgZ292ZXJubWVudCB0byBkZXZlbG9wIGEgZGVlcCBnZW9sb2dpY2FsIHJlcG9zaXRvcnkuIEl0IG5vdGVkIHRoYXQgdGhlIFUuUy4gd291bGQg4oCcbmVlZCB0byBmaW5kIGEgbmV3IGRpc3Bvc2FsIHNpdGUgZXZlbiBpZiBZdWNjYSBNb3VudGFpbiBnb2VzIGZvcndhcmQs4oCdIGJlY2F1c2Ugb2YgdGhlIHF1YW50aXR5IG9mIHdhc3RlLgo1LiBTdG9yYWdlOiBJbnRlcmltIHN0b3JhZ2Ugc2l0ZXMgZm9yIHdhc3RlIGNvdWxkIGFsbG93IHNwZW50IG51Y2xlYXIgZnVlbCB0byBjb29sIGJlZm9yZSBiZWluZyB0cmFuc2ZlcnJlZCB0byBhIHBlcm1hbmVudCByZXBvc2l0b3J5LiBUaGV5IGFsc28gd291bGQgYWxsb3cgbnVjbGVhciBwb3dlciBwbGFudHMgdG8gZnVsbHkgZGVjb21taXNzaW9uLCByYXRoZXIgdGhhbiBzdG9yZSByb2RzIGluZGVmaW5pdGVseS4KNi4gVHJhbnNwb3J0OiBUaGUgcmVwb3J0IGNhbGxlZCB0aGUgY3VycmVudCB0cmFuc2ZlciBzeXN0ZW0g4oCcZXhjZWxsZW50LOKAnSBidXQgc2FpZCByZWd1bGF0aW9ucyBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIGRldmVsb3BtZW50cyBpbiBudWNsZWFyIGZ1ZWwsIGFzIGdyZWF0ZXIgbmVlZCBhbmQgZGVtYW5kIGZvciBtb3Zpbmcgd2FzdGUgd291bGQgcmV2ZWFsIG5ldyBwdWJsaWMgY29uY2VybnMuCjcuIElubm92YXRpb246IE1lbWJlcnMgb2YgdGhlIGNvbW1pc3Npb24gYWdyZWVkIHRoYXQgbW9yZSByZXNlYXJjaCBhbmQgZGV2ZWxvcG1lbnQgd2FzIG5lZWRlZCBpbiB0aGUgY291bnRyeeKAmXMgbnVjbGVhciBlbmVyZ3kgc2VjdG9yLCBlc3BlY2lhbGx5IGluIHRoZSBjcmVhdGlvbiBvZiDigJxhIHJlZ3VsYXRvcnkgZnJhbWV3b3JrIGZvciBhZHZhbmNlZCBudWNsZWFyIGVuZXJneSBzeXN0ZW1zLuKAnQo4LiBQb2xpY3k6IFRoZSByZXBvcnQgc2FpZCB0aGUgVS5TLiBzaG91bGQgbGVhZCB0aGUgd29ybGQgb24gc2FmZXR5LCBub25wcm9saWZlcmF0aW9uIGFuZCBwcmV2ZW50aW5nIHRoZSB3ZWFwb25pemF0aW9uIG9mIG51Y2xlYXIgZW5lcmd5LiDigJxMb25nZXIgdGVybSzigJ0gaXQgc2FpZCwg4oCcdGhlIFUuUy4gc2hvdWxkIHN1cHBvcnQgdGhlIHVzZSBvZiBtdWx0aS1uYXRpb25hbCBmdWVsLWN5Y2xlIGZhY2lsaXRpZXMu4oCdCuKAk0RhbmllbCBSb3RoYmVyZwpKb2huIExvY2hlciAvIEFQCkNvbmdyZXNzbWVuLCBpbmNsdWRpbmcgSmVycnkgTWNOZXJuZXksIEQtQ2FsaWYuLCBsZWZ0LCBhbmQgUmVwLiBKb2huIFNoaW1rdXMsIFItSWxsLiwgc2Vjb25kIGZyb20gbGVmdCwgdG91ciBZdWNjYSBNb3VudGFpbiwgVGh1cnNkYXksIEFwcmlsIDksIDIwMTUsIG5lYXIgTWVyY3VyeS4gU2V2ZXJhbCBtZW1iZXJzIG9mIENvbmdyZXNzIHRvdXJlZCB0aGUgcHJvcG9zZWQgcmFkaW9hY3RpdmUgd2FzdGUgZHVtcCA5MCBtaWxlcyBub3J0aHdlc3Qgb2YgTGFzIFZlZ2FzLgpXSEFUIFdPVUxEIEhBVkUgVE8gSEFQUEVOIFRPIEVOQUJMRSBXQVNURSBTVE9SQUdFIEFUIFlVQ0NBPwpFdmVuIGlmIFl1Y2NhIE1vdW50YWluIHdlcmUgZ3JlZW4tbGlnaHRlZCwgdGhlIGZlZGVyYWwgZ292ZXJubWVudCB3b3VsZCBoYXZlIHRvIGRldmVsb3AgYW5vdGhlciBkZWVwIGdlb2xvZ2ljIHJlcG9zaXRvcnkgZm9yIHN0b3JpbmcgbnVjbGVhciB3YXN0ZSwgdGhlIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYeKAmXMgTnVjbGVhciBGdXR1cmUgZm91bmQuIFRoZSBwYW5lbCB3cm90ZSBpbiAyMDEyIHRoYXQg4oCcdGhlIFUuUy4gaW52ZW50b3J5IG9mIHNwZW50IG51Y2xlYXIgZnVlbCB3aWxsIHNvb24gZXhjZWVkIHRoZSBhbW91bnQgdGhhdCBjYW4gYmUgbGVnYWxseSBlbXBsYWNlZCBhdCAoWXVjY2EgTW91bnRhaW4pIHVudGlsIGEgc2Vjb25kIHJlcG9zaXRvcnkgaXMgaW4gb3BlcmF0aW9uLuKAnSBJbiAyMDE0LCB0aGUgbW9zdCByZWNlbnQgeWVhciB3aXRoIGF2YWlsYWJsZSBkYXRhLCB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneSBlc3RpbWF0ZWQgdGhhdCB0aGUgbmF0aW9uIGhhZCBhYm91dCA3MCw1MDAgbWV0cmljIHRvbnMgb2YgaGVhdnkgbWV0YWwgaW4gbmVlZCBvZiBkaXNwb3NhbC4gSW5kdXN0cnkgbG9iYnlpbmcgZ3JvdXAgdGhlIE51Y2xlYXIgRW5lcmd5IEluc3RpdHV0ZSBwdXRzIHRoZSBjdXJyZW50IGZpZ3VyZSBhdCA3OCw1OTAgbWV0cmljIHRvbnMsIHdoZXJlYXMgWXVjY2EgTW91bnRhaW4gY2FuIHN0b3JlIG9ubHkgYWJvdXQgNzAsMDAwIHVuZGVyIHRoZSBjdXJyZW50IGNhcC4gT3RoZXIgaHVyZGxlcyB0aGUgcHJvamVjdCB3b3VsZCBoYXZlIHRvIG92ZXJjb21lOgpOZXcgb2ZmaWNlLCBvbGQgcGxhbnMKUmVzdGFydGluZyB0aGUgcHJvamVjdCB3b3VsZCBiZSBhbiBhZG1pbmlzdHJhdGl2ZSBjaGFsbGVuZ2UsIHNhaWQgSnVkeSBUcmVpY2hlbCwgZXhlY3V0aXZlIGRpcmVjdG9yIG9mIHRoZSBOZXZhZGEgTnVjbGVhciBXYXN0ZSBUYXNrIEZvcmNlICwgd2hpY2ggd2FzIGZvcm1lZCBpbiByZXNwb25zZSB0byB0aGUgc3RhdGUgYmVpbmcgY2hvc2VuIGFzIHRoZSBuYXRpb27igJlzIG51Y2xlYXIgd2FzdGUgZHVtcCBhZnRlciB0aGUgMTk4NyBhbWVuZG1lbnQgdG8gdGhlIE51Y2xlYXIgV2FzdGUgUG9saWN5IEFjdC4KRGlkIHlvdSBrbm93PwpUaGVyZSBhcmUgbm93IG1vcmUgdGhhbiAyIG1pbGxpb24gZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWXVjY2EgTW91bnRhaW4gcHJvY2VlZGluZy4K4oCcQmVmb3JlIHlvdSBldmVyIGdldCB0byBsaWNlbnNpbmcsIHRoZXJl4oCZcyBubyBkZXBhcnRtZW50IGF0IHRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSwgdGhlcmXigJlzIG5vIGRpdmlzaW9uIGZvciBhIFl1Y2NhIE1vdW50YWluIHByb2plY3Qs4oCdIFRyZWljaGVsIHNhaWQuIOKAnFRoZXkgd291bGQgaGF2ZSB0byBiZWdpbiBhZ2FpbiB0byBwdXQgdG9nZXRoZXIgd2hhdCB1c2VkIHRvIGJlIHRoZSBPZmZpY2Ugb2YgQ2l2aWxpYW4gUmFkaW9hY3RpdmUgV2FzdGUgTWFuYWdlbWVudC7igJ0KU3RldmUgRnJpc2htYW4sIGNvbnN1bHRhbnQgZm9yIHRoZSBOZXZhZGEgQWdlbmN5IGZvciBOdWNsZWFyIFByb2plY3RzICwgYWdyZWVkIHdpdGggVHJlaWNoZWwgdGhhdCBhbnkgcGxhbnMgZm9yIFl1Y2NhIE1vdW50YWluIHdvdWxkIG5lZWQgdG8gYmUgcmV2aXNpdGVkIG5vdyB0aGF0IHNvIG1hbnkgeWVhcnMgaGF2ZSBwYXNzZWQuCuKAnFRoYXQgdHVubmVsIGhhcyBqdXN0IGJlZW4gc2l0dGluZyB0aGVyZSzigJ0gVHJlaWNoZWwgc2FpZC4g4oCcVGhlcmXigJlzIHByb2JhYmx5IGEgbG90IG9mIG1vbGQgKGFuZCkgZGVncmFkYXRpb24gLi4uIHRoZXJl4oCZcyBwcm9iYWJseSBjb3Jyb3Npb24u4oCdCkZyaXNobWFuIHNhaWQgcm9ja2ZhbGwgbWF5IGJlIGFuIGlzc3VlLCB0aG91Z2ggbGlrZWx5IG5vdCBhdCB0aGUgbGV2ZWwgb2YgdGhlIHJlY2VudCB0dW5uZWwgY29sbGFwc2UgYXQgdGhlIEhhbmZvcmQgTnVjbGVhciBSZXNlcnZhdGlvbiBpbiB0aGUgc3RhdGUgb2YgV2FzaGluZ3Rvbi4KVHJhbnNwb3J0YXRpb24KQW5vdGhlciBodXJkbGUgd291bGQgYmUgbGF5aW5nIG91dCB0aGUgcm91dGUgdGhlIHdhc3RlIHdvdWxkIHRha2UgdG8gWXVjY2EgTW91bnRhaW4uIFRyZWljaGVsIHNhaWQgdGhlIG9yaWdpbmFsbHkgcHJvcG9zZWQgcmFpbCByb3V0ZSBjdXRzIHRocm91Z2ggbGFuZCB0aGF0IGlzIG5vdyB0aGUgQmFzaW4gYW5kIFJhbmdlIG5hdGlvbmFsIG1vbnVtZW50LCB0aG91Z2ggdGhlIFRydW1wIGFkbWluaXN0cmF0aW9uIGlzc3VlZCBhbiBleGVjdXRpdmUgb3JkZXIgdG8gcmV2aXNpdCB0aGUgdXNlIG9mIHRoZSBBbnRpcXVpdGllcyBBY3QgaW4gcmVjZW50IG1vbnVtZW50IGRlc2lnbmF0aW9ucy4KRGlkIHlvdSBrbm93PwpBY2NvcmRpbmcgdG8gdGhlIFdvcmxkIE51Y2xlYXIgQXNzb2NpYXRpb24sIG5lYXItc3VyZmFjZSBhbmQgZGVlcC1nZW9sb2dpYyByZXBvc2l0b3JpZXMg4oCUIHN1Y2ggYXMgWXVjY2EgTW91bnRhaW4g4oCUIGFyZSBjb21tb25seSBhY2NlcHRlZCBvcHRpb25zIGZvciBwZXJtYW5lbnQgc3RvcmFnZSBvZiBoaWdoLWxldmVsIHdhc3RlLiBCdXQgaGVyZSBhcmUgYSBmZXcgdGhlIFUuUy4gaGFzIGV4cGxvcmVkIGFuZCBhYmFuZG9uZWQgb3ZlciB0aGUgeWVhcnM6IGxhdW5jaGluZyB3YXN0ZSBpbnRvIHNwYWNlOyBlbWJlZGRpbmcgaXQgaW4gaWNlIHNoZWV0czsgc2VhbGluZyBpdCBpbiB1bmRlcmdyb3VuZCBib3JlaG9sZXMgd2hlcmUgaXQgd291bGQgYnVpbGQgdXAgaGVhdCBhbmQgbWVsdCB0aGUgcm9jayBhcm91bmQgaXQgYmVmb3JlIGNvb2xpbmcgYW5kIGNyeXN0YWxsaXppbmcgdGhlIHJhZGlvYWN0aXZlIG1hdGVyaWFsIGludG8gdGhlIHJvY2sgbWF0cml4LgpUcmVpY2hlbCBzYWlkIHRoYXQgYmVjYXVzZSBvZiB0aGVpciBuZWVkIHRvIGJlIGJ1aWx0IG5lYXIgcm9idXN0IHN1cHBsaWVzIG9mIHdhdGVyLCBtb3N0IG51Y2xlYXIgcG93ZXIgcGxhbnRzIGFyZSBmYXIgZnJvbSB0aGUgWXVjY2Egc2l0ZS4K4oCcSXTigJlzIGEgdHJ1ZSB0ZXN0IGZvciBvdXIgZmFpbGluZyBpbmZyYXN0cnVjdHVyZSwgYmVjYXVzZSB5b3Ugc3VkZGVubHkgaGF2ZSB0aG91c2FuZHMgb2YgbWlsZXMgb2YgdHJhbnNwb3J0IHJlcXVpcmVkIHdpdGggdGhlIGhlYXZpZXN0IHBvc3NpYmxlIGxvYWRzIOKAlCB0aGF04oCZcyB3aHkgaXQgaGFzIHRvIGdvIChwcmltYXJpbHkpIGJ5IHRyYWluLOKAnSBzaGUgc2FpZC4KRnJpc2htYW4gc2FpZCB0aGUgb2xkIHJhaWwtbGluZSBwbGFuLCB3aGljaCBsb3N0IGl0cyBCdXJlYXUgb2YgTGFuZCBNYW5hZ2VtZW50IGVhc2VtZW50cywgd291bGQgaGF2ZSByZXF1aXJlZCBidWlsZGluZyAzMDAgbWlsZXMgb2YgbmV3IHRyYWNrcy4gSGUgc2FpZCBvZmZpY2lhbHMgbmVlZGVkIHRvIG1vZGlmeSBib3RoIHRoZSBsaWNlbnNlIGFwcGxpY2F0aW9uIGFuZCB0aGUgZW52aXJvbm1lbnRhbCBpbXBhY3Qgc3RhdGVtZW50IHRvIG1vdmUgZm9yd2FyZC4KTGljZW5zaW5nIGFuZCBsZWdhbCBjaGFsbGVuZ2VzClBsYW4gdXBkYXRlcyB3b3VsZCBjb21lIGJlZm9yZSBhbnkgZm9yYXkgaW50byBsaWNlbnNpbmcsIFRyZWljaGVsIHNhaWQuIElmIG9mZmljaWFscyBnb3QgdGhhdCBmYXIsIHRoZSBwcm9qZWN0IHdvdWxkIHN0aWxsIGZhY2UgbGVnYWwgY2hhbGxlbmdlcyBhbmQgaHVuZHJlZHMgb2YgY29udGVudGlvbnMuCkZyaXNobWFuIHNhaWQgdHdvIGxhd3N1aXRzIGZpbGVkIGJ5IHRoZSBzdGF0ZSBvZiBOZXZhZGEgYXJlIGJlaW5nIGhlbGQgaW4gYWJleWFuY2UsIGJvdGggZ2V0dGluZyBhdCB0aGUgc3RhbmRhcmRzIGJ5IHdoaWNoIGEgbGljZW5zZSBhcHBsaWNhdGlvbiB3b3VsZCBiZSBqdWRnZWQuCuKAnFNvIGlmIHRoZXkgcmVzdGFydCB0aGUgbGljZW5zaW5nIHByb2Nlc3MsIHRoZSBmaXJzdCB0aGluZyB0aGUgc3RhdGUgb2YgTmV2YWRhIGlzIGdvaW5nIHRvIGRvIGlzIHJlb3BlbiBib3RoIG9mIHRob3NlIGxhd3N1aXRzLOKAnSBoZSBzYWlkLgpUaGUgbGljZW5zaW5nIHByb2Nlc3MgYWxvbmUgd291bGQgdGFrZSB5ZWFycywgd2l0aCBhbiBlc3RpbWF0ZWQgNDAwIGRheXMgbmVlZGVkIGp1c3QgdG8gYWRkcmVzcyBodW5kcmVkcyBvZiBvYmplY3Rpb25zIHJhaXNlZCBvdmVyIHRoZSB5ZWFycyBieSBncm91cHMsIGluY2x1ZGluZyB0aGUgc3RhdGUuCkZyaXNobWFuIHNhaWQgY29udGVudGlvbnMgd2VyZSBhZGRyZXNzZWQgbXVjaCBsaWtlIGluIGNpdmlsIGNvdXJ0LCB3aGVyZSBhIHBhbmVsIHdvdWxkIGNvbnNpZGVyIHRlc3RpbW9ueSBmcm9tIGJvdGggc2lkZXMgZm9yIGVhY2ggb25lIGJlZm9yZSBtYWtpbmcgYSBkZWNpc2lvbi4KQ29uc3RydWN0aW9uCklmIGxpY2Vuc2luZyBhcHByb3ZhbCB3ZXJlIHNlY3VyZWQsIEZyaXNobWFuIHNhaWQgdGhlIGNvbW1pc3Npb24gd291bGQgdGhlbiBuZWVkIHRvIGlzc3VlIGEgY29uc3RydWN0aW9uIGF1dGhvcml6YXRpb24sIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBkaXNwb3NhbCBkZWNpc2lvbi4KSGUgc2FpZCB0aGUgbGljZW5zaW5nIGFwcGxpY2F0aW9uIGluZGljYXRlZCB0aGF0IGNvbnN0cnVjdGlvbiBhbmQgaW5pdGlhbCB3YXN0ZSBkaXNwb3NhbCB3b3VsZCB0YWtlIG1vcmUgdGhhbiB0d28gZGVjYWRlcy4gVGhlIHJlcG9zaXRvcnkgaXMgZGVzaWduZWQgdG8gaGFuZGxlIDMsMDAwIG1ldHJpYyB0b25zIG9mIHdhc3RlIHBlciB5ZWFyLCBGcmlzaG1hbiBzYWlkIOKAlCAxLDAwMCBtZXRyaWMgdG9ucyBtb3JlIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgcHJvZHVjZWQgYnkgcmVhY3RvcnMgZWFjaCB5ZWFyLgpUaGUgcmVwb3NpdG9yeSBjb3VsZCBiZSBvcGVuIGZvciAxMDAgeWVhcnMgYWZ0ZXIgdGhlIGZpcnN0IHBsYWNlbWVudCBvZiB3YXN0ZSwgRnJpc2htYW4gc2FpZC4gQWZ0ZXIgdGhhdCwgYW4gYW1lbmRtZW50IHdvdWxkIG5lZWQgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBOdWNsZWFyIFJlZ3VsYXRvcnkgQ29tbWlzc2lvbiB0byBjbG9zZSBpdC4g4oCcV2XigJlyZSBqdXN0IGF0IHRoZSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGZpcnN0IHN0ZXAgb2YgYSAxMDAteWVhciBwcm9jZXNzLuKAnQrigJNZdm9ubmUgR29uemFsZXoKSm9obiBMb2NoZXIgLyBBUApSZXAuIEpvaG4gU2hpbWt1cywgUi1JbGwuLCBzdGFuZHMgbmVhciB0aGUgbm9ydGggcG9ydGFsIG9mIFl1Y2NhIE1vdW50YWluIGR1cmluZyBhIGNvbmdyZXNzaW9uYWwgdG91ciBUaHVyc2RheSwgQXByaWwgOSwgMjAxNSwgYWJvdXQgOTAgbWlsZXMgbm9ydGh3ZXN0IG9mIExhcyBWZWdhcy4KT3RoZXIgc3RhdGVzIHdpdGggYSBsb3QgYXQgc3Rha2UKV2hpbGUgdGhlIGZpZ2h0IG92ZXIgWXVjY2EgTW91bnRhaW4gY29udGludWVzLCBoaWdoLWxldmVsIHdhc3RlIGlzIGJlaW5nIHN0b3JlZCBhY3Jvc3MgdGhlIGNvdW50cnkgYXQgcmVhY3RvciBzaXRlcyBhbmQgb3RoZXJzIGxpY2Vuc2VkIGJ5IHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgdG8gd2F0Y2ggb3ZlciB0aGUgc2Vuc2l0aXZlIG1hdGVyaWFsLgpOdWNsZWFyIGZ1ZWwgcm9kcyBsYXN0IHR3byB0byB0aHJlZSB5ZWFycyBpbiBhIHJlYWN0b3IgYmVmb3JlIHRoZSBmaXNzaW9uIHByb2Nlc3MgdXNlcyB1cCBlbm91Z2ggb2YgdGhlIGVuZXJneSBpbiB0aGUgdXJhbml1bSB0aGF0IHRoZXkgYXJlIG5vIGxvbmdlciBlZmZpY2llbnQuIER1cmluZyB0aGF0IHByb2Nlc3MsIHRoZXkgYmVjb21lIHJhZGlvYWN0aXZlIGFuZCBpbnRlbnNlbHkgaG90LiBTcGVudCByb2RzIGZpcnN0IGdvIHRvIOKAnHdldCBzdG9yYWdl4oCdIGluIGluZG9vciBjb29saW5nIHBvb2xzLiBPbmNlIHRoZXnigJlyZSBoZWF0LXN0YWJpbGl6ZWQgYWZ0ZXIgYSBwZXJpb2Qgb2Ygb25lIHRvIGZpdmUgeWVhcnMgKG9yIGxvbmdlciksIHRoZXnigJlyZSB0cmFuc2ZlcnJlZCBpbnRvICYjMzQ7ZHJ5IHN0b3JhZ2UmIzM0OyBpbiBoZWF2eS1kdXR5IGNhc2tzIHRoYXQgc2hpZWxkIHJhZGlvYWN0aXZlIG1hdGVyaWFsIGZvciB1cCB0byBhIGNlbnR1cnkgKGEgZnVsbCBzZXR1cCBjYW4gd2VpZ2ggMjgwLDAwMCBwb3VuZHMsIG1vc3Qgb2YgdGhlIHdlaWdodCBjb21pbmcgZnJvbSB0aGUgbWV0YWwgYW5kIGNvbmNyZXRlIGNhc2spLiBBcyBwbGFudHMgaGF2ZSBhY2N1bXVsYXRlZCBtb3JlIGFuZCBtb3JlIHJvZHMsIHRoZXnigJl2ZSBtb2RpZmllZCBzdG9yYWdlIHJhY2tzIHRvIHBhY2sgdGhlbSBpbiBtdWNoIHRpZ2h0ZXIsIGJ1dCB0aGlzIGlzIG5vdCBhIHBlcm1hbmVudCBzb2x1dGlvbi4KSW50ZXJpbSBzdG9yYWdlIHNpdGVzIGFyZSBiZWluZyBleHBsb3JlZC4gQWNjb3JkaW5nIHRvIHRoZSBOUkMsIHR3byBlbnRpdGllcyBoYXZlIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiBhcHBseWluZyB0byBidWlsZCBpbnRlcmltIHNpdGVzICwgb25lIGluIFRleGFzIGFuZCB0aGUgb3RoZXIgaW4gTmV3IE1leGljby4gSWYgdGhlc2UgYXBwbGljYXRpb25zIGFyZSBhcHByb3ZlZCwgdGhlIE5SQyB3aWxsIGlzc3VlIGxpY2Vuc2VzIHZhbGlkIGZvciB1cCB0byA0MCB5ZWFycy4KRXNwZWNpYWxseSBnaXZlbiBob3cgbXVjaCBoYXMgYmVlbiBpbnZlc3RlZCBpbiB3YXN0ZSBkaXNwb3NhbCBieSB1dGlsaXR5IHJhdGVwYXllcnMgaW4gYXJlYXMgcHJvZHVjaW5nIG51Y2xlYXIgZW5lcmd5LCB0aGVzZSBzdGF0ZXMgaGF2ZSBhIGxvdCBhdCBzdGFrZSBhcyB0aGUgbmF0aW9uIHRyaWVzIHRvIHNldHRsZSBvbiBhIHdheSBmb3J3YXJkOgpJbGxpbm9pczogMTAsMTgwIG1ldHJpYyB0b25zIG9mIHNwZW50IG51Y2xlYXIgZnVlbApQZW5uc3lsdmFuaWE6IDcsMzMwIG1ldHJpYyB0b25zClNvdXRoIENhcm9saW5hOiA0LDY4MCBtZXRyaWMgdG9ucwpOZXcgWW9yazogNCwxODAgbWV0cmljIHRvbnMKQWxhYmFtYTogMyw4NDAgbWV0cmljIHRvbnMKTm9ydGggQ2Fyb2xpbmE6IDMsNzYwIG1ldHJpYyB0b25zCkNhbGlmb3JuaWEsIEZsb3JpZGEsIEdlb3JnaWEsIE1pY2hpZ2FuIGFuZCBOZXcgSmVyc2V5IGFsbCBob2xkIG1vcmUgdGhhbiAzLDAwMCBtZXRyaWMgdG9ucy4KQXJpem9uYSwgQ29ubmVjdGljdXQsIFRleGFzIGFuZCBWaXJnaW5pYSBhbGwgaG9sZCBtb3JlIHRoYW4gMiwwMDAgbWV0cmljIHRvbnMuCkFya2Fuc2FzLCBMb3Vpc2lhbmEsIE1hcnlsYW5kLCBNaW5uZXNvdGEsIE1pc3Npc3NpcHBpLCBOZWJyYXNrYSwgT2hpbywgVGVubmVzc2VlIGFuZCBXaXNjb25zaW4gYWxsIGhvbGQgbW9yZSB0aGFuIDEsMDAwIG1ldHJpYyB0b25zLgpFbGV2ZW4gb3RoZXIgc3RhdGVzIHJhbmdlIGZyb20gdGhlIGxvdyBlbmQgb2YgMzAgbWV0cmljIHRvbnMgKENvbG9yYWRvKSB0byA3OTAgbWV0cmljIHRvbnMgKE1pc3NvdXJpKS4K4oCTUmljIEFuZGVyc29uIGFuZCBDaHJpcyBLdWRpYWxpcwpTaHV0dGVyc3RvY2sKUmFkaWF0aW9uIHNpZ24gbmV4dCB0byBSZWQgRm9yZXN0IGluIHRoZSBDaGVybm9ieWwgTnVjbGVhciBQb3dlciBQbGFudCBab25lIG9mIEFsaWVuYXRpb24sIFVrcmFpbmUuCldBUk5JTkcgU0lHTlMgRk9SIFRIRSBGVVRVUkUKT25lIGxpbmdlcmluZyBpc3N1ZSB3aXRoIFl1Y2NhIE1vdW50YWluIG9yIGFueSBvdGhlciBwZXJtYW5lbnQgcmVwb3NpdG9yeSBmb3IgbnVjbGVhciB3YXN0ZSBpcyBob3cgdG8gY29tbXVuaWNhdGUgd2hhdCBpdCBpcyB0byBmdXR1cmUgZ2VuZXJhdGlvbnMsIG1heWJlIDEwMCB5ZWFycyBmcm9tIG5vdywgbWF5YmUgMTAsMDAwLiBMaW5ndWlzdHMgaGF2ZSBhcmd1ZWQgb3ZlciBob3cgYmVzdCB0byBwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24uIFdoYXQgbWVzc2FnZSBjYW4gdHJhbnNjZW5kIEVuZ2xpc2ggYW5kIGxhc3QgZm9yIDEwLDAwMCB5ZWFycz8gSG93IGRvIHlvdSBjb252ZXkgdGhlIHVuc2VlbiB0aHJlYXQgb2YgcmFkaWF0aW9uPwpBYm91dCA0MCB5ZWFycyBhZ28sIHRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSBiZWdhbiB0YWNrbGluZyB0aGlzIHByb2JsZW0gd2l0aCBhIHBhbmVsIG9mIGV4cGVydHMga25vd24gYXMgdGhlIEh1bWFuIEludGVyZmVyZW5jZSBUYXNrIEZvcmNlLiBUaGV5IHByb3Bvc2VkIHVzaW5nIG1hcmtlcnMg4oCUIHRyaWFuZ3VsYXIgcHlyYW1pZHMgb2YgZ3Jhbml0ZSDigJQgd2l0aCB0aHJlZSBjZW50cmFsIG1hcmtlcnMgdGhhdCBjb250YWluZWQgc3ltYm9scyBhbmQgd3JpdGluZyBpbiBtdWx0aXBsZSBsYW5ndWFnZXMgdG8gY29udmV5IHRoZSBtZXNzYWdlIHRoYXQgbnVjbGVhciB3YXN0ZSBsYXkgdGhlcmUuIFRoZSBwYW5lbCBob3BlZCB0aGF0IHRoZSBzeW1ib2xzIGFuZCBtZXNzYWdlcyB3b3VsZCByZXNvbmF0ZSBiZWNhdXNlIHRoZXkgd291bGQgYmUgcGFzc2VkIGRvd24gdGhyb3VnaCBvcmFsIHRyYW5zbWlzc2lvbi4KV2hpbGUgdGhlIFl1Y2NhIE1vdW50YWluIHByb2plY3QgbGFuZ3Vpc2hlZCwgdGhlIGdvdmVybm1lbnQgZnVuZGVkIGEgc2Vjb25kIHN0dWR5IG9mIG51Y2xlYXIgc2VtaW90aWNzIGluIDE5OTIuIEluIGEgcmVwb3J0IHByZXBhcmVkIGJ5IHRoZSBTYW5kaWEgTmF0aW9uYWwgTGFib3JhdG9yeSwgYW5vdGhlciBwYW5lbCBvZiBleHBlcnRzIGNvbnZlbmVkIHRvIHN1Z2dlc3QgaG93IHRvIG1hcmsgdGhlIFdhc3RlIElzb2xhdGlvbiBQaWxvdCBQcm9qZWN0IGluIE5ldyBNZXhpY28uIFRoZSBtZXNzYWdlIHNob3VsZCBjb25ub3RlIHZpc3VhbCBhbmQgdmVyYmFsIG1lc3NhZ2VzLCB0aGV5IGNvbmNsdWRlZC4KRmlyc3QsIG9taW5vdXMgZWFydGh3b3JrcyB3b3VsZCBiZSBsYWlkIG91dCBpbiBhcmVhcyB0byBkZW1hcmNhdGUgdGhlIHNpdGUuIE9uZSBkZXNpZ24gdGhleSBzdWdnZXN0ZWQgd2FzIGEgZmllbGQgb2YgbWV0YWwgc3Bpa2VzLiBBbm90aGVyIHN1Z2dlc3RlZCBkZXNpZ24gaW5jbHVkZWQgZGFnZ2VyLXNoYXBlZCBlYXJ0aHdvcmtzLiBUaGVzZSBiZXJtcyB3aWxsIGd1aWRlIHZpc2l0b3JzIHRvIGEgbWVzc2FnZSBhcmVhIHRoYXQgY29tbXVuaWNhdGVzIG1lc3NhZ2VzIGJvdGggbGluZ3Vpc3RpY2FsbHkgYW5kIG5vbi1saW5ndWlzdGljYWxseS4gUnVkaW1lbnRhcnkgaW5mb3JtYXRpb24gd291bGQgYmUgc2hvd24gdGhyb3VnaCBmYWNlcyBpbmRpY2F0aW5nIGhvcnJvciwgc3VjaCBhcyB0aGUgaGF1bnRpbmcgZmlndXJlIGluIEVkdmFyZCBNdW5jaOKAmXMg4oCcVGhlIFNjcmVhbS7igJ0gVGhhdCB3b3VsZCBiZSBhY2NvbXBhbmllZCBieSB3cml0dGVuIHdvcmRzIHRoYXQgdGhlIHBhbmVsIGhvcGVkIHdvdWxkIGNvbnZleSB0aGlzOiDigJxUaGlzIHBsYWNlIGlzIGEgbWVzc2FnZSDigKYgYW5kIHBhcnQgb2YgYSBzeXN0ZW0gb2YgbWVzc2FnZXMg4oCmIHBheSBhdHRlbnRpb24gdG8gaXQhIFNlbmRpbmcgdGhpcyBtZXNzYWdlIHdhcyBpbXBvcnRhbnQgdG8gdXMuIFdlIGNvbnNpZGVyZWQgb3Vyc2VsdmVzIHRvIGJlIGEgcG93ZXJmdWwgY3VsdHVyZS4gVGhpcyBwbGFjZSBpcyBub3QgYSBwbGFjZSBvZiBob25vciAuLi4gbm8gaGlnaGx5IGVzdGVlbWVkIGRlZWQgaXMgY29tbWVtb3JhdGVkIGhlcmUgLi4uIG5vdGhpbmcgdmFsdWVkIGlzIGhlcmUu4oCdCuKAk0RhbmllbCBSb3RoYmVyZw==

Big Names Pull Cash from V.C. Fund Over Political Contributions - The New York Times
September 12, 2006
https://dealbook.nytimes.com/2006/09/12/big-names-pull-cash-from-venture-capital-fund-over-political-contributions
VGhlIE5ldyBZb3JrIFRpbWVzCkRlYWxCb29rIHwgQmlnIE5hbWVzIFB1bGwgQ2FzaCBmcm9tIFYuQy4gRnVuZCBPdmVyIFBvbGl0aWNhbCBDb250cmlidXRpb25zClNlYXJjaApCaWcgTmFtZXMgUHVsbCBDYXNoIGZyb20gVi5DLiBGdW5kIE92ZXIgUG9saXRpY2FsIENvbnRyaWJ1dGlvbnMKQnkgd3JpdGVyClNlcHRlbWJlciAxMiwgMjAwNiA3OjQyIGFtClNlcHRlbWJlciAxMiwgMjAwNiA3OjQyIGFtCkEgdmVudHVyZSBjYXBpdGFsIGZ1bmQgYmFzZWQgaW4gQ2VudHVyeSBDaXR5LCBDYWxpZi4sIGJhY2tlZCBieSB0aGUgbGlrZXMgb2YgSGFydmFyZCwgQm9laW5nIGFuZCBvdGhlciBiaWctbGVhZ3VlIGludmVzdG9ycywgYW5kIGNvbnN1bHRpbmcgd2l0aCBzdWNoIGRpc3BhcmF0ZSBhZHZpc2VycyBhcyB0aGUgQ29sdW1iaWEgVW5pdmVyc2l0eSBidXNpbmVzcyBzY2hvb2wgZGVhbiBhbmQgS0lTUyBzaW5nZXIgR2VuZSBTaW1tb25zLCBoYXMgcnVuIGludG8gdHJvdWJsZSBvdmVyIGFsbGVnYXRpb25zIHRoYXQgaXRzIGZvdW5kZXJzIHNvbGljaXRlZCBwb2xpdGljYWwgY29udHJpYnV0aW9ucyBmb3JtIHRoZWlyIHN0YXJ0LXVwcy4KQ2FsbGluZyB0aGVtc2VsdmVzIEludGVybmF0aW9uYWwgVGVjaG5vbG9neSBVbml2ZXJzaXR5LCB0aGUgc25lYWtlci1jbGFkIHBhcnRuZXJzIHNjb3VyZWQgdG9wIGVuZ2luZWVyaW5nIHNjaG9vbHMsIHNlZWtpbmcgbmV3IHRlY2hub2xvZ2llcyB0byB0dXJuIGludG8gcHJvZml0YWJsZSBidXNpbmVzc2VzLiBBbmQgb3ZlciB0aGUgbGFzdCBzaXggeWVhcnMsIHRoZSBkdW8gcGVyc3VhZGVkIGludmVzdG9ycyB0byBlbnRydXN0IHRoZW0gd2l0aCAkMjUwIG1pbGxpb24gdG8gdXNlIGFzIHNlZWQgbW9uZXkuClRoZSB0d28gZnVuZGVkIDM2IHN0YXJ0LXVwcywgc2V2ZXJhbCBvZiB3aGljaCB0dXJuZWQgaGVhbHRoeSBwcm9maXRzLiBCdXQgbGFzdCBtb250aCwgdGhlaXIgZm9ydHVuZXMgdHVybmVkLiBUaGVpciBtb3N0IHByZXN0aWdpb3VzIGludmVzdG9ycywgSGFydmFyZCBVbml2ZXJzaXR5IGFuZCBwdWJsaWMgcGVuc2lvbiBmdW5kcyBpbiBDYWxpZm9ybmlhLCBDb2xvcmFkbyBhbmQgTmV3IE1leGljbywgcHVsbGVkICQxMjAgbWlsbGlvbiBvdXQgb2YgdGhlIGZpcm0sIGN1dHRpbmcgb2ZmIG11Y2ggb2YgdGhlIGNvbXBhbnnigJlzIGNhc2ggc3VwcGx5LgpUaGUgaW52ZXN0b3JzIHNhaWQgdGhleSB3ZXJlIHRyb3VibGVkIHRoYXQgdGhlIHR3byBwYXJ0bmVycywgQ2hhZCBCcm93bnN0ZWluIGFuZCBKb25haCBTY2huZWwsIHNvbGljaXRlZCBwb2xpdGljYWwgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBmbGVkZ2xpbmcgZmlybXMgdGhleSBmaW5hbmNlZCwgYW5kIHNldmVyYWwgb2JsaWdlZC4=

func (*Document) Content added in v0.1.3

func (doc *Document) Content() string

func (*Document) HasTitle added in v0.3.0

func (doc *Document) HasTitle() bool

HasTitle returns true if the document date is not the zero time.Time value.

func (*Document) Text added in v0.1.3

func (doc *Document) Text(includeContent, includeNonContent bool) string

type Filter added in v0.2.0

type Filter interface {
	// Name returns the name of the filter.
	Name() string

	// Process processes the document and notifies if it has been changed.
	Process(doc *Document) (hasChanged bool)
}

Filter is the interface that processes documents and notifies if it has changed.

func BlockProximityFusionMaxDistanceOne added in v0.2.0

func BlockProximityFusionMaxDistanceOne() Filter

func BlockProximityFusionMaxDistanceOneContentOnly added in v0.2.0

func BlockProximityFusionMaxDistanceOneContentOnly() Filter

func BlockProximityFusionMaxDistanceOneContentOnlySameTagLevel added in v0.2.0

func BlockProximityFusionMaxDistanceOneContentOnlySameTagLevel() Filter

func BlockProximityFusionMaxDistanceOneSameTagLevel added in v0.2.0

func BlockProximityFusionMaxDistanceOneSameTagLevel() Filter

func BoilerplateBlock added in v0.2.0

func BoilerplateBlock() Filter

func DocumentTitleMatchClassifier added in v0.2.0

func DocumentTitleMatchClassifier() Filter

func ExpandTitleToContent added in v0.2.0

func ExpandTitleToContent() Filter

func IgnoreBlocksAfterContent added in v0.2.0

func IgnoreBlocksAfterContent() Filter

func KeepLargestBlocks added in v0.2.0

func KeepLargestBlocks() Filter

func KeepLargestFulltextBlock added in v0.2.0

func KeepLargestFulltextBlock() Filter

func LargeBlockSameTagLevelToContent added in v0.2.0

func LargeBlockSameTagLevelToContent() Filter

func ListAtEnd added in v0.2.0

func ListAtEnd() Filter

func NumWordsRulesClassifier added in v0.2.0

func NumWordsRulesClassifier() Filter

func TerminatingBlocks added in v0.2.0

func TerminatingBlocks() Filter

func TrailingHeadlineToBoilerplate added in v0.2.0

func TrailingHeadlineToBoilerplate() Filter

type Label

type Label int
const (
	LabelIndicatesEndOfText Label = iota
	LabelMightBeContent
	LabelVeryLikelyContent
	LabelTitle
	LabelList
	LabelHeading
	LabelHeading1
	LabelHeading2
	LabelHeading3
)

func (Label) String added in v0.3.0

func (i Label) String() string

type LabelStack added in v0.3.0

type LabelStack struct {
	// contains filtered or unexported fields
}

func NewLabelStack added in v0.3.0

func NewLabelStack() *LabelStack

func (*LabelStack) Len added in v0.3.0

func (x *LabelStack) Len() int

func (*LabelStack) Pop added in v0.3.0

func (x *LabelStack) Pop() (label Label, ok bool)

func (*LabelStack) PopAll added in v0.3.0

func (x *LabelStack) PopAll() (labels []Label)

func (*LabelStack) Push added in v0.3.0

func (x *LabelStack) Push(labels ...Label)

type Pipeline added in v0.2.0

type Pipeline struct {
	PipelineName string
	Filters      []Filter
}

A Pipeline is a collection of filters that itself satisfies the Filter interface.

func (*Pipeline) Name added in v0.2.0

func (pipeline *Pipeline) Name() string

Name returns the pipeline name.

func (*Pipeline) Process added in v0.2.0

func (pipeline *Pipeline) Process(doc *Document) (hasChanged bool)

Process runs a document through the collection of filters in the pipeline.

type TextBlock

type TextBlock struct {
	Text string

	OffsetBlocksStart int
	OffsetBlocksEnd   int

	NumWords               int
	NumLinkedWords         int
	NumWordsInWrappedLines int
	NumWrappedLines        int

	TagLevel int

	IsContent bool
	// contains filtered or unexported fields
}

func NewTextBlock

func NewTextBlock() (tb *TextBlock)

func (*TextBlock) AddLabels

func (tb *TextBlock) AddLabels(labels ...Label) *TextBlock

func (*TextBlock) HasLabel

func (tb *TextBlock) HasLabel(label Label) bool

func (*TextBlock) Labels

func (tb *TextBlock) Labels() (labels []Label)

func (*TextBlock) LinkDensity

func (tb *TextBlock) LinkDensity() float64

func (*TextBlock) MergeNext

func (tb *TextBlock) MergeNext(next *TextBlock)

func (*TextBlock) TextDensity

func (tb *TextBlock) TextDensity() float64

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL