
com.groupbyinc.flux.cluster.service.ClusterApplierService.class Maven / Gradle / Ivy
???? 4 9com/groupbyinc/flux/cluster/service/ClusterApplierService ?com/groupbyinc/flux/common/component/AbstractLifecycleComponent 2com/groupbyinc/flux/cluster/service/ClusterApplier ClusterApplierService.java Kcom/groupbyinc/flux/cluster/service/ClusterApplierService$OffMasterRunnable OffMasterRunnable Jcom/groupbyinc/flux/cluster/service/ClusterApplierService$OnMasterRunnable OnMasterRunnable Rcom/groupbyinc/flux/cluster/service/ClusterApplierService$LocalNodeMasterListeners LocalNodeMasterListeners Gcom/groupbyinc/flux/cluster/service/ClusterApplierService$NotifyTimeout
NotifyTimeout Rcom/groupbyinc/flux/cluster/service/ClusterApplierService$SafeClusterApplyListener SafeClusterApplyListener Dcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask
UpdateTask ;com/groupbyinc/flux/cluster/service/ClusterApplierService$1 0com/groupbyinc/flux/cluster/ClusterState$Builder (com/groupbyinc/flux/cluster/ClusterState Builder Gcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener ! ClusterApplyListener 5com/groupbyinc/flux/cluster/node/DiscoveryNodes$Delta $ /com/groupbyinc/flux/cluster/node/DiscoveryNodes & Delta %java/lang/invoke/MethodHandles$Lookup ) java/lang/invoke/MethodHandles + Lookup CLUSTER_UPDATE_THREAD_NAME Ljava/lang/String; clusterApplierService#updateTask 0 clusterSettings 5Lcom/groupbyinc/flux/common/settings/ClusterSettings;
threadPool +Lcom/groupbyinc/flux/threadpool/ThreadPool; slowTaskLoggingThreshold +Lcom/groupbyinc/flux/common/unit/TimeValue; threadPoolExecutor LLcom/groupbyinc/flux/common/util/concurrent/PrioritizedEsThreadPoolExecutor; highPriorityStateAppliers Ljava/util/Collection; ILjava/util/Collection; normalPriorityStateAppliers lowPriorityStateAppliers clusterStateAppliers Ljava/lang/Iterable; GLjava/lang/Iterable; clusterStateListeners JLjava/util/Collection; timeoutClusterStateListeners QLjava/util/Collection; localNodeMasterListeners TLcom/groupbyinc/flux/cluster/service/ClusterApplierService$LocalNodeMasterListeners; onGoingTimeouts Ljava/util/Queue; \Ljava/util/Queue; state -Ljava/util/concurrent/atomic/AtomicReference; YLjava/util/concurrent/atomic/AtomicReference; nodeConnectionsService 4Lcom/groupbyinc/flux/cluster/NodeConnectionsService; stateBuilderSupplier Ljava/util/function/Supplier; QLjava/util/function/Supplier; $assertionsDisabled Z ?(Lcom/groupbyinc/flux/common/settings/Settings;Lcom/groupbyinc/flux/common/settings/ClusterSettings;Lcom/groupbyinc/flux/threadpool/ThreadPool;Ljava/util/function/Supplier;)V 1(Lcom/groupbyinc/flux/common/settings/Settings;)V U W
X )java/util/concurrent/CopyOnWriteArrayList Z ()V U \
[ ] : ; _ = ; a > ; c java/lang/Iterable e 2com/groupbyinc/flux/common/util/iterable/Iterables g concat +([Ljava/lang/Iterable;)Ljava/lang/Iterable; i j
h k ? @ m B ; o &java/util/concurrent/ConcurrentHashMap q
r ] java/util/Collections t
newSetFromMap (Ljava/util/Map;)Ljava/util/Set; v w
u x D ; z @com/groupbyinc/flux/common/util/concurrent/ConcurrentCollections | newQueue ()Ljava/util/Queue; ~
} ? H I ? 2 3 ? 4 5 ? +java/util/concurrent/atomic/AtomicReference ?
? ] K L ? 2com/groupbyinc/flux/cluster/service/ClusterService ? 3CLUSTER_SERVICE_SLOW_TASK_LOGGING_THRESHOLD_SETTING -Lcom/groupbyinc/flux/common/settings/Setting; ? ? ? ? +com/groupbyinc/flux/common/settings/Setting ? get B(Lcom/groupbyinc/flux/common/settings/Settings;)Ljava/lang/Object; ? ?
? ? )com/groupbyinc/flux/common/unit/TimeValue ? 6 7 ? k(Lcom/groupbyinc/flux/threadpool/ThreadPool;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$1;)V U ?
? F G ? P Q ? this ;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService; settings .Lcom/groupbyinc/flux/common/settings/Settings; setSlowTaskLoggingThreshold .(Lcom/groupbyinc/flux/common/unit/TimeValue;)V setNodeConnectionsService 7(Lcom/groupbyinc/flux/cluster/NodeConnectionsService;)V S T ? N O ? java/lang/AssertionError ? %nodeConnectionsService is already set ? (Ljava/lang/Object;)V U ?
? ? setInitialState -(Lcom/groupbyinc/flux/cluster/ClusterState;)V lifecycle 0Lcom/groupbyinc/flux/common/component/Lifecycle; ? ? ? .com/groupbyinc/flux/common/component/Lifecycle ? started ()Z ? ?
? ? java/lang/IllegalStateException ? $can't set initial state when started ? (Ljava/lang/String;)V U ?
? ? ()Ljava/lang/Object; ? ?
? ? state is already set ? set ? ?
? ? initialState *Lcom/groupbyinc/flux/cluster/ClusterState; doStart 6please set the node connection service before starting ? java/util/Objects ? requireNonNull 8(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; ? ?
? ? (please set initial state before starting ? addListener 5(Lcom/groupbyinc/flux/cluster/ClusterStateListener;)V ? ?
? java/lang/StringBuilder ?
? ] nodeName ()Ljava/lang/String; ? ?
? append -(Ljava/lang/String;)Ljava/lang/StringBuilder; ? ?
? ? / ? toString ? ?
? ? ? ? ? 6com/groupbyinc/flux/common/util/concurrent/EsExecutors ? daemonThreadFactory f(Lcom/groupbyinc/flux/common/settings/Settings;Ljava/lang/String;)Ljava/util/concurrent/ThreadFactory; ? ?
? ? )com/groupbyinc/flux/threadpool/ThreadPool ? getThreadContext <()Lcom/groupbyinc/flux/common/util/concurrent/ThreadContext; ? ?
? ? scheduler 1()Ljava/util/concurrent/ScheduledExecutorService;
? newSinglePrioritizing ?(Ljava/lang/String;Ljava/util/concurrent/ThreadFactory;Lcom/groupbyinc/flux/common/util/concurrent/ThreadContext;Ljava/util/concurrent/ScheduledExecutorService;)Lcom/groupbyinc/flux/common/util/concurrent/PrioritizedEsThreadPoolExecutor;
? 8 9 doStop java/lang/Exception java/util/Queue iterator ()Ljava/util/Iterator; java/util/Iterator hasNext ? next ? cancel \
listener 9Lcom/groupbyinc/flux/cluster/TimeoutClusterStateListener; ! 7com/groupbyinc/flux/cluster/TimeoutClusterStateListener# onClose% \$& logger !Lorg/apache/logging/log4j/Logger;() * &failed to notify listeners on shutdown, org/apache/logging/log4j/Logger. debug *(Ljava/lang/String;Ljava/lang/Throwable;)V01/2
java/util/concurrent/TimeUnit6 SECONDS Ljava/util/concurrent/TimeUnit;89 7: terminate I(Ljava/util/concurrent/ExecutorService;JLjava/util/concurrent/TimeUnit;)Z<=
?> "java/lang/invoke/LambdaMetafactory@ metafactory ?(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;BC
ADE ? ' <(Lcom/groupbyinc/flux/cluster/TimeoutClusterStateListener;)VI accept ()Ljava/util/function/Consumer;KL M java/util/CollectionO forEach (Ljava/util/function/Consumer;)VQRPS removeListenerU ?
V ex Ljava/lang/Exception; onGoingTimeout ILcom/groupbyinc/flux/cluster/service/ClusterApplierService$NotifyTimeout; doClose ,()Lcom/groupbyinc/flux/cluster/ClusterState; .the applied cluster state is not yet available^ &assertNotCalledFromClusterStateApplier (Ljava/lang/String;)Z`a
b
? ] !initial cluster state not set yete clusterState addHighPriorityApplier 4(Lcom/groupbyinc/flux/cluster/ClusterStateApplier;)V add (Ljava/lang/Object;)ZjkPl applier 1Lcom/groupbyinc/flux/cluster/ClusterStateApplier; addLowPriorityApplier addStateApplier
removeApplier removeskPt 2Lcom/groupbyinc/flux/cluster/ClusterStateListener; removeTimeoutListener java/lang/Objectx equalszk
y{s \} timeout it _Ljava/util/Iterator; Ljava/util/Iterator; addLocalNodeMasterListener 8(Lcom/groupbyinc/flux/cluster/LocalNodeMasterListener;)V
access$100 ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$LocalNodeMasterListeners;Lcom/groupbyinc/flux/cluster/LocalNodeMasterListener;)V??
? 5Lcom/groupbyinc/flux/cluster/LocalNodeMasterListener; removeLocalNodeMasterListener
access$200??
? addTimeoutListener g(Lcom/groupbyinc/flux/common/unit/TimeValue;Lcom/groupbyinc/flux/cluster/TimeoutClusterStateListener;)V %Lcom/groupbyinc/flux/common/Nullable; Gcom/groupbyinc/flux/common/util/concurrent/EsRejectedExecutionException? stoppedOrClosed? ?
?? #com/groupbyinc/flux/common/Priority? HIGH %Lcom/groupbyinc/flux/common/Priority;?? ?? _add_listener_? ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;Lcom/groupbyinc/flux/common/Priority;Ljava/lang/String;Lcom/groupbyinc/flux/common/unit/TimeValue;Lcom/groupbyinc/flux/cluster/TimeoutClusterStateListener;)V U?
? Jcom/groupbyinc/flux/common/util/concurrent/PrioritizedEsThreadPoolExecutor? execute (Ljava/lang/Runnable;)V??
?? e ILcom/groupbyinc/flux/common/util/concurrent/EsRejectedExecutionException; runOnApplierThread ?(Ljava/lang/String;Ljava/util/function/Consumer;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Lcom/groupbyinc/flux/common/Priority;)V 2com/groupbyinc/flux/cluster/ClusterStateTaskConfig? build [(Lcom/groupbyinc/flux/common/Priority;)Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;???? &(Ljava/lang/Object;)Ljava/lang/Object;? lambda$runOnApplierThread$0 s(Ljava/util/function/Consumer;Lcom/groupbyinc/flux/cluster/ClusterState;)Lcom/groupbyinc/flux/cluster/ClusterState;??
?? V(Lcom/groupbyinc/flux/cluster/ClusterState;)Lcom/groupbyinc/flux/cluster/ClusterState;? apply <(Ljava/util/function/Consumer;)Ljava/util/function/Function;?? ? submitStateUpdateTask ?(Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;Ljava/util/function/Function;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V??
? source clusterStateConsumer ILjava/util/function/Consumer; Ljava/util/function/Consumer; ILcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener; priority {(Ljava/lang/String;Ljava/util/function/Consumer;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V??
? onNewClusterState {(Ljava/lang/String;Ljava/util/function/Supplier;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V lambda$onNewClusterState$1 s(Ljava/util/function/Supplier;Lcom/groupbyinc/flux/cluster/ClusterState;)Lcom/groupbyinc/flux/cluster/ClusterState;??
?? <(Ljava/util/function/Supplier;)Ljava/util/function/Function;?? ? clusterStateSupplier ILjava/util/function/Supplier;
applyFunction sLjava/util/function/Function; Ljava/util/function/Function; '()Lcom/groupbyinc/flux/common/Priority;???? m(Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Lorg/apache/logging/log4j/Logger;)V U?
? ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;Lcom/groupbyinc/flux/common/Priority;Ljava/lang/String;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Ljava/util/function/Function;)V U?
? -()Lcom/groupbyinc/flux/common/unit/TimeValue;??? \ lambda$submitStateUpdateTask$3 ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;)V??
?? run ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;)Ljava/lang/Runnable;?? ? V(Ljava/lang/Runnable;Lcom/groupbyinc/flux/common/unit/TimeValue;Ljava/lang/Runnable;)V??
??
updateTask FLcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask; config 4Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig; executor assertClusterStateUpdateThread java/lang/Thread?
currentThread ()Ljava/lang/Thread;??
?? getName? ?
? java/lang/String contains (Ljava/lang/CharSequence;)Z
/not called from the cluster state update thread !assertNotClusterStateUpdateThread Expected current thread [ -(Ljava/lang/Object;)Ljava/lang/StringBuilder; ?
? 6] to not be the cluster state update thread. Reason: [ ] reason
getStackTrace ()[Ljava/lang/StackTraceElement;
? [Ljava/lang/StackTraceElement; java/lang/StackTraceElement getClassName ?
getMethodName ?
! 0com/groupbyinc/flux/cluster/ClusterStateObserver# java/lang/Class%
&
{ callClusterStateAppliers) 9should not be called by a cluster state applier. reason [+ className
methodName element Ljava/lang/StackTraceElement; runTask I(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;)V >processing [{}]: ignoring, cluster applier service not started3? / 5 '(Ljava/lang/String;Ljava/lang/Object;)V07/8 processing [{}]: execute: currentTimeInNanos ()J<=
>??
@
nsecToMSec (J)JBC
?D java/lang/MathF max (JJ)JHI
GJ timeValueMillis .(J)Lcom/groupbyinc/flux/common/unit/TimeValue;LM
?N isTraceEnabledP ?/Q ,()Lorg/apache/logging/log4j/message/Message;S lambda$runTask$4 ?(Lcom/groupbyinc/flux/common/unit/TimeValue;Lcom/groupbyinc/flux/cluster/ClusterState;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;)Lorg/apache/logging/log4j/message/Message;UV
WX ?(Lcom/groupbyinc/flux/common/unit/TimeValue;Lcom/groupbyinc/flux/cluster/ClusterState;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;)Lorg/apache/logging/log4j/util/MessageSupplier; ?Z [ trace G(Lorg/apache/logging/log4j/util/MessageSupplier;Ljava/lang/Throwable;)V]^/_ warnAboutSlowTaskIfNeeded @(Lcom/groupbyinc/flux/common/unit/TimeValue;Ljava/lang/String;)Vab
c? e onFailure *(Ljava/lang/String;Ljava/lang/Exception;)Vgh "i onSuccessk ? "l 5processing [{}]: took [{}] no change in cluster staten 9(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V0p/q %cluster state updated, source [{}]
{}s]p/u isDebugEnabledw ?/x 0cluster state updated, version [{}], source [{}]z version|=
} java/lang/Long valueOf (J)Ljava/lang/Long;??
?? applyChanges ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;Lcom/groupbyinc/flux/cluster/ClusterState;Lcom/groupbyinc/flux/cluster/ClusterState;)V??
? Vprocessing [{}]: took [{}] done applying updated cluster state (version: {}, uuid: {})? stateUUID? ?
? ](Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V0?/?
? lambda$runTask$5 ?(Lcom/groupbyinc/flux/common/unit/TimeValue;JLjava/lang/String;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;Ljava/lang/String;)Lorg/apache/logging/log4j/message/Message;??
?? ?(Lcom/groupbyinc/flux/common/unit/TimeValue;JLjava/lang/String;Lcom/groupbyinc/flux/cluster/service/ClusterApplierService$UpdateTask;Ljava/lang/String;)Lorg/apache/logging/log4j/util/MessageSupplier; ?? ? warn?^/? newClusterState
executionTime J fullState task previousClusterState startTimeNS /com/groupbyinc/flux/cluster/ClusterChangedEvent? i(Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterState;Lcom/groupbyinc/flux/cluster/ClusterState;)V U?
??
nodesDelta 9()Lcom/groupbyinc/flux/cluster/node/DiscoveryNodes$Delta;??
??
hasChanges? ?
%?
isInfoEnabled? ?/? shortSummary? ?
%? length ()I??
? {}, reason: {}? info?p/? nodes 3()Lcom/groupbyinc/flux/cluster/node/DiscoveryNodes;??
? 2com/groupbyinc/flux/cluster/NodeConnectionsService? connectToNodes 4(Lcom/groupbyinc/flux/cluster/node/DiscoveryNodes;)V??
?? !applying cluster state version {}? K]
?? blocks 3()Lcom/groupbyinc/flux/cluster/block/ClusterBlocks;??
? /com/groupbyinc/flux/cluster/block/ClusterBlocks? disableStatePersistence? ?
?? metaDataChanged? ?
?? metaData 1()Lcom/groupbyinc/flux/cluster/metadata/MetaData;??
? -com/groupbyinc/flux/cluster/metadata/MetaData? 0()Lcom/groupbyinc/flux/common/settings/Settings; ??
?? 3com/groupbyinc/flux/common/settings/ClusterSettings?
applySettings ^(Lcom/groupbyinc/flux/common/settings/Settings;)Lcom/groupbyinc/flux/common/settings/Settings;??
?? failed to apply cluster settings??1/? #apply cluster state with version {}? 4(Lcom/groupbyinc/flux/cluster/ClusterChangedEvent;)V)?
? disconnectFromNodesExcept??
?? /set locally applied cluster state to version {}? callClusterStateListeners??
? summary incomingSettings clusterChangedEvent 1Lcom/groupbyinc/flux/cluster/ClusterChangedEvent; 7Lcom/groupbyinc/flux/cluster/node/DiscoveryNodes$Delta; !lambda$callClusterStateAppliers$6 e(Lcom/groupbyinc/flux/cluster/ClusterChangedEvent;Lcom/groupbyinc/flux/cluster/ClusterStateApplier;)V??
i ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;Lcom/groupbyinc/flux/cluster/ClusterChangedEvent;)Ljava/util/function/Consumer;K fS stream ()Ljava/util/stream/Stream; P
java/util/stream/Stream M(Ljava/util/stream/Stream;Ljava/util/stream/Stream;)Ljava/util/stream/Stream; i
"lambda$callClusterStateListeners$7 f(Lcom/groupbyinc/flux/cluster/ClusterChangedEvent;Lcom/groupbyinc/flux/cluster/ClusterStateListener;)V
?
S getMillis=
? Hcluster state applier task [{}] took [{}] above the warn threshold of {} K(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V?/ java/lang/System! nanoTime#=
"$ newClusterStateBuilder 4()Lcom/groupbyinc/flux/cluster/ClusterState$Builder; java/util/function/Supplier() ? (calling [{}] with change to version [{}]+ 0com/groupbyinc/flux/cluster/ClusterStateListener- clusterChanged/?.0 %failed to notify ClusterStateListener2 /com/groupbyinc/flux/cluster/ClusterStateApplier4 applyClusterState6?57 $failed to notify ClusterStateApplier9 5org/apache/logging/log4j/message/ParameterizedMessage; Vfailed to apply updated cluster state in [{}]:
version [{}], uuid [{}], source [{}]
{}= ((Ljava/lang/String;[Ljava/lang/Object;)V U?
<@ Xfailed to execute cluster state applier in [{}], state:
version [{}], source [{}]
{}{}{}B routingTable 4()Lcom/groupbyinc/flux/cluster/routing/RoutingTable;DE
F getRoutingNodes 4()Lcom/groupbyinc/flux/cluster/routing/RoutingNodes;HI
J generic (()Ljava/util/concurrent/ExecutorService;LM
?N lambda$submitStateUpdateTask$2P?
QR ?(Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;)Ljava/lang/Runnable;?T U $java/util/concurrent/ExecutorServiceWX? Hcom/groupbyinc/flux/cluster/metadata/ProcessClusterEventTimeoutExceptionZ Ub
[\ currentState nextState java/util/function/Consumer`K ?ab
access$300 N(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;)Ljava/util/Queue; x0
access$400 S(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;)Ljava/util/Collection;
access$500 m(Lcom/groupbyinc/flux/cluster/service/ClusterApplierService;)Lcom/groupbyinc/flux/common/component/Lifecycle; desiredAssertionStatusl ?
&m
ConstantValue Signature Code LocalVariableTable LocalVariableTypeTable LineNumberTable ?(Lcom/groupbyinc/flux/common/settings/Settings;Lcom/groupbyinc/flux/common/settings/ClusterSettings;Lcom/groupbyinc/flux/threadpool/ThreadPool;Ljava/util/function/Supplier;)V
StackMapTable "RuntimeVisibleParameterAnnotations ?(Ljava/lang/String;Ljava/util/function/Consumer;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;Lcom/groupbyinc/flux/common/Priority;)V ?(Ljava/lang/String;Ljava/util/function/Consumer;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V ?(Ljava/lang/String;Ljava/util/function/Supplier;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V(Ljava/lang/String;Lcom/groupbyinc/flux/cluster/ClusterStateTaskConfig;Ljava/util/function/Function;Lcom/groupbyinc/flux/cluster/service/ClusterApplier$ClusterApplyListener;)V BootstrapMethods
SourceFile InnerClasses ! . / o 1 2 3 4 5 B 6 7 B 8 9 : ; p <