How Information Changes Consumer Behavior and How Consumer Behavior Determines Corporate Strategy is a Professor at the Wharton School, University of Pennsylvania, where he has served since 1976. His visiting appointments include Harvard University, cornell University, Hong Kong University of Science and Technology, and the Indian School of Business. He serves on the editorial boards of the Journal of Management Information Systems and the International Journal of Electronic Commerce. His research specialties are in the areas of IT and business strategy and IT and financial markets. More specifically, he studies the impact of technology on consumer behavior, analyzing investments in strategic IT ventures, managing the risks of strategic outsourcing, managing the risk of strategic IT implementations, and strategic implications of e-commerce for channel power and profitability. He is the Director of the Wharton School's Sponsored research Program in Information, Strategy, and Economics; the Area Head for Information, Strategy, and Economics; and program coordinator for the school's major in e-commerce. He also is the founder of the Hawaii International conference on System Sciences' (HIcSS) annual competitive Strategy, Economics, and Information Systems mini-track, which had its twentieth anniversary meeting in January 2007, and the winner of two HIcSS Best Paper awards.AbstrAct: Information availability has increased consumers' informedness, the degree to which they know what is available in the marketplace, with precisely which attributes and at precisely what price. This informedness has altered the demand side of market behavior: customers now discount more heavily when comparable products are available from competitors and when products do not meet their wants, needs, cravings, and longings, but they no longer discount as heavily when purchasing unfamiliar products. changes in the demand side are producing comparable changes in the supply side: firms earn less than their expectations when competing in traditional mass-market fat spots, while earning far more than previously when entering newly created resonance marketing sweet spots. We trace the impact of hyperdifferentiation and resonance marketing on strategy, with a clear progression from a limited number of fat spots, through reliance on line extensions, and ultimately to fully differentiated market sweet spots.KEy words And phrAsEs: consumer informedness, long tail, marketing strategy, online reviews, resonance marketing, word-of-mouth marketing. context this pApEr offErs A modEst contribution to marketing strategy, based on years of research into marketing strategy, pricing strategy, product design, promotion, and

O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I B I B I B I B I B I O O O O O O O O B I O O O O O O B I O O O O O O


Software architecture definition for on-demand cloud provisioning Abstract Cloud computing is a promising paradigm for the provisioning of IT services. Cloud computing infrastructures, such as those offered by the RESERVOIR project, aim to facilitate the deployment, management and execution of services across multiple physical locations in a seamless manner. In order for service providers to meet their quality of service objectives, it is important to examine how software architectures can be described to take full advantage of the capabilities introduced by such platforms. When dealing with software systems involving numerous loosely coupled components, architectural constraints need to be made explicit to ensure continuous operation when allocating and migrating services from one host in the Cloud to another. In addition, the need for optimising resources and minimising over-provisioning requires service providers to control the dynamic adjustment of capacity throughout the entire service lifecycle. We discuss the implications for software This research has been partly funded by the RESERVOIR EU FP7 Project through Grant Number 215605. architecture definitions of distributed applications that are to be deployed on Clouds. In particular, we identify novel primitives to support service elasticity, co-location and other requirements, propose language abstractions for these primitives and define their behavioural semantics precisely by establishing constraints on the relationship between architecture definitions and Cloud management infrastructures using a model denotational approach in order to derive appropriate service management cycles. Using these primitives and semantic definition as a basis, we define a service management framework implementation that supports on demand cloud provisioning and present a novel monitoring framework that meets the demands of Cloud based applications. Cloud computing [35] is a promising paradigm for the provisioning of IT services. Cloud computing infrastructures, such as those offered by the RESERVOIR project [25] , aim to facilitate the deployment, management and execution of services across multiple physical locations in a seamless manner.. Until recently, operating systems managed the allocation of physical resources, such as CPU time, main memory, disk space and network bandwidth to applications. Virtualisation infrastructures, such as Xen [4] and VMWare [31] are changing this by introducing a layer of abstraction known as a hypervisor. A hypervisor runs on top of physical hardware, allocating resources to isolated execution environments known as virtual machines, which run their own individual virtualised operating system. Hypervisors manage the execution of these operating systems, booting, suspending or shutting down systems as required. Some hypervisors even support replication and migration of virtual machines without stopping the virtualised operating system.. It turns out that the separation between resource provision and operating systems introduced by virtualisation technologies is a key enabler for Cloud computing. Specifically, virtualisation is an enabler for Infrastructure-as-aService (IaaS) Clouds, the type on which this paper is focused. For a description of the different types of Cloud computing see [35] .. Compute Clouds provide the ability to lease computational resources at short notice, on either a subscription or pay-per-use model and without the need for any capital expenditure into hardware. A further advantage is that the unit cost of operating a server in a large server farm is lower than in small data centres. Examples of compute Clouds are Amazon's Elastic Compute Cloud (EC2) [1] or IBM's Blue Cloud [15] . Organisations wishing to use computational resources provided by these Clouds supply virtual machine images that are then executed by the hypervisors running in the Cloud, which allocate physical resources to virtualised operating systems and control their execution.. With an increasing number of providers seeking to migrate services to the Cloud in order to save on deployment costs, cater for rapid growth or generally relieve themselves from the responsibility of provisioning the infrastructural resources needed to support the service, whether related to power, bandwidth, software or hardware [3] , there is a crucial need to ensure that a same service quality can be retained when relying upon Clouds while generally delivering on the promise of lowering costs by minimising overprovisioning through efficient upscaling and downscaling of services.. In this paper we review the implications of the emergence of virtualisation and compute Clouds for software engineers in general and software architects in particular. We find that software architectures need to be described differently if they are to be deployed into a Cloud. The reason is that scalability, availability, reliability, ease of deployment and total cost of ownership are quality attributes that need to be achieved by a software architecture and these are critically dependent upon how hardware resources are provided. Virtualisation in general and compute Clouds in particular provide a wealth of new primitives that software architects can exploit to improve the way their architectures deliver these quality attributes.. The principal contribution of this paper is a discussion of architecture definition for distributed applications that are to be deployed on compute Clouds. The key insight is that the architecture description needs to be reified at run-time so that it can be used by the Cloud computing infrastructure in order to implement, monitor and preserve architectural quality goals. This requires several advances over the state of the art in software architecture. Architectural constraints need to be made explicit so that the Cloud infrastructure can obey these when it allocates, replicates, migrates and deactivates virtual machines that host components of the architecture. The architecture also needs to describe how and when it responds to load variations and faults; we propose the concept of elasticity rules for architecture definitions so that the Cloud computing infrastructure can replicate components and provide additional resources as demand grows or components become unavailable. Finally, there must be an understanding of how a management cycle for a service deployed on a Cloud can be derived from a description of these constraints and we demonstrate how this can be achieved using a model driven approach.. As such the overall contributions of the paper are as follows: we identify a list of requirements and constraints that a provider must describe when deploying and hosting a multicomponent application on a Cloud. We present a language for the description of such requirements that builds on existing standards and introduces new abstractions such as the ability to specify on demand scaling. We define an architecture for a Cloud infrastructure to support these abstractions and specify clear behavioural semantics for our language with respect to this architecture using a model denotational approach. We then describe the overall implementation of the service lifecycle management process, with particular focus on service management components and the monitoring infrastructure which will address the scaling requirements and physical distribution of application services. Finally we evaluate our language primitives experimentally with a distributed computational chemistry application. This paper is an enhancement and extension to work previously presented [5] and is structured as follows: In Sect. 2, we present the background to this research and in particular the primitives that are now provided by modern virtualisation and Cloud computing technologies in general and the infrastructure developed by the RESERVOIR project in particular. We then use a motivating example in Sect. 3 to argue why architecture definition for Cloud computing differs from more conventional deployments. In Sect. 4, we describe our novel abstractions, such as co-location constraints and elasticity rules for describing architectures that are to be deployed in a Cloud. Section 5 presents the main components of the architecture which manage the lifecycle of services within a cloud, namely the Service Manager and the Monitoring Framework. In Sect. 6 we describe the experimental evaluation of our approach by means of a computational chemistry application that we have deployed in a computational Cloud. We discuss related work and present conclusions in Sects. 7 and 8. In this paper, we have proposed an abstract syntax and semantic definition for a service manifest language which builds on the OVF standard and enables service requirements, deployment constraints (placement, co-location and startup/stopping order) and elasticity rules to be expressed. We believe that clear behavioural semantics are of paramount importance to meet quality goals of both the Service and Infrastructure provider. Our model-driven approach aims to strengthen the design of the RESERVOIR stack, identifying functional capabilities that should be present and constraints the system should observe. We also explored the relationship between a novel RESERVOIR monitoring infrastructure and service manifest, focusing particularly on notions such as data dictionary and the KPIs defined at the abstract layer. Such relationship has served to drive the implementation of the monitoring infrastructure.. We have shown experimentally that the implementation of these concepts is feasible and that a complete architecture definition that uses our manifest syntax can enable Cloud computing infrastructure to realise significant savings in resource usage, with little impact on overall quality of service. Given that a Cloud can deliver a near similar quality of service as a dedicated computing resource, Clouds then have a substantial number of advantages. Firstly application providers do not need to embark on capital expenditure and instead can lease the infrastructure when they need it. Secondly, because the elasticity rules enable the application provider to flexibly expand and shrink their resource demands so they only pay the resources that they actually need. Finally, the Cloud provider can plan its capacity more accurately because it knows the resource demands of the applications it provides.. While Cloud computing is still a relatively new paradigm, and as such changes in standards, infrastructural capabilities and component APIs are inevitable, defining the software architecture of services hosted on a Cloud with respect to the capabilities of the underlying infrastructure is key to optimizing resource usage. This allows us to bridge the gap between application and infrastructure and provides the means for providers to retain some control over the management process.. Our work paves the way towards quality of service aware service provisioning. In future work, we aim to develop appropriate syntax and semantics for resource provisioning service level agreements. Building upon the approach laid out here, we aim to provide a framework for the automated monitoring and protection of service level obligations based on defined semantic constraints. How is a software development project now going to use Cloud computing infrastructures, such as the one provided by RESERVOIR. We aim to answer this question and then derive the main research questions for this paper using a running example, an enterprise resource planning system, such as those provided by SAP [27] . A high-level architecture of an SAP system is illustrated in Fig. 2 . SAP ERP systems have a multi-tiered software architecture with a relational database layer. On top of the database is an application layer that has a Central Instance, which provides a number of centralised services, such as synchronisation, registration and spooling capabilities, and generally serves as a database gateway. Moreover SAP applications have a number of Dialog Instances, which are application servers responsible for handling business logic and generating HTTP-based dialogues that are shown in a browser. A Web Dispatcher may be used to balance workloads between multiple dialog instances. To date SAP systems are hosted in substantial data centres, but organisations (playing the role of Service Provider) in the future might wish to deploy it in a compute Cloud in order to avoid the significant capital investment associated with the construction of a data centre.. If the SAP system is handed over to a Cloud computing provider that uses an infrastructure based on the RESER-VOIR architecture, a number of architectural constraints of the SAP system will need to be obeyed by the Cloud. For example, the Central Instance will frequently make queries to the database and in a typical SAP configuration the Central Instance and the database need to be co-located on the same LAN subnet. When the VEEM allocates the virtual machines for the Central Instance and the DBMS to particular VEEHs, it will have to respect this co-location constraint. Another architectural constraint is that the Central Instance can not be replicated in any SAP system. Dialog Instances, on the other hand are replicated to accommodate growing demand. Therefore these architectural constraints have to be expressed by the SAP provider and made available to the Service Manager so that it can obey these constraints at runtime.. This requires the software architecture to be expressed in terms of services, their relationship and their resource requirements. While a traditional SAP deployment would require that spare capacity is retained to deal with peaks in demand, Cloud computing introduces the ability to minimise overprovisioning by tying resource provision directly to the needs of the application. Resource requirements, in this case dictated by the number of Dialog Instances required to handle the current load, can be scaled dynamically and adjusted to maximise cost savings. This requires means of describing the state of the system and rules for adjustments. Much of this work builds on the foundation previously established with SLAs, where we used a model denotational approach to specify service level agreements for web-based application services [29] . In this paper, we have aimed to broaden the approach to encapsulate Cloud computing primitives and environment, providing a specification for a manifest language describing software architecture, physical requirements, constraints and elasticity rules.. In addition, it is worth examining research developments related to service virtualisation, grid computing and component based software architecture description languages. With respect to virtual environment deployment descriptions, the manifest language proposed here builds upon the Open Virtualisation Format (OVF) [10] , whose limitations have already been discussed.. There exists a number of software architecture description languages which serve as the run-time configuration and deployment of component based software systems. The CDDLM Component Model [32] , for example, outlines the requirements for creating a deployment object responsible for the lifecycle of a deployed resource with focus on grid services. Each deployment object is defined using the CDL language. The model also defines the rules for managing the interaction of objects with the CDDML deployment API. Though the type of deployment object is not suited to virtual machine management, the relationship between objects and the deployment API can be compared to our approach we have undertaken here, providing a semantic definition for the CDL language. However in our case the relationship between domain and syntactic models is performed at a higher level of abstraction, relying on OCL to provide behavioural constraints. Our specification is hence free of implementation specific concerns.. The general approach to dynamic and automated provisioning may also be compared to the self-managing computing systems associated with autonomic computing research [14] . While our approach to elasticity is explicit, in that providers define appropriate scaling rules based on an event condition action model, we have laid a foundation for further methods to be developed relying on predictive and autonomic mechanisms to anticipate future allocation changes and further minimise over-provisioning, providing monitoring channels and a rule based framework for the dynamic management of services.. Finally it is important to examine current developments in production level Cloud environments, such as Amazon's EC2 offering [1] . In particular, auto-scaling has been introduced by Amazon to allow allocated capacity to be automatically scaled according to conditions defined by a service provider. These conditions are defined based on observed resource utilisation, such as CPU utilisation, network activity or disk utilisation. Whilst the approach laid out in this paper can be used to define elasticity rules based on such metrics, this can prove limiting. With respect to the evaluation, the need to increase the cluster size cannot be identified through these metrics as we require an understanding of the scheduling process. The ability to describe and monitor application state is crucial if we wish to correctly anticipate demand.. In addition, the focus of our paper has primarily been on Infrastructure-as-a-Service Clouds. Nevertheless it is still important to briefly discuss the relevance of this work with respect to Platform-as-a-Service (PaaS) Clouds such as Windows Azure [18] . PaaS Clouds provide an additional level of abstraction over IaaS Clouds, providing a runtime environment for the execution of application code and a set of additional software services, such as communication protocols, access control, persistence, etc. Windows Azure allows services to be described as distributed entities: clients can specify the interfaces exposed by services, communication end points, channels and roles (web or worker) and different hardware requirements may be allocated. However a need to control the management, distribution and lifecycle of multicomponent systems still exists, though with the added benefit of application specific operations being more readily exposed to the infrastructure. How this is implemented will be tied to the specifics of the platform itself but we do believe there is potential to adapt many aspects of our approach to the platform specific interfaces and tools. The Resources and Services Virtualization without Barriers (RESERVOIR) project is a European Seventh Framework Programme (FP7) project which aims to promote through standardisation an open architecture for federated Cloud computing. It defines an open framework of modular components and APIs that enable a wide range of configurations within the Cloud space, focusing on Infrastructure as a Service (IaaS) Clouds [35] .. The RESERVOIR architecture [25] aims to satisfy the vision of service oriented computing by distinguishing and addressing the needs of Service Providers, who understand the operation of particular businesses and offer suitable Service applications, and Infrastructure Providers, who lease computational resources in the form of a Cloud computing infrastructure. This infrastructure provides the mechanisms to deploy and manage self contained services, consisting of a set of software components, on behalf of a service provider.. The Cloud computing abstractions supported by this infrastructure and the architecture we have used to implement these abstractions are described in detail in [26] . The architecture is shown in Fig. 1 .. RESERVOIR builds upon generally available virtualisation products and hypervisors. The lowest layer of the RESERVOIR architecture is the Virtual Execution Environment Host (VEEH). It provides plugins for different hypervisors and enables the upper layers of the architecture to interact with heterogeneous virtualisation products. The layer above is the Virtual Execution Environment Manager (VEEM), which implements the key abstractions needed for Cloud computing. A VEEM controls the activation of virtualised operating systems, migration, replication and deactivation. A VEEM typically controls multiple VEEHs within one site. The key differentiator from other Cloud computing infrastructure is RESERVOIR's ability to feder- ate across different sites, which might be implementing different virtualisation products. This is achieved by cross-site interactions between multiple different VEEMs operating on behalf of different Cloud computing providers. This supports replication of virtual machines to other locations for example for business continuity purposes. The highest level of abstraction in the RESERVOIR architecture is the Service Manager. While the VEEM allocates services according to a given placement policy, it is the Service Manager that interfaces with the Service Provider and ensures that requirements (e.g. resource allocation requested) are correctly enforced. The Service Manager also performs other service management tasks, such as accounting and billing of service usage.. An implementation of the VEEM layer, OpenNebula, which we have used in our experimental evaluation described below is publicly available from [24] . It provides the ability to interact with hypervisors such as Xen [4] or VMWare [31] via appropriate plugins and is included from release 9.04 in the Ubuntu Linux distribution.

B I O O O O O O B I O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O


A framework for awareness support in groupware systems This paper introduces a framework for awareness support in groupware sysiems. This framework, called Big Watch (B W), intends io support past event awareness. It has been designed IO be used when developing new groupware applications and also to improve existeni ones. This paper summarires the characteristics and the siructure of B W, and discusses two applications that use it. In a cooperative work, decision and success depend on the integration of the efforts from different group members. When it happens, it is important that each member knows the part of work's results of other group members, which are related to hisher own contribution [5] . It is important to have enough information about the evolution of shared data, members' actions, etc. in order to improve individual contributions. In other words, it is essential to control the quantity of information available for the members and, the awareness support proposed here allows it. These contributions can be improved by understanding the activities of the whole group, and that's why awareness is important in the development of collaborative activities [12] .. Due to its importance to group work. awareness support should be a major concern when designing groupware systems. Despite of this, systematic solutions for the awareness support are not common, and groupware designers are obliged to design and develop this support themselves. A similar situation occurs in groupware maintenance when the groupware designers need to improve the awareness support present in their system. They often don't have any framework or toolkit to help them, and the reuse of code from other applications is difficult.. We designed a framework, called BW, to solve this problem. It aims to supporting past events awareness. It has been design to be flexible enough to he used to improve existent groupware applications and also to build new ones. This paper resumes the characteristics and the structure of the BW framework. It is organized as follows: first, we discuss the importance of the awareness support in groupware systems. Then, the framework is presented, initially by its main characteristics, followed by the presentation of its structure in three layers. Once the framework is presented, we introduce some applications that already use it, and, finally, some conclusions are presented. One of the main goals of the framework BW was to provide flexibility. This goal has been reached by the use of an event-based awareness mechanism, designed using an object-oriented approach. The design divided the framework into four packages, which separated its services and its data model, keeping them independent. Besides, the use of an object oriented design allowed the groupware designers to easily extend the framework BW through the specialization of the framework classes.. As a result, we could reach a flexible and extensible framework, which has been used successfully in two different environments, the environment proposed by the CEMT Project, and the COPSEICUTE application.. The framework BW still has many possibilities to explore, due to its flexibility. It can he used, for example, to implement the idea of "awareness of awareness" (that is, supply information about who received an awareness information), or for "future awareness" (awareness information about the incoming events for the group).

O B O B I O B I O O O O B O B I O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O B I O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O B O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O B I O B I O O B O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O B O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O


Knowledge Acquisition: Past, Present and Future Abstract: As we celebrate the fiftieth knowledge acquisition conference this year it is appropriate to review progress in knowledge acquisition techniques not only over the quarter century since the conference series began but backwards through the millennia to the beginnings of knowledge capture and forwards through the foreseeable future to speculate on reasonable expectations, appropriate targets and potential surprises in the next quarter century. Human-computer interaction research is inevitably forward-looking because of the extraordinary pace of improvements in the technology and the expectations that this generates. We know that we will be able to do tomorrow what we barely dreamed of yesterday, and that successful innovations will be assimilated rapidly into the texture of our society to become part of our everyday routines and expectations. Our focus is to transform possibilities in our worlds of speculation from abstractions to effective technologies assimilated in, and enhancing, our lifeworlds.. Occasionally, however, it is useful to look back, assess how far we have come, recognize how much was unexpected, and use this to refine our projections, noting that the future is amazingly open. We need to be able to recognize and utilize what we did not expect as much as we also need to strive particular objectives by particular means.. The uncertainties of the technologies and the openness of the future should not, however, blind us to the underlying human needs and intrinsic human capabilities that have remained constant for millennia. Our research serves a society where individuals, social groups, organizations, nations and civilizations attempt to survive and prosper. Their specific aspirations reflect the ethos of each era but their fundamental needs and unenhanced individual capacities have remained the same throughout recorded history.. The accumulation of techniques for addressing these needs and enhancing these capabilities we term human "knowledge." As a species we are "doomed to think in order to live" (Castañeda, 1990, p.3) . Knowledge acquisition and utilization to support our thinking has been a major imperative of human civilization throughout the millennia. In our era, computer technology and human-computer interaction have come to play a major role in knowledge processes, facilitating a level of knowledge generation, dissemination, access and utilization beyond that we have ever known.. This journal has played a significant role in supporting the development of improved human-computer interaction technologies and has had strong engagement with research in such interaction at the knowledge level. In particular it has been a major forum for research on the support of human knowledge acquisition processes and as we celebrate twenty five years of the knowledge acquisition conferences world-wide it is appropriate to reflect not only on the progress over that period but also on how that progress is situated in the growth of human knowledge over much longer time scales.. This article traces human knowledge acquisition processes, and techniques for their support, from time long past through time recent and time present to speculations on time future. The historian, White (1972) , has emphasized the plasticity and metaphorical power of historical accounts-we construct histories for ourselves that both empower and constrain our futures. Setting the history of the knowledge community within the ethos of artificial intelligence and expert systems studies alone may not provide an appropriate framework for our current and future research in the much wider context of the semantic web and its role in human society.. This article and the others in this special issue present a number of perspectives on knowledge acquisition that enable us to construct histories for our community that empower and constrain our futures in interesting ways. Considering the choices available seems an appropriate agenda for our twenty-fifth anniversary. They are neither mutually exclusive nor exhaustive-just food for thoughtwhat will be our themes, targets and agendas for the next twenty-five years?. In general there is a continuing need to consolidate and extend all that we know of knowledge acquisition processes and techniques, drawing upon all literatures and disciplines to support our stewardship of the state-of-the-art in knowledge acquisition. That includes the need to continue to enhance the tools we make available to take advantages of developments in knowledge representation and computer technologies.. We also need to track user requirements for knowledge acquisition technologies to support both the needs of those applying them and the innovations in knowledge acquisition that may be outside of, or substantially extend, our current frameworks. In particular, the original logicist framework that has dominated artificial intelligence and expert systems research, may need substantial extension to support knowledge acquisition systems that incorporate the information indexing techniques of the web.. Beyond all that we need to appreciate the foundational role of knowledge in the evolution of our species and civilizations, a role so fundamental to the essence of what we are that is subject to social dynamics on a scale that we do not yet fully comprehend. The utopian dream of those who saw universal access to knowledge as improving the human condition has to be balanced by the reality that powerful new resources like the Internet can be used by any sector of society to support their activities regardless of how society at large might evaluate them. The technology is neutral to its usage, supporting scientific collaboration (Olson, Zimmerman and Bos, 2008) and discovery (Nielsen, 2012) , political and specialinterest groups (Ferdinand, 2000) , the impoverished in under-developed countries (Burrell, 2012) , and criminal activities (Jaishankar, 2011) without discrimination; that is what it means for a technology to become an integral part of our society.. The future will continue to surprise us not only in the technologies we shall be using in another quarter century but also in the ways in which our fellow humans are using them to create a world that, perhaps, even the most speculative science fiction authors have not yet envisioned. We do live in very interesting times. May the knowledge acquisition research community live long and prosper.

B I O O O O O O O O O O B I O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O


Topological Implications of Selfish Neighbor Selection in Unstructured Peer-to-Peer Networks Abstract Current peer-to-peer (P2P) systems often suffer from a large fraction of freeriders not contributing any resources to the network. Various mechanisms have been designed to overcome this problem. However, the selfish behavior of peers has aspects which go beyond resource sharing. This paper studies the effects on the topology of a P2P network if peers selfishly select the peers to connect to. In our model, a peer exploits locality properties in order to minimize the latency (or response times) of its lookup operations. At the same time, the peer aims at not having to maintain links to too many other peers in the system. By giving tight bounds on the price of anarchy, we show that the resulting topologies can be much worse than if peers collaborated. Moreover, the network may never stabilize, even in the absence of churn. Finally, we establish the complexity of Nash equilibria in our game theoretic model of P2P networks. Specifically, we prove that it is NP-hard to decide whether our game has a Nash equilibrium and can stabilize. The power of peer-to-peer computing arises from the collaboration of the system's constituent parts, the peers. If all the participating peers contribute some of their resources-for instance bandwidth, memory, or CPU cycles-highly scalable decentralized systems can be built which outperform existing server-based architectures. However, in reality, peers may act selfishly and strive for maximizing their own utility by benefiting from the system without contributing much themselves. Hence the performance-and thus its success in practice!-of a p2p system crucially depends on its capability of dealing with selfishness.. One of the few systems that actively tries to tackle the non-cooperation challenge is BitTorrent-which is also one of the most popular applications on the Internet. Unfortunately, in contrast to common belief, BitTorrent can still be cheated by selfish users, e.g., with the BitThief client. Motivated by the apparent weaknesses, we are interested in the impact of selfish behavior in p2p systems. Game theory provides tools to quantify such effects.. This article investigates the impact of selfish behavior in unstructured peer-to-peer topologies. Concretely, we study the quality of the network topologies which result if peers selfishly select to which other peers they connect. One contribution will be the computation of the Price of Anarchy of p2p overlay creation, which is the ratio between an optimal solution compared to a solution generated by peers that act in an egoistic manner, optimizing their individual benefit.. The importance of studying the Price of Anarchy in peer-to-peer systems stems from the fact that it quantifies the possible degradation caused by selfishness. Specifically, a low Price of Anarchy indicates that a system does not require an incentivemechanism (such as tit-for-tat), because selfishness does not overly bog down the overall system performance. If the Price of Anarchy is high, however, specific cooperation incentives (whose goals are to reduce the Price of Anarchy) need to be enforced in order to ensure that the system can perform efficiently. Hence, in peerto-peer systems the Price of Anarchy is a measure that helps explaining the necessity (or non-necessity) of cooperation mechanisms.. We will first show that the topologies of selfish, unstructured p2p systems can be much worse than in a scenario in which peers collaborate. More precisely, we show that the Price of Anarchy is (min(α, n)), where α is a parameter that captures the tradeoff between lookup performance (low stretches) and the cost of neighbor maintenance, and n is the number of peers in the system. Thereby, the upper bound O(min(α, n)) holds for peers located in arbitrary metric spaces, including the popular growth-bounded and doubling metrics. On the other hand, intriguingly, this bound is tight even in such a simple metric space as the 1-dimensional Euclidean space. As a second contribution, we prove that the topology of a static peer-to-peer system consisting of selfish peers may never converge to a stable state. That is, links may continuously change even in environments without churn, causing the network to be inherently instable. Finally, we consider the complexity of Nash equilibria. We show that deciding whether there exists a pure Nash equilibrium in a given network is NPhard. Consequently, it is infeasible in practice to determine if a p2p network of selfish peers can stabilize. The analysis of our locality game reveals that the efficiency of p2p topologies can suffer if peers act selfishly. Already in a simple 5-peer network, no equilibrium may exist. Moreover, our results indicate that topologies may degrade more severely when selfish peers value maintenance cost relatively higher than latency costs. Finally, it has been shown that it is generally a hard problem to decide whether a p2p system can stabilize if peers select their neighbors in a selfish manner. Papadimitriou [31] has argued that the Internet has surpassed the von Neumann computer as the most complex computational artifact of our time. In particular, he pointed out that the Internet has a socio-economic complexity whose understanding requires techniques from mathematical economics and game theory [30] . Since then, game theoretic approaches have become increasingly popular to study selfish behavior on all layers of distributed systems. Specifically, researchers have been keen to study the inherent loss of efficiency in a system caused by the participant's selfishness in networks. Consequently, the Price of Anarchy and its complexity have been investigated in various system settings, for example in routing [12, 35] (see also the book by Roughgarden [34] ): Roughgarden has observed that the data packets which usually "rocket along the Internet at the speed of light" [6] can be significantly slowed down by selfish routers-a phenomenon which has been known also in civil engineering in the context of road planning. Besides being a useful toolkit to understand strategic interactions occurring in today's Internet, game theory itself offers exciting questions for mathematicians and computer scientists. For instance, while it is known that Nash equilibria always exist if the players' strategies are convex sets (such sets can for example be obtained by using probability distributions over strategies), in general, the complexity of finding a Nash equilibrium is believed to be one of the most important open questions on the boundary of the complexity class P, besides factoring [31] . Despite decades of effort, the computational complexity of computing a Nash equilibrium for a general-sum normal-form game remains unknown.. Adar and Huberman [3] noticed that selfish behavior is a reality also in peer-topeer systems, and that there exists a large fraction of free riders in the file sharing network Gnutella. The problem of selfish behavior in peer-to-peer systems has been a hot topic in p2p research ever since, e.g. [23, 38] , and many mechanisms to encourage cooperation have been proposed, for example in [19, 22, 37, 39, 41] . Perhaps the simplest fairness mechanism is to directly incorporate contribution monitoring into the client software. For instance, in the file-sharing system Kazaa, the client records the contribution of its user. However, such a solution can simply be bypassed by implementing a different client that hard-wires the contribution level to the maximum, as it was the case with Kazaa Lite. Inspired by real economies, some researchers have also proposed the introduction of some form of virtual money which is used for the transactions. However, these monetary or credit based approaches have a substantial overhead in terms of communication costs and infrastructure, and are inefficient [21, 42] . Often, these systems also require market regulating mechanisms [41] to cope with inflation or deflation-a complex issue. Additionally, monetary based systems may deter users from participating [29] .. BitTorrent [11] has incorporated a fairness mechanism from the beginning. Although this mechanism has similarities to the well known tit-for-tat scheme [7] , the mechanism employed in BitTorrent distinguishes itself from the classic tit-for-tat mechanism in many respects [24] . It has also been the subject of active research recently (e.g., [8, 20, 33] ). Based on PlanetLab tests, [24] has argued that BitTorrent lacks appropriate rewards and punishments and therefore peers might be tempted to freeload. The authors further propose a tit-for-tat-oriented mechanism based on the iterated prisoner's dilemma [7] in order to deter peers from freeloading. However, in their work, a peer is already considered a free rider if it contributes considerably less than other peers. BitThief [26] , on the other hand, aims at attaining fast downloads strictly without uploading any data. This is often desirable, since in many countries downloading certain media content is legal whereas uploading is not.. The game-theoretic model of our locality game has been inspired by the paper by Fabrikant et al. [18] which studies the Internet's architecture as built by economic agents, e.g., by Internet providers or autonomous systems. Recent subsequent work on network creation in various settings includes [4, 5, 10, [14] [15] [16] [17] . In contrast to all these works, our model takes into account many of the intrinsic properties of p2p systems. For instance, it captures the important locality properties of p2p systems, i.e., the desire to reduce the latencies (expressed as the stretch) experienced when performing look-up operations. Furthermore, the fact that a peer can decide to which other peers it wishes to store pointers and thus maintain links yields a scenario with directed links. Building structured systems that explicitly exploit locality properties has been a flourishing research area in networking and p2p computing (e.g. [2, 36, 43] ). In early literature on distributed hash tables, the major measure of system quality has been the number of hops required for look-up operations. While this hop-distance is certainly of importance, it has been argued that the delay of communication (i.e., the stretch between pairs of peers) is a more relevant quality measure. Based on results achieved in [32] , systems such as [1, 2, 36, 44] guarantee a provably bounded stretch with a limited number of links per peer. All of these systems are structured and peers are supposed to participate in a carefully predefined topology. Our work complements this line of research by analyzing topologies as they are created by selfish peers, which are interested only in optimizing their individual trade-off between locality and maintenance overhead.

O O O O O O O O B O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O B O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O


Distributed Random Walks Performing random walks in networks is a fundamental primitive that has found applications in many areas of computer science, including distributed computing. In this article, we focus on the problem of sampling random walks efficiently in a distributed network and its applications. Given bandwidth constraints, the goal is to minimize the number of rounds required to obtain random walk samples.All previous algorithms that compute a random walk sample of length as a subroutine always do so naively, that is, in O( ) rounds. The main contribution of this article is a fast distributed algorithm for performing random walks. We present a sublinear time distributed algorithm for performing random walks whose time complexity is sublinear in the length of the walk. Our algorithm performs a random walk of length inÕ √ D rounds (Õ hides polylog n factors where n is the number of nodes in the network) with high probability on an undirected network, where D is the diameter of the network. For small diameter graphs, this is a significant improvement over the naive O( ) bound. Furthermore, our algorithm is optimal within a poly-logarithmic factor as there exists a matching lower bound [Nanongkai et al. 2011] . We further extend our algorithms to efficiently perform k independent random walks inÕ √ k D + k rounds. We also show that our algorithm can be applied to speedup the more general Metropolis-Hastings sampling.Our random-walk algorithms can be used to speed up distributed algorithms in applications that use random walks as a subroutine. We present two main applications. First, we give a fast distributed algorithm for computing a random spanning tree (RST) in an arbitrary (undirected unweighted) network which runs inÕ √ mD rounds with high probability (m is the number of edges). Our second application is a fast decentralized algorithm for estimating mixing time and related parameters of the underlying network. Our algorithm is fully decentralized and can serve as a building block in the design of topologically-aware networks. Random walks play a central role in computer science, spanning a wide range of areas in both theory and practice. The focus of this article is on random walks in networks, in particular, decentralized algorithms for performing random walks in arbitrary networks. Random walks are used as an integral subroutine in a wide variety of network applications ranging from token management Coppersmith et al. 1993; Israeli and Jalfon 1990] , load balancing [Karger and Ruhl 2006] , small-world routing Kleinberg [2000] , search [Adamic et al. 2001; Cooper 2005; Gkantsidis et al. 2005; Lv et al. 2002; Zhong and Shen 2006] , information propagation and gathering [Bharambe et al. 2004; Kempe et al. 2004] , network topology construction [Gkantsidis et al. 2005; Law and Siu 2003; Loguinov et al. 2003 ], checking expansion [Dolev and Tzachar 2010] , constructing random spanning trees [Baala et al. 2003; Bar-Ilan and Zernik 1989; Broder 1989 ], monitoring overlays [Morales and Gupta 2007] , group communication in ad-hoc network [Dolev et al. 2006] , gathering and dissemination of information over a network [Aleliunas et al. 1979] , distributed construction of expander networks [Law and Siu 2003] , and peer-to-peer membership management Zhong et al. 2005] . Random walks are also very useful in providing uniform and efficient solutions to distributed control of dynamic networks Zhong and Shen 2006] . Random walks are local and lightweight; moreover, they require little index or state maintenance which makes them especially attractive to self-organizing dynamic networks such as Internet overlay and ad hoc wireless networks.. A key purpose of random walks in many of these network applications is to perform node sampling. While the sampling requirements in different applications vary, whenever a true sample is required from a random walk of certain steps, typically all applications perform the walk naively-by simply passing a token from one node to its neighbor: thus to perform a random walk of length takes time linear in .. In this article, we present an optimal (within a poly-logarithmic factor) sublinear time (sublinear in ) distributed random walk sampling algorithm that is significantly faster than the naive algorithm when D. Our algorithm runs in timeÕ √ D rounds. This running time is optimal (within a poly-logarithmic factor) since a matching lower bound was shown recently in Nanongkai et al. [2011] . We then present two key applications of our algorithm. The first is a fast distributed algorithm for computing a random spanning tree, a fundamental problem that has been studied widely in the classical setting (see e.g., Kelner and Madry [2009] and references therein) and in some special cases in distributed settings [Bar-Ilan and Zernik 1989] . To the best of our knowledge, our algorithm gives the fastest known running time in an arbitrary network. The second is to devising efficient decentralized algorithms for computing key global metrics of the underlying network-mixing time, spectral gap, and conductance. Such algorithms can be useful building blocks in the design of topologically (self-)aware networks, that is, networks that can monitor and regulate themselves in a decentralized fashion. For example, efficiently computing the mixing time or the 2:4 A. Das Sarma et al. probability that it is the destination of a random walk of length starting at s. For brevity, this problem will henceforth be simply called Single Random Walk.. For clarity, observe that the following naive algorithm solves the previous problem in O( ) rounds: The walk of length is performed by sending a token for steps, picking a random neighbor in each step. Then, the destination node v of this walk outputs the ID of s. Our goal is to perform such sampling with significantly less number of rounds, that is, in time that is sublinear in . On the other hand, we note that it can take too much time (as much as (|E| + D) time) in the CONGEST model to collect all the topological information at some node (and then computing the walk locally).. We also consider the following variations and generalizations of the Single Random Walk problem.. (1) k Random Walks, Destinations Output Sources (k-RW-DoS) . We have k sources s 1 , s 2 , ..., s k (not necessarily distinct) and we want each of k destinations to output the ID of its corresponding source. (2) k Random Walks, Sources Output Destinations (k-RW-SoD) . Same as (1) but we want each source to output the ID of its corresponding destination. (3) k Random Walks, Nodes Know Their Positions (k-RW-pos) . Instead of outputting the ID of source or destination, we want each node to know its position(s) in the random walk. That is, for each s i , if v 1 , v 2 , ..., v (where v 1 = s i ) is the resultant random walk starting at s i , we want each node v j in the walk to know the number j at the end of the process.. Throughout this article, we assume the standard (simple) random walk: in each step, an edge is taken from the current node v with probability 1/ deg(v) where deg(v) is the degree of v. Our goal is to output a true random sample from the -walk distribution starting from s. This article gives a tight upper bound on the time complexity of distributed computation of random walks in undirected networks. Thus, the running time of our algorithm is optimal (within a polylogarithmic factor), matching the lower bound that was shown recently [Nanongkai et al. 2011] . However, our upper bound for performing k independent random walks may not be tight and it will be interesting to resolve this.. While the focus of this article is on time complexity, message complexity is also important. In particular, our message complexity for computing k independent random walks of length isÕ m √ D + n /D , which can be worse than the naive algorithm'sÕ(k ) message complexity. It would be important to come up with an algorithm that is round efficient and yet has smaller message complexity. In a subsequent paper [Das Sarma et al. 2012b] , we have addressed this issue partly and shown that, under certain assumptions, we can extend our algorithms to be message efficient also.. We presented two algorithmic applications of our distributed random walk algorithm: estimating mixing times and computing random spanning trees. It would be interesting to improve upon these results. For example, is there aÕ τ x mix + n 1/4 round algorithm to estimate τ x ; and is there an algorithm for estimating the mixing time (which is the worst among all starting points)? Another open question is whether there exists aÕ(n) round (or a faster) algorithm for RST?. There are several interesting directions to take this work further. Can these techniques be useful for estimating the second eigenvector of the transition matrix (useful for sparse cuts)? Are there efficient distributed algorithms for random walks in directed graphs (useful for PageRank and related quantities)? Finally, from a practical standpoint, it is important to develop algorithms that are robust to failures and it would be nice to extend our techniques to handle such node/edge failures. This can be useful for doing decentralized computation in large-scale dynamic networks. There are two key motivations for obtaining sublinear time bounds. The first is that in many algorithmic applications, walks of length significantly greater than the network diameter are needed. For example, this is necessary in both the applications presented later in the paper, namely distributed computation of a random spanning tree (RST) and computation of mixing time. In the RST algorithm, we need to perform a random walk of expected length O(mD) (where m is the number of edges in the network). In decentralized computation of mixing time, we need to perform walks of length at least the mixing time which can be significantly larger than the diameter e.g., in a random geometric graph model [Muthukrishnan and Pandurangan 2010 ], a popular model for ad hoc networks, the mixing time can be larger than the diameter by a factor of √ n . More generally, many real-world communication networks (e.g., ad hoc networks and peer-to-peer networks) have relatively small diameter, and random walks of length at least the diameter are usually performed for many sampling applications, that is, D. It should be noted that if the network is rapidly mixing/expanding, which is sometimes the case in practice, then sampling from walks of length D is close to sampling from the steady state (degree) distribution; this can be done in O(D) rounds (note however, that this gives only an approximately close sample, not the exact sample for that length). However, such an approach fails when is smaller than the mixing time.. The second motivation is understanding the time complexity of distributed random walks. Random walk is essentially a "global" problem which requires the algorithm to "traverse" the entire network. Classical global problems include the minimum spanning tree, shortest path etc. Network diameter is an inherent lower bound for such problems. Problems of this type raise the basic question whether n (or as is the case here) time is essential or is the network diameter D, the inherent parameter. As pointed out in the work of Garay et al. [1998] , in the latter case, it would be desirable to design algorithms that have a better complexity for graphs with low diameter.. Notation. Throughout the article, we let be the length of the walks, k be the number of walks, D be the network diameter, δ be the minimum node degree, n be the number of nodes, and m be the number of edges in the network. Random walks have been used in a wide variety of applications in distributed networks as mentioned in the beginning of Section 1. We describe here some of the applications in more detail. Our focus is to emphasize the papers of a more theoretical nature, and those that use random walks as one of the central subroutines.. Speeding up distributed algorithms using random walks has been considered for a long time. Besides our approach of speeding up the random walk itself, one popular approach is to reduce the cover time. Recently, Alon et al. [2011] show that performing several random walks in parallel reduces the cover time in various types of graphs. They assert that the problem with performing random walks is often the latency. In these scenarios where many walks are performed, our results could help avoid too much latency and yield an additional speed-up factor. Other recent works involving multiple random walks in different settings include Elsässer and Sauerwald [2011] and Cooper et al. [2009] .. A nice application of random walks is in the design and analysis of expanders. We mention two results here. Law and Siu [2003] consider the problem of constructing expander graphs in a distributed fashion. One of the key subroutines in their algorithm is to perform several random walks from specified source nodes. While the overall running time of their algorithm depends on other factors, the specific step of computing random walk samples can be improved using our techniques presented in this article. Dolev and Tzachar [2010] use random walks to check if a given graph is an expander. The first algorithm given in Dolev and Tzachar [2010] is essentially to run a random walk of length n log n and mark every visited vertices. Later, it is checked if every node is visited. Broder [1989] and Wilson [1996] gave algorithms to generate random spanning trees using random walks and Broder's algorithm was later applied to the network setting by Bar-Ilan and Zernik [1989] . Recently Goyal et al. [2009] show how to construct an expander/sparsifier using random spanning trees. If their algorithm is implemented on a distributed network, the techniques presented in this article would yield an additional speed-up in the random walk constructions. Morales and Gupta [2007] discuss about discovering a consistent and available monitoring overlay for a distributed system. For each node, one needs to select and discover a list of nodes that would monitor it. The monitoring set of nodes need to satisfy some structural properties such as consistency, verifiability, load balancing, and randomness, among others. This is where random walks come in. Random walks is a natural way to discover a set of random nodes that are spread out (and hence scalable), that can in turn be used to monitor their local neighborhoods. Random walks have been used for this purpose in another paper by Ganesh et al. [2003] on peer-to-peer membership management for gossip-based protocols.. The general high-level idea of using a few short walks in the beginning (executed in parallel) and then carefully stitch these walks together later as necessary was 2 Note that Kempe and McSherry [2008] in fact does more and gives a decentralized algorithm for computing the top k eigenvectors of a weighted adjacency matrix that runs in O τ mix log 2 n rounds if two adjacent nodes are allowed to exchange O(k 3 ) messages per round, where τ mix is the mixing time and n is the size of the network. introduced in Das Sarma et al. [2011a] to find random walks in data streams with the main motivation of computing PageRank. However, the two models have very different constraints and motivations and hence the subsequent techniques used here and in Das Sarma et al. [2011a] are very different. Recently, Sami and Twigg [2008] consider lower bounds on the communication complexity of computing the stationary distribution of random walks in a network. Although their problem is related to our problem, the lower bounds obtained do not imply anything in our setting.. The work of Gkantsidis et al. [2007] discusses spectral algorithms for enhancing the topology awareness, for example, by identifying and assigning weights to critical links. However, the algorithms are centralized, and it is mentioned that obtaining efficient decentralized algorithms is a major open problem. Our algorithms are fully decentralized and based on performing random walks, and so are more amenable to dynamic and self-organizing networks.. Subsequent Work. Since the publication of the conference versions of our papers Das Sarma et al. [2009 Sarma et al. [ , 2010 , additional results have been shown, extending our algorithms to various settings.. The work of Nanongkai et al. [2011] showed a tight lower bound on the running time of distributed random walk algorithms using techniques from communication complexity Das Sarma et al. [2011b] . Specifically, it is shown in Nanongkai et al. [2011] that for any n, D, and D ≤ ≤ n/ D 3 log n 1/4 , performing a random walk of length. This shows that the running time of our 1-RW-DoS algorithm is (essentially) the best possible (up to polylogarithmic factors).. In Das Sarma et al. [2012b] , it is shown how to improve the message complexity of the distributed random walk algorithms presented in this article. The main reason for the increased message complexity of our algorithms is that to compute one long walk many short walks are generated-most of which go unused. One idea is to use these unused short walks to compute other (independent) long walks. This idea is explored in Das Sarma et al. [2012b] where it is shown that under certain conditions (e.g., when the starting point of the random walk is chosen proportional to the node degree), the overall message complexity of computing many long walks can be made near-optimal.. The fast distributed random walk algorithms presented in this article applies only for static networks and does not apply to a dynamic network. The recent work of Das Sarma et al. [2012a] investigates efficient distributed computation in dynamic networks in which the network topology changes (arbitrarily) from round to round. The article presents a rigorous framework for design and analysis of distributed random walk sampling algorithms in dynamic networks. Building on the techniques developed in this article, the main contribution of Das Sarma et al. [2012a] is a fast distributed random walk sampling algorithm that runs inÕ √ τ rounds (with high probability) (τ is the dynamic mixing time and is the dynamic diameter of the network) and returns a sample close to a suitably defined stationary distribution of the dynamic network. This is then shown to be useful in designing a fast distributed algorithm for information spreading in a dynamic network.

O B I O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O B O O O O B I O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O B O O O O O O O O O B I O O O O O B O O B I O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O B I O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I I O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O B I O B I O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O B O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O B O O O O O O O O O O B O O O O O O B O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O


On a compact encoding of the swap automaton Abstract. Given a string P of length m over an alphabet Σ of size σ, a swapped version of P is a string derived from P by a series of local swaps, i.e., swaps of adjacent symbols, such that each symbol can participate in at most one swap. We present a theoretical analysis of the nondeterministic finite automaton for the language P ′ ∈Π P Σ * P ′ (swap automaton for short), where ΠP is the set of swapped versions of P . Our study is based on the bit-parallel simulation of the same automaton due to Fredriksson, and reveals an interesting combinatorial property that links the automaton to the one for the language Σ * P . By exploiting this property and the method presented by Cantone et al. (2010), we obtain a bit-parallel encoding of the swap automaton which takes O(σ 2 ⌈k/w⌉) space and allows one to simulate the automaton on a string of length n in time O(n⌈k/w⌉), where ⌈m/σ⌉ ≤ k ≤ m. The Pattern Matching with Swaps problem (Swap Matching problem, for short) is a well-studied variant of the classic Pattern Matching problem. It consists in finding all occurrences, up to character swaps, of a pattern P of length m in a text T of length n, with P and T sequences of characters over a common finite alphabet Σ of size σ. More precisely, the pattern is said to match the text at a given location j if adjacent pattern characters can be swapped, if necessary, so as to make it identical to the substring of the text ending (or, equivalently, starting) at location j. All swaps are constrained to be disjoint, i.e., each character can be involved at most in one swap.. The Swap Matching problem was introduced in 1995 as one of the open problems in nonstandard string matching [9] . The first result that improved over the naive O(nm)-time bound is due to Amir et al. [1] , who presented an O(nm 1 3 log m)-time algorithm for binary alphabets and described how to reduce the case of a general alphabet to that of a binary one with a O(log σ)-time overhead. The best theoretical result to date is due to Amir et al. [2] . Their algorithm runs in time O(n log m) for binary alphabets and can also solve the case of general alphabets in time O(n log m log σ) by using again the alphabet reduction technique of Amir et al. [1] . Both solutions are based on reducing the problem to convolutions. Note that this problem can also be solved using more general algorithms for Approximate String Matching [10] , albeit with worse bounds.. There also exist different practical solutions, based on word-level parallelism. To our knowledge, the first one is due to Fredriksson [7] , who presented a generalization of the nondeterministic finite automaton (NFA) for the language Σ * P (prefix automaton) for the Swap Matching problem and a fast method to simulate it using bit-parallelism [3] . The resulting algorithm runs in O(n⌈m/w⌉)-time and uses O(σ⌈m/w⌉) space, where w is the machine word size in bits. In the same paper Fredriksson also presented a variant of the BNDM algorithm [11] , based on the generalization of the NFA for the language of the suffixes of P (suffix automaton), which achieves sublinear time on average and runs in O(nm⌈m/w⌉)-time in the worst-case. In 2008 Iliopoulos and Rahman presented a variant of ShiftOr for this problem, based on a Graph-Theoretic model [8] . Their algorithm runs in time O(n⌈m/w⌉ log m) and uses O(m⌈m/w⌉) space (the log m term can be removed at the price of O(σ 2 ⌈m/w⌉) space). The improvement over the algorithm by Fredriksson is that the resulting bit-parallel simulation is simpler, in that it requires fewer bitwise operations. Later, Cantone and Faro presented an algorithm based on dynamic programming that runs in time O(n⌈m/w⌉) and requires O(σ⌈m/w⌉) space [5] . Subsequently Campanelli et al. presented a variant of the BNDM algorithm based on the same approach which runs in O(nm⌈m/w⌉)-time in the worst-case [4] .. In [6] Cantone et al. presented a technique to encode the prefix automaton in O(σ 2 ⌈k/w⌉) space and simulate it on a string of length n in O(n⌈k/w⌉) time, where ⌈m/σ⌉ ≤ k ≤ m. In this paper we extend this result to the NFA described in [7] . First, we present a theoretical analysis of this NFA, from which the correctness of the bit-parallel simulation presented in the same paper follows. We then show that, by exploiting the properties of this NFA that we reveal in the following, we can solve the Swap Matching problem in time O(n⌈k/w⌉) and space O(σ 2 ⌈k/w⌉), where ⌈m/σ⌉ ≤ k ≤ m, using the method presented in [6] . Our result also applies, with small changes, to the case of the generalized suffix automaton for the Swap Matching problem.

O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O B I O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O