Objectives
Upon completion of this lesson, you will be able to:
- define what prototyping is
Introduction
In the context of user interface (UI) design, prototyping refers to the creation of a preliminary version or a representation of a user interface design concept. A prototype is typically developed to demonstrate and test the functionality, layout, and interactions of a proposed UI before investing significant resources into its development.
Prototyping can take various forms, ranging from low-fidelity sketches or wireframes to high-fidelity interactive mockups or even fully functional prototypes. The level of fidelity depends on the purpose of the prototype and the stage of the design process.
Prototyping serves several important purposes in UI design:
Evaluating and refining design ideas: Prototypes allow designers to gather feedback from stakeholders, users, and team members early in the design process. By presenting an interactive representation of the UI, designers can assess the usability, clarity, and effectiveness of their design choices.
Testing and validating concepts: Prototypes enable designers to test specific interactions, user flows, or features to ensure they meet user needs and expectations. Usability testing with prototypes can uncover potential issues or areas for improvement before the actual development phase begins.
Communicating and aligning with stakeholders: Prototypes serve as a communication tool to convey design concepts and intentions to clients, developers, and other project stakeholders. They provide a tangible representation of the proposed UI design, making it easier for non-designers to understand and provide feedback.
Saving time and resources: By identifying potential design flaws or usability issues early on, prototypes help prevent costly and time-consuming revisions during the development stage. They allow designers to iterate and refine the UI design before the more significant investment of development resources.
Overall, prototyping in UI design helps bridge the gap between conceptualizing an interface and implementing it, facilitating collaboration, testing, and refinement throughout the design process.
Types of Prototypes
There are various prototyping methods in UI design, each with its own purpose and use. Here are some common prototype methods and their applications:
Paper Prototypes: Paper prototypes involve sketching or drawing UI screens and interactions on paper. This low-fidelity method is useful for early-stage ideation, quick iterations, and gathering feedback on basic concepts and layouts. Paper prototypes are cost-effective and allow for easy modifications.
Wireframes: Wireframes are low-fidelity, simplified representations of UI designs that focus on layout, structure, and content. They typically use basic shapes, lines, and placeholders to outline the UI elements. Wireframes are useful for visualizing information architecture, navigation, and content placement, and for early usability testing and feedback gathering.
Interactive Mockups: Interactive mockups are mid to high-fidelity prototypes that simulate the UI’s look and feel, including visual elements, colors, and basic interactions. Tools like Sketch, Figma, or Adobe XD are commonly used to create interactive mockups. These prototypes allow for more realistic user testing, feedback collection, and usability evaluation.
Clickable Prototypes: Clickable prototypes are interactive and functional representations of a UI that can be navigated and interacted with, usually created with specialized prototyping tools or through front-end development. Clickable prototypes simulate user flows, transitions, and specific interactions, providing a realistic user experience. They are valuable for usability testing, user feedback, and demonstrating complex interactions.
HTML/CSS Prototypes: HTML/CSS prototypes involve developing a partial or full UI using front-end technologies like HTML, CSS, and JavaScript. These prototypes are closer to the final product and offer a realistic user experience. They are helpful for testing responsive design, advanced interactivity, and front-end development feasibility.
Functional Prototypes: Functional prototypes are fully interactive and functional representations of a UI, often developed with programming languages and frameworks. These prototypes mimic the actual product’s behavior and allow for comprehensive testing of complex features and interactions. They are useful for evaluating technical feasibility, user testing, and providing a realistic experience to stakeholders.
It’s worth noting that the choice of prototype method depends on factors such as the project’s stage, goals, budget, and available resources. It’s common to use a combination of different prototyping methods throughout the design process, starting with low-fidelity options and gradually increasing fidelity as the design solidifies and progresses.
Wizard-of-Oz Technique
The “Wizard of Oz” technique is a prototyping method in which the appearance of an interactive system is simulated to users, while the system’s responses are actually controlled by a human operator behind the scenes. This method allows designers to test and gather user feedback on the user interface and user experience (UI/UX) without fully developing the actual automated system.
The name “Wizard of Oz” originates from the famous book and movie, where a character pretends to be a powerful wizard but is revealed to be an ordinary person operating hidden machinery. Similarly, in the prototyping context, the human operator takes on the role of the “wizard” who controls the system’s responses, while the user interacts with what appears to be an automated interface.
Here’s an overview of the steps involved in the “Wizard of Oz” technique:
Design the User Interface: Create the visual design and layout of the user interface that you want to test. This can be done using wireframing tools or even simple paper sketches.
Define User Scenarios: Identify specific tasks or scenarios that users will perform during the testing. Determine the inputs and expected system responses for each scenario.
Prepare the Wizard: The human operator (the “wizard”) needs to be trained on how to respond to user interactions based on predefined rules or scripts. This can involve prewritten responses, predefined decision trees, or guidelines for improvisation.
Conduct User Testing: Users interact with the user interface, believing that the system is fully automated. The “wizard” observes the user’s interactions and controls the system’s responses manually, following the predefined rules and guidelines.
Collect Feedback: During or after the testing session, gather feedback from users about their experience, thoughts, and any difficulties they encountered. This feedback can be in the form of interviews, surveys, or observation notes.
Iterate and Refine: Analyze the feedback received and use it to improve the user interface design. Make necessary adjustments to the design, interactions, or system responses based on the insights gained from user testing.
The “Wizard of Oz” technique is particularly useful when developing complex or intelligent systems that are not yet fully automated. It allows designers to test and validate the UI/UX aspects of the system before investing resources in full development. This method is often employed in the early stages of a project when the interface design is still evolving and requires user feedback to drive improvements.
By using the “Wizard of Oz” technique, designers can gain valuable insights into user interactions, understand usability issues, and refine their design direction, ultimately leading to a more user-centered and effective final product.
Wireframes
Wireframes are low-fidelity visual representations of a user interface (UI) design. They serve as a skeletal framework that outlines the structure, layout, and content of a digital product, without focusing on visual details such as colors, imagery, or typography. Wireframes are typically created using simple shapes, lines, and placeholders to convey the basic elements and hierarchy of a UI.
Wireframes play a crucial role in the prototyping process by providing a foundational blueprint for the UI design. They serve as a bridge between the initial conceptualization of an interface and the creation of more detailed prototypes or mockups. Here’s how wireframes fit into the prototyping process:
Conceptualization and Ideation: Wireframes are often used in the early stages of a project to explore and brainstorm UI ideas. They help designers and stakeholders visualize the overall structure and layout of the UI, enabling discussions about content placement, navigation, and functionality.
Information Architecture and User Flows: Wireframes help establish the information architecture of a UI by indicating how different elements and content will be organized and connected. They allow designers to map out user flows and interactions, ensuring logical and intuitive navigation within the interface.
Usability Testing and Feedback Gathering: Low-fidelity wireframes are useful for gathering early user feedback and conducting usability tests. By presenting a simplified representation of the UI, wireframes allow users to focus on the core functionality and interactions. Feedback obtained from wireframe testing can inform and guide further iterations of the design.
Communication and Collaboration: Wireframes serve as a communication tool between designers, stakeholders, and development teams. They provide a clear and concise representation of the UI structure, making it easier for non-designers to understand and provide input. Wireframes facilitate discussions, revisions, and alignment before investing significant time and resources in higher-fidelity prototypes.
Iterative Design Process: Wireframes are highly flexible and allow for quick iterations and modifications. They enable designers to explore multiple design alternatives, test different layouts, and refine the overall UI structure. As the design progresses, wireframes can be transformed into more detailed prototypes or visual mockups.
Handoff to Development: Wireframes act as a blueprint for the development team, providing them with a clear understanding of the UI structure and functionality. They serve as a reference for implementing the desired user experience and can facilitate a smoother transition from design to development.
Overall, wireframes are an essential component of the prototyping process, providing a foundational structure and guiding subsequent design iterations. They help designers communicate and validate their ideas, gather early user feedback, and set the stage for creating more detailed and interactive prototypes.
Why do Wireframes look so bland?
Wireframes should have an intentional low-fidelity look and feel to them. There are good reasons for that:
Wireframes clearly indicate the preliminary nature of the design
Wireframes serve as an unmistakable representation of an early-stage design, ensuring that it is not misconstrued as the final version of the application. Their low-fidelity nature, devoid of intricate details and limited color usage, directs attention towards the structural aspects. The focus at this stage lies on establishing the design’s framework before delving into visual design elements, which will receive attention in subsequent phases.
Wireframes foster an environment for constructive discussion
The rough nature of wireframes encourages open and fruitful discussions. It creates an atmosphere where feedback and critique are welcomed, as wireframes are perceived as a work in progress. Due to their quick production, stakeholders are encouraged to provide their input freely. Each wireframe screen typically requires only a few minutes to create, allowing for iterations without concerns about starting from scratch. The ultimate objective at this juncture is to optimize usability, making iterative revisions a normal and anticipated part of the design process.
Wireframes provide a clear indication that no code implementation has taken place
Presenting wireframes to customers or stakeholders instead of finalized app screenshots eliminates any misconceptions that the depicted screens represent a functioning application. The absence of detailed visual elements and the wireframe format effectively communicate that no code has been written yet. Wireframes effectively mitigate the risk of premature assumptions regarding the development progress and ensure focus remains on refining the design before implementation.
Lecture
The lecture below by Dr. Schedlbauer summarizes the key concepts of prototyping.
Slide Deck: S-91-410 Prototyping
Summary
In this lesson, we explored the concept of prototyping in the context of user interface (UI) design. Prototyping is the process of creating preliminary versions or representations of UI designs to evaluate, test, and refine them before actual development.
We learned that prototypes can take various forms, from low-fidelity sketches and wireframes to high-fidelity interactive mockups or functional prototypes. The level of fidelity depends on the purpose and stage of the design process.
The lesson highlighted the key purposes of prototyping in UI design. Prototypes serve as a tool for evaluating and refining design ideas, allowing designers to gather feedback and assess usability. They also help in testing and validating concepts, identifying potential issues or areas for improvement early on.
We discussed how prototypes play a crucial role in communicating and aligning with stakeholders. They provide a tangible representation of the proposed UI design, facilitating understanding and feedback from clients, developers, and other project stakeholders.
Furthermore, we explored how prototyping saves time and resources by uncovering design flaws and usability issues early in the process. This helps prevent costly revisions during development and enables designers to iterate and refine the UI design before committing significant resources.
In conclusion, prototyping is a vital step in UI design that bridges the gap between conceptualization and implementation. It allows designers to gather feedback, test interactions, communicate effectively, and optimize their designs, ultimately resulting in more user-friendly and successful user interfaces.
LS0tCnRpdGxlOiAiUHJvdG90eXBpbmcgVXNlciBJbnRlcmZhY2VzIgpwYXJhbXM6CiAgdHlwZTogbGVzc29uCiAgY2F0ZWdvcnk6IDkxCiAgc3RhY2tzOiAiMCwwIgogIG51bWJlcjogNDEwCiAgdGltZTogMzAKICBsZXZlbDogYmVnaW5uZXIKICB0YWdzOiBwcm90b3R5cGluZyxoaWdoIGZpZGVsaXR5LHV4LGRlc2lnbgogIGRlc2NyaXB0aW9uOiAiUHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgcHJvdG90eXBpbmcgZm9yIHVzZXIgaW50ZXJmYWNlIGRlc2lnbi4iCmRhdGU6ICI8c21hbGw+YHIgU3lzLkRhdGUoKWA8L3NtYWxsPiIKYXV0aG9yOiAiPHNtYWxsPk1hcnRpbiBTY2hlZGxiYXVlcjwvc21hbGw+IgplbWFpbDogIm0uc2NoZWRsYmF1ZXJAbmV1LmVkdSIKYWZmaWxpdGF0aW9uOiAiTm9ydGhlYXN0ZXJuIFVuaXZlcnNpdHkiCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBzcGFjZWxhYgogICAgaGlnaGxpZ2h0OiB0YW5nbwotLS0KCi0tLQp0aXRsZTogIjxzbWFsbD5gciBwYXJhbXMkY2F0ZWdvcnlgLmByIHBhcmFtcyRudW1iZXJgPC9zbWFsbD48YnIvPjxzcGFuIHN0eWxlPSdjb2xvcjogIzJFNDA1MzsgZm9udC1zaXplOiAwLjllbSc+YHIgcm1hcmtkb3duOjptZXRhZGF0YSR0aXRsZWA8L3NwYW4+IgotLS0KCmBgYHtyIGNvZGU9eGZ1bjo6cmVhZF91dGY4KHBhc3RlMChoZXJlOjpoZXJlKCksJy9SL19pbnNlcnQyREIuUicpKSwgaW5jbHVkZSA9IEZBTFNFfQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgT2JqZWN0aXZlcwoKVXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgbGVzc29uLCB5b3Ugd2lsbCBiZSBhYmxlIHRvOgoKLSAgIGRlZmluZSB3aGF0IHByb3RvdHlwaW5nIGlzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEludHJvZHVjdGlvbiB7I2ludHJvfQoKSW4gdGhlIGNvbnRleHQgb2YgdXNlciBpbnRlcmZhY2UgKFVJKSBkZXNpZ24sIHByb3RvdHlwaW5nIHJlZmVycyB0byB0aGUgY3JlYXRpb24gb2YgYSBwcmVsaW1pbmFyeSB2ZXJzaW9uIG9yIGEgcmVwcmVzZW50YXRpb24gb2YgYSB1c2VyIGludGVyZmFjZSBkZXNpZ24gY29uY2VwdC4gQSBwcm90b3R5cGUgaXMgdHlwaWNhbGx5IGRldmVsb3BlZCB0byBkZW1vbnN0cmF0ZSBhbmQgdGVzdCB0aGUgZnVuY3Rpb25hbGl0eSwgbGF5b3V0LCBhbmQgaW50ZXJhY3Rpb25zIG9mIGEgcHJvcG9zZWQgVUkgYmVmb3JlIGludmVzdGluZyBzaWduaWZpY2FudCByZXNvdXJjZXMgaW50byBpdHMgZGV2ZWxvcG1lbnQuCgpQcm90b3R5cGluZyBjYW4gdGFrZSB2YXJpb3VzIGZvcm1zLCByYW5naW5nIGZyb20gbG93LWZpZGVsaXR5IHNrZXRjaGVzIG9yIHdpcmVmcmFtZXMgdG8gaGlnaC1maWRlbGl0eSBpbnRlcmFjdGl2ZSBtb2NrdXBzIG9yIGV2ZW4gZnVsbHkgZnVuY3Rpb25hbCBwcm90b3R5cGVzLiBUaGUgbGV2ZWwgb2YgZmlkZWxpdHkgZGVwZW5kcyBvbiB0aGUgcHVycG9zZSBvZiB0aGUgcHJvdG90eXBlIGFuZCB0aGUgc3RhZ2Ugb2YgdGhlIGRlc2lnbiBwcm9jZXNzLgoKUHJvdG90eXBpbmcgc2VydmVzIHNldmVyYWwgaW1wb3J0YW50IHB1cnBvc2VzIGluIFVJIGRlc2lnbjoKCjEuICAqKkV2YWx1YXRpbmcgYW5kIHJlZmluaW5nIGRlc2lnbiBpZGVhcyoqOiBQcm90b3R5cGVzIGFsbG93IGRlc2lnbmVycyB0byBnYXRoZXIgZmVlZGJhY2sgZnJvbSBzdGFrZWhvbGRlcnMsIHVzZXJzLCBhbmQgdGVhbSBtZW1iZXJzIGVhcmx5IGluIHRoZSBkZXNpZ24gcHJvY2Vzcy4gQnkgcHJlc2VudGluZyBhbiBpbnRlcmFjdGl2ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgVUksIGRlc2lnbmVycyBjYW4gYXNzZXNzIHRoZSB1c2FiaWxpdHksIGNsYXJpdHksIGFuZCBlZmZlY3RpdmVuZXNzIG9mIHRoZWlyIGRlc2lnbiBjaG9pY2VzLgoKMi4gICoqVGVzdGluZyBhbmQgdmFsaWRhdGluZyBjb25jZXB0cyoqOiBQcm90b3R5cGVzIGVuYWJsZSBkZXNpZ25lcnMgdG8gdGVzdCBzcGVjaWZpYyBpbnRlcmFjdGlvbnMsIHVzZXIgZmxvd3MsIG9yIGZlYXR1cmVzIHRvIGVuc3VyZSB0aGV5IG1lZXQgdXNlciBuZWVkcyBhbmQgZXhwZWN0YXRpb25zLiBVc2FiaWxpdHkgdGVzdGluZyB3aXRoIHByb3RvdHlwZXMgY2FuIHVuY292ZXIgcG90ZW50aWFsIGlzc3VlcyBvciBhcmVhcyBmb3IgaW1wcm92ZW1lbnQgYmVmb3JlIHRoZSBhY3R1YWwgZGV2ZWxvcG1lbnQgcGhhc2UgYmVnaW5zLgoKMy4gICoqQ29tbXVuaWNhdGluZyBhbmQgYWxpZ25pbmcgd2l0aCBzdGFrZWhvbGRlcnMqKjogUHJvdG90eXBlcyBzZXJ2ZSBhcyBhIGNvbW11bmljYXRpb24gdG9vbCB0byBjb252ZXkgZGVzaWduIGNvbmNlcHRzIGFuZCBpbnRlbnRpb25zIHRvIGNsaWVudHMsIGRldmVsb3BlcnMsIGFuZCBvdGhlciBwcm9qZWN0IHN0YWtlaG9sZGVycy4gVGhleSBwcm92aWRlIGEgdGFuZ2libGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3Bvc2VkIFVJIGRlc2lnbiwgbWFraW5nIGl0IGVhc2llciBmb3Igbm9uLWRlc2lnbmVycyB0byB1bmRlcnN0YW5kIGFuZCBwcm92aWRlIGZlZWRiYWNrLgoKNC4gICoqU2F2aW5nIHRpbWUgYW5kIHJlc291cmNlcyoqOiBCeSBpZGVudGlmeWluZyBwb3RlbnRpYWwgZGVzaWduIGZsYXdzIG9yIHVzYWJpbGl0eSBpc3N1ZXMgZWFybHkgb24sIHByb3RvdHlwZXMgaGVscCBwcmV2ZW50IGNvc3RseSBhbmQgdGltZS1jb25zdW1pbmcgcmV2aXNpb25zIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgc3RhZ2UuIFRoZXkgYWxsb3cgZGVzaWduZXJzIHRvIGl0ZXJhdGUgYW5kIHJlZmluZSB0aGUgVUkgZGVzaWduIGJlZm9yZSB0aGUgbW9yZSBzaWduaWZpY2FudCBpbnZlc3RtZW50IG9mIGRldmVsb3BtZW50IHJlc291cmNlcy4KCk92ZXJhbGwsIHByb3RvdHlwaW5nIGluIFVJIGRlc2lnbiBoZWxwcyBicmlkZ2UgdGhlIGdhcCBiZXR3ZWVuIGNvbmNlcHR1YWxpemluZyBhbiBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGluZyBpdCwgZmFjaWxpdGF0aW5nIGNvbGxhYm9yYXRpb24sIHRlc3RpbmcsIGFuZCByZWZpbmVtZW50IHRocm91Z2hvdXQgdGhlIGRlc2lnbiBwcm9jZXNzLgoKIyMgVHlwZXMgb2YgUHJvdG90eXBlcwoKVGhlcmUgYXJlIHZhcmlvdXMgcHJvdG90eXBpbmcgbWV0aG9kcyBpbiBVSSBkZXNpZ24sIGVhY2ggd2l0aCBpdHMgb3duIHB1cnBvc2UgYW5kIHVzZS4gSGVyZSBhcmUgc29tZSBjb21tb24gcHJvdG90eXBlIG1ldGhvZHMgYW5kIHRoZWlyIGFwcGxpY2F0aW9uczoKCjEuICAqKlBhcGVyIFByb3RvdHlwZXMqKjogUGFwZXIgcHJvdG90eXBlcyBpbnZvbHZlIHNrZXRjaGluZyBvciBkcmF3aW5nIFVJIHNjcmVlbnMgYW5kIGludGVyYWN0aW9ucyBvbiBwYXBlci4gVGhpcyBsb3ctZmlkZWxpdHkgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgZWFybHktc3RhZ2UgaWRlYXRpb24sIHF1aWNrIGl0ZXJhdGlvbnMsIGFuZCBnYXRoZXJpbmcgZmVlZGJhY2sgb24gYmFzaWMgY29uY2VwdHMgYW5kIGxheW91dHMuIFBhcGVyIHByb3RvdHlwZXMgYXJlIGNvc3QtZWZmZWN0aXZlIGFuZCBhbGxvdyBmb3IgZWFzeSBtb2RpZmljYXRpb25zLgoKMi4gICoqV2lyZWZyYW1lcyoqOiBXaXJlZnJhbWVzIGFyZSBsb3ctZmlkZWxpdHksIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb25zIG9mIFVJIGRlc2lnbnMgdGhhdCBmb2N1cyBvbiBsYXlvdXQsIHN0cnVjdHVyZSwgYW5kIGNvbnRlbnQuIFRoZXkgdHlwaWNhbGx5IHVzZSBiYXNpYyBzaGFwZXMsIGxpbmVzLCBhbmQgcGxhY2Vob2xkZXJzIHRvIG91dGxpbmUgdGhlIFVJIGVsZW1lbnRzLiBXaXJlZnJhbWVzIGFyZSB1c2VmdWwgZm9yIHZpc3VhbGl6aW5nIGluZm9ybWF0aW9uIGFyY2hpdGVjdHVyZSwgbmF2aWdhdGlvbiwgYW5kIGNvbnRlbnQgcGxhY2VtZW50LCBhbmQgZm9yIGVhcmx5IHVzYWJpbGl0eSB0ZXN0aW5nIGFuZCBmZWVkYmFjayBnYXRoZXJpbmcuCgozLiAgKipJbnRlcmFjdGl2ZSBNb2NrdXBzKio6IEludGVyYWN0aXZlIG1vY2t1cHMgYXJlIG1pZCB0byBoaWdoLWZpZGVsaXR5IHByb3RvdHlwZXMgdGhhdCBzaW11bGF0ZSB0aGUgVUkncyBsb29rIGFuZCBmZWVsLCBpbmNsdWRpbmcgdmlzdWFsIGVsZW1lbnRzLCBjb2xvcnMsIGFuZCBiYXNpYyBpbnRlcmFjdGlvbnMuIFRvb2xzIGxpa2UgU2tldGNoLCBGaWdtYSwgb3IgQWRvYmUgWEQgYXJlIGNvbW1vbmx5IHVzZWQgdG8gY3JlYXRlIGludGVyYWN0aXZlIG1vY2t1cHMuIFRoZXNlIHByb3RvdHlwZXMgYWxsb3cgZm9yIG1vcmUgcmVhbGlzdGljIHVzZXIgdGVzdGluZywgZmVlZGJhY2sgY29sbGVjdGlvbiwgYW5kIHVzYWJpbGl0eSBldmFsdWF0aW9uLgoKNC4gICoqQ2xpY2thYmxlIFByb3RvdHlwZXMqKjogQ2xpY2thYmxlIHByb3RvdHlwZXMgYXJlIGludGVyYWN0aXZlIGFuZCBmdW5jdGlvbmFsIHJlcHJlc2VudGF0aW9ucyBvZiBhIFVJIHRoYXQgY2FuIGJlIG5hdmlnYXRlZCBhbmQgaW50ZXJhY3RlZCB3aXRoLCB1c3VhbGx5IGNyZWF0ZWQgd2l0aCBzcGVjaWFsaXplZCBwcm90b3R5cGluZyB0b29scyBvciB0aHJvdWdoIGZyb250LWVuZCBkZXZlbG9wbWVudC4gQ2xpY2thYmxlIHByb3RvdHlwZXMgc2ltdWxhdGUgdXNlciBmbG93cywgdHJhbnNpdGlvbnMsIGFuZCBzcGVjaWZpYyBpbnRlcmFjdGlvbnMsIHByb3ZpZGluZyBhIHJlYWxpc3RpYyB1c2VyIGV4cGVyaWVuY2UuIFRoZXkgYXJlIHZhbHVhYmxlIGZvciB1c2FiaWxpdHkgdGVzdGluZywgdXNlciBmZWVkYmFjaywgYW5kIGRlbW9uc3RyYXRpbmcgY29tcGxleCBpbnRlcmFjdGlvbnMuCgo1LiAgKipIVE1ML0NTUyBQcm90b3R5cGVzKio6IEhUTUwvQ1NTIHByb3RvdHlwZXMgaW52b2x2ZSBkZXZlbG9waW5nIGEgcGFydGlhbCBvciBmdWxsIFVJIHVzaW5nIGZyb250LWVuZCB0ZWNobm9sb2dpZXMgbGlrZSBIVE1MLCBDU1MsIGFuZCBKYXZhU2NyaXB0LiBUaGVzZSBwcm90b3R5cGVzIGFyZSBjbG9zZXIgdG8gdGhlIGZpbmFsIHByb2R1Y3QgYW5kIG9mZmVyIGEgcmVhbGlzdGljIHVzZXIgZXhwZXJpZW5jZS4gVGhleSBhcmUgaGVscGZ1bCBmb3IgdGVzdGluZyByZXNwb25zaXZlIGRlc2lnbiwgYWR2YW5jZWQgaW50ZXJhY3Rpdml0eSwgYW5kIGZyb250LWVuZCBkZXZlbG9wbWVudCBmZWFzaWJpbGl0eS4KCjYuICAqKkZ1bmN0aW9uYWwgUHJvdG90eXBlcyoqOiBGdW5jdGlvbmFsIHByb3RvdHlwZXMgYXJlIGZ1bGx5IGludGVyYWN0aXZlIGFuZCBmdW5jdGlvbmFsIHJlcHJlc2VudGF0aW9ucyBvZiBhIFVJLCBvZnRlbiBkZXZlbG9wZWQgd2l0aCBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYW5kIGZyYW1ld29ya3MuIFRoZXNlIHByb3RvdHlwZXMgbWltaWMgdGhlIGFjdHVhbCBwcm9kdWN0J3MgYmVoYXZpb3IgYW5kIGFsbG93IGZvciBjb21wcmVoZW5zaXZlIHRlc3Rpbmcgb2YgY29tcGxleCBmZWF0dXJlcyBhbmQgaW50ZXJhY3Rpb25zLiBUaGV5IGFyZSB1c2VmdWwgZm9yIGV2YWx1YXRpbmcgdGVjaG5pY2FsIGZlYXNpYmlsaXR5LCB1c2VyIHRlc3RpbmcsIGFuZCBwcm92aWRpbmcgYSByZWFsaXN0aWMgZXhwZXJpZW5jZSB0byBzdGFrZWhvbGRlcnMuCgpJdCdzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBjaG9pY2Ugb2YgcHJvdG90eXBlIG1ldGhvZCBkZXBlbmRzIG9uIGZhY3RvcnMgc3VjaCBhcyB0aGUgcHJvamVjdCdzIHN0YWdlLCBnb2FscywgYnVkZ2V0LCBhbmQgYXZhaWxhYmxlIHJlc291cmNlcy4gSXQncyBjb21tb24gdG8gdXNlIGEgY29tYmluYXRpb24gb2YgZGlmZmVyZW50IHByb3RvdHlwaW5nIG1ldGhvZHMgdGhyb3VnaG91dCB0aGUgZGVzaWduIHByb2Nlc3MsIHN0YXJ0aW5nIHdpdGggbG93LWZpZGVsaXR5IG9wdGlvbnMgYW5kIGdyYWR1YWxseSBpbmNyZWFzaW5nIGZpZGVsaXR5IGFzIHRoZSBkZXNpZ24gc29saWRpZmllcyBhbmQgcHJvZ3Jlc3Nlcy4KCiMjIFdpemFyZC1vZi1PeiBUZWNobmlxdWUKClRoZSAiV2l6YXJkIG9mIE96IiB0ZWNobmlxdWUgaXMgYSBwcm90b3R5cGluZyBtZXRob2QgaW4gd2hpY2ggdGhlIGFwcGVhcmFuY2Ugb2YgYW4gaW50ZXJhY3RpdmUgc3lzdGVtIGlzIHNpbXVsYXRlZCB0byB1c2Vycywgd2hpbGUgdGhlIHN5c3RlbSdzIHJlc3BvbnNlcyBhcmUgYWN0dWFsbHkgY29udHJvbGxlZCBieSBhIGh1bWFuIG9wZXJhdG9yIGJlaGluZCB0aGUgc2NlbmVzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZGVzaWduZXJzIHRvIHRlc3QgYW5kIGdhdGhlciB1c2VyIGZlZWRiYWNrIG9uIHRoZSB1c2VyIGludGVyZmFjZSBhbmQgdXNlciBleHBlcmllbmNlIChVSS9VWCkgd2l0aG91dCBmdWxseSBkZXZlbG9waW5nIHRoZSBhY3R1YWwgYXV0b21hdGVkIHN5c3RlbS4KClRoZSBuYW1lICJXaXphcmQgb2YgT3oiIG9yaWdpbmF0ZXMgZnJvbSB0aGUgZmFtb3VzIGJvb2sgYW5kIG1vdmllLCB3aGVyZSBhIGNoYXJhY3RlciBwcmV0ZW5kcyB0byBiZSBhIHBvd2VyZnVsIHdpemFyZCBidXQgaXMgcmV2ZWFsZWQgdG8gYmUgYW4gb3JkaW5hcnkgcGVyc29uIG9wZXJhdGluZyBoaWRkZW4gbWFjaGluZXJ5LiBTaW1pbGFybHksIGluIHRoZSBwcm90b3R5cGluZyBjb250ZXh0LCB0aGUgaHVtYW4gb3BlcmF0b3IgdGFrZXMgb24gdGhlIHJvbGUgb2YgdGhlICJ3aXphcmQiIHdobyBjb250cm9scyB0aGUgc3lzdGVtJ3MgcmVzcG9uc2VzLCB3aGlsZSB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCB3aGF0IGFwcGVhcnMgdG8gYmUgYW4gYXV0b21hdGVkIGludGVyZmFjZS4KCkhlcmUncyBhbiBvdmVydmlldyBvZiB0aGUgc3RlcHMgaW52b2x2ZWQgaW4gdGhlICJXaXphcmQgb2YgT3oiIHRlY2huaXF1ZToKCjEuICAqKkRlc2lnbiB0aGUgVXNlciBJbnRlcmZhY2UqKjogQ3JlYXRlIHRoZSB2aXN1YWwgZGVzaWduIGFuZCBsYXlvdXQgb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgeW91IHdhbnQgdG8gdGVzdC4gVGhpcyBjYW4gYmUgZG9uZSB1c2luZyB3aXJlZnJhbWluZyB0b29scyBvciBldmVuIHNpbXBsZSBwYXBlciBza2V0Y2hlcy4KCjIuICAqKkRlZmluZSBVc2VyIFNjZW5hcmlvcyoqOiBJZGVudGlmeSBzcGVjaWZpYyB0YXNrcyBvciBzY2VuYXJpb3MgdGhhdCB1c2VycyB3aWxsIHBlcmZvcm0gZHVyaW5nIHRoZSB0ZXN0aW5nLiBEZXRlcm1pbmUgdGhlIGlucHV0cyBhbmQgZXhwZWN0ZWQgc3lzdGVtIHJlc3BvbnNlcyBmb3IgZWFjaCBzY2VuYXJpby4KCjMuICAqKlByZXBhcmUgdGhlIFdpemFyZCoqOiBUaGUgaHVtYW4gb3BlcmF0b3IgKHRoZSAid2l6YXJkIikgbmVlZHMgdG8gYmUgdHJhaW5lZCBvbiBob3cgdG8gcmVzcG9uZCB0byB1c2VyIGludGVyYWN0aW9ucyBiYXNlZCBvbiBwcmVkZWZpbmVkIHJ1bGVzIG9yIHNjcmlwdHMuIFRoaXMgY2FuIGludm9sdmUgcHJld3JpdHRlbiByZXNwb25zZXMsIHByZWRlZmluZWQgZGVjaXNpb24gdHJlZXMsIG9yIGd1aWRlbGluZXMgZm9yIGltcHJvdmlzYXRpb24uCgo0LiAgKipDb25kdWN0IFVzZXIgVGVzdGluZyoqOiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyIGludGVyZmFjZSwgYmVsaWV2aW5nIHRoYXQgdGhlIHN5c3RlbSBpcyBmdWxseSBhdXRvbWF0ZWQuIFRoZSAid2l6YXJkIiBvYnNlcnZlcyB0aGUgdXNlcidzIGludGVyYWN0aW9ucyBhbmQgY29udHJvbHMgdGhlIHN5c3RlbSdzIHJlc3BvbnNlcyBtYW51YWxseSwgZm9sbG93aW5nIHRoZSBwcmVkZWZpbmVkIHJ1bGVzIGFuZCBndWlkZWxpbmVzLgoKNS4gICoqQ29sbGVjdCBGZWVkYmFjayoqOiBEdXJpbmcgb3IgYWZ0ZXIgdGhlIHRlc3Rpbmcgc2Vzc2lvbiwgZ2F0aGVyIGZlZWRiYWNrIGZyb20gdXNlcnMgYWJvdXQgdGhlaXIgZXhwZXJpZW5jZSwgdGhvdWdodHMsIGFuZCBhbnkgZGlmZmljdWx0aWVzIHRoZXkgZW5jb3VudGVyZWQuIFRoaXMgZmVlZGJhY2sgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGludGVydmlld3MsIHN1cnZleXMsIG9yIG9ic2VydmF0aW9uIG5vdGVzLgoKNi4gICoqSXRlcmF0ZSBhbmQgUmVmaW5lKio6IEFuYWx5emUgdGhlIGZlZWRiYWNrIHJlY2VpdmVkIGFuZCB1c2UgaXQgdG8gaW1wcm92ZSB0aGUgdXNlciBpbnRlcmZhY2UgZGVzaWduLiBNYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGUgZGVzaWduLCBpbnRlcmFjdGlvbnMsIG9yIHN5c3RlbSByZXNwb25zZXMgYmFzZWQgb24gdGhlIGluc2lnaHRzIGdhaW5lZCBmcm9tIHVzZXIgdGVzdGluZy4KClRoZSAiV2l6YXJkIG9mIE96IiB0ZWNobmlxdWUgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGRldmVsb3BpbmcgY29tcGxleCBvciBpbnRlbGxpZ2VudCBzeXN0ZW1zIHRoYXQgYXJlIG5vdCB5ZXQgZnVsbHkgYXV0b21hdGVkLiBJdCBhbGxvd3MgZGVzaWduZXJzIHRvIHRlc3QgYW5kIHZhbGlkYXRlIHRoZSBVSS9VWCBhc3BlY3RzIG9mIHRoZSBzeXN0ZW0gYmVmb3JlIGludmVzdGluZyByZXNvdXJjZXMgaW4gZnVsbCBkZXZlbG9wbWVudC4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gZW1wbG95ZWQgaW4gdGhlIGVhcmx5IHN0YWdlcyBvZiBhIHByb2plY3Qgd2hlbiB0aGUgaW50ZXJmYWNlIGRlc2lnbiBpcyBzdGlsbCBldm9sdmluZyBhbmQgcmVxdWlyZXMgdXNlciBmZWVkYmFjayB0byBkcml2ZSBpbXByb3ZlbWVudHMuCgpCeSB1c2luZyB0aGUgIldpemFyZCBvZiBPeiIgdGVjaG5pcXVlLCBkZXNpZ25lcnMgY2FuIGdhaW4gdmFsdWFibGUgaW5zaWdodHMgaW50byB1c2VyIGludGVyYWN0aW9ucywgdW5kZXJzdGFuZCB1c2FiaWxpdHkgaXNzdWVzLCBhbmQgcmVmaW5lIHRoZWlyIGRlc2lnbiBkaXJlY3Rpb24sIHVsdGltYXRlbHkgbGVhZGluZyB0byBhIG1vcmUgdXNlci1jZW50ZXJlZCBhbmQgZWZmZWN0aXZlIGZpbmFsIHByb2R1Y3QuCgojIyBXaXJlZnJhbWVzCgpXaXJlZnJhbWVzIGFyZSBsb3ctZmlkZWxpdHkgdmlzdWFsIHJlcHJlc2VudGF0aW9ucyBvZiBhIHVzZXIgaW50ZXJmYWNlIChVSSkgZGVzaWduLiBUaGV5IHNlcnZlIGFzIGEgc2tlbGV0YWwgZnJhbWV3b3JrIHRoYXQgb3V0bGluZXMgdGhlIHN0cnVjdHVyZSwgbGF5b3V0LCBhbmQgY29udGVudCBvZiBhIGRpZ2l0YWwgcHJvZHVjdCwgd2l0aG91dCBmb2N1c2luZyBvbiB2aXN1YWwgZGV0YWlscyBzdWNoIGFzIGNvbG9ycywgaW1hZ2VyeSwgb3IgdHlwb2dyYXBoeS4gV2lyZWZyYW1lcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgdXNpbmcgc2ltcGxlIHNoYXBlcywgbGluZXMsIGFuZCBwbGFjZWhvbGRlcnMgdG8gY29udmV5IHRoZSBiYXNpYyBlbGVtZW50cyBhbmQgaGllcmFyY2h5IG9mIGEgVUkuCgpXaXJlZnJhbWVzIHBsYXkgYSBjcnVjaWFsIHJvbGUgaW4gdGhlIHByb3RvdHlwaW5nIHByb2Nlc3MgYnkgcHJvdmlkaW5nIGEgZm91bmRhdGlvbmFsIGJsdWVwcmludCBmb3IgdGhlIFVJIGRlc2lnbi4gVGhleSBzZXJ2ZSBhcyBhIGJyaWRnZSBiZXR3ZWVuIHRoZSBpbml0aWFsIGNvbmNlcHR1YWxpemF0aW9uIG9mIGFuIGludGVyZmFjZSBhbmQgdGhlIGNyZWF0aW9uIG9mIG1vcmUgZGV0YWlsZWQgcHJvdG90eXBlcyBvciBtb2NrdXBzLiBIZXJlJ3MgaG93IHdpcmVmcmFtZXMgZml0IGludG8gdGhlIHByb3RvdHlwaW5nIHByb2Nlc3M6CgoxLiAgKipDb25jZXB0dWFsaXphdGlvbiBhbmQgSWRlYXRpb24qKjogV2lyZWZyYW1lcyBhcmUgb2Z0ZW4gdXNlZCBpbiB0aGUgZWFybHkgc3RhZ2VzIG9mIGEgcHJvamVjdCB0byBleHBsb3JlIGFuZCBicmFpbnN0b3JtIFVJIGlkZWFzLiBUaGV5IGhlbHAgZGVzaWduZXJzIGFuZCBzdGFrZWhvbGRlcnMgdmlzdWFsaXplIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbGF5b3V0IG9mIHRoZSBVSSwgZW5hYmxpbmcgZGlzY3Vzc2lvbnMgYWJvdXQgY29udGVudCBwbGFjZW1lbnQsIG5hdmlnYXRpb24sIGFuZCBmdW5jdGlvbmFsaXR5LgoKMi4gICoqSW5mb3JtYXRpb24gQXJjaGl0ZWN0dXJlIGFuZCBVc2VyIEZsb3dzKio6IFdpcmVmcmFtZXMgaGVscCBlc3RhYmxpc2ggdGhlIGluZm9ybWF0aW9uIGFyY2hpdGVjdHVyZSBvZiBhIFVJIGJ5IGluZGljYXRpbmcgaG93IGRpZmZlcmVudCBlbGVtZW50cyBhbmQgY29udGVudCB3aWxsIGJlIG9yZ2FuaXplZCBhbmQgY29ubmVjdGVkLiBUaGV5IGFsbG93IGRlc2lnbmVycyB0byBtYXAgb3V0IHVzZXIgZmxvd3MgYW5kIGludGVyYWN0aW9ucywgZW5zdXJpbmcgbG9naWNhbCBhbmQgaW50dWl0aXZlIG5hdmlnYXRpb24gd2l0aGluIHRoZSBpbnRlcmZhY2UuCgozLiAgKipVc2FiaWxpdHkgVGVzdGluZyBhbmQgRmVlZGJhY2sgR2F0aGVyaW5nKio6IExvdy1maWRlbGl0eSB3aXJlZnJhbWVzIGFyZSB1c2VmdWwgZm9yIGdhdGhlcmluZyBlYXJseSB1c2VyIGZlZWRiYWNrIGFuZCBjb25kdWN0aW5nIHVzYWJpbGl0eSB0ZXN0cy4gQnkgcHJlc2VudGluZyBhIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVJLCB3aXJlZnJhbWVzIGFsbG93IHVzZXJzIHRvIGZvY3VzIG9uIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYW5kIGludGVyYWN0aW9ucy4gRmVlZGJhY2sgb2J0YWluZWQgZnJvbSB3aXJlZnJhbWUgdGVzdGluZyBjYW4gaW5mb3JtIGFuZCBndWlkZSBmdXJ0aGVyIGl0ZXJhdGlvbnMgb2YgdGhlIGRlc2lnbi4KCjQuICAqKkNvbW11bmljYXRpb24gYW5kIENvbGxhYm9yYXRpb24qKjogV2lyZWZyYW1lcyBzZXJ2ZSBhcyBhIGNvbW11bmljYXRpb24gdG9vbCBiZXR3ZWVuIGRlc2lnbmVycywgc3Rha2Vob2xkZXJzLCBhbmQgZGV2ZWxvcG1lbnQgdGVhbXMuIFRoZXkgcHJvdmlkZSBhIGNsZWFyIGFuZCBjb25jaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVSSBzdHJ1Y3R1cmUsIG1ha2luZyBpdCBlYXNpZXIgZm9yIG5vbi1kZXNpZ25lcnMgdG8gdW5kZXJzdGFuZCBhbmQgcHJvdmlkZSBpbnB1dC4gV2lyZWZyYW1lcyBmYWNpbGl0YXRlIGRpc2N1c3Npb25zLCByZXZpc2lvbnMsIGFuZCBhbGlnbm1lbnQgYmVmb3JlIGludmVzdGluZyBzaWduaWZpY2FudCB0aW1lIGFuZCByZXNvdXJjZXMgaW4gaGlnaGVyLWZpZGVsaXR5IHByb3RvdHlwZXMuCgo1LiAgKipJdGVyYXRpdmUgRGVzaWduIFByb2Nlc3MqKjogV2lyZWZyYW1lcyBhcmUgaGlnaGx5IGZsZXhpYmxlIGFuZCBhbGxvdyBmb3IgcXVpY2sgaXRlcmF0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucy4gVGhleSBlbmFibGUgZGVzaWduZXJzIHRvIGV4cGxvcmUgbXVsdGlwbGUgZGVzaWduIGFsdGVybmF0aXZlcywgdGVzdCBkaWZmZXJlbnQgbGF5b3V0cywgYW5kIHJlZmluZSB0aGUgb3ZlcmFsbCBVSSBzdHJ1Y3R1cmUuIEFzIHRoZSBkZXNpZ24gcHJvZ3Jlc3Nlcywgd2lyZWZyYW1lcyBjYW4gYmUgdHJhbnNmb3JtZWQgaW50byBtb3JlIGRldGFpbGVkIHByb3RvdHlwZXMgb3IgdmlzdWFsIG1vY2t1cHMuCgo2LiAgKipIYW5kb2ZmIHRvIERldmVsb3BtZW50Kio6IFdpcmVmcmFtZXMgYWN0IGFzIGEgYmx1ZXByaW50IGZvciB0aGUgZGV2ZWxvcG1lbnQgdGVhbSwgcHJvdmlkaW5nIHRoZW0gd2l0aCBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIFVJIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eS4gVGhleSBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBkZXNpcmVkIHVzZXIgZXhwZXJpZW5jZSBhbmQgY2FuIGZhY2lsaXRhdGUgYSBzbW9vdGhlciB0cmFuc2l0aW9uIGZyb20gZGVzaWduIHRvIGRldmVsb3BtZW50LgoKT3ZlcmFsbCwgd2lyZWZyYW1lcyBhcmUgYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgcHJvdG90eXBpbmcgcHJvY2VzcywgcHJvdmlkaW5nIGEgZm91bmRhdGlvbmFsIHN0cnVjdHVyZSBhbmQgZ3VpZGluZyBzdWJzZXF1ZW50IGRlc2lnbiBpdGVyYXRpb25zLiBUaGV5IGhlbHAgZGVzaWduZXJzIGNvbW11bmljYXRlIGFuZCB2YWxpZGF0ZSB0aGVpciBpZGVhcywgZ2F0aGVyIGVhcmx5IHVzZXIgZmVlZGJhY2ssIGFuZCBzZXQgdGhlIHN0YWdlIGZvciBjcmVhdGluZyBtb3JlIGRldGFpbGVkIGFuZCBpbnRlcmFjdGl2ZSBwcm90b3R5cGVzLgoKIyMjIFdoeSBkbyBXaXJlZnJhbWVzIGxvb2sgc28gYmxhbmQ/CgpXaXJlZnJhbWVzIHNob3VsZCBoYXZlIGFuIGludGVudGlvbmFsIGxvdy1maWRlbGl0eSBsb29rIGFuZCBmZWVsIHRvIHRoZW0uIFRoZXJlIGFyZSBnb29kIHJlYXNvbnMgZm9yIHRoYXQ6CgoxLiAgKipXaXJlZnJhbWVzIGNsZWFybHkgaW5kaWNhdGUgdGhlIHByZWxpbWluYXJ5IG5hdHVyZSBvZiB0aGUgZGVzaWduKioKCiAgICBXaXJlZnJhbWVzIHNlcnZlIGFzIGFuIHVubWlzdGFrYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBlYXJseS1zdGFnZSBkZXNpZ24sIGVuc3VyaW5nIHRoYXQgaXQgaXMgbm90IG1pc2NvbnN0cnVlZCBhcyB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24uIFRoZWlyIGxvdy1maWRlbGl0eSBuYXR1cmUsIGRldm9pZCBvZiBpbnRyaWNhdGUgZGV0YWlscyBhbmQgbGltaXRlZCBjb2xvciB1c2FnZSwgZGlyZWN0cyBhdHRlbnRpb24gdG93YXJkcyB0aGUgc3RydWN0dXJhbCBhc3BlY3RzLiBUaGUgZm9jdXMgYXQgdGhpcyBzdGFnZSBsaWVzIG9uIGVzdGFibGlzaGluZyB0aGUgZGVzaWduJ3MgZnJhbWV3b3JrIGJlZm9yZSBkZWx2aW5nIGludG8gdmlzdWFsIGRlc2lnbiBlbGVtZW50cywgd2hpY2ggd2lsbCByZWNlaXZlIGF0dGVudGlvbiBpbiBzdWJzZXF1ZW50IHBoYXNlcy4KCjIuICAqKldpcmVmcmFtZXMgZm9zdGVyIGFuIGVudmlyb25tZW50IGZvciBjb25zdHJ1Y3RpdmUgZGlzY3Vzc2lvbioqCgogICAgVGhlIHJvdWdoIG5hdHVyZSBvZiB3aXJlZnJhbWVzIGVuY291cmFnZXMgb3BlbiBhbmQgZnJ1aXRmdWwgZGlzY3Vzc2lvbnMuIEl0IGNyZWF0ZXMgYW4gYXRtb3NwaGVyZSB3aGVyZSBmZWVkYmFjayBhbmQgY3JpdGlxdWUgYXJlIHdlbGNvbWVkLCBhcyB3aXJlZnJhbWVzIGFyZSBwZXJjZWl2ZWQgYXMgYSB3b3JrIGluIHByb2dyZXNzLiBEdWUgdG8gdGhlaXIgcXVpY2sgcHJvZHVjdGlvbiwgc3Rha2Vob2xkZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHByb3ZpZGUgdGhlaXIgaW5wdXQgZnJlZWx5LiBFYWNoIHdpcmVmcmFtZSBzY3JlZW4gdHlwaWNhbGx5IHJlcXVpcmVzIG9ubHkgYSBmZXcgbWludXRlcyB0byBjcmVhdGUsIGFsbG93aW5nIGZvciBpdGVyYXRpb25zIHdpdGhvdXQgY29uY2VybnMgYWJvdXQgc3RhcnRpbmcgZnJvbSBzY3JhdGNoLiBUaGUgdWx0aW1hdGUgb2JqZWN0aXZlIGF0IHRoaXMganVuY3R1cmUgaXMgdG8gb3B0aW1pemUgdXNhYmlsaXR5LCBtYWtpbmcgaXRlcmF0aXZlIHJldmlzaW9ucyBhIG5vcm1hbCBhbmQgYW50aWNpcGF0ZWQgcGFydCBvZiB0aGUgZGVzaWduIHByb2Nlc3MuCgozLiAgKipXaXJlZnJhbWVzIHByb3ZpZGUgYSBjbGVhciBpbmRpY2F0aW9uIHRoYXQgbm8gY29kZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGFrZW4gcGxhY2UqKgoKICAgIFByZXNlbnRpbmcgd2lyZWZyYW1lcyB0byBjdXN0b21lcnMgb3Igc3Rha2Vob2xkZXJzIGluc3RlYWQgb2YgZmluYWxpemVkIGFwcCBzY3JlZW5zaG90cyBlbGltaW5hdGVzIGFueSBtaXNjb25jZXB0aW9ucyB0aGF0IHRoZSBkZXBpY3RlZCBzY3JlZW5zIHJlcHJlc2VudCBhIGZ1bmN0aW9uaW5nIGFwcGxpY2F0aW9uLiBUaGUgYWJzZW5jZSBvZiBkZXRhaWxlZCB2aXN1YWwgZWxlbWVudHMgYW5kIHRoZSB3aXJlZnJhbWUgZm9ybWF0IGVmZmVjdGl2ZWx5IGNvbW11bmljYXRlIHRoYXQgbm8gY29kZSBoYXMgYmVlbiB3cml0dGVuIHlldC4gV2lyZWZyYW1lcyBlZmZlY3RpdmVseSBtaXRpZ2F0ZSB0aGUgcmlzayBvZiBwcmVtYXR1cmUgYXNzdW1wdGlvbnMgcmVnYXJkaW5nIHRoZSBkZXZlbG9wbWVudCBwcm9ncmVzcyBhbmQgZW5zdXJlIGZvY3VzIHJlbWFpbnMgb24gcmVmaW5pbmcgdGhlIGRlc2lnbiBiZWZvcmUgaW1wbGVtZW50YXRpb24uCgojIyBMZWN0dXJlIHsjbGVjdHVyZX0KClRoZSBsZWN0dXJlIGJlbG93IGJ5IERyLiBTY2hlZGxiYXVlciBzdW1tYXJpemVzIHRoZSBrZXkgY29uY2VwdHMgb2YgcHJvdG90eXBpbmcuCgo8aWZyYW1lIHNyYz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLzgzNTU5NDA1ND90aXRsZT0wJmFtcDtieWxpbmU9MCZhbXA7cG9ydHJhaXQ9MCZhbXA7c3BlZWQ9MCZhbXA7YmFkZ2U9MCZhbXA7YXV0b3BhdXNlPTAmYW1wO3BsYXllcl9pZD0wJmFtcDthcHBfaWQ9NTg0NzkiIHdpZHRoPSI2NDAiIGhlaWdodD0iMzYwIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3c9ImF1dG9wbGF5OyBmdWxsc2NyZWVuOyBwaWN0dXJlLWluLXBpY3R1cmUiIGFsbG93ZnVsbHNjcmVlbiB0aXRsZT0ibGVjdHVyZS05MS00MTAtcHJvdG90eXBpbmciIGRhdGEtZXh0ZXJuYWw9IjEiPgoKPC9pZnJhbWU+CgoqKlNsaWRlIERlY2sqKjogW1MtOTEtNDEwIFByb3RvdHlwaW5nXShzLTkxLTQxMC1wcm90b3R5cGluZy5wcHR4KQoKIyMgU3VtbWFyeSB7I3N1bW1hcnl9CgpJbiB0aGlzIGxlc3Nvbiwgd2UgZXhwbG9yZWQgdGhlIGNvbmNlcHQgb2YgcHJvdG90eXBpbmcgaW4gdGhlIGNvbnRleHQgb2YgdXNlciBpbnRlcmZhY2UgKFVJKSBkZXNpZ24uIFByb3RvdHlwaW5nIGlzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIHByZWxpbWluYXJ5IHZlcnNpb25zIG9yIHJlcHJlc2VudGF0aW9ucyBvZiBVSSBkZXNpZ25zIHRvIGV2YWx1YXRlLCB0ZXN0LCBhbmQgcmVmaW5lIHRoZW0gYmVmb3JlIGFjdHVhbCBkZXZlbG9wbWVudC4KCldlIGxlYXJuZWQgdGhhdCBwcm90b3R5cGVzIGNhbiB0YWtlIHZhcmlvdXMgZm9ybXMsIGZyb20gbG93LWZpZGVsaXR5IHNrZXRjaGVzIGFuZCB3aXJlZnJhbWVzIHRvIGhpZ2gtZmlkZWxpdHkgaW50ZXJhY3RpdmUgbW9ja3VwcyBvciBmdW5jdGlvbmFsIHByb3RvdHlwZXMuIFRoZSBsZXZlbCBvZiBmaWRlbGl0eSBkZXBlbmRzIG9uIHRoZSBwdXJwb3NlIGFuZCBzdGFnZSBvZiB0aGUgZGVzaWduIHByb2Nlc3MuCgpUaGUgbGVzc29uIGhpZ2hsaWdodGVkIHRoZSBrZXkgcHVycG9zZXMgb2YgcHJvdG90eXBpbmcgaW4gVUkgZGVzaWduLiBQcm90b3R5cGVzIHNlcnZlIGFzIGEgdG9vbCBmb3IgZXZhbHVhdGluZyBhbmQgcmVmaW5pbmcgZGVzaWduIGlkZWFzLCBhbGxvd2luZyBkZXNpZ25lcnMgdG8gZ2F0aGVyIGZlZWRiYWNrIGFuZCBhc3Nlc3MgdXNhYmlsaXR5LiBUaGV5IGFsc28gaGVscCBpbiB0ZXN0aW5nIGFuZCB2YWxpZGF0aW5nIGNvbmNlcHRzLCBpZGVudGlmeWluZyBwb3RlbnRpYWwgaXNzdWVzIG9yIGFyZWFzIGZvciBpbXByb3ZlbWVudCBlYXJseSBvbi4KCldlIGRpc2N1c3NlZCBob3cgcHJvdG90eXBlcyBwbGF5IGEgY3J1Y2lhbCByb2xlIGluIGNvbW11bmljYXRpbmcgYW5kIGFsaWduaW5nIHdpdGggc3Rha2Vob2xkZXJzLiBUaGV5IHByb3ZpZGUgYSB0YW5naWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvcG9zZWQgVUkgZGVzaWduLCBmYWNpbGl0YXRpbmcgdW5kZXJzdGFuZGluZyBhbmQgZmVlZGJhY2sgZnJvbSBjbGllbnRzLCBkZXZlbG9wZXJzLCBhbmQgb3RoZXIgcHJvamVjdCBzdGFrZWhvbGRlcnMuCgpGdXJ0aGVybW9yZSwgd2UgZXhwbG9yZWQgaG93IHByb3RvdHlwaW5nIHNhdmVzIHRpbWUgYW5kIHJlc291cmNlcyBieSB1bmNvdmVyaW5nIGRlc2lnbiBmbGF3cyBhbmQgdXNhYmlsaXR5IGlzc3VlcyBlYXJseSBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBoZWxwcyBwcmV2ZW50IGNvc3RseSByZXZpc2lvbnMgZHVyaW5nIGRldmVsb3BtZW50IGFuZCBlbmFibGVzIGRlc2lnbmVycyB0byBpdGVyYXRlIGFuZCByZWZpbmUgdGhlIFVJIGRlc2lnbiBiZWZvcmUgY29tbWl0dGluZyBzaWduaWZpY2FudCByZXNvdXJjZXMuCgpJbiBjb25jbHVzaW9uLCBwcm90b3R5cGluZyBpcyBhIHZpdGFsIHN0ZXAgaW4gVUkgZGVzaWduIHRoYXQgYnJpZGdlcyB0aGUgZ2FwIGJldHdlZW4gY29uY2VwdHVhbGl6YXRpb24gYW5kIGltcGxlbWVudGF0aW9uLiBJdCBhbGxvd3MgZGVzaWduZXJzIHRvIGdhdGhlciBmZWVkYmFjaywgdGVzdCBpbnRlcmFjdGlvbnMsIGNvbW11bmljYXRlIGVmZmVjdGl2ZWx5LCBhbmQgb3B0aW1pemUgdGhlaXIgZGVzaWducywgdWx0aW1hdGVseSByZXN1bHRpbmcgaW4gbW9yZSB1c2VyLWZyaWVuZGx5IGFuZCBzdWNjZXNzZnVsIHVzZXIgaW50ZXJmYWNlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRmlsZXMgJiBSZXNvdXJjZXMKCmBgYHtyIHppcEZpbGVzLCBlY2hvPUZBTFNFfQp6aXBOYW1lID0gc3ByaW50ZigiTGVzc29uRmlsZXMtJXMtJXMuemlwIiwgCiAgICAgICAgICAgICAgICAgcGFyYW1zJGNhdGVnb3J5LAogICAgICAgICAgICAgICAgIHBhcmFtcyRudW1iZXIpCgp0ZXh0QUxpbmsgPSBwYXN0ZTAoIkFsbCBGaWxlcyBmb3IgTGVzc29uICIsIAogICAgICAgICAgICAgICBwYXJhbXMkY2F0ZWdvcnksIi4iLHBhcmFtcyRudW1iZXIpCgojIGRvd25sb2FkRmlsZXNMaW5rKCkgaXMgaW5jbHVkZWQgZnJvbSBfaW5zZXJ0MkRCLlIKa25pdHI6OnJhd19odG1sKGRvd25sb2FkRmlsZXNMaW5rKCIuIiwgemlwTmFtZSwgdGV4dEFMaW5rKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIFJlZmVyZW5jZXMKCltSb3NzLCBKaW0gKE1heSA4LCAyMDE3KS4gUHJvdG90eXBpbmc6IFBhcGVyIFZlcnN1cyBEaWdpdGFsIChQcmFjdGljYWwgVXNhYmlsaXR5LCBVWCBNYXR0ZXJzLl0oaHR0cHM6Ly93d3cudXhtYXR0ZXJzLmNvbS9tdC9hcmNoaXZlcy8yMDE3LzA1L3Byb3RvdHlwaW5nLXBhcGVyLXZlcnN1cy1kaWdpdGFsLnBocCkKCltSYW1hc3dhbXksIFMuIChuLmQuKS4gVGhlIFdpemFyZCBvZiBPeiBNZXRob2QgaW4gVVguIE5pZWxzZW4gTm9ybWFuIEdyb3VwLl0oaHR0cHM6Ly93d3cubm5ncm91cC5jb20vYXJ0aWNsZXMvd2l6YXJkLW9mLW96LykKCiMjIEVycmF0YQoKW0xldCB1cyBrbm93XShodHRwczovL2Zvcm0uam90Zm9ybS5jb20vMjEyMTg3MDcyNzg0MTU3KXt0YXJnZXQ9Il9ibGFuayJ9Lgo=